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.