这两年做 AI Agent 开发,最明显的一个感受是:单 Agent 的 demo 已经没什么可聊的了,真正的战场在“一群 Agent 怎么协作”。我最近完整走了一遍 DeepAgents、MCP、A2A、Skills 这条技术路线,一句话总结就是——MCP 解决 Agent 怎么用工具,A2A 解决 Agent 怎么找同行,Skills 解决 Agent 怎么持续涨本事,DeepAgents 则是把这些串起来的一套工程范式。这篇文章就把我实际搭建一个可编排、可互通、可扩展的多智能体集群的全过程拆开讲清楚,包括协议选型、代码怎么写、踩过的坑,以及一些在真实业务里才会暴露的问题。适合已经被单 Agent 折磨过、准备往上走一层的开发者,也适合正在选型企业级 Agent 平台的架构师。
1. 先把概念理清:MCP、A2A、Skills 到底各自解决什么问题
很多人一上来就陷入协议细节,结果越学越乱。我建议先站在“整个系统缺什么”的角度去看这三样东西,一句话就能记住:MCP 是 Agent 和工具之间的协议,A2A 是 Agent 和 Agent 之间的协议,Skills 是给 Agent 补充“怎么做”的说明书。三者不是替代关系,而是分层协作。
1.1 MCP 的本质:把工具调用从“硬编码”变成“插拔式”
MCP(Model Context Protocol)最早是 Anthropic 提出的,现在已经是 Agent 工具接入的事实标准。它的核心思路是把“工具”抽象成一种可发现、可调用、可鉴权的服务。过去我们想让 Agent 查数据库,得在代码里写死一个函数调用,Agent 换个模型或者换个场景,这套工具就废了。有了 MCP,工具就变成一个独立的 Server 进程,Agent 通过 MCP Client 与它通信,工具的能力描述、入参出参格式都由 Server 自己声明,Agent 侧只需要动态发现。
这里要特别注意一个老生常谈的概念混淆:MCP 是软件协议,不是硬件协议。它定义的是“AI 模型与外部工具/数据源之间如何交换上下文和调用指令”的规范,跟 USB、PCIe 这类硬件总线协议不是一个层面的东西。你可以把它理解成“AI 世界的 USB 接口”,只要双方都实现这个接口,插上就能用,不用关心对方内部怎么实现的。
实际开发中你会发现,MCP 的价值不只是“少写胶水代码”,更重要的是它把工具能力变成了可运营的基础设施。比如权限控制、版本管理、监控审计,都能在 MCP Server 这一层统一做掉,而不是散落在各个 Agent 的 prompt 里。这也是为什么后端框架社区比如 RuoYi-Vue-Pro 这类项目开始有人合并 MCP 功能——本质上是把 MCP Server 的管理能力做成后台的一个菜单,让 Agent 的工具接入像配置数据源一样简单。
1.2 A2A 的本质:Agent 与 Agent 的“外交语言”
MCP 解决的是 Agent 和工具的关系,但业务稍微复杂一点,你就发现 Agent 和 Agent 之间也得对话。A2A(Agent-to-Agent)协议就是在干这件事,比较有代表性的实现是 Google 提出的 A2A 规范,以及 Spring 社区里的 Spring A2A 这类封装。
A2A 解决的核心问题是“寻址”和“任务委托”。一个写作 Agent 需要数据分析结果,它不需要自己会调 SQL,只需要向数据分析 Agent 发一个请求,对方接单、干活、回传结果。这个过程涉及服务发现、技能描述、任务状态跟踪、结果返回,A2A 就是把这套交互标准化。从工程实现上看,A2A 的 Agent Card 类似“名片”,声明了我叫什么、能做什么、用什么协议通信,其他 Agent 看到名片就知道该怎么找我、该不该把活交给我。
这里补充一句经验之谈:A2A 和编排引擎(后面会讲 Harness、编排层)不要混为一谈。A2A 是“Agent 之间对话的语法规范”,编排是“谁先干、谁后干、并发还是串行、出错了怎么办”的流程控制。没有 A2A,编排只能靠硬编码的 API 调用;没有编排,A2A 只是一堆 Agent 在互相喊话却没人管节奏。两者配合才是完整的集群。
1.3 Skills:让 Agent 从“看懂”到“会做”
Skills 这个概念在 Claude Code、Codex 里已经大量出现,社区里也流行叫 Agent Skills 或 superpower skills。它和 MCP 最大的区别在于:MCP 提供的是“工具”,Skills 提供的是“方法论”。
举个例子:你让 Agent 写一篇技术博客,MCP 可以提供搜索工具、网页抓取工具、Markdown 渲染工具,但 Agent 不一定知道“一篇好博客应该怎么组织结构、语气该是什么样、怎么放示例代码”。Skills 就是一段结构化的指导文件(通常是 SKILL.md),告诉 Agent:写博客前要做主题调研,开头 100 字要融入关键词,正文要有实操步骤和避坑经验,代码要标注语言类型。你把这段“经验包”丢给 Agent,它的输出质量立刻不一样。
我自己的经验是,Skills 的价值长期被低估了。很多人专注在写 MCP Server,却忽略了给 Agent 沉淀“岗位手册”。其实在企业里复制一个资深 Agent,Skills 比工具更值钱——工具可以买、可以开源,方法论才是一个团队真正积累下来的东西。
2. 架构设计:一个可编排、可互通、可扩展的 Agent 集群长什么样
概念理清之后,关键问题就是怎么把这几个东西组装起来。我按照标题里“可编排、可互通、可扩展”三个目标,把集群拆成四层:底座、互通、能力、指挥。
2.1 四层架构:底座层、互通层、能力层、指挥层
第一层是底座层,也就是跑 Agent 的计算环境。现在常见的选择是 Docker 容器,比如有人问过“docker 容器里的 ros2 humble 和 micro-ros agent 怎么配置”,原理上是相通的:给每个 Agent 一个干净的运行时,依赖隔离、环境可复现、资源可限制。我的建议是不要省这一步,哪怕一开始只有一个 Agent 也要容器化,不然后面加 Agent 的时候环境冲突会让人崩溃。
第二层是互通层,负责 Agent 与工具、Agent 与 Agent 之间的通信。工具侧走 MCP,Agent 之间走 A2A。这一层是所有协议的核心战场,后面第 3 章我会详细讲实现细节。
第三层是能力层,就是 Skills 和各类 Agent 的集合。每个 Agent 带着自己的 Skills 包,相当于带了一套 SOP 上岗。能力层要解决的是“可扩展”——新技能就是往目录里扔一个文件夹的事,不需要改主程序。
第四层是指挥层,也就是编排。这就是热词里 Harness 和 Agent 区别的答案:Harness 是 Agent 运行时的“马具”,负责管理 Agent 的上下文窗口、工具权限、沙盒环境、执行循环;而 Agent 本身是“大脑”,负责推理和决策。编排引擎再往上做一层,管理多个 Harness 的协作流程、任务队列、并发策略和错误恢复。
2.2 工具选型:MCP 框架怎么选、Agent 底座怎么定
MCP 的 SDK 生态目前比较成熟的还是 Python 和 TypeScript 两个阵营。Python 用官方mcp库,TypeScript 用@modelcontextprotocol/sdk。我的建议是:如果你团队的 Agent 主要跑数据处理、API 集成,选 Python 生态,因为后面接各类库最省事;如果你的 Agent 跑在前端/浏览器插件里,选 TypeScript,比如在 IDEA 插件里做通义灵码接 Oracle 这种场景,TS 的集成会顺手很多。
Agent 底座的选择上,我试过几类:Claude Code 这类官方 CLI(配合 Codex 或 Claude Agent Skills 一起用)、开源的 Hermes Agent 这类桌面版方案、还有 Dify 这类偏向业务配置的平台。他们定位不太一样:官方 CLI 开发效率高,适合单个 Agent 的重度任务;Hermes Agent 适合接 Obsidian 这类个人知识库,做知识管理自动化;Dify 的强项是给非技术人员拖拽搭流水线,但它的 MCP 接入通常需要自己做代理层。至于生产级的多 Agent 集群,我更推荐自己搭控制层,因为目前还没有一个开箱即用、能同时管好 MCP、A2A、Skills 的编排产品。
2.3 为什么“可扩展”要靠 Skills 而不是靠硬编码
架构里最容易被忽视的是“可扩展性”的设计。很多团队的 Agent 能力是写在代码分支里的:加一个新工具就写一个新函数,加一个新场景就改一段 prompt。这不是可扩展,这是埋雷。
Skills 的模式天然适合扩展。在 Claude Code 的实践里,Skills 就是.claude/skills/目录下的一个个子目录,每个子目录里一个SKILL.md加若干资源文件。新增能力 = 新增目录 + 写一份说明书。Agent 启动的时候自动扫描目录,就能感知到新能力。这套机制移植到自己的集群里很简单:用一个skills/目录挂载到所有 Agent 的容器里,运营同学都能往里加技能,不需要写代码。
我为什么强调这一点?因为在企业里,Agent 的真正瓶颈不是模型能力,而是“团队怎么持续把自己的领域知识沉淀给 Agent”。Skills 这套模式把沉淀的过程从“找开发改代码”变成了“写一份结构化文档”,这个跃迁才是可扩展的根基。
3. 实操:从零搭建一个能跑的多智能体集群
这一章我把关键步骤拆开讲,代码和配置都是可以拿回去直接改用的。整体分四步:先写一个 MCP Server,再给 Agent 写 Skills,然后配置 A2A 互通,最后用编排层把整个流程串起来。
3.1 第一步:写一个最小可用的 MCP Server
以 Python 为例,先初始化项目并安装依赖:
mkdir mcp-tools cd mcp-tools python -m venv .venv source .venv/bin/activate pip install "mcp[cli]" httpx然后创建一个最简单的 Server,我拿“查天气”举例,方便聚焦核心机制:
from mcp.server import Server from mcp.server.stdio import stdio_server from mcp.types import Tool, TextContent app = Server("weather") @app.list_tools() async def list_tools(): return [ Tool( name="get_weather", description="根据城市名查询当前天气", inputSchema={ "type": "object", "properties": { "city": {"type": "string", "description": "城市名,如北京"} }, "required": ["city"] } ) ] @app.call_tool() async def call_tool(name: str, arguments: dict): if name == "get_weather": city = arguments["city"] # 这里替换成真实天气 API result = f"{city}:晴,25°C" return [TextContent(type="text", text=result)] async def main(): async with stdio_server() as (read, write): await app.run(read, write, app.create_initialization_options()) if __name__ == "__main__": import asyncio asyncio.run(main())这段代码里有三个关键点:list_tools声明工具清单和入参 schema,call_tool实现具体逻辑,stdio_server负责与客户端通信。你不需要自己定义通信协议,SDK 全部封装好了。跑起来之后,用 MCP Inspector 就能看到工具描述。
我在做企业级接入时,通常会在这一层加上日志和鉴权:每一个工具调用都记录调用方、入参、耗时,敏感操作加一个审批钩子。MCP 的价值之一就在这里——所有工具调用汇聚到 Server 层,安全和审计就有统一抓手。
3.2 第二步:给 Agent 编写第一份 Skills
Skills 目录结构按照 Claude Code 社区流行做法:
skills/ └── blog-writer/ ├── SKILL.md └── assets/ └── example-post.mdSKILL.md的文件头带 YAML frontmatter,内容示例:
--- name: blog-writer description: 编写高质量技术博客文章的完整方法论,适合写作类 Agent 加载 --- # 博客写作指南 ## 适用场景 需要输出结构清晰、实操性强的技术文章时使用。 ## 写作流程 1. 先梳理目标读者和核心关键词 2. 搭建文章骨架:开头引入、主体拆解、实操细节、避坑经验 3. 正文每段不少于 150 字,避免空泛总结 4. 涉及代码必须标注语言类型 5. 结尾用真实经验或技巧收尾,不写套话关键在于:这份文件是给模型“读”的,而不是给人看的。所以描述必须足够具体、足够操作化。我见过很多人写 SKILL.md 像写产品文档,满篇“要高质量”“要注重细节”,模型读完等于没读。真正的 Skills 要写出判断标准、操作顺序、禁忌清单,最好再给一个正反例对照。
写完这份 SKILL.md 之后,把它挂载到 Agent 的 skill 目录里。如果你用的是 Codex,可以把 Skill 直接放到~/.codex/skills/下面;如果是自己写的 Agent 代码,启动时扫描skills/目录,把每个 SKILL.md 读取到系统提示词里即可。
3.3 第三步:打通 A2A,让 Agent 之间能互相派活
A2A 的实现思路是:每个 Agent 启动时都会生成一份 Agent Card,声明自己的能力和通信端点。我用一个最轻量的 JSON 格式演示:
{ "name": "data-analyzer", "description": "负责数据清洗、统计分析和图表生成", "url": "http://agent-data-analyzer:8080/a2a", "skills": ["pandas-analysis", "chart-generation"], "authentication": { "scheme": "bearer", "credentials": "env:A2A_API_TOKEN" } }Agent Card 注册到一个服务中心,别的 Agent 需要服务时就到这里查“名片”。我建议在生产环境用 Redis 或者直接放 etcd 做服务发现,简单场景下用文件+轮询也能跑。
真正调用别的 Agent 时,HTTP 协议大致长这样:
POST /a2a { "jsonrpc": "2.0", "method": "tasks/send", "params": { "task_id": "task_001", "agent_id": "data-analyzer", "input": { "instruction": "分析用户留存数据并生成趋势图", "context": "数据源:/data/retention.csv" } } }这个调用会创建一个任务,A2A 客户端轮询任务状态,直到对方回传completed并带上结果。Spring A2A 这类封装就是把上述握手、加密、超时重试做成了注解和模板方法,省去很多重复工作。
这里分享一个实践教训:A2A 的任务状态机一定要设计。最低要求是 pending、running、completed、failed 四个状态,否则一个 Agent 挂了,主流程根本不知道任务卡在哪儿。稍微复杂一点还要支持 cancel 和 timeout,不然一个子 Agent 死循环,整个集群跟着遭殃。
3.4 第四步:用编排层把流程串起来
编排层是最能体现“DeepAgents”深度的地方。DeepAgents 这个概念你可以理解为:不是写一个魔法函数,而是深入 Agent 的每一步——规划、记忆、工具选择、自我反思、错误恢复——都显式地编排起来。
我用一段伪代码演示编排思路:
async def run_pipeline(): # 1. 规划阶段 plan = planner.decompose("写一篇关于 MCP 的博客并配图") # 2. 指派阶段 blog_task = orchestrator.dispatch("blog-writer", plan.article) chart_task = orchestrator.dispatch("chart-generator", plan.figure_spec) # 3. 并发执行 article, chart = await asyncio.gather( agent_runner.run(blog_task), agent_runner.run(chart_task) ) # 4. 汇合与校验 if not validator.check(article, chart): raise RetryError("质量不达标,重新生成") return merge(article, chart)这里的关键点不是代码本身,而是三个设计决策:
第一,规划与执行分离。规划 Agent 只负责拆解任务,不负责干活。这样方案阶段和耗时阶段互不阻塞,也方便后续做方案审计。
第二,并发策略要可控。AI Agent 是单并发场景下最容易失控的。我用的是自研的任务池 + 信号量限流,核心逻辑就是:先把任务拆成 DAG,再把没有依赖关系的节点交给一个asyncio.Semaphore(5)的边界内并发执行。热词里“AI Agent 怎么扛并发”的答案就在这里——不是硬扛,而是削峰、排队、限制工具调用的 QPS。
第三,凡是能出错的步骤都要重试。LLM 调用不像传统接口,同一个输入可能连续失败三次,但第四次就成功了。我的重试策略是:模型调用失败指数退避重试 3 次,工具调用失败最多重试 1 次并降级,编排层兜底改为串行执行防止死锁。
3.5 对接真实场景:Dify、低代码平台与 IDE 插件的 MCP 接入
集群跑通之后,你会发现周边系统接入才是工作量最大的部分。实际项目里至少会遇到这三类:
第一类是 Dify 这类低代码平台接入 MCP。Dify 本身有自己的工具机制,但社区对浏览器 MCP 这类能力需求很高。可以实现的思路是写一个 Bridge Server,把 Dify 的自定义工具接口转换为 MCP 协议,这样 Dify 的流程里就能用上 Playwright MCP 的浏览器自动化能力。注意不要直接在 Dify 里拼 HTTP 请求调用 MCP Server,因为 MCP 是长连接协议,不是简单的 REST,中间要有一层适配。
第二类是后台管理系统集成 MCP。RuoYi-Vue-Pro 这类框架合并 MCP 功能,通常是把 MCP Server 的注册、启用、鉴权做成前端菜单,后端维护一个 Server 实例池,通过 SSI 或 WS 转发给 Agent 使用。这样做的好处是企业里不同的部门可以各自维护自己的工具包,互不干扰。
第三类是 IDE 插件。IDEA 里用通义灵码这类 AI 插件接 MCP 时,痛点通常是权限和驱动。插件需要有一个独立的 MCP Client 配置入口,并且驱动 Oracle 这类数据库时,要把 JDBC 的驱动包放到 MCP Server 的 classpath 里,别指望插件自动帮你处理。这里我建议做成两个进程:插件进程只做 UI 展示,MCP Server 进程管数据库访问,避免插件崩溃连带数据库连接全断。
4. 常见问题与排查技巧实录
这一章是真正从线上踩坑得来的,每一条都是拿时间换来的。我整理成速查表,下面挑重点展开。
| 现象 | 可能原因 | 快速排查方法 |
|---|---|---|
| Codex 无法找到 MCP | 配置路径错误或 Server 未启动 | 用mcp list查看注册情况 |
| Agent 执行终止(execution terminated due to error) | 上下文溢出或工具超时 | 拆分任务并加大超时配置 |
| Skills 不生效 | 目录名与 SKILL.md 的 name 不一致 | 检查文件头 frontmatter |
| A2A 任务卡在 pending | 服务发现失败或鉴权失败 | 查看子 Agent 日志和注册中心状态 |
| MCP Server 频繁断开 | 并发过高或心跳超时 | 排查连接池配置 |
4.1 Codex 找不到 MCP 或发送失败
Codex 找不到 MCP 是我遇到频率最高的问题。常见原因有三个:一是 MCP Server 的进程没起来或端口被占用;二是配置里的命令路径不对,比如在 Windows 上直接写了python而没有写全路径;三是 Codex 的沙盒环境隔离了网络,Server 虽然跑着但客户端连不上。
排查思路很简单,先在终端里手动把 Server 跑起来,确认端口通;再在 Codex 配置里用绝对路径;最后检查沙盒网络配置,必要时把 MCP Server 的地址加入沙盒白名单。这类问题 90% 出在环境和配置,而不是协议本身。
4.2 Agent 沙盒报错与安全边界
热词里“显示更新 agent 沙盒”这个报错,多半是沙盒环境更新后,依赖版本变了。比如你原来在沙盒里装了mcp1.0,更新后变成了 2.0,接口不兼容,Agent 直接罢工。我的做法是:沙盒镜像打 tag,每次升级前跑一遍全量回归测试;同时把 MCP SDK 的版本锁死在 requirements.txt 里,不做滚动升级。
沙盒的安全边界也要注意。Agent 能跑的代码、能连的内网、能读的文件,必须在编排层做白名单。我见过一个团队把生产数据库的只读账号给了 Agent,结果一个测试 Agent 的循环任务把数据库连接池打满。这事不怪模型,怪权限设计。
4.3 Skills 冲突与加载顺序
Skills 加载最典型的问题是两个 Skills 同时命中,模型不知道该听谁的。比如一个通用写作 Skill 和一个技术博客 Skill,都包含“怎么写开头”,模型可能混着执行。我的规范是:每个 Agent 只挂载与职责相关的 Skills 目录,明确优先级——领域专用 Skill 优先于通用 Skill。另外 SKILL.md 里的 name 必须和目录名一致,之前吃过亏,目录改名后忘了同步 frontmatter,模型加载时报错。
4.4 MCP 鉴权与授权:以 Figma、蓝湖接入为例
设计工具类 MCP 的授权机制要单独说。Figma 这类工具通常走 OAuth,不能简单地塞一个 token 进去。比如 Codex 接入 Figma MCP,首次会弹授权页面,你需要把回调地址配置到 MCP Server 的启动参数里,让授权流程能完整走通。蓝湖这种国内设计协作平台类似,授权以后还要处理 refresh token 过期问题,我建议在 Server 层把 token 刷新做成自动任务,不要等用户手动重新授权。
这类授权链路中有一个易踩的坑:OAuth 回调地址如果用了 localhost,在容器或远程开发环境里会因为端口映射失效而无法回调。解决办法是把 MCP Server 的监听地址改成可访问的宿主机地址,或者用反向代理把回调转到容器内。
5. 从开发到生产:把集群做得更稳的五个细节
单机跑通、联调通过之后,距离一个能上生产的集群还差很多。这五个细节是我在实际项目中反复踩、反复改出来的,提前布局能省掉后面大量的返工。
5.1 日志和追踪:Agent 集群的“黑匣子”
AI Agent 的执行链路天然不可预测,没有日志根本没法排查。我不但给 MCP Server 加日志,还给每个 Agent 加了 trace_id,从编排层的任务下发开始,贯穿到子 Agent 调用、工具调用、模型生成的每一次交互。这样用户报一个问题,我能直接从日志里拉出整条链路,定位是模型决策错了、工具执行失败了还是编排死循环了。
日志里一定要记录:prompt 的摘要(不用存全文,存关键参数)、模型输入输出 token 数、工具调用入参和出参、关键节点的耗时。特别是工具调用的入参出参,必要的时候要做脱敏,但原始数据至少要留存 24 小时用于事故回溯。
5.2 状态管理:编排层的多活与持久化
编排层的调度状态不能放在内存里,否则编排层一重启,所有进行中的 Agent 任务全丢。我用的方案是:编排层把任务状态写入 Redis,用任务 ID 做键,存储规划结果、依赖关系、当前执行节点、各子 Agent 的返回。编排层本身做多实例部署,抢锁用 Redis 分布式锁,确保同一个任务不会被两个实例重复执行。
状态持久化顺带解决了一个问题:Agent 执行到一半挂了,编排层重启后能根据 Redis 里的状态决定重试还是回滚,而不是从头再来。
5.3 限流、熔断与降级:防止 Agent 雪崩
多 Agent 集群最可怕的不是单个 Agent 慢,而是一个上游 Agent 挂了,下游一堆 Agent 都在等它,连接池和任务队列一起爆掉。我的做法分三级:限流指的是每个 Agent 的 MCP 工具调用做 QPS 限制,防止模型生成速率过高打爆下游 API;熔断指的是上游持续失败时,编排层自动摘除该 Agent,不让新任务再发给它;降级指的是核心链路要有备选方案,比如用搜索 MCP 失败时降级成静态库检索,宁可结果糙一点,不能让整个流程空转。
5.4 安全与权限:给 Agent 发最小权限的“工牌”
Agent 安全的核心是权限最小化,这个原则和执行者是谁无关,和模型是否自作主张有关。我见过最典型的事故是一个被授予了写权限的 Agent,在执行一次数据库订正任务时,把一张生产表的上万条记录更新成了错误值。原因很简单:模型的判断出现偏差,但权限没有拦住偏差。所以我的铁律是:默认只读,写操作必须走审批钩子;每个 Agent 使用单独的服务账号;MCP Server 层做操作白名单,而不是黑名单。
热词里“Agent 安全”被很多人讨论,我的看法是:与其担心 Agent 泄露 prompt,不如先把工具权限管好,因为工具能做的破坏远比模型知道的秘密大。
5.5 成本控制:token 用量和并发时长的监控
Agent 集群跑起来之后,成本会以非常惊人的速度增长。一个包含三个子 Agent 的流水线,一次完整执行可能要消耗十万甚至几十万 token,而且失败重试还会加倍。我建议在编排层加成本计数器:每次任务完成后记录总 token 消耗、按 Agent 维度拆分的消耗、按工具调用的消耗。数据攒两周之后,你就能看到哪些任务性价比低、哪些 Skill 让模型少走了弯路。这不是财务问题,这是架构优化问题——成本数据会反过来指导你调整流程。
6. 一些我踩过的坑和个人体会
最后分享几个偏“软”的经验,它们在文档里几乎不会写,但会决定你的集群到底好不好用。
第一个体会是:不要一开始就追求全自动。很多团队做多 Agent 集群,恨不得从任务下发到结果生成全自动无人值守,结果第一个月全在救火。我现在的习惯是:新流程先跑“半自动模式”,编排层每个关键节点都停下来等人审核,跑顺了再逐步放开。这样做最大的好处是能积累一套“正常流程长什么样”的基准数据,后面自动化出问题的时候,对比基线就能快速定位。
第二个体会是:Skills 是要持续运营的资产,不是写一次就完了。我每个季度会挑几个线上案例复盘,看 Agent 是哪一步没做好,然后把改进方法更新到对应 SKILL.md 里。三个月下来,同一个业务的 Agent 成功率能明显提升,而且这个过程不需要换模型、不需要改代码。这比天天调 prompt 有意义多了,因为 Skills 是结构化沉淀,prompt 是随缘调参。
第三个体会是关于工具选择的。Browser Use MCP 和 Playwright MCP 的区别经常有人问,我统一回答:如果只是要浏览器自动化脚本,选 Playwright MCP,稳定且可控;如果要的是 Agent 自主探索网页,根据内容动态决策点哪里,选 Browser Use MCP,它的规划能力更强,但代价是消耗更多 token、执行更慢。两者没有绝对的谁更好,只有适不适合当前任务。这也是我给整个技术栈做选型时的通用思路——协议和框架都是手段,真正的目标是让你的业务跑得更稳、更快、更可控。
这套 DeepAgents + MCP + A2A + Skills 的组合,目前没有现成的全家桶产品,需要自己拼装。但拼装本身不是坏事,因为每一次选择都逼着你把架构想清楚,而想清楚的团队,才接得住下一代 Agent 集群的复杂度。