# Adako > Adako is an MCP server and REST API that connects Claude, ChatGPT, Cursor and other assistants to Google Ads, > Meta Ads, ChatGPT Ads and LinkedIn Ads. Reads are free and instant. Every change becomes a proposal the > operator approves; nothing goes live without that approval. New campaigns start paused. MCP endpoint: https://adako.ai/mcp REST API: https://adako.ai/api/v1/tools/{tool_name}/execute Web app: https://adako.ai Tools: 203 across four ad platforms (171 on the platforms, 32 for connections, approvals, monitoring and diagnostics), reached through 15 direct tools and 11 routers. ## Index - [Documentation](https://adako.ai/docs) - [Quickstart](https://adako.ai/docs/quickstart) - [Connect Claude](https://adako.ai/docs/clients/claude) - [Connect Claude Code](https://adako.ai/docs/clients/claude-code) - [Connect ChatGPT](https://adako.ai/docs/clients/chatgpt) - [Connect Cursor](https://adako.ai/docs/clients/cursor) - [Connect Codex](https://adako.ai/docs/clients/codex) - [Connect Gemini](https://adako.ai/docs/clients/gemini) - [Connect Antigravity](https://adako.ai/docs/clients/antigravity) - [Connect Windsurf](https://adako.ai/docs/clients/windsurf) - [Connect Perplexity](https://adako.ai/docs/clients/perplexity) - [Connect VS Code](https://adako.ai/docs/clients/vscode) - [Connect Grok](https://adako.ai/docs/clients/grok) - [Connect Qwen Code](https://adako.ai/docs/clients/qwen-code) - [Connect Kimi](https://adako.ai/docs/clients/kimi) - [Connect OpenClaw](https://adako.ai/docs/clients/openclaw) - [Connect Hermes](https://adako.ai/docs/clients/hermes) - [Connect DeepSeek](https://adako.ai/docs/clients/deepseek) - [Google Ads](https://adako.ai/docs/google-ads) - [Meta Ads](https://adako.ai/docs/meta-ads) - [Connect Meta Ads with your own token](https://adako.ai/docs/meta-ads/own-token) - [ChatGPT Ads](https://adako.ai/docs/chatgpt-ads) - [LinkedIn Ads](https://adako.ai/docs/linkedin-ads) - [The tool surface](https://adako.ai/docs/routers): routers, search_tools, fan-out - [Workflows](https://adako.ai/docs/workflows) - [Monitors, briefs and reports](https://adako.ai/docs/monitors) - [Safety model](https://adako.ai/docs/safety) - [Tools reference](https://adako.ai/docs/tools) - [REST API](https://adako.ai/docs/api) - [Every tool with its first line](https://adako.ai/llms-full.txt) - [Integrations](https://adako.ai/integrations): every assistant and ad platform pairing - [Google Ads with an AI agent](https://adako.ai/integrations/google-ads) - [Meta Ads with an AI agent](https://adako.ai/integrations/meta-ads) - [ChatGPT Ads with an AI agent](https://adako.ai/integrations/chatgpt-ads) - [LinkedIn Ads with an AI agent](https://adako.ai/integrations/linkedin-ads) - [Google Ads in Claude](https://adako.ai/integrations/claude-google-ads) - [Meta Ads in Claude](https://adako.ai/integrations/claude-meta-ads) - [Google Ads in ChatGPT](https://adako.ai/integrations/chatgpt-google-ads) - [Meta Ads in ChatGPT](https://adako.ai/integrations/chatgpt-meta-ads) - [Google Ads in Claude Code](https://adako.ai/integrations/claude-code-google-ads) - [Google Ads in Cursor](https://adako.ai/integrations/cursor-google-ads) - [LinkedIn Ads in Claude](https://adako.ai/integrations/claude-linkedin-ads) - [ChatGPT Ads in Claude](https://adako.ai/integrations/claude-chatgpt-ads) - [Meta Ads in Claude Code](https://adako.ai/integrations/claude-code-meta-ads) - [Meta Ads in Cursor](https://adako.ai/integrations/cursor-meta-ads) - [Google Ads in Gemini](https://adako.ai/integrations/gemini-google-ads) - [Google Ads in Codex](https://adako.ai/integrations/codex-google-ads) - [Google Ads in VS Code](https://adako.ai/integrations/vscode-google-ads) - [LinkedIn Ads in ChatGPT](https://adako.ai/integrations/chatgpt-linkedin-ads) - [LinkedIn Ads in Claude Code](https://adako.ai/integrations/claude-code-linkedin-ads) - [Blog](https://adako.ai/blog) - [A weekly ad account review in ten minutes](https://adako.ai/blog/weekly-ad-account-review) - [Creative fatigue on Meta: how to tell it apart from a bad audience](https://adako.ai/blog/meta-ads-creative-fatigue) - [How to let an AI agent into your ad account without losing money](https://adako.ai/blog/let-an-ai-agent-run-your-ad-account) - [Google Ads scripts vs. an AI assistant: when each one is right](https://adako.ai/blog/google-ads-scripts-vs-ai-assistant) - [How to advertise on ChatGPT: a setup guide for chat card ads](https://adako.ai/blog/how-to-advertise-on-chatgpt) - [What is an MCP server, and what does it do for an ad account?](https://adako.ai/blog/what-is-an-mcp-server-for-ads) - [How to find wasted ad spend in Google Ads](https://adako.ai/blog/find-wasted-ad-spend) - [MCP server for PPC freelancers and agencies](https://adako.ai/for/freelancers) - [Use cases](https://adako.ai/use-cases): one ad-ops job per page, with the tools and defaults - [Find negative keywords in Google Ads with AI](https://adako.ai/use-cases/google-ads-negative-keywords) - [Find wasted spend in Google Ads with AI](https://adako.ai/use-cases/google-ads-wasted-spend) - [Find why Google Ads performance dropped](https://adako.ai/use-cases/google-ads-performance-drop) - [Detect creative fatigue in Meta Ads](https://adako.ai/use-cases/meta-ads-creative-fatigue) - [Find why ChatGPT Ads are not delivering](https://adako.ai/use-cases/chatgpt-ads-not-delivering) - [Check the ChatGPT Ads pixel and conversion events](https://adako.ai/use-cases/chatgpt-ads-pixel-check) - [Compare LinkedIn Ads cost per lead by seniority](https://adako.ai/use-cases/linkedin-ads-cost-per-lead-by-seniority) - [Check LinkedIn Ads audience size before launch](https://adako.ai/use-cases/linkedin-ads-audience-size) - [Find wasted spend in LinkedIn Ads](https://adako.ai/use-cases/linkedin-ads-wasted-spend) - [Free tools](https://adako.ai/tools): Google Ads checks that run in the browser, no sign-up - [Google Ads wasted spend check](https://adako.ai/tools/google-ads-wasted-spend): Drop the Search terms report. See the terms that spent with no conversion and the negative keywords to add. - [Pricing](https://adako.ai/pricing) - [Contact](https://adako.ai/contact) ## Quickstart 1. Create an account and sign in. 2. Connect a platform on the Accounts page, then make one account active per platform. 3. Add the MCP URL to your assistant: https://adako.ai/mcp 4. Run the first prompt: "Call start_here and tell me what is connected." 5. Ask a read question. Reads are free, run immediately and change nothing. 6. Ask for a change. Adako answers with a proposal: summary, field-level diff, expected impact, warnings. Approve it in chat (direct policy) or on the Approvals page (inbox policy). ## Connect your AI ### Claude 1. Open Claude Connectors. 2. Choose Add custom connector. Copy and paste the connection name and remote MCP server URL below. 3. Add the connector, click Connect, and complete the Adako authorization screen. 4. Start a new chat and select Adako from the connectors menu. Connection name: Adako Remote MCP server URL: https://adako.ai/mcp Adako never sends your ad platform tokens or keys to the client. The connector holds an Adako token only. ### Claude Code 1. Open a terminal in any project. 2. Copy and run the command below. 3. Start Claude Code, run /mcp, and complete the authorization screen in your browser. 4. Start a new session and ask Claude Code to use Adako. 5. Optional: install the Adako plugin for the eleven skills. Inside Claude Code, run /plugin marketplace add ruslan2027/adako-mcp, then /plugin install adako@adako. The plugin registers its own adako server, so remove the one from step 2 with claude mcp remove adako to keep a single copy. Then run /mcp and sign in to the plugin’s server. Add Adako: claude mcp add --transport http adako https://adako.ai/mcp API key instead of OAuth: claude mcp add --transport http adako https://adako.ai/mcp --header "Authorization: Bearer ak_live_paste_your_key_here" Optional: the Adako plugin (server and skills): /plugin marketplace add ruslan2027/adako-mcp /plugin install adako@adako Use an API key for headless environments (CI, servers). Create one at /keys. ### ChatGPT 1. Turn on Developer mode under Settings → Security & login, then open ChatGPT Plugins. 2. Click the + button. Copy and paste the connection name and MCP server URL below, add a short description, and choose the public endpoint connection option. Then click Create. 3. Complete the authorization screen if prompted. Start a new conversation, open the tools menu, and select Adako. Connection name: Adako MCP server URL: https://adako.ai/mcp ### Cursor 1. In Cursor, click Customize in the left sidebar, then the MCPs tab. 2. Click New MCP Server. Cursor opens its configuration file (C:\Users\\.cursor\mcp.json on Windows, /Users//.cursor/mcp.json on macOS) — empty the first time, or holding the servers you already use. 3. Add the adako entry inside "mcpServers", beside anything already there, and save the file (Ctrl+S, or Cmd+S on a Mac). Entries are separated by commas, so put one after the entry above it. 4. Cursor connects and opens the Adako authorization screen in your browser. After you approve it, Adako shows in the MCPs tab with its tools. Beside your other servers, inside "mcpServers": "adako": { "url": "https://adako.ai/mcp" } C:\Users\\.cursor\mcp.json on Windows, /Users//.cursor/mcp.json on macOS — the whole file, if Adako is your first server: { "mcpServers": { "adako": { "url": "https://adako.ai/mcp" } } } For one project only, put the same block in .cursor/mcp.json in that project instead. On a machine with no browser, add a headers block with a key from /keys in place of ak_live_paste_your_key_here and skip the sign-in. ### Codex 1. Open a terminal in any project. 2. Copy and run the add command below. 3. Copy and run the login command, then complete the authorization screen in your browser. 4. Start a new Codex session and ask Codex to use Adako. Add Adako: codex mcp add adako --url https://adako.ai/mcp Sign in: codex mcp login adako ### Gemini 1. Open Gemini on a computer and go to its apps settings. 2. Scroll to Custom apps at the bottom, choose Add a custom app, paste the MCP server URL below, and click Next. 3. Complete the Adako authorization screen, then accept Google’s notice about third-party MCP servers. Leave the Advanced features credential fields empty: Adako registers itself. 4. Start a new chat, type @, and pick Adako so the prompt reaches it. MCP server URL: https://adako.ai/mcp Adako never sends your ad platform tokens or keys to the client. The custom app holds an Adako token only. ### Antigravity 1. In the desktop app, open Settings → Customizations and click Open MCP Config under Installed MCP Servers. In the IDE, the agent side panel has the same thing under … → MCP Servers. In the CLI, type /mcp, or open the file yourself: C:\Users\\.gemini\config\mcp_config.json on Windows, /Users//.gemini/config/mcp_config.json on macOS, /home//.gemini/config/mcp_config.json on Linux. 2. Add the adako entry inside "mcpServers", beside anything already there, and save the file. 3. Back in Installed MCP Servers, press the refresh button. Adako appears, and clicking it starts the authorization screen in your browser. 4. Adako then shows as connected with 29 tools enabled. In the CLI, /mcp lists the same thing. C:\Users\\.gemini\config\mcp_config.json on Windows, /Users//.gemini/config/mcp_config.json on macOS — every project: { "mcpServers": { "adako": { "serverUrl": "https://adako.ai/mcp" } } } Add MCP + beside it browses Google’s store; Adako is a custom server, so it goes in the config. For one project only, use .agents/mcp_config.json in that project. The key is serverUrl: url and httpUrl are the older Gemini CLI spelling. On a machine with no browser, add a headers block with a key from /keys in place of ak_live_paste_your_key_here. Gemini CLI itself stopped serving free and Pro accounts on 18 June 2026 and now runs only on paid Gemini and Gemini Enterprise API keys; if you still use it, the old block in .gemini/settings.json keeps working with httpUrl, and agy plugin import gemini brings an existing setup across. ### Windsurf 1. Open Windsurf Settings, then Cascade, then the MCP servers panel, and choose the raw configuration file. 2. Add the adako block below beside any servers you already have. Do not replace the file. 3. Save, then refresh the server list in the panel. 4. Open Cascade and ask it to use Adako. C:\Users\\.codeium\windsurf\mcp_config.json on Windows, /Users//.codeium/windsurf/mcp_config.json on macOS: { "mcpServers": { "adako": { "serverUrl": "https://adako.ai/mcp" } } } API key instead of the browser sign-in: { "mcpServers": { "adako": { "serverUrl": "https://adako.ai/mcp", "headers": { "Authorization": "Bearer ak_live_paste_your_key_here" } } } } Cascade signs in through the browser on the first call. On a machine with no browser, add a headers block with a key from /keys in place of ak_live_paste_your_key_here instead. Tell support@adako.ai if a step does not match what you see. ### Perplexity 1. On the web, open perplexity.ai/computer/connectors. In the desktop app, open Settings, then Connectors. 2. Add a custom connector. Enter Adako as the name and the URL below as the MCP server URL, and choose OAuth as the authentication. 3. Complete the Adako authorization screen in the browser. 4. Start a new thread and switch the Adako connector on for it. Connector name: Adako MCP server URL: https://adako.ai/mcp Custom connectors are a paid feature: a free Perplexity account has no place to add one. An Enterprise admin can also share a connector with the whole organisation, or switch off members adding their own. Where connectors are unavailable, Adako runs from any other client on this page or over the REST API. ### VS Code 1. Create .vscode/mcp.json in your workspace, or open your user-level mcp.json to make Adako available in every workspace. 2. Add the adako entry below beside any servers you already have, and save the file. 3. Start the server when VS Code offers to, and complete the Adako authorization screen in your browser. 4. Open Chat in agent mode and ask it to use Adako. .vscode/mcp.json: { "servers": { "adako": { "type": "http", "url": "https://adako.ai/mcp" } } } API key instead of the browser sign-in: { "servers": { "adako": { "type": "http", "url": "https://adako.ai/mcp", "headers": { "Authorization": "Bearer ak_live_paste_your_key_here" } } } } The key is servers, not mcpServers, and "type": "http" is required. VS Code runs the sign-in itself and stores the token; for a machine with no browser, send a key from /keys as an Authorization header instead. Tell support@adako.ai if a step does not match what you see. ### Grok 1. Open Grok in a browser and go to Plugins. 2. Choose New Connector, and enter the name and the MCP server URL below. 3. Complete the Adako authorization screen if Grok asks for it. 4. Start a new chat and turn the Adako connector on for it. Connector name: Adako MCP server URL: https://adako.ai/mcp Adako never sends your ad platform tokens or keys to the client. The connector holds an Adako token only. Tell support@adako.ai if a step does not match what you see. ### Qwen Code 1. Open a terminal in any project. 2. Copy and run the command below. Drop --scope user to add Adako to this project only. 3. Start Qwen Code and run /mcp. The first connection opens the Adako authorization screen in your browser. 4. Ask Qwen Code to use Adako. Add Adako: qwen mcp add --transport http --scope user adako https://adako.ai/mcp C:\Users\\.qwen\settings.json on Windows, /Users//.qwen/settings.json on macOS, /home//.qwen/settings.json on Linux — the same server by hand: { "mcpServers": { "adako": { "httpUrl": "https://adako.ai/mcp" } } } API key instead of the browser sign-in: { "mcpServers": { "adako": { "httpUrl": "https://adako.ai/mcp", "headers": { "Authorization": "Bearer ak_live_paste_your_key_here" } } } } Use httpUrl, not url: url is the SSE field. Qwen Code finds Adako’s authorization server and registers itself, so no client id is needed. Use an API key from /keys where no browser is available. The Qwen Chat desktop app keeps its own MCP settings; these steps cover the CLI. ### Kimi 1. Open a terminal and run the two commands below: the first adds Adako, the second opens the Adako authorization screen in your browser. 2. Start Kimi Code and run /mcp to confirm Adako is connected. 3. Ask Kimi to use it. Add Adako and sign in: kimi mcp add --transport http --auth oauth adako https://adako.ai/mcp kimi mcp auth adako C:\Users\\.kimi\mcp.json on Windows, /Users//.kimi/mcp.json on macOS, /home//.kimi/mcp.json on Linux — the same server by hand: { "mcpServers": { "adako": { "url": "https://adako.ai/mcp" } } } Kimi Code keeps its servers in C:\Users\\.kimi\mcp.json on Windows, /Users//.kimi/mcp.json on macOS, /home//.kimi/mcp.json on Linux; add the adako entry beside any others rather than replacing the file. /mcp-config inside a session does the same thing conversationally, and --header "Authorization: Bearer " replaces the browser sign-in where there is no browser. Kimi Code needs a paid Kimi plan: without one it answers 403 before any MCP server is reached. The Kimi chat app in the browser has no place for a custom MCP server, so Adako runs from Kimi Code. ### OpenClaw 1. Open a terminal on the machine that runs OpenClaw. 2. Copy and run the add command below. 3. Copy and run the login command, then complete the Adako authorization screen in your browser. 4. Run openclaw mcp status to confirm Adako is connected, then ask your agent to use it. Add Adako: openclaw mcp add adako --url https://adako.ai/mcp --transport streamable-http Sign in: openclaw mcp login adako C:\Users\\.openclaw\openclaw.json on Windows, /Users//.openclaw/openclaw.json on macOS, /home//.openclaw/openclaw.json on Linux — the same server by hand: { mcp: { servers: { adako: { url: 'https://adako.ai/mcp', transport: 'streamable-http', auth: 'oauth', }, }, }, } The config file is JSON5 and the key is mcp.servers, not mcpServers. OpenClaw ignores a static Authorization header while auth is "oauth", so choose one route: the browser sign-in, or auth left out and headers carrying an Adako key from /keys. openclaw mcp doctor adako --probe explains a failing connection. ### Hermes 1. Open the Hermes configuration: C:\Users\\.hermes\config.yaml on Windows, /Users//.hermes/config.yaml on macOS, /home//.hermes/config.yaml on Linux. 2. Add the mcp_servers block below beside anything already there, and save the file. 3. Run hermes mcp login adako, then complete the Adako authorization screen in your browser. 4. Run hermes mcp test adako, then ask Hermes to use Adako. C:\Users\\.hermes\config.yaml on Windows, /Users//.hermes/config.yaml on macOS, /home//.hermes/config.yaml on Linux: mcp_servers: adako: url: 'https://adako.ai/mcp' auth: oauth API key instead of the browser sign-in: mcp_servers: adako: url: 'https://adako.ai/mcp' headers: Authorization: 'Bearer ak_live_paste_your_key_here' These steps are for the Nous Research Hermes agent — the agent, not the Hermes model series. The key is mcp_servers with an underscore. Adako’s tools arrive named mcp_adako_*, and /reload-mcp picks up a config change without a restart. ### DeepSeek 1. Create an Adako API key at /keys. 2. Add the block below to your dsh config, or to a patch file you pass to dsh. 3. Start the harness with npx @deepseek-ai/dsh web. It reads Adako’s tools on startup. 4. Ask it to use Adako. dsh.yml: - insert: - id: mcp-adako name: '@deepseek-ai/dsh-mcp-client' config: serverName: adako transport: streamable-http url: 'https://adako.ai/mcp' headers: Authorization: 'Bearer ak_live_paste_your_key_here' dsh is a developer preview whose configuration still changes. Its MCP plugin documents static headers only, not the browser sign-in, so use an API key. Neither the DeepSeek chat app nor the DeepSeek API can reach an MCP server on its own: to drive Adako with DeepSeek models, run them inside a client from this list. ## The tool surface 203 tools reach a client as 26 entries: 15 callable by name plus 11 routers. Direct: approve_proposal, check_media, get_connections_status, get_tool_schema, get_usage_status, list_connected_accounts, list_pending_proposals, reject_proposal, search_tools, start_here, switch_primary_account, google_get_campaign_performance, meta_get_campaign_performance, chatgpt_get_performance, linkedin_get_campaign_performance. Routers: google_ads + google_ads_write, meta_ads + meta_ads_write, chatgpt_ads + chatgpt_ads_write, linkedin_ads + linkedin_ads_write, monitoring + monitoring_write, diagnostics. Each platform, and monitoring, has two routers: a read router and a _write router. diagnostics has reads only. Reads: google_ads(action="execute", tool_name="google_list_campaigns", arguments={...}). They answer immediately. Changes: google_ads_write(action="execute", tool_name="google_pause_campaign", arguments={...}). A change creates a proposal; nothing changes until the user approves, in chat or in the web app. New objects are created PAUSED. A read router also takes action="list_tools" and action="get_tool_schema" for every tool it covers, changes included; both are free and instant. A _write router takes only action="execute" with a change tool. A change sent to a read router, or a read sent to a _write router, runs nothing and returns the right call. Why two: looking things up never changes an account, so an assistant that asks permission per tool can allow reads once. Every change runs through the _write tool, which asks each time and creates a proposal. search_tools ranks the whole registry from the user's own wording and returns the exact call line. Free. get_tool_schema returns a tool's JSON schema, required fields and enums. Free. Fan-out: a platform read router takes accounts=["…"] or accounts="all_active" on READ tools, runs them one after another, free like every read, and caps at 20 accounts. _write routers take no accounts: writes stay one account at a time. Account arguments: customer_id (Google Ads), ad_account_id (Meta Ads, ChatGPT Ads, LinkedIn Ads). ## Safety model 1. Everything is created behind a PAUSED switch: a new campaign is paused and what is created inside it is active, so turning the campaign on is the launch. There is no flag to skip it. 2. Every write becomes a proposal: dry run, preview with a field-level diff, approval, one execution, read-back. 3. A proposal carries an idempotency key and is claimed atomically, so a retry cannot execute it twice. 4. Pending proposals expire after 48 hours and then never run. 5. Eight tools remove anything, each behind confirm_delete: true. They are google_remove_negative_keywords, google_remove_asset_links, google_remove_search_themes, google_remove_label, linkedin_delete_creative, chatgpt_archive_campaign, delete_monitor, manage_scheduled_task (action delete). Pause never routes to a delete. 6. Money at the tool boundary is a decimal in the account currency, never micros or cents. IDs are strings. 7. Free text never reaches a write: locations and interests are resolved to platform IDs first, and ambiguity stops the call. 8. Platform tokens are encrypted server-side and never sent to the client. Arguments are redacted before logging. 9. A monitor never executes anything. When it fires it emails the operator and may create a proposal to approve. ### Account safety - Official APIs only: Google Ads API, Meta Marketing API, LinkedIn Marketing API, ChatGPT Ads advertiser API. Access comes from the platform sign-in or a token or key the user created. No passwords, browser automation, scraping or private endpoints. - Pacing: Meta calls to an ad account stop at 70% of its usage allowance until Meta's window resets. Google Ads operations are counted and stop before the daily allowance. A platform rate limit comes back with its wait time, when the platform gives one: wait and try once more, never loop. Monitors and briefs read stored history and make no platform calls. - A change is sent once and never resent. Only a read that never reached the platform gets one more try. - A refused call (disabled account, missing permission, policy) returns the platform reason and is not retried. An expired or revoked token marks the connection needs_reauth: calls ask the user to reconnect, the sync skips it. - The advertiser stays responsible for platform ad policies and pays the platform for ad spend. ### Agency data flow - The agency connects its own login with client accounts shared to it: a Google manager account (listed two levels deep), a Meta business portfolio and system user token, LinkedIn accounts the login has a role on, one ChatGPT Ads key per account. Only accounts turned on are read, changed or synced. - Stored: encrypted tokens (until disconnect), the account list, 90 days of daily metrics for active accounts, proposals, tool-call records with tokens and emails removed, monitors, briefs and reports. Live answers are not kept. - The assistant sees tool results, never platform tokens. Every connection belongs to one Adako account; another Adako account cannot reach it. - Disconnecting erases tokens at once and turns the accounts off; campaigns stay as they are. History and records stay until the Adako account is deleted or support@adako.ai is asked to remove them. ## Platforms Google Ads (70 tools): Search and Performance Max, keywords and search terms, budgets and bid strategies, assets and extensions, conversion actions, labels, ad schedules, device bid modifiers, geo, hourly and device reports, anomaly decomposition, budget reallocation plans, benchmarks. Writes create paused and read back. Meta Ads (44 tools): campaigns, ad sets and ads, image, video, carousel and app-install launches, flexible ads, audiences, placements and budget analysis, creative fatigue, pixels, lead forms, Instagram identities. No delete tools at all. ChatGPT Ads (23 tools): chat card campaigns end to end, account limits, geo lookup, pixels and conversion event settings, review verdicts. One advertiser API key is one account. A lifetime budget is required. LinkedIn Ads (34 tools): campaign groups, image, video, carousel and text campaigns, B2B targeting by title, industry, seniority and company size, audience size and delivery forecasts, conversion rules, engagement metrics. Minimum audience 300 members; campaign budget floor about 10/day. LinkedIn Ads reads are open to everyone on every ad account the connecting member administers. LinkedIn allows writes only on ad accounts listed on the application, five at a time at the current access tier, so a change needs the ad account id sent to support first; a write on an unlisted account is refused by LinkedIn with a 403. ## Monitors, briefs and reports Adako syncs a rolling 90 days of daily metrics per active account. A sync job runs at 06:00 UTC and a monitor pass at 07:00 UTC, evaluating every enabled monitor against yesterday in the account timezone. Monitors cost no tasks and make no platform call. Metrics: spend, clicks, impressions, conversions, conv_value, ctr, cpc, cpa, cpm, roas, conversion_rate, cost_per_lead, budget_utilization. Operators: less_than, greater_than, changes_by, drops_by, rises_by, with an absolute or relative threshold, a baseline window and consecutive_days. test_monitor replays a rule over the last 7 days before it is saved. create_monitor, update_monitor, schedule_brief and generate_report_now need the Pro plan or above. ## REST API and CLI POST https://adako.ai/api/v1/tools/{tool_name}/execute with an API key (Authorization: Bearer ak_live_…), an Idempotency-Key header and {"arguments": {...}}. The envelope is { success, tool, data, quota }. GET https://adako.ai/api/v1/tools lists the callable tools; GET https://adako.ai/api/v1/openapi.json is the OpenAPI document. Routers are MCP only: over REST the URL is the dispatch. search_tools and get_tool_schema run over REST too and return the REST request as their call line. The `adako` npm package wraps the same endpoints as a command line, for example: npx @adako/cli google list-campaigns --customer-id 1234567890 ## Pricing Plans set how many ad accounts Adako works on in a billing period (across all platforms) and how many tasks run a month. An account used in a billing period keeps its place until the period resets, even after it is switched off. Free: $0, 1 ad account a month, 30 tasks a month, 1 API key. Pro: $49/month for 5 ad accounts a month and 600 tasks a month, 5 API keys, priority support. Agency: $149/month for 20 ad accounts a month and 5,000 tasks a month, 20 API keys, priority support. Enterprise: priced per contract, 50+ ad accounts a month, annual contract with invoice, security review and DPA. Contact https://adako.ai/contact?topic=enterprise or support@adako.ai. Reads are free on every transport. A task is one billable change, counted when its proposal is created: approving is free, and a rejected or expired proposal still counts. System, discovery, diagnostic, proposal, monitoring and resolver tools cost 0. A question or a wasted-spend review costs 0, a pause or budget change 1, a campaign launch 1 to 8 depending on the platform. Monitors, scheduled briefs and generated reports need Pro or above. ## Tools Legend: risk (read-only | write | destructive-write), cost in tasks, then how to call it. ### Adako - approve_proposal [destructive-write, free, direct] — Approve and execute a pending proposal - check_media [read-only, free, direct] — Check an image or video before it becomes an ad - create_monitor [write, free, via monitoring_write] — Create a daily monitor on an ad account - delete_monitor [destructive-write, free, via monitoring_write] — Delete a monitor - explain_error [read-only, free, via diagnostics] — Explain a platform error - generate_report_now [write, free, via monitoring_write] — Compose a performance report now - get_campaign_spec [read-only, free, via diagnostics] — What a campaign needs before it can be created - get_connections_status [read-only, free, direct] — Connection health per platform - get_monitor_history [read-only, free, via monitoring] — Show what a monitor saw each day - get_tool_schema [read-only, free, direct] — Get the exact arguments a tool takes - get_usage_status [read-only, free, direct] — Plan and task usage - list_connected_accounts [read-only, free, direct] — List ad accounts (active and inactive) - list_monitors [read-only, free, via monitoring] — List the monitors on this account - list_pending_actions [read-only, free, via monitoring] — List the changes monitors have proposed - list_pending_proposals [read-only, free, direct] — List proposals waiting for approval - list_reports [read-only, free, via monitoring] — List the reports Adako has composed - list_scheduled_tasks [read-only, free, via monitoring] — List scheduled briefs, reports and monitors - list_what_i_can_do [read-only, free, via diagnostics] — Capability menu for the platforms this user has connected - manage_action [destructive-write, free, via monitoring_write] — Approve or reject a change a monitor proposed - manage_scheduled_task [write, free, via monitoring_write] — Pause, resume or delete a scheduled brief or a monitor - reject_proposal [write, free, direct] — Reject a pending proposal - schedule_brief [write, free, via monitoring_write] — Schedule a recurring performance brief by email - search_tools [read-only, free, direct] — Find the right Adako tool for a job - start_here [read-only, free, direct] — Start here — personalised next step - suggest_next_action [read-only, free, via diagnostics] — Three concrete next steps from the real account state - switch_primary_account [write, free, direct] — Switch the primary ad account for a platform - test_monitor [read-only, free, via monitoring] — Dry-run a monitor against the last week - update_monitor [write, free, via monitoring_write] — Change or pause a monitor - usage_value_summary [read-only, free, via diagnostics] — What this account has actually used Adako for - validate_campaign_draft [read-only, free, via diagnostics] — Dry-run a campaign draft against the platform rules - verify_campaign_is_live [read-only, free, via diagnostics] — Check whether a campaign actually exists and is running - why_did_this_fail [read-only, free, via diagnostics] — Explain the recent failed calls ### Google Ads - google_add_audience_signal [write, 1 task, via google_ads_write] — Add an audience signal to an asset group - google_add_call_asset [write, 1 task, via google_ads_write] — Add a call extension - google_add_callouts [write, 1 task, via google_ads_write] — Add callout extensions - google_add_image_assets [write, 1 task, via google_ads_write] — Upload image assets from URLs - google_add_keywords [write, 1 task, via google_ads_write] — Add keywords to a Google Ads ad group - google_add_negative_keywords [write, 1 task, via google_ads_write] — Add campaign-level negative keywords - google_add_search_themes [write, 1 task, via google_ads_write] — Add search themes to an asset group - google_add_sitelinks [write, 1 task, via google_ads_write] — Add sitelink extensions - google_add_structured_snippets [write, 1 task, via google_ads_write] — Add structured snippet extensions - google_analyze_search_terms [read-only, free, via google_ads] — Analyse Google Ads search terms and suggest negatives - google_analyze_wasted_spend [read-only, free, via google_ads] — Find Google Ads spend with nothing to show for it - google_apply_label [write, 1 task, via google_ads_write] — Apply a label to campaigns or ad groups - google_bulk_update_keyword_bids [destructive-write, 1 task, via google_ads_write] — Change many keyword bids at once - google_bulk_update_keyword_status [destructive-write, 1 task, via google_ads_write] — Pause or enable many keywords at once - google_create_conversion_action [write, 1 task, via google_ads_write] — Create a website conversion action - google_create_label [write, 1 task, via google_ads_write] — Create a label - google_create_pmax_campaign [destructive-write, 1 task, via google_ads_write] — Create a Performance Max campaign (paused) - google_create_responsive_search_ad [write, 1 task, via google_ads_write] — Create a responsive search ad (paused) - google_create_search_campaign [write, 1 task, via google_ads_write] — Create a Google Ads Search campaign (paused) - google_explain_performance_anomaly [read-only, free, via google_ads] — Explain why a metric moved - google_get_ad_creative [read-only, free, via google_ads] — Read the copy behind an ad - google_get_ad_group_performance [read-only, free, via google_ads] — Google Ads ad group performance - google_get_ad_performance [read-only, free, via google_ads] — Ad performance with a period comparison - google_get_ad_schedule [read-only, free, via google_ads] — Read a campaign ad schedule - google_get_asset_group_performance [read-only, free, via google_ads] — Performance Max asset group performance - google_get_asset_performance [read-only, free, via google_ads] — Per-asset performance labels (BEST / GOOD / LOW) - google_get_benchmark_context [read-only, free, via google_ads] — Indicative industry benchmarks for Google Search - google_get_campaign_performance [read-only, free, direct] — Google Ads campaign performance with period-over-period change - google_get_campaign_structure [read-only, free, via google_ads] — Google Ads campaign contents (ad groups, keywords, ads) - google_get_campaign_targeting [read-only, free, via google_ads] — Google Ads campaign targeting - google_get_conversion_action_performance [read-only, free, via google_ads] — Conversion action performance - google_get_device_performance [read-only, free, via google_ads] — Performance by device - google_get_geo_performance [read-only, free, via google_ads] — Performance by country - google_get_hourly_performance [read-only, free, via google_ads] — Performance by hour and day of week - google_get_keyword_performance [read-only, free, via google_ads] — Google Ads keyword performance (top spenders) - google_get_search_themes [read-only, free, via google_ads] — Read the signals on an asset group - google_list_asset_groups [read-only, free, via google_ads] — List Performance Max asset groups - google_list_assets [read-only, free, via google_ads] — List Google Ads assets and where they are used - google_list_bidding_strategies [read-only, free, via google_ads] — List portfolio bidding strategies - google_list_campaigns [read-only, free, via google_ads] — List Google Ads campaigns - google_list_conversion_actions [read-only, free, via google_ads] — Google Ads conversion actions - google_list_labels [read-only, free, via google_ads] — List labels and what they are applied to - google_list_languages [read-only, free, via google_ads] — Language ids for campaign targeting - google_optimize_budget_allocation [read-only, free, via google_ads] — Propose a budget reallocation (writes nothing) - google_pause_ad [destructive-write, 1 task, via google_ads_write] — Pause one ad - google_pause_ad_group [destructive-write, 1 task, via google_ads_write] — Pause a Google Ads ad group - google_pause_campaign [destructive-write, 1 task, via google_ads_write] — Pause a Google Ads campaign - google_remove_asset_links [destructive-write, 1 task, via google_ads_write] — Unlink assets from a campaign or ad group - google_remove_label [destructive-write, 1 task, via google_ads_write] — Take a label off campaigns or ad groups - google_remove_negative_keywords [destructive-write, 1 task, via google_ads_write] — Remove campaign negative keywords (permanent) - google_remove_search_themes [destructive-write, 1 task, via google_ads_write] — Remove search themes from an asset group - google_research_keywords [read-only, free, via google_ads] — Google Ads keyword ideas with volume and bid ranges - google_resolve_locations [read-only, free, via google_ads] — Turn place names into Google location ids - google_resume_ad [write, 1 task, via google_ads_write] — Resume a paused ad - google_resume_ad_group [write, 1 task, via google_ads_write] — Resume a paused Google Ads ad group - google_resume_campaign [write, 1 task, via google_ads_write] — Resume a paused Google Ads campaign - google_search_audiences [read-only, free, via google_ads] — Find audiences, user lists and interest segments - google_set_ad_schedule [destructive-write, 1 task, via google_ads_write] — Set a campaign ad schedule - google_set_business_name [write, 1 task, via google_ads_write] — Set the business name asset - google_set_device_bid_modifiers [destructive-write, 1 task, via google_ads_write] — Set device bid modifiers - google_update_bid_strategy [destructive-write, 1 task, via google_ads_write] — Change a campaign bidding strategy - google_update_campaign [destructive-write, 1 task, via google_ads_write] — Update Google Ads campaign settings - google_update_campaign_budget [destructive-write, 1 task, via google_ads_write] — Change a Google Ads campaign daily budget - google_update_campaign_languages [destructive-write, 1 task, via google_ads_write] — Set the languages a campaign targets - google_update_campaign_locations [destructive-write, 1 task, via google_ads_write] — Change where a campaign runs - google_update_campaign_networks [destructive-write, 1 task, via google_ads_write] — Turn search partners and display expansion on or off - google_update_conversion_action [destructive-write, 1 task, via google_ads_write] — Change a conversion action - google_update_keyword [destructive-write, 1 task, via google_ads_write] — Change a keyword bid or state - google_validate_ad_copy [read-only, free, via google_ads] — Check responsive search ad copy against the RSA limits - google_validate_and_prepare_assets [read-only, free, via google_ads] — Check assets against Google rules before uploading ### Meta Ads - meta_add_ad [write, 2 tasks, via meta_ads_write] — Add a paused ad to a Meta ad set - meta_add_ad_set [write, 2 tasks, via meta_ads_write] — Add a paused ad set to a Meta campaign - meta_analyze_audiences [read-only, free, via meta_ads] — Rank Meta audience segments and suggest where budget should go - meta_analyze_wasted_spend [read-only, free, via meta_ads] — Find Meta spend that bought nothing - meta_browse_targeting [read-only, free, via meta_ads] — Browse Meta’s targeting catalogue - meta_create_app_install_campaign [write, 3 tasks, via meta_ads_write] — Create a paused Meta app-install campaign - meta_create_carousel_campaign [write, 3 tasks, via meta_ads_write] — Create a paused Meta carousel campaign - meta_create_flexible_ad [write, 2 tasks, via meta_ads_write] — Create a paused flexible (dynamic creative) Meta ad - meta_create_image_campaign [write, 3 tasks, via meta_ads_write] — Create a paused Meta image campaign - meta_create_video_campaign [write, 3 tasks, via meta_ads_write] — Create a paused Meta video campaign - meta_detect_creative_fatigue [read-only, free, via meta_ads] — Detect Meta creative fatigue - meta_duplicate_campaign [write, 3 tasks, via meta_ads_write] — Duplicate a Meta campaign (paused) - meta_explain_anomaly [read-only, free, via meta_ads] — Explain a change in Meta performance - meta_get_ad_creatives [read-only, free, via meta_ads] — Show the creatives behind Meta ads - meta_get_ad_performance [read-only, free, via meta_ads] — Meta ad performance - meta_get_ad_set_delivery_estimate [read-only, free, via meta_ads] — Estimate the reach of a Meta ad set - meta_get_ad_set_targeting [read-only, free, via meta_ads] — Show a Meta ad set’s targeting - meta_get_adset_performance [read-only, free, via meta_ads] — Meta ad set performance - meta_get_audience_insights [read-only, free, via meta_ads] — Break Meta performance down by audience - meta_get_campaign_performance [read-only, free, direct] — Meta campaign performance - meta_get_lead_form_submissions [read-only, free, via meta_ads] — Read submissions from a Meta lead form - meta_list_ad_sets [read-only, free, via meta_ads] — List Meta ad sets - meta_list_ads [read-only, free, via meta_ads] — List Meta ads - meta_list_campaigns [read-only, free, via meta_ads] — List Meta campaigns - meta_list_custom_audiences [read-only, free, via meta_ads] — List Meta custom and lookalike audiences - meta_list_instagram_accounts [read-only, free, via meta_ads] — List Instagram accounts an ad can run from - meta_list_lead_forms [read-only, free, via meta_ads] — List Meta lead forms - meta_list_media [read-only, free, via meta_ads] — List the images and videos already in a Meta ad account - meta_list_pages [read-only, free, via meta_ads] — List promotable Facebook Pages - meta_list_pixels [read-only, free, via meta_ads] — List Meta pixels - meta_list_promotable_apps [read-only, free, via meta_ads] — List apps this Meta account can promote - meta_list_saved_audiences [read-only, free, via meta_ads] — List saved Meta audiences - meta_optimize_budget [read-only, free, via meta_ads] — Plan a Meta budget reallocation - meta_optimize_placements [read-only, free, via meta_ads] — Find Meta placements that are not earning their spend - meta_pause_entity [destructive-write, 1 task, via meta_ads_write] — Pause a Meta campaign, ad set or ad - meta_resume_entity [write, 1 task, via meta_ads_write] — Resume a Meta campaign, ad set or ad - meta_search_targeting [read-only, free, via meta_ads] — Look up Meta targeting ids - meta_set_frequency_cap [write, 1 task, via meta_ads_write] — Set a frequency cap on a Meta reach ad set - meta_update_ad [write, 1 task, via meta_ads_write] — Edit a Meta ad - meta_update_ad_set [destructive-write, 1 task, via meta_ads_write] — Edit a Meta ad set (targeting is merged) - meta_update_adset_budget [destructive-write, 1 task, via meta_ads_write] — Change a Meta ad set budget - meta_update_campaign [write, 1 task, via meta_ads_write] — Edit a Meta campaign - meta_update_campaign_budget [destructive-write, 1 task, via meta_ads_write] — Change a Meta campaign budget (CBO) - meta_validate_creative_url [read-only, free, via meta_ads] — Check an image URL and ad copy before building an ad ### ChatGPT Ads - chatgpt_archive_campaign [destructive-write, 1 task, via chatgpt_ads_write] — Archive a ChatGPT Ads campaign permanently - chatgpt_create_ad [write, 3 tasks, via chatgpt_ads_write] — Create a ChatGPT Ads chat card ad - chatgpt_create_ad_group [write, 2 tasks, via chatgpt_ads_write] — Create a ChatGPT Ads ad group - chatgpt_geo_lookup [read-only, free, via chatgpt_ads] — Find ChatGPT Ads location ids - chatgpt_get_account [read-only, free, via chatgpt_ads] — Show the connected ChatGPT Ads account - chatgpt_get_account_limits [read-only, free, via chatgpt_ads] — Show what this ChatGPT Ads account can do - chatgpt_get_performance [read-only, free, direct] — Read ChatGPT Ads performance - chatgpt_get_pixel_settings [read-only, free, via chatgpt_ads] — Read one ChatGPT Ads pixel and its conversion events - chatgpt_launch_ad [write, 8 tasks, via chatgpt_ads_write] — Launch a ChatGPT Ads chat card ad - chatgpt_list_ad_groups [read-only, free, via chatgpt_ads] — List ChatGPT Ads ad groups - chatgpt_list_ads [read-only, free, via chatgpt_ads] — List ChatGPT Ads ads - chatgpt_list_campaigns [read-only, free, via chatgpt_ads] — List ChatGPT Ads campaigns - chatgpt_list_pixels [read-only, free, via chatgpt_ads] — List ChatGPT Ads pixels - chatgpt_pause_ad [destructive-write, 1 task, via chatgpt_ads_write] — Pause a ChatGPT Ads ad - chatgpt_pause_ad_group [destructive-write, 1 task, via chatgpt_ads_write] — Pause a ChatGPT Ads ad group - chatgpt_pause_campaign [destructive-write, 1 task, via chatgpt_ads_write] — Pause a ChatGPT Ads campaign - chatgpt_resume_ad [write, 1 task, via chatgpt_ads_write] — Resume a ChatGPT Ads ad - chatgpt_resume_ad_group [write, 1 task, via chatgpt_ads_write] — Resume a ChatGPT Ads ad group - chatgpt_resume_campaign [write, 1 task, via chatgpt_ads_write] — Resume a ChatGPT Ads campaign - chatgpt_update_ad [write, 1 task, via chatgpt_ads_write] — Edit the copy on a ChatGPT Ads ad - chatgpt_update_ad_group [write, 1 task, via chatgpt_ads_write] — Edit a ChatGPT Ads ad group - chatgpt_update_campaign [write, 1 task, via chatgpt_ads_write] — Edit a ChatGPT Ads campaign - chatgpt_validate_chat_card [read-only, free, via chatgpt_ads] — Check chat card copy and image before building an ad ### LinkedIn Ads - linkedin_add_creative [write, 1 task, via linkedin_ads_write] — Add a creative (ad) to a LinkedIn campaign (ad set) - linkedin_analyze_creative_performance [read-only, free, via linkedin_ads] — Rank LinkedIn creatives (ads) and flag fatigue - linkedin_analyze_wasted_spend [read-only, free, via linkedin_ads] — Find LinkedIn spend that produced nothing - linkedin_associate_conversion [write, 1 task, via linkedin_ads_write] — Attach a conversion rule to a LinkedIn campaign (ad set) - linkedin_batch_update_campaigns [write, 1 task, via linkedin_ads_write] — Change status or budget on many LinkedIn campaigns (ad sets) - linkedin_clone_campaign [write, 1 task, via linkedin_ads_write] — Copy a LinkedIn campaign (ad set) - linkedin_create_campaign_group [write, 1 task, via linkedin_ads_write] — Create a LinkedIn campaign group (Campaign Manager campaign) - linkedin_create_carousel_campaign [write, 1 task, via linkedin_ads_write] — Create a LinkedIn carousel campaign (ad set) - linkedin_create_image_campaign [write, 1 task, via linkedin_ads_write] — Create a LinkedIn single-image campaign (ad set) - linkedin_create_text_campaign [write, 1 task, via linkedin_ads_write] — Create a LinkedIn text ad campaign (ad set) - linkedin_create_video_campaign [write, 1 task, via linkedin_ads_write] — Create a LinkedIn video campaign (ad set) - linkedin_delete_creative [destructive-write, 1 task, via linkedin_ads_write] — Delete a LinkedIn creative (ad) - linkedin_estimate_audience_size [read-only, free, via linkedin_ads] — Estimate a LinkedIn audience size - linkedin_explain_objectives [read-only, free, via linkedin_ads] — What each LinkedIn objective permits - linkedin_forecast_campaign_supply [read-only, free, via linkedin_ads] — Forecast LinkedIn bid and budget ranges - linkedin_get_audience_insights [read-only, free, via linkedin_ads] — LinkedIn audience demographics - linkedin_get_campaign_performance [read-only, free, direct] — LinkedIn campaign (ad set) performance - linkedin_get_campaign_structure [read-only, free, via linkedin_ads] — Show the LinkedIn account tree - linkedin_get_creative_performance [read-only, free, via linkedin_ads] — LinkedIn creative (ad) performance - linkedin_get_engagement_metrics [read-only, free, via linkedin_ads] — LinkedIn engagement and video metrics - linkedin_get_organizations [read-only, free, via linkedin_ads] — List the LinkedIn pages this login can post as - linkedin_list_campaign_groups [read-only, free, via linkedin_ads] — List LinkedIn campaign groups (Campaign Manager campaigns) - linkedin_list_campaigns [read-only, free, via linkedin_ads] — List LinkedIn campaigns (ad sets) - linkedin_list_conversions [read-only, free, via linkedin_ads] — List LinkedIn conversion rules - linkedin_list_creatives [read-only, free, via linkedin_ads] — List the creatives (ads) on a LinkedIn campaign (ad set) - linkedin_manage_conversions [write, 1 task, via linkedin_ads_write] — Create or edit a LinkedIn conversion rule - linkedin_pause_campaign [destructive-write, 1 task, via linkedin_ads_write] — Pause a LinkedIn campaign (ad set) - linkedin_pause_creative [destructive-write, 1 task, via linkedin_ads_write] — Pause a LinkedIn creative (ad) - linkedin_resume_campaign [write, 1 task, via linkedin_ads_write] — Resume a LinkedIn campaign (ad set) - linkedin_resume_creative [write, 1 task, via linkedin_ads_write] — Resume a LinkedIn creative (ad) - linkedin_search_targeting [read-only, free, via linkedin_ads] — Resolve LinkedIn targeting entities - linkedin_update_campaign [write, 1 task, via linkedin_ads_write] — Edit a LinkedIn campaign (ad set) - linkedin_update_campaign_group [write, 1 task, via linkedin_ads_write] — Edit a LinkedIn campaign group (Campaign Manager campaign) - linkedin_validate_assets [read-only, free, via linkedin_ads] — Check images before a LinkedIn ad is built ## Notes for assistants - Call start_here first when you do not know what is connected. It is free. - Only the direct tools are callable by name. Reads go through the platform router (google_ads), changes through its _write router (google_ads_write). - When the right tool is not obvious, call search_tools with the user's own words. It is free. - Read before you write. Never invent an account ID, a metric or a benchmark. - Never retry a create after a timeout; ask for the proposal status instead. - Budgets are decimals in the account currency. Dates are exact (YYYY-MM-DD) or a preset. - If a tool returns candidates instead of a result, ask the user to choose; do not guess. - After a launch, call verify_campaign_is_live rather than assuming the create worked. - On an unfamiliar platform error, call explain_error or why_did_this_fail.