
如果你是一名开发者最近在关注 AI 编程助手如 Claude Code、Cursor 等或 AI Agent 框架那么这三个词——Skill、Plugin、MCP——一定在你的视野里高频出现。它们听起来都像是“扩展功能”或“插件”但当你真正想去配置、开发或选择一个时却会发现概念模糊边界不清文档混杂。一个典型的困惑场景是你想让 AI 助手帮你搜索最新技术资料。你可能会看到“安装 Tavily Search Skill”、“添加 Brave Search Plugin”或“配置一个 MCP 服务器”。它们都能实现“搜索”但背后的技术栈、接入方式和维护成本天差地别。选错了可能意味着从“一键集成”变成“深度魔改”。本文的核心判断是Skill、Plugin 和 MCP 代表了 AI 能力扩展的三种不同范式和技术路径其区别远不止于命名。混淆它们会导致你在工具选型、技术债务和团队协作上走弯路。本文将通过一份虚拟的“技术周报”叙事结合具体案例和代码帮你彻底理清三者的设计哲学、适用场景与实操差异。读完本文你将能清晰地回答我的项目到底该用哪一个1. 从一份“混乱”的技术周报讲起假设你是某AI应用团队的技术负责人周一收到了这样一份周报【AI能力扩展本周进展】Skill方面小李为我们的内部助手开发了一个“周报生成Skill”它能够读取Jira ticket并自动总结本周工作。代码是用Python写的但接入方式比较hacky修改了助手的主逻辑。Plugin方面小王发现了一个开源的“图表渲染Plugin”可以直接让助手生成ECharts配置。我们通过pip install安装并在配置文件中添加了一行就启用了但发现它只能用于特定的Web框架。MCP方面小张调研了Model Context Protocol尝试把公司的GitLab仓库封装成一个MCP Server。现在助手可以通过标准协议查询代码库了但初期调试花了不少时间。这份周报暴露了几个关键问题概念混淆团队似乎把任何“新增功能”都随意称为Skill或Plugin。接入成本差异巨大有的需要改核心代码Skill有的即装即用Plugin有的则要搭建一个服务MCP。维护性担忧hacky的接入方式未来可能成为技术债务。这正是当前社区的普遍现状。下面我们跳出周报从定义和设计初衷开始正本清源。2. 核心概念拆解设计哲学决定了它们是谁2.1 Skill面向单一任务的“技能”或“脚本”通俗理解Skill 是 AI Agent 或助手自身学会并可以执行的一个具体动作或流程。它更像是 Agent 的“肌肉记忆”或“专项技能”。本质一段封装好的逻辑或脚本通常与特定的 Agent 框架或平台强绑定。类比就像一个人的“骑自行车”技能。这个技能存在于这个人Agent身上调用时不需要借助外部工具虽然需要自行车这个“资源”。关键特征内聚性Skill 的实现逻辑通常直接运行在 Agent 的进程或运行时环境中。高定制低复用为一个 Agent如某个特定的机器人编写的 Skill很难直接移植到另一个不同架构的 Agent 上。通常描述“如何做”例如“如何从Jira获取数据并生成摘要”。典型代表早期AI助手框架如早期Rasa的Actions、某些工作流自动化工具中的“技能块”、以及网络热词中提到的workbuddy skill、claude code skill。2.2 Plugin可插拔的功能“插件”通俗理解Plugin 是为主程序或框架提供扩展功能的独立模块。它通过明确的接口和生命周期与宿主进行交互。本质一个符合宿主规范的可插拔组件。宿主提供插座接口Plugin 提供插头实现。类比就像你的代码编辑器如VSCode的插件。编辑器定义了插件API任何开发者都可以按照这个API编写一个插件如Python语言支持、GitLens用户安装后即可获得新功能。关键特征标准化接口有明确的安装、加载、初始化、调用、卸载的接口规范。松耦合Plugin 与宿主相对独立通常可以独立开发、打包、分发如通过包管理器pip,npm。生态化容易形成丰富的插件市场。网络热词中的vite-plugin-eslint、pydroid repository plugin都是典型例子。通常描述“提供什么功能”例如“提供一个图表渲染功能”。典型代表几乎所有现代软件Webpack/Vite/Rollup 的插件、IDE插件VSCode, IntelliJ、WordPress插件、以及AI领域的某些工具插件。2.3 MCP (Model Context Protocol)模型与工具的“通信协议”通俗理解MCP 不是功能实现本身而是定义了AI模型如大语言模型与外部工具、数据源之间如何进行安全、标准化通信的一套协议。本质一个开放协议和标准类似于HTTP之于Web。它规定了客户端模型/助手和服务器工具之间的“对话”规则。类比USB协议。它不关心你插的是U盘文件工具、键盘输入工具还是打印机输出工具它只定义设备与电脑之间如何供电、传输数据。MCP就是AI世界的“USB协议”。关键特征协议先行MCP 首先是一份标准文档定义了资源Resources、工具Tools、提示词Prompts等核心概念和通信格式如SSE。客户端-服务器模型AI模型作为客户端MCP Client各种能力提供方作为服务器MCP Server。一个客户端可以连接多个服务器。与实现解耦只要双方都遵守MCP协议那么Server可以用任何语言Python, Go, JavaScript编写Client也可以是任何支持MCP的AI平台如Claude Desktop, Cursor。关注“如何安全地访问和调用”它解决的是“模型如何发现、理解并安全使用外部能力”的问题。典型代表Anthropic 提出的 Model Context Protocol 标准以及基于此实现的各类 MCP Server如tavily-mcp,brave-search-mcp,gitlab-mcp。为了更直观地对比我们看下表特性维度Skill (技能)Plugin (插件)MCP (模型上下文协议)本质内聚的业务逻辑/脚本符合宿主规范的扩展模块模型与工具间的通信协议标准核心关系Agent 的一部分宿主的可插拔组件客户端(Client)与服务器(Server)耦合度高与特定Agent框架绑定中与宿主框架接口绑定低仅依赖协议标准复用性低跨框架迁移难中在同框架生态内复用高协议通用一次编写多处使用开发内容实现具体的任务流程实现宿主定义的接口实现MCP Server提供资源/工具典型场景专有AI助手的定制化动作IDE、构建工具、CMS的功能扩展为任何支持MCP的AI提供通用工具搜索、数据库、API类比个人的“游泳”技能电钻的“各种钻头”电源插座协议220V/50Hz3. 环境与角色准备你需要站在哪一边理解概念后下一个问题是作为开发者你会在什么环境下接触它们你的角色是什么如果你是 Skill 开发者/使用者环境你通常身处某个特定的 AI Agent 框架或平台如自定义的机器人系统、某些低代码AI工作流平台。角色你是该框架的深度用户或二次开发者。你需要阅读该框架的SDK按照其规定的方式可能是特定DSL、Python装饰器、YAML配置编写技能逻辑。输入材料框架提供的 Skill 开发文档。如果你是 Plugin 开发者/使用者环境你面对的是一个定义了插件体系的主程序如 VSCode、Webpack、某个AI应用平台。角色你是该主程序生态的贡献者或用户。你需要使用主程序提供的插件API通常是JavaScript/TypeScript或Python来开发功能并通过包管理器分发和安装。输入材料主程序的插件开发指南。如果你是 MCP 开发者/使用者环境你处于一个追求开放性和互操作性的AI工具链中。你想让不同的AI助手都能安全地使用你提供的能力。角色能力提供者Server开发者或能力消费者Client配置者。Server开发者用任何语言编写一个遵守MCP协议的HTTP/SSE服务器对外提供工具如执行搜索、查询数据库。Client配置者在支持MCP的AI客户端如Claude Desktop配置文件中添加你编写的或第三方的MCP Server地址。输入材料MCP 官方协议文档、MCP SDK如modelcontextprotocol/sdk。一个重要洞察Skill 和 Plugin 更多是“实现模式”而 MCP 是“集成标准”。你可以用 Plugin 的模式来实现一个功能然后通过 MCP 协议暴露出去。它们不是互斥的。4. 实战对比以“让AI助手能搜索网页”为例让我们通过同一个需求——“为AI助手添加网页搜索能力”——来看三种方式的具体实现差异。4.1 方案一开发一个自定义 Search Skill假设我们使用一个虚构的 Python AI Agent 框架MyAgentFrame。步骤拆解理解框架约束该框架要求 Skill 是一个继承自BaseSkill的类并实现execute方法。编写技能逻辑在技能内部直接调用搜索API如Requests库调用SerpAPI。注册技能将技能类注册到框架的全局技能列表中。修改Agent逻辑让Agent在解析用户意图为“搜索”时调用这个技能。代码示例# my_search_skill.py import requests from my_agent_framework import BaseSkill class WebSearchSkill(BaseSkill): name web_search description Search the web for current information. def __init__(self, api_key): self.api_key api_key self.base_url https://serpapi.com/search async def execute(self, query: str): 执行搜索 params { q: query, api_key: self.api_key, engine: google } response requests.get(self.base_url, paramsparams) results response.json().get(organic_results, [])[:3] # 格式化结果 return \n.join([f{r[title]}: {r[link]} for r in results]) # agent_main.py from my_agent_framework import Agent from my_search_skill import WebSearchSkill # 1. 初始化技能强耦合技能初始化依赖框架环境 search_skill WebSearchSkill(api_keyyour_serpapi_key) # 2. 创建Agent并手动注册技能侵入式修改 agent Agent(nameMyHelper) agent.register_skill(search_skill) # 3. 在Agent的决策逻辑里需要硬编码对‘web_search’技能的调用 # 这部分逻辑通常散落在框架的意图识别和分发模块中痛点技能逻辑与框架深度耦合。如果想换一个框架这个技能几乎要重写。且技能的管理、升级、依赖隔离都很麻烦。4.2 方案二安装一个 Search Plugin假设我们的AI助手平台支持插件系统类似一个简化版的VSCode。步骤拆解寻找或开发插件在平台插件市场找到awesome-search-plugin或按照平台插件规范自行开发。安装插件通过平台提供的包管理命令安装。配置插件在平台配置文件中启用插件并填入必要的API密钥。使用插件助手在运行时可以通过插件系统提供的统一接口调用搜索功能。配置示例 (config.yaml):# 平台配置文件 plugins: enabled: - awesome-search-plugin # ... 其他插件 awesome-search-plugin: api_key: ${SERPAPI_KEY} # 从环境变量读取 default_engine: google result_count: 5代码示例插件开发者视角:// awesome-search-plugin/index.js (假设平台使用JS插件系统) const { PluginBase } require(ai-platform-plugin-sdk); const fetch require(node-fetch); class SearchPlugin extends PluginBase { static id awesome-search-plugin; static name Awesome Web Search; async activate(context) { // 读取配置 const config context.config; // 向平台注册一个工具 context.registerTool(search_web, { description: Search the web for information., execute: async ({ query }) { const url https://serpapi.com/search?q${encodeURIComponent(query)}api_key${config.api_key}; const response await fetch(url); const data await response.json(); return data.organic_results.slice(0, config.result_count); } }); } } module.exports SearchPlugin;优点通过标准接口接入安装配置简单与平台核心代码解耦。局限这个插件只能用于这个特定的AI助手平台。如果换一个平台插件可能无法工作。4.3 方案三部署并连接一个 Search MCP Server这是目前最开放和标准化的方式。我们不需要关心AI助手具体是哪个只要它支持MCP协议。步骤拆解部署MCP Server我们可以使用社区已有的tavily-mcp服务器或者自己用MCP SDK编写一个。配置MCP Client在我们使用的AI客户端如Claude Desktop、Cursor中配置连接到这个Server。完成AI助手启动时会自动发现Server提供的“搜索工具”并能在需要时调用。操作流程第一步启动一个现成的MCP Server以Tavily搜索为例# 方式1使用Docker推荐隔离性好 docker run -d -p 3000:3000 -e TAVILY_API_KEYyour_key ghcr.io/modelcontextprotocol/servers/tavily # 方式2使用Node.js直接运行 npx modelcontextprotocol/server-tavily search --api-keyyour_keyServer启动后会在本地某个端口如3000提供标准的MCP服务。第二步配置AI客户端以连接此Server以配置 Claude Desktop 为例修改其配置文件通常位于~/Library/Application Support/Claude/claude_desktop_config.json或类似路径{ mcpServers: { tavily-search: { command: npx, args: [ -y, modelcontextprotocol/server-tavily, search, --api-key${TAVILY_API_KEY} ], env: { TAVILY_API_KEY: your_tavily_api_key_here } } } }或者更简单的方式如果Server已经独立运行配置其网络地址{ mcpServers: { my-search-server: { url: http://localhost:3000/sse } } }第三步验证与使用重启Claude Desktop当你问Claude“今天AI领域有什么新闻”时Claude会意识到自己需要调用外部搜索工具并自动列出可用的工具来自你配置的MCP Server征得你同意后执行搜索并返回结果。整个过程对用户和开发者都是透明的。核心优势一次编写多处使用这个tavily-mcpServer 可以同时被 Claude Desktop、Cursor、以及任何未来支持MCP的AI工具使用。安全隔离搜索行为发生在独立的Server进程中与AI模型核心隔离。协议标准化开发者只需学习一次MCP协议就可以开发各种能力的Server。5. 深入原理MCP协议是如何工作的MCP是理解现代AI工具链的关键。我们来简单剖析其核心交互流程这有助于调试和开发。MCP通信主要基于Server-Sent Events (SSE)这是一种轻量级的HTTP长连接协议允许服务器向客户端推送事件。一个简化的MCP工具调用时序初始化ClientAI助手启动读取配置连接到配置的所有MCP Server。握手与列表连接建立后Client和Server交换initialize和initialized消息。随后Client发送tools/list请求Server返回其提供的所有工具Tools和资源Resources的元数据名称、描述、参数模式。意图识别用户向AI助手提问。AI模型根据对话历史和Server提供的工具列表判断是否需要调用工具。调用请求如果需要模型会生成一个结构化的工具调用请求。Client将此请求封装成MCP的tools/call消息发送给对应的Server。执行与返回Server收到请求后执行实际逻辑如调用搜索API、查询数据库然后将结果封装成tools/call的响应返回给Client。结果整合Client将工具执行结果返回给AI模型模型生成最终的自然语言回复给用户。关键点MCP Server不关心调用它的“模型”是谁Claude、GPT、还是本地模型它只认协议。同样AI Client也不关心Server是用什么语言实现的它只要求Server遵守协议。6. 开发一个最简单的MCP ServerPython示例理解了原理我们可以尝试开发一个最简单的MCP Server提供“获取当前时间”的工具。环境准备Python 3.8安装MCP Python SDKpip install mcp代码实现# simple_time_server.py import asyncio from datetime import datetime from mcp.server import Server, NotificationOptions from mcp.server.models import InitializationOptions import mcp.server.stdio from mcp.types import Tool, TextContent # 1. 创建Server实例 server Server(simple-time-server) # 2. 定义一个工具获取当前时间 server.list_tools() async def handle_list_tools(): # 返回此Server提供的工具列表 return [ Tool( nameget_current_time, descriptionGet the current date and time in UTC., inputSchema{ type: object, properties: {} # 此工具不需要输入参数 } ) ] # 3. 实现工具的执行逻辑 server.call_tool() async def handle_call_tool(name: str, arguments: dict): if name get_current_time: current_time datetime.utcnow().strftime(%Y-%m-%d %H:%M:%S UTC) # 返回结果必须符合MCP的Content格式 return [ TextContent( typetext, textfThe current time is: {current_time} ) ] else: raise ValueError(fUnknown tool: {name}) # 4. 主函数启动Server使用stdio传输这是最常见的方式 async def main(): async with mcp.server.stdio.stdio_server() as (read_stream, write_stream): await server.run( read_stream, write_stream, InitializationOptions( server_namesimple-time-server, server_version0.1.0 ), NotificationOptions(), ) if __name__ __main__: asyncio.run(main())运行与测试保存上述代码为simple_time_server.py。在终端运行python simple_time_server.py。此时程序会挂起等待标准输入输出上的MCP连接。配置你的AI客户端如Claude Desktop连接到这个本地Server。配置方式参考上一节command 指向pythonargs 指向你的脚本路径。在AI客户端中你就可以直接问“现在几点了”AI会调用这个Server提供的get_current_time工具并返回结果。这个例子展示了MCP Server开发的核心定义工具列表并实现工具调用处理函数。真正的生产级Server还会处理资源Resources、提示词模板Prompts等更多特性。7. 常见问题与排查指南在实际集成和开发中你会遇到各种问题。下表整理了典型问题及解决思路问题现象可能原因排查步骤解决方案AI助手完全“看不到”新加的功能1. Skill/Plugin未正确注册或启用。2. MCP Server连接失败或未配置。1. 检查框架日志确认功能模块加载成功。2. 对于MCP检查客户端配置文件的语法和Server地址/命令是否正确。3. 查看Server进程是否正常运行端口是否被占用。1. 对照框架文档检查注册代码或配置文件。2. 使用curl或telnet测试MCP Server端口连通性。3. 重启AI客户端查看连接初始化日志。功能调用失败报权限或网络错误1. API密钥未配置或无效。2. Server运行环境网络隔离。3. 工具执行逻辑内部异常。1. 检查环境变量或配置文件中的API密钥。2. 在Server所在环境手动运行工具逻辑测试连通性。3. 查看Server端的详细错误日志。1. 重新申请并配置有效的API密钥。2. 为Server配置网络代理或调整防火墙规则。3. 在Server代码中添加更详细的异常捕获和日志。MCP Server已连接但工具列表为空1. Server的list_tools实现未正确返回工具定义。2. 协议版本不兼容。1. 使用MCP客户端测试工具如mcp-cli直接连接Server查看工具列表。2. 检查Server和Client使用的MCP SDK版本。1. 确保server.list_tools装饰器正确应用返回的Tool对象结构符合SDK要求。2. 尝试升级Server和Client到兼容的MCP协议版本。Skill/Plugin导致主程序崩溃或内存泄漏1. Skill/Plugin代码存在严重Bug如死循环。2. 资源数据库连接、文件句柄未正确释放。1. 主程序崩溃后分析崩溃堆栈定位到具体模块。2. 使用内存 profiling 工具监控插件加载前后的内存变化。1. 将Skill/Plugin逻辑在独立环境中充分测试。2. 确保所有外部资源使用后都有清理逻辑try...finally或with语句。3. 考虑使用超时机制限制工具执行时间。功能性能低下响应慢1. 依赖的第三方API响应慢。2. Skill/Plugin/MCP Server逻辑复杂计算耗时。3. 网络延迟高尤其MCP跨网络调用。1. 对工具调用链路进行分段计时。2. 检查第三方服务的状态和SLA。3. 对于MCP检查Client和Server之间的网络延迟。1. 为外部调用添加合理的超时和重试机制。2. 优化内部逻辑考虑异步或缓存。3. 将MCP Server部署在离Client更近的网络环境中或使用更高效的序列化格式。8. 最佳实践与选型建议如何为你的项目选择正确的路径以下是一些核心建议8.1 何时选择 Skill 模式场景你正在深度定制或开发一个特定的、封闭的AI Agent系统功能与该Agent的核心逻辑紧密相关且无对外共享的需求。优点深度集成性能开销最小可以最大程度利用框架内部状态。缺点 vendor lock-in供应商锁定严重迁移和复用成本极高。建议仅在企业内部高度定制化的机器人或工作流中使用并做好未来重写的心理准备。8.2 何时选择 Plugin 模式场景你正在为一个已经拥有成熟插件生态的平台如VSCode、Obsidian、某个商业AI平台开发扩展功能且目标用户就是这个平台的用户。优点可以充分利用平台提供的UI、数据、事件等丰富接口开发体验和用户体验更佳。缺点功能被限制在该平台内。建议如果你的目标平台有插件系统优先开发Plugin。这是融入其生态的最佳方式。8.3 何时选择 MCP 模式场景你希望将一种能力如访问公司内部数据库、调用特定API安全、标准化地暴露给多个不同的AI助手或应用。你追求的是能力的可移植性和互操作性。优点一次开发处处使用。符合未来AI工具链开放互联的趋势。安全隔离性好。缺点初期有学习成本和部署成本。对于非常简单的功能可能显得“重”。建议对于大多数新的、需要与AI交互的后端能力建设MCP是首选方向。尤其是搜索、数据库查询、代码库操作、内部系统集成等场景。8.4 混合架构与渐进式演进在实际项目中三者可能共存并演进初期原型可能为了快速验证在某个Agent框架里写一个Hardcode的Skill。功能稳定将其重构为该框架的一个标准Plugin便于管理和分发。需求扩展当其他团队或外部工具也需要这个能力时将其核心逻辑抽离包装成一个独立的MCP Server。最终形态原来的Plugin变成一个“轻量适配层”内部调用标准的MCP Client来连接你部署的MCP Server。这样既保留了Plugin的生态集成又获得了MCP的开放性和复用性。9. 总结从功能实现到能力协议回顾开头的周报我们现在可以清晰地给出建议小李的“周报生成Skill”如果只供内部一个助手使用可以保持现状。但如果其他团队也想用应考虑将其核心逻辑封装成MCP Server如jira-mcp。小王的“图表渲染Plugin”很好因为它符合所在平台的生态。他们可以评估是否将渲染引擎也通过MCP暴露让Plugin成为MCP的客户端以增加灵活性。小张的“GitLab MCP Server”方向最具有前瞻性。这项工作完成后公司内所有支持MCP的AI工具都能安全地访问代码库。Skill、Plugin、MCP 的区别本质上是“功能实现”、“生态集成”与“协议标准”三层的区别。对于开发者而言理解这个分层至关重要在实现层你编写代码解决具体问题。在集成层你决定如何将你的代码交付给用户作为框架的一部分、作为插件、还是作为独立服务。在协议层你定义或遵循一套规则以确保你的能力能被广泛、安全地发现和使用。当前AI应用开发正从“打造全能单体Agent”向“构建可组合的智能体工具链”演进。MCP这类协议的出现正是在定义工具链中的“USB标准”。作为开发者尽早拥抱并理解这类协议意味着你能更好地适应未来AI能力被“管道化”、“服务化”的趋势让你开发的功能不再被困于单一应用而是成为整个智能生态中一个可随时插拔的标准化组件。下次当你再看到Skill、Plugin、MCP这些词时不妨先问自己这描述的是一个具体的功能实现一个特定平台的扩展还是一个开放的能力协议想清楚这一点你的技术选型之路就会清晰很多。