{"$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.2"},"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","transport":{"type":"streamable-http","endpoint":"/mcp-http/mcp"},"capabilities":{"logging":{},"tools":{"listChanged":false}},"authentication":{"required":false},"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":false},"inputSchema":{"type":"object","properties":{"wallet":{"type":"string","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","description":"Token contract address (0x...). Must match the official registry address for that symbol, or the trade is denied as a suspected fake token."},"side":{"type":"string","enum":["buy","sell"],"description":"Trade direction."},"amount":{"type":"number","description":"Quantity in token units — NOT a pre-computed USD value."},"max_slippage_bps":{"type":"integer","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"]},"outputSchema":{"type":"object","description":"Result of a pre-trade risk check.","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","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","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."}},"required":["decision","reasons","risk_score"]}},{"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","description":"Token contract address (0x...)."}},"required":["contract_address"]},"outputSchema":{"type":"object","description":"Heuristic honeypot / contract safety report.","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'."}},"required":["severity"]}},{"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","description":"ERC-20 contract address (0x...)."},"holder":{"type":"string","description":"Wallet address whose balance is simulated (0x...)."},"delta":{"type":"number","description":"Signed amount (negative = spend)."},"decimals":{"type":"integer","default":18,"description":"Token decimals (default 18)."}},"required":["token_address","holder","delta"]},"outputSchema":{"type":"object","description":"Result of an eth_call state-override balance simulation.","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."}}}},{"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":{},"required":[]},"outputSchema":{"type":"object","description":"Response of the asset registry endpoint.","properties":{"assets":{"type":"array","description":"Registered assets.","items":{"type":"object","properties":{"symbol":{"type":"string"},"contract_address":{"type":"string"},"is_native":{"type":"boolean","default":false}},"required":["symbol","contract_address"]}},"error":{"type":"string","description":"If present, the registry was unreachable."}}}},{"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","description":"EVM wallet address (0x...)."},"limit":{"type":"integer","default":100,"description":"How many recent records to verify (1-1000, default 100)."}},"required":["wallet"]},"outputSchema":{"type":"object","description":"Audit-chain verification result.","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."}},"required":["healthy"]}}],"resources":[],"prompts":[]}