{"$schema":"https://static.modelcontextprotocol.io/schemas/mcp-server-card/v1.json","version":"1.0","protocolVersion":"2025-06-18","serverInfo":{"name":"Collar Guardrail","title":"Collar Guardrail — Pre-Trade Risk Layer","version":"1.0.3"},"description":"Deterministic pre-trade risk checks for autonomous AI trading agents on Robinhood Chain. Returns allow/warn/deny with reasons, risk score, and a tamper-evident audit hash.","documentationUrl":"https://collarguardrail.com/agent-docs.html","iconUrl":"https://collarguardrail.com/icon.svg","contactUrl":"https://collarguardrail.com/security.txt","methodologyUrl":"https://api.collarguardrail.com/methodology.html","methodologyMarkdownUrl":"https://api.collarguardrail.com/.well-known/methodology.md","statusUrl":"https://api.collarguardrail.com/status.json","knownIssuesUrl":"https://api.collarguardrail.com/.well-known/known-issues.json","latencyUrl":"https://api.collarguardrail.com/latency.html","latencyJsonUrl":"https://api.collarguardrail.com/metrics/latency.json","chain":{"name":"Robinhood Chain","chainId":4663,"caip2":"eip155:4663","explorerUrl":"https://explorer.mainnet.chain.robinhood.com","nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"settlementAsset":{"symbol":"USDG","name":"Global Dollar","contractAddress":"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168","decimals":6,"eip712":{"name":"Global Dollar","version":"1"},"transferMethod":"eip3009"}},"transport":{"type":"streamable-http","endpoint":"https://api.collarguardrail.com/mcp-http/mcp"},"capabilities":{"logging":{},"tools":{"listChanged":false}},"authentication":{"required":false,"schemes":[],"notes":"MCP callers are evaluated at a fixed Tier 1 ($5,000 notional) ceiling. For wallet-signature auth and higher tiers, use the REST API."},"rateLimit":{"requestsPerMinutePerIp":30,"maxSessionsPerIp":5,"sessionIdleTimeoutSeconds":300,"notes":"Enforced in front of the MCP transport. Exceeding limits returns HTTP 429 with Retry-After, X-RateLimit-Limit and X-RateLimit-Window headers. Reuse existing sessions; do not open a new transport per request. Before reporting a problem, check statusUrl for known issues and latencyUrl for current p50/p95/p99 — if an issue is already listed there, no action is needed."},"payment":{"protocol":"x402","version":1,"appliesTo":"rest-endpoint-only","network":"eip155:4663","asset":"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168","payTo":"0xdD3596F3eE3BE02d4C6AFd23dC9E1833aDc47934","maxAmountRequired":"100000","maxTimeoutSeconds":300,"facilitatorUrl":"https://robinhood-chain-x402.onrender.com","discoveryUrl":"https://api.collarguardrail.com/.well-known/x402.json","resourceUrl":"https://api.collarguardrail.com/api/x402/analyze","notes":"x402 applies to the REST analyze endpoint, not to MCP tool calls. On HTTP 402, read the PAYMENT-REQUIRED header for the full challenge."},"riskScore":{"min":0,"max":100,"deterministic":true,"bands":[{"min":0,"max":30,"decision":"allow"},{"min":31,"max":70,"decision":"warn"},{"min":71,"max":100,"decision":"deny"}],"categories":[{"name":"Registry & identity","max":30},{"name":"Contract safety","max":30},{"name":"Price & market data quality","max":15},{"name":"Wallet behavior","max":15},{"name":"Trade parameters","max":10}],"hardOverrides":["asset/contract_address mismatch (suspected fake token)","check_token_safety returned severity=danger recently","price_source=unavailable above the tier's advisory floor","any response with an 'error' key"],"notes":"Exact per-signal weights are intentionally not published — publishing them enables adversarial tuning. Full methodology at methodologyUrl (human) and methodologyMarkdownUrl (agent)."},"tools":[{"name":"evaluate_trade","description":"Pre-trade risk check for a proposed trade. Call this BEFORE executing any trade and treat a 'deny' decision as a hard stop. Evaluated at a fixed Tier 1 ceiling ($5,000 notional). Returns decision (allow/warn/deny), reasons, notional value, price and price_source, a 0-100 risk score, and a tamper-evident audit hash. Honeypot findings (severity=danger) from check_token_safety automatically force a DENY regardless of other checks. If the response contains an 'error' key, no verdict was produced and you must not trade.","annotations":{"title":"Evaluate Trade","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"inputSchema":{"type":"object","properties":{"wallet":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"EVM wallet address (0x...) the trade would execute from."},"asset":{"type":"string","description":"Asset symbol, e.g. NVDA, AAPL, TSLA, USDG."},"contract_address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"Token contract address (0x...). Must match the official registry address for that symbol, or the trade is denied as a suspected fake token. Resolve symbols via get_supported_assets first."},"side":{"type":"string","enum":["buy","sell"],"description":"Trade direction."},"amount":{"type":"number","exclusiveMinimum":0,"description":"Quantity in token units — NOT a pre-computed USD value."},"max_slippage_bps":{"type":"integer","minimum":0,"maximum":10000,"default":100,"description":"Max slippage in basis points (default 100)."},"request_id":{"type":"string","description":"Optional idempotency key. Reuse the SAME value when retrying a request you never saw the response to; use a NEW value for every genuinely new trade."}},"required":["wallet","asset","contract_address","side","amount"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Result of a pre-trade risk check. Either a verdict (decision/reasons/risk_score present) or an error (error present).","properties":{"decision":{"type":"string","enum":["allow","warn","deny"],"description":"Final verdict. 'deny' is a hard stop."},"reasons":{"type":"array","items":{"type":"string"},"description":"Human-readable reasons. Entries prefixed with 'ADVISORY:' are non-blocking context; all other entries drove the decision."},"tier":{"type":"integer","minimum":1,"maximum":3,"description":"Tier the wallet was evaluated at (1-3)."},"max_trade_usd":{"type":"number","description":"USD ceiling for this tier."},"calculated_notional_usd":{"type":"number","description":"USD value of the proposed trade."},"price_usd":{"type":"number","description":"Asset price used for the valuation."},"price_source":{"type":"string","enum":["oracle","uniswap_v4","fallback_default","unavailable"],"description":"Where the price came from."},"risk_score":{"type":"integer","minimum":0,"maximum":100,"description":"Composite risk score from 0 (safe) to 100 (blocked)."},"request_id":{"type":"string","description":"Echoed idempotency key, if provided."},"audit_hash":{"type":"string","description":"SHA-256 hash chaining this decision."},"audit_seq":{"type":"integer","description":"Monotonic sequence number of this decision."},"error":{"type":"string","description":"If present, no verdict was produced. Treat as a hard stop; do not execute the trade."}},"anyOf":[{"required":["decision","reasons","risk_score"]},{"required":["error"]}]}},{"name":"evaluate_trade_paid","description":"Pre-trade risk check gated by an x402 payment. Evaluated as COLR Tier 2: $25,000 notional ceiling, 10/25 per-minute rate limits. No COLR holdings are required — the on-chain payment is the credential. FLOW: (1) Call WITHOUT payment_proof → returns a PaymentRequiredOutput describing the on-chain payment (network, asset, amount, payTo, resource). (2) Settle the payment on-chain using an x402-capable client; the facilitator returns a proof string. (3) Call again with payment_proof=<proof> → returns a full EvaluateTradeOutput with tier=2. If the response contains an 'error' key, no verdict was produced and you must not trade.","annotations":{"title":"Evaluate Trade (x402 Paid, Tier 2)","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"wallet":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"EVM wallet address (0x...) the trade would execute from."},"asset":{"type":"string","description":"Asset symbol, e.g. NVDA, AAPL, TSLA, USDG."},"contract_address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"Token contract address (0x...). Must match the official registry address for that symbol."},"side":{"type":"string","enum":["buy","sell"],"description":"Trade direction."},"amount":{"type":"number","exclusiveMinimum":0,"description":"Quantity in token units."},"max_slippage_bps":{"type":"integer","minimum":0,"maximum":10000,"default":100,"description":"Max slippage in basis points (default 100)."},"request_id":{"type":"string","description":"Optional idempotency key."},"payment_proof":{"type":"string","description":"x402 payment proof from the facilitator. Omit on the first call to receive the payment challenge."}},"required":["wallet","asset","contract_address","side","amount"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Either a payment challenge (status='payment_required') or a full verdict (decision present) or an error (error present).","properties":{"status":{"type":"string","enum":["payment_required"],"description":"Present only when a payment challenge is returned."},"network":{"type":"string","description":"CAIP-2 network id."},"asset":{"type":"string","description":"USDG contract address."},"amount":{"type":"string","description":"Amount in asset base units."},"pay_to":{"type":"string","description":"Recipient address."},"resource":{"type":"string","description":"Resource URL the payment unlocks."},"description":{"type":"string","description":"Human-readable purpose."},"max_timeout_seconds":{"type":"integer","description":"Payment validity window."},"tier_granted":{"type":"integer","description":"Tier the paid proof grants (2)."},"decision":{"type":"string","enum":["allow","warn","deny"],"description":"Final verdict. 'deny' is a hard stop."},"reasons":{"type":"array","items":{"type":"string"},"description":"Human-readable reasons."},"tier":{"type":"integer","minimum":1,"maximum":3},"max_trade_usd":{"type":"number"},"calculated_notional_usd":{"type":"number"},"price_usd":{"type":"number"},"price_source":{"type":"string","enum":["oracle","uniswap_v4","fallback_default","unavailable"]},"risk_score":{"type":"integer","minimum":0,"maximum":100},"request_id":{"type":"string"},"audit_hash":{"type":"string"},"audit_seq":{"type":"integer"},"error":{"type":"string","description":"If present, no verdict was produced. Treat as a hard stop."}},"anyOf":[{"required":["status"]},{"required":["decision","reasons","risk_score"]},{"required":["error"]}]}},{"name":"check_token_safety","description":"Honeypot / contract safety check for any ERC-20 token. Returns severity (safe / warn / danger), the specific risk factors found, and a sell-simulation result. IMPORTANT: when severity=danger, evaluate_trade will auto-DENY the trade regardless of other checks. Use before trading unknown memecoins or tokens absent from the official registry. This is a heuristic bytecode + simulation check, not an audit.","annotations":{"title":"Check Token Safety","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"inputSchema":{"type":"object","properties":{"contract_address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"Token contract address (0x...)."}},"required":["contract_address"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Heuristic honeypot / contract safety report. Either a report (severity present) or an error (error present).","properties":{"severity":{"type":"string","enum":["safe","warn","danger"],"description":"Overall classification."},"risk_factors":{"type":"array","items":{"type":"string"},"description":"Specific issues detected."},"sell_simulation_ok":{"type":"boolean","description":"Whether a simulated sell succeeded."},"error":{"type":"string","description":"If present, the check failed. Do not assume 'safe'."}},"anyOf":[{"required":["severity"]},{"required":["error"]}]}},{"name":"simulate_balance","description":"Simulate a wallet's ERC-20 balance after a hypothetical trade using eth_call state override. Read-only: no transaction is ever sent.","annotations":{"title":"Simulate Balance","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"token_address":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"ERC-20 contract address (0x...)."},"holder":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"Wallet address whose balance is simulated (0x...)."},"delta":{"type":"number","description":"Signed amount (negative = spend)."},"decimals":{"type":"integer","minimum":0,"maximum":36,"default":18,"description":"Token decimals (default 18)."}},"required":["token_address","holder","delta"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Result of an eth_call state-override balance simulation. Either balances (before/after/delta present) or an error (error present).","properties":{"before":{"type":"string","description":"Balance before."},"after":{"type":"string","description":"Balance after."},"delta":{"type":"string","description":"Signed change."},"error":{"type":"string","description":"If present, the simulation failed."}},"anyOf":[{"required":["before","after","delta"]},{"required":["error"]}]}},{"name":"get_supported_assets","description":"List every asset in the guardrail's official Robinhood Chain registry, with its canonical contract address. Call this to resolve a symbol to the correct contract_address before evaluate_trade — a mismatched address is treated as a fake-token attempt and denied. Refresh periodically rather than caching indefinitely; Robinhood adds new tokens over time.","annotations":{"title":"Get Supported Assets","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","description":"Response of the asset registry endpoint. Either assets (assets present) or an error (error present).","properties":{"assets":{"type":"array","description":"Registered assets.","items":{"type":"object","properties":{"symbol":{"type":"string"},"contract_address":{"type":"string"},"decimals":{"type":"integer","default":18},"is_native":{"type":"boolean","default":false}},"required":["symbol","contract_address"]}},"error":{"type":"string","description":"If present, the registry was unreachable."}},"anyOf":[{"required":["assets"]},{"required":["error"]}]}},{"name":"verify_audit_trail","description":"Verify the tamper-evident audit trail for a wallet's past guardrail decisions. Recomputes every record's SHA-256 hash and checks the hash-chain links between records. Returns healthy=true only if every record's hash matches AND the chain is unbroken — proving no decision was edited, deleted, or reordered after the fact.","annotations":{"title":"Verify Audit Trail","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"wallet":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","description":"EVM wallet address (0x...)."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"description":"How many recent records to verify (1-1000, default 100)."}},"required":["wallet"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Audit-chain verification result. Either a verdict (healthy present) or an error (error present).","properties":{"healthy":{"type":"boolean","description":"True only if every record's hash matches and the chain is unbroken."},"records_checked":{"type":"integer","description":"Number of records verified."},"first_broken_seq":{"type":"integer","description":"Sequence number of the first broken link, if any."},"error":{"type":"string","description":"If present, verification could not run."}},"anyOf":[{"required":["healthy"]},{"required":["error"]}]}}],"resources":[],"prompts":[]}