MCP 服务器开发
本章将带你深入了解如何构建一个 MCP Server(服务器)。你可以根据自己的技术栈选择 Node.js (TypeScript) 或 Python。
开发前言
MCP 服务器的主要任务是向 MCP 客户端(如 Claude Desktop)公开:
- Tools(工具):可执行的动作。
- Resources(资源):暴露的数据(文件、数据库等)。
- Prompts(提示词):预设的交互模板。
选项 A:使用 Node.js / TypeScript 开发
这是目前的官方推荐选择,社区插件最丰富。
1. 环境搭建
# 创建并进入目录
mkdir my-mcp-server && cd my-mcp-server
npm init -y
# 安装核心 SDK 和开发工具
npm install @modelcontextprotocol/sdk
npm install -D typescript @types/node
npx tsc --init
2. 编写最简代码 (index.ts)
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { ListToolsRequestSchema, CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";
const server = new Server(
{ name: "MyNodeServer", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
// 定义工具
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [{
name: "ping",
description: "简单的连接测试",
inputSchema: { type: "object", properties: {} }
}]
}));
// 调用工具
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "ping") {
return { content: [{ type: "text", text: "Pong!" }] };
}
throw new Error("Tool not found");
});
// 使用标准输入输出启动
const transport = new StdioServerTransport();
await server.connect(transport);
选项 B:使用 Python 开发
Python SDK 同样由官方维护,非常适合做数据分析、机器学习相关的 MCP 插件。
1. 环境搭建
# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 安装 MCP SDK
pip install mcp
2. 编写最简代码 (server.py)
import asyncio
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
server = Server("MyPythonServer")
# 定义工具列表
@server.list_tools()
async def list_tools():
return [
Tool(
name="ping",
description="简单的连接测试",
inputSchema={"type": "object", "properties": {}}
)
]
# 定义工具调用逻辑
@server.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "ping":
return [TextContent(type="text", text="Pong from Python!")]
raise ValueError(f"Unknown tool: {name}")
async def main():
# 建立 Stdio 连接
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream, server.create_initialization_options())
if __name__ == "__main__":
asyncio.run(main())
调试与配置
无论哪种语言开发的服务器,配置到 Claude Desktop 的方式都是一致的。
1. 获取运行命令
- Node.js: 需要先
tsc编译成 JS,然后node dist/index.js。 - Python: 通常是
python /path/to/server.py。
2. 修改配置文件
在 %APPDATA%\Claude\claude_desktop_config.json (Windows) 中添加:
{
"mcpServers": {
"my-node-server": {
"command": "node",
"args": ["D:/proj/my-mcp-server/dist/index.js"]
},
"my-python-server": {
"command": "python",
"args": ["D:/proj/my-mcp-server/server.py"]
}
}
}
小结
- ✅ Node.js 和 Python 都可以开发完美的 MCP 服务器或客户端。
- ✅ 服务器 (Server) 负责提供能力,客户端 (Client) 负责消费能力。
- ✅ 通信核心:通常使用 Stdio(标准输入输出)进行最直接的本地进程间通信。
练习
- 尝试使用 Python 编写一个可以读取当前系统时间的 MCP 工具。
- 尝试使用 Node.js 编写一个能够读取本地 JSON 文件的 MCP 资源。