Skip to content

MCP server

mureo exposes 185 tools via the Model Context Protocol (MCP): 170 advertising and SEO operation tools across Google Ads, Meta Ads, and Search Console, 2 rollback tools, 1 cross-platform anomaly-detection tool, 5 mureo-context tools (strategy / state), 1 analytics-registry tool, 2 learning tools (mureo_learning_insights_get for the operator’s local /learn history and mureo_consult_advisor for federated retrieval against external advisor MCP servers — see docs/insight-federation.md), 4 other tools across the surface, and 1 reserved for plugin shadowing. Any MCP-compatible client can connect and call these tools over stdio. Re-check this count when MCP tools are added or removed (test_list_tools_returns_all_tools pins the exact number).

Terminal window
pip install mureo
# Start the MCP server
python -m mureo.mcp

The server communicates over stdin/stdout using the MCP JSON-RPC protocol. It is not meant to be run interactively — it should be launched by an MCP client.

Add to your MCP configuration (~/.config/claude/mcp.json or the app’s settings):

{
"mcpServers": {
"mureo": {
"command": "python",
"args": ["-m", "mureo.mcp"]
}
}
}

Add to .cursor/mcp.json in your project root:

{
"mcpServers": {
"mureo": {
"command": "python",
"args": ["-m", "mureo.mcp"]
}
}
}

If mureo is installed in a virtual environment, use the full path to the Python interpreter:

{
"mcpServers": {
"mureo": {
"command": "/path/to/venv/bin/python",
"args": ["-m", "mureo.mcp"]
}
}
}

Or use uv to run it:

{
"mcpServers": {
"mureo": {
"command": "uv",
"args": ["run", "python", "-m", "mureo.mcp"]
}
}
}
ToolDescriptionRequired Parameters
google_ads_campaigns_listList campaignscustomer_id
google_ads_campaigns_getGet campaign detailscustomer_id, campaign_id
google_ads_campaigns_createCreate a campaign (search or display, via channel_type)customer_id, name
google_ads_campaigns_updateUpdate campaign settingscustomer_id, campaign_id
google_ads_campaigns_update_statusChange status (ENABLED/PAUSED/REMOVED)customer_id, campaign_id, status
google_ads_campaigns_diagnoseDiagnose campaign deliverycustomer_id, campaign_id
ToolDescriptionRequired Parameters
google_ads_ad_groups_listList ad groupscustomer_id
google_ads_ad_groups_createCreate an ad groupcustomer_id, campaign_id, name
google_ads_ad_groups_updateUpdate an ad groupcustomer_id, ad_group_id
ToolDescriptionRequired Parameters
google_ads_ads_listList adscustomer_id
google_ads_ads_createCreate a responsive search ad (RSA)customer_id, ad_group_id, headlines, descriptions
google_ads_ads_create_displayCreate a responsive display ad (RDA); image files are uploaded automaticallycustomer_id, ad_group_id, headlines, long_headline, descriptions, business_name, marketing_image_paths, square_marketing_image_paths, final_url
google_ads_ads_updateUpdate an adcustomer_id, ad_group_id, ad_id
google_ads_ads_update_statusChange ad statuscustomer_id, ad_group_id, ad_id, status
google_ads_ads_policy_detailsGet ad policy approval detailscustomer_id, ad_group_id, ad_id
ToolDescriptionRequired Parameters
google_ads_keywords_listList keywordscustomer_id
google_ads_keywords_addAdd keywordscustomer_id, ad_group_id, keywords
google_ads_keywords_removeRemove a keywordcustomer_id, ad_group_id, criterion_id
google_ads_keywords_suggestGet keyword suggestions (Keyword Planner)customer_id, seed_keywords
google_ads_keywords_diagnoseDiagnose keyword quality scorescustomer_id, campaign_id
google_ads_keywords_pausePause a keywordcustomer_id, ad_group_id, criterion_id
google_ads_keywords_auditAudit keyword performance and qualitycustomer_id, campaign_id
google_ads_keywords_cross_adgroup_duplicatesFind duplicate keywords across ad groupscustomer_id, campaign_id
ToolDescriptionRequired Parameters
google_ads_negative_keywords_listList negative keywordscustomer_id, campaign_id
google_ads_negative_keywords_addAdd negative keywords to a campaigncustomer_id, campaign_id, keywords
google_ads_negative_keywords_removeRemove a negative keywordcustomer_id, campaign_id, criterion_id
google_ads_negative_keywords_add_to_ad_groupAdd negative keywords to an ad groupcustomer_id, ad_group_id, keywords
google_ads_negative_keywords_suggestSuggest negative keywords based on search termscustomer_id, campaign_id
ToolDescriptionRequired Parameters
google_ads_budget_getGet campaign budgetcustomer_id, campaign_id
google_ads_budget_updateUpdate budgetcustomer_id, budget_id, amount
google_ads_budget_createCreate a new campaign budgetcustomer_id, name, amount
ToolDescriptionRequired Parameters
google_ads_accounts_listList accessible Google Ads accounts(none)
ToolDescriptionRequired Parameters
google_ads_search_terms_reportGet search terms reportcustomer_id
google_ads_search_terms_analyzeAnalyze search terms with intent classificationcustomer_id, campaign_id
ToolDescriptionRequired Parameters
google_ads_sitelinks_listList sitelink extensionscustomer_id, campaign_id
google_ads_sitelinks_createCreate a sitelink extensioncustomer_id, campaign_id, sitelink_text, final_url
google_ads_sitelinks_removeRemove a sitelink extensioncustomer_id, campaign_id, extension_id
ToolDescriptionRequired Parameters
google_ads_callouts_listList callout extensionscustomer_id, campaign_id
google_ads_callouts_createCreate a callout extensioncustomer_id, campaign_id, callout_text
google_ads_callouts_removeRemove a callout extensioncustomer_id, campaign_id, extension_id
ToolDescriptionRequired Parameters
google_ads_conversions_listList conversion actionscustomer_id
google_ads_conversions_getGet conversion action detailscustomer_id, conversion_action_id
google_ads_conversions_performanceGet conversion performance metricscustomer_id
google_ads_conversions_createCreate a conversion actioncustomer_id, name, type
google_ads_conversions_updateUpdate a conversion actioncustomer_id, conversion_action_id
google_ads_conversions_removeRemove a conversion actioncustomer_id, conversion_action_id
google_ads_conversions_tagGet conversion tracking tag snippetcustomer_id, conversion_action_id
ToolDescriptionRequired Parameters
google_ads_recommendations_listList optimization recommendationscustomer_id
google_ads_recommendations_applyApply an optimization recommendationcustomer_id, recommendation_id
google_ads_device_targeting_getGet device targeting settingscustomer_id, campaign_id
google_ads_device_targeting_setSet device targeting bid adjustmentscustomer_id, campaign_id, device_type, bid_modifier
google_ads_bid_adjustments_getGet bid adjustment settingscustomer_id, campaign_id
google_ads_bid_adjustments_updateUpdate bid adjustmentscustomer_id, campaign_id
google_ads_location_targeting_listList location targeting criteriacustomer_id, campaign_id
google_ads_location_targeting_updateUpdate location targetingcustomer_id, campaign_id
google_ads_schedule_targeting_listList ad schedule targetingcustomer_id, campaign_id
google_ads_schedule_targeting_updateUpdate ad schedule targetingcustomer_id, campaign_id
google_ads_change_history_listList account change historycustomer_id
ToolDescriptionRequired Parameters
google_ads_performance_reportGet performance reportcustomer_id
google_ads_performance_analyzeAnalyze performance trends and anomaliescustomer_id
google_ads_cost_increase_investigateInvestigate sudden cost increasescustomer_id, campaign_id
google_ads_health_check_allRun a comprehensive account health checkcustomer_id
google_ads_ad_performance_compareCompare ad performance across variantscustomer_id, ad_group_id
google_ads_ad_performance_reportGet detailed ad-level performance reportcustomer_id
google_ads_network_performance_reportGet network-level performance breakdowncustomer_id
google_ads_budget_efficiencyAnalyze budget utilization efficiencycustomer_id
google_ads_budget_reallocationSuggest budget reallocation across campaignscustomer_id
google_ads_auction_insights_getGet auction insights (competitor analysis)customer_id, campaign_id
google_ads_rsa_assets_analyzeAnalyze RSA asset performancecustomer_id, ad_group_id
google_ads_rsa_assets_auditAudit RSA assets for best practicescustomer_id, campaign_id
google_ads_search_terms_reviewReview search terms with rule-based scoringcustomer_id, campaign_id
ToolDescriptionRequired Parameters
google_ads_btob_optimizationsGet B2B-specific optimization suggestionscustomer_id
ToolDescriptionRequired Parameters
google_ads_landing_page_analyzeAnalyze landing page relevance and qualitycustomer_id, campaign_id
google_ads_creative_researchResearch competitive creative strategiescustomer_id
ToolDescriptionRequired Parameters
google_ads_monitoring_delivery_goalMonitor campaign delivery against goalscustomer_id, campaign_id
google_ads_monitoring_cpa_goalMonitor CPA against target goalscustomer_id, campaign_id
google_ads_monitoring_cv_goalMonitor conversion volume against goalscustomer_id, campaign_id
google_ads_monitoring_zero_conversionsDetect campaigns with zero conversionscustomer_id
ToolDescriptionRequired Parameters
google_ads_capture_screenshotCapture a screenshot of a URLurl
ToolDescriptionRequired Parameters
google_ads_device_analyzeAnalyze device-level performancecustomer_id, campaign_id
google_ads_cpc_detect_trendDetect CPC trend (rising/stable/falling)customer_id, campaign_id
ToolDescriptionRequired Parameters
google_ads_assets_upload_imageUpload a local image file as a Google Ads assetcustomer_id, file_path
ToolDescriptionRequired Parameters
meta_ads_campaigns_listList campaignsaccount_id
meta_ads_campaigns_getGet campaign detailsaccount_id, campaign_id
meta_ads_campaigns_createCreate a campaignaccount_id, name, objective
meta_ads_campaigns_updateUpdate a campaignaccount_id, campaign_id
meta_ads_campaigns_pausePause a campaignaccount_id, campaign_id
meta_ads_campaigns_enableEnable a paused campaignaccount_id, campaign_id
ToolDescriptionRequired Parameters
meta_ads_ad_sets_listList ad setsaccount_id
meta_ads_ad_sets_createCreate an ad setaccount_id, campaign_id, name, daily_budget
meta_ads_ad_sets_updateUpdate an ad setaccount_id, ad_set_id
meta_ads_ad_sets_getGet ad set detailsaccount_id, ad_set_id
meta_ads_ad_sets_pausePause an ad setaccount_id, ad_set_id
meta_ads_ad_sets_enableEnable a paused ad setaccount_id, ad_set_id
ToolDescriptionRequired Parameters
meta_ads_ads_listList adsaccount_id
meta_ads_ads_createCreate an adaccount_id, ad_set_id, name, creative_id
meta_ads_ads_updateUpdate an adaccount_id, ad_id
meta_ads_ads_getGet ad detailsaccount_id, ad_id
meta_ads_ads_pausePause an adaccount_id, ad_id
meta_ads_ads_enableEnable a paused adaccount_id, ad_id
ToolDescriptionRequired Parameters
meta_ads_creatives_listList ad creativesaccount_id
meta_ads_creatives_createCreate a standard ad creativeaccount_id, name
meta_ads_creatives_create_carouselCreate a carousel creative (2-10 cards)account_id, page_id, cards, link
meta_ads_creatives_create_collectionCreate a collection creativeaccount_id, page_id, product_ids, link
meta_ads_creatives_create_dynamicCreate a dynamic product ad creativeaccount_id, catalog_id
meta_ads_creatives_create_leadCreate a Lead Ad creative attached to an Instant Formaccount_id, name, page_id, form_id, link_url
meta_ads_creatives_upload_imageUpload an image for use in creativesaccount_id, file_path
ToolDescriptionRequired Parameters
meta_ads_images_upload_fileUpload an image from local fileaccount_id, file_path
ToolDescriptionRequired Parameters
meta_ads_insights_reportGet performance reportaccount_id
meta_ads_insights_breakdownGet breakdown report (age, gender, etc.)account_id, campaign_id
ToolDescriptionRequired Parameters
meta_ads_audiences_listList custom audiencesaccount_id
meta_ads_audiences_createCreate a custom audienceaccount_id, name, subtype
meta_ads_audiences_getGet audience detailsaccount_id, audience_id
meta_ads_audiences_deleteDelete a custom audienceaccount_id, audience_id
meta_ads_audiences_create_lookalikeCreate a lookalike audienceaccount_id, source_audience_id, country
ToolDescriptionRequired Parameters
meta_ads_conversions_sendSend conversion events (generic)account_id, pixel_id, events
meta_ads_conversions_send_purchaseSend a purchase eventaccount_id, pixel_id, event_time, user_data, currency, value
meta_ads_conversions_send_leadSend a lead eventaccount_id, pixel_id, event_time, user_data
ToolDescriptionRequired Parameters
meta_ads_pixels_listList pixelsaccount_id
meta_ads_pixels_getGet pixel detailsaccount_id, pixel_id
meta_ads_pixels_statsGet pixel firing statisticsaccount_id, pixel_id
meta_ads_pixels_eventsList pixel eventsaccount_id, pixel_id
ToolDescriptionRequired Parameters
meta_ads_analysis_performanceAnalyze overall performance trendsaccount_id
meta_ads_analysis_audienceAnalyze audience performance and overlapaccount_id
meta_ads_analysis_placementsAnalyze placement performance breakdownaccount_id
meta_ads_analysis_costAnalyze cost trends and efficiencyaccount_id
meta_ads_analysis_compare_adsCompare performance across adsaccount_id
meta_ads_analysis_suggest_creativeSuggest creative improvements based on dataaccount_id
ToolDescriptionRequired Parameters
meta_ads_catalogs_listList product catalogsaccount_id, business_id
meta_ads_catalogs_createCreate a product catalogaccount_id, business_id, name
meta_ads_catalogs_getGet catalog detailsaccount_id, catalog_id
meta_ads_catalogs_deleteDelete a product catalogaccount_id, catalog_id
meta_ads_products_listList products in a catalogaccount_id, catalog_id
meta_ads_products_addAdd a product to a catalogaccount_id, catalog_id, retailer_id, name, availability, condition, price, url, image_url
meta_ads_products_getGet product detailsaccount_id, product_id
meta_ads_products_updateUpdate a productaccount_id, product_id
meta_ads_products_deleteDelete a productaccount_id, product_id
meta_ads_feeds_listList feeds for a catalogaccount_id, catalog_id
meta_ads_feeds_createCreate a feed (URL-based, scheduled import)account_id, catalog_id, name, feed_url
ToolDescriptionRequired Parameters
meta_ads_lead_forms_listList lead forms (per page)account_id, page_id
meta_ads_lead_forms_getGet lead form detailsaccount_id, form_id
meta_ads_lead_forms_createCreate a lead formaccount_id, page_id, name, questions, privacy_policy_url
meta_ads_lead_forms_updateUpdate lead form status (ACTIVE / ARCHIVED)account_id, form_id, status
meta_ads_lead_forms_duplicateDuplicate a lead form under a Page with a new nameaccount_id, form_id, page_id, new_name
meta_ads_leads_export_csvExport form leads to a local CSV fileaccount_id, form_id, output_path
meta_ads_leads_getGet lead data (per form)account_id, form_id
meta_ads_leads_get_by_adGet lead data (per ad)account_id, ad_id
ToolDescriptionRequired Parameters
meta_ads_videos_uploadUpload a video from URLaccount_id, video_url
meta_ads_videos_upload_fileUpload a video from local fileaccount_id, file_path

(See Creatives section above for carousel and collection tools.)

ToolDescriptionRequired Parameters
meta_ads_split_tests_listList split testsaccount_id
meta_ads_split_tests_getGet split test details and resultsaccount_id, study_id
meta_ads_split_tests_createCreate a split testaccount_id, name, cells, objectives, start_time, end_time
meta_ads_split_tests_endEnd a split testaccount_id, study_id
ToolDescriptionRequired Parameters
meta_ads_ad_rules_listList automated rulesaccount_id
meta_ads_ad_rules_getGet rule detailsaccount_id, rule_id
meta_ads_ad_rules_createCreate an automated rule (alerts, auto-pause, etc.)account_id, name, evaluation_spec, execution_spec
meta_ads_ad_rules_updateUpdate an automated ruleaccount_id, rule_id
meta_ads_ad_rules_deleteDelete an automated ruleaccount_id, rule_id
ToolDescriptionRequired Parameters
meta_ads_page_posts_listList Facebook page postsaccount_id, page_id
meta_ads_page_posts_boostBoost a page post (create ad from post)account_id, page_id, post_id, ad_set_id
ToolDescriptionRequired Parameters
meta_ads_instagram_accountsList connected Instagram accountsaccount_id
meta_ads_instagram_mediaList Instagram postsaccount_id, ig_user_id
meta_ads_instagram_boostBoost an Instagram post (create ad from post)account_id, ig_user_id, media_id, ad_set_id

Search Console tools reuse the same Google OAuth2 credentials as Google Ads — no additional authentication is required.

ToolDescriptionRequired Parameters
search_console_sites_listList verified sites(none)
search_console_sites_getGet site detailssite_url
ToolDescriptionRequired Parameters
search_console_analytics_queryQuery search analytics datasite_url
search_console_analytics_top_queriesGet top search queriessite_url
search_console_analytics_top_pagesGet top pages by clicks/impressionssite_url
search_console_analytics_device_breakdownGet performance breakdown by devicesite_url
search_console_analytics_compare_periodsCompare search performance across time periodssite_url
ToolDescriptionRequired Parameters
search_console_sitemaps_listList sitemaps for a sitesite_url
search_console_sitemaps_submitSubmit a sitemapsite_url, sitemap_url
ToolDescriptionRequired Parameters
search_console_url_inspection_inspectInspect a URL for indexing statussite_url, inspection_url

Cross-platform tools for inspecting and applying the reversal of a previously-recorded action_log entry. rollback_apply re-dispatches through the same MCP handler used for forward actions, so the reversal re-enters the full policy gate (auth, rate-limit, GAQL validation, planner allow-list).

ToolDescriptionRequired Parameters
rollback_plan_getInspect the reversal plan for an action_log entry (supported / partial / not_supported), its operation + params, and any caveats. Read-only.index
rollback_applyExecute the reversal plan for action_log[index]. Requires confirm=true as a literal boolean. Appends a new log entry tagged rollback_of=<index>.index, confirm

Both tools accept an optional state_file argument (default STATE.json), which is resolved strictly inside the MCP server’s current working directory. Path traversal, symlink escape, and rollback.* self-recursion are all refused. A second apply of the same index is refused (idempotency is enforced by scanning later log entries for a matching rollback_of marker). Downstream SDK exceptions are logged server-side only; the MCP response returns a generic message so tokens and account identifiers cannot leak into model context.

Cross-platform anomaly detection that operates on STATE.json’s action_log history rather than a platform API directly.

ToolDescriptionRequired Parameters
analysis_anomalies_checkCompare a campaign’s current metrics against a median-based baseline built from action_log history. Returns severity-ordered anomalies — zero spend (CRITICAL), CPA spike (HIGH/CRITICAL, gated by 30+ conversions), CTR drop (HIGH/CRITICAL, gated by 1000+ impressions).current (current.campaign_id and current.cost required)

had_prior_spend (default true) suppresses the zero-spend alert for fresh campaigns. min_baseline_entries (default 7) controls how many history entries are required before a baseline is built; below this, baseline is null and only zero-spend is evaluated. Numeric fields accept int / float / numeric-string and reject "N/A" or booleans. state_file is sandboxed the same way as for the rollback tools. A parseable-but-corrupt STATE.json produces a baseline_warning in the response without silencing live zero-spend detection.

Plugin-Provided Tools (third-party providers)

Section titled “Plugin-Provided Tools (third-party providers)”

Beyond the built-in platforms above, the server also exposes tools from third-party provider plugins discovered via the mureo.providers entry-point group. A plugin opts in by implementing the MCPToolProvider Protocol (mcp_tools() + async handle_mcp_tool()); see plugin-authoring.md §3.

Server behaviour:

  • Additive. Plugin tools are appended after all built-in tools. With no third-party plugins installed, the tool list is identical to before — built-in behaviour is unchanged.
  • Built-ins win on name collision. A plugin tool whose name matches any built-in tool is dropped (a PluginToolWarning is emitted); the built-in keeps the name. Plugin authors should namespace tool names with their provider name (e.g. acme_ads_list_campaigns).
  • First plugin wins when two plugins contribute the same tool name.
  • Fault-isolated. A plugin that fails to construct, whose mcp_tools() raises, or whose handle_mcp_tool is not async, is skipped with a PluginToolWarning — it can never crash the server or block other plugins. Discovery itself failing wholesale yields zero plugin tools rather than a startup error.
  • Discovered once at server start, like the env-var gates below.

Plugin tools obey the same MUREO_DISABLE_* reasoning only insofar as the plugin chooses; the disable env vars gate the built-in families, not third-party plugins.

Beyond individual MCP tools, mureo provides higher-level operational workflows via Claude Code slash commands. These commands orchestrate multiple MCP tools in sequence, guided by the strategy context defined in STRATEGY.md.

CommandPurpose
/onboardInteractive account setup, STRATEGY.md generation, STATE.json init
/daily-checkMode-aware daily health monitoring
/rescueEmergency performance rescue
/search-term-cleanupStrategy-aligned search term hygiene
/creative-refreshPersona/USP-driven ad copy refresh
/budget-rebalanceMode-guided budget reallocation
/competitive-scanAuction analysis with Market Context
/sync-stateManual STATE.json synchronization

Each command reads strategy context (Operation Mode, Persona, USP, Brand Voice, Market Context) from STRATEGY.md and campaign state from STATE.json, then selects and invokes the appropriate MCP tools. For example, /daily-check adapts its monitoring focus based on the current Operation Mode — an EFFICIENCY_STABILIZE mode prioritizes CPA and budget efficiency, while a GROWTH_SCALE mode focuses on impression share and conversion volume.

Operational skill definitions live under skills/ (daily-check, budget-rebalance, etc.). See strategy-context.md for the strategy file format and Operation Mode reference.

mureo is designed to work alongside other MCP servers in the same client session. For example, you can configure a GA4 MCP server next to mureo so that workflow commands like /daily-check and /budget-rebalance can incorporate analytics data into their analysis.

mureo’s workflow commands check for external tool availability opportunistically — if a GA4 or other MCP server responds, the agent uses that data; if not, the command proceeds with mureo’s own data. There is no hard dependency on any external MCP server.

For detailed setup instructions, supported platforms, and configuration examples, see integrations.md.

The Google Ads customer ID is a 10-digit number (e.g., "1234567890"). Dashes are automatically stripped.

The Meta Ads account ID must start with act_ (e.g., "act_1234567890").

  • status_filter: Filter by entity status ("ENABLED", "PAUSED", etc.)
  • period: Time range for reports ("LAST_7_DAYS", "LAST_30_DAYS" for Google Ads; "today", "yesterday", "last_7d", "last_30d" for Meta Ads)
  • limit: Maximum number of results to return (Meta Ads, default: 50)

The keywords parameter for google_ads_keywords_add and google_ads_negative_keywords_add is an array of objects:

{
"keywords": [
{"text": "running shoes", "match_type": "BROAD"},
{"text": "best running shoes", "match_type": "PHRASE"},
{"text": "nike running shoes", "match_type": "EXACT"}
]
}

match_type defaults to "BROAD" if omitted.

The google_ads_ads_create tool accepts headlines and descriptions arrays:

{
"customer_id": "1234567890",
"ad_group_id": "111222333",
"headlines": ["Buy Running Shoes", "Free Shipping", "Best Prices"],
"descriptions": ["Shop our collection of running shoes.", "Free returns on all orders."],
"final_url": "https://example.com/shoes"
}

Headlines: 3-15 items. Descriptions: 2-4 items.

To create a display campaign, pass channel_type: "DISPLAY" to google_ads_campaigns_create:

{
"customer_id": "1234567890",
"name": "Brand Display Campaign",
"channel_type": "DISPLAY",
"bidding_strategy": "MAXIMIZE_CONVERSIONS",
"budget_id": "555666777"
}

Then create an RDA via google_ads_ads_create_display. Local image file paths are uploaded automatically before the ad is created:

{
"customer_id": "1234567890",
"ad_group_id": "111222333",
"headlines": ["Run Faster", "Train Smarter"],
"long_headline": "The shoes that changed how athletes train",
"descriptions": ["Cushioning tested by Olympic runners.", "Free 30-day returns."],
"business_name": "Acme Athletics",
"marketing_image_paths": ["/path/to/marketing-1200x628.jpg"],
"square_marketing_image_paths": ["/path/to/square-1200x1200.jpg"],
"logo_image_paths": ["/path/to/logo.png"],
"final_url": "https://example.com/shoes"
}

Constraints (per the Google Ads API):

  • Headlines: 1-5 items, each ≤30 display width
  • Long headline: required, ≤90 display width
  • Descriptions: 1-5 items, each ≤90 display width
  • Business name: required, ≤25 display width
  • Marketing images (1.91:1): 1-15 files, 3+ recommended for delivery quality
  • Square marketing images (1:1): 1-15 files, 3+ recommended
  • Logo images: optional, up to 5
  • The target ad group must belong to a DISPLAY campaign (mureo verifies this before any upload)

If image upload fails partway through or the ad creation fails after all uploads succeed, an RDAUploadError is raised that includes the resource names of any orphaned uploaded assets so they can be cleaned up.

All tools return TextContent with JSON-serialized results. The JSON structure varies by tool but follows a consistent pattern:

[
{
"type": "text",
"text": "{\"campaigns\": [{\"id\": \"123\", \"name\": \"Brand\", ...}]}"
}
]

The text field contains a JSON string that your agent should parse.

If credentials are missing, tools return a descriptive error message (not an exception):

[
{
"type": "text",
"text": "Authentication credentials not found. Set environment variables or ~/.mureo/credentials.json."
}
]

API errors (rate limits, invalid parameters, etc.) are caught by the @api_error_handler decorator and returned as text:

[
{
"type": "text",
"text": "API Error: Meta API request failed (status=400, path=/act_123/campaigns)"
}
]

Missing required parameters raise ValueError, which the MCP protocol surfaces to the client:

ValueError: Required parameter customer_id is not specified
  • Google Ads: Uses gRPC with automatic retry built into the SDK.
  • Meta Ads: mureo monitors the x-business-use-case-usage response header and automatically retries on HTTP 429 with exponential backoff (up to 3 attempts).

AI agents can issue tool calls at high speed, which risks hitting API rate limits and triggering temporary bans. mureo includes a built-in throttling layer (mureo/throttle.py) that transparently rate-limits all outgoing API requests.

PlatformQPSBurstHourly Cap
Google Ads105
Meta Ads201050,000
Search Console55

The throttler uses a token bucket algorithm combined with a rolling hourly cap (Meta Ads only). When the bucket is empty, the request awaits until a token becomes available — no errors are raised and no tool calls are dropped.

Each platform has a module-level singleton throttler that is shared across all MCP tool calls in the same server process. No user configuration is required; throttling is always active.