返回博客列表

如何设计更好的 MCP server:54 个工具模式 + AWS 权衡 + 官方最佳实践

2026-09-23T10:30:00+08:00
MCPMCP ServerAgent工具设计最佳实践AI工程

如何设计更好的 MCP server:54 个工具模式 + AWS 权衡 + 官方最佳实践

工具写得不好,再强的模型也白搭。

MCP(Model Context Protocol)已经成了 Agent 连接工具的事实标准,但协议只解决了"怎么连"。真正决定 Agent 好不好用的,是工具本身怎么设计。Arcade.dev 做过 8000+ 个生产工具,他们一句话点破:"你的 Agent 只和你的工具一样好。" 描述含糊、错误信息没用、参数太死板——这些才是 Agent 实际翻车的根源。

这篇文章把四份资料整合成一份可落地的设计指南:Arcade 的 54 个工具模式、AWS 的五个设计方法及权衡、MCP 官方生产级最佳实践、以及 awesome-mcp-best-practices 的工具级规范。从工具怎么命名,到服务器怎么架构,到生产怎么运维。

本文提纲

  1. 核心心智:工具设计是 MCP 缺失的那一层
  2. 工具设计:命名、描述、Schema、错误
  3. 两个根问题:Bloat 与 Confusion
  4. AWS 的五个设计方法(含 6 版演进对照)
  5. 服务器端架构与生产运维
  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_classdiscipline 改成 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 控制力最强,基础设施成本最高;客户端上下文最小

方法论提炼:

  1. 描述与响应:说清楚值是什么意思、自然语言怎么映射。返回只对决策相关的字段(Anthropic 说这样响应 token 能砍约三分之二),提供按需的详情视图。
  2. Schema 约束:默认值、枚举、重命名、砍字段。
  3. 重构 + 懒加载:把多功能工具拆成专一的;复杂描述从常驻上下文里拿走,放进按需调用的发现工具(get_taxonomy)。Anthropic 报告按需加载定义能减少高达 85% 的 token。客户端侧也有对应物:Skills 就是懒加载——相关时才把本地文件读进上下文。
  4. 服务端推理(内省):加一个内省工具,调用你自己控制的 LLM。客户端模型发自然语言,你的 LLM 解释需求、返回推荐参数值。好处是你自己选模型、自己调 prompt、用黄金查询测试,结果不随客户端模型变化。代价是每次调用要付推理费,但上下文保持精简。
  5. 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)。字段:categorycodemessagedetailsretry_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 打包 + 依赖安全扫描

参考链接

你踩过哪些 MCP 工具设计的坑?评论区聊聊,觉得有用点个赞让更多人看到这份指南。


作者: itech001 来源: 公众号:AI人工智能时代(the-ai-era) 网站: https://www.theaiera.top/ 关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top

本文首发于 AI人工智能时代,转载请注明出处。

分享给朋友