← AdAgntCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to AdAgnt
Snapshot Sep 30, 2026 · 23:11 UTC · version 1.0.0
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "adagnt-mcp",
"description": "The AdAgnt tool-call contract — how to resolve accounts, the hard argument limits that reject calls, what each error code means, and how quota works. Load this before calling AdAgnt tools so calls succeed first time instead of failing validation.",
"included_files": [],
"skill_md_contents": "---\nname: adagnt-mcp\ndescription: The AdAgnt tool-call contract — how to resolve accounts, the hard argument limits that reject calls, what each error code means, and how quota works. Load this before calling AdAgnt tools so calls succeed first time instead of failing validation.\n---\n\n# AdAgnt tool-call contract\n\n291 tools across six ad platforms. Most failed calls are not hard problems —\nthey are the same handful of avoidable mistakes. This is that list.\n\n## 1. Resolve the account before anything else\n\nTools operate on the user's *primary* account for a platform unless told\notherwise.\n\n- `list_connected_accounts` — what is connected, and which is primary\n- `get_connections_status` — whether a platform is linked and healthy\n- `switch_primary_account` — change the default (a write)\n\n**Amazon is different.** Every Amazon tool needs a **profile**, which pairs an\nadvertiser account with one marketplace. Call `amazon_list_profiles` first and\npass the profile explicitly. A US profile cannot see UK campaigns.\n\n**AppLovin** uses accounts from `applovin_list_accounts`.\n\nIf no account exists you get `NO_ACCOUNT`. In sandbox that usually means the\nplatform has not been touched yet — a demo account with 90 days of history is\ncreated the first time you use a platform, so simply proceeding will seed it.\n\n## 2. Hard argument limits that reject the call\n\nThese are enforced by schema. Getting them wrong returns `INVALID_ARGS` and\nnothing is created.\n\n| Tool | Field | Limit |\n|---|---|---|\n| `create_search_campaign` | `ad_groups[].headlines` | **exactly 15** |\n| `create_search_campaign` | `ad_groups[].descriptions` | **exactly 4** |\n| `create_search_campaign` | `ad_groups[].keywords` | **at least 5** |\n| `create_ad` | `headlines` | 3–15 |\n| `update_ad_headlines` | `headlines` | 3–15 |\n\n**Write the full set yourself.** Do not ask the user for fifteen headlines, and\nnever promise them a smaller number — Google itself allows 3–15 headlines and\n2–4 descriptions, so this constraint is AdAgnt's and stricter than the platform's.\n\n## 3. Order of operations that actually matters\n\n- **`get_true_roas` throws without a revenue source.** Check\n `list_revenue_sources` first; if empty, propose `connect_revenue_source`\n (GA4, Shopify, Stripe, Klaviyo — it backfills 90 days) and wait for approval.\n Do not call it and report the error as a finding.\n- **Keyword research before campaign creation.** `research_keywords` returns\n real volumes, competition and bid ranges. Inventing keywords wastes the\n user's money.\n- **Assets before campaigns** on Meta, TikTok and LinkedIn —\n `validate_and_prepare_*_assets`, `upload_tiktok_images`, `validate_video`.\n- **Amazon:** profile → campaign → ad group → product ad → keywords. Each step\n needs the ID from the one before.\n\n## 4. Error codes, and what each one actually means\n\n| Code | Meaning | What to do |\n|---|---|---|\n| `INVALID_ARGS` | Arguments failed validation | Read the message — it names the field. Fix and retry **once**. |\n| `NOT_FOUND` | The named object does not exist | List first, then act on a real ID. Never guess an ID. |\n| `NO_ACCOUNT` | No connected account for that platform | Offer to connect it. |\n| `NOT_SUPPORTED` | The operation is not available on this driver | Not a bug. Say so plainly and stop. |\n| `PLATFORM_ERROR` | The ad platform itself rejected the call | Report the platform's reason. Do not retry a write. |\n| `QUOTA_EXCEEDED` | Monthly tool-call limit reached | Report the limit; `get_usage_status` shows plan and reset date. |\n\n**Known `NOT_SUPPORTED`: AppLovin on a live account.** All writes throw, plus\ncreative-set listing, asset listing and targeting search. Campaign reads and\nthe whole reporting surface work. In sandbox all 36 AppLovin tools work. Tell\nthe user which they are hitting rather than implying a bug.\n\n## 5. Writes\n\n- Every write tool is annotated **destructive**, so ChatGPT raises its own\n permission prompt. That prompt describes intent, not values — it is not a\n substitute for showing the user the actual budget, keywords and ad copy.\n- **Never auto-retry a write after an ambiguous failure.** That is how\n duplicate campaigns and double spend happen. Retry only `INVALID_ARGS`, which\n provably did nothing.\n- **Verify with an independent read.** Do not report success or failure from\n the write's own return value alone. A write here has come back looking like a\n failure while the campaign was in fact created — reporting that verbatim\n would have had the user create it a second time. Call the matching list/get\n tool and report what you observed there.\n\n## 6. Quota\n\nMetered per tool call, reads included. `get_usage_status` returns the plan,\nthe monthly limit, the reset date, and the upgrade options. When quota is hit,\ntools stop cleanly — nothing is left half-changed.\n\nBatch where a tool supports it (`batch_update_linkedin_campaigns`) rather than\nlooping single calls.\n\n## 7. Results\n\nEvery tool returns a JSON object, and the MCP layer sends it as\n`structuredContent` alongside the text. Read fields directly rather than\nre-parsing the text block.\n"
}SHA-256: fdf564d410bcf8b43a4a5b668eeeea9d35007783e5de74f56bdf12a80f4f2b46