* feat: support sampling with tools * address sampling tools review feedback * tighten sampling tools spec compliance * drop SamplingStopReason enum in favor of open string The spec leaves stopReason open for provider-specific values, so upcasting the four known ones to enum cases makes every future enum addition a silent BC break for string comparisons. --------- Co-authored-by: Christopher Hertel <mail@christopher-hertel.de>
2.9 KiB
Client Communication
MCP supports various ways a server can communicate back to a server on top of the main request-response flow.
Table of Contents
ClientGateway
Every communication back to client is handled using the Mcp\Server\ClientGateway and its dedicated methods per
operation. To use the ClientGateway in your code, you need to use method argument injection for RequestContext.
Every reference of a MCP element, that translates to an actual method call, can just add an type-hinted argument for the
RequestContext and the SDK will take care to include the gateway in the arguments of the method call:
use Mcp\Capability\Attribute\McpTool;
use Mcp\Server\RequestContext;
class MyService
{
#[McpTool(name: 'my_tool', description: 'My Tool Description')]
public function myTool(RequestContext $context): string
{
$context->getClientGateway()->log(...);
Sampling
With sampling servers can request clients to execute "completions" or "generations" with a language model for them:
$result = $clientGateway->sample('Roses are red, violets are', 350, 90, ['temperature' => 0.5]);
The sample method accepts four arguments:
message, which is required and accepts a string, an instance ofContentor an array ofSamplingMessageinstances.maxTokens, which defaults to1000timeoutin seconds, which defaults to120optionswhich might includesystemPrompt,preferencesfor model choice,includeContext,temperature,stopSequences,metadata,tools, andtoolChoice
Only send includeContext when the client advertises sampling.context, and only send tools or toolChoice when it
advertises sampling.tools. The context modes other than none are soft-deprecated by the current specification.
Find more details to sampling payload in the specification.
Logging
The Logging utility enables servers to send structured log messages as notification to clients:
use Mcp\Schema\Enum\LoggingLevel;
$clientGateway->log(LoggingLevel::Warning, 'The end is near.');
Progress
With a Progress notification a server can update a client while an operation is ongoing:
$clientGateway->progress(4.2, 10, 'Downloading needed images.');
Notification
Lastly, the server can push all kind of notifications, that implement the Mcp\Schema\JsonRpc\Notification interface
to the client to:
$clientGateway->notify($yourNotification);