Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Plainrouter

REMOTE · PLAINROUTER.COM

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

Available components

0 this week 92 Trust /100

Last scanned (18 hours ago)

Scores higher than 99% of remote servers

Reachable. Last reached 4 Nov 2026.

Category Marketing and SEO

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security94
Transport & Reachability100
Schema Quality & AI Usability74
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 7636 tokens (~169/item across 45 items; 44 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management97
  • Stability observed for 29 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage91
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 69% of tool parameters carry a description.Partial
  • Structured output schemas are declared (30% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 46 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
  • Supports UI / widget rendering.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 0
    • Stability: pass → 0.97 functional
  • 3 Nov 26 0
    • Stability: fail → pass ▲ security
    • Tool “get_cookie_scan” rewrote its description, which is the text the model reads security
  • 31 Oct 26 0
    • A breaking change shipped without a version bump: still 0.4.2 ▼ security
    • Tool “actions.tests.list” was removed ▼ security
    • Tool “actions.tests.create” was removed ▼ security
    • Tool “actions.tests.show” was removed ▼ security
  • 30 Oct 26 0
    • Tool “get_arrivals_comparison” rewrote its description, which is the text the model reads security
    • Tool “get_performance” rewrote its description, which is the text the model reads security
    • Tool “get_performance” now declares an output schema ▲ functional
    • Tool “get_arrivals_comparison” now declares an output schema ▲ functional
  • 28 Oct 26 0
    • Tool “get_cookie_scan” rewrote its description, which is the text the model reads security
    • Tool “get_consent_rates” rewrote its description, which is the text the model reads security
  • 26 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “propose-actions” rewrote its description, which is the text the model reads security
  • 25 Oct 26 +1
    • A breaking change shipped without a version bump: still 0.4.2 ▼ security
    • Tool “list_creatives” was removed ▼ security
    • Tool “list_templates” was removed ▼ security
    • Tool “preview_creatives” was removed ▼ security
    • Tool “render_ad” was removed ▼ security
    • Tool “resume_render” was removed ▼ security
    • Tool “get_render” was removed ▼ security
    • Tool “get_signal_quality” rewrote its description, which is the text the model reads security
    • Tool “launch.creatives.store-from-url” rewrote its description, which is the text the model reads security
    • Tool “launch.creatives.store” rewrote its description, which is the text the model reads security
    • Tool “get_conversion_journeys” rewrote its description, which is the text the model reads security
    • Tool “get_cac_by_channel” rewrote its description, which is the text the model reads security
    • Resource “plainrouter-creative-preview” was removed ▼ functional
  • 24 Oct 26 −1
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “get_signal_health” rewrote its description, which is the text the model reads security
    • Tool “get_performance” rewrote its description, which is the text the model reads security
    • Tool “get_inventory_metrics” rewrote its description, which is the text the model reads security
    • Tool “get_arrivals_comparison” rewrote its description, which is the text the model reads security
    • Server version: 0.4.1 → 0.4.2 functional
    • New tool “get_event_volume” functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Probed https://plainrouter.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=plainrouter.com CN=WE1,O=Google Trust Services,C=US 28 Oct 2026 26 Jan 2027 ECDSA 256 ECDSA-SHA256 50de52e067b14d481300cbb420c70504
SANs: plainrouter.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of plainrouter.com. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
plainrouter.com. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer realm="mcp", resource_metadata="https://plainrouter.com/.well-known/oauth-protected-resource/mcp"

Bearer realm="mcp", resource_metadata="https://plainrouter.com/.well-known/oauth-protected-resource/mcp"
Header Value
strict-transport-security max-age=31536000; includeSubDomains
content-security-policy frame-ancestors 'self'
x-content-type-options nosniff
x-frame-options sameorigin
referrer-policy strict-origin-when-cross-origin

Protected resource metadata

Document https://plainrouter.com/.well-known/oauth-protected-resource/mcp
Retrieved Yes
Resource https://plainrouter.com/mcp
Authorisation server https://plainrouter.com

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://plainrouter.com/mcp Verified 200
http (plaintext) http://plainrouter.com/mcp HTTPS enforced 301 https://plainrouter.com/mcp
MCP tools · 44 exposed · ~7,034 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
actions.rules.create ~143

Store a performance rule disabled. Enabling requires an explicit update; this never evaluates or proposes actions.

NameTypeReqDescription
cursorstring–Read older revisions using rule.next_cursor. Continue through actions.rules.show to avoid another write.
definitionobjectyesBoth arrivals and cost conditions must hold over the last 3 complete days in the account timezone. Supply the complete definition when editing.
limitinteger–Maximum latest revisions; current_revision is always returned separately.
namestringyes–
platform_ad_account_idintegeryes–
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

actions.rules.list ~83

List stored performance rules available to this workspace key. This does not evaluate them.

NameTypeReqDescription
cursorstring–Continue using rules.next_cursor; use actions.rules.show for detail.
pageinteger––
per_pageinteger––
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

actions.rules.show ~137

Read a stored performance rule and its immutable revisions, with author type only.

NameTypeReqDescription
cursorstring–Read older revisions using rule.next_cursor. Continue through actions.rules.show to avoid another write.
decisions_cursorstring–Continue decisions using runs[].next_cursor; requires run_id.
limitinteger–Maximum latest revisions; current_revision is always returned separately.
rule_idstringyesThe action rule ID.
run_idstring–Read decisions for one run belonging to this rule.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

actions.rules.update ~165

Edit a stored performance rule by appending a revision, or explicitly enable or disable it. This never evaluates or proposes actions.

NameTypeReqDescription
cursorstring–Read older revisions using rule.next_cursor. Continue through actions.rules.show to avoid another write.
definitionobject–Both arrivals and cost conditions must hold over the last 3 complete days in the account timezone. Supply the complete definition when editing.
enabledboolean–Explicitly enable or disable the stored rule.
limitinteger–Maximum latest revisions; current_revision is always returned separately.
namestring––
rule_idstringyesThe action rule ID.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

dry_run_actions ~131

Preview policy decisions and execution diffs for a proposed Action batch without writing it.

NameTypeReqDescription
account_idinteger––
actionsarrayyes–
cursorinteger–Continue using next_cursor. Read saved proposal actions with get_action_batch to avoid another write; dry runs repeat the same inputs.
evidencearrayyes–
idempotency_keystringyes–
limitinteger–Maximum complete result actions; the shared JSON byte budget can return fewer.
rationalestringyes–
target_sourcestringyes–
workspace_idinteger––

No output schema declared.

No examples provided.

duplicate-ad-with-creative ~193

Submit a canonical proposal to duplicate a source Meta ad with a different creative asset. In Ask mode every change waits for a person's approval; in Full mode, changes that pass admission and workspace policy run automatically. Policy-allowed copies are always created PAUSED.

NameTypeReqDescription
account_idinteger–Advertising account ID. Required when the workspace has more than one active account.
asset_idstringyesAsset ID returned by upload-asset or get-creative-library.
idempotency_keystringyesStable key reused when retrying this duplicate proposal.
name_suffixstring–Optional suffix for the copied ad name.
rationalestringyesWhy this new creative variant should be created.
source_adstringyesNumeric Meta ID of the ad to duplicate.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_account_inventory ~211

Read the authorized workspace account inventory from the Meta mirror, with optional level, status, parent, and ID cursor filters.

NameTypeReqDescription
account_idintegeryesAdvertising account ID available to the authorized workspace.
adset_idstring–Filter to objects under this parent ad set ID.
after_idinteger–Database ID cursor from the previous page; continue with its last object ID.
campaign_idstring–Filter to objects under this parent campaign ID.
effective_statusstring–Filter by Meta effective status, such as ACTIVE, PAUSED, or ARCHIVED.
levelstring–Limit results to campaign, adset, or ad objects.
limitinteger–Maximum complete objects, from 1 to 200; defaults to 25 and may return fewer to fit the JSON budget. Account summary totals are present on every page.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_account_state ~96

Return the authorized advertising account, workspace, connection, Signal destination, and currently available account capabilities. This read-only inspection tool does not change the account.

NameTypeReqDescription
account_idinteger–Advertising account ID. Signals reads use the workspace Meta destination when omitted; other tools may require an ID when multiple accounts are active.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_action ~111

Get 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.

NameTypeReqDescription
account_idinteger–Advertising account ID. Signals reads use the workspace Meta destination when omitted; other tools may require an ID when multiple accounts are active.
action_idstringyes–
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
dataobjectyes–

No examples provided.

get_action_batch ~131

Get 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.

NameTypeReqDescription
account_idinteger–Advertising account ID. Signals reads use the workspace Meta destination when omitted; other tools may require an ID when multiple accounts are active.
batch_idstringyes–
cursorinteger–Continue using next_cursor with the same account and filters.
limitinteger––
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
dataobjectyes–

No examples provided.

get_action_decision_receipt ~113

Get the persisted decision receipt for an authorized proposed action. Receipts can include counted_evidence frozen at proposal time with account-currency values, coverage and the other-currency exclusion.

NameTypeReqDescription
account_idinteger–Advertising account ID. Signals reads use the workspace Meta destination when omitted; other tools may require an ID when multiple accounts are active.
action_idstringyes–
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
chain_entryobjectyes–
dispositionobjectyes–
documentobjectyes–
document_sha256stringyes–

No examples provided.

get_action_policy ~81

Get the effective Actions policy for the authorized workspace without creating a policy row.

NameTypeReqDescription
account_idinteger–Advertising account ID. Signals reads use the workspace Meta destination when omitted; other tools may require an ID when multiple accounts are active.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_arrivals_comparison ~577

Return counted arrivals beside Meta outbound clicks for the authorized workspace and selected trailing window. difference is arrivals.value minus claimed_clicks; positive means more arrivals than Meta outbound clicks. conversions.count counts retained logical conversions under the current workspace conversion choices, independently of arrivals and Meta acceptance; the block publishes its selection version, completed local-day period, and availability. purchases.plainrouter_accepted_purchases counts only non-test, observed, attribution-joined Purchases Plainrouter sent and Meta accepted, beside Meta-reported Purchase counts under the account attribution setting, with no purchase gap or status; its eligibility differs from conversions.count, and its account-local window ends the day before Meta's latest purchase read, so it can end earlier than conversions.period; with no purchase read it covers conversions.period and window_start_date and window_end_date are null. purchases.plainrouter_accepted_purchases is null when it was not measured: the account timezone is missing or invalid, there is no destination account, no account-local day of the purchase window is retained, or part of the window is older than retained delivery records; null means unavailable, while 0 is a measured zero. An unavailable status from missing Meta data still carries measured arrivals; only the status_message 'No complete retained day is available for this comparison period.' pairs unavailable with arrivals.value 0 by convention, not a measured zero. channel_subset.rows[].arrivals counts consented conversion events by source, not arrivals; these rows are not a breakdown of arrivals.value and need not sum to it. claimed_clicks_source of manual means a person entered the click counts; mixed means differing sources, which may include manual entries or legacy rows with unknown provenance. Unless the destination is inactive, claimed_clicks adds Meta's click counts for each account-timezone day; if…

NameTypeReqDescription
daysinteger–Trailing window in days. One of 7, 30, 90.
monthsinteger–Trailing window of 12 calendar months, in place of days. Offered only where the workspace plan keeps that history and the workspace is set to keep it.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
purchasesobject|nullyes–

No examples provided.

get_cac_by_channel ~249

Return Plainrouter-earned conversions by channel, with cost per earned conversion in each spend currency, using stored ad spend. Each currency's cac divides that currency's spend by all earned conversions in the row, so when a row has spend in more than one currency, no single value is its full cost; Meta's claimed cost counts Purchases only. Spend and conversion dates are aligned; touch time does not move spend between days. basis_note explains how the two counts differ.

NameTypeReqDescription
conversion_kindstring–One conversion stage to count. Trial starts are reported separately from subscriptions.
fromstring–Inclusive beginning of the conversion window. Defaults to 30 days before the end time.
levelstring–Channel dimension used for per-channel rows. The broadest level, platform, is the default.
lookbackinteger–Maximum time between a touch and conversion, in days.
modelstring–Journey credit model used for earned conversions.
tostring–Inclusive end of the conversion window. Defaults to the current time.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_consent_rates ~153

Read recorded consent rates and recent consent receipts for the requested authorized workspace. Output schema_version 2 replaces country breakdowns and the country daily dimension with geography (country, US state or Canadian province/territory). Rates cover recorded choices, not unique visitors, over 180 days; geography and language breakdowns and their daily series show the top 50 values by recorded choices. An independent policy_class breakdown includes Policy not recorded for NULL history. Recent receipts include banner_version, raw country, nullable region and policy_class, geography and geography_label. This tool does not change data or call advertising APIs.

NameTypeReqDescription
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_conversion_journeys ~269

Read credited conversion journeys for an authorized workspace. Plainrouter counts earned from its own journeys. Earned covers every selected conversion kind; claimed covers Meta Purchases only, possibly in another currency. 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. basis_note explains how the two counts differ.

NameTypeReqDescription
conversion_kindsarray–Conversion kinds to count; defaults to subscribed and one-off purchase conversions.
cursorstring–Continue the journey page using next_cursor from the previous response.
fromstring–Inclusive beginning of the journey window. Defaults to 30 days before the end time.
levelstring–Channel dimension used for per-channel rows. The broadest level, platform, is the default.
limitinteger–Maximum credited journeys per page.
lookbackinteger–Maximum time between a touch and conversion, in days.
modelstring–Journey credit model.
tostring–Inclusive end of the journey window. Defaults to the current time.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_cookie_scan ~134

Read the latest cookie scan for the authorized workspace. Cookie inventory includes consent phases; findings concern only pre-consent activity. Blocked and failed scans report findings as unavailable, never as a clean result. When bot protection blocks the start page, allowlist the Plainrouter scanner in your bot protection: its user agent contains "plainrouterscanner" (match it without case sensitivity), then rescan.

NameTypeReqDescription
cursorinteger–Continue using next_cursor in the same workspace.
limitinteger––
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_event_volume ~183

Read weekly distinct optimization-event delivery counts by ad set, campaign or platform from stored data. Plainrouter delivery counts, not Meta's learning status. Test sends excluded; conversion kinds separate. Configurable planning benchmark, unverified live. No provider calls or writes.

NameTypeReqDescription
fromstring–Inclusive event occurrence beginning; defaults to 90 days before to.
levelstring––
lookbackinteger––
modelstring–One integer assignment. Default campaign/ad-set membership is the last pre-conversion touch carrying a campaign/ad-set id, not the literal last site touch. First selects the first qualifying touch.
tostring–Inclusive event occurrence end; defaults to now. Weeks use UTC occurrence time.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_install_instructions ~68

Return managed-hostname installation material and first-arrival state for the authorized workspace. Includes ordered SaaS setup steps and owner handoffs. Returns no same-origin forwarding material.

NameTypeReqDescription
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_inventory_metrics ~246

Return counted Plainrouter arrivals beside daily Meta metrics 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. basis_note explains how the two counts differ.

NameTypeReqDescription
account_idintegeryesAdvertising account ID available to the authorized workspace.
ad_idstring–Limit metrics to this ad ID.
adset_idstring–Limit metrics to this ad set ID.
campaign_idstring–Limit metrics to this campaign ID.
cursorstring–Continue all three collections using next_cursor with the same filters and include_changes.
end_datestring–Inclusive end date in YYYY-MM-DD format.
include_changesboolean–Include object change history within the effective date window.
limitinteger–Maximum rows per collection; byte budgets may return fewer.
start_datestring–Inclusive start date in YYYY-MM-DD format.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_performance ~296

Admissible proposal evidence: reconciliation meta_reported shows Meta dataset event totals beside gateway_verified events Plainrouter sent and Meta accepted. 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. purchases.plainrouter_accepted_purchases is null when it was not measured: the account timezone is missing or invalid, the account has no eligible destination, no account-local day of the purchase window is retained, or part of the window is older than retained delivery records; null means unavailable, while 0 is a measured zero. 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. purchases.basis_note explains how the two counts differ. basis_note explains how the two counts differ.

NameTypeReqDescription
account_idinteger–Advertising account ID. Signals reads use the workspace Meta destination when omitted; other tools may require an ID when multiple accounts are active.
daysinteger–Number of reporting days to compare, from 1 to 90.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
purchasesobject|nullyes–

No examples provided.

get_signal_health ~196

Diagnostic 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. Reconciliation compares Meta dataset event totals with events Plainrouter sent and Meta accepted. performance.basis_note explains how the two counts differ.

NameTypeReqDescription
account_idinteger–Advertising account ID. Signals reads use the workspace Meta destination when omitted; other tools may require an ID when multiple accounts are active.
daysinteger–Trailing window in days. One of 7, 30, 90.
monthsinteger–Trailing window of 12 calendar months, in place of days. Offered only where the workspace plan keeps that history and the workspace is set to keep it.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_signal_quality ~181

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. refused_before_delivery.consent counts undelivered events with consent_basis=severed_measurement, not banner refusals; other undelivered opt-outs and lifecycle events whose checkout lacked consent fall under reason_unknown. Consent rates are 0-1 fractions.

NameTypeReqDescription
conversion_kindsarray–Conversion kinds to include; defaults to trial_started and subscribed.
fromstring–Inclusive beginning of the conversion window. Defaults to 30 days before the end time.
tostring–Inclusive end of the conversion window. Defaults to the current time.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get_trial_proof ~204

Follow stored trial-start cohorts to their first positive payment at 14, 30 and 60 days. Default campaign/ad-set membership is the last pre-trial touch carrying a campaign/ad-set id in the frozen trial journey. Uses integer mature samples and Wilson intervals. Stored data only; no provider calls or writes.

NameTypeReqDescription
fromstring–Inclusive trial-start cohort beginning; defaults to 90 days before to.
levelstring––
lookbackinteger––
modelstring–One integer assignment. Default campaign/ad-set membership is the last pre-trial touch carrying a campaign/ad-set id, not the literal last site touch. First selects the first qualifying touch; ad lev…
tostring–Inclusive trial-start cohort end; defaults to now. Payments are followed through now.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

get-creative-library ~201

Return Meta image and video assets with the ads and last-30-day performance historically associated with each asset.

NameTypeReqDescription
account_idinteger–Advertising account ID. Required when the workspace has more than one active account.
ads_cursorinteger–Continue associated ads using performance.next_cursor, keeping the asset page arguments.
ads_limitinteger–Associated ads per asset, also capped at 30 across the requested asset pages.
asset_typestring–Limit results to images or videos. Defaults to all.
cursorstring–Opaque Meta cursor returned by a previous call.
limitinteger–Maximum assets requested per type; capped at 10 and the projection byte budget. Use pagination to continue.
performance_cursorstring–Continue the provider performance scan using performance_pagination.next_cursor.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

launch.creatives.index ~84

List creatives in the workspace bound to the authenticated execution token.

NameTypeReqDescription
cursorinteger–Continue using creatives.next_cursor in the same workspace.
pageinteger––
per_pageinteger–Number of creatives to return per page.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

launch.creatives.show ~62

Show one creative in the workspace bound to the authenticated execution token.

NameTypeReqDescription
creative_idstringyesULID of the creative to show.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

launch.creatives.status ~75

Set the status of one creative in the workspace bound to the authenticated execution token.

NameTypeReqDescription
creative_idstringyesULID of the creative to update.
statusstringyesTarget creative status.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

launch.creatives.store ~255

Store 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. Images enter the library by upload or launch.creatives.store-from-url.

NameTypeReqDescription
content_base64stringyesStrict standard base64 creative content, decoded to at most 5 MiB.
mime_typestring|null–Optional caller label accepted only for compatibility and ignored; creative type is derived from the bytes.
source_refstring|null–Optional caller-supplied source reference.
tagsobject–Optional flat map of up to 32 string tags, including reserved provenance keys. For output from an outside tool set generator (lowercase slug, 1-64 letters, digits or hyphens), generator_job (1-255 pr…
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

launch.creatives.store-from-url ~213

Fetch 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. Images enter the library by upload or launch.creatives.store-from-url.

NameTypeReqDescription
source_refstring|null–Optional caller-supplied source reference.
tagsobject–Optional flat map of up to 32 string tags, including reserved provenance keys. For output from an outside tool set generator (lowercase slug, 1-64 letters, digits or hyphens), generator_job (1-255 pr…
urlstringyesHTTPS URL of the creative to fetch.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

launch.plans.copy ~76

Copy 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.

NameTypeReqDescription
plan_idstringyesThe deployment plan ID.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
planobjectyes–

No examples provided.

launch.plans.create ~184

Create a deployment plan for the approved ad account.

NameTypeReqDescription
ad_set_refstring|null––
ad_set_specobject|null––
budget_amount_minorintegeryes–
budget_typestringyes–
campaign_refstring|null––
campaign_specobject|null––
copyobjectyes–
creative_idsarray––
creative_overridesarray––
currencystringyes–
landing_pagestringyes–
namestring|null––
naming_policy_namestring|null––
platformstringyes–
platform_ad_account_idintegeryes–
utm_policy_namestring|null––
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
planobjectyes–

No examples provided.

launch.plans.execute ~146

Execute 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.

NameTypeReqDescription
intent_keystring|null–An optional idempotency key for this execution.
plan_idstringyesThe deployment plan ID.
review_versionstringyesThe review_version from the plan read you acted on. Reload and review if the plan changed.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
intentobjectyes–

No examples provided.

launch.plans.list ~88

List deployment plans for the approved ad account, including each current review_version to pass when executing the reviewed plan.

NameTypeReqDescription
cursorinteger–Continue using plans.next_cursor with the same account.
pageinteger––
per_pageinteger|string––
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
plansobjectyes–

No examples provided.

launch.plans.show ~94

Read one deployment plan and its current review_version and latest launch-intent status in the workspace and ad account bound to the execution token.

NameTypeReqDescription
cursorinteger–Continue plan creatives using plan.next_cursor.
limitinteger––
plan_idstringyesThe deployment plan ID.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
planobjectyes–

No examples provided.

launch.plans.update ~196

Update a deployment plan for the approved ad account.

NameTypeReqDescription
ad_set_refstring|null––
ad_set_specobject|null––
budget_amount_minorinteger––
budget_typestring––
campaign_refstring|null––
campaign_specobject|null––
copyobject––
creative_idsarray––
creative_overridesarray––
currencystring––
landing_pagestring––
namestring|null––
naming_policy_namestring|null––
plan_idstringyesThe deployment plan ID.
platformstring––
platform_ad_account_idinteger––
utm_policy_namestring|null––
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
planobjectyes–

No examples provided.

launch.plans.validate ~56

Validate a deployment plan for the approved ad account.

NameTypeReqDescription
plan_idstringyesThe deployment plan ID.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
planobjectyes–

No examples provided.

list_actions ~114

List proposed actions for the authorized workspace and advertising account.

NameTypeReqDescription
account_idinteger–Advertising account ID. Signals reads use the workspace Meta destination when omitted; other tools may require an ID when multiple accounts are active.
cursorinteger–Continue using next_cursor with the same account and filters.
limitinteger––
pageinteger––
statusstring––
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.
NameTypeReqDescription
dataarrayyes–
metaobjectyes–

No examples provided.

list_workspaces ~54

List the workspaces and effective access tiers in this credential scope.

NameTypeReqDescription
cursorinteger–Continue using next_cursor in this credential scope.
limitinteger–Maximum workspaces; the projection budget may return fewer.

No output schema declared.

No examples provided.

propose-actions ~308

Propose 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. Proposals of set_status, adjust_budget, replace_creative, shift_spend and rollback are refused; stored actions of these types 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.

NameTypeReqDescription
account_idinteger––
actionsarrayyes–
cursorinteger–Continue using next_cursor. Read saved proposal actions with get_action_batch to avoid another write; dry runs repeat the same inputs.
evidencearrayyes–
idempotency_keystringyes–
limitinteger–Maximum complete result actions; the shared JSON byte budget can return fewer.
rationalestringyes–
target_sourcestringyes–
workspace_idinteger––

No output schema declared.

No examples provided.

revoke_grant ~80

Revoke 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.

NameTypeReqDescription
grant_idstringyesThe ULID of the grant to revoke.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

submit_feedback ~83

Report 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.

NameTypeReqDescription
kindstringyes–
messagestringyes–
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

upload-asset ~227

Stage a JPEG/PNG image and submit a canonical upload action through workspace policy. In Ask mode every change waits for a person's approval; in Full mode, changes that pass admission and workspace policy run automatically.

NameTypeReqDescription
account_idinteger–Advertising account ID. Required when the workspace has more than one active account.
asset_typestringyesThe creative asset type. Images only.
content_base64string–Raw base64 content for image uploads. Do not use a data URI prefix.
filenamestringyesBare filename with a matching .jpg, .jpeg, or .png extension, such as spring-hero.jpg. Path separators are rejected: send a name, not a path. The asset is never written to a filesystem path built fro…
idempotency_keystringyesStable key reused when retrying this upload proposal.
rationalestringyesWhy this asset should be added to the creative library.
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

verify_signal_ingestion ~87

Send one idempotent, identity-free test event through server-side Signal ingestion for the authorized workspace. A receipt confirms the ledger received it; it is not evidence of a real arrival and does not complete onboarding. No spend capability. It is never sent to Meta.

NameTypeReqDescription
workspace_idinteger–Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces.

No output schema declared.

No examples provided.

Install

How do I install the Plainrouter MCP server?

Plainrouter is a hosted endpoint at https://plainrouter.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · plainrouter.com

# add to Claude Code
claude mcp add --transport http com-plainrouter-mcp 'https://plainrouter.com/mcp'
Common questions

What is the Plainrouter MCP server?

Plainrouter is an MCP server listed in the public MCP registry as com.plainrouter/mcp. Meta Ads MCP: read ad accounts and signal health; propose governed changes under Ask or Full. This page covers its hosted endpoint (https://plainrouter.com/mcp).

Is the Plainrouter MCP server safe to use?

Plainrouter scores 92 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Plainrouter MCP server expose?

Plainrouter exposes 44 tools: get_arrivals_comparison, get_conversion_journeys, get_cac_by_channel, get_signal_quality, get_trial_proof, and 39 more. Their descriptions and schemas cost roughly 7,034 tokens of context every time the server is loaded.

Does the Plainrouter MCP server require authentication?

Yes. Plainrouter asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the Plainrouter MCP server still maintained?

Plainrouter is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.