Skip to content

Plainrouter

by plainrouter.com · remote · no sign-in to list tools · v0.4.1 · published by com.plainrouter

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

Deletes · 20Changes · 1

51 tools: 20 can delete or cancel things, 1 change things and 30 only read.

Scanned Oct 21, 2026

54 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http plainrouter https://plainrouter.com/mcp

Findings

Matches of fixed checks, with the text they matched.

4 warn50 info
  • The server marks "dry_run_actions" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "dry_run_actions" says "run": a word for a change.

    What this check looks for
  • The server marks "preview_creatives" destructive (destructiveHint: true), and its name says "preview", a word for reading.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}; The name "preview_creatives" says "preview": a word for reading.

    What this check looks for
  • The server marks "launch.creatives.status" destructive (destructiveHint: true), and its name says "status", a word for reading.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}; The name "launch.creatives.status" says "status": a word for reading.

    What this check looks for
  • The server marks "launch.plans.validate" destructive (destructiveHint: true), and its name says "validate", a word for reading.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}; The name "launch.plans.validate" says "validate": a word for reading.

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
Show 48 more findings
  • The description mentions "credential".

    Matched text

    description: "...aces and effective access tiers in this credential scope."

    What this check looks for
  • The input schema at properties.cursor.description mentions "credential".

    Matched text

    inputSchema.properties.cursor.description: "Continue using next_cursor in this credential scope."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for
  • The input schema at properties.workspace_id.description mentions "credential".

    Matched text

    inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

51 tools

Deletes or cancels 20Claude Code: deny
  • actions.rules.createStore a performance rule disabled.1 finding

    Why it is in this group

    • The name "actions.rules.create" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Store a performance rule disabled. Enabling requires an explicit update; this never evaluates or proposes actions.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • actions.rules.updateEdit a stored performance rule by appending a revision, or explicitly enable or disable it.1 finding

    Why it is in this group

    • The name "actions.rules.update" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Edit a stored performance rule by appending a revision, or explicitly enable or disable it. This never evaluates or proposes actions.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • actions.tests.createCreate a judging-only Test from 2 to 4 ads in one mirrored Meta ad set.1 finding

    Why it is in this group

    • The name "actions.tests.create" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • duplicate-ad-with-creativeSubmit a canonical proposal to duplicate a source Meta ad with a different creative asset.1 finding

    Why it is in this group

    • The description's first verb is "submit": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Submit 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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • launch.creatives.statusSet the status of one creative in the workspace bound to the authenticated execution token.2 findings

    Why it is in this group

    • The name "launch.creatives.status" says "status": a word for reading.
    • The description's first verb is "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    • Warn

      The server marks "launch.creatives.status" destructive (destructiveHint: true), and its name says "status", a word for reading.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}; The name "launch.creatives.status" says "status": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Set the status of one creative in the workspace bound to the authenticated execution token.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • launch.creatives.storeStore one JPEG, PNG, MP4, or QuickTime creative from strict base64 content in the token-bound workspace.1 finding

    Why it is in this group

    • The name "launch.creatives.store" says "store": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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. 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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • launch.creatives.store-from-urlFetch and store one creative from a vetted HTTPS URL in the token-bound workspace.1 finding

    Why it is in this group

    • The name "launch.creatives.store-from-url" says "store": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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. 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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • launch.plans.copyCopy a failed plan to a new draft with the same content.1 finding

    Why it is in this group

    • The name "launch.plans.copy" says "copy": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • launch.plans.createCreate a deployment plan for the approved ad account.1 finding

    Why it is in this group

    • The name "launch.plans.create" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Create a deployment plan for the approved ad account.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • launch.plans.executeExecute 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.1 finding

    Why it is in this group

    • The name "launch.plans.execute" says "execute": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • launch.plans.updateUpdate a deployment plan for the approved ad account.1 finding

    Why it is in this group

    • The name "launch.plans.update" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Update a deployment plan for the approved ad account.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • launch.plans.validateValidate a deployment plan for the approved ad account.2 findings

    Why it is in this group

    • The name "launch.plans.validate" says "validate": a word for reading.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    • Warn

      The server marks "launch.plans.validate" destructive (destructiveHint: true), and its name says "validate", a word for reading.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}; The name "launch.plans.validate" says "validate": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Validate a deployment plan for the approved ad account.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • preview_creativesShow workspace creatives to a person in the Creative Preview app.2 findings

    Why it is in this group

    • The name "preview_creatives" says "preview": a word for reading.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    • Warn

      The server marks "preview_creatives" destructive (destructiveHint: true), and its name says "preview", a word for reading.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}; The name "preview_creatives" says "preview": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Show 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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • propose-actionsPropose a batch of budget, status, upload, or creative-duplication actions for the approved ad account.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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. 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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • render_adRender ad copy over an image already in the workspace library using a template id and version, selected sizes, and a required request_key.1 finding

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Render ad copy over an image already in the workspace library using a template id and version, selected sizes, and a required request_key.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • resume_renderInspect a workspace render and resume only a held run.1 finding

    Why it is in this group

    • The description's first verb is "inspect": a word for reading.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Inspect a workspace render and resume only a held run. Running states return inspect guidance.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • revoke_grantRevoke an active workspace grant.1 finding

    Why it is in this group

    • The name "revoke_grant" says "revoke": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • submit_feedbackReport a bug or a missing capability you hit while using this server.1 finding

    Why it is in this group

    • The name "submit_feedback" says "submit": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • upload-assetStage a JPEG/PNG image and submit a canonical upload action through workspace policy.1 finding

    Why it is in this group

    • The name "upload-asset" says "upload": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Stage 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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • verify_signal_ingestionVerify server-side Signal ingestion by writing one idempotent, identity-free modeled event for the authorized workspace.1 finding

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Verify 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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
Changes things 1Claude Code: ask
  • dry_run_actionsPreview policy decisions and execution diffs for a proposed Action batch without writing it.1 finding

    Why it is in this group

    • The name "dry_run_actions" says "run": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "dry_run_actions" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "dry_run_actions" says "run": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Preview policy decisions and execution diffs for a proposed Action batch without writing it.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
Only reads 30Claude Code: allow
  • actions.rules.listList stored performance rules available to this workspace key.1 finding

    Why it is in this group

    • The name "actions.rules.list" says "list": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    List stored performance rules available to this workspace key. This does not evaluate them.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • actions.rules.showRead a stored performance rule and its immutable revisions, with author type only.1 finding

    Why it is in this group

    • The name "actions.rules.show" says "show": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Read a stored performance rule and its immutable revisions, with author type only.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • actions.tests.listList judging Tests with their frozen conversion definitions, loser pause candidate status and reason, and observed conversion event choices for the authorized workspace and ad acco…1 finding

    Why it is in this group

    • The name "actions.tests.list" says "list": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • actions.tests.showRead one Test, its frozen conversion definition, stored verdict facts, and loser pause candidate status and reason.1 finding

    Why it is in this group

    • The name "actions.tests.show" says "show": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_account_inventoryRead the authorized workspace account inventory from the Meta mirror, with optional level, status, parent, and ID cursor filters.1 finding

    Why it is in this group

    • The name "get_account_inventory" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Read the authorized workspace account inventory from the Meta mirror, with optional level, status, parent, and ID cursor filters.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_account_stateReturn the authorized advertising account, workspace, connection, Signal destination, and currently available account capabilities.1 finding

    Why it is in this group

    • The name "get_account_state" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Return the authorized advertising account, workspace, connection, Signal destination, and currently available account capabilities. This read-only inspection tool does not change the account.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_actionGet one proposed action for the authorized workspace and advertising account.1 finding

    Why it is in this group

    • The name "get_action" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_action_batchGet a proposed action batch for the authorized workspace and advertising account.1 finding

    Why it is in this group

    • The name "get_action_batch" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_action_decision_receiptGet the persisted decision receipt for an authorized proposed action.1 finding

    Why it is in this group

    • The name "get_action_decision_receipt" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Get 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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_action_policyGet the effective Actions policy for the authorized workspace without creating a policy row.1 finding

    Why it is in this group

    • The name "get_action_policy" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Get the effective Actions policy for the authorized workspace without creating a policy row.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_arrivals_comparisonReturn counted arrivals beside Meta outbound clicks for the authorized workspace and selected trailing window.1 finding

    Why it is in this group

    • The name "get_arrivals_comparison" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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. basis_note explains how the two counts differ.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_cac_by_channelRead stored ad spend and PlainRouter-earned conversions by channel, with cost per earned conversion by currency.1 finding

    Why it is in this group

    • The name "get_cac_by_channel" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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. basis_note explains how the two counts differ.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_conversion_journeysRead credited conversion journeys for an authorized workspace.1 finding

    Why it is in this group

    • The name "get_conversion_journeys" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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. basis_note explains how the two counts differ.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_install_instructionsReturn managed-hostname Path A installation material and first-arrival state for the authorized workspace.1 finding

    Why it is in this group

    • The name "get_install_instructions" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Return managed-hostname Path A installation material and first-arrival state for the authorized workspace. Includes ordered SaaS setup steps and owner handoffs. Returns no same-origin forwarding material.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_inventory_metricsRead daily Meta metrics beside counted PlainRouter arrivals for mirrored campaigns, ad sets and ads.1 finding

    Why it is in this group

    • The name "get_inventory_metrics" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Read 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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_performanceAdmissible proposal evidence: reconciliation meta_reported is the existing Meta-reported conversions count compared with gateway_verified accepted conversions.1 finding

    Why it is in this group

    • The name "get_performance" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Admissible 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. purchases.basis_note explains how the two counts differ.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_renderInspect a workspace render and its draft output creative ids.1 finding

    Why it is in this group

    • The name "get_render" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Inspect a workspace render and its draft output creative ids.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_signal_healthDiagnostic view of first-party event flow, Meta delivery outcomes, match quality, and reconciliation gaps from Plainrouter stored measurements.1 finding

    Why it is in this group

    • The name "get_signal_health" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_signal_qualityRead stored conversion delivery outcomes, delivery gaps, retained identity presence, and journey coverage for an authorized workspace.1 finding

    Why it is in this group

    • The name "get_signal_quality" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get-creative-libraryReturn Meta image and video assets with the ads and last-30-day performance historically associated with each asset.1 finding

    Why it is in this group

    • The name "get-creative-library" says "get": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Return Meta image and video assets with the ads and last-30-day performance historically associated with each asset.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • launch.creatives.indexList creatives in the workspace bound to the authenticated execution token.1 finding

    Why it is in this group

    • The description's first verb is "list": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    List creatives in the workspace bound to the authenticated execution token.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • launch.creatives.showShow one creative in the workspace bound to the authenticated execution token.1 finding

    Why it is in this group

    • The name "launch.creatives.show" says "show": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    Show one creative in the workspace bound to the authenticated execution token.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • launch.plans.listList deployment plans for the approved ad account, including each current review_version to pass when executing the reviewed plan.1 finding

    Why it is in this group

    • The name "launch.plans.list" says "list": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    List deployment plans for the approved ad account, including each current review_version to pass when executing the reviewed plan.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • launch.plans.showRead one deployment plan and its current review_version and latest launch-intent status in the workspace and ad account bound to the execution token.1 finding

    Why it is in this group

    • The name "launch.plans.show" says "show": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • list_actionsList proposed actions for the authorized workspace and advertising account.1 finding

    Why it is in this group

    • The name "list_actions" says "list": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    List proposed actions for the authorized workspace and advertising account.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_creativesList workspace creative metadata and Library provenance.1 finding

    Why it is in this group

    • The name "list_creatives" says "list": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    List workspace creative metadata and Library provenance. Images are available only through preview_creatives.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_templatesList the available versioned ad templates, usage descriptions, the default choice, copy slots and supported sizes.1 finding

    Why it is in this group

    • The name "list_templates" says "list": a word for reading.

    Findings

    • Info

      The input schema at properties.workspace_id.description mentions "credential".

      Matched text

      inputSchema.properties.workspace_id.description: "...by list_workspaces. Required when this credential reaches multiple workspaces."

      What this check looks for
    Description, as the server wrote it
    List the available versioned ad templates, usage descriptions, the default choice, copy slots and supported sizes.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_workspacesList the workspaces and effective access tiers in this credential scope.2 findings

    Why it is in this group

    • The name "list_workspaces" says "list": a word for reading.

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "...aces and effective access tiers in this credential scope."

      What this check looks for
    • Info

      The input schema at properties.cursor.description mentions "credential".

      Matched text

      inputSchema.properties.cursor.description: "Continue using next_cursor in this credential scope."

      What this check looks for
    Description, as the server wrote it
    List the workspaces and effective access tiers in this credential scope.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.4.1. Values in angle brackets are yours to fill in.

claude mcp add --transport http plainrouter https://plainrouter.com/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__plainrouter__get_account_state",
      "mcp__plainrouter__get_account_inventory",
      "mcp__plainrouter__list_workspaces",
      "mcp__plainrouter__get_signal_health",
      "mcp__plainrouter__get_performance",
      "mcp__plainrouter__get_inventory_metrics",
      "mcp__plainrouter__list_actions",
      "mcp__plainrouter__get_action_batch",
      "mcp__plainrouter__get_action",
      "mcp__plainrouter__get_action_decision_receipt",
      "mcp__plainrouter__get_action_policy",
      "mcp__plainrouter__actions_rules_list",
      "mcp__plainrouter__actions_rules_show",
      "mcp__plainrouter__actions_tests_list",
      "mcp__plainrouter__actions_tests_show",
      "mcp__plainrouter__list_templates",
      "mcp__plainrouter__get_render",
      "mcp__plainrouter__list_creatives",
      "mcp__plainrouter__get-creative-library",
      "mcp__plainrouter__launch_creatives_index",
      "mcp__plainrouter__launch_creatives_show",
      "mcp__plainrouter__launch_plans_show",
      "mcp__plainrouter__launch_plans_list",
      "mcp__plainrouter__get_install_instructions",
      "mcp__plainrouter__get_arrivals_comparison",
      "mcp__plainrouter__get_cookie_scan",
      "mcp__plainrouter__get_consent_rates",
      "mcp__plainrouter__get_conversion_journeys",
      "mcp__plainrouter__get_cac_by_channel",
      "mcp__plainrouter__get_signal_quality"
    ],
    "ask": [
      "mcp__plainrouter__dry_run_actions"
    ],
    "deny": [
      "mcp__plainrouter__verify_signal_ingestion",
      "mcp__plainrouter__propose-actions",
      "mcp__plainrouter__actions_rules_create",
      "mcp__plainrouter__actions_tests_create",
      "mcp__plainrouter__actions_rules_update",
      "mcp__plainrouter__render_ad",
      "mcp__plainrouter__resume_render",
      "mcp__plainrouter__preview_creatives",
      "mcp__plainrouter__launch_creatives_store",
      "mcp__plainrouter__launch_creatives_store-from-url",
      "mcp__plainrouter__launch_creatives_status",
      "mcp__plainrouter__upload-asset",
      "mcp__plainrouter__duplicate-ad-with-creative",
      "mcp__plainrouter__launch_plans_execute",
      "mcp__plainrouter__launch_plans_create",
      "mcp__plainrouter__launch_plans_copy",
      "mcp__plainrouter__launch_plans_update",
      "mcp__plainrouter__launch_plans_validate",
      "mcp__plainrouter__revoke_grant",
      "mcp__plainrouter__submit_feedback"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as plainrouter. Review it before you use it.