📰 今日要闻
• 鸿蒙智行发布新一代问界 M9、蔚来正式推出 ES9,英伟达同步宣布退役 GeForce 控制面板,国内外科技产品密集更新。
• 美伊局势升温致停火希望破灭,英国股市下滑,能源通胀压力持续高于预期,美联储 Goolsbee 表示能源价格走势仍具不确定性。
• Steam Deck 价格上调,分析认为掌机游戏黄金时代或已结束,便携游戏设备正面临成本与市场的双重压力。
前段时间我在做一个内部工具,需要把网页上的需求列表整理成周报发到企业微信群。以前的做法是:打开网页 → 手动复制需求标题 → 粘贴到 Excel → 整理格式 → 写摘要 → 发消息。整个流程大概 40 分钟。
后来我用 MCP 把这个流程接入 AI,现在的做法是:打开对话框,说一句"帮我整理本周需求,发到研发群"。两分钟完事。
今天想聊聊 MCP 这个东西——它到底是什么,我怎么在实际工作中用起来的,以及我觉得它真正牛在哪里。
MCP 到底是啥,别被它的名字吓到
MCP 全称 Model Context Protocol,是 Anthropic 在 2024 年底开源的一个协议。光看名字很抽象,但它干的事情其实很简单:
让 AI 模型能够调用外部工具和数据源。
你可以把 MCP 理解成 AI 界的 USB 接口——只要按这个标准实现了接口,任何工具都能插进来,AI 就能用它。不同的是,以前每个 AI 应用要集成一个外部工具,得自己写适配层;有了 MCP,只要服务端实现了协议,所有支持 MCP 的 AI 客户端都能直接用。
它解决的核心问题是:AI 不再是一个封闭的聊天盒子,而是能主动读文件、查数据库、调 API、发消息——真正变成一个能干活的 Agent。
架构是怎么运转的
MCP 采用 Client-Server 架构:
AI 客户端(Claude / Cursor / OpenClaw...)
↕ MCP 协议(JSON-RPC over stdio/HTTP)
MCP Server(你自己写的工具层)
↓
数据库 / 文件系统 / 第三方 API
MCP Server 对外暴露三类能力:
• Tools:AI 可以主动调用的函数,比如「查询需求列表」「发送消息」
• Resources:AI 可以读取的数据资源,比如文件、数据库记录
• Prompts:可复用的提示词模板
AI 在对话过程中,看到需要调用工具的时机,就会发出 tool_call 请求,MCP Client 转发给对应的 Server,Server 执行并返回结果,AI 再继续推理。整个过程对用户来说是透明的。
从零写一个 MCP Server,没那么难
官方提供了 Python 和 TypeScript 的 SDK。我用 Python 写了一个最简单的 Server,给你看看到底有多少代码量。
用 Python 实现一个查需求的 MCP Tool
# mcp_tapd_server.py
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
import requestsapp = Server("tapd-server")@app.list_tools()
async def list_tools():
return [
Tool(
name="get_stories",
description="获取需求列表",
inputSchema={
"type": "object",
"properties": {
"workspace_id": {
"type": "string"
},
"status": {
"type": "string",
"description": "需求状态"
}
}
}
)
]@app.call_tool()
async def call_tool(name, arguments):
if name == "get_stories":
resp = requests.get(
"https://api.tapd.cn/stories",
params=arguments,
auth=(TAPD_ID, TAPD_TOKEN)
)
return [
TextContent(
type="text",
text=resp.json().__str__()
)
]if __name__ == "__main__":
import asyncio
asyncio.run(
stdio_server(app).run()
) 就这些。核心逻辑不到 50 行。list_tools 告诉 AI 这个 Server 有什么工具,call_tool 是实际执行逻辑。
在 Claude Desktop 里接入
配置文件 claude_desktop_config.json 加一段:
{
"mcpServers": {
"tapd": {
"command": "python3",
"args": [
"/path/to/mcp_tapd_server.py"
],
"env": {
"TAPD_ID": "your_id",
"TAPD_TOKEN": "your_token"
}
}
}
} 重启 Claude Desktop,它就能用这个工具了。你直接说"帮我看看 workspace 12345 里本周新增的需求",它会自动调用 get_stories,把结果整理给你。
三个真实工作流,不是 Demo
说一些我实际在用的场景,都是能省时间的那种,不是为了炫技。
场景一:代码 Review 自动摘要
我们团队用工蜂(内部 GitLab)做代码托管。以前每天早上我得手动看各个 MR,挨个点进去读 diff。现在我写了一个 MCP Server,接工蜂 API,可以:
• 列出所有待我 Review 的 MR
• 拉取 diff 内容
• 让 AI 生成摘要,标出高风险改动
一句话交互:
我:帮我看看今天待 Review 的 MR,重点关注有没有数据库 schema 改动或者线程安全问题 AI:找到 3 个待 Review 的 MR —— MR #234 修改了 UserDao,新增了一个未加事务注解的批量插入方法,建议关注;MR #235 是 UI 改动;MR #238 改了网络层超时配置,从 5s 改到 30s,可能影响 ANR……
以前这活我要花 20 分钟,现在 2 分钟看完关键点,再决定哪个值得仔细读。
场景二:周报半自动生成
我接了三个工具:
• git-mcp:读取本周我的 commit 记录
• tapd-mcp:读取本周完成/进行中的需求
• wecom-mcp:发送消息到指定群
每周五下午,说一句:"帮我整理本周工作,生成周报草稿,包含完成工作、进行中、下周计划",AI 会自动聚合三个来源的数据,生成周报,让我确认后发到群里。
关键是"让我确认"这一步——AI 不会自动发出去,它把草稿给我看,我改几个字,说"发吧",它才发。这种人在环路的设计让我用着比较放心。
场景三:日志分析 + 自动开 Bug 单
这个稍微复杂一点。我写了个 MCP Server 接了公司的日志平台(类 ELK),还接了 TAPD 的创建 Bug API。
现在可以这样:
# 对话示例
我:帮我看看 app-prod 服务今天的
ERROR 日志,有没有新出现的异常
类型,如果有,帮我开个 Bug 单AI:发现 3 种新异常:
1. NullPointerException in
UserService.getProfile()
出现 47 次
2. ConnectionTimeoutException
in PayClient,出现 12 次
3. ...是否要为第 1、2 条创建 Bug 单?
# 我说:第1条开单,优先级P1
AI:已在 TAPD 创建 Bug #8823,
标题:UserService.getProfile
NPE,包含完整堆栈信息...这个场景之前我每天要花 30 分钟以上做日志巡检。现在 5 分钟搞定。
踩坑实录:几个你会遇到的问题
用了几个月,坑也踩了不少。
坑一:Tool 的描述要写给 AI 看,不是写给人看
最开始我的 Tool description 写得很简单:"获取需求列表"。结果 AI 经常不知道什么时候该调用这个工具,或者参数传错。
后来我改成:
"获取 TAPD 项目需求(Story)列表。
当用户想查看某个项目的需求、
任务进度、待开发功能、Sprint
计划时调用此工具。
status 参数可选:planning=待规划,
developing=开发中, done=已完成。
不传 status 则返回所有状态。"效果明显好很多。Tool 描述本质上是给 AI 的说明书——它要靠这个判断用什么工具、传什么参数。写得越具体,AI 用得越准。
坑二:别让 AI 直接写数据库
我有个同事做了个 MCP Server 接了生产数据库,想让 AI 帮他查数据。结果有次他说了句"帮我把这批测试数据清掉",AI 真的执行了 DELETE,然后他发现删的是生产数据……
这个真不是段子。
我的原则:
• 读操作可以直接给 AI 调,写操作必须要 AI 先展示执行计划,我确认后才执行
• 危险操作(删除、清空)的 Tool 加 dry_run 参数,默认 true
• 生产环境的写操作 Tool,名字加 DANGER_ 前缀并在描述里警告
坑三:Tool 太多会让 AI 分心
我一开始把所有工具都挂在一个 MCP Server 里,有 20 多个 Tool。结果 AI 经常用错工具,或者同一个任务调 5、6 次工具才完成,绕了很多弯路。
后来按照功能域拆成多个 Server:tapd-mcp、git-mcp、wecom-mcp……每个 Server 的 Tool 控制在 5-8 个以内。AI 在有限的选项里,决策准确率明显提升。
坑四:网络超时要仔细处理
MCP Server 通过 stdio 和客户端通信,如果你的 Tool 调了个响应慢的 API,没有超时控制,整个对话就会卡死。
最佳实践:所有外部 HTTP 调用加 timeout,建议 10-30s;如果操作耗时,返回一个任务 ID 让 AI 轮询,而不是让工具调用 block 住。
现成的 MCP Server 资源
不一定要自己写,社区已经有很多现成的:
工具 | 用途 | 来源 |
|---|---|---|
filesystem-mcp | 读写本地文件系统 | 官方 |
github-mcp | GitHub PR/Issue/Commit | 官方 |
postgres-mcp | 查询 PostgreSQL 数据库 | 官方 |
slack-mcp | 读写 Slack 消息 | 官方 |
browsertools-mcp | 控制浏览器/抓网页 | 社区 |
jira-mcp | 管理 Jira 工单 | 社区 |
GitHub 上有个 awesome-mcp-servers 仓库,收录了几百个社区实现,涵盖几乎所有主流工具,先去那里找,找不到再自己写。
一个工程师视角的判断
MCP 最核心的价值,我觉得不是"AI 能调工具"这件事本身——各家早就有 Function Calling 了。它真正有意思的地方是标准化。
在 MCP 之前,你用 Claude,就要按 Anthropic 的 tool_use 格式写;你用 GPT,就要按 OpenAI 的 function calling 写;你换一个 AI 客户端,所有集成都得重写。
MCP 之后,我写一个 TAPD MCP Server,Claude 能用,OpenClaw 能用,Cursor 能用,任何支持 MCP 的客户端都能用。工具和模型解耦了。
这有点像当年的 LSP(Language Server Protocol)。在 LSP 之前,每个 IDE 都得为每种语言单独实现代码补全/跳转;LSP 出来后,一个语言只要实现一次 Server,所有 IDE 都能受益。结果是语言服务的质量飞速提升,IDE 生态也变得更健康。
MCP 在 AI 工具层做的,是同样的事情。
当然,现在还早。MCP 的认证体系、权限管理、审计日志都还不成熟。在真正的企业生产环境里全面铺开,还有很长的路要走。但作为工程师自己日常用来提效,门槛已经很低了,值得现在就动手试。
上手路径建议
第一步 → 安装 Claude Desktop 或支持 MCP 的客户端,先用官方的 filesystem-mcp,体验 AI 读写本地文件
↓
第二步 → 在 awesome-mcp-servers 找一个你常用工具的现成实现,接进来用
↓
第三步 → 找一个团队内部工具(TAPD/内部系统),用 Python MCP SDK 写一个 Server,解决一个实际痛点
↓
注意 → 写操作务必加确认步骤,生产环境谨慎,先只开读权限
最后想说一件事:MCP 代表的这个方向——让 AI 有手有脚能干活——很可能是未来几年工程师工作方式变化最大的地方之一。不是 AI 替代工程师,而是工程师的工作重心会从"我亲自写每一行代码"变成"我设计系统,AI 负责很大一部分执行"。
现在动手摸清楚这个工具链,很有必要。