为什么我们团队全面迁移到 MCP
去年底我们团队做了一个决定:把所有 AI 编程工具的插件体系统一迁移到 MCP(Model Context Protocol)。原因很简单——我们同时用 Claude Code 和 Cursor,每次换工具就要重新配置一遍插件,而且不同工具的插件 API 还不兼容。MCP 的出现解决了这个问题:写一个 MCP Server,Claude Code、Cursor、Windsurf 都能用,一套配置走天下。
但迁移过程远没有想象中顺利。从 2025 年 12 月到 2026 年 5 月,我前后试了 20 多个 MCP Server,踩了无数坑,最终才筛选出 5 个真正能跑在生产环境的。这篇文章把我的踩坑记录和选型经验分享出来,希望能帮你少走弯路。
我的 MCP 选型标准
在说具体踩坑之前,先交代一下我的选型标准。毕竟"好"和"不好"是相对的,得先定义清楚。
- 稳定性优先:能连续跑 7 天不崩溃、不内存泄漏
- 配置简单:安装到能用不超过 30 分钟,不需要改系统配置
- 资源占用合理:常驻内存不超过 200MB
- 社区活跃:GitHub 最近 3 个月有 commit,issue 响应时间小于 72 小时
- 实际使用频率:我在日常工作中真的会高频使用的,不是"看起来很酷但用不上"的
这 5 条标准看着简单,但 20 多个 MCP Server 里能全部通过的,只有 5 个。
7 个踩坑案例
坑 1:@modelcontextprotocol/server-filesystem 的内存泄漏
这是 MCP 官方出的文件系统服务器,按理说应该是最靠谱的。但我跑了 3 天就发现内存从 80MB 涨到了 1.2GB——典型的内存泄漏。用 Node.js 的 --inspect 抓了一下 heap snapshot,发现是 watch 模式的 FileWatcher 没有正确清理。
这个 bug 在 GitHub 上已经有人提了 issue(#347),但官方 2 个月了还没修。我现在的做法是关掉 watch 模式,改用手动刷新。虽然体验差了一点,但至少不会内存泄漏了。
// 临时解决方案:关闭 watch 模式
// claude_desktop_config.json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/path/to/project",
"--no-watch" // 关掉 watch 模式避免内存泄漏
]
}
}
}影响:如果不关 watch 模式,3 天后 Node 进程会被 OOM Killer 干掉,你的 MCP 服务就断了,而且没有任何错误日志——就是进程消失了。
坑 2:mcp-server-sqlite 的并发锁问题
SQLite MCP Server 在单用户场景下很好用,但我们的场景是 3 个开发者同时用 Claude Code 连同一个 SQLite 数据库。SQLite 本身支持并发读,但写操作会加锁。问题出在这个 MCP Server 的实现上——它用的是同步的 better-sqlite3,写操作会阻塞整个 Node.js 事件循环。
有一次同事 A 在用 Claude Code 做数据迁移(大量写操作),同事 B 的 Claude Code 查询直接卡了 45 秒,然后超时了。B 以为 MCP 挂了,重启了一下,结果把 A 的写操作给中断了——数据写了一半。
我的解决方案:生产环境不要用 SQLite MCP Server 做写操作。如果必须用,给每个开发者创建独立的 SQLite 文件,用脚本定期合并。或者直接换成 PostgreSQL MCP Server,并发问题就不存在了。
坑 3:mcp-server-github 的 Token 权限过大
GitHub MCP Server 需要一个 Personal Access Token(PAT),而且文档里直接让你创建一个有 repo 权限的 token。这意味着这个 token 可以读写你所有的仓库——包括私有仓库。如果你的 MCP 配置文件被泄露(比如不小心提交到了 Git),别人就能用这个 token 访问你所有代码。
我们团队差点就犯了这个错。有个同事把 claude_desktop_config.json 提交到了 dotfiles 仓库(公开的),里面包含了 GitHub PAT。幸好我在 code review 的时候发现了,赶紧 revoke 了那个 token。
我的解决方案:创建 PAT 的时候只给最小权限。如果你只需要读 issue 和 PR,就只给 public_repo 权限;如果需要操作特定仓库,用 Fine-grained token 限制到单个仓库。绝对不要给 repo 全权限。
// 最小权限配置示例
// 只读 issue + PR,不给写权限
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "github_pat_xxx" // Fine-grained token,只读权限
}
}
}
}坑 4:mcp-server-brave-search 的速率限制误判
Brave Search MCP Server 用的是 Brave 的免费 API,每月 2000 次查询。这个额度对个人开发者够用,但我们团队 5 个人共享一个 API key,一周就用完了。更坑的是,超限之后返回的错误信息是"Invalid API key",不是"Rate limit exceeded"——我花了一个小时排查为什么 key 突然失效了。
我的解决方案:每人一个 API key,各用各的额度。Brave Search API 注册就能拿到免费 key,不需要付费。然后在 MCP 配置里给每个人设不同的环境变量。
坑 5:mcp-server-puppeteer 的无头浏览器资源占用
Puppeteer MCP Server 可以让 AI 直接操作浏览器,听起来很酷。但一个 Chromium 实例常驻内存就要 300-500MB,而且每次打开新页面还会再涨 50-100MB。我的 M1 MacBook 16GB 内存,开 3 个 MCP Server 就已经占了 1.5GB,再加上 Cursor 本身和 Chrome,系统内存直接拉满,风扇狂转。
更严重的是,Puppeteer MCP Server 在某些页面上会卡死(特别是有大量 WebSocket 连接的页面),卡死之后 Node 进程不会自动退出,你得手动 kill。我写了个 cron 每小时检查一次,超过 1GB 内存就自动重启。
我的建议:除非你真的需要 AI 操作浏览器,否则不要常驻这个 MCP Server。按需启动就行,用完就关。
坑 6:mcp-server-everart 的安装依赖地狱
EverArt MCP Server(AI 图片生成)依赖 Python 3.11 + CUDA + 一堆系统库。我在 macOS 上装了 2 个小时没装上,最后在 Linux 服务器上才搞定。而且它的 Python 依赖跟系统其他包冲突,装完之后我的 Python 环境全乱了。
这个 MCP Server 的 GitHub README 只写了 pip install -r requirements.txt,但 requirements.txt 里有 47 个依赖,其中 6 个需要编译 C 扩展。在 macOS 上编译这些 C 扩展需要 Xcode Command Line Tools + 特定版本的 LLVM,但文档完全没提。
我的建议:如果 MCP Server 的安装步骤超过 5 步,或者需要编译 C 扩展,直接放弃。生产环境要的是稳定可复现,不是"在我机器上能跑"。
坑 7:自定义 MCP Server 的 stdio 传输协议踩坑
我们自己写了一个内部 MCP Server,用来连接公司的知识库。按照 MCP 协议规范,传输层用的是 stdio(标准输入输出)。但我们在实现的时候踩了一个大坑:Node.js 的 console.log 默认会输出到 stdout,而 MCP 的消息也走 stdout——结果 console.log 的调试信息被 Claude Code 当成了 MCP 消息,直接解析报错。
这个 bug 花了我整整一天才定位到。现象是 Claude Code 时不时报"invalid JSON message",但我们的 MCP 消息格式明明是对的。最后发现是一个 console.log('cache hit') 混进了 stdout。
// 错误示范:console.log 会污染 MCP 的 stdout 通道
console.log('debug: cache hit'); // 这行会破坏 MCP 协议!
// 正确做法:所有日志输出到 stderr
process.stderr.write('debug: cache hit\n');
// 或者用专门的 debug 库,配置输出到 stderr
import debug from 'debug';
const log = debug('my-mcp-server');
log('cache hit'); // debug 库默认输出到 stderr教训:写自定义 MCP Server 的时候,永远不要用 console.log,所有日志必须走 stderr。
最终留下的 5 个 MCP Server
踩了 7 个坑之后,我最终在生产环境保留了这 5 个 MCP Server:
1. @modelcontextprotocol/server-filesystem(推荐指数:⭐⭐⭐⭐)
- 用途:让 AI 读写本地文件
- Stars:8.2K
- 安装时间:2 分钟
- 常驻内存:80MB(关掉 watch 模式后)
- 使用频率:每天必用
- 注意事项:必须关 watch 模式,否则内存泄漏
2. @modelcontextprotocol/server-github(推荐指数:⭐⭐⭐⭐)
- 用途:操作 GitHub PR、Issue、代码搜索
- Stars:5.6K
- 安装时间:5 分钟
- 常驻内存:60MB
- 使用频率:每天必用
- 注意事项:必须用最小权限 Token
3. @modelcontextprotocol/server-postgres(推荐指数:⭐⭐⭐⭐⭐)
- 用途:让 AI 直接查询和操作 PostgreSQL 数据库
- Stars:3.1K
- 安装时间:3 分钟
- 常驻内存:45MB
- 使用频率:每天必用
- 注意事项:给 AI 只读账号,别用 superuser
4. mcp-server-brave-search(推荐指数:⭐⭐⭐⭐)
- 用途:让 AI 搜索互联网信息
- Stars:2.8K
- 安装时间:3 分钟
- 常驻内存:40MB
- 使用频率:每周 3-4 次
- 注意事项:每人一个 API key,别共享
5. mcp-server-fetch(推荐指数:⭐⭐⭐⭐⭐)
- 用途:让 AI 抓取网页内容
- Stars:4.5K
- 安装时间:1 分钟
- 常驻内存:35MB
- 使用频率:每天必用
- 注意事项:无,这个是最省心的 MCP Server
完整配置示例
以下是我目前在 Claude Code 中使用的完整 MCP 配置(Cursor 的配置类似,在 Settings → MCP 中添加):
// claude_desktop_config.json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/zhouzihan/projects",
"--no-watch"
]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "github_pat_xxx"
}
},
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"POSTGRES_CONNECTION_STRING": "postgresql://readonly:xxx@localhost:5432/mydb"
}
},
"brave-search": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
"env": {
"BRAVE_API_KEY": "BSA_xxx"
}
},
"fetch": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-fetch"]
}
}
}几个关键点:
- PostgreSQL 连接用的是只读账号,权限只有 SELECT,防止 AI 误操作删数据
- GitHub Token 用的是 Fine-grained token,只授权了 3 个特定仓库
- filesystem 指定了项目目录,不会访问系统目录
- 所有 MCP Server 都用 npx 运行,不需要全局安装
总结
MCP 生态现在还处于早期阶段,很多 Server 的质量参差不齐。我的建议是:先用官方的 5 个 Server(filesystem、github、postgres、brave-search、fetch),等这些跑稳了再考虑加其他的。不要一上来就装十几个 MCP Server,每个都可能是一个潜在的坑。
另外,MCP 协议本身的设计是好的——统一接口、stdio 传输、JSON-RPC 协议,简洁高效。但实现质量跟不上协议设计,这是目前最大的问题。我在选型的时候发现,很多 MCP Server 的 star 数很高(因为蹭了 MCP 的热度),但实际代码质量很差,连基本的错误处理都没做。
如果你正在评估 MCP,可以去 Free API Hub 看看我们整理的 MCP 服务器列表,每个都标注了安装难度、资源占用和踩坑记录。我们也在持续更新,有新的好用的 MCP Server 会第一时间收录。
最后一句:MCP 不是银弹,但它确实是 AI 编程工具链走向标准化的重要一步。现在踩的坑,未来会越来越少。重要的是——踩坑的时候记得记录下来,别让后面的人踩同一个坑。