— MCP —

TALK TO IT FROM CLAUDE OR CURSOR

Two real tools, verified with an actual initialize → tools/list → tools/call handshake -- not written and assumed to work.

The two tools

prove

"Generate a real STARK proof that a .zkasm program executes to its claimed result. Returns the base64-encoded proof and the (initial, result) public inputs."

{ "program": "<.zkasm text>" }
verify

"Verify a proof (from the prove tool) against the exact .zkasm program it claims to be for. Re-executes the program locally to know what to check -- it never trusts the proof's own claims."

{ "program": "<.zkasm text>", "proof_base64": "<from prove>" }

Why its own port, not nested on the HTTP API

rmcp's StreamableHttpService implements tower::Service, but its response body type doesn't line up with axum::Router::nest_service without an adapter layer -- and the upstream examples serve it via a raw hyper accept loop rather than mounting it on an existing router, a strong signal that isn't a supported plug-and-play path. So it runs on :4478, separate from the HTTP API's :4477, following the pattern the upstream examples actually use.

Run it

cargo build --release -p zkvm-host-server
./scripts/mcp_demo.sh

Point any MCP client at http://127.0.0.1:4478. Full setup for Claude Desktop and Cursor specifically: docs/MCP.md. Source: crates/zkvm-host-server/src/mcp.rs.

The rest of the API these tools sit alongside: HTTP API Reference.