Skip to main content
Glama
abdulhadi-98

Social MCP

by abdulhadi-98

Social MCP

Let your AI agent run your ads and read your analytics: Google Ads, Google Analytics 4 and Meta Ads, in one MCP server.

License: MIT Python 3.11+ MCP

Built and maintained by Discret Digital


Social MCP is an open-source Model Context Protocol server. It connects AI assistants and agents to your advertising and analytics accounts. Once connected, you can ask in plain language:

"Which Google Ads campaigns had a CPA above $40 last week? Pause the worst one."

"Compare Meta and Google spend against GA4 conversions by source / medium for the last 30 days."

"Pull the search terms for my brand campaign and add the irrelevant ones as negatives."

"Create a paused Meta sales campaign called 'Black Friday' with a $100/day budget."

It works with any MCP-compatible client: Claude (Desktop, Code and web), Grok through the xAI API, Cursor, the OpenAI Agents SDK, LangChain, n8n and others.

Contents

Related MCP server: Ads MCP

Features

  • Multi-account by default. It works with every Google Ads account (including manager/MCC client accounts), every GA4 property and every Meta ad account your credentials can access.

  • Read and write. Agents can report, analyse and act: pause, enable, change budgets and bids, add negative keywords, create campaigns, and mark GA4 key events.

  • Built-in reporting helpers. You can run any Google Ads Query Language (GAQL) query, or use ready-made campaign performance reports with CPA and ROAS. Meta insights support breakdowns, and GA4 reports support filters, realtime data and metadata lookup.

  • Two transports. stdio for local clients, and Streamable HTTP for remote and web clients.

  • Docker-ready. A single container can be deployed to Cloud Run, Railway, Render, Fly.io or any VPS.

Safety by design

Ad accounts spend real money, so every change goes through several layers of protection:

Guardrail

What it does

Preview → confirm

Every write tool returns a dry-run preview by default (confirm=false). The agent must show you the preview and call again with confirm=true only after you approve.

Read-only by default

All writes are blocked until you set ALLOW_WRITES=true.

Budget cap

MAX_DAILY_BUDGET rejects any daily budget above your limit.

Account allowlists

ALLOWED_GOOGLE_ADS_CUSTOMERS and ALLOWED_META_AD_ACCOUNTS restrict which accounts can be touched.

Paused creation

New Meta campaigns are always created PAUSED.

Field allowlist

Generic Meta updates are limited to a fixed set of safe fields.

Audit log

Every executed write is appended to audit_log.jsonl, with a timestamp and the result.

Authenticated HTTP

The remote server refuses to start without MCP_API_KEY and compares keys in constant time.

Quick start

git clone https://github.com/abdulhadi-98/Social-Mcp.git
cd Social-Mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
cp .env.example .env        # fill in your credentials (see below)
social-mcp                  # runs over stdio

Getting credentials

Google Ads and GA4 (one login covers both)

  1. Create a Google Cloud project in the Cloud Console. Then enable:

    • Google Ads API

    • Google Analytics Data API

    • Google Analytics Admin API

  2. Configure the OAuth consent screen under APIs & Services → OAuth consent screen, and add yourself as a test user.

  3. Create an OAuth client ID of type Desktop app under APIs & Services → Credentials, and download the JSON file.

  4. Generate a refresh token. A browser window opens; sign in with the Google account that can access your Ads and GA4 accounts.

    python scripts/get_google_refresh_token.py path/to/client_secret.json

    While the consent screen is in Testing mode, refresh tokens expire after 7 days. Publish the app to get a long-lived token. It can stay unverified for personal or internal use.

  5. Get a Google Ads developer token from a manager (MCC) account under Tools → API Center. New tokens have Test access, which only works with test accounts. Apply for Basic access to manage live accounts.

  6. If you access your accounts through an MCC, set GOOGLE_ADS_LOGIN_CUSTOMER_ID to its ID.

Meta (Facebook and Instagram) Ads

  1. Create an app at developers.facebook.com (type Business) and add the Marketing API product.

  2. In Business Settings → Users → System users, create an Admin system user. Assign it your ad accounts, plus your Pages if it will create ads.

  3. Click Generate token, select your app, and grant ads_management, ads_read and business_management. System user tokens do not expire.

Configuration

All settings come from environment variables or a .env file in the project root. See .env.example.

Variable

Required

Description

GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET

Google

The OAuth client from the steps above

GOOGLE_REFRESH_TOKEN

Google

Output of get_google_refresh_token.py

GOOGLE_ADS_DEVELOPER_TOKEN

Google Ads

Developer token from the API Center

GOOGLE_ADS_LOGIN_CUSTOMER_ID

Optional

MCC ID (digits only) when you access accounts through a manager

META_ACCESS_TOKEN

Meta

System user access token

META_API_VERSION

Optional

Graph API version (default v24.0)

ALLOW_WRITES

Optional

true to allow confirmed changes (default false)

MAX_DAILY_BUDGET

Optional

Maximum daily budget an agent can set (default 500)

ALLOWED_GOOGLE_ADS_CUSTOMERS

Optional

Comma-separated customer IDs the server may touch

ALLOWED_META_AD_ACCOUNTS

Optional

Comma-separated ad account IDs, e.g. act_123,act_456

AUDIT_LOG_PATH

Optional

Where write actions are logged (default audit_log.jsonl)

MCP_API_KEY

HTTP mode

Secret that clients must send to the remote server

HOST / PORT

Optional

HTTP bind address (default 0.0.0.0:8000)

You only need credentials for the platforms you use. Tools for an unconfigured platform return a clear error.

Connecting your AI client

Local clients (stdio)

Claude Desktop: add this to claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "social-mcp": { "command": "/absolute/path/to/Social-Mcp/.venv/bin/social-mcp" }
  }
}

Claude Code:

claude mcp add social-mcp -- /absolute/path/to/Social-Mcp/.venv/bin/social-mcp

Cursor and other stdio clients: use the same command, /absolute/path/to/Social-Mcp/.venv/bin/social-mcp.

Remote clients (HTTP)

First deploy the server (see Deploying as a remote server). Your endpoint is https://YOUR-HOST/mcp.

Claude web and mobile: go to Settings → Connectors → Add custom connector and enter:

https://YOUR-HOST/mcp?key=YOUR_MCP_API_KEY

The key is passed in the URL because that form only accepts a URL. Treat the full URL like a password.

Grok (xAI API): pass the server as a remote MCP tool. See scripts/grok_example.py for a full example:

tools=[{
    "type": "mcp",
    "server_label": "social-mcp",
    "server_url": "https://YOUR-HOST/mcp",
    "authorization": "YOUR_MCP_API_KEY",
}]

Check the xAI docs for the current remote-MCP field names.

Claude Code (remote), the OpenAI Agents SDK, LangChain, n8n and others: connect to https://YOUR-HOST/mcp with this header:

Authorization: Bearer YOUR_MCP_API_KEY

Deploying as a remote server

# Generate an API key
python -c "import secrets; print(secrets.token_urlsafe(32))"

# Build and run
docker build -t social-mcp .
docker run -p 8000:8000 --env-file .env social-mcp

To check that it's running, open GET /health. It returns {"ok": true, "writes_enabled": false}.

On a managed platform (Cloud Run, Railway, Render, Fly.io), set your variables as the platform's secrets rather than baking .env into the image. Always serve the server over HTTPS.

To run it without Docker:

social-mcp --transport http

Tool reference

Google Ads

Tool

Type

Description

google_ads_list_accounts

Read

All accessible accounts, with name, currency and manager flag

google_ads_list_client_accounts

Read

Client accounts under an MCC

google_ads_query

Read

Run any GAQL query

google_ads_campaign_performance

Read

Spend, clicks, conversions, CPA and ROAS per campaign

google_ads_set_status

Write

Pause or enable a campaign, ad group, ad or keyword

google_ads_set_campaign_budget

Write

Change a campaign's daily budget (warns about shared budgets)

google_ads_set_ad_group_cpc_bid

Write

Set an ad group's max CPC

google_ads_add_negative_keywords

Write

Add campaign-level negative keywords

Google Analytics 4

Tool

Type

Description

ga4_list_properties

Read

All accounts and properties

ga4_run_report

Read

Metrics and dimensions with date ranges, filters and sorting

ga4_realtime_report

Read

Users active in the last 30 minutes

ga4_get_metadata

Read

Search the available dimensions and metrics

ga4_create_key_event

Write

Mark an event as a key event (conversion)

ga4_create_custom_dimension

Write

Register an event or user parameter as a custom dimension

Meta Ads

Tool

Type

Description

meta_list_ad_accounts

Read

All accessible ad accounts

meta_list_entities

Read

Campaigns, ad sets or ads, with status and budgets

meta_get_insights

Read

Performance with breakdowns and daily rows

meta_set_status

Write

Pause or activate a campaign, ad set or ad

meta_set_budget

Write

Change a daily or lifetime budget (handles currency units)

meta_update_entity

Write

Update safe fields (name, bid, schedule, spend cap)

meta_create_campaign

Write

Create a campaign, always paused

Project structure

Social-Mcp/
├── ads_mcp/
│   ├── server.py        # MCP server, tool registry, HTTP auth
│   ├── google_ads.py    # Google Ads tools
│   ├── ga4.py           # Google Analytics 4 tools
│   ├── meta_ads.py      # Meta Marketing API tools
│   ├── safety.py        # Preview/confirm, limits, allowlists, audit log
│   └── config.py        # Environment settings
├── scripts/
│   ├── get_google_refresh_token.py
│   └── grok_example.py
├── Dockerfile
├── pyproject.toml
└── .env.example

Adding a tool

  1. Write a typed function with a clear docstring in the relevant platform module. The docstring becomes the tool description the AI sees.

  2. Wrap any account change in guarded_write(...) so it gets the preview, confirmation and audit behavior.

  3. Register the function in TOOLS in ads_mcp/server.py with the READ or WRITE annotation.

Roadmap

  • Google Ads campaign, ad group and responsive search ad creation

  • Meta ad set and ad creation, plus creative upload

  • TikTok Ads and LinkedIn Ads

  • OAuth 2.1 sign-in for the remote server

  • Search Console and Merchant Center

Contributing

Contributions are welcome. Open an issue to discuss larger changes, or send a pull request for fixes and new tools. Please keep new write tools behind guarded_write.

Security

Never commit .env, OAuth client files or access tokens; they are already in .gitignore. If you find a security issue, please report it privately through discretdigital.com instead of opening a public issue.

Disclaimer

Social MCP is not affiliated with, endorsed by or sponsored by Google or Meta. "Google Ads" and "Google Analytics" are trademarks of Google LLC. "Meta", "Facebook" and "Instagram" are trademarks of Meta Platforms, Inc. You are responsible for every change made to your ad accounts, so review the previews before you approve them.

License

MIT © Discret Digital

Available Tools

21 tools
ga4_create_custom_dimensionB
Destructive

Register an event or user parameter as a custom dimension so it can be used in reports.

NameRequiredDescriptionDefault
scopeNoEVENT
confirmNo
descriptionNo
property_idYes
display_nameYes
parameter_nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the bar is lower, yet the description adds nothing about the notable behaviors: the `confirm` flag (default false) that almost certainly gates the actual write, GA4's per-property custom-dimension cardinality limits, and the auth/PHP scope needed. None of these are disclosed, leaving the agent to discover the confirmation flow only from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with zero filler; the purpose and its payoff are packed into a single clause. Nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, open-world mutation with six undocumented parameters and a confirmation gate, one sentence is not sufficient. An output schema exists so return values needn't be covered, but the write semantics, confirmation requirement, and quota implications are all missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% with six parameters, so the description carries the full burden and delivers almost nothing. "event or user parameter" loosely gestures at `scope`/`parameter_name`, but `confirm`, `description`, and `property_id` — including how the required property ID is obtained — are completely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Register ... as a custom dimension") and the downstream effect ("used in reports"), which is far clearer than the name alone. It does not explicitly contrast with the nearest sibling, ga4_create_key_event, but the resource noun is distinctive enough that an agent can separate them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase "so it can be used in reports" implies why an agent would call it, but there is no explicit when/when-not guidance, no stated prerequisite (the parameter must already be collected in the property), and no reference to alternatives. Usage must be inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga4_create_key_eventC
Destructive

Mark an event (e.g. "generate_lead", "purchase") as a key event (conversion) in GA4.

NameRequiredDescriptionDefault
confirmNo
event_nameYes
property_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the description carries a lighter burden, yet it adds nothing beyond them: no mention of reversibility, idempotency, or what the 'confirm' flag actually gates. Nothing in the text contradicts the annotations, but a mutation tool with a destructive hint and an unexplained confirm gate deserves more behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler and no repetition of the tool name. It is efficient; the shortfall is missing content rather than wasted content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, but for a destructive write with three undocumented parameters and a non-trivial 'confirm' flag, the description omits what an agent needs to invoke it safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters, so the description must compensate. It gives useful example event names ('generate_lead', 'purchase'), but never explains property_id format or, more critically, what the boolean 'confirm' parameter does, even though it defaults to false and likely gates the mutation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Mark ... as a key event') and resource, and immediately clarifies the domain concept with '(conversion) in GA4'. No sibling tool in the list operates on key events, so an agent can route to it unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use, when-not-to-use, or prerequisite context (e.g. required permissions, whether the event must already exist). Usage is only implied by the one-line purpose statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga4_get_metadataA
Read-only

List the dimension and metric API names available for a property (optionally filtered by a search term).

NameRequiredDescriptionDefault
searchNo
property_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a read-only, non-destructive, open-world operation, so the safety profile is covered. The description adds the useful scope that only dimension and metric API names are returned, but it does not disclose pagination behavior, result volume, or whether search matches API names versus display names. With annotations carrying safety, the added behavioral context is modest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the operation, resource, and optional filter. There is no redundant or boilerplate text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need not be explained. For a simple two-parameter read-only metadata tool, the description covers the core purpose but omits parameter format details and search semantics, which matter because schema coverage is zero. It is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must supply parameter meaning. It does identify both parameters indirectly: a property and an optional search term. However, it does not explain the expected property_id format or what fields the search term matches against, leaving meaningful gaps for an agent relying solely on this text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'List the dimension and metric API names available for a property.' This clearly distinguishes metadata discovery from sibling tools like ga4_run_report or ga4_realtime_report, which retrieve data rather than schema metadata. It stops short of explicitly naming those siblings, so a 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The mention of an optional search filter implies how to narrow results, and the word 'metadata' implies pre-report discovery, but the description never states when to use this tool versus ga4_run_report or why an agent would need API names. No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga4_list_propertiesA
Read-only

List every GA4 account and property the authenticated user can access.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the meaningful detail that results are scoped to the authenticated user's permissions, but says nothing about result size, pagination, or latency for what may be a large enumeration.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with no filler, and the resource and scope are front-loaded. Nothing is redundant with the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, full annotation coverage, and an output schema documenting the return shape, the description is essentially sufficient. The only residual gap is that it does not hint at the account-to-property hierarchy an agent will encounter in the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly implies no filtering options exist, consistent with the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('every GA4 account and property'), with the scope qualifier 'the authenticated user can access'. The GA4 prefix in the name already distinguishes it from google_ads_list_accounts and meta_list_ad_accounts, but the description itself never acknowledges those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: it is a discovery/enumeration call, so an agent can infer it should be called before report or configuration tools. There is no explicit statement of when to prefer it over the platform-specific list siblings, nor any prerequisite or ordering guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga4_realtime_reportB
Read-only

Users active in the last 30 minutes. Defaults to activeUsers by country.

NameRequiredDescriptionDefault
metricsNo
dimensionsNo
property_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior context — the 30-minute realtime window and that results default to activeUsers by country — but says nothing about rate limits, property permissions, or how defaults are overridden. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the scope front-loaded and no filler; nothing is wasted. The terseness is efficient, though it leaves the definition thin rather than tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover safety. What is missing for a 3-parameter analytics query tool is guidance on valid metric/dimension values, the meaning of property_id, and how this differs from ga4_run_report.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for all three parameters, so the description must carry the meaning and largely does not. It partially documents the defaults for metrics and dimensions ('activeUsers by country') but never explains property_id, nor what metric/dimension names are valid GA4 values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and scope ('Users active in the last 30 minutes'), which is clearly a GA4 realtime report and implicitly distinguishes it from the historical ga4_run_report sibling. It never uses a verb like 'report'/'query' and never names the sibling it differs from, so differentiation relies on inference from the 30-minute window.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance and no mention of the obvious alternative, ga4_run_report, which is the main routing decision an agent faces here. The realtime scope only weakly implies the use case; nothing states when NOT to use it or what prerequisites (e.g. property access) apply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga4_run_reportB
Read-only

Run a GA4 report.

metrics e.g. ["sessions", "totalUsers", "conversions", "purchaseRevenue"]; dimensions e.g. ["date", "sessionSourceMedium", "sessionCampaignName", "landingPage"]. Dates: YYYY-MM-DD, "today", "yesterday" or "NdaysAgo". dimension_filters: [{"field": "sessionSourceMedium", "value": "google / cpc", "match": "EXACT|CONTAINS|BEGINS_WITH"}] (ANDed). order_by_metric: sort descending by this metric.

NameRequiredDescriptionDefault
limitNo
metricsYes
end_dateNotoday
dimensionsNo
start_dateNo28daysAgo
property_idYes
order_by_metricNo
dimension_filtersNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. Beyond that the description adds nothing behavioral: no mention of GA4 Data API quota/rate limits, sampling, row-limit semantics, or the fact that property_id must be a valid GA4 property. For an open-world external API call, that is a meaningful gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose followed by dense, example-driven bullets with zero filler. The only weak spot is the bare opening sentence, which is near-tautological and could have carried the sibling differentiation instead.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be described, and the query-shaping parameters are well covered. However, for an 8-parameter external-API tool with no schema descriptions, the missing property_id sourcing, limit behavior, and absence of any routing guidance leave it only adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden and mostly does: it gives date literal formats (YYYY-MM-DD, today, yesterday, NdaysAgo), the filter object shape with match operators, AND semantics for multiple filters, and sort direction for order_by_metric. property_id and limit remain unexplained, which keeps it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Run a GA4 report") and immediately grounds it with example metrics and dimensions, so an agent knows this is the general analytics query tool. It does not explicitly distinguish itself from siblings like ga4_realtime_report, but the standard-report framing is clear enough to infer the split.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description shows how to shape arguments but never says when to use this versus ga4_realtime_report, ga4_get_metadata, or google_ads_query. There are no prerequisites, no exclusions, and no note about property_id being required (e.g., obtained from ga4_list_properties).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meta_create_campaignA
Destructive

Create a new campaign. It is always created PAUSED so nothing spends until you activate it.

daily_budget (major units) enables campaign budget optimization; omit it to set budgets on ad sets instead. special_ad_categories: [] or e.g. ["HOUSING"], ["EMPLOYMENT"], ["FINANCIAL_PRODUCTS_SERVICES"].

NameRequiredDescriptionDefault
nameYes
confirmNo
objectiveYes
daily_budgetNo
ad_account_idYes
special_ad_categoriesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the campaign is always created PAUSED so no spend occurs until activation. It does not explain the `confirm` gate despite this being a flagged mutation, which is the main remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action and the safety-relevant paused default. No filler. Formatting is slightly scattered (parameter notes appear as loose lines), but every sentence carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. The description covers creation semantics, the paused default, and two parameters — adequate for a six-parameter create. But for a tool flagged destructive, the unexplained `confirm` boolean and missing required-parameter notes leave the agent under-informed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden. It clarifies two of six well — daily_budget is in major units and toggles campaign budget optimization, and special_ad_categories accepts [] or values like HOUSING/EMPLOYMENT/FINANCIAL_PRODUCTS_SERVICES. It says nothing about `confirm`, `ad_account_id`, or `name`, leaving a meaningful hole for a destructive operation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: "Create a new campaign." Clear enough that an agent knows exactly what it produces. However, it does not distinguish itself from adjacent siblings such as meta_update_entity or meta_set_status, which an agent could plausibly confuse with campaign creation/configuration.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete decision guidance for the budget parameters: set daily_budget for campaign budget optimization, or omit it to budget at the ad set level. It also implies the follow-up workflow (activate later) by noting the campaign starts PAUSED. No explicit when-not to use or named alternative tools, which keeps it below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meta_get_insightsB
Read-only

Performance insights for an ad account (act_...), campaign, ad set or ad.

date_preset: today, yesterday, last_7d, last_14d, last_30d, this_month, last_month, maximum (ignored if since/until given). breakdowns e.g. ["age","gender"], ["publisher_platform"], ["country"]. time_increment "1" for daily rows.

NameRequiredDescriptionDefault
levelNocampaign
limitNo
sinceNo
untilNo
fieldsNo
object_idYes
breakdownsNo
date_presetNolast_30d
time_incrementNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a non-destructive read operation, so the description's main added value is the interaction note that date_preset is ignored when since/until are supplied. It does not mention pagination behavior, limit semantics, or what the output contains beyond the existence of an output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and then compact parameter hints; no filler sentences. It is appropriately brief for a tool definition, though the terse parameter lines could be slightly more structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a 9-parameter read tool with zero schema descriptions, and the description only explains a subset of parameters. An agent can infer some usage from examples, but key parameters such as level, limit, and fields remain undocumented anywhere in the definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning. It partially documents date_preset values, breakdown examples, and time_increment, but leaves level's enum meaning, limit, fields, since/until formats, and object_id format largely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Performance insights' for an ad account/campaign/ad set/ad. An agent can tell this is Meta insights rather than a listing or mutation tool, though no sibling is explicitly named or contrasted.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through parameter guidance (date_preset values, breakdown examples, time_increment for daily rows), but there is no explicit when-to-use vs alternatives such as meta_list_entities or google_ads_campaign_performance, and no stated exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meta_list_ad_accountsB
Read-only

List every Meta ad account the token can access (including via Business Managers).

NameRequiredDescriptionDefault
limitNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds one genuinely useful behavioral fact — results include Business Manager-owned accounts, not just directly owned ones — but says nothing about pagination, truncation at the default limit of 200, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, with the scope qualifier in parentheses. Nothing is wasted and nothing is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value shape need not be described, and with a single optional parameter the tool is simple. Still, for a paginated, permission-dependent listing tool the description omits result-cap behavior and any routing to sibling listing tools, leaving real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'limit' has 0% schema description coverage, so the description is the only place it could be explained — and it is not. Worse, 'List every Meta ad account' implies a complete enumeration while the default limit of 200 silently caps results, so the description actively creates a misleading expectation about result completeness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource (list Meta ad accounts) and adds scope that matters: 'every ... the token can access (including via Business Managers)'. This distinguishes it in substance from meta_list_entities and google_ads_list_accounts, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied — an agent can infer this is a discovery/enumeration step, but the description gives no explicit when-to-use, when-not, or pointer to meta_list_entities for other object types. No prerequisites (token scope, Business Manager permissions) are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meta_list_entitiesA
Read-only

List campaigns, ad sets or ads in an ad account with their status and budgets.

effective_status filter e.g. ["ACTIVE"] or ["ACTIVE","PAUSED"]. Budgets are returned in minor units (cents).

NameRequiredDescriptionDefault
limitNo
entity_typeNocampaigns
ad_account_idYes
effective_statusNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already state readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description usefully adds that budgets are returned in minor units and shows the effective_status array format, but it does not mention pagination, ordering, permissions, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads the core operation, then adds filter syntax and budget units. There is no filler, though the separate filter sentence is slightly less integrated than it could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the annotations, input schema, and output schema, the description provides enough context for a read-only listing call: what entities are listed, what status and budget data are returned, and how to filter status. It is not fully complete on pagination or limit behavior, but the remaining gaps are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains the entity_type values through 'campaigns, ad sets or ads' and gives effective_status examples, but leaves ad_account_id and limit undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: list campaigns, ad sets, or ads in an ad account, including status and budgets. It is clear enough to distinguish this from a generic account listing, though it does not explicitly name sibling tools such as meta_get_insights or meta_list_ad_accounts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the listing language and the effective_status filter example, but the description gives no explicit when-to-use or when-not-to-use guidance versus alternatives like meta_get_insights or meta_list_ad_accounts. There are no exclusions or prerequisite notes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meta_set_budgetC
Destructive

Change the budget of a campaign (CBO) or ad set, in the account currency's major units (e.g. 50 = $50).

NameRequiredDescriptionDefault
amountYes
confirmNo
object_idYes
budget_typeNodaily_budget

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and openWorldHint=true, so the safety bar is partly met, but the description says nothing about irreversibility, the meaning of the `confirm` flag, or what happens if confirm is false. The only added context is the currency-units convention (50 = $50), which is useful but leaves the destructive-confirmation flow undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, and the unit convention is stated inline where it is most needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need not be described, but for a destructive mutation with an explicit `confirm` gate and zero schema coverage, the definition is too thin to call safely. It should explain the confirm requirement and what object_id accepts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 4 parameters, so the description must carry the burden. It only clarifies `amount` units; `object_id`, `confirm`, and `budget_type` (despite having an enum) are entirely undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Change the budget of a campaign (CBO) or ad set', and clarifies the CBO scope. It does not distinguish itself from the sibling google_ads_set_campaign_budget, but the Meta-vs-Google context makes the target surface reasonably inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus meta_update_entity or the Google Ads budget siblings, and no mention of prerequisites or the conditions under which a budget can be changed. The agent must infer everything about selection and preconditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meta_set_statusC
Destructive

Pause or activate a Meta campaign, ad set or ad by id.

NameRequiredDescriptionDefault
statusYes
confirmNo
object_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds nothing beyond them: it doesn't explain that pausing halts delivery/spend, whether the change is reversible, or what the undocumented 'confirm' flag does — a critical omission for a destructive mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with the action and resource front-loaded and no wasted words. Its brevity is efficient rather than padded, though it comes at the cost of missing details rather than being over-long.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be described. However, for a destructive, open-world mutation tool with an unexplained 'confirm' parameter and 0% schema coverage, the description omits the confirmation semantics, reversibility, and permission requirements an agent needs before invoking it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden, but it only implicitly maps object_id ('by id') and status. The 'confirm' boolean — which likely gates execution — is never mentioned, leaving a required safety parameter fully opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb pair (pause/activate) and a concrete resource (Meta campaign, ad set, or ad) addressed by id. It is distinguishable from siblings such as google_ads_set_status by platform and by resource scope, though it doesn't clarify how it relates to the more general meta_update_entity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus meta_update_entity or meta_set_budget, and no prerequisites or exclusions are stated. The agent must infer the usage context entirely from the tool name and the single sentence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meta_update_entityB
Destructive

Update allowed fields (name, status, bid_amount, start_time, end_time, spend_cap, budgets) on a campaign, ad set or ad.

Budget, bid and spend_cap values must be in minor units (cents), as the Marketing API expects. Prefer meta_set_budget for budgets.

NameRequiredDescriptionDefault
fieldsYes
confirmNo
object_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is covered. The description usefully adds that budget/bid/spend_cap must be in minor units — non-obvious context not in any annotation. However, it never explains the `confirm` gate, the mutability of budgets, or that unspecified fields are left untouched, which is a real gap for a flagged-destructive write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the operation and field list, followed by the format constraint and the sibling pointer. No filler; the only waste is that the minor-units caveat could be folded into the field enumeration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need no explanation, and the annotations cover the risk profile. Still, a destructive write with a required `object_id`, a free-form `fields` bag, and an unexplained `confirm` flag needs more than three sentences before an agent can invoke it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the load, and it does document the allowed keys of `fields` plus the minor-units convention for the numeric ones — meaningful compensation. But `object_id` and especially `confirm` (a boolean gating a destructive write) get no explanation at all, leaving a third of the parameters opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (update allowed fields on a campaign, ad set or ad) and even enumerates the mutable fields, so the agent knows exactly what class of operation this is. The enum-of-fields is loose because the actual `fields` parameter is a free-form object, but the intent is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Prefer meta_set_budget for budgets" is a genuine routing hint with an explicit alternative, which is more than most. But `status` is one of the listed allowed fields and the sibling `meta_set_status` exists — the description gives no guidance on which one to use, and it never says when this tool should not be used.

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.

  1. 21 tool updatesv0.1.0
    • First observedga4_create_custom_dimension
    • First observedga4_create_key_event
    • First observedga4_get_metadata
    • First observedga4_list_properties
    • First observedga4_realtime_report
    • First observedga4_run_report
    • First observedgoogle_ads_add_negative_keywords
    • First observedgoogle_ads_campaign_performance
    • First observedgoogle_ads_list_accounts
    • First observedgoogle_ads_list_client_accounts
    • First observedgoogle_ads_query
    • First observedgoogle_ads_set_ad_group_cpc_bid
    • First observedgoogle_ads_set_campaign_budget
    • First observedgoogle_ads_set_status
    • First observedmeta_create_campaign
    • First observedmeta_get_insights
    • First observedmeta_list_ad_accounts
    • First observedmeta_list_entities
    • First observedmeta_set_budget
    • First observedmeta_set_status
    • First observedmeta_update_entity

TDQS

B3.2/5.0

Scored across 21 tools

Disambiguation4/5

Most tools are clearly separated by platform and resource/action, with distinct prefixes like ga4_, google_ads_, and meta_. Some boundaries blur between generic and specialized tools, especially google_ads_query vs google_ads_campaign_performance, and meta_update_entity vs meta_set_status/meta_set_budget.

Naming Consistency4/5

Names consistently use snake_case with platform prefixes (ga4_, google_ads_, meta_), making the set easy to scan. Minor deviations exist, such as google_ads_campaign_performance being noun-phrase rather than verb_noun, and meta_list_entities being somewhat generic.

Tool Count4/5

21 tools is slightly high in isolation, but reasonable for a server spanning three platforms: GA4, Google Ads, and Meta Ads. Each platform has a focused subset, though the set is near the upper end of what an agent can comfortably navigate.

Completeness3/5

The surface covers reporting, status changes, budgets, and some creation operations, but lifecycle coverage is uneven. Google Ads lacks creation tools for campaigns/ad groups/ads/keywords, and Meta only supports creating campaigns rather than ad sets or ads, creating notable gaps for full ad management.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to manage, report, and analyze Google Ads campaigns securely with encrypted multi-client support, real-time API integrations, and audit trail logging.
    54 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to create, analyze, and optimize ad campaigns across Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Amazon Ads, and ChatGPT Ads through natural language using 400+ tools.
    105
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Connects Google Ads, Meta Ads, and LinkedIn Ads to AI assistants, enabling natural language ad campaign management, reporting, and optimization across platforms.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Connects AI assistants to Google Ads, Meta Ads, ChatGPT Ads, TikTok Ads and LinkedIn Ads so users can query live campaign performance, budgets and audiences in the account's own currency and prepare changes as proposals that only take effect after explicit approval. Reads run immediately, while every write is staged as an approvable proposal with before/after values, and newly created campaigns, ad sets and ads start paused.
    1
    -