{"name":"com.plainrouter/mcp","slug":"plainrouter-mcp","title":"PlainRouter","description":"Inspect an approved ad account and first-party signal health, then propose policy-gated actions.","url":"https://mcp.market/server/plainrouter-mcp","grade":"C","score":56,"certified":false,"status":"active","category":"other","tags":[],"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/plainrouter/sdk","website":"https://plainrouter.com","version":"0.4.0","remotes":[{"type":"streamable-http","url":"https://plainrouter.com/mcp"},{"type":"streamable-http","url":"https://plainrouter.com/mcp/sandbox"}],"packages":[],"tools":[{"name":"duplicate-ad-with-creative","description":"Submit a canonical proposal to duplicate a source Meta ad with a different creative asset. Approved copies are always created PAUSED.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"source_ad":{"description":"Numeric Meta ID of the ad to duplicate.","pattern":"^\\d+$","type":"string"},"asset_id":{"description":"Asset ID returned by upload-asset or get-creative-library.","pattern":"^(image|video):.+$","type":"string"},"rationale":{"description":"Why this new creative variant should be created.","minLength":1,"maxLength":1000,"type":"string"},"name_suffix":{"description":"Optional suffix for the copied ad name.","maxLength":100,"type":"string"},"idempotency_key":{"description":"Stable key reused when retrying this duplicate proposal.","maxLength":64,"type":"string"}},"required":["source_ad","asset_id","rationale","idempotency_key"]}},{"name":"get-creative-library","description":"Return Meta image and video assets with the ads and last-30-day performance historically associated with each asset.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"asset_type":{"description":"Limit results to images or videos. Defaults to all.","default":"all","enum":["all","image","video"],"type":"string"},"limit":{"description":"Maximum assets returned per requested asset type.","default":25,"minimum":1,"maximum":100,"type":"integer"},"cursor":{"description":"Opaque Meta cursor returned by a previous call.","type":"string"}}}},{"name":"get_account_state","description":"Return the authorized advertising account, workspace, connection, Signal destination, and currently available read-only capabilities.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"get_performance","description":"Admissible proposal evidence comparing Meta-reported conversions with gateway-verified accepted conversions, plus the latest stored daily Meta spend and delivery metrics.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"days":{"description":"Number of reporting days to compare, from 1 to 90.","default":7,"minimum":1,"maximum":90,"type":"integer"}}}},{"name":"get_signal_health","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"days":{"description":"Trailing window in days. One of 7, 30, 90.","default":7,"enum":[7,30,90],"minimum":7,"maximum":90,"type":"integer"}}}},{"name":"propose-actions","description":"Propose a batch of budget, status, upload, or creative-duplication actions for the approved ad account. Budget and status proposals are recommendations only; their execution is disabled in this release. Supported JPEG/PNG uploads and paused ad copies require human approval and workspace policy checks. Suggest-only approval never executes them.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"actions":{"description":"One to twenty-five typed action objects.","minItems":1,"maxItems":25,"items":{"anyOf":[{"additionalProperties":false,"properties":{"type":{"description":"Action type.","enum":["adjust_budget"],"type":"string"},"target_entity":{"additionalProperties":false,"properties":{"type":{"enum":["ad_account","campaign","ad_set","ad"],"type":"string"},"id":{"description":"Platform-native entity ID.","type":"string"},"name":{"description":"Optional human-readable entity name.","type":"string"}},"type":"object","required":["type","id"]},"params":{"additionalProperties":false,"properties":{"new_daily_budget_minor":{"description":"New daily budget in the account currency minor unit.","minimum":1,"type":"integer"}},"type":"object","required":["new_daily_budget_minor"]},"rationale":{"description":"Plain-language reason and expected outcome for this action.","type":"string"}},"type":"object","required":["type","target_entity","params","rationale"]},{"additionalProperties":false,"properties":{"type":{"description":"Action type.","enum":["set_status"],"type":"string"},"target_entity":{"additionalProperties":false,"properties":{"type":{"enum":["ad_account","campaign","ad_set","ad"],"type":"string"},"id":{"description":"Platform-native entity ID.","type":"string"},"name":{"description":"Optional human-readable entity name.","type":"string"}},"type":"object","required":["type","id"]},"params":{"additionalProperties":false,"properties":{"status":{"description":"New delivery status.","enum":["active","paused"],"type":"string"}},"type":"object","required":["status"]},"rationale":{"description":"Plain-language reason and expected outcome for this action.","type":"string"}},"type":"object","required":["type","target_entity","params","rationale"]},{"additionalProperties":false,"properties":{"type":{"description":"Action type.","enum":["duplicate_ad_with_creative"],"type":"string"},"target_entity":{"additionalProperties":false,"properties":{"type":{"enum":["ad_account","campaign","ad_set","ad"],"type":"string"},"id":{"description":"Platform-native entity ID.","type":"string"},"name":{"description":"Optional human-readable entity name.","type":"string"}},"type":"object","required":["type","id"]},"params":{"additionalProperties":false,"properties":{"asset_id":{"description":"Creative-library asset reference.","type":"string"},"status":{"description":"Required paused delivery status for the new ad.","enum":["paused"],"type":"string"},"name_suffix":{"description":"Optional suffix for the duplicated ad name.","type":"string"}},"type":"object","required":["asset_id","status"]},"rationale":{"description":"Plain-language reason and expected outcome for this action.","type":"string"}},"type":"object","required":["type","target_entity","params","rationale"]},{"additionalProperties":false,"properties":{"type":{"description":"Action type.","enum":["upload_asset"],"type":"string"},"target_entity":{"additionalProperties":false,"properties":{"type":{"enum":["ad_account","campaign","ad_set","ad"],"type":"string"},"id":{"description":"Platform-native entity ID.","type":"string"},"name":{"description":"Optional human-readable entity name.","type":"string"}},"type":"object","required":["type","id"]},"params":{"additionalProperties":false,"properties":{"staged_asset_id":{"description":"Durable staged asset reference.","type":"string"},"asset_type":{"description":"Creative type.","enum":["image","video"],"type":"string"},"filename":{"description":"Original staged filename.","type":"string"},"content_sha256":{"description":"Content digest.","pattern":"^[a-f0-9]{64}$","type":"string"},"mime_type":{"description":"Detected MIME type for a staged upload.","type":"string"},"size_bytes":{"description":"Staged asset size in bytes.","minimum":1,"type":"integer"}},"type":"object","required":["staged_asset_id","asset_type","filename","content_sha256"]},"rationale":{"description":"Plain-language reason and expected outcome for this action.","type":"string"}},"type":"object","required":["type","target_entity","params","rationale"]}]},"type":"array"},"rationale":{"description":"Why this batch should be considered together.","type":"string"},"idempotency_key":{"description":"Stable key reused when retrying the same proposal.","type":"string"},"evidence":{"description":"One to three approved server-re-read evidence citations; action-bound sources require action_index.","minItems":1,"maxItems":3,"items":{"additionalProperties":false,"properties":{"source_tool":{"description":"Read tool that returned the cited evidence.","enum":["get_account_state","get_signal_health","get_performance","get-creative-library","staged-asset-manifest"],"type":"string"},"fields_used":{"description":"Exact dot-paths from the cited tool response used in the rationale.","minItems":1,"maxItems":50,"items":{"type":"string"},"type":"array"},"action_index":{"description":"Required action-array index for an action-bound evidence source.","minimum":0,"type":"integer"}},"type":"object","required":["source_tool","fields_used"]},"type":"array"},"target_source":{"description":"How the target was selected. Human-supplied establishes selection only, never current target state.","enum":["human_supplied"],"type":"string"}},"required":["actions","rationale","idempotency_key","evidence","target_source"]}},{"name":"revoke_grant","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"grant_id":{"description":"The ULID of the grant to revoke.","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$","type":"string"}},"required":["grant_id"]}},{"name":"show_spend_cap_approval","description":"Render the static spend-cap approval preview card. Reads and writes nothing.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"upload-asset","description":"Stage a JPEG/PNG image and submit a canonical upload action through the policy and approval gate.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"asset_type":{"description":"The creative asset type. M2 supports images only.","enum":["image"],"type":"string"},"filename":{"description":"Bare 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 from this value.","maxLength":100,"type":"string"},"content_base64":{"description":"Raw base64 content for image uploads. Do not use a data URI prefix.","type":"string"},"rationale":{"description":"Why this asset should be added to the creative library.","minLength":1,"maxLength":1000,"type":"string"},"idempotency_key":{"description":"Stable key reused when retrying this upload proposal.","maxLength":64,"type":"string"}},"required":["asset_type","filename","rationale","idempotency_key"]}},{"name":"verify_signal_ingestion","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}}],"scan":{"score":56,"grade":"C","scanned_at":"2026-09-17T16:29:45.113Z","report":{"scannerVersion":"0.1.2","scannedAt":"2026-09-17T16:29:44.984Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":17,"max":20,"notes":["remote reachable in 2974ms"]},"poisoning":{"score":15,"max":15,"notes":["10 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 3 write-action tools with no auth"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: github 401"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://plainrouter.com/mcp","reachable":true,"authRequired":false,"latencyMs":2974,"serverInfo":{"name":"Plainrouter","version":"0.4.0"}},{"url":"https://plainrouter.com/mcp/sandbox","reachable":true,"authRequired":false,"latencyMs":1791,"serverInfo":{"name":"Plainrouter Sandbox","version":"0.4.0"}}],"packages":[],"repo":{"found":false,"owner":"plainrouter","repo":"sdk","error":"github 401"}}}},"grade_history":[]}