MCPビルダー
モデル コンテキスト プロトコル サーバーの構築、ツールの定義、およびクロード スキルが信頼できる評価スイートの作成に関するエージェント スキル マニュアル。
出典: anthropics/skills (MIT) を基にしたコンテンツ。
概要
LLM が適切に設計されたツールを通じて外部サービスと対話できるようにする MCP (モデル コンテキスト プロトコル) サーバーを作成します。 MCP サーバーの品質は、LLM が現実世界のタスクをどの程度実行できるかによって測定されます。
プロセス
高レベルのワークフロー
高品質の MCP サーバーの作成には、次の 4 つの主要なフェーズが含まれます。
フェーズ 1: 綿密な調査と計画
1.1 最新の MCP 設計を理解する
API カバレッジとワークフロー ツール: 包括的な API エンドポイントの範囲と、専用のワークフロー ツールのバランスをとります。ワークフロー ツールは特定のタスクにさらに便利であり、包括的な対応によりエージェントは柔軟に業務を組み立てることができます。パフォーマンスはクライアントによって異なります。基本的なツールを組み合わせたコード実行から恩恵を受けるクライアントもあれば、より高レベルのワークフローでより適切に動作するクライアントもあります。不確かな場合は、包括的な API の範囲を優先してください。
ツールの命名と見つけやすさ:
明確で説明的なツール名は、エージェントが適切なツールをすばやく見つけるのに役立ちます。一貫したプレフィックス (github_create_issue、github_list_reposなど) とアクション指向の名前を使用します。
コンテキスト管理: エージェントは、ツールの簡潔な説明と結果のフィルタリング/ページネーション機能の恩恵を受けます。焦点を絞った関連性の高いデータを返す設計ツール。一部のクライアントは、エージェントがデータを効率的にフィルタリングおよび処理できるようにするコード実行をサポートしています。
対処可能なエラー メッセージ: エラー メッセージは、具体的な提案と次のステップを含む解決策にエージェントを導く必要があります。
1.2 MCP プロトコルのドキュメントの調査
MCP 仕様に移動します:
サイトマップから始めて関連ページを見つけます:https://modelcontextprotocol.io/sitemap.xml
次に、マークダウン形式の.mdサフィックスを持つ特定のページをフェッチします (例:https://modelcontextprotocol.io/specification/draft.md)。
確認すべき主なページ:
- 仕様の概要とアーキテクチャ
- トランスポート メカニズム (ストリーミング可能な HTTP、stdio)
- ツール、リソース、およびプロンプトの定義
1.3 学習フレームワークの文書化
推奨スタック:
- 言語: TypeScript (高品質の SDK サポートと、MCPB などの多くの実行環境での優れた互換性。さらに、AI モデルは TypeScript コードの生成に優れており、幅広い用途、静的型指定、優れた lint ツールの恩恵を受けています)
- トランスポート: ステートレス JSON を使用した、リモート サーバー用のストリーミング可能な HTTP (ステートフル セッションやストリーミング応答とは対照的に、拡張と維持が簡単です)。ローカルサーバーの標準入出力。
フレームワークのドキュメントをロードします:
- MCP のベスト プラクティス: ベスト プラクティスを表示 - コア ガイドライン
TypeScript の場合 (推奨):
- TypeScript SDK: WebFetch を使用して
https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/main/README.mdをロードします - TypeScript ガイド - TypeScript のパターンと例
Python の場合:
- Python SDK: WebFetch を使用して
https://raw.githubusercontent.com/modelcontextprotocol/python-sdk/main/README.mdをロードします - Python ガイド - Python のパターンと例
1.4 実装を計画する
API を理解する: サービスの API ドキュメントを参照して、主要なエンドポイント、認証要件、データ モデルを特定します。必要に応じて Web 検索と WebFetch を使用します。
ツールの選択: 包括的な API カバレッジを優先します。最も一般的な操作から始めて、実装するエンドポイントをリストします。
フェーズ 2: 実装
2.1 プロジェクト構造のセットアップ
プロジェクトのセットアップについては、言語固有のガイドを参照してください。
- TypeScript ガイド - プロジェクト構造、package.json、tsconfig.json
- Python ガイド - モジュールの構成、依存関係
2.2 コアインフラストラクチャの実装
共有ユーティリティを作成します。
- 認証付きAPIクライアント
- エラー処理ヘルパー
- 応答のフォーマット (JSON/Markdown)
- ページネーションのサポート
2.3 ツールの実装
各ツールについて:
入力スキーマ:
- Zod (TypeScript) または Pydantic (Python) を使用する
- 制約と明確な説明を含める
- フィールドの説明に例を追加する
出力スキーマ:
- 構造化データに対して可能な場合は
outputSchemaを定義します - ツールの応答で
structuredContentを使用する (TypeScript SDK 機能) - クライアントがツールの出力を理解し、処理できるように支援します
ツールの説明:
- 機能の簡潔な概要
- パラメータの説明
- 戻り値の型スキーマ
実装:
- I/O 操作の非同期/待機
- アクション可能なメッセージによる適切なエラー処理
- 該当する場合、ページネーションをサポートする
- 最新の SDK を使用する場合は、テキスト コンテンツと構造化データの両方を返します
注釈:
readOnlyHint: true/falsedestructiveHint: true/falseidempotentHint: true/falseopenWorldHint: true/false
フェーズ 3: レビューとテスト
3.1 コードの品質
レビュー:
- 重複コードなし (DRY 原則)
- 一貫したエラー処理
- 完全なタイプカバレッジ
- 明確なツールの説明
3.2 ビルドとテスト
タイプスクリプト:
npm run buildを実行してコンパイルを確認します- MCP Inspector でテスト:
npx @modelcontextprotocol/inspector
パイソン:
- 構文を確認します:
python -m py_compile your_server.py - MCP Inspector を使用したテスト
詳細なテスト手法と品質チェックリストについては、言語固有のガイドを参照してください。
フェーズ 4: 評価の作成
MCP サーバーを実装した後、その有効性をテストするための包括的な評価を作成します。
完全な評価ガイドラインについては、評価ガイド をロードしてください。
4.1 評価目的の理解
評価を使用して、LLM が MCP サーバーを効果的に使用して、現実的で複雑な質問に答えることができるかどうかをテストします。
4.2 10 個の評価質問を作成する
効果的な評価を作成するには、評価ガイドに概説されているプロセスに従ってください。
- ツール検査: 利用可能なツールをリストし、その機能を理解します。
- コンテンツ探索: 読み取り専用操作を使用して、利用可能なデータを探索します
- 質問の生成: 10 個の複雑で現実的な質問を作成します。
- 回答の検証: 各質問を自分で解いて答えを検証します。
4.3 評価要件
各質問が次のとおりであることを確認してください。
- 独立: 他の質問には依存しません
- 読み取り専用: 非破壊操作のみが必要です
- 複雑: 複数のツール呼び出しと詳細な調査が必要
- 現実的: 人間が関心を持つ実際のユースケースに基づいています
- 検証可能: 文字列比較によって検証できる単一の明確な回答
- 安定: 時間が経っても答えは変わりません
4.4 出力フォーマット
次の構造の XML ファイルを作成します。
<evaluation>
<qa_pair>
<question>Find discussions about AI model launches with animal codenames. One model needed a specific safety designation that uses the format ASL-X. What number X was being determined for the model named after a spotted wild cat?</question>
<answer>3</answer>
</qa_pair>
<!-- More qa_pairs... -->
</evaluation>参照ファイル
ドキュメントライブラリ
開発中に必要に応じて次のリソースをロードします。
コア MCP ドキュメント (最初にロード)
- MCP プロトコル:
https://modelcontextprotocol.io/sitemap.xmlのサイトマップから開始し、.mdサフィックスを持つ特定のページをフェッチします - MCP ベスト プラクティス - 以下を含むユニバーサル MCP ガイドライン
- サーバーとツールの命名規則
- 応答形式のガイドライン (JSON とマークダウン)
- ページネーションのベストプラクティス
- トランスポートの選択 (ストリーミング可能な HTTP と標準入出力)
- セキュリティとエラー処理の標準
SDK ドキュメント (フェーズ 1/2 中のロード)
- Python SDK:
https://raw.githubusercontent.com/modelcontextprotocol/python-sdk/main/README.mdからフェッチ - TypeScript SDK:
https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/main/README.mdからフェッチ
言語固有の実装ガイド (フェーズ 2 中のロード)
-
Python 実装ガイド - 以下を含む完全な Python/FastMCP ガイド
- サーバーの初期化パターン
- Pydantic モデルの例
@mcp.toolでのツール登録- 完全な動作例
- 品質チェックリスト
-
TypeScript 実装ガイド - 以下を含む完全な TypeScript ガイド
- プロジェクトの構造
- Zod スキーマ パターン
server.registerToolでのツール登録- 完全な動作例
- 品質チェックリスト
評価ガイド (フェーズ 4 中の負荷)
- 評価ガイド - 以下を含む完全な評価作成ガイド:
- 質問作成ガイドライン
- 回答検証戦略
- XMLフォーマットの仕様
- 質問と回答の例
- 提供されたスクリプトを使用して評価を実行する
リソースファイル
ライセンス.txt
バイナリリソース
参考/評価.md
バイナリリソース
参照/mcp_best_practices.md
リファレンス/mcp_best_practices.md をダウンロード
バイナリリソース
参照/node_mcp_server.md
リファレンス/node_mcp_server.mdをダウンロード
バイナリリソース
参照/python_mcp_server.md
リファレンス/python_mcp_server.mdをダウンロード
バイナリリソース
スクリプト/connections.py
"""Lightweight connection handling for MCP servers."""
from abc import ABC, abstractmethod
from contextlib import AsyncExitStack
from typing import Any
from mcp import ClientSession, StdioServerParameters
from mcp.client.sse import sse_client
from mcp.client.stdio import stdio_client
from mcp.client.streamable_http import streamablehttp_client
class MCPConnection(ABC):
"""Base class for MCP server connections."""
def __init__(self):
self.session = None
self._stack = None
@abstractmethod
def _create_context(self):
"""Create the connection context based on connection type."""
async def __aenter__(self):
"""Initialize MCP server connection."""
self._stack = AsyncExitStack()
await self._stack.__aenter__()
try:
ctx = self._create_context()
result = await self._stack.enter_async_context(ctx)
if len(result) == 2:
read, write = result
elif len(result) == 3:
read, write, _ = result
else:
raise ValueError(f"Unexpected context result: {result}")
session_ctx = ClientSession(read, write)
self.session = await self._stack.enter_async_context(session_ctx)
await self.session.initialize()
return self
except BaseException:
await self._stack.__aexit__(None, None, None)
raise
async def __aexit__(self, exc_type, exc_val, exc_tb):
"""Clean up MCP server connection resources."""
if self._stack:
await self._stack.__aexit__(exc_type, exc_val, exc_tb)
self.session = None
self._stack = None
async def list_tools(self) -> list[dict[str, Any]]:
"""Retrieve available tools from the MCP server."""
response = await self.session.list_tools()
return [
{
"name": tool.name,
"description": tool.description,
"input_schema": tool.inputSchema,
}
for tool in response.tools
]
async def call_tool(self, tool_name: str, arguments: dict[str, Any]) -> Any:
"""Call a tool on the MCP server with provided arguments."""
result = await self.session.call_tool(tool_name, arguments=arguments)
return result.content
class MCPConnectionStdio(MCPConnection):
"""MCP connection using standard input/output."""
def __init__(self, command: str, args: list[str] = None, env: dict[str, str] = None):
super().__init__()
self.command = command
self.args = args or []
self.env = env
def _create_context(self):
return stdio_client(
StdioServerParameters(command=self.command, args=self.args, env=self.env)
)
class MCPConnectionSSE(MCPConnection):
"""MCP connection using Server-Sent Events."""
def __init__(self, url: str, headers: dict[str, str] = None):
super().__init__()
self.url = url
self.headers = headers or {}
def _create_context(self):
return sse_client(url=self.url, headers=self.headers)
class MCPConnectionHTTP(MCPConnection):
"""MCP connection using Streamable HTTP."""
def __init__(self, url: str, headers: dict[str, str] = None):
super().__init__()
self.url = url
self.headers = headers or {}
def _create_context(self):
return streamablehttp_client(url=self.url, headers=self.headers)
def create_connection(
transport: str,
command: str = None,
args: list[str] = None,
env: dict[str, str] = None,
url: str = None,
headers: dict[str, str] = None,
) -> MCPConnection:
"""Factory function to create the appropriate MCP connection.
Args:
transport: Connection type ("stdio", "sse", or "http")
command: Command to run (stdio only)
args: Command arguments (stdio only)
env: Environment variables (stdio only)
url: Server URL (sse and http only)
headers: HTTP headers (sse and http only)
Returns:
MCPConnection instance
"""
transport = transport.lower()
if transport == "stdio":
if not command:
raise ValueError("Command is required for stdio transport")
return MCPConnectionStdio(command=command, args=args, env=env)
elif transport == "sse":
if not url:
raise ValueError("URL is required for sse transport")
return MCPConnectionSSE(url=url, headers=headers)
elif transport in ["http", "streamable_http", "streamable-http"]:
if not url:
raise ValueError("URL is required for http transport")
return MCPConnectionHTTP(url=url, headers=headers)
else:
raise ValueError(f"Unsupported transport type: {transport}. Use 'stdio', 'sse', or 'http'")スクリプト/評価.py
バイナリリソース
スクリプト/example_evaluation.xml
スクリプトをダウンロード/example_evaluation.xml
バイナリリソース
スクリプト/要件.txt
スクリプト/requirements.txt をダウンロード
anthropic>=0.39.0
mcp>=1.1.0
クロードスキルのドキュメント