为什么需要自己开发 MCP Server?
Model Context Protocol (MCP) 统一了大语言模型与本地/远程工具的交互规范。通过编写自定义 MCP Server,你可以让 Claude、Cursor 或 Windsurf 安全地执行本地脚本、查询专属数据库或调度内部 API。
本文将带你从零实现一个轻量、实用的 TypeScript MCP Server。
1. 项目初始化与依赖安装
创建新目录并安装官方 SDK:
mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node tsx
npx tsc --init
确保 tsconfig.json 中启用 moduleResolution: "bundler" 或 "node16"。
2. 编写 MCP Server 核心代码
创建 src/index.ts:
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { z } from "zod";
const server = new Server(
{ name: "system-toolset", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
// 定义工具列表
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "get_system_stats",
description: "获取当前宿主机的内存使用率与系统运行时间",
inputSchema: {
type: "object",
properties: {},
},
},
],
};
});
// 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "get_system_stats") {
const os = await import("node:os");
const totalMem = (os.totalmem() / 1024 / 1024 / 1024).toFixed(2);
const freeMem = (os.freemem() / 1024 / 1024 / 1024).toFixed(2);
return {
content: [
{
type: "text",
text: `操作系统: ${os.type()} ${os.release()}\n总内存: ${totalMem} GB\n可用内存: ${freeMem} GB\n运行时间: ${Math.floor(os.uptime() / 60)} 分钟`,
},
],
};
}
throw new Error(`未知工具: ${request.params.name}`);
});
// 使用 stdio 传输
async function run() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("System Toolset MCP Server running on stdio");
}
run().catch((err) => {
console.error("运行失败:", err);
process.exit(1);
});
3. 在 Claude Desktop 中注册
编辑 claude_desktop_config.json:
{
"mcpServers": {
"system-stats": {
"command": "npx",
"args": ["-y", "tsx", "c:/doc/code/my-mcp-server/src/index.ts"]
}
}
}
重启 Claude Desktop,点击右下角锤子图标,即可看到 get_system_stats 工具已生效!
4. 关键注意事项
- 切勿向 stdout 输出非协议日志:MCP stdio 依赖标准输出传递 JSON-RPC 消息,任何
console.log都会破坏协议通信;请一律使用console.error进行调试输出。 - 严格参数校验:使用 Zod 对工具输入进行安全校验,防范路径遍历与恶意注入。