模型上下文协议(Model Context Protocol,MCP)是连接AI代理与真实能力的插头。与其让每个客户端各自发明调用工具的方式,不如让MCP服务器通过标准的JSON-RPC 2.0接口,向外界公布一系列工具、资源和提示词。任何MCP客户端——无论是Claude Code、Cursor,还是基于Claude Agent SDK构建的代理——都能发现并调用这些能力。
这种标准化正是MCP的核心价值,但危险也藏在这里:一旦你暴露了一个工具,就等于把一根杠杆交到了语言模型手里,让它可以在你的系统上施加影响。在三个项目中,我构建了一个服务器,将另一个服务器按客户端权限进行了收缩,还写了一个扫描器来捕捉错误。以下是我认为真正重要的经验。
![]()
构建服务器:传输层比看起来简单
我的第一个服务器casebook-mcp,把AgentPostmortem(一个记录AI代理故障的公开注册表)变成了代理在调查过程中可以查询的资源。思路是这样的:每个调试代理事故的团队,都在重新发现别人已经写过的故障模式。于是这个服务器暴露了四个工具:search_cases(排序全文搜索)、get_case(完整案例详情)、similar_failures(将事故描述与语料库匹配)和list_tags(标签列表)。
这里的教训是:你不需要一个重量级框架。我直接针对2025-03-26版本的流式HTTP规范,以无状态模式实现了传输层:一个POST /mcp端点处理initialize、tools/list和tools/call。没有会话,没有Durable Objects,没有认证——因为数据是公开且只读的。它运行在Cloudflare Worker上,协议路由在一个文件里,纯排序逻辑在另一个文件里(独立单元测试),数据层则访问实时的agentpostmortem.com API,带五分钟内存缓存,离线时回退到捆绑数据集。每IP每分钟60次请求的轻量限流让它保持礼貌。你可以用一条curl命令对tools/list做冒烟测试,再用一条claude mcp add --transport http命令把它加到Claude Code里。
一个回报丰厚的分离:把搜索和相似度排序做成纯函数,意味着我可以在完全不启动传输层的情况下测试核心逻辑。MCP协议处理是样板代码,你真正的价值在工具实现里,所以要把它们隔离出来。
收缩服务器:不是每个客户端都该看到每个工具
公开只读数据是简单情形。难的是面向公司真实系统的服务器。Bridgekit正是这样的:它向AI技术栈暴露Shopify、Triple Whale和Postgres,四个工具中有三个是读取(shopify_orders、triplewhale_metrics、针对白名单表的db_query),一个是写入(shopify_tag_order)。
我最在意的设计决策是:作用域在发现阶段就强制执行,而不仅仅在调用时。客户端在secret中配置为JSON,每个包含名称、允许的工具列表和allowWrite标志。当客户端调用tools/list时,服务器只公布该客户端被允许使用的工具。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.