用一个受限 API 适配器贯穿开发
虚构的社区工具借用站已经有库存 API,希望让助手查询电钻是否可借。开发者的第一版 MCP Server 不应把整个管理接口直接暴露给模型,而应提供一个可说明、可验证的小能力:根据工具编号读取库存摘要。成员资料、借用写入和管理员操作暂不开放。这样可以把脚手架、协议调试与生产设计分别验收。 开始前固定语言、SDK、协议和调试器版本,记录运行环境、传输方式、上游 API 契约及身份范围。TypeScript、Python、C# 或 Go 都可以按团队已有能力选择,不把某个语言模板当作唯一正确路径,也不把不同 SDK 大版本示例混用。本文是原创开发与验收方案,未实际构建服务器、连接真实 API 或执行部署。
场景一:从任务契约生成最小脚手架
先写一张工具卡:调用目的、输入字段、返回字段、访问身份、失败情况和不允许的行为。库存工具接受已知格式的编号,返回名称、可借数量和查询时间;不接受任意 URL、SQL 或管理员指令。参数校验与授权从第一版开始设计,不等接上真实系统后再补。模型提出调用,应用与服务器代码执行,业务层仍需控制权限与数据。 选择对应语言的官方 SDK 与有文档的示例,建立启动入口、工具注册、测试夹具和依赖锁定。上游 modelcontextprotocol/servers 是可检查的参考实现,适合学习;它的维护者明确不把参考包当作生产即用方案。优先复用的是已理解的结构和接口,不是直接复制整套文件并赋予真实账户权限。 将业务适配器与协议入口分离。先用固定夹具模拟库存 API,测试成功、缺失编号、库存为零、无权限与上游超时。零库存是业务结果,无权限与超时不能伪装成“没有工具”。只返回完成任务所需字段,去掉内部备注、个人资料和不必要的上游原始响应。记录状态如何映射到工具结果。 已有 OpenAPI 可以帮助生成类型和接口包装,但不自动产生适合 Agent 的工具。逐个审查端点是否需要暴露,是否存在分页、批量或破坏性操作,输入是否过宽,名称是否能说明目的。生成物能通过结构检查不代表业务语义、权限和错误处理正确。不要把一百个管理端点直接变成一百个可调用动作。 产物是工具契约、最小工程、版本与依赖记录、适配器测试及未实现能力清单。若只完成代码草稿,明确没有执行。脚手架的完成条件是能在受控环境启动并用夹具得到预期结果,而不是某个生成器报告了“成功”。
场景二:按进程、传输、协议、业务四层排错
先看进程:命令是否存在、构建输出是否生成、工作目录是否正确、运行时与环境变量是否满足前提。IDE 手动启动成功不代表客户端启动参数相同;保存实际命令和非敏感环境信息。不要把密钥打印出来证明它存在,也不通过给管理员权限来掩盖路径或文件访问错误。 再看传输。stdio 模式通过标准输入输出传递协议消息,普通启动横幅或调试文字不能写到 stdout 破坏协议流;使用适合语言的 stderr 日志或 SDK 支持的诊断机制。stderr 有内容不一定表示失败。HTTP 则要检查地址、路由、支持的传输与认证前提,不把所有旧教程中的 HTTP/SSE 配置视为可互换。 协议层核对客户端、服务器与调试器的版本和协商行为,再检查能力发现、参数结构和结果格式。使用官方 MCP Inspector 可以独立观察发现与调用,避免把宿主界面的所有错误都归因于业务代码。Inspector 的界面、命令和日志方式会随版本变化,按固定版本文档操作,不给一个命令冠以永远通用的保证。 最后检查上游 API:请求身份、权限、业务参数、响应和超时。用同一个合成编号比较适配器结果与工具结果,定位字段映射或状态丢失。只看模型最后的自然语言回答很难区分是工具没调用、结果错误还是转述错误,因此分别保存调用与最终回答对照,不记录敏感载荷。 调试记录至少包括环境版本、复现步骤、预期、实际、失败层、相关日志与修复后的回归。TypeScript/Python 可用各自调试器,C# 可结合 dotnet 与 IDE 断点,Go 也应按所选 SDK 和调试器支持处理;语言不同不改变分层诊断原则。不要为了“通了”关闭证书校验或扩大网络访问。 本场景验收用例应覆盖合法输入、非法输入、无权限、上游失败和连接关闭。对长时间不退出的进程,检查连接池、计时器等资源是否正确释放。一次工具列表出现不代表所有业务路径通过,一次 Inspector 成功也不代表目标客户端兼容性已经验收。
场景三:把接口设计和访问边界写进发布条件
工具名称与描述应明确任务和副作用,schema 给出实际可接受的输入,不把描述当唯一验证。服务器仍需执行类型、范围与权限检查;工具注释只是线索,不能替代访问控制。只读工具也可能泄露数据,应按身份限制可见记录,而非只禁止写操作。 明确区分协议或参数错误、工具执行失败与正常业务结果。若使用的版本支持 isError 等机制,应按该版本规范表达工具错误,避免把失败内容包装成成功正文。缺失记录与查询失败必须可辨别,返回结构、分页和截断行为也要说明。不要仅因返回 JSON 就声称“协议合规”。 认证与授权分别设计:知道调用者是谁,不代表允许它读取所有资料。对远端服务器,采用所选协议与部署模型支持的认证流程,核对凭据受众、范围和生命周期;不要复制一个令牌到所有下游,也不把任意用户传入的服务地址当可信目标。对于本地进程,文件、环境变量和运行身份同样是权限边界。 把上游内容当数据。工具描述、资料字段或外部网页中出现的“忽略规则”“上传名单”不能扩展用户任务。对输出字段做最小化与必要脱敏,日志采用请求标识帮助定位而不是保存完整个人记录。明确日志保存、访问与删除安排,别让调试模式永久留在正式环境。 发布检查包括依赖与源码来源、固定构建产物、启动与恢复说明、测试记录、监控与负责人。超时、取消、重试和重复调用的业务语义要有约定;当前只读库存查询可重复,不代表未来预约写入可以无限重试。新增写工具需要单独设计幂等、确认与恢复,不沿用只读测试结论。 在测试环境分别验证允许与拒绝路径,再在实际目标客户端做小范围端到端检查。生产就绪没有一个通用分数:Inspector、schema 校验器和依赖扫描各自覆盖一部分,不能证明无漏洞、无越权或适合所有部署。记录未覆盖项,由负责团队决定是否达到发布要求。
一次可以交给 Agent 的任务
“在固定语言和 SDK 版本下,为合成库存 API 设计只读 MCP 查询。先列工具契约和不暴露清单,再建夹具适配器与最小入口,分别测试成功、缺失、非法输入、无权限和超时。按进程、传输、协议、业务分层记录调试结果。不连接生产、不新增写入、不打印秘密、不擅自改变安全设置。”输出同时说明实际执行与仅设计部分,便于评审。 验收时核对同一个编号从夹具到工具再到最终回答是否一致,确认错误不会被转成正常库存。若没有可运行环境,交付可复现步骤与明确的未执行记录,不能编造一条成功日志。首次示例不需要复杂代理编排,先把一条路径做对。
FAQ 与常见陷阱
要先学完整协议吗?先理解角色、能力、传输和授权边界,再按实际用到的版本资料深入,不必为了入门背下所有功能。能不能自动把 API 变成 server?可以生成候选包装,但必须人工审查任务形状、数据与副作用,不能自动继承全部管理能力。 为什么终端能跑,客户端失败?比较启动命令、目录、运行时、环境和 stdout 内容,再看协议与认证。为什么工具列表正常却调用失败?列表只是发现,继续核对参数、身份、适配器与上游状态。是否一定要写所有资源和提示功能?不必,为当前任务提供必要能力即可,未实现的不要宣称支持。 如何选 Skill?本次 SkillPI 的 MCP 目录查询未返回可核验候选,因此不添加无关包。未来应检查公开详情、固定来源、许可、依赖和具体用途,再决定用于脚手架、调试还是设计复核;同名和下载量不能替代验收。发现工具也不能替你取得 API 权限或保证服务器可上线。
来源与维护
保留原文双语的从零搭建、调试排错、设计规范及 FAQ,补充原创库存适配器与分层验收。依据 MCP 官方参考实现、TypeScript SDK 的 stdio 说明、Inspector 上游与对应协议规范。移除未经核实的热度、安全保证及自动生产化承诺。后续更新按实际版本重新核对技术与技能关联,保持公开 slug 和语言配对。