Assure over MCP
The Assure API as five tools. An agent — Claude Code, Codex, Cursor, or your own — calls them the way it calls any tool and reads the verdict as JSON. One command installs it. Your key stays in a file on your machine.
The full reference for the routes behind the tools is QUICKSTART-API.md.
Install
Claude Code, from the checkout that holds tools/mcp/assure_mcp.py:
claude mcp add assure -- python3 tools/mcp/assure_mcp.pyCodex, in ~/.codex/config.toml:
[mcp_servers.assure]
command = "python3"
args = ["tools/mcp/assure_mcp.py"]Cursor, in .cursor/mcp.json:
{"mcpServers": {"assure": {"command": "python3", "args": ["tools/mcp/assure_mcp.py"]}}}Give the full path of assure_mcp.py when the agent runs from another directory. Python 3.14 and its standard library are all it needs. python3 tools/mcp/assure_mcp.py --selftest prints the tool list and reaches nothing.
The key
Put your API key in a file and name the file: ASSURE_KEY_FILE=/path/to/your.key. Without that variable, ASSURE_LANE=<name> reads ~/.assure-dogfood/<name>.key. The server reads the file itself and sends the key only in the request header the API quick start names, section 1. The key is never an argument, never printed, and never part of a tool's answer. Without a readable file, every tool answers a structured error that names the variable to set, and nothing is sent.
ASSURE_API names the API base. Unset, it is https://api.symbolia.ai.
The five tools
| Tool | Route | Takes | Returns |
|---|---|---|---|
assure_usage | GET /v1/usage | nothing | your credit, spend, check count, limits and usage lines |
assure_profiles | GET /v1/profiles | nothing | the served profiles, the files each reads, their size limits and the accepted fail_on words |
assure_check | POST /v1/checks | profile; files, a map of file name to text content; optional fail_on and allow_partial | the verdict JSON, schema assure.serve.verdict/v1, once the check finishes |
assure_feedback | POST /v1/feedback | text; optional kind (default friction), check_id, profile, profile_wanted, obligation, package, consent_follow_up | the stored note's id and where it goes next; free |
assure_tree | GET /v1/checks/{id}/tree | check_id | the proof tree JSON, schema assure.proof-tree/v1; Premium and above |
Every answer is the API's own JSON, as text and as structured content. A refusal the API types (QUICKSTART-API.md, section 9) comes back as that same envelope with the tool marked as an error, so an agent reads outcome, reason and action and decides its next step. assure_check derives its idempotency key from the input, so the same files sent twice read the stored check rather than running and charging a second one; a changed byte is a new check.
What leaves your machine
Exactly what the API receives: the request each tool names, with your key in its header, and nothing else. assure_check sends the profile name and the files you pass, base64-encoded. The server reads no other file, opens no other connection and follows no redirect. DATA.md says what the API keeps.