- Pin your stable inventory IDs (ad units, placements, targeting keys) in the skill — but never the tenant/network identity.
- Customize your forecast defaults: which ad units to forecast, your availability threshold, your standard flight windows.
- Lean on OrbiAds Campaign Presets — map each brief type to a preset.
- Declare your house targeting: standard key-values, geo defaults, device splits.
- Encode your advertiser/sector exclusions (competitive labels, blocklists, Ad Exchange creative blocking) — enforced every session.
Why a house skill?
Every new chat session starts from zero. The agent re-asks "what are your ad units?" and fires repeated targeting(action="list_ad_units") or inventory(action="get_ad_unit_tree") calls against an inventory tree that can run to hundreds of nodes. The result is slow, token-heavy, and repetitive — you re-explain the same context every time.
A skill (a folder with a SKILL.md file, the open Agent Skills standard) is durable procedural memory. It encodes the how; the tools supply the what at runtime. You write your house conventions once, and the agent loads them on demand every session.
Pin stable IDs — but never identity
Critical distinction. The tenant/network identity is always derived at runtime via the standalone auth tools check_credentials and get_my_tenant_id — never hardcoded. An invented tenantId or networkCode is a security mistake.
Your stable inventory constants, however, belong in the skill: homepage ad unit IDs, placement IDs, key custom-targeting key IDs, standard sizes. These values almost never change — pinning them saves the agent from re-walking the tree every time.
| House constant | Type | ID |
|---|---|---|
| Homepage ATF | Ad unit | 123456789 |
| Homepage Roadblock | Placement | 234567890 |
| section | Targeting key | 345678901 |
| Standard MPU size | Constant | 300×250 |
To capture these IDs the first time (or refresh them if your tree changes), run the free reads targeting(action="list_ad_units") and targeting(action="list_custom_targeting_keys"), then copy the stable IDs into the skill's table.
Customize for forecasts
Encode your forecast discipline in the skill: which ad units to always forecast, your availability threshold, your default flight windows. The agent applies your rules instead of improvising.
- What to forecast: a prospective forecast on the homepage ad units before any campaign via
reporting(action="get_prospective_delivery_forecast"), or a per-size forecast viareporting(action="get_standalone_forecast"). - Availability threshold: for example, stop and warn if availability drops below 95% of goal for a homepage sponsorship.
- Default windows: your standard flight lengths (e.g. 7 days for a takeover, 30 days for a section sponsorship).
For the underlying forecasting mechanics, see the inventory forecasting guide.
Use Campaign Presets
OrbiAds tenant settings include Campaign Presets (name + advertiserId + adUnitIds + keyValues), configured at /settings/gam. Auto-suggestions even surface from your recurring patterns. The backend applies the preset; the skill says which preset maps to which brief type.
Example mapping to write into the skill: "homepage takeover" → Pack Homepage preset. Also record your naming conventions (an orderTemplate like {YYYY}{MM}-{advertiser}-{campaign}) and delivery defaults (lineItemType, priority, frequency caps) — applied automatically by the backend.
Declare your house targeting
List your standard targeting in the skill so the agent applies it instead of asking: your standard key-values, your geo defaults, your device splits.
- Standard key-values: e.g.
section,pos,consent(see the key-values guide). - Geo defaults: your primary market by default, unless the brief says otherwise.
- Device splits: your usual desktop / mobile / tablet breakdown.
To verify or refresh the available keys, the agent runs the free read targeting(action="list_custom_targeting_keys"), then pins the stable IDs into the skill's table (previous section).
Advertiser & sector exclusions
The skill is where your house exclusion rules live — so every session enforces them, without relying on the operator's memory:
- Competitive exclusion: your GAM competitive labels. The agent lists them via
gam_admin(action="labels.list")and creates them when needed viagam_admin(action="labels.create"). - Sector blocklists: e.g. "never book crypto / gambling on kids inventory." A prose rule the agent enforces before any booking.
- Ad Exchange creative blocking: via
ad_review_center(action="search")to inspect, thenad_review_center(action="block_batch")to block (orad_review_center(action="allow_batch")to allow).
Ship & maintain the skill
Follow the full authoring guide (frontmatter, routing triggers, MCP/CLI dual-surface pattern) on the public repo: github.com/OrbiAds/Orbiads-GAM-MCP — docs/custom-skills.
Any skill that can write must embed the OrbiAds safety contract: reads are free, every write goes through preview → confirm → execute (never a blind write). Finally, treat the skill as a living document: append gotchas as the agent hits real failures.
- Identity derived at runtime via
check_credentials/get_my_tenant_id— never hardcoded. - Reads are free (0 credits) — call them liberally.
- Every write: preview → confirm → execute with a confirmation_token.
Write your first house skill
Configure your Campaign Presets and conventions at /settings/gam, then follow the authoring guide to turn your operation's context into procedural memory shared by all your agents.
