The same engine, over MCP.
Agents, IDEs and chat clients speak the Model Context Protocol. The REST layer and the MCP endpoint run the identical server in the same process, so a tool behaves the same whichever door you use.
Endpoint
https://opentax.invaro.ai/mcpJSON-RPC 2.0 over Streamable HTTP, no sessions. Every POST is self-contained. Add it as a custom connector in Claude, ChatGPT, Cursor, or from the terminal:
claude mcp add --transport http opentax https://opentax.invaro.ai/mcpAuthentication
Optional. Send Authorization: Bearer otx_… to attribute calls to your account and raise the rate budget. Connectors that cannot set headers work anonymously.
Calling a tool by hand
curl -s https://opentax.invaro.ai/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'A tools/call result is result.content[0].text, a JSON string with the same shape the REST layer returns as its body. An isError: true result with an MCP error -32602 message is a schema rejection; over REST that is a 400.
Prefer REST from a backend. Use MCP when the caller is a model: the tool descriptions carry the instructions a model needs (never estimate, report the engine's number, disclose assumptions), and the landing page has one-click installs for the common clients.