Remove outdated docs (#32)
This commit is contained in:
parent
5bda030630
commit
7eaca45860
1 changed files with 0 additions and 157 deletions
157
doc/index.rst
157
doc/index.rst
|
|
@ -1,157 +0,0 @@
|
||||||
Model Context Protocol SDK
|
|
||||||
==========================
|
|
||||||
|
|
||||||
The PHP MCP SDK is the low level library that enables communication between a PHP application and an LLM model.
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
Install the SDK using Composer:
|
|
||||||
|
|
||||||
.. code-block:: terminal
|
|
||||||
|
|
||||||
$ composer require mcp/sdk
|
|
||||||
|
|
||||||
Usage
|
|
||||||
-----
|
|
||||||
|
|
||||||
The `Model Context Protocol`_ is built on top of JSON-RPC. There are two types of
|
|
||||||
messages. A Notification and Request. The Notification is just a status update
|
|
||||||
that something has happened. There is never a response to a Notification. A Request
|
|
||||||
is a message that expects a response. There are 3 concepts/capabilities that you
|
|
||||||
may use. These are::
|
|
||||||
|
|
||||||
1. **Resources**: File-like data that can be read by clients (like API responses or file contents)
|
|
||||||
1. **Tools**: Functions that can be called by the LLM (with user approval)
|
|
||||||
1. **Prompts**: Pre-written templates that help users accomplish specific tasks
|
|
||||||
|
|
||||||
The SDK comes with NotificationHandlers and RequestHandlers which are expected
|
|
||||||
to be wired up in your application.
|
|
||||||
|
|
||||||
JsonRpcHandler
|
|
||||||
..............
|
|
||||||
|
|
||||||
The ``Mcp\Server\JsonRpcHandler`` is the heart of the SDK. It is here
|
|
||||||
you inject the NotificationHandlers and RequestHandlers. It is recommended to use
|
|
||||||
the built-in handlers in ``Mcp\Server\NotificationHandlers\*`` and
|
|
||||||
``Mcp\Server\RequestHandlers\*``.
|
|
||||||
|
|
||||||
The ``Mcp\Server\JsonRpcHandler`` is started and kept running by
|
|
||||||
the ``Mcp\Server``
|
|
||||||
|
|
||||||
Transports
|
|
||||||
..........
|
|
||||||
|
|
||||||
The SDK supports multiple transports for sending and receiving messages. The
|
|
||||||
``Mcp\Server`` is using the transport to fetch a message, then
|
|
||||||
give it to the ``Mcp\Server\JsonRpcHandler`` and finally send the
|
|
||||||
response/error back to the transport. The SDK comes with a few transports::
|
|
||||||
|
|
||||||
1. **Symfony Console Transport**: Good for testing and for CLI applications
|
|
||||||
1. **Stream Transport**: It uses Server Side Events (SSE) and HTTP streaming
|
|
||||||
|
|
||||||
Capabilities
|
|
||||||
............
|
|
||||||
|
|
||||||
Any client would like to discover the capabilities of the server. Exactly what
|
|
||||||
the server supports is defined in the ``Mcp\Server\RequestHandler\InitializeHandler``.
|
|
||||||
When the client connects, it sees the capabilities and will ask the server to list
|
|
||||||
the tools/resource/prompts etc. When you want to add a new capability, example a
|
|
||||||
**Tool** that can tell the current time, you need to provide some metadata to the
|
|
||||||
``Mcp\Server\RequestHandler\ToolListHandler``::
|
|
||||||
|
|
||||||
namespace App;
|
|
||||||
|
|
||||||
use Mcp\Capability\Tool\MetadataInterface;
|
|
||||||
|
|
||||||
class CurrentTimeToolMetadata implements MetadataInterface
|
|
||||||
{
|
|
||||||
public function getName(): string
|
|
||||||
{
|
|
||||||
return 'Current time';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getDescription(): string
|
|
||||||
{
|
|
||||||
return 'Returns the current time in UTC';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getInputSchema(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'type' => 'object',
|
|
||||||
'properties' => [
|
|
||||||
'format' => [
|
|
||||||
'type' => 'string',
|
|
||||||
'description' => 'The format of the time, e.g. "Y-m-d H:i:s"',
|
|
||||||
'default' => 'Y-m-d H:i:s',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'required' => [],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
We would also need a class to actually execute the tool::
|
|
||||||
|
|
||||||
namespace App;
|
|
||||||
|
|
||||||
use Mcp\Capability\Tool\IdentifierInterface;
|
|
||||||
use Mcp\Capability\Tool\ToolCall;
|
|
||||||
use Mcp\Capability\Tool\ToolCallResult;
|
|
||||||
use Mcp\Capability\Tool\ToolExecutorInterface;
|
|
||||||
|
|
||||||
class CurrentTimeToolExecutor implements ToolExecutorInterface, IdentifierInterface
|
|
||||||
{
|
|
||||||
public function getName(): string
|
|
||||||
{
|
|
||||||
return 'Current time';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function call(ToolCall $input): ToolCallResult
|
|
||||||
{
|
|
||||||
$format = $input->arguments['format'] ?? 'Y-m-d H:i:s';
|
|
||||||
|
|
||||||
return new ToolCallResult(
|
|
||||||
(new \DateTime('now', new \DateTimeZone('UTC')))->format($format)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
If you have multiple tools, you can put them in a ToolChain::
|
|
||||||
|
|
||||||
$tools = new ToolChain([
|
|
||||||
new CurrentTimeToolMetadata(),
|
|
||||||
new CurrentTimeToolExecutor(),
|
|
||||||
]);
|
|
||||||
|
|
||||||
$jsonRpcHandler = new Mcp\Server\JsonRpcHandler(
|
|
||||||
new Mcp\Message\Factory(),
|
|
||||||
[
|
|
||||||
new ToolCallHandler($tools),
|
|
||||||
new ToolListHandler($tools),
|
|
||||||
// Other RequestHandlers ...
|
|
||||||
],
|
|
||||||
[
|
|
||||||
// Other NotificationHandlers ...
|
|
||||||
],
|
|
||||||
new NullLogger()
|
|
||||||
);
|
|
||||||
|
|
||||||
With this metadata and executor, the client can now call the tool.
|
|
||||||
|
|
||||||
Extending the SDK
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
If you want to extend the SDK, you can create your own RequestHandlers and NotificationHandlers.
|
|
||||||
The provided one are very good defaults for most applications but they are not
|
|
||||||
a requirement.
|
|
||||||
|
|
||||||
If you do decide to use them, you get the benefit of having a well-defined interfaces
|
|
||||||
and value objects to work with. They will assure that you follow the `Model Context Protocol`_.
|
|
||||||
specification.
|
|
||||||
|
|
||||||
You also have the Transport abstraction that allows you to create your own transport
|
|
||||||
if none of the standard ones fit your needs.
|
|
||||||
|
|
||||||
.. _`Model Context Protocol`: https://modelcontextprotocol.io/
|
|
||||||
Loading…
Reference in a new issue