名称: mcp-sdk-typescript-bootstrapper 描述: 使用官方TypeScript SDK引导MCP(模型上下文协议)服务器。创建包含传输层、工具、资源和适当错误处理的完整服务器实现。 允许工具: 读取, 写入, 编辑, Bash, Glob, Grep
MCP SDK TypeScript 引导器
使用官方TypeScript SDK引导生产就绪的MCP服务器,包含适当的传输配置、工具/资源处理程序和安全最佳实践。
功能
- 使用TypeScript SDK生成MCP服务器项目
- 配置stdio、SSE或WebSocket传输
- 搭建工具和资源处理程序
- 设置适当的错误处理和验证
- 配置能力声明
- 实施安全最佳实践
使用方式
当您需要时调用此技能:
- 从头创建新的MCP服务器
- 为现有项目添加MCP功能
- 搭建工具和资源实现
- 配置MCP传输层
输入参数
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| serverName | 字符串 | 是 | MCP服务器名称(kebab-case格式) |
| description | 字符串 | 是 | 客户端显示的服务器描述 |
| transport | 字符串 | 否 | stdio、sse或websocket(默认:stdio) |
| tools | 数组 | 否 | 要搭建的工具列表 |
| resources | 数组 | 否 | 要提供的资源列表 |
| capabilities | 对象 | 否 | 服务器能力声明 |
工具定义结构
{
"tools": [
{
"name": "read_file",
"description": "读取文件内容",
"inputSchema": {
"type": "object",
"properties": {
"path": { "type": "string", "description": "要读取的文件路径" }
},
"required": ["path"]
}
}
]
}
资源定义结构
{
"resources": [
{
"uriTemplate": "file:///{path}",
"name": "文件资源",
"description": "访问文件内容",
"mimeType": "text/plain"
}
]
}
输出结构
<serverName>/
├── package.json
├── tsconfig.json
├── .gitignore
├── README.md
├── src/
│ ├── index.ts # 服务器入口点
│ ├── server.ts # MCP服务器设置
│ ├── transport/
│ │ ├── stdio.ts # Stdio传输
│ │ ├── sse.ts # SSE传输(如选择)
│ │ └── websocket.ts # WebSocket传输(如选择)
│ ├── tools/
│ │ ├── index.ts # 工具注册表
│ │ └── <tool>.ts # 单个工具处理程序
│ ├── resources/
│ │ ├── index.ts # 资源注册表
│ │ └── <resource>.ts # 资源提供者
│ ├── prompts/
│ │ └── index.ts # 提示模板(可选)
│ └── utils/
│ ├── validation.ts # 输入验证助手
│ ├── errors.ts # MCP错误处理
│ └── logging.ts # 结构化日志
├── tests/
│ ├── tools/
│ └── resources/
└── mcp.json # MCP服务器清单
生成的代码模式
服务器设置 (src/server.ts)
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { registerTools } from './tools';
import { registerResources } from './resources';
export async function createServer() {
const server = new McpServer({
name: '<serverName>',
version: '1.0.0',
});
// 注册能力
registerTools(server);
registerResources(server);
return server;
}
export async function startServer() {
const server = await createServer();
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('[MCP] 服务器已在stdio上启动');
}
工具处理程序 (src/tools/<name>.ts)
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
const inputSchema = z.object({
path: z.string().describe('要读取的文件路径'),
});
export function registerReadFileTool(server: McpServer) {
server.tool(
'read_file',
'读取文件内容',
inputSchema.shape,
async (args) => {
const { path } = inputSchema.parse(args);
try {
// 实现
const content = await readFile(path, 'utf-8');
return {
content: [{ type: 'text', text: content }],
};
} catch (error) {
throw new McpError(
ErrorCode.InternalError,
`读取文件失败: ${error.message}`
);
}
}
);
}
资源提供者 (src/resources/<name>.ts)
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
export function registerFileResource(server: McpServer) {
server.resource(
'file:///{path}',
'文件资源',
'通过路径访问文件内容',
async (uri) => {
const path = uri.pathname;
const content = await readFile(path, 'utf-8');
return {
contents: [{
uri: uri.href,
mimeType: 'text/plain',
text: content,
}],
};
}
);
}
依赖项
{
"dependencies": {
"@modelcontextprotocol/sdk": "^1.0.0",
"zod": "^3.22.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"typescript": "^5.0.0",
"vitest": "^1.0.0"
}
}
传输配置
Stdio(默认)
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const transport = new StdioServerTransport();
SSE(HTTP服务器发送事件)
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
import express from 'express';
const app = express();
app.get('/sse', (req, res) => {
const transport = new SSEServerTransport('/message', res);
server.connect(transport);
});
WebSocket
import { WebSocketServerTransport } from '@modelcontextprotocol/sdk/server/websocket.js';
import { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ port: 3000 });
wss.on('connection', (ws) => {
const transport = new WebSocketServerTransport(ws);
server.connect(transport);
});
工作流程
- 验证输入 - 检查服务器名称、工具/资源定义
- 创建项目结构 - 设置文件夹和基础文件
- 生成package.json - 配置依赖项
- 生成tsconfig.json - TypeScript配置
- 创建服务器入口 - 主服务器设置
- 生成传输层 - 选定的传输实现
- 搭建工具 - 带有模式的工具处理程序
- 搭建资源 - 资源提供者
- 创建实用工具 - 验证、错误、日志
- 设置测试 - 工具/资源的测试结构
应用的最佳实践
- 所有输入的Zod模式验证
- 适当的MCP错误代码和消息
- 结构化日志记录到stderr
- 工具/资源的清晰分离
- TypeScript严格模式
- 全面的错误处理
- 输入清理
参考资料
- MCP TypeScript SDK: https://github.com/modelcontextprotocol/typescript-sdk
- MCP规范: https://modelcontextprotocol.io/
- MCP服务器示例: https://github.com/modelcontextprotocol/servers
目标流程
- mcp-server-bootstrap
- mcp-tool-implementation
- mcp-resource-provider
- mcp-transport-layer