{"id":"mcp-tool-pin","title":"MCP tool pin: detect changed tool definitions (rug pulls) and hidden Unicode","description":"Send an MCP server's tools/list result (up to 200 tools) and, after the first call, the hashes you approved. Returns a reproducible manifest hash, a per-tool hash, which tools were added, removed or changed since approval (silent description and schema edits are how MCP rug pulls and tool poisoning land), and Unicode smuggling findings in every name, description and schema string. Call it at session start before loading tools. Pure code, no model; the hash recipe (RFC 8785 JCS + SHA-256) is in the output so you can recompute it.","roi":"Approve a server's tools once, then catch any later change to what the model is told, for $0.005 per session.","audience":"agent-infra","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/mcp-tool-pin","path":"/api/v1/mcp-tool-pin","contentType":"application/json"},"price":{"amount":"0.005","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["tools"],"properties":{"tools":{"type":"array","minItems":1,"maxItems":200,"description":"The tools array from an MCP tools/list response, as received.","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":20000},"inputSchema":{"type":"object"},"outputSchema":{"type":"object"},"annotations":{"type":"object"}}}},"approvedManifestHash":{"type":"string","minLength":64,"maxLength":64,"description":"manifestHash from the call you approved."},"approvedTools":{"type":"object","description":"Map of tool name to the per-tool hash you approved; enables the added/removed/changed diff."}}},"resultSchema":{"type":"object","properties":{"verdict":{"type":"string","enum":["MATCHES_APPROVED","CHANGED_SINCE_APPROVED","NO_BASELINE"]},"unicodeVerdict":{"type":"string","enum":["BLOCK","REVIEW","NO_FINDING"],"description":"NO_FINDING means none of the 19 Unicode rules fired; it is not a review of what the tools do."},"nextStep":{"type":"string"},"manifestHash":{"type":"string"},"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"hash":{"type":"string"}}}},"diff":{"type":"object","description":"Present when approvedTools was sent.","properties":{"added":{"type":"array","items":{"type":"string"}},"removed":{"type":"array","items":{"type":"string"}},"changed":{"type":"array","items":{"type":"string"}},"unchanged":{"type":"integer"}}},"unicodeFindings":{"type":"array","items":{"type":"object","properties":{"tool":{"type":"string"},"where":{"type":"string"},"verdict":{"type":"string"},"findings":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string","description":"USC001-USC019"},"ruleName":{"type":"string"},"severity":{"type":"string","enum":["critical","high","medium","low"]},"line":{"type":"integer"},"column":{"type":"integer","description":"1-based, in code points."},"codePoints":{"type":"string"},"charInfo":{"type":"string"},"snippet":{"type":"string","description":"Invisible and lookalike characters shown as \\u{XXXX}."}}}}}}},"hashRecipe":{"type":"string"},"engine":{"type":"string"},"upgrade":{"type":"object","description":"The full agent this micro check is a slice of, its price and what it adds.","properties":{"agent":{"type":"string"},"path":{"type":"string"},"priceUsdc":{"type":"string"},"adds":{"type":"string"}}}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"verdict":{"type":"string","enum":["MATCHES_APPROVED","CHANGED_SINCE_APPROVED","NO_BASELINE"]},"unicodeVerdict":{"type":"string","enum":["BLOCK","REVIEW","NO_FINDING"],"description":"NO_FINDING means none of the 19 Unicode rules fired; it is not a review of what the tools do."},"nextStep":{"type":"string"},"manifestHash":{"type":"string"},"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"hash":{"type":"string"}}}},"diff":{"type":"object","description":"Present when approvedTools was sent.","properties":{"added":{"type":"array","items":{"type":"string"}},"removed":{"type":"array","items":{"type":"string"}},"changed":{"type":"array","items":{"type":"string"}},"unchanged":{"type":"integer"}}},"unicodeFindings":{"type":"array","items":{"type":"object","properties":{"tool":{"type":"string"},"where":{"type":"string"},"verdict":{"type":"string"},"findings":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string","description":"USC001-USC019"},"ruleName":{"type":"string"},"severity":{"type":"string","enum":["critical","high","medium","low"]},"line":{"type":"integer"},"column":{"type":"integer","description":"1-based, in code points."},"codePoints":{"type":"string"},"charInfo":{"type":"string"},"snippet":{"type":"string","description":"Invisible and lookalike characters shown as \\u{XXXX}."}}}}}}},"hashRecipe":{"type":"string"},"engine":{"type":"string"},"upgrade":{"type":"object","description":"The full agent this micro check is a slice of, its price and what it adds.","properties":{"agent":{"type":"string"},"path":{"type":"string"},"priceUsdc":{"type":"string"},"adds":{"type":"string"}}}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"tools":[{"name":"get_weather","description":"Get the forecast for a city.​󠁉󠁧󠁮󠁯󠁲󠁥","inputSchema":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}},{"name":"send_email","description":"Send an email.","inputSchema":{"type":"object","properties":{"to":{"type":"string"},"body":{"type":"string"}}}}],"approvedTools":{"get_weather":"0000000000000000000000000000000000000000000000000000000000000000"}},"openapiOperation":{"operationId":"mcp_tool_pin","summary":"MCP tool pin: detect changed tool definitions (rug pulls) and hidden Unicode","description":"Send an MCP server's tools/list result (up to 200 tools) and, after the first call, the hashes you approved. Returns a reproducible manifest hash, a per-tool hash, which tools were added, removed or changed since approval (silent description and schema edits are how MCP rug pulls and tool poisoning land), and Unicode smuggling findings in every name, description and schema string. Call it at session start before loading tools. Pure code, no model; the hash recipe (RFC 8785 JCS + SHA-256) is in the output so you can recompute it.\n\nPrice: 0.005 USDC on Base (x402).","x-x402-price-usdc":"0.005","x-x402-amount":"5000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"x-audience":"agent-infra","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/mcp-tool-pin","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["tools"],"properties":{"tools":{"type":"array","minItems":1,"maxItems":200,"description":"The tools array from an MCP tools/list response, as received.","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":20000},"inputSchema":{"type":"object"},"outputSchema":{"type":"object"},"annotations":{"type":"object"}}}},"approvedManifestHash":{"type":"string","minLength":64,"maxLength":64,"description":"manifestHash from the call you approved."},"approvedTools":{"type":"object","description":"Map of tool name to the per-tool hash you approved; enables the added/removed/changed diff."}}},"example":{"tools":[{"name":"get_weather","description":"Get the forecast for a city.​󠁉󠁧󠁮󠁯󠁲󠁥","inputSchema":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}},{"name":"send_email","description":"Send an email.","inputSchema":{"type":"object","properties":{"to":{"type":"string"},"body":{"type":"string"}}}}],"approvedTools":{"get_weather":"0000000000000000000000000000000000000000000000000000000000000000"}}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"verdict":{"type":"string","enum":["MATCHES_APPROVED","CHANGED_SINCE_APPROVED","NO_BASELINE"]},"unicodeVerdict":{"type":"string","enum":["BLOCK","REVIEW","NO_FINDING"],"description":"NO_FINDING means none of the 19 Unicode rules fired; it is not a review of what the tools do."},"nextStep":{"type":"string"},"manifestHash":{"type":"string"},"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"hash":{"type":"string"}}}},"diff":{"type":"object","description":"Present when approvedTools was sent.","properties":{"added":{"type":"array","items":{"type":"string"}},"removed":{"type":"array","items":{"type":"string"}},"changed":{"type":"array","items":{"type":"string"}},"unchanged":{"type":"integer"}}},"unicodeFindings":{"type":"array","items":{"type":"object","properties":{"tool":{"type":"string"},"where":{"type":"string"},"verdict":{"type":"string"},"findings":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string","description":"USC001-USC019"},"ruleName":{"type":"string"},"severity":{"type":"string","enum":["critical","high","medium","low"]},"line":{"type":"integer"},"column":{"type":"integer","description":"1-based, in code points."},"codePoints":{"type":"string"},"charInfo":{"type":"string"},"snippet":{"type":"string","description":"Invisible and lookalike characters shown as \\u{XXXX}."}}}}}}},"hashRecipe":{"type":"string"},"engine":{"type":"string"},"upgrade":{"type":"object","description":"The full agent this micro check is a slice of, its price and what it adds.","properties":{"agent":{"type":"string"},"path":{"type":"string"},"priceUsdc":{"type":"string"},"adds":{"type":"string"}}}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/mcp-tool-pin/","docsJson":"https://agents.writerslogic.com/docs/mcp-tool-pin.json","sample":"https://agents.writerslogic.com/api/v1/samples/mcp-tool-pin","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}