Back to Home

Pi Refused MCP for a Year. Then 1.0 Shipped It

The Email That Broke a Rule

On the first of October, an email went out with the subject line "Pi 1.0." It was signed from [email protected] and opened with a sentence that would read as routine from any other vendor: "Today we are proudly shipping Pi 1.0: a hardened, minimal, extensible agent harness that you can make your own."

For Pi, "minimal" was never a marketing word. It was the whole product. Mario Zechner, the developer behind libGDX, built the agent around four tools, read, bash, edit and write, plus one of the shortest system prompts in the category. When Earendil Inc. acquired the project in April 2026 and moved it to earendil-works/pi, the restraint survived. By mid-September the repository had crossed 105,500 stars, still MIT, and the pitch had not changed: no MCP out of the box.

That is why the email mattered. Version 1.0 shipped the exact feature Pi had spent a year arguing developers did not need.

Earendil did not pretend otherwise. The company says it waits until a capability has proven itself, weighing functionality against complexity. Pi 1.0 is that process cashing out: the 0.99 releases spent weeks laying pipe for MCP before the decimal point moved.

MCP Walks In, and the Bill Goes Down

MCP, the Model Context Protocol, now ships as a standard feature instead of a bolt-on extension. Codemode arrived with it, along with deferred tool loading. The Register summarized the shift bluntly: Pi pulled a 180 and added MCP support.

The old objection was never ideological. It was arithmetic. Every MCP server you connect hands the model another pile of tool definitions, and those definitions get re-sent on every step of every task. A harness advertising forty tools pays for forty tools before the model has read a single line of your code. Pi's four-tool design was, among other things, a token budget decision dressed up as taste.

Codemode is how the team tried to have both. Instead of exposing every tool as a callable function, Pi lets the model write a short JavaScript script that calls the tools itself. Results get filtered on the JavaScript side before anything returns to the model, so a query pulling two thousand rows can come back as one sentence. Deferred tool loading attacks the same waste from the other end: definitions are fetched when a task needs them instead of being stapled to the front of every request. Codemode also opens a path to non-LLM models, including the classifier Jev and image models via models.generateImages().

Here is what actually landed in 1.0:

  • Codemode with native MCP support and deferred tool loading, so tool search happens at runtime rather than in the system prompt.
  • Mid-conversation system messages, so prompts and available tools can change without restarting the session.
  • Virtual models, which combine several providers behind one model name. Earendil's demo planned with Claude Opus, used Jev to detect the handoff to implementation, and let GPT 6 Luna write the code.
  • Model switching across more than 15 providers, including Anthropic, OpenAI, Google, Amazon Bedrock, Mistral, xAI, Hugging Face, OpenRouter and Ollama.
  • Fullscreen terminal mode by default, with tuiMode: "regular" as the escape hatch for anyone who misses scrollback.

Then heise online published the measurement that turns the argument into a number. With standard tools and Codemode enabled, a request to GPT-5.6 went from roughly 5,300 prompt tokens to about 3,300. Two thousand tokens of plumbing, removed from every single call. heise is careful about the claim: that figure describes the size of the sent context, not an indicator of response quality.

Put it next to the wider field and the result is more interesting than a simple win. In a harness overhead benchmark run on 8 October, Pi sent 1,894 input tokens on a first call against a minimal Playwright project, while Kiro CLI sent 31,798 from the same repository. Pi was already the lightest harness tested, and 1.0 still found two thousand tokens to cut.

The rest of the release reads like housekeeping done under load. MCP OAuth credentials are now stored separately by server name and URL, permissions previously granted survive a re-login, and the iss parameter is validated so a server cannot point at a different authorization server. Memory for a long assistant response in the transcript dropped to about one fifth of its old footprint.

There is also an admission buried in the same email. Pi outgrew the terminal. People wanted to run it from chat services and servers, keep conversations alive past a process exit, and steer long jobs without staring at a prompt. Rather than inflate the coding agent, Earendil shipped Pi Durable as a separate experimental package, installed with @earendil-works/pi-durable alongside @earendil-works/pi-ai and @earendil-works/chord. Both stay MIT, and the documentation lives at pi.dev.

The risk sits where it always does for tools that grow up. Every MCP server is another login, another credential store, another surface that can ask for permissions. Pi 1.0 handles that more carefully than 0.99 did, but a harness that now speaks to the entire MCP ecosystem has a larger attack surface than one with four tools and no network extensions.

So the story is not that minimalism lost. It is that minimalism learned to count. Pi spent a year telling developers that every tool carries a price, then shipped the most popular tool protocol in the ecosystem and paid for it out of the prompt instead of the tool list. The four tools are still there, the installer is still one curl command. For a project that built its reputation on refusing things, that is a rarer outcome than a version bump.

Comments

No comments yet. Be the first to share your thoughts!