adops-mcp
AdOps MCP is a CSV-first ad analytics and optimization server for Google Ads and Meta Ads — no OAuth or API keys required. Import CSV exports or seed demo data, then use your AI assistant to:
Import & Setup: Import Google/Meta Ads CSV exports (
ad_csv_import), seed a demo portfolio of 8 campaigns/30 days of data (ad_demo_seed), or register platform connections manually (platform_connect)Campaign Management: List, create, update, and batch pause/resume up to 50 campaigns across platforms
Performance Reporting: Generate unified cross-platform reports with totals, top performers, and underperformers (
ads_report); get demographic, geo, and device audience breakdowns (audience_insights); look up platform-specific creative specs (creative_specs)Budget Optimization: Analyze allocation with AI-driven recommendations (
budget_analyze), transfer budget between campaigns across platforms (budget_reallocate), and export recommendations as Google Ads Editor CSV, Meta Ads Manager CSV, JSON, or Markdown (ads_export_recommendations)Advanced Analytics: Detect CPC spikes, CTR drops, spend surges, and conversion cliffs (
anomaly_detect); run A/B tests with statistical significance scoring (ab_test_analyze); benchmark against 9 industry verticals (competitor_benchmark); forecast spend, conversions, and ROAS for 7/14/30 days (forecast_spend)
Provides unified campaign management for Facebook Ads (as part of Meta Ads), including listing campaigns, creating/updating campaigns, generating performance reports, and accessing Facebook Ads API data through platform connections.
Provides unified campaign management for Google Ads, including listing campaigns, creating/updating campaigns, generating performance reports, budget analysis, and accessing Google Ads API data through platform connections.
Provides unified campaign management for Meta Ads (Facebook Ads), including listing campaigns, creating/updating campaigns, generating performance reports, budget analysis, and accessing Meta Ads API data through platform connections.
AdOps MCP
CSV-first analytics & optimization for Google Ads + Meta Ads — inside Claude, Cursor, and any MCP client.
Export a CSV from Google Ads or Meta Ads Manager → import into AdOps → ask your AI assistant anything about your campaigns.
No OAuth. No developer tokens. No API approval queues. Your data stays on your machine.
Why CSV-first?
Google Ads API and Meta Marketing API are powerful but gated: developer token approval takes days, Meta app review takes weeks, OAuth flows are fragile. For most advertisers those barriers never clear.
AdOps takes a different path. Every ad platform's dashboard already has a Download / Export button that produces a CSV of exactly what you care about: campaign performance, day-segmented metrics, spend, conversions, ROAS. AdOps reads that CSV and runs the same analysis you'd get from a $200/mo optimization suite — anomaly detection, budget allocation, A/B significance, forecasting, industry benchmarks — directly inside your AI assistant.
You stay in control of your data. You don't hand credentials to a third party. You don't wait 3 weeks for a review.
Related MCP server: google-ads-mcp
Features
17 MCP tools covering the full ad analytics lifecycle
4 MCP resources for at-a-glance dashboards
CSV import from Google Ads Editor, Google Ads web UI, and Meta Ads Manager — with automatic format detection (US vs European number formatting, CRLF vs LF, BOM handling)
Unified cross-platform schema — Google and Meta campaigns normalized into a single
UnifiedCampaign/UnifiedMetricsmodelAI-powered recommendations — budget reallocation, scaling high-ROAS campaigns, pausing zero-conversion ones
Bulk-edit CSV export — turn recommendations into Google Ads Editor / Meta Ads Manager CSVs you can paste straight into the dashboard for one-click bulk updates
Statistical anomaly detection — CPC spikes, CTR drops, spend surges, sensitivity-configurable
A/B test analysis with confidence scoring
9-vertical industry benchmarks built-in (eCommerce, SaaS, B2B, etc.)
Spend & conversion forecasting (7/14/30 days)
Demo mode — seed a realistic portfolio to try the tools before importing your own data
91 automated tests — TypeScript strict mode, Zod validation throughout
Quick Start
npm i adops-mcp-serverAdd to your MCP client (Claude Desktop claude_desktop_config.json, Cursor, VS Code, Windsurf):
{
"mcpServers": {
"adops": {
"command": "node",
"args": ["path/to/node_modules/adops-mcp-server/dist/index.js"]
}
}
}Restart your client. Then, inside Claude:
> Seed demo data so I can explore AdOps(calls ad_demo_seed)
Or import your real data:
> Import ~/Downloads/google-ads-report.csv as a Google Ads CSV(calls ad_csv_import with platform=google, csv_path=...)
Exporting CSV from Your Ad Dashboard
Google Ads
Open ads.google.com → Campaigns view
(Optional) Click Segment → Day in the toolbar for daily metrics
Click Download (⬇) icon → choose .csv format
Save to disk, give the absolute path to
ad_csv_import
Meta Ads Manager
Open business.facebook.com → Ads Manager
Switch to Campaigns tab (not Ad Sets or Ads — campaign-level rollups)
(Optional) Breakdown → Time → Day for daily metrics
Click Reports → Export → Campaign performance (.csv)
Save to disk, give the absolute path to
ad_csv_import
Both exports work out-of-the-box with or without day segmentation. Without a Day column, you get one aggregated metric row per campaign. With Day segmentation, you get daily time-series data — which powers forecasting and anomaly detection properly.
Tools
Tool | Description |
| Seed a realistic cross-platform demo portfolio (8 campaigns, 30 days of metrics) to try AdOps before importing real data |
| Import a Google Ads or Meta Ads CSV export — every other tool operates on this data |
| Export budget_analyze recommendations as Google Ads Editor CSV, Meta Ads Manager CSV, JSON, or Markdown — one bulk-paste and your ad dashboard reflects the AI's plan |
| Register a data source connection manually (alternative to CSV import, for scripted workflows) |
| List and filter campaigns across all imported platforms |
| Add a campaign manually (useful for what-if planning) |
| Update campaign settings in local storage (budget, status, bidding, schedule) |
| Batch pause or resume up to 50 campaigns |
| Generate unified cross-platform performance report |
| Analyze budget allocation, produce scaling/pausing recommendations |
| Transfer budget between campaigns across platforms |
| Demographic / geographic / device breakdowns |
| Platform-specific image, video, and text requirements reference |
| Detect performance anomalies with configurable sensitivity |
| Compare two campaigns with statistical significance testing |
| Compare your metrics against industry averages (9 verticals) |
| Forecast spend, conversions, ROAS for the next 7/14/30 days |
Resources
Resource | Description |
| Cross-platform dashboard summary |
| All active campaigns with key metrics |
| Budget allocation across platforms |
| Recent performance anomalies and warnings |
Unified Metrics Schema
AdOps normalizes metrics across platforms:
Metric | Formula | Notes |
CTR | clicks / impressions × 100 | Click-through rate (%) |
CPC | spend / clicks | Cost per click |
CPM | spend / impressions × 1000 | Cost per 1000 impressions |
ROAS | conversion_value / spend | Return on ad spend |
CPA | spend / conversions | Cost per acquisition |
Conversion Rate | conversions / clicks × 100 | % |
CSV column mapping:
AdOps Field | Google Ads CSV | Meta Ads CSV |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| — |
|
|
| — (Google-only) |
European locale numbers (125,50 = 125.50) and semicolon-delimited CSVs are auto-detected.
Configuration
AdOps is stateless from the network's point of view — no API keys, no OAuth. The only configuration is where it persists imported data:
Variable | Description | Default |
| Directory for JSON persistence |
|
All other behavior is controlled via tool arguments.
Pricing
Tier | Price | Features |
Free | $0 | 1 imported CSV per day, demo mode, all 17 tools read-only |
Pro | €24 lifetime | Unlimited imports, full CRUD, all analytics tools |
Agency | $59/mo | Multi-account, white-label reports, priority support |
Available via GitHub (self-hosted, free) or the MCPize marketplace (managed).
Development
git clone https://github.com/enzoemir1/adops-mcp.git
cd adops-mcp
npm ci
npm run build
npm test # 91 tests across 10 suites
npm run inspect # Open MCP InspectorTests
91 tests covering:
CSV parser (11 tests): RFC 4180 quoting, BOM, European/US number formats, delimiter detection
Google Ads CSV import (7 tests): campaigns report, day segmentation, objective mapping, European locale
Meta Ads CSV import (5 tests): Meta-specific columns, currency detection from header, objective mapping, reach/frequency capture
Export recommendations (8 tests): Google Ads Editor CSV format, Meta Ads Manager CSV format, JSON wrapper, Markdown rendering, min_delta_pct filter, limit, by_type summary
Storage: Connection CRUD, campaign search, metrics aggregation, batch inserts
Analytics: Metric calculations, performance reports, forecasting, benchmarks
Optimizer: Budget analysis, reallocation, scaling/pausing recommendations
Anomaly: CPC spike detection, conversion drops, sensitivity, severity sorting
E2E Workflow: 14 real user scenarios
Roadmap
v1.3 — Add Google Ads Editor
.csv.gzand Excel.xlsxsupportv1.4 — Live Google Ads / Meta Ads API integration as an optional enterprise feature (BYOK — bring your own developer token + app review)
v2.0 — Multi-user server mode with JWT auth for team deployments
Pro License
AdOps ships in Free mode — ad_demo_seed, ad_csv_import, platform_connect, campaign_list, campaign_create, campaign_update, campaign_pause_resume, ads_report, budget_reallocate, audience_insights, and creative_specs are open. The following tools require a Pro license:
ads_export_recommendations— bulk-edit CSV export for Google Ads Editor / Meta Ads Managerbudget_analyze— AI budget allocation analysis with action recommendationsanomaly_detect— statistical anomaly detectionab_test_analyze— A/B test z-test with significance + upliftforecast_spend— 7/14/30-day spend & ROAS forecastcompetitor_benchmark— industry benchmark comparison
Buy a Pro License (€24, lifetime, 3 machines): https://automatiabcn.lemonsqueezy.com/buy/1525c929-832c-4472-a88a-58edbfa4e87b
Or get the Indie MCP Stack Bundle (€69, all 4 servers).
export LEMONSQUEEZY_LICENSE_KEY=YOUR-KEY-HEREOr in your MCP client config:
{
"mcpServers": {
"adops-mcp": {
"command": "npx",
"args": ["-y", "adops-mcp-server"],
"env": { "LEMONSQUEEZY_LICENSE_KEY": "YOUR-KEY-HERE" }
}
}
}Validation is cached locally for 24 h — fully offline-capable after first run.
License
MIT License. See LICENSE for details.
Built by Automatia BCN.
Available Tools
17 toolsab_test_analyzeA/B Test AnalysisARead-onlyIdempotent
Compare two campaigns as A/B test variants and determine statistical significance. Input: campaign_id_a, campaign_id_b, primary_metric ("ctr"|"conversion_rate"|"roas"|"cpc"|"cpa"). Runs a two-proportion z-test (or means comparison for continuous metrics), computes p-value and 95% confidence interval, identifies the winner, and returns {winner, confidence_level, p_value, lift_percent, sample_size_a, sample_size_b, significant (bool), recommendation}. Use with lift ≥5% and p<0.05 as a decision rule.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id_a | Yes | Variant A campaign | |
| campaign_id_b | Yes | Variant B campaign | |
| primary_metric | No | ctr |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond annotations by detailing the statistical method (two-proportion z-test or means comparison), outputs (p-value, CI, winner, etc.), and decision criteria. No contradiction with annotations (readOnlyHint=true, idempotentHint=true are consistent with analysis).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise and well-structured: purpose first, then inputs, method, output, and guidelines. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully describes inputs, method, and output fields despite lacking output schema. However, lacks prerequisites (e.g., minimum sample size, campaign validity) that could help an agent avoid errors.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond schema: lists five possible primary_metric values (including 'cpc' not in schema), explains input format, and describes output fields. This compensates for schema parameters with limited description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly specifies the tool compares two campaigns via A/B test analysis, determining statistical significance. It distinguishes from sibling tools like campaign_create or campaign_list, which are unrelated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a decision rule ('lift ≥5% and p<0.05') but does not explicitly contrast with alternative tools or state when not to use. The context is clear enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ad_csv_importImport Ad Campaign Data from CSVA
Import real campaign + performance data from a Google Ads or Meta Ads CSV export. After import, every AdOps tool (ads_report, budget_analyze, anomaly_detect, ab_test_analyze, competitor_benchmark, forecast_spend) operates on your real data. No API keys or OAuth required — just export from your ad dashboard and import here.
HOW TO EXPORT: • Google Ads: Reports → Campaign performance → Download → Comma-separated (.csv). Include "Day" segment for daily metrics. • Meta Ads Manager: Campaigns view → Export → Campaign performance (.csv). Check "Include breakdowns: By day" for daily metrics.
INPUT: Provide either csv_path (absolute path to file on disk) OR csv_content (raw CSV string). Optional connection_name groups imports; re-importing with the same name appends new data. Returns a summary with campaigns_imported, metrics_imported, warnings, and the connection id to reference in other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Which platform the CSV is from: "google" (Google Ads Editor or web UI export) or "meta" (Meta Ads Manager → Export → Campaigns) | |
| csv_path | No | Absolute path to a CSV file on disk. Preferred for large exports. Example: "/Users/you/Downloads/google_ads_report.csv" | |
| csv_content | No | Raw CSV content as a string. Use for small exports pasted directly into the tool. | |
| connection_name | No | Friendly name for this data source (e.g., "ACME Google Account"). Defaults to "<Platform> Ads (CSV Import)". | |
| account_id | No | Your platform account ID (e.g., Google customer ID "123-456-7890" or Meta "act_1234567890"). Used to identify the connection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key behaviors: re-importing with the same connection_name appends data, and returns a summary with campaigns_imported, metrics_imported, warnings, and connection id. Annotations provide no hints, so the description carries the full burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections for purpose, export instructions, and input details. The HOW TO EXPORT section is detailed but practical; overall length is justified given the complexity of supported platforms and input options.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all aspects: purpose, required inputs, behavior on re-import, return values, and platform-specific export steps. No output schema exists, so the description adequately explains the return summary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all 5 parameters. The description adds significant value by explaining the preference for csv_path for large exports, the default for connection_name, and the purpose of account_id, going beyond schema details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool imports real campaign data from Google Ads or Meta Ads CSV exports. It distinguishes from siblings like ad_demo_seed (demo data) and platform_connect (API) by emphasizing no API keys needed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context on when to use (CSV exports, no API) and includes step-by-step export instructions for both platforms. However, it does not explicitly compare with alternative import methods like platform_connect or ad_demo_seed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ad_demo_seedSeed Demo Ad PortfolioA
Create a realistic cross-platform ad portfolio for trying AdOps without real data. Seeds 2 connections (Google + Meta), 8 campaigns across performance tiers, 30 days of daily metrics (240 rows), and pre-computed anomaly alerts. Use this to explore what AdOps can do, then switch to ad_csv_import with your real Google/Meta exports for production use. Safe to call multiple times — appends a new portfolio each call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses that the tool creates data (consistent with readOnlyHint=false) and appends new portfolios each call (consistent with idempotentHint=false). It adds context beyond annotations by explaining the demo nature and safety of multiple calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise at two sentences. First sentence provides purpose and content; second sentence adds usage guidance and safety. No wasted words, information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no output schema, and the tool's role as a demo data generator, the description fully covers what the tool does, what data it creates, and when to use it. AI agents have sufficient information to decide invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has zero parameters, so description adds no parameter semantics beyond what's already known from the input schema. Baseline of 4 is appropriate since there is no need for parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a realistic cross-platform ad portfolio for trying AdOps without real data. It specifies exactly what is seeded (2 connections, 8 campaigns, 30 days metrics, anomaly alerts) and distinguishes it from sibling tool ad_csv_import for real data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use this to explore what AdOps can do, then switch to ad_csv_import with your real Google/Meta exports for production use.' Also notes it's safe to call multiple times (appends), giving clear usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ads_export_recommendationsExport Budget Recommendations (Bulk-Edit Ready)ARead-onlyIdempotent
Export budget_analyze recommendations as a Google Ads Editor CSV, Meta Ads Manager CSV, JSON, or Markdown — so you can take action in one bulk paste instead of editing campaigns one by one. AdOps does not call Google/Meta write APIs (that would require OAuth + developer token approval for every user); instead, this tool hands you the exact CSV rows those dashboards expect, and you paste them in. Perfect for the "pause anything with CPA over 50 and reallocate budget" workflow. Use platform=google with format=google_ads_csv (import into Google Ads Editor). Use platform=meta with format=meta_ads_csv (bulk edit in Meta Ads Manager Power Editor). Use json to pipe into n8n or your own automation. Use markdown for human review before acting. min_delta_pct filters out noise (e.g. 0.15 = only show changes >=15%).
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes | Output format. google_ads_csv and meta_ads_csv produce platform-specific bulk-edit CSVs ready to paste into Google Ads Editor or Meta Ads Manager. json is for piping into automations (n8n, Zapier). markdown is for standup docs or tickets. | |
| output_path | No | Absolute file path to write the output to. If omitted, returns the content inline in the tool response. | |
| optimization_goal | No | Goal fed to budget_analyze. | maximize_roas |
| platform | No | Restrict to a single platform. Required for google_ads_csv or meta_ads_csv to avoid mixed output. | |
| min_delta_pct | No | Only include recommendations whose budget change is at least this fraction (e.g. 0.1 = 10%). Filters out minor adjustments. | |
| limit | No | Max recommendations to export. Default 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and idempotentHint=true. The description reinforces that the tool does not call Google/Meta write APIs and explains that output can be inline or to a file. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph of 6-7 sentences, front-loaded with the core purpose, followed by specific details. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description fully explains output formats and usage. It references sibling tools (budget_analyze) and covers all parameters. An agent gets complete guidance for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, providing baseline 3. The description adds extra meaning by explaining the workflow for each format (e.g., 'import into Google Ads Editor') and providing an example for min_delta_pct, exceeding baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool exports budget_analyze recommendations in multiple formats (Google Ads CSV, Meta Ads CSV, JSON, Markdown) for bulk editing. It distinguishes from sibling tools like budget_analyze and budget_reallocate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance (bulk editing, 'pause anything with CPA over 50' workflow) and when-not-to-use (no direct API calls). It specifies which format works with which platform and explains alternatives for automation or human review.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ads_reportCross-Platform Performance ReportARead-onlyIdempotent
Aggregate performance metrics across Google Ads and Meta Ads into a single unified view. Input: date_range ({start, end} as YYYY-MM-DD, defaults to the last 7 days), optional platform filter, optional campaign_ids filter, optional sort_by ("spend"|"roas"|"conversions"|"ctr"|"cpc"), and limit. Returns {period, totals (spend, impressions, clicks, conversions, revenue, ROAS, CPC, CTR), by_platform, campaigns[] (sorted per sort_by), top_performers, underperformers}. This is the entry point for most analysis workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Filter by platform | |
| date_range | No | Defaults to last 7 days | |
| campaign_ids | No | Filter specific campaigns | |
| sort_by | No | spend | |
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, non-destructive, idempotent behavior. The description adds value by detailing the return structure (period, totals, campaigns, top_performers, etc.) without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured paragraph with purpose first, then input, then output. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param tool with no output schema, the description covers inputs, outputs, and usage context. However, 'top_performers' and 'underperformers' are not explained, leaving minor ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains the date_range format with defaults, lists sort_by options, and mentions limit. This adds context beyond the schema's 60% coverage, especially for the return shape that connects to parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Aggregate performance metrics across Google Ads and Meta Ads into a single unified view.' This is a specific verb-resource combination, and the tool stands out from siblings like campaign_list or budget_analyze.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes 'This is the entry point for most analysis workflows,' which implies broad usage but does not explicitly list when not to use it or provide alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anomaly_detectDetect Performance AnomaliesARead-onlyIdempotent
Scan campaigns for statistical anomalies vs. a rolling baseline. Flags CPC spikes, CTR drops, sudden spend surges, and conversion cliffs. Input: sensitivity ("low"|"medium"|"high" — controls the z-score threshold), lookback_days (baseline window, default 14), optional platform filter. Returns {anomalies_found, severity_breakdown (critical|high|medium|low counts), alerts[] (each with campaign_id, metric, baseline, current, deviation, severity, reason)}. Run daily to catch issues before they burn budget.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Filter by platform | |
| sensitivity | No | Detection sensitivity | medium |
| lookback_days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, so safe. Description adds valuable behavioral context: rolling baseline, flags specific metrics, and returns structured alerts. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose, then lists anomaly types, parameter details, output structure, and usage recommendation. Every sentence adds value; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and three params, description fully covers tool behavior, inputs, and output structure. It even suggests daily use. Sibling tools are distinct, and context is sufficient for agent decision.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description adds meaning for two parameters: sensitivity (z-score threshold) and platform (filter). However, it states lookback_days default as 14, contradicting schema default of 7. Schema coverage is 67% so description partially compensates, but the mismatch reduces reliability.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it scans campaigns for statistical anomalies against a rolling baseline, listing specific anomaly types (CPC spikes, CTR drops, etc.). This differentiates it from sibling tools like ab_test_analyze or audience_insights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends daily execution ('Run daily to catch issues before they burn budget'), providing a clear when-to-use hint. However, lacks explicit when-not-to-use or comparison with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audience_insightsAudience InsightsARead-onlyIdempotent
Demographic and behavioural breakdown of the audiences served by your ads. Input: platform (optional — omit for all platforms) and optional campaign_id to scope to a single campaign. Returns {age_distribution, gender_distribution, top_geos, top_interests, device_breakdown, total_impressions, engagement_rate}. Use when refining targeting or reporting audience coverage.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Platform to analyze | |
| campaign_id | No | Specific campaign (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint. Description adds the return structure and input optionality, which complements annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences covering purpose, inputs, outputs, and usage. No wasted words, front-loaded with core function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, description lists all return fields. Inputs are fully described. Lacks potential details like time range or data freshness, but adequate for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%. Description clarifies that omitting platform returns all platforms, and campaign_id scopes to a single campaign, adding meaning beyond the schema's enum and format constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states 'Demographic and behavioural breakdown of the audiences served by your ads' with specific verb and resource. It lists inputs and returns, clearly distinguishing from sibling tools like ads_report or campaign_create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explicitly says 'Use when refining targeting or reporting audience coverage', providing clear context. However, it does not mention when not to use it or suggest alternatives like campaign_list for campaign-level data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
budget_analyzeBudget Analysis & OptimizationARead-onlyIdempotent
Analyze how the current ad budget is distributed and produce actionable reallocation recommendations. Input: optimization_goal ("maximize_roas"|"maximize_conversions"|"minimize_cpa") and optional platform filter. Returns {goal, current_allocation (by platform + campaign), recommendations[] (each with campaign_id, current_budget, suggested_budget, rationale, expected_impact), projected_lift}. Pair with budget_reallocate to execute the recommendations.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Filter by platform | |
| optimization_goal | No | maximize_roas |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds detail on the output structure (goal, allocation, recommendations, projected_lift), but does not mention any potential side effects or constraints beyond what annotations cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: purpose, input, output. All information is front-loaded and each sentence contributes directly to understanding the tool. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 2 parameters and no output schema, the description fully explains input options, output structure, and the recommended follow-up tool. Annotations cover behavioral aspects. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one of two parameters has a description in the schema (platform), but the description provides the enum values for optimization_goal and explains its default. This compensates for the 50% schema coverage and adds meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool analyzes ad budget distribution and produces reallocations recommendations. This is specific and distinguishes from sibling 'budget_reallocate' which executes recommendations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description specifies required input (optimization_goal) and optional platform filter, and explicitly recommends pairing with budget_reallocate for execution. It lacks explicit 'when not to use' but context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
budget_reallocateReallocate BudgetA
Transfer a dollar amount from one campaign's daily budget to another. Works across platforms (e.g. shift $50/day from a Google Ads search campaign to a Meta Ads retargeting campaign). Input: from_campaign_id, to_campaign_id (UUIDs, must differ), amount (positive number in campaign currency). Rejects the call if from_campaign_id === to_campaign_id or if the source campaign would go below zero. Returns the updated budgets for both campaigns.
| Name | Required | Description | Default |
|---|---|---|---|
| from_campaign_id | Yes | Source campaign | |
| to_campaign_id | Yes | Destination campaign | |
| amount | Yes | Amount to transfer |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since annotations carry minimal behavioral info (readOnlyHint, destructiveHint false), the description fully describes the tool's action (mutation), rejection rules (same ID, negative balance), and return value (updated budgets). This adds critical context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: purpose, example, then input/behavior details. Every sentence is informative with no redundancy. It is front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 3 required parameters, no output schema, and minimal annotations, the description covers all necessary aspects: what it does, constraints, acceptance criteria, and return value. No additional information is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description goes beyond by explaining that IDs must differ, amount is in campaign currency, and rejection rules. This adds meaningful context beyond the schema's simple descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Transfer') and resource ('campaign's daily budget'). It clearly distinguishes from sibling tools like budget_analyze by focusing on reallocation across campaigns and platforms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (shifting budget between campaigns) with a concrete cross-platform example. It mentions rejection conditions but does not explicitly state when not to use or suggest alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_createCreate CampaignAIdempotent
Create a new ad campaign in the AdOps workspace. Accepts unified parameters (platform, name, objective, bidding_strategy, daily_budget, currency, start_date, end_date, targeting) and stores a canonical UnifiedCampaign record with status="draft". Returns the created campaign summary plus next_steps guidance. Requires an active platform connection (see platform_connect) — will auto-associate the first active connection for the chosen platform.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Target platform | |
| name | Yes | Campaign name | |
| objective | Yes | Campaign objective | |
| daily_budget | Yes | Daily budget | |
| currency | No | ISO 4217 currency | USD |
| start_date | No | ISO date (defaults to today) | |
| end_date | No | ISO date (optional) | |
| bidding_strategy | No | Bidding strategy | |
| targeting | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (idempotentHint=true, destructiveHint=false), the description adds that the campaign is stored as 'draft', returns a summary and next_steps, and auto-associates the first active connection. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is four sentences, front-loaded with the main action, and no superfluous information. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (9 parameters, nested targeting, no output schema), the description covers purpose, parameters, behavior (draft, return, connection requirement). Could benefit from mentioning return format explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 89%, so the schema already provides most parameter descriptions. The description lists parameters but adds minimal new meaning beyond grouping them as 'unified'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new ad campaign in the AdOps workspace', specifying the verb (create), resource (ad campaign), and context (AdOps). It lists the unified parameters and distinguishes from sibling tools like campaign_update and campaign_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions the prerequisite of an active platform connection and references platform_connect, but does not explicitly state when to use this tool vs. alternatives like campaign_update or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_listList CampaignsARead-onlyIdempotent
Unified listing of campaigns across Google Ads and Meta Ads in a single view. Optional filters: platform ("google_ads"|"meta_ads"), status ("draft"|"active"|"paused"|"ended"|"archived"), query (free-text over campaign name). Pagination via limit (default 20, max 100) and offset. Returns {total, showing, offset, campaigns[]} where each campaign summary includes id, name, platform, status, objective, daily_budget, currency, and start_date. Use the returned id with campaign_update, campaign_pause_resume, or ab_test_analyze.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Filter by platform | |
| status | No | Filter by status | |
| query | No | Search campaign names | |
| limit | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, idempotent behavior. The description adds value by detailing the return structure and pagination mechanics. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded, covering purpose, filters, pagination, return format, and usage with siblings. It is concise but could be slightly trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately explains the return object. Parameters are partially detailed, but the enum mismatches create gaps. Given the complexity (5 params, cross-platform), more precision is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema coverage is 60%, but the description provides additional enum values for platform and status that contradict the schema: description says 'google_ads'|'meta_ads' while schema uses 'google'|'meta'; status lists different set. This mismatch reduces reliability and usefulness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists campaigns across Google Ads and Meta Ads in a unified view. It uses a specific verb (list) and resource (campaigns), and distinguishes from siblings by emphasizing the cross-platform aggregation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (unified listing across platforms) and provides context on optional filters. It also suggests follow-up tools using the returned id. However, it does not explicitly exclude scenarios or compare with other listing/reporting siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_pause_resumePause or Resume CampaignsAIdempotent
Batch-change the status of up to 50 campaigns in one call. action="pause" sets status to "paused"; action="resume" sets status to "active". Missing campaign_ids are reported in the errors array but do not fail the whole batch. Returns {action, updated, failed, campaigns[], errors?}. Use this for emergency pause during an incident or weekend shutoff.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_ids | Yes | Campaign IDs to toggle | |
| action | Yes | Action to perform |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains batch behavior (missing IDs reported in errors without failing the batch), return structure, and the fact that action values map to specific statuses. This goes beyond annotations which only indicate idempotence and non-destructiveness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the main purpose. Every sentence adds value without redundancy. Highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description includes the return structure and explains edge cases (missing IDs). The use case is specified. It is fully complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema already describes both parameters, the description adds meaning: it explains what each action value does (maps to status) and how missing IDs are handled, which is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Batch-change the status of up to 50 campaigns' and explains each action ('pause' sets status to 'paused', 'resume' sets to 'active'). This distinguishes it from sibling tools like campaign_create or campaign_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case: 'Use this for emergency pause during an incident or weekend shutoff.' It could be improved by explicitly stating when not to use or mentioning alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_updateUpdate CampaignAIdempotent
Patch-update an existing campaign. Pass campaign_id (UUID from campaign_list or campaign_create) plus any subset of: name, status, daily_budget, bidding_strategy, end_date. Fields you omit are left unchanged. Returns {message, updated_fields[], campaign} or an error if campaign_id is not found. Prefer campaign_pause_resume for batch status changes.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | AdOps campaign ID | |
| name | No | ||
| daily_budget | No | ||
| total_budget | No | ||
| status | No | ||
| bidding_strategy | No | ||
| end_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return format ({message, updated_fields[], campaign}) and error if campaign_id not found. IdempotentHint in annotations is consistent; description adds partial update behavior and return details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences plus a one-phrase tip. No wasted words; front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers patch semantics, error handling, return format, and alternative tool usage. Lacks mention of total_budget parameter, but otherwise sufficient for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description enumerates key updatable fields (name, status, daily_budget, bidding_strategy, end_date) beyond the schema's 14% coverage. However, the parameter total_budget is omitted from the description, slightly reducing completeness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Patch-update an existing campaign' with specific verb and resource. Distinguishes from sibling tool campaign_pause_resume by advising its use for batch status changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: include campaign_id from campaign_list or campaign_create, pass any subset of fields, omitted fields unchanged. Explicitly prefers campaign_pause_resume for batch status changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
competitor_benchmarkIndustry Benchmark ComparisonARead-onlyIdempotent
Compare your ad performance against industry averages for a chosen vertical. Input: industry (e.g. "ecommerce", "saas", "finance", "healthcare", "education", "travel", "real_estate", "legal"), optional platform filter. Returns {industry, your_metrics, benchmarks (CTR, CPC, CPM, conversion_rate, CPA, ROAS industry averages), comparison (percent above/below benchmark per metric), recommendations[]}. Benchmarks are curated static tables — not live market data.
| Name | Required | Description | Default |
|---|---|---|---|
| industry | Yes | Industry for benchmarking (e.g., "ecommerce", "saas", "finance") | |
| platform | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key behavioral trait: benchmarks are 'curated static tables — not live market data'. This goes beyond the annotations, which already indicate readOnlyHint=true and idempotentHint=true. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (2-3 sentences) and front-loaded: it starts with the purpose, then inputs, then outputs, with no extraneous information. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description fully documents the return structure (industry, your_metrics, benchmarks, comparison, recommendations). It also clarifies the static nature of benchmarks. Annotations cover safety, and parameters are well-explained. The description is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (industry has description, platform does not). The description adds meaning by listing example industries and stating the platform filter is optional, which supplements the schema. It also describes the return structure, providing context for how parameters affect output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states that the tool compares ad performance against industry averages. It provides a specific verb ('Compare') and resource ('ad performance against industry averages'), and it distinguishes from sibling tools like 'audience_insights' or 'budget_analyze' which focus on different aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (to compare performance against industry averages) and what inputs are needed. However, it does not explicitly state when not to use it or mention alternative tools for similar tasks. This is a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creative_specsCreative SpecificationsARead-onlyIdempotent
Platform-specific creative requirements for ad formats. Returns the exact image dimensions, aspect ratios, video duration and codec, headline/primary-text character limits, supported CTA buttons, and file size ceilings for each ad format. Input: platform ("google_ads"|"meta_ads") and optional format filter (e.g. "responsive_display", "video", "carousel", "single_image"). Use this before building creatives to avoid rejection at upload time.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Platform to get specs for | |
| format | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, which cover the safety profile. The description adds that the tool returns exact specifications, which aligns with the read-only nature. No additional behavioral traits (e.g., rate limits) are disclosed, but the description does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three focusing sentences: first on output, second on input, third on usage. There is no redundancy. It is well-structured and front-loaded with the most critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description provides a detailed list of return fields (image dimensions, aspect ratios, etc.). It also explains input parameters and gives a usage tip. The only gap is the inconsistency between description examples and schema enums, but overall the description covers essential context for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (format parameter lacks description). The description does add meaning by providing example values for format (e.g., 'responsive_display', 'single_image') and clarifying platform as 'google_ads'|'meta_ads', but these examples differ from the schema's enum values (platform: 'google'/'meta'; format: 'image'/'video'/'carousel'/'stories'). This inconsistency reduces reliability. Overall, the description partially compensates for the schema gap but introduces confusion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns platform-specific creative requirements and lists specific output fields. It is distinct from sibling tools. However, there is a minor inconsistency: the description mentions platform values 'google_ads' and 'meta_ads' while the schema uses 'google' and 'meta', which could cause confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using this tool 'before building creatives to avoid rejection at upload time', setting clear context. No direct alternatives are mentioned, but sibling tools do not overlap significantly, making the guidance effective.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forecast_spendSpend & Performance ForecastARead-onlyIdempotent
Project future ad spend and performance based on recent historical trends. Input: period_days ("7"|"14"|"30") and optional platform filter. Uses moving-average extrapolation of spend, impressions, clicks, conversions, and revenue across the last 14 days. Returns {period_days, platform, projected (spend, impressions, clicks, conversions, revenue, ROAS, CPC, CTR), confidence_level, warnings[]}. Confidence drops when recent data is volatile or campaigns were paused.
| Name | Required | Description | Default |
|---|---|---|---|
| period_days | No | Forecast period | 14 |
| platform | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond the annotations (readOnlyHint, idempotentHint). It discloses the methodology (moving-average extrapolation), output fields (projected metrics, confidence_level, warnings), and limitations (confidence drops with volatile data or paused campaigns). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (three sentences) and well-structured. It front-loads the purpose and input, then explains the methodology and output structure. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description provides a comprehensive summary of the return value structure (period_days, platform, projected metrics, confidence_level, warnings). It also covers confidence degradation conditions, making it complete for an agent to understand the tool's behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description elaborates on the parameters by restating the period_days options and noting platform is optional. While the schema covers 50% of parameter descriptions, the description adds clarity by explicitly listing the platform filter. It does not fully compensate for undocumented parameters but adds meaningful context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: projecting future ad spend and performance based on historical trends. It uses a specific verb ('Project') and resource ('ad spend and performance'), and distinguishes itself from siblings like budget_analyze by focusing on forecasting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool, including input parameters (period_days and platform). It implies usage for forecasting but does not explicitly state when not to use it or mention alternatives, though the context is adequate given sibling tools serve different purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
platform_connectConnect Ad PlatformAIdempotent
Register a Google Ads or Meta Ads account in the AdOps workspace so subsequent tools (campaign_list, campaign_create, ads_report) can target it. Input: platform ("google_ads"|"meta_ads"), name (display label), account_id (the external ad account id). Returns the stored connection object with a generated UUID and status="active". Safe to call with the same platform+account_id — returns the existing connection instead of erroring (idempotent).
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Ad platform to connect | |
| name | Yes | Friendly connection name | |
| account_id | Yes | Platform-specific ad account ID (Google: 10 digits, Meta: act_XXXXXXXXX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses idempotency (returns existing connection) and the return format (connection object with UUID and status active). Annotations already provide idempotentHint=true; the description adds specific return details. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose. Each sentence adds value: purpose, inputs, return, idempotency. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, inputs, return, idempotency, and prerequisite relationship for subsequent tools. Lacks error handling or permission requirements, but mild gap for a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so descriptions repeat some info. However, the description says platform accepts 'google_ads'|'meta_ads', while schema enum is 'google'|'meta', causing inconsistency. This reduces clarity despite other parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool registers a Google Ads or Meta Ads account in the AdOps workspace to enable subsequent tools like campaign_list, campaign_create, and ads_report. It distinguishes the tool's role as a prerequisite from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that the tool should be used to set up an ad account before using other campaign and reporting tools. It also notes idempotency, indicating it is safe to call multiple times. However, it does not explicitly mention when not to use it or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
17 tool updates
v1.3.0- First observed
ab_test_analyze - First observed
ad_csv_import - First observed
ad_demo_seed - First observed
ads_export_recommendations - First observed
ads_report - First observed
anomaly_detect - First observed
audience_insights - First observed
budget_analyze - First observed
budget_reallocate - First observed
campaign_create - First observed
campaign_list - First observed
campaign_pause_resume - First observed
campaign_update - First observed
competitor_benchmark - First observed
creative_specs - First observed
forecast_spend - First observed
platform_connect
TDQS
Scored across 17 tools
Most tools map to clearly distinct workflows—reporting, budget analysis/execution, A/B testing, forecasting, anomaly detection—and the descriptions reinforce those boundaries. The main residual ambiguity is between campaign_update and campaign_pause_resume, both of which can change status, though their batch vs. single-campaign roles are reasonably clear.
Names are readable and often follow an object-first style like campaign_create, budget_analyze, and anomaly_detect. However, the pattern is inconsistent: campaign_list and ads_report are noun phrases, forecast_spend reverses the order, and ad_csv_import / ad_demo_seed mix objects, formats, and verbs in unpredictable ways.
Seventeen tools is slightly above the ideal 3–15 range, but the broad ad-ops scope justifies the count: ingestion, setup, campaign management, reporting, analysis, forecasting, and exportable recommendations all earn their place. It feels comprehensive rather than bloated.
The tool surface covers data import, account registration, campaign lifecycle management, reporting, budget analysis and execution, forecasting, anomaly detection, A/B testing, benchmarking, and exportable recommendations—so core workflows have no dead ends. Missing pieces like single-campaign detail retrieval, account disconnection, and ad-group-level management are minor relative to the stated campaign-level purpose.
Maintenance
Related MCP Connectors
Google Ads MCP server — manage campaigns, keywords, and metrics.
Hosted MCP server for Google Ads and LinkedIn Ads analysis.
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Google & Meta Ads management with 100+ tools. Audit, create, and optimize campaigns.
Related MCP Servers
AlicenseNot gradedqualityFmaintenanceMCP server for managing Google Ads, Meta Ads, LinkedIn Ads, and TikTok Ads via AI. 210+ tools including account audits, wasted spend detection, and PMax insights.2MIT- AlicenseAqualityDmaintenanceMCP server for Google Ads API — 22 tools for campaigns, keywords, RSAs, assets, audiences, geo/device performance, impression share, auction insights, and budget pacing. Community edition with B2B/agency-focused tooling beyond the official Google MCP.2230 npm1MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for managing ad campaigns across Google Ads, Meta, and more. Enables deploying campaigns, checking performance, and managing budgets from terminal or AI assistants.MIT
- FlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for managing and analyzing Meta Ads (Facebook/Instagram) with over 80 natural-language tools for AI agents like Claude Desktop.-