1 分•作者: ortr•27 天前
返回首页
最新
1 分•作者: nacho-daddy•27 天前
1 分•作者: StateflowsLabs•27 天前
2 分•作者: ankitg12•27 天前
2 分•作者: num42•27 天前
2 分•作者: molliejackson•27 天前
2 分•作者: wicket•27 天前
2 分•作者: tamler•27 天前
我想要一些方便的 JS 工具来处理简单的文件操作,于是就构建了这个……然后想把它交给我的代理……现在它已经自成一体了。
您有什么建议的工具或功能吗?
2 分•作者: jonbaer•27 天前
7 分•作者: gmays•27 天前
8 分•作者: haydenbarnes•27 天前
50 分•作者: maxall4•27 天前
1 分•作者: kamphey•27 天前
1 分•作者: sizzle•27 天前
1 分•作者: thunderbong•27 天前
2 分•作者: ValentineC•27 天前
2 分•作者: JohnnyZhang483•27 天前
我最近对两个功能相同的 MCP 进行了测试,结果发现其中一个性能非常差。因此,我想分享导致这种现象的不良 MCP 设计模式。
一切都始于我为待办事项列表应用程序编写了一个 MCP 服务器(MCP-A)。后来,该应用程序正式发布了自己的 MCP 服务器(MCP-B)。这两个 MCP 具有相同的功能,并且都调用相同的后端 API。
实验设置如下:
- 两个 MCP 服务器都连接到同一个待办事项列表账户,并且每次测试后都会重置该账户。
- 40 个测试提示,模拟这些 MCP 的典型用例。
- 测试使用相同的模型、系统提示和 Agent 框架进行。
以下是测试结果:
| 指标 | MCP-A | MCP-B | 差距 |
| ------------------- | ----------- | ----------- | ----- |
| 工具描述长度 | 11,464 | 3,682 | — |
| 通过率 | 36/40 (90%) | 36/40 (90%) | 相同 |
| 总输入 token 数 | 637,244 | 3,174,329 | 4.98 倍 |
| 总输出 token 数 | 17,301 | 23,238 | 1.34 倍 |
| 总 Agent 步骤数 | 122 | 157 | 1.29 倍 |
| 总耗时 | 597 秒 | 676 秒 | 1.13 倍 |
结果显示,与 MCP-A 相比,MCP-B 完成 40 个测试用例多用了 35 次 ReAct 循环,这意味着输出 token 数增加了 30%。我检查了日志,发现根本原因是查询工具设计不佳。
以 `search tool` 为例,它的作用是在待办事项列表中查找一个待办事项。在 MCP-B 中,该工具返回以下内容:
```json
{
"id": "6a1916b48f08cb3a4c857ed0",
"title": "buy some groceries",
"url": "https://todo.example.com/tasks/6a1916b48f08cb3a4c857ed0"
}
```
但是其他 CRUD 操作需要 `project_id`,而 `search_tool` 没有返回它。因此,Agent 必须调用另一个工具 `get_task_by_id`。另一方面,MCP-A 的 `query_tasks` 在一次调用中返回了执行下一步操作所需的所有必要信息:
任务 1:
ID:6a19143e8f084a8c8101612f
标题:购买一些杂货
项目 ID:6a1914378f084a8c810160a9
开始日期:2025-07-19 10:00:00
优先级:中
状态:活动
未过滤的 API 数据已转储到上下文窗口
如果 MCP 将纯 API 结果未经处理地返回给 Agent 的上下文,Agent 的上下文窗口会迅速累积。
以 MCP-B 的 `create_task` 工具为例,它的作用是创建一个待办事项。该工具返回以下内容:
```json
{
"id": "6a180de78f086bdead0608be",
"projectId": "inbox125587327",
.....
"createdTime": "2026-05-28T09:41:59+0000",
"modifiedTime": "2026-05-28T09:41:59+0000",
"focusSummaries": null
}
```
这 600 多个字符对 Agent 的任务毫无意义,但仍然被转储到 Agent 的上下文中。另一方面,MCP-A 的 `create_tasks` 进行了过滤和格式化层。这个小小的调整在输入 token 使用量上产生了巨大的差异。
另一个问题是工具数量。更多的工具意味着模型可以选择的候选集更大,这直接增加了决策的难度。在 MCP-A 中,47 个工具被压缩到 14 个,用更少的工具覆盖了相同的功能。
---
因此,我关于良好 MCP 工具设计的体会是:
- 设计工具时,要考虑 Agent 接下来需要什么,而不仅仅是它当前请求的内容。在结果中返回足够的上下文,以便 Agent 可以在不进行另一次往返的情况下执行下一步操作。
- 过多的工具会增加模型的决策负担。因此,最好尽量减少 MCP 中的工具数量。确保它们的功能不重叠。
- 当你的 MCP 将数据返回给 LLM 时,尽量使其对 LLM 友好,即易于阅读。你可以过滤掉 API 响应中不必要的字段并格式化数据,而不是直接传递原始 JSON。
---
以上所有测试均由 MCP-Eval 运行,这是一个 MCP 服务器的基准测试工具。如果你想检查你的 MCP 的性能,请随时查看:
https://github.com/Code-MonkeyZhang/mcp-eval
1 分•作者: rawgabbit•27 天前
2 分•作者: byproxy•27 天前
3 分•作者: sizzle•27 天前