模型上下文协议(MCP)是一个专门设计的框架,旨在简化AI代理与各种工具交互的过程。这个启动模板帮助您快速构建一个使用TypeScript的模型上下文协议(MCP)服务器。它提供了一个强大的基础,您可以轻松扩展以创建高级MCP工具,并无缝集成到各种AI平台中。
MCP TypeScript SDK提供了用于构建服务器的核心类:
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server({
name: "mcp-server-starter",
version: "1.0.0",
capabilities: {
tools: {}, // 启用工具功能
resources: {}, // 启用资源访问
prompts: {}, // 启用提示处理
streaming: true // 启用流式响应
}
});
// 连接传输
const transport = new StdioServerTransport();
await server.connect(transport);
通过使用MCP,开发者不再需要复杂的自定义代码来集成新工具或服务。相反,他们构建一个MCP服务器并使其对支持的主机可用。
典型的MCP服务器模板文件布局可能如下所示:
mcp-server/
├── .devcontainer/ # 开发容器配置
│ └── devcontainer.json
├── src/
│ ├── index.ts # MCP服务器主入口点
│ └── examples/ # 示例工具实现
│ ├── calculator.ts # 计算器工具示例
│ └── rest-api.ts # REST API工具示例
├── package.json # 项目配置
└── tsconfig.json # TypeScript配置
.devcontainer目录简化了基于容器的开发,而src/文件夹存放主要服务器逻辑和自定义工具示例。这种结构保持项目组织有序且易于导航。
要为任何支持的客户端安装MCP服务器启动器:
# 对于Claude
npx -y @smithery/cli install @TheSethRose/mcp-server-starter --client claude
# 对于Cursor
npx -y @smithery/cli install @TheSethRose/mcp-server-starter --client cursor
# 对于Windsurf
npx -y @smithery/cli install @TheSethRose/mcp-server-starter --client windsurf
# 对于Cline
npx -y @smithery/cli install @TheSethRose/mcp-server-starter --client cline
# 对于TypeScript
npx -y @smithery/cli install @TheSethRose/mcp-server-starter --client typescript
npm install
此命令获取并安装MCP服务器所需的所有包。npm run build
此命令将您的TypeScript代码编译成JavaScript,准备运行时使用。构建项目:
npm run build
编译您的TypeScript源代码,并为主入口点设置文件权限。
监视模式:
npm run watch
当更改发生时自动重新编译TypeScript文件,适合活跃开发。
带调试器运行:
npm run inspector
启动服务器的同时附带调试工具,让您能够追踪问题、设置断点并在实时环境中检查变量。
MCP工具必须返回特定格式的响应,以确保与AI主机的正确通信。以下是结构:
interface ToolResponse {
content: ContentItem[];
isError?: boolean;
metadata?: Record<string, unknown>;
}
interface ContentItem {
type: string;
text?: string;
mimeType?: string;
data?: unknown;
}
支持的内容类型包括:
text:纯文本内容code:具有可选语言规范的代码片段image:带有MIME类型的Base64编码图像file:带有MIME类型的数据文件error:错误消息(当isError为true时)示例响应:
return {
content: [
{
type: "text",
text: "操作成功完成"
},
{
type: "code",
text: "console.log('Hello, World!')",
mimeType: "application/javascript"
}
]
};
在开发MCP工具时,请遵循以下安全指南:
输入验证:
strict()选项以防止额外属性错误处理:
资源管理:
API安全:
示例安全工具实现:
const SecureSchema = z.object({
input: z.string()
.min(1)
.max(1000)
.transform(str => str.trim())
.pipe(z.string().regex(/^[a-zA-Z0-9\s]+$/))
});
server.tool(
"secure_tool",
SecureSchema.shape,
async (params) => {
try {
// 实现速率限制
await rateLimiter.checkLimit();
// 处理验证过的输入
const result = await processSecurely(params.input);
return {
content: [{
type: "text",
text: result
}]
};
} catch (error) {
// 内部记录错误
logger.error(error);
// 返回安全的错误消息
return {
content: [{
type: "text",
text: "处理您的请求时出现错误"
}],
isError: true
};
}
}
);
MCP支持长时间运行操作的流式响应:
server.tool(
"stream_data",
StreamSchema.shape,
async function* (params) {
for (const chunk of dataStream) {
yield {
content: [{
type: "text",
text: chunk
}]
};
}
}
);
您可以定义专用于特殊数据的自定义内容类型:
interface CustomContent extends ContentItem {
type: "custom";
data: {
format: string;
value: unknown;
};
}
实现适当的异步处理:
server.tool(
"async_operation",
AsyncSchema.shape,
async (params) => {
const operation = await startAsyncOperation();
while (!operation.isComplete()) {
await operation.wait();
}
return {
content: [{
type: "text",
text: await operation.getResult()
}]
};
}
);
使用Jest测试您的工具:
describe('计算器工具', () => {
let server: McpServer;
beforeEach(() => {
server = new McpServer({
name: "test-server",
version: "1.0.
0"
});
registerCalculatorTool(server);
});
test('正确地加法运算', async () => {
const result = await server.executeTool('calculate', {
a: 5,
b: 3,
operation: 'add'
});
expect(result.content[0].text).toBe('8');
});
});
MCP Inspector:
npm run inspector
提供实时检查:
日志记录:
function logMessage(level: 'info' | 'warn' | 'error', message: string) {
console.error(`[${level.toUpperCase()}] ${message}`);
}
错误跟踪:
process.on('uncaughtException', (error: Error) => {
logMessage('error', `未捕获的错误:${error.message}`);
// 实现错误报告
});
MCP支持多种传输协议:
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const transport = new StdioServerTransport();
await server.connect(transport);
import { WebSocketServerTransport } from "@modelcontextprotocol/sdk/server/websocket.js";
const transport = new WebSocketServerTransport({
port: 3000
});
await server.connect(transport);
import { Transport } from "@modelcontextprotocol/sdk/server/transport.js";
class CustomTransport implements Transport {
// 实现传输方法
}
配置服务器能力:
const server = new McpServer({
name: "mcp-server",
version: "1.0.0",
capabilities: {
tools: {}, // 启用工具功能
streaming: true, // 启用流式支持
customContent: ["myFormat"], // 定义自定义内容类型
metadata: true // 启用元数据支持
}
});
此MCP服务器模板开箱即用地支持多个AI平台:
Claude桌面版:
Cursor:
Windsurf:
Cline:
TypeScript:
每个客户端都可以使用相应的Smithery CLI命令进行配置:
npx -y @smithery/cli run @TheSethRose/mcp-server-starter --client [client-name]
将[client-name]替换为claude、cursor、windsurf、cline或typescript之一。
一种方便运行此MCP服务器的方法是通过Smithery,这是一个发现和发布MCP服务器的集中平台。Smithery简化了部署,确保您的服务器可以集成到各种AI工作流中。
您可以立即通过Smithery CLI执行此服务器:
npx -y @smithery/cli@latest run mcp-server-template --config "{}"
Smithery会自动获取、安装并运行服务器的最新版本,只需最少的设置即可。
如果您开发了新的工具或进行了本地修改并希望分享它们,请考虑发布您定制的服务器:
Smithery提供:
更多指导:
Cursor是另一个支持MCP的AI开发环境。要将您的服务器整合到Cursor中:
构建您的服务器:
npm run build
确保生成可执行的index.js文件在build目录中。
在Cursor中,转到 设置 > 功能 > MCP:
添加一个新的MCP服务器。
注册您的服务器:
stdio作为传输类型。名称。node /path/to/your/mcp-server/build/index.js。保存您的配置。
Cursor随后会检测并列出您的工具。在AI辅助编码会话或基于提示的交互期间,每当相关时,它都会调用您的MCP工具。您也可以指示AI按名称使用特定工具。
Claude桌面版提供了一个基于聊天的环境,您可以在其中利用MCP工具。要包含您的服务器:
构建您的服务器:
npm run build
确认没有错误并且主脚本生成在build中。
修改 claude_desktop_config.json:
{
"mcpServers": {
"mcp-server": {
"command": "node",
"args": [
"/path/to/your/mcp-server/build/index.js"
]
}
}
}
提供指向您的编译主文件的路径以及任何附加参数。
重启Claude桌面版以加载新配置。
当您与Claude桌面版互动时,现在它可以调用您注册的MCP工具。如果用户的请求与您的任何工具的功能相符,Claude将提示使用该工具。
npm run inspector
这有助于您:
有关MCP生态系统进一步的信息,请参阅:
通过遵循此模板和最佳实践,您可以快速构建一个强大的MCP服务器,将您的工具开放给广泛的AI主机。这种扩展方法确保了更容易的维护、更好的类型安全性以及在利用现代AI系统功能时的流畅用户体验。
模板由Seth Rose创建: