关于 mcp-builder
面向开发者的 MCP 服务构建指南,适用于将外部服务接入 Claude。内容包括 Python 和 TypeScript 环境设置、服务模式、测试及实现实践。
主要功能
- 01Python 与 TypeScript 项目模板
- 02暴露工具、资源和提示词
- 03API 与数据库集成模式
- 04使用 MCP Inspector 或 JSON-RPC 测试
适用场景
- 01启动 Python 或 TypeScript MCP 服务
- 02向 Claude 暴露 API 或数据库操作
- 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
最佳实践
- 清晰的工具描述:Claude 会根据这些描述判断何时调用工具
- 输入验证:始终验证并清理输入
- 错误处理:返回有意义的错误消息
- 默认使用异步:对 I/O 操作使用 async/await
- 安全性:未经身份验证,切勿公开敏感操作
- 幂等性:工具应支持安全重试
评论
支持 Markdown