NAME
MCP::Server::Legacy - Fallback for clients speaking a previous protocol version
SYNOPSIS
use MCP::Server::Legacy qw(legacy_request);
my $version = legacy_request('2025-11-25', {jsonrpc => '2.0', id => 1, method => 'tools/call'});
DESCRIPTION
MCP::Server::Legacy answers the initialize handshake of clients speaking a protocol revision older than "PROTOCOL_VERSION" in MCP::Constants, so they can still list and call tools, prompts and resources while the ecosystem catches up. Nothing beyond that is supported, in particular no notifications and no multi round-trip requests. It is a temporary convenience and will be removed again in a future release.
FUNCTIONS
MCP::Server::Legacy implements the following functions, which can be imported individually.
legacy_context
my $context = legacy_context($params, $context);
Populate an MCP::Server::Context with the values a current request would have carried in _meta.
legacy_request
my $version = legacy_request($version, $request);
The protocol revision a request was made with, or undef if it is not legacy, based on the MCP-Protocol-Version header and the JSON-RPC request. A request carrying _meta.io.modelcontextprotocol/protocolVersion is never legacy, whatever the header says, so a current client with a misconfigured header still gets a proper error. Revisions before 2025-06-18 predate the header, so a request without one is assumed to be legacy.
legacy_result
my $result = legacy_result($server, $method, $version);
The result for a initialize or ping request, or undef for every other method. The handshake echoes the requested protocol revision and advertises the same primitives as server/discover, but never listChanged, since list change notifications are not supported.
SEE ALSO
MCP, https://mojolicious.org, https://modelcontextprotocol.io.