Skip to content

v0.4.0 — dual-era MCP

Latest

Choose a tag to compare

@zalez zalez released this 04 Aug 09:46
· 19 commits to main since this release
1c11c13

Dual-era release. This server now speaks both MCP protocol revisions from one process and decides which one a request wants from what the request itself carries — no flag, no setting, no flag day.

2026-07-28 went GA on 2026-07-28 and removes the initialize handshake entirely: the protocol becomes stateless, every request carries its own protocol version and client capabilities, and servers must implement server/discover. It is the largest breaking change in MCP's history.

Existing clients need no changes and see no difference. Legacy output is byte-identical to 0.3.1 — asserted by exact-equality tests, not by intention.

Added

  • MCP 2026-07-28 alongside 2025-11-25, 2025-06-18 and 2025-03-26.
  • server/discover, answered even without _meta — on stdio it is the backward-compatibility probe, and any error there tells a dual-era client "legacy server", a verdict the spec has it cache for the life of the process.
  • -32022 for a modern request naming a revision this server does not speak, carrying the list to retry with. Deliberately the opposite of initialize, which still never errors and downgrades instead.
  • 36 new tests for the modern era. Every one confirmed to fail against a deliberately broken server before being kept.

Changed

  • HANDLERS entries are records carrying handler, protocol era and cacheability, so a method cannot be added without declaring its era.
  • Modern results carry resultType, serverInfo in _meta, and cache hints where the spec requires them.
  • ping is served in both eras.

Now live

uvx perplexity-agent-mcp                 # the MCP server
llm install llm-perplexity-agent         # the llm CLI plugin

Verified end-to-end against the PyPI artifact with Simon Willison's mcp-explorer: doctor reports healthy in both stateless and legacy modes.