Claude-Agent
view release on metacpan or search on metacpan
lib/Claude/Agent/MCP/SDKServer.pm view on Meta::CPAN
package Claude::Agent::MCP::SDKServer;
use 5.020;
use strict;
use warnings;
use Claude::Agent::Logger '$log';
use Errno qw(ENOENT);
use IO::Socket::UNIX;
use JSON::Lines;
use File::Temp qw(tempdir);
use File::Spec;
use Cwd qw(abs_path);
use Try::Tiny;
=head1 NAME
Claude::Agent::MCP::SDKServer - Socket-based MCP server for SDK tools
=head1 DESCRIPTION
This module manages the IPC between the Perl SDK and the MCP server runner.
It creates a Unix socket, spawns the runner as a stdio MCP server, and
handles tool call requests from the runner by executing the local handlers.
=head1 SYNOPSIS
use Claude::Agent::MCP::SDKServer;
my $sdk_server = Claude::Agent::MCP::SDKServer->new(
server => $mcp_server, # Claude::Agent::MCP::Server object
loop => $loop, # IO::Async::Loop
);
# Get the stdio config for the CLI
my $stdio_config = $sdk_server->to_stdio_config();
# Start listening for tool calls
$sdk_server->start();
=cut
use Types::Common -types;
use Marlin
'server!', # Claude::Agent::MCP::Server object
'loop!', # IO::Async::Loop
'_socket_path==.', # Path to Unix socket
'_listener==.', # IO::Async listener
'_temp_dir==.', # Temp directory for socket
'_jsonl==.', # JSON::Lines instance
'_pending_futures==' => sub { {} }, # Track pending async futures to prevent GC
'_future_counter==' => sub { 0 }; # Counter for generating unique future IDs
sub BUILD {
my ($self) = @_;
# Create temp directory for socket
my $temp_dir = tempdir(CLEANUP => 1);
$self->_temp_dir($temp_dir);
# Use combination of PID, time, and cryptographic random for uniqueness
require Crypt::URandom;
my $random = unpack('L', Crypt::URandom::urandom(4)) % 100000;
my $unique_suffix = sprintf("%d_%d_%d", $$, time(), $random);
my $socket_path = File::Spec->catfile($temp_dir, "sdk_${unique_suffix}.sock");
$self->_socket_path($socket_path);
$self->_jsonl(JSON::Lines->new);
return;
}
=head2 socket_path
Returns the path to the Unix socket.
( run in 1.105 second using v1.01-cache-2.11-cpan-99c4e6809bf )