The agent writes TypeScript to discover and call tools:
// search — find tools across all servers return tools.filter(t => t.name.includes("screenshot"));
// execute — call tools with full type safety await chrome_devtools.navigate_page({ url: "https://example.com" }); const shot = await chrome_devtools.take_screenshot({ format: "png" }); return shot;
Type declarations are auto-generated from each tool's JSON Schema, so the agent gets typed parameters for every tool. TypeScript is stripped via oxc and the JS runs in a sandboxed QuickJS engine (64 MB memory limit).
Adding servers works exactly like you'd expect — just prepend cmcp to any claude mcp add command from a README:
cmcp claude mcp add chrome-devtools npx chrome-devtools-mcp@latest cmcp install
Built in Rust with rmcp, rquickjs, and oxc. Inspired by Cloudflare's blog post on code-mode MCP.
What I found interesting building this: the biggest win isn't just fewer tokens — it's composability. An agent can chain calls across multiple servers in a single execution, which isn't possible with individual tool calls.
sergiomattei•58m ago
First thoughts: it seems the broader community is moving towards Agent Skills as a "replacement" for MCPs to tackle the context pollution problem.
Agent harnesses like Pi don't ship with MCP support as an intentional design choice. MCP servers[0] are being rewritten as pure CLIs in order to support this new scenario.
Thoughts on this?
[0]: https://github.com/microsoft/playwright-cli
aceelric•6m ago
With cmcp you get to use all thr available mcps, while still not bloating context.