MCPサーバーパターン
Model Context Protocol(MCP)は、AIアシスタントがサーバー上のツールを呼び出したり、リソースを読み取ったり、プロンプトを使用したりできるようにします。このスキルは、MCPサーバーの構築や保守時に使用します。SDKのAPIは進化するため、現在のメソッド名やシグネチャについては、Context7(「MCP」でquery-docs)または公式のMCPドキュメントを確認してください。
機能をルール、スキル、MCP、または単純なCLI/APIワークフローのどれで実装するかという広範なルーティング判断については、docs/capability-surface-selection.mdを参照してください。
使用するタイミング
以下の場合に使用します:新しいMCPサーバーの実装、ツールやリソースの追加、stdioとHTTPの選択、SDKのアップグレード、MCPの登録やトランスポートの問題のデバッグ。
仕組み
コアコンセプト
- ツール: モデルが呼び出せるアクション(例:検索、コマンド実行)。SDKのバージョンに応じて、
registerTool()またはtool()で登録します。 - リソース: モデルが取得できる読み取り専用データ(例:ファイル内容、APIレスポンス)。
registerResource()またはresource()で登録します。ハンドラーは通常uri引数を受け取ります。 - プロンプト: クライアントが表示できる再利用可能なパラメータ化されたプロンプトテンプレート(例:Claude Desktop)。
registerPrompt()などで登録します。 - トランスポート: ローカルクライアント(例:Claude Desktop)向けのstdio。リモート(Cursor、クラウド)ではStreamable HTTPが推奨されます。レガシーHTTP/SSEは後方互換性のためです。
Node/TypeScript SDKは tool() / resource() または registerTool() / registerResource() を公開する場合があります。公式SDKは時間とともに変化しています。必ず現在のMCPドキュメントまたはContext7で確認してください。
stdioでの接続
ローカルクライアントの場合、stdioトランスポートを作成し、サーバーのconnectメソッドに渡します。正確なAPIはSDKのバージョンによって異なります(例:コンストラクタ vs ファクトリ)。現在のパターンについては、公式MCPドキュメントを参照するか、Context7で「MCP stdio server」をクエリしてください。
サーバーロジック(ツール+リソース)はトランスポートから独立させ、エントリポイントでstdioまたはHTTPをプラグインできるようにします。
リモート(Streamable HTTP)
Cursor、クラウド、その他のリモートクライアントには、Streamable HTTP(現在の仕様では単一のMCP HTTPエンドポイント)を使用します。レガシーHTTP/SSEは、後方互換性が必要な場合にのみサポートします。
例
インストールとサーバー設定
npm install @modelcontextprotocol/sdk zod
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
const server = new McpServer({ name: "my-server", version: "1.0.0" });
ツールとリソースは、お使いのSDKバージョンが提供するAPIを使用して登録します。一部のバージョンでは server.tool(name, description, schema, handler)(位置引数)を使用し、他のバージョンでは server.tool({ name, description, inputSchema }, handler) または registerTool() を使用します。リソースも同様で、APIが提供する場合はハンドラーに uri を含めます。コピーペーストのエラーを避けるため、現在の @modelcontextprotocol/sdk のシグネチャについては公式MCPドキュメントまたはContext7を確認してください。
入力バリデーションにはZod(またはSDKが推奨するスキーマ形式)を使用します。
ベストプラクティス
- スキーマファースト: すべてのツールに入力スキーマを定義し、パラメータと戻り値の形状を文書化します。
- エラー: モデルが解釈できる構造化エラーまたはメッセージを返し、生のスタックトレースは避けます。
- 冪等性: 可能な限り冪等なツールを優先し、リトライが安全になるようにします。
- レートとコスト: 外部APIを呼び出すツールについては、レート制限とコストを考慮し、ツールの説明に文書化します。
- バージョン管理: package.jsonでSDKのバージョンを固定し、アップグレード時にはリリースノートを確認します。
公式SDKとドキュメント
- JavaScript/TypeScript:
@modelcontextprotocol/sdk(npm)。現在の登録およびトランスポートパターンについては、ライブラリ名「MCP」でContext7を使用します。 - Go: GitHub上の公式Go SDK(
modelcontextprotocol/go-sdk)。 - C#: .NET用の公式C# SDK。