如何设计更好的 MCP server:54 个工具模式 + AWS 权衡 + 官方最佳实践
如何设计更好的 MCP server:54 个工具模式 + AWS 权衡 + 官方最佳实践
工具写得不好,再强的模型也白搭。
MCP(Model Context Protocol)已经成了 Agent 连接工具的事实标准,但协议只解决了"怎么连"。真正决定 Agent 好不好用的,是工具本身怎么设计。Arcade.dev 做过 8000+ 个生产工具,他们一句话点破:"你的 Agent 只和你的工具一样好。" 描述含糊、错误信息没用、参数太死板——这些才是 Agent 实际翻车的根源。
这篇文章把四份资料整合成一份可落地的设计指南:Arcade 的 54 个工具模式、AWS 的五个设计方法及权衡、MCP 官方生产级最佳实践、以及 awesome-mcp-best-practices 的工具级规范。从工具怎么命名,到服务器怎么架构,到生产怎么运维。
本文提纲
- 核心心智:工具设计是 MCP 缺失的那一层
- 工具设计:命名、描述、Schema、错误
- 两个根问题:Bloat 与 Confusion
- AWS 的五个设计方法(含 6 版演进对照)
- 服务器端架构与生产运维
- 设计检查清单
核心心智:工具设计是 MCP 缺失的那一层
先说清楚问题在哪。
MCP 规范定义了传输、协议、能力发现——这是协议层。但一个 MCP server 暴露什么工具、工具长什么样、报错怎么说,协议完全不管。Arcade 的论点很直接:"working"(能跑)不等于 "agent-usable"(Agent 能用)。 一个返回 429 的工具,对人是正常的(限流了嘛),对 Agent 是灾难——它不知道该怎么办。
四个横切关注点,任何工具都要过一遍:
| 关注点 | 核心问题 |
|---|---|
| Agent 体验 | 描述、参数名、错误、强转——为 LLM 的理解力设计 |
| 安全边界 | "prompt 表达意图,代码执行规则"——认证授权永远在服务端 |
| 错误引导恢复 | 错误要教 Agent 下一步,不只是失败 |
| 工具组合 | 工具要像 Unix 管道一样能链起来,响应结构保持一致 |
再加一个三条轴分类法,决定具体用哪些模式:成熟度(原子操作 → 多步编排)、集成类型(API / 数据库 / 文件系统 / 系统操作)、访问模式(同步 / 异步 / 流式 / 事件驱动)。
工具设计:命名、描述、Schema、错误
命名:camelCase,别让模型猜
awesome-mcp-best-practices 给的工具命名规则很具体:
- ❌ 避免:空格(
get Npm Package Info)、点号(get.Npm.Package.Info)、括号(get(Npm)PackageInfo) - ✅ 推荐:camelCase(
getNpmPackageInfo,首选)、kebab-case、snake_case
理由很实际:非标准命名会干扰 MCP 客户端发现工具,而且 GPT-4o 的 tokenization 对 camelCase 效果最好。
命名别名也很关键。一个 postMessage 工具,用户说"发个 Twitter"或"传张图到 Instagram",LLM 可能根本不会调用它——因为名字和描述没告诉模型这些场景属于它。正确做法是在描述里写全:"Upload, share, and post messages on social media"。
描述:给用例,给注意事项
工具描述是 Agent 决定"该不该调我"的依据,尤其工具多的时候。短描述("Call this function to execute an SQL query")几乎没用。好的描述长这样:
server.tool(
"runSqlQuery",
`Use this tool to execute a single SQL query against a Postgres database.
If you have a temporary branch from a prior step, you MUST:
1. Pass the branch ID to this tool unless explicitly told otherwise
2. Tell the user that you are using the temporary branch with ID [branch_id]
`
);<use_case> 告诉模型什么时候用它,<important_notes> 告诉模型怎么用它才不会出错。
别返回 "not found"。 搜索类工具即使没有精确匹配,也别直接说"没找到"——LLM 会被负面表述带偏,忽略后面有用的信息。改成"这里有相关的可用项:……",让模型自己判断相关性。唯一例外是敏感数据场景(如用户信息),隐私优先于提供替代数据。
Schema:让 Schema 自己说话
AWS 文章对参数设计给了四条实操建议:
- 重命名参数以匹配领域理解,而不是数据库列名。
content_bucket改成resource_class,discipline改成subject。 - 设置默认值为最常见取值,LLM 只指定变化的字段。
- 用枚举(Python
Literal类型),让 Schema 本身传达合法值,而不是靠描述解释。 - 砍掉不常用字段。AWS 的建议是工具参数控制在 8 个以内。
错误:教 Agent 下一步
错误信息是 Agent 恢复的关键。对比两种写法:
- ❌ 原始
429:模型不知道怎么办,只能盲目重试。 - ✅ 可操作错误:"Rate limited, retry after 30 seconds or reduce batch size to 50."——模型直接知道两个选项。
这个原则贯穿所有错误:错误应该教,不只是失败。
两个根问题:Bloat 与 Confusion
AWS 文章给了一个很清晰的诊断框架:MCP 工具表现差,根因几乎都是这两个问题之一。
Bloat(膨胀):每个工具定义都会在每次调用时加载进 LLM 上下文,不管用不用。多个 MCP server 叠加,用户在问任何问题之前上下文就被吃掉一大截。上下文越满,推理越差。
Confusion(混乱):推理退化 → 调错工具、传错参数 → 重试 → 重试又加剧 Bloat。工具之间语义相似、选项太多、命名含糊,都是混乱的来源。讽刺的是,更丰富的描述能缓解混乱,但会加剧膨胀——这是个跷跷板。
上下文工程(context engineering)——塑造 LLM 看到什么、什么时候看到——才是同时治这两个问题的底层功夫。
AWS 的五个设计方法(含 6 版演进对照)
AWS 给出了五个方法,每个都有明确的权衡。他们用同一个 K-12 内容搜索 API(14 个可过滤字段)做了 6 版演进对比,非常直观:
| 版本 | 方法 | 权衡 |
|---|---|---|
| V1 | 原始直通——14 个内部命名参数、一行文档、无合法值 | 定义小,但混乱导致重试和上下文翻腾 |
| V2 | 丰富描述——合法值、同义词映射、引导式错误 | 准确率提升,定义变大(膨胀) |
| V3 | Schema + 默认值——重命名、枚举、默认值、独立详情工具 | 准确率提升,定义变小(用名字和枚举替代长描述) |
| V4 | 懒加载——搜索工具只留短提示,单独 get_taxonomy 工具按需返回合法值 |
基线最省上下文,歧义查询多一次往返 |
| V5 | LLM 内省——introspect_query 工具背后是 Amazon Nova 2 Lite,返回推荐过滤参数 |
处理歧义,但你要付推理费;跨客户端结果稳定 |
| V6 | Agent 即工具——单个 agentic_search_content(question),背后是完整 Agent |
控制力最强,基础设施成本最高;客户端上下文最小 |
方法论提炼:
- 描述与响应:说清楚值是什么意思、自然语言怎么映射。返回只对决策相关的字段(Anthropic 说这样响应 token 能砍约三分之二),提供按需的详情视图。
- Schema 约束:默认值、枚举、重命名、砍字段。
- 重构 + 懒加载:把多功能工具拆成专一的;复杂描述从常驻上下文里拿走,放进按需调用的发现工具(
get_taxonomy)。Anthropic 报告按需加载定义能减少高达 85% 的 token。客户端侧也有对应物:Skills 就是懒加载——相关时才把本地文件读进上下文。 - 服务端推理(内省):加一个内省工具,调用你自己控制的 LLM。客户端模型发自然语言,你的 LLM 解释需求、返回推荐参数值。好处是你自己选模型、自己调 prompt、用黄金查询测试,结果不随客户端模型变化。代价是每次调用要付推理费,但上下文保持精简。
- Agentic Tools:整个 MCP server 背后挂你自己的 Agent,工具变成自然语言端点。客户端说需求,你的 Agent 处理整个交互。控制力最强、跨客户端最一致,但基础设施成本和延迟最高。
怎么选? 没有哪个版本全维度胜出。取决于字段数量、词汇表稳定性、延迟预算、跨客户端一致性需求。V2 是"不重构就最快的准确率提升",V4 是"最省的基线上下文",V5 处理歧义查询,V6 给你最多控制。
服务器端架构与生产运维
MCP 官方最佳实践补上了服务器端的视角。
架构三原则:
- 单一职责:每个 MCP server 一个清晰目的。别做"mega-server",拆成数据库 server、文件 server、API 网关 server、邮件 server。可维护、可独立扩展、故障隔离、团队归属清晰。
- 纵深防御:网络(本地绑定 127.0.0.1、防火墙、VPN)→ 认证(JWT)→ 授权(细粒度 capability ACL)→ 输入校验(严格 schema)→ 输出清洗 → 审计日志。用装饰器组合:
@authenticate、@authorize、@validate_input、@sanitize_output。 - Fail-Safe 设计:熔断器(阈值 + 恢复超时)、带 TTL 的缓存兜底、限流。依赖挂了就返回缓存数据或安全默认错误,而不是崩掉。
生产运维要点:
- 配置外置:环境特定覆盖(base config + 生产覆盖),类型化配置类(Pydantic
BaseSettings),带超时、连接限制、日志级别、限流。 - 结构化错误分类:客户端错误(4xx)、服务端错误(5xx)、外部依赖错误(502/503)。字段:
category、code、message、details、retry_after。未预期错误记全日志、给客户端返回安全通用消息。 - 性能:连接池、三级缓存(L1 内存 / L2 Redis / L3 数据库)、异步任务队列(重操作立即返回 task ID 让客户端轮询,而不是阻塞)。
- 可观测性:metrics(按方法/状态的请求数、请求时长、活跃连接)+ 结构化日志(client ID、方法、时长、错误类型)。
- 健康检查:多组件检查(DB、缓存、外部 API、磁盘、内存),返回
healthy/degraded/unhealthy和每项详情——支撑服务发现和负载均衡。 - 部署:水平扩展 + 零停机(滚动更新
maxUnavailable: 1/maxSurge: 1)、liveness probe(/health)+ readiness probe(/ready)分离、K8s 原生密钥配置、基于 CPU/内存的 HPA。
测试与基准:单元测试(权限检查:拒绝 /etc/passwd、允许测试文件)、集成测试、契约测试(MCP 协议合规)、负载测试(50 并发、1000 请求、>99% 成功率)、混沌工程(数据库挂→降级服务缓存数据;内存 95%→限流卸荷)。基准目标:吞吐 >1000 req/s/实例、P95 <100ms(简单操作)、错误率 <0.1%、可用性 >99.9%。
生产路径分四阶段:基础(1-2 周:协议合规、错误处理、基础监控、单测集成)→ 加固(3-4 周:安全控制、缓存池化、健康检查、部署自动化)→ 扩展优化(5-6 周:负载测试、混沌工程、告警、runbook)→ 持续运维(监控、安全审计、容量规划、事故响应)。
设计检查清单
把四份资料浓缩成一张自检清单,写完 server 逐条过:
工具层
- 命名 camelCase、无空格/点号/括号
- 描述含
<use_case>+<important_notes>,别名写清楚 - 参数 ≤8 个,用枚举 + 默认值,命名匹配领域而非数据库
- 错误信息可操作(含 retry_after 或具体建议),不裸抛状态码
- 搜索类工具避免 "not found" 负面表述(敏感数据除外)
- 重操作用异步作业(job ID + check_status),写操作幂等
- 凭证/身份走服务端上下文注入,绝不过 LLM
架构层
- 单一职责,不堆 mega-server
- 不把 REST/GraphQL API 1:1 映射成工具,按高层用例定义
- 复杂描述懒加载(get_taxonomy 模式),控制 Bloat
- 鉴权/校验/清洗用装饰器分层,安全边界在服务端
运维层
- 配置外置(类型化 + 环境覆盖)
- 结构化错误分类 + 全量日志 + 安全通用响应
- metrics + 结构化日志 + 多组件健康检查
- 熔断 + 缓存兜底 + 限流
- 单元/集成/契约/负载/混沌测试齐全
- Docker 打包 + 依赖安全扫描
参考链接
- Arcade.dev: 54 Patterns for Building Better MCP Tools - 8000+ 生产工具的 54 个工具模式,三轴分类 + 四横切关注点
- AWS: MCP Tool Design — Practical Approaches and Tradeoffs - Bloat/Confusion 框架、五方法、6 版演进对照
- MCP 官方 Best Practices - 服务器端架构、安全、运维、测试、生产路径
- GitHub: lirantal/awesome-mcp-best-practices - 工具命名/描述/别名规范、富 instructions、Docker 打包
- MCP 协议规范 - 协议层基础
- Anthropic: Writing Effective Tools for Agents - 工具有效性官方指导
你踩过哪些 MCP 工具设计的坑?评论区聊聊,觉得有用点个赞让更多人看到这份指南。
作者: itech001 来源: 公众号:AI人工智能时代(the-ai-era) 网站: https://www.theaiera.top/ 关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top
本文首发于 AI人工智能时代,转载请注明出处。