mcpField
M
mcp-builder

mcp-builder

github.com/shareai-lab開発79.7k109 回インストール6 日前に更新
リポジトリ

mcp-builder について

MCP サーバー構築を扱う開発者向けスキルガイドです。Claude に外部サービスを接続するための Python と TypeScript の設定、実装パターン、テスト方法を説明します。

主な機能

  1. 01Python と TypeScript の設定テンプレート
  2. 02ツール・リソース・プロンプトの公開
  3. 03API とデータベースの連携パターン
  4. 04MCP Inspector または JSON-RPC によるテスト

活用シーン

  1. 01Python または TypeScript で MCP サーバーを開始
  2. 02API やデータベース操作を Claude に公開
  3. 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

ベストプラクティス

  1. 明確なツールの説明:Claude はこれを参考に、ツールを呼び出すタイミングを判断します
  2. 入力の検証:入力を必ず検証し、サニタイズします
  3. エラー処理:意味のあるエラーメッセージを返します
  4. デフォルトで非同期:I/O 操作には async/await を使用します
  5. セキュリティ:認証なしで機密性の高い操作を公開しないでください
  6. 冪等性:ツールは安全に再試行できるようにします

コメント