mcpField
M
mcp-builder

mcp-builder

github.com/shareai-lab开发79.7k109 次安装5 天前更新
代码仓库

关于 mcp-builder

面向开发者的 MCP 服务构建指南,适用于将外部服务接入 Claude。内容包括 Python 和 TypeScript 环境设置、服务模式、测试及实现实践。

主要功能

  1. 01Python 与 TypeScript 项目模板
  2. 02暴露工具、资源和提示词
  3. 03API 与数据库集成模式
  4. 04使用 MCP Inspector 或 JSON-RPC 测试

适用场景

  1. 01启动 Python 或 TypeScript MCP 服务
  2. 02向 Claude 暴露 API 或数据库操作
  3. 03测试服务工具与资源

MCP 相关

指导开发者构建 MCP 服务,向 Claude 等 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. 幂等性:工具应支持安全重试

评论

支持 Markdown