Python MCP Server Boilerplateは、Model Context Protocol (MCP)に準拠したPythonサーバーを簡単に作成するためのテンプレートリポジトリです。
このプロジェクトは、MCPサーバーの基本的な実装を提供し、独自のツールを簡単に追加できるようにします。Model Context Protocol (MCP)は、LLMとサーバー間の通信プロトコルで、LLMに外部APIやサービスへのアクセス、リアルタイムデータの取得、アプリケーションやローカルシステムの制御などの機能を提供します。
-
MCPサーバーの基本実装
- JSON-RPC over stdioベースで動作
- ツールの登録と実行のためのメカニズム
- エラーハンドリングとロギング
-
サンプルツール
- システム情報を取得するツール
- 現在の日時を取得するツール
- エコーツール(入力されたテキストをそのまま返す)
-
拡張性
- 独自のツールを簡単に追加可能
- 外部モジュールからのツール登録をサポート
# uvがインストールされていない場合は先にインストール
# curl -LsSf https://astral.sh/uv/install.sh | sh
# 依存関係のインストール
uv syncuv run python -m src.mainオプションを指定する場合:
uv run python -m src.main --name "my-mcp-server" --version "1.0.0" --description "My MCP Server"python -m src.mainオプションを指定する場合:
python -m src.main --name "my-mcp-server" --version "1.0.0" --description "My MCP Server"Cline/CursorなどのAIツールでMCPサーバーを使用するには、mcp_settings.jsonファイルに以下のような設定を追加します:
"my-mcp-server": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/mcp-server-python-boilerplate",
"python",
"-m",
"src.main"
],
"env": {},
"disabled": false,
"alwaysAllow": []
}/path/to/mcp-server-python-boilerplateは、このリポジトリのインストールディレクトリに置き換えてください。
src/example_tool.pyを参考に、独自のツールを実装します。
def register_my_tools(server):
# ツールの登録
server.register_tool(
name="my_tool",
description="My custom tool",
input_schema={
"type": "object",
"properties": {
"param1": {
"type": "string",
"description": "Parameter 1",
},
},
"required": ["param1"],
},
handler=my_tool_handler,
)
def my_tool_handler(params):
# ツールの実装
param1 = params.get("param1", "")
# 処理を実装
result = f"Processed: {param1}"
return {
"content": [
{
"type": "text",
"text": result,
}
]
}src/main.pyに以下のコードを追加して、ツールを登録します:
from .my_tools import register_my_tools
# MCPサーバーの作成
server = MCPServer()
# サンプルツールの登録
register_example_tools(server)
# 独自のツールの登録
register_my_tools(server)別のPythonモジュールにツールを実装し、コマンドライン引数で指定することもできます:
python -m src.main --module myapp.toolsこの場合、myapp/tools.pyには以下のような関数を実装します:
def register_tools(server):
# ツールの登録
server.register_tool(...)システム情報を取得します。
{
"jsonrpc": "2.0",
"method": "get_system_info",
"params": {},
"id": 1
}現在の日時を取得します。
{
"jsonrpc": "2.0",
"method": "get_current_time",
"params": {
"format": "%Y-%m-%d %H:%M:%S"
},
"id": 2
}入力されたテキストをそのまま返します。
{
"jsonrpc": "2.0",
"method": "echo",
"params": {
"text": "Hello, MCP!"
},
"id": 3
}ツールを設計する際は、以下の点を考慮してください:
- ツールの目的と機能を明確にする
- 入力パラメータとその型を定義する
- 出力フォーマットを決定する
- エラーケースを考慮する
ツールを実装する際は、以下のパターンに従ってください:
def my_tool_handler(params):
try:
# パラメータの取得と検証
param1 = params.get("param1")
if not param1:
raise ValueError("param1 is required")
# 処理の実装
result = process_data(param1)
# 結果の返却
return {
"content": [
{
"type": "text",
"text": result,
}
]
}
except Exception as e:
# エラーハンドリング
return {
"content": [
{
"type": "text",
"text": f"Error: {str(e)}",
}
],
"isError": True,
}ツールを登録する際は、以下のパターンに従ってください:
server.register_tool(
name="my_tool", # ツール名
description="My custom tool", # ツールの説明
input_schema={ # 入力スキーマ
"type": "object",
"properties": {
"param1": {
"type": "string",
"description": "Parameter 1",
},
},
"required": ["param1"],
},
handler=my_tool_handler, # ハンドラ関数
)このプロジェクトはMITライセンスの下で公開されています。詳細はLICENSEファイルを参照してください。