はじめに
少し前までは、MCPサーバ用のSDKにPHP版は存在していませんでした。
しかし先月、PHP向けのMCPサーバSDKが開発されることが発表されました。
こちらが開発中のリポジトリです。
いくつかサンプルコード(Example)が公開されていたので、この記事ではサンプルコードを参考に実際にMCPサーバの作成を試してみようと思います。
試してみる
今回は動作確認が目的のため、挨拶を返すだけのシンプルなツールを定義したMCPサーバを作成してみます。
通信方式にはSTDIOを使用します。
mcp/sdk のインストール
まずはmcp/sdkをcomposerでインストールします。
現状stableが出ていないため、"minimum-stability": "dev"と"prefer-stable": trueを入れてインストールを行いました。
{
"require": {
"mcp/sdk": "dev-main"
},
"minimum-stability": "dev",
"prefer-stable": true
}
MCPサーバ作成
プロジェクト構成は以下です。
Project
├ src
└ GreetingMcpElements.php
├ vendor
└ mcp/sdk
├ composer.json
└ server.src
以下の2ファイルを作成していきます。
- GreetingMcpElements.php:MCPツールの定義ファイル
- server.src:MCPサーバのエントリーポイント
ツールの定義
まずはGreetingMcpElements.phpにツールを定義しましょう。
#[McpTool]アトリビュートを付与することで、MCPサーバにツールであることを認識させることができます。
<?php
declare(strict_types=1);
namespace Koya\McpSdk;
use Mcp\Capability\Attribute\McpTool;
class GreetingMcpElements
{
#[McpTool(name: 'greet', description: 'Greets a user in Japanese')]
public function greet(string $name): string
{
return "こんにちは!, {$name}! 私は挨拶をするMCPです!.";
}
}
エントリーポイントの作成
続いて、MCPサーバのエントリーポイントを作成しましょう。
例を見るとserver.phpという名前が多いので倣っています。
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use Mcp\Server;
use Mcp\Server\Transport\StdioTransport;
$server = Server::builder()
->setServerInfo('Greeting MCP Server', '1.0.0')
->setDiscovery(__DIR__, ['.', 'src'])
->build();
$transport = new StdioTransport();
$server->run($transport);
Server::builderでMCPサーバの定義をします。setDiscovery()では、ツールが定義されているディレクトリを指定しておきます。のちの処理で#[McpTool]アトリビュートを付与したメソッドを検索し、それをツールとして認識するようです。
$transportはStdioやsseなどの通信方式を指定するために利用されます。
動作確認
作成できたので、動作確認をしましょう。
VScodeのCopilotChatで検証をしてみます。
まずはmcp.jsonに今回作成したMCPサーバを定義します。
{
"servers": {
"greeting-php-mcp": {
"command": "php",
"args": [
"C:\\Path\\to\\your\\project\\mcp-sdk\\server.php"
]
}
},
"inputs": []
}
その後、チャットをしてみたところ、無事に呼び出すことができました!
おわりに
今回は開発中のMCPサーバSDKをPHPで試してみました。
アトリビュートでツールを簡潔に定義できるのは、他の言語と同様に便利ですね。
また、既存のAPIをMCPツールとして公開したいということもあると思うので、その場合どうすればいいのかなどは今後検証してみたいと思います。
ここまでご覧いただき、ありがとうございました!
