← AdspirerCONTENT HISTORY

Update to Adspirer

Snapshot Oct 28, 2026 · 12:05 UTC · version 2.1.0

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save Adspirer and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "How to call the Adspirer MCP hub correctly — the router two-step (action \"list_tools\" then action \"execute\" with tool_name), the direct tools search_tools and get_tool_schema, per-platform account IDs, quota rules, and the budget unit (every platform takes the account's own currency as a decimal — never cents). Load this before making any Adspirer tool call.",
  "included_files": [
    {
      "relative_path": "references/error-catalog.md",
      "size_in_bytes": 5161
    }
  ],
  "name": "adspirer-mcp",
  "skill_md_contents": "---\nname: adspirer-mcp\ndescription: How to call the Adspirer MCP hub correctly — the router two-step (action \"list_tools\" then action \"execute\" with tool_name), the direct tools search_tools and get_tool_schema, per-platform account IDs, quota rules, and the budget unit (every platform takes the account's own currency as a decimal — never cents). Load this before making any Adspirer tool call.\n---\n\n# Calling the Adspirer MCP hub\n\nAdspirer exposes **23 top-level tools**. Twelve of them are *routers* that stand in front of\nhundreds of platform tools. Calling a platform tool by its own name does not work — it is not in\nthe tool list. Read this before your first tool call.\n\n## The tool surface\n\n**Call these directly, by name:**\n\n| Tool | Use it for |\n|---|---|\n| `start_here` | New or unsure user. Free. |\n| `search_tools` | \"Which tool does X?\" Semantic search over every tool. |\n| `get_tool_schema` | Exact parameters for a tool, before you call it. |\n| `get_connections_status` | Which ad accounts are connected, and their health. Free. |\n| `get_usage_status` | Tool calls used and left this period, and when it resets. Free. |\n| `switch_primary_account` | Change which account is active. |\n| `get_campaign_performance` | Google Ads performance. |\n| `get_meta_campaign_performance` | Meta (Facebook/Instagram) performance. |\n| `audit_conversion_tracking` | Conversion-tracking health across platforms. |\n| `diagnose_funnel` | \"Why aren't my ads selling?\" Checks the funnel in order and stops at the first broken step. |\n| `competitor_ads_research` | A competitor's live ads, by website domain (ask for the domain; never guess it). |\n\n**These are routers.** Never call their inner tools by name:\n\n`google_ads` · `meta_ads` · `linkedin_ads` · `tiktok_ads` · `amazon_ads` · `chatgpt_ads` ·\n`microsoft_ads` · `monitoring_and_reporting` · `google_analytics` · `google_search_console` ·\n`google_tag_manager` · `klaviyo`\n\n## The router two-step\n\nEvery router takes the same three fields: `action`, `tool_name`, `arguments`.\n\n**Step 1 — discover.** Always first. Never costs quota.\n\n```json\n{ \"action\": \"list_tools\" }\n```\n\nReturns every tool on that platform with its full parameter schema.\n\n**Step 2 — execute.** Use an exact `tool_name` from step 1.\n\n```json\n{\n  \"action\": \"execute\",\n  \"tool_name\": \"list_tiktok_campaigns\",\n  \"arguments\": { \"advertiser_id\": \"7012345678901234567\" }\n}\n```\n\n### Rules\n\n- `action: \"execute\"` without a `tool_name` is **invalid**. It returns an error. **Do not retry\n  the same call** — go back to `list_tools` and read the real tool name.\n- Never pass a platform tool name as `action`. `action` is only ever `\"list_tools\"` or `\"execute\"`.\n- `search_tools` and `get_tool_schema` are **top-level**. Call them directly when they are in\n  your tool list. If your client does not list `get_tool_schema`, call it through any platform\n  router: `google_ads` with `action: \"execute\"`, `tool_name: \"get_tool_schema\"`,\n  `arguments: {\"tool_names\": [...]}`. It returns the same schema. Never stop because it is missing.\n- Never guess a tool name or a parameter. If you are unsure, call `list_tools` or `get_tool_schema`.\n\n## Finding the right tool\n\nWhen you don't know which tool does the job:\n\n1. `search_tools` with a natural-language description of the task.\n2. `get_tool_schema` with the candidate names to get their exact parameters. Not in your tool\n   list? Call it through a router (see Rules above).\n3. Call the tool: directly if it's in the direct list above, otherwise through its router with\n   `action: \"execute\"`.\n\n## Budgets: the unit differs per platform\n\nThis is the single most common error. **Read the row before you send a budget.**\n\n| Platform | Unit | `$50/day` becomes |\n|---|---|---|\n| Google Ads | account currency (decimal) | `50.0` |\n| Meta Ads | account currency (decimal) | `50.0` |\n| TikTok Ads | account currency (decimal) | `50.0` |\n| LinkedIn Ads | account currency (decimal) | `50.0` |\n| Amazon Ads | account currency (decimal) | `50.0` |\n| ChatGPT Ads | account currency (decimal) | `50.0` |\n| Microsoft Advertising | account currency (decimal) | `50.0` |\n\n**Every platform takes the budget in the account's own currency as a plain decimal — never\ncents, never multiplied by anything.** For a `$20/day` budget send `20`, not `2000`. For\n`$50/day` send `50`. The tools convert to each platform's internal unit for you; if you send\n`2000` meaning `$20` you will book **`$2,000/day`** — a 100× overspend.\n\nNever convert the user's currency to USD. Send the number in the account's own currency.\n\n## Accounts\n\nOne connected account is selected automatically. With two or more *active* accounts you must name\none — the call fails with a `multi_account` error that lists them.\n\nThe parameter name differs per platform:\n\n| Platform | Parameter |\n|---|---|\n| Google Ads | `customer_id` |\n| Meta Ads | `ad_account_id` |\n| TikTok Ads | `advertiser_id` |\n| LinkedIn Ads | `account_id` |\n| Amazon Ads | `profile_id` |\n| ChatGPT Ads | `account_id` |\n| Microsoft Advertising | `account_id` (from `list_microsoft_accounts`) |\n\nSend IDs as **strings**, not numbers. Naming an account the user has not connected returns a 403 —\nit never quietly falls back to another account, so do not treat 403 as \"try again without the id.\"\n\nUse `get_connections_status` to see what is connected.\n\n## Quota\n\nMost platform tool calls count toward the user's monthly allowance of tool calls.\n\n**Free, call these as much as you need:** `action: \"list_tools\"` on any router, `start_here`,\n`get_connections_status` and `get_usage_status`.\n\nBecause discovery is free, there is never a reason to guess a tool name to save calls.\n\nIf a call is refused because the user's allowance is used up, tell the user plainly that they've\nreached their limit for this period and when it resets (`get_usage_status` shows both). Don't work\naround it, don't switch to another tool to get the same data, and never invent the numbers.\n\n## Tools for services the user hasn't connected\n\n`google_analytics`, `google_search_console`, `google_tag_manager`, `klaviyo` and the ad-platform\nrouters are always listed, even before the user connects that service. Calling one that isn't\nconnected returns a message asking the user to connect it. Relay that and point them at\n`https://adspirer.ai/connections`; don't treat it as an error to retry.\n\n## When something fails\n\nRead `references/error-catalog.md` for the known error codes and their fixes before retrying\nanything. Retrying an invalid call unchanged will fail the same way.\n"
}

SHA-256 of public snapshot: 506397477be68e9092b9bf6dce1b95aaa37cfd886c22e667ef9bfef03a1cb0ac