protogrid

Search / com.plainrouter/mcp

Plainrouter

R0· no sign-in

Meta Ads MCP: read ad accounts and signal health; propose governed changes under Ask or Full.

v0.4.1 · active · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality76good
Trust82of 100
Uptime, 30 days97%
Latency p50697 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "plainrouter": {
      "type": "http",
      "url": "https://plainrouter.com/mcp"
    }
  }
}
claude mcp add --transport http plainrouter https://plainrouter.com/mcp
[mcp_servers.plainrouter]
url = "https://plainrouter.com/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "plainrouter": {
      "type": "remote",
      "url": "https://plainrouter.com/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "plainrouter": {
      "type": "http",
      "url": "https://plainrouter.com/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=plainrouter&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vcGxhaW5yb3V0ZXIuY29tL21jcCJ9"
}
{
  "servers": {
    "plainrouter": {
      "type": "http",
      "url": "https://plainrouter.com/mcp"
    }
  }
}
{
  "mcpServers": {
    "plainrouter": {
      "httpUrl": "https://plainrouter.com/mcp"
    }
  }
}
extensions:
  "plainrouter":
    enabled: true
    name: "plainrouter"
    type: streamable_http
    uri: "https://plainrouter.com/mcp"
    timeout: 300

Quality 76 / 100good

protocol88 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • warn
    protocol.list_ttltools/list declares ttlMs 0, so clients re-fetch it on every use
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene93 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations52 of 52 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • warn
    tools.token_costabout 18,150 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability25 · weight 15
  • warn
    stability.changes194 tool changes in 30 days
  • fail
    stability.rug_pull12 tools kept their name but changed most of their description in 30 days; review before trusting them
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

52 tools, about 18,150 tokens to load them all · tool set bf1d5f380c1e · tools last changed 2026-10-20 · checked 2026-10-20 15:57 UTC

Tool changes

  • get_signal_qualityadded

    Read stored conversion delivery outcomes, delivery gaps, retained identity presence, and journey coverage for an authorized workspace. The response uses stored data only and does not call advertising APIs.

  • get_cac_by_channeladded

    Read stored ad spend and PlainRouter-earned conversions by channel, with cost per earned conversion by currency. Meta claims are shown separately from earned conversions. Spend and conversion dates are aligned; touch time does not move spend between days.

  • get_conversion_journeysadded

    Read credited conversion journeys for an authorized workspace. Earned is counted by PlainRouter from its own journeys; claimed is reported by Meta. The two are shown side by side and are never reconciled. The output carries no PlainRouter person or visitor identifiers. UTM labels and ad ids appear exactly as the merchant's links sent them.

  • actions.tests.createchangeddescription, input schema, output schema
    before

    Create a judging-only Test from 2 to 4 ads in one mirrored Meta ad set. It records a PlainRouter verdict and never creates a proposal or writes to Meta.

    after · 79% of words in common

    Create a judging-only Test from 2 to 4 ads in one mirrored Meta ad set. Omit the conversion choice to freeze the workspace default. It records a PlainRouter verdict and never creates a proposal or writes to Meta.

  • actions.tests.showchangeddescription, output schema
    before

    Read one Test, its stored verdict facts, and loser pause candidate status and reason. Spend per recorded conversion compares variants only within this Test.

    after · 92% of words in common

    Read one Test, its frozen conversion definition, stored verdict facts, and loser pause candidate status and reason. Spend per recorded conversion compares variants only within this Test.

  • actions.tests.listchangeddescription, output schema
    before

    List judging Tests, loser pause candidate status and reason, and observed conversion event choices for the authorized workspace and ad account. Results rank variants only within each Test.

    after · 87% of words in common

    List judging Tests with their frozen conversion definitions, loser pause candidate status and reason, and observed conversion event choices for the authorized workspace and ad account. Results rank variants only within each Test.

  • get_arrivals_comparisonchangeddescription
    before

    Return counted arrivals beside Meta outbound clicks for the authorized workspace and selected trailing window. The purchases block shows Meta-reported Purchase counts under the account attribution setting beside Plainrouter accepted server-side Purchase counts, with its completed account-local window end date and no purchase gap or status. Days before 2026-06-29, or not re-read by the daily sync since 2026-09-27, may still hold Meta link clicks or all clicks.

    after · 82% of words in common

    Return counted arrivals beside Meta outbound clicks for the authorized workspace and selected trailing window. The conversions block counts retained logical events under the current workspace conversion choices and publishes its selection version, completed local-day period, and availability. The purchases block shows Meta-reported Purchase counts under the account attribution setting beside Plainrouter accepted server-side Purchase counts, with its completed account-local window end date and no purchase gap or status. Days before 2026-06-29, or not re-read by the daily sync since 2026-09-27, may still hold Meta link clicks or all clicks.

  • launch.plans.listchangedinput schema
  • launch.creatives.indexchangedinput schema
  • actions.tests.listchangedinput schema

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 82 / 100

no-repository
provenance55
liveness99
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-97% +updated-19d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://plainrouter.com/mcp streamable-httpnoneyes97%697 ms2026-07-282026-10-20
https://plainrouter.com/mcp/sandbox streamable-httpnoneyes96%686 ms2026-07-282026-10-20

Tools (52)

actions.rules.createdestructiveStore a performance rule disabled. Enabling requires an explicit update; this never evaluates or proposes actions.
actions.rules.listread-onlyList stored performance rules available to this workspace key. This does not evaluate them.
actions.rules.showread-onlyRead a stored performance rule and its immutable revisions, with author type only.
actions.rules.updatedestructiveEdit a stored performance rule by appending a revision, or explicitly enable or disable it. This never evaluates or proposes actions.
actions.tests.createdestructiveCreate a judging-only Test from 2 to 4 ads in one mirrored Meta ad set. Omit the conversion choice to freeze the workspace default. It records a PlainRouter verdict and never creates a proposal or writes to Meta.
actions.tests.listread-onlyList judging Tests with their frozen conversion definitions, loser pause candidate status and reason, and observed conversion event choices for the authorized workspace and ad account. Results rank variants only within each Test.
actions.tests.showread-onlyRead one Test, its frozen conversion definition, stored verdict facts, and loser pause candidate status and reason. Spend per recorded conversion compares variants only within this Test.
dry_run_actionsread-onlyPreview policy decisions and execution diffs for a proposed Action batch without writing it.
duplicate-ad-with-creativedestructiveSubmit a canonical proposal to duplicate a source Meta ad with a different creative asset. In Ask mode every change waits for your approval; in Full mode, changes that pass admission and workspace policy run automatically. Policy-allowed copies are always created PAUSED.
get_account_inventoryread-onlyRead the authorized workspace account inventory from the Meta mirror, with optional level, status, parent, and ID cursor filters.
get_account_stateread-onlyReturn the authorized advertising account, workspace, connection, Signal destination, and currently available account capabilities. This read-only inspection tool does not change the account.
get_actionread-onlyGet one proposed action for the authorized workspace and advertising account. counted_evidence contains frozen target figures and coverage captured at proposal time; null means not captured. The figures inform and never gate.
get_action_batchread-onlyGet a proposed action batch for the authorized workspace and advertising account. Each action’s counted_evidence contains frozen proposal-time target figures and coverage; null means not captured.
get_action_decision_receiptread-onlyGet the persisted decision receipt for an authorized proposed action. Version 3 receipts include counted_evidence frozen at proposal time with account-currency values, coverage and the other-currency exclusion. Existing receipts are unchanged.
get_action_policyread-onlyGet the effective Actions policy for the authorized workspace without creating a policy row.
get_arrivals_comparisonread-onlyReturn counted arrivals beside Meta outbound clicks for the authorized workspace and selected trailing window. The conversions block counts retained logical events under the current workspace conversion choices and publishes its selection version, completed local-day period, and availability. The purchases block shows Meta-reported Purchase counts under the account attribution setting beside Plainrouter accepted server-side Purchase counts, with its completed account-local window end date and no purchase gap or status. Days before 2026-06-29, or not re-read by the daily sync since 2026-09-27, may still hold Meta link clicks or all clicks.
get_cac_by_channelread-onlyRead stored ad spend and PlainRouter-earned conversions by channel, with cost per earned conversion by currency. Meta claims are shown separately from earned conversions. Spend and conversion dates are aligned; touch time does not move spend between days.
get_consent_ratesread-onlyRead recorded consent rates and recent consent receipts for the requested authorized workspace. Rates cover the retained period and split Analytics and Marketing grants by day, country, language, and banner version. This tool does not change data or call advertising APIs.
get_conversion_journeysread-onlyRead credited conversion journeys for an authorized workspace. Earned is counted by PlainRouter from its own journeys; claimed is reported by Meta. The two are shown side by side and are never reconciled. The output carries no PlainRouter person or visitor identifiers. UTM labels and ad ids appear exactly as the merchant's links sent them.
get_cookie_scanread-onlyRead the latest pre-consent cookie scan for the authorized workspace. Blocked and failed scans report findings as unavailable, never as a clean result. When bot protection blocks the start page, allowlist the PlainRouterScanner user agent before retrying.
get-creative-libraryread-onlyReturn Meta image and video assets with the ads and last-30-day performance historically associated with each asset.
get_install_instructionsread-onlyReturn managed-hostname Path A installation material and first-arrival state for the authorized workspace. Returns no same-origin forwarding material.
get_inventory_metricsread-onlyRead daily Meta metrics beside counted PlainRouter arrivals for mirrored campaigns, ad sets and ads. object_metrics contains account-timezone daily comparisons; unmatched_arrivals is one workspace/window count without unknown IDs. Counts are null when the arrivals store is disabled. Optional change history is retention-clamped.
get_performanceread-onlyAdmissible proposal evidence: reconciliation meta_reported is the existing Meta-reported conversions count compared with gateway_verified accepted conversions. The separate purchases block shows Meta-reported Purchase counts under the account attribution setting beside Plainrouter accepted server-side Purchase counts, with its completed account-local window start and end dates and no purchase gap or status. Includes stored daily Meta spend and delivery metrics. platform_claimed_clicks means Meta outbound clicks. Days before 2026-06-29, or not re-read by the daily sync since 2026-09-27, may still hold Meta link clicks or all clicks.
get_renderread-onlyInspect a workspace render and its draft output creative ids.
get_signal_healthread-onlyDiagnostic view of first-party event flow, Meta delivery outcomes, match quality, and reconciliation gaps from Plainrouter stored measurements. Not admissible evidence for spend-affecting proposals. Does not call the Marketing API.
get_signal_qualityread-onlyRead stored conversion delivery outcomes, delivery gaps, retained identity presence, and journey coverage for an authorized workspace. The response uses stored data only and does not call advertising APIs.
launch.creatives.indexread-onlyList creatives in the workspace bound to the authenticated execution token.
launch.creatives.showread-onlyShow one creative in the workspace bound to the authenticated execution token.
launch.creatives.statusdestructiveSet the status of one creative in the workspace bound to the authenticated execution token.
launch.creatives.storedestructiveStore one JPEG, PNG, MP4, or QuickTime creative from strict base64 content in the token-bound workspace. When supplying output from an outside tool, set tags.generator, tags.generator_job and, for a variation, tags.parent_creative. PlainRouter’s own creative tools will set these tags on every creative they make; images enter the library by upload or launch.creatives.store-from-url.
launch.creatives.store-from-urldestructiveFetch and store one creative from a vetted HTTPS URL in the token-bound workspace. When supplying output from an outside tool, set tags.generator, tags.generator_job and, for a variation, tags.parent_creative. PlainRouter’s own creative tools will set these tags on every creative they make; images enter the library by upload or launch.creatives.store-from-url.
launch.plans.copydestructiveCopy a failed plan to a new draft with the same content. Validate and submit the draft afresh; the failed plan and its history stay unchanged.
launch.plans.createdestructiveCreate a deployment plan for the approved ad account.
launch.plans.executedestructiveExecute one deployment plan in the workspace and ad account bound to the execution token; requires the review_version returned by the plan read you acted on. Changed plans are refused before any intent or staging; identical intent_key and review_version retries replay. All provider mutations are proposed through Actions.
launch.plans.listread-onlyList deployment plans for the approved ad account, including each current review_version to pass when executing the reviewed plan.
launch.plans.showread-onlyRead one deployment plan and its current review_version and latest launch-intent status in the workspace and ad account bound to the execution token.
launch.plans.updatedestructiveUpdate a deployment plan for the approved ad account.
launch.plans.validatedestructiveValidate a deployment plan for the approved ad account.
list_actionsread-onlyList proposed actions for the authorized workspace and advertising account.
list_creativesread-onlyList workspace creative metadata and Library provenance. Images are available only through preview_creatives.
list_templatesread-onlyList the available versioned ad templates, usage descriptions, the default choice, copy slots and supported sizes.
list_workspacesread-onlyList the workspaces and effective access tiers in this credential scope.
preview_creativesdestructiveShow workspace creatives to a person in the Creative Preview app. Missing derivatives return pending and queue a bounded build. Originals and image bytes are never returned.
propose-actionsdestructivePropose a batch of budget, status, upload, or creative-duplication actions for the approved ad account. In Ask, every policy-allowed change waits for a person to approve it. In Full, policy-allowed changes run automatically. Rule violations are blocked and shown in the Inbox, and cannot be approved. The execution kill switch stops further writes and never undoes a landed change. Dispatch still requires a live grant, an account in the workspace, and no duplicate write. Legacy set_status and adjust_budget never run. Meta target proposals freeze counted_evidence over the last seven completed account-local days for display only. Evidence may cite get_inventory_metrics leaf fields for the proposed target: Meta inline link clicks, counted arrivals and Purchase count/value at that target’s own level. Spend, impressions, child-object rows, containers, ratios and other action types are refused.
render_addestructiveRender ad copy over an image already in the workspace library using a template id and version, selected sizes, and a required request_key.
resume_renderdestructiveInspect a workspace render and resume only a held run. Running states return inspect guidance.
revoke_grantdestructiveRevoke an active workspace grant. The caller must hold the revoke_grant scope in the same workspace or be the human delegator of the granted agent.
submit_feedbackdestructiveReport a bug or a missing capability you hit while using this server. Say what you were trying to do and what happened. Nothing in the account changes and no reply is sent here.
upload-assetdestructiveStage a JPEG/PNG image and submit a canonical upload action through workspace policy. In Ask mode every change waits for your approval; in Full mode, changes that pass admission and workspace policy run automatically.
validate_sandbox_eventread-onlyValidate a synthetic, identity-free conversion event against the Plainrouter schema. Requires no account, API key, or OAuth flow. Nothing is stored and nothing is sent to an advertising provider. Use this to confirm the server is reachable and that an event payload is well formed before requesting credentials.
verify_signal_ingestiondestructiveVerify server-side Signal ingestion by writing one idempotent, identity-free modeled event for the authorized workspace. This confirms ledger receipt but does not count as real arrival evidence or complete onboarding. No spend capability.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "com.plainrouter/mcp",
  "_meta": {
    "io.modelcontextprotocol.registry/publisher-provided": {
      "capabilities": {
        "io.modelcontextprotocol/ui": {}
      },
      "serverCardUrl": "https://plainrouter.com/.well-known/mcp.json"
    }
  },
  "title": "Plainrouter",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://plainrouter.com/mcp",
      "type": "streamable-http"
    },
    {
      "url": "https://plainrouter.com/mcp/sandbox",
      "type": "streamable-http"
    }
  ],
  "version": "0.4.1",
  "websiteUrl": "https://plainrouter.com",
  "description": "Meta Ads MCP: read ad accounts and signal health; propose governed changes under Ask or Full."
}