Program
MCP
The hosted server models call. Same account key, same quota, URL /mcp.
An MCP server is a tool list a model host already knows how to call. This one is hosted at https://development.qedsolver.com/mcp. It is not a second account and not a second key. Put the same qed_live_ key you created on the Account page in the client header. Give the agent its own key if you also have a program calling the API, because the Free plan quota is per key: 60 requests a minute and 5000 a UTC day. solve and download spend that quota. Listing tools does not.
The URL speaks Streamable HTTP. Clients POST one JSON-RPC message and get one JSON response. There is no session. GET is not the protocol: a browser that opens the URL receives 405 and a pointer back here. A missing or revoked key is HTTP 401, and that call is not metered. Supported protocol versions are 2026-07-28, 2025-06-18, and 2025-03-26. This server does not speak OAuth, so a client that can only connect by sending you to a browser sign-in cannot use it yet. Clients that can send an Authorization header can.
Tools
solve returns the same JSON as POST /api/v1/solve. rust is the interpreter, compiler is the compiler, and legacy is the original engine. download returns the same JSON as POST /api/v1/download: source is the file, filename is what to call it, and language defaults to javascript. A program that runs but does not converge is still a successful tool call with Solved false. Do not treat that as permission to guess a number. A 429, 400, or 502 is a tool error, and the text is the error JSON.
Cursor
Save as ~/.cursor/mcp.json, or .cursor/mcp.json in a single project. Export QED_API_KEY in the environment Cursor starts from. Settings, then Tools & Integrations, should list qedsolver after a reload.
Claude Code
The single quotes keep the shell from expanding the variable. Claude Code reads QED_API_KEY when it connects. The same entry in .mcp.json is {"type":"http","url":"https://development.qedsolver.com/mcp","headers":{"Authorization":"Bearer ${QED_API_KEY}"}} inside mcpServers. An entry with a url and no type is treated as a broken local process, so keep type set to http.
Claude Desktop
Desktop still starts a local process. The file is ~/Library/Application Support/Claude/claude_desktop_config.json on macOS and %APPDATA%\Claude\claude_desktop_config.json on Windows. The env value is the secret, so do not commit this file. Quit and reopen the app after editing it.
VS Code
Save as .vscode/mcp.json. Command Palette, MCP: Add Server, HTTP, is the same entry. Copilot calls the solve tool when the chat needs a number from the editor language.
Call the endpoint
A solve is the same POST with method tools/call and params {"name":"solve","arguments":{"equations":["x + y = 3","x - y = 1"]}}. notifications/initialized is answered with 202 and an empty body. Without a key the status is 401.
What the model is told, on initialize: call solve instead of doing the arithmetic, call download when the result should be saved as JavaScript, C, Go, Rust, Java, or Ruby, then call that file's solve with a bag of names from guide rather than editing the equations. The lines are the editor language, ʝ is the imaginary unit, and a Solved false result is not a number to replace. api rust is the interpreter, compiler is the compiler, and legacy is the original engine. The HTTP reference on the API and Download pages is the response and error contract these tools return.