MCP
view release on metacpan or search on metacpan
* Scalable with pre-forking web server and async tools using promises
* HTTP client for testing
* Can be embedded in Mojolicious web apps
## Installation
All you need is Perl 5.20 or newer. Just install from [CPAN](https://metacpan.org/pod/MCP).
$ cpanm -n MCP
We recommend the use of a [Perlbrew](http://perlbrew.pl) environment.
## Streamable HTTP Transport
Use the `to_action` method to add an MCP endpoint to any Mojolicious application.
```perl
use Mojolicious::Lite -signatures;
use MCP::Server;
my $server = MCP::Server->new;
$server->tool(
name => 'echo',
description => 'Echo the input text',
input_schema => {type => 'object', properties => {msg => {type => 'string'}}, required => ['msg']},
code => sub ($tool, $args) {
return "Echo: $args->{msg}";
}
);
any '/mcp' => $server->to_action;
app->start;
```
Authentication can be added by the web application, just like for any other route.
## Server-to-Client Streaming
The HTTP transport can optionally accept `GET` requests to open a long-lived SSE stream the server can push
notifications to, and `DELETE` requests to terminate a session. This requires per-process state and is not
compatible with pre-forking web servers, so it is opt-in.
```perl
use Mojolicious::Lite -signatures;
use MCP::Server;
my $server = MCP::Server->new;
$server->tool(
name => 'echo',
description => 'Echo the input text',
input_schema => {type => 'object', properties => {msg => {type => 'string'}}, required => ['msg']},
code => sub ($tool, $args) {
$tool->context->notify('notifications/message', {level => 'info', data => "Echoing: $args->{msg}"});
return "Echo: $args->{msg}";
}
);
any '/mcp' => $server->to_action({streaming => 1});
app->start;
```
## Stdio Transport
Build local command line applications and use the stdio transport for testing with the `to_stdio` method.
```perl
use Mojo::Base -strict, -signatures;
use MCP::Server;
my $server = MCP::Server->new;
$server->tool(
name => 'echo',
description => 'Echo the input text',
input_schema => {type => 'object', properties => {msg => {type => 'string'}}, required => ['msg']},
code => sub ($tool, $args) {
return "Echo: $args->{msg}";
}
);
$server->to_stdio;
```
Just run the script and type requests on the command line.
```
$ perl examples/echo_stdio.pl
{"jsonrpc":"2.0","id":"1","method":"tools/list"}
{"jsonrpc":"2.0","id":"2","method":"tools/call","params":{"name":"echo","arguments":{"msg":"hello perl"}}}
```
( run in 0.591 second using v1.01-cache-2.11-cpan-5735350b133 )