car-mcp 0.49.0

MCP (Model Context Protocol) server library — transport-agnostic dispatch for exposing CAR capabilities. Used by car-mcp-server (stdio binary) and car-server (HTTP-streamable daemon endpoint).
docs.rs failed to build car-mcp-0.49.0
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build: car-mcp-0.23.0

MCP (Model Context Protocol) server library — transport-agnostic dispatch for exposing CAR capabilities to MCP-aware clients.

Two transports use this crate today:

  • stdiocar-mcp-server binary, one client per process. Suitable for Claude Desktop / Cursor / Claude Code's --mcp-config and any other client that follows the MCP spec's stdio framing. See [transport::stdio_loop].
  • HTTP-streamablecar-server daemon endpoint, many concurrent clients sharing the same Runtime / policy chain / eventlog. Implemented in car_server_core::mcp against the same [Server::handle] entry point: POST /mcp for one JSON-RPC request/response, GET /mcp for the SSE stream, GET /mcp/health for liveness. Bind address is --mcp-bind / CAR_MCP_BIND; pass disabled to skip the listener.

Both share the same Server::handle(Request) -> Option<Response> pure function, so transports stay separable from protocol logic.

The tool set, however, is per-[Server], not per-process. A transport may register tools it alone can serve via [Server::register_tool]: the daemon holds a live Runtime, so it can carry tools the stdio binary has no way to run and must not advertise. With nothing registered, a server advertises exactly the built-in schemas, unchanged.

The daemon uses that seam for exactly one thing today: assistant_start / assistant_poll / assistant_cancel (car_server_core::mcp_assistant, car#972 §6), which drive the agent behind car do through a run handle. They are absent from stdio because car-mcp-server is this crate plus telemetry — no Runtime, no inference engine — so a stdio client gets -32601 for a tool that never existed there rather than a tool that exists and cannot work.

Why a library crate

Originally this lived in car-mcp-server's main.rs as a self-contained binary. v0.8 + the external-agent work made it clear MCP needs to be a first-class daemon surface so every external client (Claude Code, Codex, Gemini, custom GPTs) gets CAR's tools through the same governance layer. Extracting the dispatch logic into a library lets the daemon embed it without shelling out to a subprocess. See docs/proposals/external-agent-detection.md. The daemon endpoint landed in 0542d10f; docs/websocket-protocol.md and docs/cookbook/07-mcp-server.md document the live surface.