Pi now ships the integration it once deliberately omitted. The September 29 v0.99.0 release of earendil-works/pi adds built-in Model Context Protocol support, letting its terminal agent connect to external tool servers. It also adds Code Mode: model-written JavaScript that can combine tool calls and return selected results.
That updates a specific claim in our June account of Pi: there was no built-in MCP. But the larger promise in that article—that users could inspect and replace the surrounding machinery—has a more interesting continuation. Pi has added shared execution machinery beneath the integrations, while making the supplied implementations replaceable.
What users wanted to keep
The public proposal did not meet a uniformly grateful audience. One user, writing as spence-s, worried that bundled MCP and Code Mode would change a harness they valued for shaping themselves. That is a practical concern: an extension-based workflow becomes harder to maintain if the host suddenly claims the same commands or changes how tools run.
Armin Ronacher, the change's author, described composing tools for models such as Jev as the main motivation. Other extension authors made a useful distinction. Noctuid wanted the common execution interfaces even if the particular Code Mode implementation changed. Cv likewise asked that those interfaces remain public if MCP or Code Mode were later split out.
The resulting design gives those requests a concrete answer. An extension can call another registered tool through ctx.executeTool(). The runtime validates the input and sends the nested call through the same extension hooks that can block a call or change its result. The regression cases exercise parallel calls, blocking and result replacement. Extension authors gain a common route through the host instead of needing to invent their own route around it.
A smaller introduction to a large tool catalog
For a user connecting a document service or issue tracker, the visible gain is simpler setup. Pi supplies local-process and HTTP MCP connections, browser sign-in for supported OAuth servers, and a server manager. Project configuration is read only after the project is trusted, because local servers can execute commands.
Code Mode changes how the agent can use those tools. A script can fetch several results, filter them, and pass only the useful portion back to the model. This is useful plumbing, but putting every tool's instructions inside one large Code Mode description would still consume context. A September 27 review comment identified exactly that weakness in the proposal's earlier state.
The released contract includes discovery and deferred exposure. Selected declarations share a configurable budget; a script can search for the rest, or the model can use tool search to load tools for direct calls. The default budget estimates 3,000 tokens for those declarations, not for the entire prompt. It is a way to choose what the model sees, not evidence of a measured saving on completed work.
Bundled does not mean exclusive
The replacement rule is unusually specific. If an installed extension registers /mcp, Pi leaves the built-in MCP session extension out. An extension supplying codemode or tool_search can replace that built-in tool too. Users can also disable individual built-ins. A loader regression checks the competing-command case.
There are boundaries to that choice. The standalone pi mcp shell commands still use Pi's own implementation. SDK sessions do not load the built-in extensions automatically. And compatibility depends on the adapter version: the separate pi-mcp-adapter v3 release moved its main command and configuration to /mcp-adapter and mcp-adapter.json, leaving Pi's names available. Replacing the default and coexisting with it are different arrangements; the configuration migration alone does not establish compatibility between the released versions.
We inspected the release, implementation and test definitions; we did not run a live MCP session or benchmark. The JavaScript VM also does not confine the host tools it invokes. Those limits leave the useful finding intact: Pi now provides more functionality out of the box and more common machinery for people who want a different implementation.
Our June question was whether Pi could grow without losing its replaceability. This release answers part of it in code. The next test is in extension upgrades: can an existing workflow adopt the shared execution path while preserving its commands, policy hooks and results? For users choosing a harness, the consequential feature is now both the integration that ships and the supported route for replacing it.