From the Assure repository at 262612b1426d, rendered as written. Source · Markdown

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.py

Codex, 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

ToolRouteTakesReturns
assure_usageGET /v1/usagenothingyour credit, spend, check count, limits and usage lines
assure_profilesGET /v1/profilesnothingthe served profiles, the files each reads, their size limits and the accepted fail_on words
assure_checkPOST /v1/checksprofile; files, a map of file name to text content; optional fail_on and allow_partialthe verdict JSON, schema assure.serve.verdict/v1, once the check finishes
assure_feedbackPOST /v1/feedbacktext; optional kind (default friction), check_id, profile, profile_wanted, obligation, package, consent_follow_upthe stored note's id and where it goes next; free
assure_treeGET /v1/checks/{id}/treecheck_idthe 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.