mcp-builder について
MCP サーバー構築を扱う開発者向けスキルガイドです。Claude に外部サービスを接続するための Python と TypeScript の設定、実装パターン、テスト方法を説明します。
主な機能
- 01Python と TypeScript の設定テンプレート
- 02ツール・リソース・プロンプトの公開
- 03API とデータベースの連携パターン
- 04MCP Inspector または JSON-RPC によるテスト
活用シーン
- 01Python または TypeScript で MCP サーバーを開始
- 02API やデータベース操作を Claude に公開
- 03サーバーのツールとリソースをテスト
MCP 対応
Claude などの MCP クライアントにツール、リソース、プロンプトを提供する MCP サーバーの構築方法を案内します。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ shareai-lab/ learn-claude-code --skill mcp-builderインストール後、Claude Code で/mcp-builderを入力して読み込まれたか確認します。
詳細
MCP サーバー構築スキル
MCP(Model Context Protocol)サーバーの構築に関する専門知識を習得しました。MCP を使用すると、Claude は標準化されたプロトコルを通じて外部サービスとやり取りできます。
MCP とは?
MCP サーバーが公開するもの:
- ツール:Claude が呼び出せる関数(API エンドポイントなど)
- リソース:Claude が読み取れるデータ(ファイルやデータベースのレコードなど)
- プロンプト:あらかじめ作成されたプロンプトテンプレート
クイックスタート:Python MCP サーバー
1. プロジェクトのセットアップ
# Create project
mkdir my-mcp-server && cd my-mcp-server
python3 -m venv venv && source venv/bin/activate
# Install MCP SDK
pip install mcp
2. 基本的なサーバーテンプレート
#!/usr/bin/env python3
"""my_server.py - A simple MCP server"""
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
# Create server instance
server = Server("my-server")
# Define a tool
@server.tool()
async def hello(name: str) -> str:
"""Say hello to someone.
Args:
name: The name to greet
"""
return f"Hello, {name}!"
@server.tool()
async def add_numbers(a: int, b: int) -> str:
"""Add two numbers together.
Args:
a: First number
b: Second number
"""
return str(a + b)
# Run server
async def main():
async with stdio_server() as (read, write):
await server.run(read, write)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
3. Claude への登録
~/.claude/mcp.json に追加します:
{
"mcpServers": {
"my-server": {
"command": "python3",
"args": ["/path/to/my_server.py"]
}
}
}
TypeScript MCP サーバー
1. セットアップ
mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk
2. テンプレート
// src/index.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server({
name: "my-server",
version: "1.0.0",
});
// Define tools
server.setRequestHandler("tools/list", async () => ({
tools: [
{
name: "hello",
description: "Say hello to someone",
inputSchema: {
type: "object",
properties: {
name: { type: "string", description: "Name to greet" },
},
required: ["name"],
},
},
],
}));
server.setRequestHandler("tools/call", async (request) => {
if (request.params.name === "hello") {
const name = request.params.arguments.name;
return { content: [{ type: "text", text: `Hello, ${name}!` }] };
}
throw new Error("Unknown tool");
});
// Start server
const transport = new StdioServerTransport();
server.connect(transport);
高度なパターン
外部 API との統合
import httpx
from mcp.server import Server
server = Server("weather-server")
@server.tool()
async def get_weather(city: str) -> str:
"""Get current weather for a city."""
async with httpx.AsyncClient() as client:
resp = await client.get(
f"https://api.weatherapi.com/v1/current.json",
params={"key": "YOUR_API_KEY", "q": city}
)
data = resp.json()
return f"{city}: {data['current']['temp_c']}C, {data['current']['condition']['text']}"
データベースへのアクセス
import sqlite3
from mcp.server import Server
server = Server("db-server")
@server.tool()
async def query_db(sql: str) -> str:
"""Execute a read-only SQL query."""
if not sql.strip().upper().startswith("SELECT"):
return "Error: Only SELECT queries allowed"
conn = sqlite3.connect("data.db")
cursor = conn.execute(sql)
rows = cursor.fetchall()
conn.close()
return str(rows)
リソース(読み取り専用データ)
@server.resource("config://settings")
async def get_settings() -> str:
"""Application settings."""
return open("settings.json").read()
@server.resource("file://{path}")
async def read_file(path: str) -> str:
"""Read a file from the workspace."""
return open(path).read()
テスト
# Test with MCP Inspector
npx @anthropics/mcp-inspector python3 my_server.py
# Or send test messages directly
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | python3 my_server.py
ベストプラクティス
- 明確なツールの説明:Claude はこれを参考に、ツールを呼び出すタイミングを判断します
- 入力の検証:入力を必ず検証し、サニタイズします
- エラー処理:意味のあるエラーメッセージを返します
- デフォルトで非同期:I/O 操作には async/await を使用します
- セキュリティ:認証なしで機密性の高い操作を公開しないでください
- 冪等性:ツールは安全に再試行できるようにします
コメント
Markdown 対応