尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MCP服务器生成器:基于统一示例构建AI集成应用

MCP服务器生成器:基于统一示例构建AI集成应用 1. 项目概述一个为AI时代而生的MCP服务器生成器如果你正在开发基于大语言模型LLM的应用比如智能助手、数据分析工具或者自动化工作流那你一定对如何让AI“理解”你的私有数据和业务逻辑感到头疼。传统的做法要么是把所有数据一股脑塞进提示词Prompt要么是费时费力地编写复杂的API集成代码。Model Context ProtocolMCP的出现就是为了解决这个核心痛点——它定义了一套标准协议让AI助手如Claude Desktop、Cursor等能够安全、动态地访问外部工具、数据和能力。然而从零开始构建一个功能完备、架构清晰的MCP服务器对于大多数开发者来说依然是个不小的挑战。你需要处理协议细节、设计工具Tools和资源Resources的架构、实现不同的传输层如Stdio、HTTP还要确保代码的可维护性和可扩展性。这正是mcp-server-generator或者说create-mcp要解决的问题。它不是一个简单的脚手架而是一个“开箱即用”的生产级MCP服务器生成器其核心价值在于提供了一个统一、完整、可直接投入生产的示例而非一堆零散的演示代码。我最欣赏它的一点是它摒弃了“玩具项目”的思路。很多类似的工具生成的例子功能单一、结构松散你很难从中学习到如何组织一个真实的、包含多种交互模式如工具调用、资源访问、提示词模板的服务器。而这个生成器直接给你一个功能强大的“数据分析助手”作为蓝本里面集成了数据探索、采样、交互式引导Elicitation等高级功能。更关键的是它最近加入了强大的组件扩展能力这意味着你不仅可以基于这个高质量的起点快速开始还能像搭积木一样通过命令行轻松地为现有项目添加新的工具、资源、服务等极大地提升了开发效率和项目的可维护性。接下来我将带你深入拆解这个工具的设计哲学、核心功能以及如何最大化地利用它来构建你自己的AI集成应用。2. 核心设计哲学与架构解析2.1 为什么是“统一示例”而非“分散演示”在接触过不少代码生成工具后我发现一个通病它们倾向于生成多个独立的、功能单一的小例子。比如一个calculator例子展示工具调用一个file-reader例子展示资源访问。这种模式对于快速理解某个孤立概念有帮助但当你需要构建一个实际产品时你会面临巨大的整合成本。各个示例之间的代码风格、项目结构、配置方式可能都不一致你需要花费大量时间将它们糅合在一起并解决由此产生的架构冲突。mcp-server-generator的设计者显然意识到了这个问题。它的核心设计哲学是“通过一个完整的应用来教授所有概念”。它生成的“数据分析助手”项目本身就是一个微型的、但功能齐全的AI赋能数据分析平台。在这个项目中你会看到工具Tools的协同>npx mcp-server-generator my-ai-assistant --transport both这个命令会执行以下操作创建项目目录在当前文件夹下生成my-ai-assistant/。复制模板文件将内置的所有模板文件包含完整的“数据分析助手”示例复制到新目录。处理模板变量将项目名my-ai-assistant填充到package.json、README.md等文件的相应位置。安装依赖自动运行npm install安装modelcontextprotocol/sdk、express、typescript、zod等所有必要的依赖包。生成配置文件创建tsconfig.json、mcp-inspector.config.json等开发配置。整个过程大约需要1-2分钟取决于你的网络速度。完成后进入项目目录。cd my-ai-assistant第二步快速验证与探索生成器贴心地提供了“一键查看所有”的脚本让你立刻对项目能力有个全局认识。npm run quick:test这个命令会依次列出项目中所有可用的工具、资源和提示词。你应该能看到8个工具、9个资源和3个提示词的详细列表包括它们的名称、描述和参数结构。这是验证生成是否成功的最快方式。第三步理解项目骨架花几分钟浏览一下生成的项目结构重点看src/目录src/ ├── server.ts # 应用主入口非常简洁 ├── core/ # 核心协议逻辑 ├── transports/ # Stdio和HTTP通信层 ├── tools/ # 所有工具实现 │ ├── index.ts # 工具注册中心 │ ├──>npm run dev:http:stateless这个命令会以无状态模式启动HTTP服务器通常在本地的3000端口。无状态模式更适合Inspector因为它不依赖会话持久化。终端2启动Inspector并连接npm run inspector:config -- --server my-ai-assistant-http这个脚本利用了项目根目录下的mcp-inspector.config.json配置文件它已经定义好了如何连接到我们刚刚启动的本地服务器。Inspector会在浏览器中打开一个交互界面。在Inspector的UI中你可以在“Tools”标签页看到所有可用的工具点击任何一个如># 确保服务器在运行 (npm run dev:http:stateless) # 然后在另一个终端运行 npx modelcontextprotocol/inspectorlatestInspector CLI会引导你配置服务器连接。选择 “HTTP/SSE” 方式URL填写http://localhost:3000/sse然后就可以进入同样的UI界面。避坑指南如果Inspector连接失败首先检查服务器是否成功启动终端1有无报错并确认端口是否被占用。其次确保Inspector的版本与MCP SDK兼容。生成器通常会自动安装兼容的版本。如果遇到协议错误可以尝试在src/transports/http-transport.ts中临时增加调试日志查看收到的原始请求。3.3 核心工具深度剖析以>// 这是一个简化的示例展示其思路 const inputSchema z.object({ data: z.array(z.record(z.any())).describe(要分析的数据集JSON数组格式), analysis_type: z.enum([exploratory, descriptive, diagnostic, predictive, prescriptive]).describe(分析类型), sampling_strategy: z.enum([random, stratified, ai-representative, /*...*/]).optional().describe(采样策略), enable_elicitation: z.boolean().optional().describe(是否启用交互式引导), });这个模式不仅定义了类型还通过.describe()提供了对AI友好的描述帮助LLM理解每个参数的用途。2. 多方法路由与业务逻辑整合在工具的handler函数中你会看到一个清晰的逻辑分发结构async handler({ analysis_type, data, sampling_strategy, enable_elicitation }) { // 1. 数据预处理与采样 let sample data; if (sampling_strategy) { // 调用独立的采样服务 sample await samplingService.generate(data, sampling_strategy); } // 2. 根据分析类型选择方法论 let result; switch (analysis_type) { case exploratory: result await this.performExploratoryAnalysis(sample); break; case descriptive: result await this.performDescriptiveAnalysis(sample); break; // ... 其他类型 } // 3. 交互式引导集成 if (enable_elicitation) { const sessionId await elicitationService.startSession({ initialData: sample, analysisGoal: analysis_type, }); result.elicitation_session_id sessionId; result.suggested_questions elicitationService.getSuggestedQuestions(sessionId); } return { content: [{ type: text, text: JSON.stringify(result, null, 2) }], }; }这个设计展示了良好的实践工具作为协调者它自己不处理复杂逻辑而是调用专门的services/下的服务模块。这使得代码更易测试和维护也体现了“单一职责原则”。3. 与AI的协作模式这个工具的设计鼓励一种“人机协作”的分析流程。AI可以直接调用它进行快速分析。先调用generate-sample工具获取一个有代表性的数据子集再将其作为输入传给>npx mcp-server-generator add tool weather-query --description 根据城市名称查询实时天气信息CLI会启动一个交互式流程它会确认当前目录是一个有效的MCP项目。它会询问一些工具的具体配置例如工具名称你已经通过参数提供了weather-query它会建议使用weatherQuery作为函数名。参数列表CLI会引导你定义参数。对于天气查询我们可能需要city字符串必填和unit枚举celsius或fahrenheit可选默认celsius。是否需要异步操作是的因为需要网络请求。简要的功能描述用于生成工具内部的注释和AI描述。第二步查看生成的文件命令执行成功后你会看到以下输出✅ Successfully added tool weather-query! Created: src/tools/weather-query-tool.ts Updated: src/tools/index.ts Tool is now registered and ready to use.打开src/tools/weather-query-tool.ts你会发现一个已经骨架完整的工具文件import { z } from \zod\; import { Tool } from \modelcontextprotocol/sdk/server.js\; const inputSchema z.object({ city: z.string().describe(\要查询天气的城市名称例如Beijing, Shanghai\), unit: z.enum([\celsius\, \fahrenheit\]).optional().default(\celsius\).describe(\温度单位摄氏度或华氏度\), }); export const weatherQueryTool: Tool { name: \weather-query\, description: \根据城市名称查询实时天气信息\, inputSchema: inputSchema, async handler({ city, unit }) { // TODO: 实现天气查询逻辑 // 1. 调用外部天气API例如 OpenWeatherMap // 2. 处理API响应 // 3. 格式化返回结果 const mockResult { city, temperature: unit \celsius\ ? \22°C\ : \71.6°F\, condition: \Sunny\, humidity: \65%\, wind: \10 km/h\, unit, }; return { content: [{ type: \text\, text: Weather in ${city}: ${mockResult.temperature}, ${mockResult.condition}. Humidity: ${mockResult.humidity}, Wind: ${mockResult.wind} }], }; }, };CLI已经为我们生成了符合MCP SDK规范的TypeScript代码包括Zod模式定义、工具描述和一个返回模拟数据的handler框架。第三步实现业务逻辑现在我们需要替换掉模拟数据连接真实的天气API。这里以OpenWeatherMap为例你需要先注册获取API Key。安装HTTP客户端如axios或node-fetchnpm install axios修改src/tools/weather-query-tool.ts的handler函数import axios from \axios\; async handler({ city, unit }) { const API_KEY process.env.OPENWEATHER_API_KEY; // 从环境变量读取 if (!API_KEY) { throw new Error(\OpenWeatherMap API key is not configured.\); } try { const response await axios.get( https://api.openweathermap.org/data/2.5/weather?q${encodeURIComponent(city)}appid${API_KEY}unitsmetric ); const tempC response.data.main.temp; const temperature unit \celsius\ ? ${tempC.toFixed(1)}°C : ${(tempC * 9/5 32).toFixed(1)}°F; const condition response.data.weather[0].description; const humidity ${response.data.main.humidity}%; const wind ${response.data.wind.speed} m/s; return { content: [{ type: \text\, text: Current weather in ${city}: ${temperature}, ${condition}. Humidity: ${humidity}, Wind Speed: ${wind}. }], }; } catch (error: any) { // 更友好的错误处理 if (error.response?.status 404) { return { content: [{ type: \text\, text: City \${city}\ not found. Please check the spelling. }], isError: true, }; } throw new Error(Failed to fetch weather: ${error.message}); } }在项目根目录创建.env文件添加你的API KeyOPENWEATHER_API_KEYyour_api_key_here并确保在代码中通过dotenv或类似方式加载生成的项目通常已配置好。第四步测试新工具重新构建并启动服务器npm run build npm run dev:http:stateless在MCP Inspector的Tools标签页中你应该能看到新添加的weather-query工具。输入城市名如“London”进行测试。通过这个简单的例子你就能体会到add命令的强大之处。它自动化了项目中最繁琐、最容易出错的部分——文件创建、基础代码生成和注册表更新让你可以专注于实现核心业务逻辑。4. 高级配置、部署与问题排查实录4.1 传输层配置详解生成的项目支持多种运行模式理解其配置对于部署至关重要。Stdio模式与Claude Desktop集成这是MCP最典型的用法。你需要创建一个Claude Desktop可以读取的配置文件。构建你的服务器首先将TypeScript代码编译成JavaScript。npm run build这会在项目根目录生成dist/文件夹。创建Claude Desktop配置在Claude Desktop的MCP配置目录通常是~/Library/Application Support/Claude/claude_desktop_config.json或%APPDATA%/Claude/claude_desktop_config.json中添加你的服务器配置。{ \mcpServers\: { \my-ai-assistant\: { \command\: \node\, \args\: [ \/absolute/path/to/your/my-ai-assistant/dist/server.js\, \--transport\, \stdio\ ], \env\: { \NODE_ENV\: \production\ } } } }注意args中的路径必须是绝对路径。重启Claude Desktop后你的工具就应该在聊天界面中可用了。HTTP服务器配置与安全HTTP模式让你可以构建一个独立的API服务。关键配置在src/core/config.ts中管理export interface ServerConfig { transport: stdio | http | both; httpPort: number; // 默认 3000 enableOAuth: boolean; // 是否启用OAuth保护 oauthClientId?: string; oauthClientSecret?: string; stateless: boolean; // 是否无状态推荐用于Inspector调试 corsOrigin: string; // CORS允许的源 disableDnsRebindingProtection: boolean; // 在可信网络内可关闭 }生产环境部署如果你将HTTP服务器暴露到公网务必启用OAuth。你需要设置enableOAuth: true并提供有效的oauthClientId和oauthClientSecret。MCP Inspector和你的客户端在连接时都需要提供Bearer Token。CORS配置如果你的前端应用运行在不同的域名或端口需要正确设置corsOrigin。无状态模式stateless: true意味着服务器不保存任何会话状态。这对于水平扩展和调试非常友好但某些需要会话持续性的复杂工具可能受影响。生成器默认的示例工具都是无状态友好的。4.2 性能优化与监控生成的服务器内置了基础的健康检查和状态监控工具server-status但对于生产环境你可能需要更多。1. 添加日志与监控结构化日志项目已使用src/utils/logger.ts建议将其从简单的控制台输出升级为使用winston或pino库支持JSON格式、日志级别和输出到文件/日志服务。指标收集考虑集成prom-client来暴露Prometheus格式的指标如请求次数、延迟、错误率便于使用Grafana监控。2. 连接池与资源管理如果你的工具需要连接数据库或外部API务必在服务层src/services/实现连接池避免为每个请求创建新连接。例如创建一个database.service.ts来管理数据库连接生命周期。3. 错误处理与重试MCP工具调用可能会失败。在工具的handler函数中除了基本的try-catch对于依赖外部API的操作应实现指数退避的重试逻辑并使用断路器模式如opossum库防止级联故障。4.3 常见问题排查速查表在实际开发和部署中你可能会遇到以下问题。这里是我踩过坑后总结的排查思路问题现象可能原因排查步骤与解决方案MCP Inspector 连接失败1. 服务器未启动或端口被占。2. 传输协议不匹配。3. CORS 问题仅HTTP。1. 检查终端是否有错误用lsof -i :3000查看端口占用。2. 确认Inspector连接配置的URL正确Stdio用命令HTTP用http://localhost:3000/sse。3. 检查服务器CORS配置临时设置为*测试。Claude Desktop 中看不到工具1. 配置文件路径错误。2. 命令执行失败。3. Claude Desktop 未重启或缓存。1. 确认claude_desktop_config.json路径和其中command的绝对路径正确。2. 在终端手动运行配置中的命令看能否启动。3. 彻底重启Claude Desktop或查看其日志位置因系统而异。工具调用返回协议错误1. 工具返回的格式不符合MCP规范。2. Zod输入验证失败。3. 异步操作未正确处理。1. 确保handler返回{ content: [{ type: \text\, text: \...\ }] }格式。2. 在Inspector中检查发送的参数是否完全匹配Zod Schema。3. 确保handler是async函数且所有异步操作都正确await。add命令报错“Not a valid MCP project”1. 不在项目根目录。2.package.json中缺少modelcontextprotocol/sdk依赖。3. 项目结构被大幅修改。1. 确保在包含package.json的目录下运行命令。2. 运行npm list modelcontextprotocol/sdk确认已安装。3. 检查src/tools/index.ts等注册表文件是否存在且结构正常。HTTP 服务器启动后立即退出1. 端口被占用。2. 依赖项缺失或版本冲突。3. TypeScript 编译错误。1. 更换httpPort配置。2. 删除node_modules和package-lock.json重新npm install。3. 运行npm run build查看TypeScript编译错误并修复。工具运行缓慢或超时1. 外部API响应慢。2. 同步阻塞了事件循环。3. 内存泄漏。1. 为外部调用设置合理的超时如使用axios的timeout配置。2. 检查是否有JSON.stringify大数据集或复杂同步计算考虑流式处理或分页。3. 使用Node.js内置分析器或clinic.js进行性能剖析。4.4 从开发到生产部署考量当你准备将MCP服务器部署到生产环境时有几个关键点需要注意1. 进程管理不要直接用node dist/server.js运行。使用进程管理器如PM2、systemd或容器编排平台如K8s来保证高可用。# 使用PM2示例 npm install -g pm2 pm2 start dist/server.js --name \mcp-server\ -- --transporthttp pm2 save pm2 startup2. 环境变量与机密管理永远不要将API密钥、数据库密码等硬编码在代码中。使用.env文件开发和环境变量生产管理。生成的项目通常已集成dotenv在开发模式读取.env文件。在生产环境通过Docker的--env-file、K8s的Secret或云平台的机密管理服务来注入。3. 版本化与回滚为你的MCP服务器定义版本号在package.json中。当AI助手客户端也支持时可以在MCP握手阶段协商版本确保兼容性。部署流程应支持快速回滚到上一个稳定版本。4. 监控与告警除了基础的server-status工具集成APM工具如OpenTelemetry来追踪跨工具的调用链。为错误率、延迟设置告警。5. 安全加固HTTP模式务必启用OAuth并使用HTTPS通过Nginx反向代理或Node.js的https模块。Stdio模式确保运行Claude Desktop的用户具有最小必要权限配置文件所在目录权限安全。输入验证充分利用Zod Schema进行严格的输入验证和清理防止注入攻击。速率限制对于HTTP接口使用express-rate-limit等中间件防止滥用。mcp-server-generator为你提供了一个坚实、可扩展的起点但将其实施到生产环境需要你根据具体的业务需求、流量规模和安全性要求在上述方面进行相应的加固和优化。它的价值在于让你免于从零搭建架构的困扰从而能将精力集中在实现独特的业务价值上。
返回列表