最近后台收到不少朋友私信,几乎都是同一个困惑:想给 Agent 扩展能力,结果发现方案多到让人头大。什么 Skill、MCP、插件、Function Call、Harness……光名字就够绕一阵,更别提怎么选。有人觉得 Skill 是未来,有人吹 MCP 是标准,还有人坚持插件才是王道,吵得不可开交。这几年我深度参与过几个基于 Rust 的 Agent 框架开发,也埋过头去改各种插件市场、调试 MCP 服务,算是把这三样东西从里到外摸了一遍。今天不聊概念,只聊真相,用我实际踩过的坑和验证过的场景,把 Skill、MCP 和插件之间的真实关系拆开揉碎讲清楚。
先说结论:这三者根本不是竞争关系,而是不同层次、不同侧重的能力扩展机制。它们解决的是不同维度的问题,真正成熟的 Agent 架构,往往是三种机制共存、按场景协同发力。标题里那句“不是三选一”,恰恰是大多数人理解偏差的起点。这篇文章我会从设计思路、核心原理、实操配置、选型策略到典型问题,完整梳理一遍,尽量少讲废话,多给能直接落地的判断依据和操作参考。
1. 三种能力扩展方式的定位拆解,先说清楚它们到底有什么本质不同
很多人把这三个概念混为一谈,根本原因是它们都指向同一个结果:让 Agent 变强。但变强的路径完全不同,就像给一台电脑升级,你可以装新软件、加新硬件、或者改操作系统的配置,目的都是提升能力,但手段、成本、适用边界天差地别。
Skill(技能)的本质是提示词级别的能力封装。它不改变 Agent 的执行引擎,也不引入新的运行时依赖,而是通过一段精心设计的能力描述、使用约束和示例,让模型在生成回复时知道“遇到这类任务该用什么方式处理”。换句话说,Skill 改变的是模型的思维方式和行为模式,而不是它可调用的外部工具清单。比如一个“GIS 空间分析 Skill”,本质上就是告诉模型:处理地理坐标数据时要先进行投影转换、要区分矢量与栅格数据、空间查询要采用何种语义。模型没有真的连接 GIS 引擎,但它学会了按 GIS 专家的思路来调遣自身能力。
MCP(Model Context Protocol,模型上下文协议)则是标准的工具接入层。它的核心价值在于把“工具能力”和“工具实现”解耦。你写一个天气查询服务,只要实现 MCP 协议规定的接口,任何支持 MCP 的 Agent 都能发现并调用它,不用关心对方是 Claude、ChatGPT 还是自研框架。这个思路很像 USB 接口——你做一款 U 盘,只要按 USB 规范做接口,任何电脑都能即插即用。MCP 是目前行业向“工具互操作”方向收敛的最重要趋势,特别是 Playwright MCP、IDA MCP、数据库 MCP 这些生态项目,正在快速变成 Agent 连接真实世界的标准桥梁。
插件(Plugin)的定位就更加“宿主化”了。它通常运行在 Agent 应用内部,直接与宿主程序的逻辑层交互,可以修改 Agent 的行为流程、UI 界面、状态管理甚至渲染逻辑。比如小红书自动发布插件、Markdown 数学公式渲染插件、DSH 归档管理插件,这些插件很多时候不是给模型用的,而是给整个 Agent 产品用的。它们扩展的不是模型的能力边界,而是这个软件系统的能力边界。
| 维度 | Skill | MCP | 插件 |
|---|---|---|---|
| 能力载体 | 提示词/指令集 | 外部工具服务 | 宿主程序代码 |
| 生效层次 | 模型行为层 | 工具接入层 | 应用逻辑层 |
| 典型成本 | 低,纯文本设计 | 中,需要建模工具协议 | 高,需深度集成宿主 API |
| 跨平台性 | 与模型强相关 | 跨 Agent 平台通用 | 通常只适配单一宿主 |
| 典型场景 | 让模型转变思路 | 让 Agent 调用外部系统 | 让 Agent 产品改变形态 |
这张表非常关键。Skill 改的是模型的大脑,MCP 接的是外界的手脚,插件改的是宿主的身躯。三者定位差异如此之大,强行“三选一”显然不科学。我在实际项目里最常见的组合是:用几个核心 Skill 控制模型的推理套路,用一组 MCP 工具打通内部数据系统和自动化测试链路,再用少量插件优化 Agent 产品的交互体验和部署形态,三者各司其职,并不冲突。
2. Skill 到底怎么设计,才能让模型真正“学会”而不是“背下”
想搞清楚 Skill 的真相,得先破除一个迷思:Skill 不是给模型塞知识,而是给模型定方法。很多初做 AI Agent 的人会把 Skill 写成长篇大论的产品说明,指望模型读一遍就能变成专家,结果效果非常差。真正好用的 Skill,讲究的是“触发条件 + 处理框架 + 输出范式 + 边界约束”四件套。
2.1 Skill 的核心结构,从一份实用的编码规范说起
以热词里频繁出现的“Skill 编码 193”“Skill 编码 247”为例,这些编号在社区里通常对应特定领域的行为模板。比如编码 193 常见于数据处理类技能,编码 247 多对应代码评审类技能。虽然它们具体内容因仓库而异,但结构是高度统一的。
一个典型 Skill 长这样:开头写明触发场景,也就是什么情况下模型应该激活这个技能,避免乱用;接着给标准的思考框架,规定模型必须先分析什么、再决策什么、最后输出什么;然后是示例演示,用一两个具体案例展示期望的输入输出格式;最后写明禁用事项,什么不能做,什么情况下要主动拒绝。这套写法和传统的 Prompt Engineering 一脉相承,但比普通 Prompt 更工程化、更可复用、更便于版本管理。
我最开始设计 Skill 时走过弯路,把重点放在了“描述知识”上,比如告诉模型“Python 的 GIL 是什么”“Rust 的所有权规则有哪些”。后来发现,模型本来就知道这些知识,真正缺的是面对复杂任务时的“处置流程”。打个比方,你教一个新人做菜,给他一本食材百科全书远不如给他一份“备菜→热锅→下料→调味→装盘”的标准作业流程好用。模型也是这个道理,它缺的从来不是知识点,而是处理问题的章法。
2.2 Skill 的生效机制与排查技巧
Skill 能否生效的关键,取决于模型能否在推理过程中检索并遵循对应的技能描述。主流 Agent 框架通常采用两种引入方式:一种是系统提示词全量注入,把所有 Skill 的描述都塞进上下文;另一种是动态检索,根据用户问题的语义相似度,从技能库中召回最相关的一批 Skill 再注入。前者的优点是实现简单、响应稳定,缺点是上下文占用大、多个 Skill 互相干扰;后者节省 token,但对检索质量要求很高,召回不准时技能就形同虚设。
实际排查 Skill 不生效问题,我常用的顺序是:先确认 Skill 文本确实被注入到了模型输入中,再检查触发条件描述是否和用户真实问题语义对齐,接着看示例是否和真实场景形态一致,最后验证是否被系统提示词中的其他指令压制。很多人折腾半天,最后发现是触发条件写得太苛刻——比如要求用户必须说出“请用 xx 技能处理”这样的指令。真实用户才不会这么说。触发条件应该写得更宽泛、更基于意图语义,而不是字面匹配。
注意:Skill 不是万能的。对于需要感知实时数据、操作外部系统的任务,Skill 再精妙也解决不了问题。模型无法通过一段提示词直接读取数据库或控制浏览器,这种场景必须靠 MCP 这类工具接入机制来补位。这点认知是判断 Skill 适用边界的重要基础。
3. MCP 深度拆解:为什么协议化接入成了 Agent 工具生态的主流趋势
聊完了 Skill,再看 MCP。前面说过,MCP 的价值在于标准化工具接入。但这里有个经常被忽略的关键点:MCP 不是一种具体的工具,而是一种描述和调用工具的协议。你可以理解成 HTTP 之于网页——网站千千万万,但大家访问网站都遵循同一套协议,浏览器不用为每个网站单独写一套访问逻辑。MCP 之于 Agent 工具,同样是这层意思。
3.1 MCP 的工作流程,从服务发现到工具调用全链路
一个标准的 MCP 交互流程大致分为四步。第一步是发现,Agent 客户端通过 MCP 协议的标准握手,向 MCP Server 询问“你提供了哪些工具”,服务端返回一个工具列表,包括每个工具的名称、描述、输入参数 Schema。第二步是路由,Agent 根据当前任务语义,从工具列表里挑一个或多个合适的工具,生成符合 Schema 的调用请求。第三步是执行,MCP Server 接收请求后,在服务端真正执行操作,比如查询数据库、操控浏览器、读写文件、调用外部 API。第四步是返回,服务端把执行结果整理成结构化的响应内容,交回给 Agent,模型基于这些结果生成最终的用户答复。
这四步里有几个细节值得展开。工具描述怎么写,直接决定了模型会不会在关键时刻想起用它。很多 MCP Server 的代码写得很好,但工具描述一句话带过,模型就像面对一个简历写得极差的候选人,根本匹配不上。我调试过几十个 MCP 服务,这类“工具定位不明确”是最常见的失效原因之一。
另一个细节是上下文裁剪。MCP 工具返回的结果可能非常庞大,比如你让 Agent 浏览一个复杂网页,全文 HTML 可能有几十万字符,全部送进模型上下文既浪费 token,又容易淹没关键信息。成熟的做法是服务端先做预处理,只返回正文内容或关键数据摘要;如果 Agent 框架支持,还可以由模型自主决定是否需要进一步展开详情。我在做 Playwright MCP 自动化时,就吃过很大的亏:第一次跑全量抓取,直接把 11 万字符的页面代码塞给模型,结果不仅慢了十几秒,后续对话的上下文也全被污染。后来我改成服务端提取文本主干了,整个链路才顺手。
3.2 不同场景下的 MCP 工具搭建与注意事项
MCP 工具的场景差异非常大,拿热词里出现频率最高的几类来说。Playwright MCP 主要用于浏览器自动化,它可以接收 Agent 的指令完成打开网页、点击按钮、填写表单、提取数据等操作,是爬虫和自动化测试领域的利器。IDA MCP 则面向逆向工程,帮分析人员用自然语言指挥 IDA Pro 进行反编译、搜索函数、查看交叉引用,大幅降低逆向分析的门槛。还有数据库 MCP、文件系统 MCP、图像处理 MCP,各自解决一类具体的资源访问问题。
搭建 MCP Server 时,除了实现协议本身,有三件事必须提前规划。一是鉴权方式,MCP 服务往往暴露在内部网络中,如果服务本身操作敏感资源,比如数据库、内网文件、生产环境,就必须做身份校验和权限控制,不能裸奔。二是错误处理,MCP 协议要求错误信息结构化返回,但很多工具内部抛出的堆栈信息是不适合直接透出的,必须在服务端做一层封装与脱敏。三是超时与并发限制,语言模型调用工具一般都有时间阈值,如果你的 MCP 服务执行一条操作要跑两分钟,很可能 Agent 那边已经判定超时了,需要在设计上支持异步任务或限定单次操作粒度。
我在生产环境部署 MCP 时还有一个经验:尽量把 MCP Server 做成独立的进程服务,而不是嵌入 Agent 宿主进程。独立进程的好处是故障隔离,MCP 服务挂了不至于拖垮整个 Agent;资源管理也更灵活,比如 Playwright MCP 这类重度依赖浏览器实例的服务,单独跑可以独立控制内存和进程数,出问题重启也方便。这一点很多人图省事忽略了,等线上出事故才后悔。
4. 插件机制的本质与边界,聊聊什么场景真正需要插件
说完 MCP,再看插件。插件和技术同学熟悉的“IDE 插件”“浏览器插件”概念一脉相承,都是对宿主系统的能力扩展。但在 AI Agent 语境下,插件的范围要更广,它可以扩展模型之外的一切——界面交互、事件流、存储层、导出格式、工作流编排等。我见过最好用的一个 Agent 插件,是给对话记录加自动标签归档的。它完全不影响模型推理,纯粹是宿主程序层面的功能扩展,但对日常使用的效率提升非常明显。
4.1 插件与 MCP、Skill 的协作关系,以及常见的边界问题
插件和 MCP 的边界是最容易让人困惑的地方。我给出的判断标准很简单:如果这个能力需要让模型感知和调度,那走 MCP 更合适;如果这个能力只是宿主程序自己用,不需要模型参与决策,那走插件更合适。举个例子,你想让 Agent 能读取 PDF 文件并让模型分析内容,这是 MCP 的活;你想给 Agent 的 Web 界面加一个“一键导出全部对话为 Markdown”的按钮,这是插件的活。前者是模型的手脚,后者是宿主的功能模块。
插件和 Skill 的边界就更清晰了。Skill 改变模型的思考方式,插件改变系统的行为方式。比如热词里的“Markdown 数学公式插件”,它的作用是让 Agent 产品在渲染对话内容时正确显示 LaTeX 公式。这事模型不需要关心,模型只需要按 Skill 或普通提示词生成对应的 LaTeX 语法,后面怎么展示就是插件负责了。两者配合得像流水线:模型负责产出内容,插件负责修饰呈现。
我见过不少创业团队在这个边界上栽跟头。有人想把所有外部工具都做成插件,结果宿主程序和外部逻辑高度耦合,升级 Agent 框架时插件全挂。有人想把所有界面改动都做成 MCP 工具,结果模型为了渲染一个按钮还非要“调用工具”,又慢又蠢。正确的做法是先分清扩展的本质落点,再选择对应的技术栈。
4.2 插件开发的关键注意点
如果你确实需要开发 Agent 插件,有两个经验值得提前知道。第一,尽量设计稳定的插件接口,避免直接依赖宿主内部私有数据结构和函数。宿主框架升级是非常频繁的,接口稳定才能保证插件生命周期长久。第二,做好插件的隔离性,包括异常隔离和权限隔离。插件运行时的崩溃不能影响宿主主进程,插件能接触的数据范围也要严格界定。市面上像 DS H 插件市场这类生态,之所以插件质量参差不齐,很大程度上就是宿主对这两点的约束不够严格。
插件加得多,启动速度和内存占用一定会上升,这是没有办法的事。我的建议是插件按需启用,不要一股脑全部安装。把不常用的插件标为禁用,用到时再开启,能显著减少宿主资源的浪费,也降低插件间冲突的概率。这个问题听起来小,但在实际使用中非常常见——尤其当你安装了几十个插件之后,Agent 应用启动慢得像老牛拉破车,排查时才发现是十来个插件在同时抢资源。
5. 如何根据实际场景做能力扩展选型,给一个可以直接套用的决策框架
讲了这么多定位和原理,最终还是要落到一个现实问题上:我的项目到底该怎么选?这里我给一个我自己一直在用的决策流程,从任务的本质出发来判断,而不是从技术热度出发。
5.1 一张决策表帮你快速定位
| 项目场景 | 首选机制 | 补充机制 | 选型原因 |
|---|---|---|---|
| 需要让模型按特定方法思考、分析、输出 | Skill | 无 | 这是思维层的事,提示词最直接 |
| 需要连接数据库、浏览器、IDE 等外部系统 | MCP | Skill | MCP 提供标准化工具接入,Skill 定义使用策略 |
| 需要改变 Agent 产品的界面、交互、归档等功能 | 插件 | 无 | 这是宿主能力,模型不需要参与 |
| 需要让 Agent 完成多步骤真实业务操作 | MCP + Skill 组合 | 插件 | MCP 动手,Skill 保障每一步的决策质量 |
| 需要快速验证 Agent 能力的最小原型 | Skill 先行 | 后续按需接 MCP | 成本最低,迭代最快 |
这张表的核心逻辑是:先看任务发生在哪一层,再选对应机制。情绪判断、分析决策、内容生成,这些发生在模型内在推理空间的任务,应该优先用 Skill 来约束和引导。真实世界操作、数据交互、外部系统控制,这些发生在模型外部的任务,必须用 MCP 做桥接。宿主产品形态、用户交互体验、本地数据管理,这些发生在 Agent 应用本体上的任务,用插件最合理。
5.2 三种机制协同的经典架构参考
在实际项目里,我的典型组合是重 Skill + 中 MCP + 轻插件。重的意思是 Skill 数量要多、覆盖面要广,因为这是模型行为质量的地基。中的意思是 MCP 要精选,只接那些真正高频、稳定的外部系统,用质量换复杂度。轻的意思是插件尽量少,保持宿主轻量,能不做就不做。
举个例子,我最近在做一个基于 Rust 的 Agent 项目,需要让 Agent 辅助巡检前端页面。架构上是这样组织的:一组核心 Skill 规定了巡检报告的结构规范、问题定级标准和修复建议输出格式;一个 Playwright MCP 服务负责连接无头浏览器执行真实的页面交互;一个小插件负责把巡检结果同步推送到团队内部的消息系统。三者各司其职,没有哪个替代了哪个。Skill 保证模型判断专业,MCP 保证操作真实可靠,插件保证结果触达业务闭环。这个架构稳定跑了几个迭代周期,几乎没有返工。
如果上来就用插件框架硬写一个浏览器控制逻辑,你会发现大部分精力花在和宿主内核斗争上,效果还不如直接用 Playwright MCP 来得快。反过来,如果用 Skill 去教模型“假装知道你本地文件系统的状态”,那永远是纸上谈兵,模型无法真实读取文件内容的。选型错误是项目推进最大的隐形杀手,远比你想象中更值得花时间仔细思考。
6. 一次完整的混合扩展实操记录:让 Agent 自动抓取网页数据并生成分析报告
理论讲了再多,不如动手跑一遍。我拿最近做的一个小项目来复盘,任务很简单:让 Agent 自动抓取一个数据网页、提取关键指标、生成一份结构化的趋势分析报告。完整走一遍 Skill、MCP、插件的组合链路,你会更清楚每个环节怎么衔接。
6.1 需求场景回顾与整体架构设计
需求来自一个市场调研需求:每周抓取某行业资讯页面,提取新增产品、价格变动、关键事件等信息,输出统一格式的分析周报。我设计的链路是这样的:Playwright MCP 负责打开网页、等待渲染、提取页面主干内容;一个自研的 Skill 负责规定分析周报的格式和深度,包括每个模块的必填项、指标口径、异常数据的处理方式;最后用一个小插件把生成的分析报告自动保存到指定目录并按周归档。这个设计没有引入复杂框架,也没有跨越多系统,却完整覆盖了“感知-思考-行动”三个维度。
这背后的设计思路值得说一句。我把“抓什么”交给了 MCP,把“怎么看”交给了 Skill,把“怎么存”交给了插件。每层只关心自己职责范围内的事。这样做的好处是每层都可以独立测试、独立升级。MCP 服务换了抓取策略,不影响 Skill 的分析框架;Skill 调整了报告结构,不需要碰宿主逻辑;插件想改成存到数据库,也只是单独模块的变化。
6.2 实际操作步骤与逐步实现要点
第一步,准备 Playwright MCP 服务。我用的是 Python 版本的 MCP Server 包,安装后按官方文档配置浏览器路径和启动参数。这里有一条实操经验:不要用默认的headless模式直接跑复杂页面,有些网站会检测无头浏览器并返回异常页面。我通常先跑一遍有头模式确认元素定位稳定,再切回无头模式做定时任务。
第二步,编写分析 Skill。我把周报要求写成了结构化技能文件,包含周报的六个固定模块:本周重点事件、核心指标变化、市场异动记录、竞品动态摘要、风险提示、下周关注点。每个模块都给出了书写风格示例和禁止行为。比如风险提示模块,要求必须引用具体数据来源,禁止主观臆测;竞品动态摘要模块,要求按影响程度排序,不能按时间流水账式罗列。
第三步,实现归档插件。插件代码挂在 Agent 宿主程序里,监听报告生成完成的事件,然后把 Markdown 文件移动到按日期命名的目录下,并生成一份带文件摘要的索引。整个过程没有调用模型,纯粹是宿主级逻辑,用插件来做非常合适。
跑完一遍流程后,效果明显超过之前单用 Prompt 的方案。之前让模型直接“看”网页再写周报,经常出现信息遗漏,因为网页内容太长导致上下文关键信息被稀释。现在由 MCP 精准提取主干数据,模型只处理浓缩后的信息,准确率大幅提升,输出格式也稳定多了,几乎不需要人工修改框架。
实操里有一条颠扑不破的规律:Agent 的上下文是稀缺资源。任何能力扩展,优先考虑是否能减少模型要处理的噪音,而不是增加更多输入。MCP 在这里扮演的“信息预处理”角色,往往比“工具调用”本身更有价值。
7. 常见误区与排错经验:别再纠结最优解,先把这三种机制用对
最后聊几个社区里高频出现的坑。这些不是理论推演,而是我亲眼见到的团队踩进去又爬出来的过程,值得每一个做 Agent 开发的人记在小本上。
7.1 高频误区盘点与纠正
第一个误区是“有了 MCP 就不需要 Skill”。这类团队通常被 MCP 的生态繁荣吸引,以为只要把工具接得足够多,Agent 就能干好活。结果是工具确实能调用,但模型根本不知道什么时候调用、调用后怎么解读结果。比如拿到了网页数据,却分不清哪些指标该优先分析,哪些异常需要重点标注,产出的报告还是平庸。MCP 解决“能不能做”的问题,Skill 解决“做得好不好”的问题,两者根本无法互相替代。
第二个误区是“把所有逻辑都写成 Skill”。这是另一个极端。团队怕引入外部依赖,就想让模型“假装”完成所有事。比如让模型根据记忆回答某个网站的实时价格,这是典型的幻觉制造机。Skill 再强也改变不了模型没有实时感知能力的事实。这种场景必须接受现实:引入 MCP 或工具接入不是复杂度负担,而是正确性的保障。
第三个误区是“插件可以承载任何扩展”。插件确实覆盖范围广,但它的代价是宿主耦合度高。一旦宿主大版本升级,插件往往要跟着改。如果你把外部工具访问逻辑做进插件里,等于把最容易变化的边界和最稳定的宿主绑在了一起,非常不利于长期演进。外部能力与宿主之间,始终应该有一层独立于宿主的协议或服务边界。
7.2 排查思路速查表
如果 Agent 的能力扩展表现不符合预期,我建议按下面的顺序排查,能省下大量盲目试错的时间:
| 现象 | 优先排查项 | 常见根因 |
|---|---|---|
| 模型从不使用某些工具 | 工具描述是否准确、触发条件是否匹配任务语义 | 描述含糊或埋得太深,未被模型注意 |
| 工具调用了但结果很烂 | MCP 服务端返回的数据结构是否适合模型消化 | 返回内容噪音过大,缺少预处理 |
| Skill 似乎完全没生效 | 检查 Skill 是否被检索或注入到上下文 | 触发条件写得太窄,或与系统提示词冲突 |
| 插件运行后宿主变慢 | 检查插件是否全部常驻加载 | 插件冲突或资源竞争 |
| Agent 回答还是空泛 | 检查是否有足够的示例约束输出格式 | 缺少强输出范式,模型自由发挥空间太大 |
| MCP 工具超时 | 检查单次工具执行耗时和任务粒度 | 同步执行了过重操作,未拆分 |
这个表格我每次给团队培训都会发一遍。很多人迷信调模型参数,其实大多数问题出在能力扩展的工程细节上,跟模型能力本身没有太大关系。调好工程细节,很多“模型不行”的结论都会被推翻。
我个人在实际项目里最大的体会是:Agent 的能力天花板,从来不取决于你用了哪个单一机制,而取决于你能否把 Skill 的思考约束、MCP 的工具接入、插件的宿主扩展组合成一条顺畅的流水线。纠结“哪个最好”是没意义的,先把每种机制用对、用透,再谈如何组合,路才会越走越宽。