基于 MCP 的 AI Agent 应用开发实践
过去做 Agent 应用,一个常见做法是把工具调用逻辑直接写进 Agent 项目里:要读文件,就在项目里接文件系统;要查网页,就在项目里接浏览器;要查数据库,又写一套数据库适配。短期看很快,长期看会把应用、工具、权限、调试和部署绑死在一起。
MCP(Model Context Protocol)解决的不是“让模型更聪明”,而是给 Agent 应用提供一层稳定的工具协议。它把应用开发者和工具提供者拆开:应用只关心“有哪些能力可用、参数是什么、返回什么结果”,工具侧负责把真实系统封装成标准接口。
这篇文章基于一次 Agent 应用工程实践,重新梳理 MCP 在开发中的价值:它为什么出现、如何落地、会带来哪些工程收益,以及什么时候不该过度使用。
1. 为什么 Agent 需要协议层
Agent 与传统 Chatbot 最大的区别,是它不只生成文本,还会调用工具完成任务。一次任务通常包含:
- 理解用户目标;
- 判断需要哪些外部信息;
- 调用工具获取上下文或执行动作;
- 根据工具结果继续规划;
- 最终输出答案或完成交付。
如果每个 Agent 应用都自己维护工具代码,会出现三个问题。
1.1 应用与工具耦合
工具开发者必须理解 Agent 内部实现,Agent 开发者也要关心工具细节。工具一变,应用就跟着改;应用换框架,工具也要重新适配。
1.2 工具复用困难
同一个“浏览器访问”能力,在不同 Agent 框架里可能有完全不同的函数签名、鉴权方式和返回结构。工具看似一样,实际上很难跨项目复用。
1.3 生态碎片化
大量工具能力已经以 API、CLI、数据库或本地服务的形式存在,但缺少统一描述方式。Agent 能不能用,取决于每个项目是否手写适配层。
MCP 的价值就在这里:用统一协议把工具层抽出来,让 Agent 应用面向协议编程,而不是面向某个具体工具实现编程。
2. MCP 的基本分层
一个典型 MCP 架构可以拆成四层:
| 层级 | 职责 | 关注点 |
|---|---|---|
| Agent App | 理解目标、规划任务、组织上下文 | 用户体验、任务策略、模型调用 |
| MCP Client | 连接和管理多个 MCP Server | 协议通信、工具发现、调用转发 |
| MCP Server | 封装具体工具或数据源 | 参数校验、鉴权、执行逻辑 |
| Tools / Resources | 真实能力来源 | 文件、浏览器、数据库、搜索、业务 API |
这种分层类似 Web 应用里的前后端分离。Agent App 不需要知道浏览器工具内部怎么启动,也不需要知道数据库工具如何连接,只要通过 MCP Client 调用标准化能力。
3. 一个应用如何接入 MCP
实践中可以按下面的顺序做。
3.1 先定义任务边界
不要一开始就接一堆工具。先明确 Agent 要解决什么任务,例如:
- 读取本地或云端文件;
- 查询网页并总结信息;
- 调用命令行完成环境检查;
- 访问业务 API 并生成报告;
- 操作浏览器完成简单流程。
任务边界决定 MCP Server 的选择。如果任务只是问答,不需要工具;如果任务需要真实执行,就要把工具能力纳入协议层。
3.2 选择或实现 MCP Server
常见工具可以直接使用现成 MCP Server,例如文件系统、浏览器、命令行、搜索、数据库等。业务专有能力则适合自己封装。
一个好的 MCP Server 应该满足:
- 工具说明清晰,模型能理解什么时候调用;
- 入参结构稳定,避免自然语言随意拼接;
- 返回结果简洁,不把无关日志塞回上下文;
- 错误信息可读,便于 Agent 自我修复;
- 权限边界明确,避免让 Agent 拿到过大权限。
3.3 在 Agent 中注册工具
注册工具时,不要只暴露函数名。更重要的是写清楚工具的适用场景、输入约束和输出语义。
例如浏览器工具可以说明:
适合处理需要打开网页、读取页面内容、点击元素或获取截图的任务。
不适合处理纯文本问答,也不应该用于访问未授权页面。模型不是通过代码类型系统理解工具,而是通过工具说明理解工具。说明写得越稳定,工具调用越可控。
3.4 增加观测与调试
MCP 接入后,调试重点会从“函数有没有跑”变成“模型为什么选这个工具”。因此需要保留:
- 用户原始请求;
- 模型选择工具前的上下文;
- 工具入参;
- 工具返回;
- 模型如何使用返回结果。
这些记录会成为后续评测和优化 Agent 的基础数据。
4. MCP 带来的工程收益
4.1 开发职责更清晰
应用开发者专注任务体验,工具开发者专注能力封装。两边通过协议协作,减少互相侵入。
4.2 工具生态可以复用
同一个 MCP Server 可以被多个 Agent 应用使用。只要协议不变,应用迁移或模型升级都不需要重写工具。
4.3 上下文更可控
工具返回可以统一做裁剪、摘要、结构化,避免一次工具调用把大量噪声塞进模型上下文。
4.4 更容易评测
当工具调用有标准日志后,就能评测:
- 工具是否被正确选择;
- 参数是否合理;
- 结果是否被正确理解;
- 是否存在多余调用;
- 错误是否被合理兜底。
这比只看最终答案更接近 Agent 的真实质量。
5. 不要把 MCP 当银弹
MCP 适合解决“工具接入标准化”的问题,但不是所有场景都需要 MCP。
如果只是一个固定流程、固定输入、固定输出的内部脚本,直接写函数可能更简单。如果工具权限极高、误操作成本很大,也不应该为了追求智能化而直接开放给模型。
更稳妥的做法是:
- 先从只读工具接入;
- 再接低风险写操作;
- 对高风险动作增加确认、审批或回滚机制;
- 对所有工具调用留日志;
- 用评测集持续验证工具选择是否稳定。
6. 我的实践结论
MCP 的本质是一层工程边界。它让 Agent 应用不再把所有工具逻辑写死在自己体内,而是通过协议调用外部能力。
对于个人项目,MCP 能降低工具接入成本;对于长期项目,MCP 更重要的价值是可维护性:工具能独立演进,应用能独立迭代,评测也能基于标准调用链展开。
真正值得投入的方向,不是“接入越多工具越好”,而是把最常用、最稳定、最有复用价值的能力沉淀成协议化工具。这样 Agent 才不是一次性 Demo,而是可以长期维护的工程系统。
