MCP已死?
摘要
对模型上下文协议(MCP)的技术批评,指出其消耗过多的上下文窗口令牌、运行可靠性低,且与现有CLI/API方法重叠。Quandri技术栈的测量显示上下文使用率达10.5%。
暂无内容
查看缓存全文
缓存时间: 2026/05/30 01:22
# MCP 已死 | Quandri Engineering
来源: https://www.quandri.io/engineering-blog/mcp-is-dead
💡
参考: MCP 已死,CLI 万岁 (https://ejholmes.github.io/2026/02/28/mcp-is-dead-long-live-the-cli.html)
阅读上述文章后,我们在实际技术栈上进行了实验。本文档涵盖原论点、额外研究以及我们的测量结果。
📌
**更新:** 自这些测量完成以来,Claude Code 已推出支持延迟加载的工具搜索 (https://code.claude.com/docs/en/mcp),可按需加载 MCP 工具模式,并将上下文使用量减少 85% 以上。问题 1 中描述的上下文膨胀问题对于使用当前 Claude Code 版本的用户已基本解决。以下关于性能、调试和架构的论点仍然适用。
## MCP 的问题
MCP(模型上下文协议)将 LLM 与外部工具(GitHub、Linear、Notion、Slack 等)连接起来。
自 2024 年底推出以来,它被称为“AI 生态系统的 USB-C”。但实际每天使用它的开发者开始有不同的看法。
**TL;DR**:MCP 消耗上下文、可靠性低,且与现有的 CLI/API 功能重叠。
### 问题 1:吞噬上下文窗口
上下文窗口是 LLM 的工作台。当你连接 MCP 服务器时,**仅工具定义**就会占据工作台的一大块。
餐厅类比:
- 你坐下,10 份菜单(MCP 工具定义)摊在桌上
- 没有空间放实际食物(你的工作)
- 每次点餐时,菜单都得重新拿出来
我们提取并测量了环境中实际连接的各 MCP 服务器的工具定义。**连接全部 4 个服务器后,仅工具定义就消耗了上下文窗口的 10.5%。**
#### 测量:工具定义大小(Quandri 技术栈)
| MCP 服务器 | 工具数 | 估算字符数 | 估算 Token 数 |
|------------|--------|------------|---------------|
| Linear | 42 | ~51,229 | ~12,807 |
| Notion | 14 | ~16,156 | ~4,039 |
| Slack | 12 | ~15,168 | ~3,792 |
| Postgres | 9 | ~1,755 | ~438 |
| **总计** | **77** | **~84,308** | **~21,077** |
#### 上下文窗口使用量(全部服务器合并)****
| 模型 | 上下文窗口 | 工具定义使用占比 |
|-----------------|---------------|------------------|
| Claude (200K) | 200,000 token | 10.5% |
| GPT-4o (128K) | 128,000 token | 16.5% |
仅 Linear 就占用超过 12,800 个 token。即 42 个工具定义始终加载,即使你只使用 `get_issue` 和 `save_issue`。
#### 按大小排序的最大工具
(此处应为实际图表或列表,但原文仅有一行标题,可能缺失内容。我们将按原文保留标题。)
### 问题 2:运行可靠性低
| 问题 | 详情 |
|--------------------|--------------------------------------|
| 初始化失败、重复重新认证 | 需要启动并维护一个独立进程 |
| AI 响应变慢 | 每次工具调用都需外部服务器往返 |
| 会话中工具崩溃 | MCP 服务器进程崩溃 |
| 权限不透明 | 不清楚每个工具实际拥有哪些权限 |
性能是已知问题。原始文章作者对 Jira MCP 及其 REST API 进行了基准测试,发现 **MCP 每次调用慢 3 倍,首次调用(含初始化)慢 9.4 倍**。这不是 Jira 特有的问题,而是架构性的:每个 MCP 服务器都会在 LLM 与底层 API 之间增加一层进程。同样的开销也适用于我们技术栈中的 Linear、Notion 和 Slack 服务器。
### 问题 3:与现有 CLI/API 功能重叠
| 方面 | CLI / API | MCP |
|-----------------|-----------------------------------------|--------------------------------------|
| 人机一致性 | 人类和 LLM 使用相同的命令 | 仅在 LLM 对话中存在 |
| 可组合性 | 管道、jq、grep 可自由组合 | 锁定在服务器返回格式中 |
| 调试 | 可立即在终端中复现 | 仅在对话上下文中可复现 |
| 训练数据 | 已从 man 手册、StackOverflow 学习过 | 需要单独的工具定义 |
| 安装成本 | 大多已安装 | 需要服务器搭建、认证、进程管理 |
### Token 对比:用 MCP 与 CLI 查找同一个 Linear Issue
**查找同一个 Linear Issue 需要多少 token?** MCP 消耗的 token 大约是 CLI 方法的 65 倍。
```
[ CLI 方法:~200 个 token ]
curl -s -H "Authorization: Bearer $LINEAR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"{ issue(id: \"ISSUE-ID\") { title state { name } assignee { name } } }"}' \
https://api.linear.app/graphql
-> 提示(curl 命令):~50 个 token
-> 响应:~150 个 token
[ MCP 方法:~12,957 个 token ]
-> 工具定义(始终加载):~12,807 个 token(42 个工具)
-> 工具调用 + 响应:~150 个 token
```
```
## 有哪些替代方案?
#### 替代方案 1:CLI 优先策略
按 CLI → API → 文档的顺序提供。LLM 已经从 man 手册和 StackOverflow 学习过。
直接使用现有 CLI:
- 不浪费上下文在工具定义上
- 人类和 AI 使用相同接口,易于调试
- 可自由与管道组合
#### 替代方案 2:技能模式
如果说 MCP 是“事先把所有菜单摊在桌上”,那么技能模式则是“**只向图书管理员借你需要的书**”。
| 方面 | MCP | 技能模式 |
|---------------|-----------------------------------|----------------------------------|
| 加载时机 | 连接时加载所有工具定义 | 仅在需要时加载 |
| 上下文消耗 | 一直占用 | 仅在使用时占用 |
| 可扩展性 | 上下文压力随服务器数量增加而增大 | 与技能数量不成比例 |
关键在于将 CLI 使用说明嵌入技能中。结合替代方案 1 的 CLI 优先策略,这是最高效的方式。例如,一个 Linear 技能:
```
# Linear Issue 查找技能
- Linear API: https://api.linear.app/graphql
- 认证:Bearer Token($LINEAR_TOKEN 环境变量)
- 获取 Issue:curl -s -H "Authorization: Bearer $LINEAR_TOKEN" -H "Content-Type: application/json" -d '{"query":"{ issue(id: \"ISSUE-ID\") { title state { name } assignee { name } } }"}' https://api.linear.app/graphql
- 搜索 Issue(GraphQL):调整查询字段以实现类似 JQL 的过滤
- 结果为 JSON,使用 jq 解析
```
```
这样,只有当技能被调用时,LLM 才会将上述内容加载到上下文中。无需始终携带 42 个工具定义。只需它需要的 CLI 命令。
## 那么 MCP 真的死了吗?
并非完全如此。MCP 在以下场景中仍然有效:
- **服务没有 CLI**:仅 Web 的 SaaS,MCP 可能是唯一的连接方式
- **非开发者用户**:MCP 对不使用终端的人更易上手
- **实时双向通信**:超出简单请求-响应的场景
### 数据库呢?
简短回答:视情况而定。
数据库归根结底只是执行查询。LLM 已经非常了解 SQL 和 MongoDB 查询。将数据库信息和 CLI 用法放入一个技能中,无需 MCP 也能正常工作。只需提供模式,它就能编写查询。
```
# Postgres 技能
- 主机:postgres://localhost:5432/myapp
- 表:users (id, name, email), orders (id, user_id, status)
- CLI: psql -h localhost -d myapp -c "SELECT * FROM users WHERE ..."
```
```
然而,MCP 对数据库有优势:
- **查询安全**:MCP 服务器可以在服务器级别强制只读模式并阻止危险查询。技能 + CLI 无法阻止 LLM 运行 `DROP TABLE`。
- **凭据保护**:CLI 方法可能会在提示中暴露连接字符串。MCP 服务器在内部管理凭据。
| 场景 | 推荐方案 | 原因 |
|--------------------|--------------|--------------------------------------------------------|
| 本地开发/个人数据库 | 技能 + CLI | 轻量快速,错误容易恢复 |
| 生产数据库/团队共享 | MCP | 安全护栏至关重要,查询验证和访问控制在服务器级别实现 |
但对于大多数开发者工作流而言,MCP 是过度工程。
如今,每个 SaaS 着陆页的功能列表中都写着“支持 MCP”。MCP 服务器是否稳定或消耗多少上下文并不重要——目标只是勾选“我们也有 MCP”这个框。这与过去几年“AI 驱动”和“基于区块链”的营销模式如出一辙。当用户实际连接时,他们得到的是几十个加载的工具定义、初始化失败以及会话中途的崩溃。
## Quandri 如何使用技能模式
在 Quandri,我们同时使用三种方法,为每个服务选择最合适的方案:
- **Bash + CLI**:用于我们日常使用的工具(`gh`、`psql`、`aws`)。零上下文成本,完全灵活,直接在终端中调试。
- **技能模式**:用于可重复的多步骤工作流,如提交草稿和 PR 审查。仅在调用时加载。
- **MCP**:用于没有强大 CLI 的服务(Slack、Linear、Notion),以及需要团队级认证或权限范围控制的场景(如生产数据库访问)。
我们不强行采用某一种方式。如果 CLI 已经存在且能在本地进行认证,那通常是最轻量的选择。如果某个服务没有 CLI,或者我们需要团队范围内的统一认证,MCP 就有其价值。
## 结论
**教导得当比连接一切更重要。**
对我们来说,用包装现有 CLI 的技能模式替代 MCP 服务器,释放了约 21K 的上下文 token,消除了日常工作中的初始化失败,并将调试保持在终端中——它本应属于那里。
只加载你需要的工具,只在需要时加载,并内嵌 CLI 指令。MCP 可能会不断演进来解决这些问题,但就目前而言,技能模式更胜一筹。
****
****
**测量方法**:工具定义大小通过从我们 Claude Code 环境中实际加载的 MCP 服务器中提取每个工具(名称 + 描述 + 参数)的 JSON 模式进行测量。Token 估算使用约 4 字符/token 的经验法则。完整服务器估算是从采样工具平均值外推得出的。
相似文章
@svpino: MCP 并没有消亡。对于那些总说“但 MCP 会在你的上下文里塞垃圾”的人,这个抱怨已经过时了:现……
为 MCP(模型上下文协议)辩护,反驳其会向上下文注入垃圾信息的批评。指出 Claude Code、Codex 和 Cursor 等现代工具已实现渐进式披露,并按需加载 MCP 工具,使该抱怨过时。作者认为 MCP 最适合需要身份验证和可发现性的云端托管平台。
MCP 真的能减少智能体的集成工作量吗?
本文探讨了模型上下文协议(MCP)是否通过标准化智能体与工具的通信,有效减少了 AI 智能体的集成工作量,并将 Evose 中的原生 MCP 集成与 LangGraph、CrewAI 等其他技术栈中的手动连接进行了比较。
使用 MCP 进行代码执行:构建更高效的智能体
本文来自 Anthropic,探讨了如何将代码执行与 Model Context Protocol (MCP) 相结合,以提升 AI 智能体的效率。文章分析了工具定义和中间结果导致的 token 过载等挑战,并提出代码执行作为降低延迟和成本的解决方案。
我构建了一个包含300万篇arXiv论文的模型上下文协议(MCP)索引,用于LLMs。[D]
一位开发者构建了一个包含300万篇arXiv论文的模型上下文协议(MCP)索引,以帮助LLMs检索准确的研究引用并减少幻觉,现正在寻找测试者提供反馈。
Contextberg
Contextberg 能将你的工作转化为 AI 代理内存,并通过模型上下文协议(MCP)提供服务。