
1. 三个词打成一团这篇文章帮你拆开如果你在 2025 年认真折腾 AI Agent那大概率会遇到一个非常拧巴的困惑同样是在聊“怎么把能力交给 AI”有人说用 Tools有人说用 MCP还有人言之凿凿地推 Skills。你打开 GitHub 搜“skills”跳出来一堆像“superpower skills”之类的项目用起来好像又和 MCP 差不多你再搜“Tools”前排多半是 VMware Tools、Office Tools、Network UPS Tools 这些和 AI 毫无关联的软件。这种命名混乱带来的信息噪音会让不少人在一个完全没必要停留的门槛前卡住。这篇文章就是想把这一团乱麻彻底拆开。我会站在实际搭建 AI Agent 的视角而不是堆概念先说明 MCP、Tools、Skills 在整套系统里到底扮演什么角色再分别讲怎么接入、怎么写、怎么排坑最后给一个能直接上手的从 0 到 1 练手项目。适合三类人读第一类是刚开始搭建 Agent、不知道外部能力从哪儿接的开发者第二类是用 Cursor、Codex、Claude Code 等工具但分不清“插件、技能、协议”区别的重度用户第三类是打算沉淀自己工作流、把经验封装成可复用 Skill 的折腾型玩家。先说结论后面逐步展开Tools 是“能力接口”MCP 是“能力接入协议”Skills 是“能力使用剧本”。这三者不在同一个维度也不存在谁替代谁合理搭配才是关键。1.1 “Tools”这个词的撞车事故先聊一个很现实的坑搜索障碍。你在任意一个搜索引擎里输入“Tools”这个词看到的结果大概率是 VMware Tools、Network UPS Tools、System Tools、Office Tools。这些名词跟 AI 领域一点关系没有却占据了最靠前的位置。如果你没有提前建立“AI 语境下的 Tools 是完全不同的概念”这个判断光是找资料就能浪费不少时间。更麻烦的是在不同 AI 产品里“Tools”也被用得很泛。有的产品把 Tools 定义成模型可以调用的函数有的把 MCP Server 也叫 Tools还有的把用户上传的文档称为“知识工具”。这种不一致进一步加重了混乱。所以这篇文章里我会统一使用一个相对严格的定义AI Agent 语境下的 Tools指的是以结构化接口的形式暴露给大模型、并由程序实际去执行的那些操作单元。模型负责决定“调不调、传什么参数”代码负责真正干活的这部分就是 Tools。为什么必须把“模型决策”和“真实执行”分开因为大模型没有手它只能输出文字和结构化的调用指令。有了 Tools 之后模型才能从“只会生成内容”变成“能够影响真实世界”。1.2 一个心智模型高速公路、车轮和司机手册很多教程一上来就讲 MCP 协议细节反而让新手更难建立全局观。我习惯用一个类比来定位这三样东西一辆车Agent要跑起来需要车轮Tools、高速公路MCP和司机手册Skills。车轮是接触地面的部件对应的是工具本身负责产生真实的力和位移高速公路是一套统一的路网标准对应 MCP让不同品牌的车都能在同一条路上开不必为每条路专门定制接口司机手册则是经验沉淀告诉你什么时候转弯、什么路段该用什么挡位对应 Skills。这个类比能解释很多实践中出现的问题。比如“我有了 Tools为什么还要 MCP”答案就是Tools 是本地原生暴露的能力MCP 解决的是跨系统、跨语言、跨场景的统一接入问题。又比如“我有了 MCP为什么还要 Skills”答案也很直白MCP 只提供能力连接不告诉模型该怎么组织工作流Skills 负责的是把老手做事的步骤沉淀下来让模型遇到同类任务时按成熟路径走。记住这三个角色后面所有细节都不容易乱。1.3 读完这篇文章你能拿到什么我尽量不给那种“定义一个概念然后背下来”的内容而是给可直接复用的操作指南。你读完至少能确认四件事一是能分清 Tools、MCP、Skills 的边界再也不会在技术讨论里说“这不就是个工具吗”二是能让一个真实项目同时用上原生 Tools、外部 MCP Server 和自定义 Skill而不是只会跑官方的 demo三是能看懂现有开源项目里那一堆目录和配置文件到底在干什么四是遇到常见的连接失败、Skill 不触发、上下文爆炸等问题时能有一套自己的排查思路。2. 从最底层理顺LLM、模型、Agent 和能力的边界很多人把“Agent”和“模型”混为一谈这是讨论 Tools、MCP、Skills 前必须纠正的一个底层误区。模型是推理内核Agent 是基于模型构建的自主执行系统。这一层搞不清楚后面谈能力扩展很容易跑偏。2.1 AI 模型不等于 AgentDeepSeek 到底属于哪一层有个很常见的提问是“Agent 和 LLM 和 AI 模型有什么区别比如经常说的 DeepSeek 属于哪个”这个问题暴露了一个普遍困惑市面上把“模型”和“Agent”混用的文章实在太多了。我的回答很直接DeepSeek、Gemini、Claude 这些都是模型层它们提供的是语言理解和生成能力是“大脑”。而 Agent 是应用层是一个携带任务目标、能够迭代决策、调用工具、根据结果修正行为的外壳。Agent 里面一定有一个模型在驱动但模型本身不自动等于 Agent。你可以把 AutoGPT、自建的工作流应用、各种智能助手 App 都理解为 Agent 壳。为什么要做这个区分因为能力扩展的挂载点完全不同。模型能力内部很难干预你几乎不可能往一个 800B 参数的大模型里塞一段新知识。但 Agent 层是开放的你可以往里面挂 Tools 定义、MCP Server、Skills 文件模型看到这些上下文之后就能在推理时借助新能力。所有工程手段都发生在模型外部这是 AI Agent 能够被普通人定制的前提。2.2 Tools让模型从“能说”到“能做”在 Tools 出现之前大模型的调用方式特别原始你输入 Prompt它输出文本。遇到需要查数据库、发邮件、操作浏览器、改文件的任务模型只能干瞪眼或者给你一段“建议代码”让你自己去跑。Function Calling 机制改变了这一切。模型在生成文本的同时可以输出特殊的结构化指令例如“我要调用 get_weather 这个函数参数是北京”。你的程序拦截到这个指令后执行真正的查询再把结果作为新消息送回给模型。模型看到真实结果后继续推理最终给用户完整答复。这个过程里模型依然是决策者但实际动手的是 Tools。 Tools 在物理上是一个普通函数但在信息结构上必须是一份机器可读的说明书。说明书写得好不好直接影响模型会不会正确调用它这也正是后面要谈的经验点。2.3 MCP 和 Skills 不是同一维度的东西不存在“替代关系”总有人问“MCP 和 Skills 哪个更好用”这是个伪命题。MCP 是连接协议解决的是“如何把一个外部能力接入 Agent”Skills 是组织方案解决的是“如何把一组行为定义成可复用的剧本”。MCP 服务器可以暴露工具和资源而 Skill 可以调度多个工具、调用多个 MCP 服务器提供的能力二者位置完全不同。打个比方MCP 类似一套标准接口协议让任何品牌的摄像头都能通过同一个端子接上主机Skills 类似一套拍摄分镜脚本它告诉你这个场景应该用广角还是长焦、什么时候补光、整个流程怎么走。摄像头很重要接口协议也很重要但最终产出高质量视频靠的是分镜脚本。对应到 Agent 工程里就是“工具 连接 流程”三者缺一不可。3. Tools把模型的“推理能力”变成可交付的结果Tools 是最接近代码的一层也是 Agent 里最容易被低估的部分。很多初学者一上来就奔着 MCP、Skills 去结果连一个最基础的 Tools 定义都写得稀烂模型经常调错参数、白白浪费上下文。先把这块基本功打牢后面才谈得上复杂架构。3.1 主流 AI Agent 平台的 Tools 形态不同平台的 Tools 具体形态略有差异但核心逻辑一致。以典型的 Function Calling 风格为例Tools 定义通常包括函数名、函数描述、参数类型、必填字段。模型必须根据描述判断要不要调用以及传什么参数。如果你的描述有歧义模型就会犹豫甚至给出错误调用这是命中注定的事。在 Claude Code 这类工具里Tools 更像是一组内置操作比如读文件、写文件、执行命令、搜索网络。用户可以通过配置、插件来扩展新的 Tools。在 Cursor 或 Codex 里Tools 往往与 IDE 能力深度绑定比如“查看当前文件”“运行测试”“读取 git 状态”。而在 OpenAI 风格的 Function Calling 中Tools 就是开发者自己在应用里注册的 JSON 函数定义。虽然形态不同但它都有一个共同点Tools 的边界必须非常清楚。模型调用时只会看到你写的名字和描述它看不到你的函数实现。所以接口与语义的清晰度比代码本身的优雅程度重要得多。3.2 定义 Tools 最影响效果的两个细节第一个细节是描述信息。别把 description 写成“查询天气”要写得更完整“查询指定城市的当前天气。适用于用户询问天气、出行建议、穿衣建议等场景。如果用户没有提供城市请先询问得到城市名后再调用不要在参数为空时调用。” 这种写法能有效降低误调用率。我在实际项目里对比过描述笼统的 Tools 被误调用的概率可能是描述详细版本的好几倍。第二个细节是参数约束。能用枚举就尽量用枚举能限定格式就限定格式。比如城市参数可以支持“北京、上海、广州”但若你向一个没有严格地理知识的模型开放 free text它有可能传入乱七八糟的别名。给参数加 enum 或 pattern 校验等于在前面加了一道护栏减少了解析失败和无效请求。提示一次性定义的 Tools 种类越多Agent 需要做选择的注意力就被稀释得越厉害。我见过一个项目把 20 多个 Tools 全部塞给模型结果模型频繁在无关工具之间反复试探。与其贪多不如精简到 5 个左右的高频工具。3.3 一个非常朴素的 Tools 例子查询天气并写进本地文件我直接用一段简化代码来说明整个链路。假设我们要给 Agent 提供两个能力一个查询天气一个追加写入文件。在 OpenAI 风格的 Function Calling 里Tools 定义大概长这样const tools [ { type: function, function: { name: get_weather, description: 查询指定城市的当前天气。如果没有指定城市请先向用户确认。, parameters: { type: object, properties: { city: { type: string, description: 城市名称例如 北京 } }, required: [city] } } }, { type: function, function: { name: append_to_file, description: 把一段文本追加写入本地日志文件。, parameters: { type: object, properties: { content: { type: string, description: 要写入的文本内容 }, filename: { type: string, description: 文件名默认 agent.log } }, required: [content] } } } ];模型收到用户消息“查一下北京天气然后把结果记下来”后会尝试输出两个连续的调用指令先调 get_weather拿到结果之后再把最终文案作为参数调用 append_to_file。你不需要自己写任何调度逻辑只需要循环处理模型的 tool_calls执行真实函数把结果返回即可。这个过程看起来简单但它是所有 Agent 能力扩展的地基。哪怕以后接上了 MCP、写了几十个 Skills最终真正干活的仍然是这些底层的 Tools 函数。3.4 用 Tools 的几个成本警示Tools 不是免费的。第一个成本是上下文占用每一个 Tools 定义都会序列化成 token进入模型的上下文窗口。20 个冗长的函数定义可能直接吃掉几千 token对大上下文模型也是负担。第二个成本是决策负担模型面对过多工具时会出现“选择困难症”要么频繁调用错误的工具要么干脆不调用。第三个成本是维护成本每个工具都可能被模型以你预想不到的方式调用你必须在真实函数里做好容错。我的经验是“少而准”优于“多而全”。先把核心操作做成稳定可靠的 Tools跑通完整流程后再考虑用 MCP 和 Skills 去扩展周边能力。4. MCP把很多系统统一接到同一个插座上MCPModel Context Protocol是近年来 AI Agent 生态里人气最高的协议之一。它解决的是一个非常现实的工程问题不同系统接入 Agent 的姿势千差万别如果每接一个服务都要写一套专用代码这个系统很快就会被集成成本压垮。MCP 把这个过程标准化了。4.1 为什么不能一直靠“手写专用插件”在 MCP 出现之前传统做法是这样的你有一个爬虫服务你想让 Agent 能调用它于是你写一个 API 接口再在 Agent 代码里加一段调用逻辑。下周你又接一个数据库服务还得再来一遍。长此以往Agent 和后端服务之间的胶水代码越来越多每次升级都会互相踩脚。MCP 的思路类似于给所有外部能力做了一个统一插座。MCP Server 可以是一个本地进程、一个远程服务或者一个从 GitHub 拉下来的标准包。只要它实现了 MCP 协议任何支持 MCP 的客户端都能自动发现它暴露的工具、资源和提示词。这样集成成本从“每个系统写一套适配”降到了“一次协议对接后续即插即用”。4.2 MCP Server 里到底放了什么MCP 协议在概念上定义了三种能力比较重要Tools可执行的动作类似本地 Tools但由 MCP Server 提供比如“打开网页”“点击元素”“读取数据库记录”。Resources可读取的数据资源Agent 可以主动读取比如文档内容、配置快照、表格数据。Prompts可复用的提示词模板MCP Server 可以提供一些面向特定场景的预制指令。实际使用中大多数 MCP Server 的核心能力还是暴露 Tools。比如一个 Playwright MCP 服务器能暴露一堆浏览器操作的 Tools让 Agent 自己打开页面、点击按钮、抓取内容你完全不用在本地实现 Playwright 的底层逻辑。4.3 最快跑通一个 MCP Server以 Playwright MCP 为例如果你用的是支持 MCP 的客户端比如 Claude Desktop、集成 MCP 的 IDE、或者一些 Agent 框架都可以通过一份 JSON 配置直接连接外部 Server。以最典型的 Playwright MCP 为例通用配置格式如下{ mcpServers: { playwright: { command: npx, args: [-y, playwright/mcplatest] } } }你把它放到客户端能读取的 MCP 配置文件里重启客户端它就能自动启动这个 MCP Server。之后你在对话里提出“打开某个网页把标题提取出来”这类需求Agent 就会通过 MCP Server 调用浏览器操作工具。整个过程你不需要在自己的代码里引入任何浏览器库也不用处理浏览器自动化细节。配置完成之后的体验很奇妙Agent 像突然长出了一只手能访问网络页面、截图、翻页而且这些能力像模块一样可以随时插拔不用了就把配置项删掉。提示MCP 配置里的 command 必须能在客户端的运行环境里被找到。我遇到过 PATH 不一致导致 npx 无法启动的问题排查时先确认“在终端里直接运行这个 command 是否成功”。4.4 我接入 MCP 时踩过的几个坑第一个坑是日志污染。MCP 客户端一般通过标准输入输出来与服务进程通信如果你的服务里有 console.log 之类的打印语句这些日志会被当成协议数据解析导致握手失败。解决办法是日志写到文件里不要打到 stdout。第二个坑是权限边界。MCP Server 一旦接入Agent 就能调用它暴露的工具。你给一个文件系统 MCP 挂到公开 Agent 上时它可能真的会去读你电脑上的文件。我建议给 MCP Server 设置最小权限比如让浏览器 MCP 只访问临时目录让数据库 MCP 只读不允许写。第三个坑是版本兼容。MCP 协议仍在快速演进不同客户端实现的功能集有差异。有的客户端对 Resources 支持不完整你可能只看到 Tools。遇到这种情况先用官方 demo 配置验证客户端再排查自己的 Server。第四个坑是本地命令依赖。很多 MCP Server 需要 node、python、ffmpeg 这类外部程序目标机器上如果没有首跑就是失败。记得把所有依赖项列入文档别只说“安装 MCP 即可”。5. Skills把“老手做事的流程”封装成一套即用的剧本如果 Tools 是车轮、MCP 是公路那 Skills 就是司机手册。它的核心价值不只是“给模型更多上下文”而是把某个领域里老手才懂的判断步骤、踩坑点、输出规范固化下来让模型遇到同类任务时直接沿成熟路径执行。这正好也是搜索词里“Skills 推荐”“Skills 开发”最关注的点。5.1 Skills 比普通提示词多了什么普通提示词解决的问题是“这次对话怎么回答”而 Skills 解决的是“这一类任务怎么完成好”。一个合格 Skill 通常包含几类内容触发条件、执行步骤、约束与禁忌、参考样例、可选脚本和模板文件。举个例子做一个“前端开发 Skills”。如果只是往总提示词里加一句“请写出高质量前端代码”模型很难长期遵守因为没上下文、没实例、没步骤。而做成 Skill 后你可以规定第一步先确认需求边界第二步检查项目技术栈和目录结构第三步按模块逐个实现第四步自测响应式布局和主流浏览器兼容性第五步输出变更记录。每一步都配参考文件和检查清单模型完成任务的质量会比裸提示词稳定得多。从工程角度理解Skills 是内容包、代码包、规则包的统一封装。它能被模型按需加载而不是一次性塞进每轮对话。这是它和“长提示词”最本质的区别。5.2 到哪里找现成的 SkillsGitHub 是目前最主要的 Skills 开源聚集地。直接搜“awesome-claude-skills”“skills marketplace”“superpower skills”等关键词能挖到不少集合型仓库。这类仓库通常包含几十个技能目录每个目录里都有 SKILL.md、脚本和参考文件。除了 GitHub一些 Agent 产品会有官方技能市场或社区分享站点。社区里的 Skills 质量参差不齐判断标准我一般看三点是否有清晰的目录结构是否有维护和更新记录是否有人在实际项目里验证过。如果一个 Skill 只有一个 README 而没有 SKILL.md或者最近半年没有任何 commit我通常不会直接采用。另外要注意很多 Skills 是针对特定 Agent 客户端开发的可能依赖该客户端的特定配置约定。你把它装到另一款工具上不一定能原样运行。入场先看兼容性说明别到时候白忙一场。5.3 手动安装一个 GitHub 上的 Skills 的完整过程很多 Agent 客户端的技能安装路径并不复杂但缺少一份清晰的说明导致大家总觉得“很高级”。以比较通用的方式为例手动安装分四步第一步找到目标 Skills 仓库并克隆到本地。常见的目录是全局技能目录或项目技能目录例如mkdir -p ~/.claude/skills git clone https://github.com/your-name/some-skills.git ~/.claude/skills/some-skills第二步确认技能目录结构正确。你至少要找到 SKILL.md 文件它是一个技能的核心说明里面包含名称、描述、使用步骤和约束条件。如果没有这个文件这个技能大概率不是标准的直接装大概率失败。第三步在 Agent 的配置里注册这个技能路径或在项目根目录的指引文件里添加一句“当执行 XX 类任务时读取 ~/.claude/skills/some-skills/SKILL.md 并按步骤执行”。第四步用一个真实小任务来验证。比如“用这个技能处理一份测试文档”观察 Agent 是否真的加载了技能内容、是否按步骤执行。如果它完全无视技能多半是触发条件写得不够明确或者技能目录没有被正确读取。装过三五次之后你会明显感受到技能安装本质上就是“把一份标记好的文档放在模型能读取的位置”技术门槛真不高难的是技能内容本身的质量。5.4 自己写一个最小可用的“前端开发 Skills”模板与其到处找现成技能不如掌握自己写 Skill 的能力。下面是一个能直接参照的最小结构frontend-review.skill/ ├── SKILL.md ├── references/ │ ├── accessibility-checklist.md │ └── responsive-check.md └── scripts/ └── check_responsive.mjsSKILL.md 可以这样写--- name: frontend-review description: 对前端页面进行代码审查与体验检查。适合在完成页面开发后、合并请求前使用。 --- # 前端审查技能 ## 适用场景 - 刚写完一个页面或组件需要审查 - 接到需求需要先评估技术方案 ## 执行步骤 1. 查看项目目录结构确认技术栈和构建工具。 2. 阅读目标文件定位核心逻辑。 3. 按 references/accessibility-checklist.md 检查可访问性问题。 4. 按 references/responsive-check.md 检查响应式布局。 5. 如有必要运行 scripts/check_responsive.mjs 做自动化检查。 6. 输出审查结论按严重程度分级并给出具体修改建议。 ## 禁止事项 - 不要在没有看实际代码的情况下给出空泛评价。 - 不要擅自重构代码只输出建议。可以看到SKILL.md 的核心就是“触发条件 步骤 约束”。你把做这事的经验写进去模型照着执行就比自己临时想一套方案靠谱得多。脚本和参考文件负责承载那些不适合写进描述里的细节比如更长的检查清单、具体的 CSS 断点值、可访问性规范链接等。我在写完一个 Skill 之后通常会做一个验证让模型处理一个我早已知道正确答案的任务看它能不能按照步骤得到接近标准的输出。如果偏差大就回头改 SKILL.md 的描述直到输出可靠。6. 三看组合真正该问的是“什么场景优先用哪个”介绍完三样东西你可能已经意识到它们不是竞争关系而是分工关系。但在具体项目里你应该从哪里开始什么时候加 MCP什么时候写 Skills我建议用一张对比表来建立全局判断。6.1 一张表看清 MCP、Tools、Skills 的边界维度ToolsMCPSkills要解决的本质问题让模型能调用具体能力让不同系统统一接入 Agent让复杂任务按成熟流程执行粒度单个操作一组操作的连接协议一整套做事方法载体函数定义协议 Server 实现文档、脚本、参考文件复用单位函数服务技能包谁去实现应用开发者服务提供方或社区经验丰富的使用者典型场景查天气、写文件、调 API浏览器自动化、数据库访问、设计稿获取前端审查、代码审查、文案撰写流程优缺点实现简单跨平台差连接标准但生态仍在演进效果好但编写需要经验沉淀从上表能看出Tools 是最底层的真实动作MCP 是让外部动作可被统一连接的标准Skills 是最上层的编排能力。三者天然是叠加关系不是互斥关系。6.2 实际项目选型的 3 条经验第一条经验任何项目都从原生 Tools 开始。你可以先定义三到五个核心函数把核心闭环跑通。这时候千万不要急着上 MCP 或者写复杂的 Skills先把流程验证了再说。第二条经验当你要接外部系统、且对方已经有 MCP Server 时优先 MCP。比如要用浏览器自动化直接用 Playwright MCP 比自己写一堆工具函数省事太多要连接设计协作平台也优先找官方 MCP 而不是自己爬接口。第三条经验当任务重复出现、且步骤复杂时才写 Skills。比如团队每个版本发布前都要做回归检查或者你每周都要写一份固定结构的周报这类任务值得沉淀成 Skill。偶尔做一次的事写成 Skill 反而是过度设计。6.3 最常见的两种错误用法错误用法一把一切能力都包装成 MCP Server。有些刚接触 MCP 的开发者连本地两个小函数都非要包一层 Server结果是开发复杂度大增、调试困难、性能反而下降。本地小能力直接写成 Tools 就好MCP 是为共享和标准化服务的不是为单个小工具服务的。错误用法二把所有经验都堆在提示词里忽略了 Skills 的结构化。长篇提示词当然也能达到不错的效果但可维护性很差改一行就要复制到所有地方。Skills 把规则、脚本、参考文件分开修改成本低还能随着实践演化。这就像代码里拆分模块和你写一个几千行的单文件的区别。7. 从 0 到 1 搭建一个同时用上 Tools、MCP 和 Skills 的练手 Agent理论讲了这么多如果不落到真实项目上下次遇到还是要懵。我建议每个人都做一个小项目把三样东西都串起来。下面是一个非常容易实现的练手方向网页信息采集与研究报告生成。7.1 先确定一个“小而完整”的任务给定一个目标网址Agent 要完成三件事一是用浏览器 MCP 打开页面并抓取关键信息二是用一个本地 Tool 对抓取内容做清洗和摘要三是按照一套写报告的习惯生成固定格式的 Markdown 文件。这个任务包含真实网页操作、本地函数调用、固定流程生成正好覆盖 MCP、Tools、Skills 三种能力。规模也不大一个晚上能写完。7.2 架构与一次请求的流转整个过程可以这样理解用户向 Agent 下指令“采集某页面并生成报告”。Agent 先判断任务类型匹配写报告 Skill加载 SKILL.md 中的步骤。接着Agent 看到可用工具中有 MCP 暴露的浏览器操作工具于是调用它打开网页、提取正文。拿到原始内容后Agent 调用本地清洗工具去噪、摘要。最后按 Skill 中定义的报告格式和检查清单输出最终 Markdown 文件。这个流程最值得注意的地方是模型并不需要提前知道网站的 DOM 结构也不需要了解本地清洗工具的源码它只需要看每个工具的描述然后依次调用。这正是能力封装的意义所在。7.3 核心代码逻辑示例下面的伪风格代码展示了在一个 MCP 客户端里如何先列出可用工具再调用它们。不同框架的 API 略有差异但整体思路一致async def run_agent_with_mcp(task: str): # 连接 MCP Server async with ClientSession() as session: # Step1: 发现服务器上有哪些工具 tools await session.list_tools() print(可用工具:, [t.name for t in tools]) # Step2: 让模型决定调用哪个工具 # 这里省略 Agent 主循环核心是根据任务选择工具名和参数 result await session.call_tool( browser_navigate, {url: https://example.com, wait_until: networkidle} ) html_content result.text # Step3: 调用本地 Tool 做清洗 cleaned clean_html(html_content) # Step4: 调用本地摘要 Tool summary summarize(cleaned) # Step5: 按 Skill 模板写报告 write_report(summary)如果你用的是现成 Agent 框架主循环往往已经被封装好了你只需要配置好 MCP Server、定义好本地 Tools、放好 Skill 目录即可。把时间花在调优工具描述和 Skill 步骤上远比重写 Agent 循环更有价值。7.4 适合上手的几个练手项目清单给你几个可以直接开练的备选方向第一个是“网页摘要助手”用 Playwright MCP 抓取正文再用本地工具做摘要最后输出简报。第二个是“Git 仓库体检员”用代码搜索工具读取仓库信息用一个 Skill 规定检查维度输出代码质量报告。第三个是“周报生成器”用日历 API 读取本周事件用表格工具生成周报再用 Skill 固定公司汇报格式。第四个是“设计稿标注读取器”如果团队在使用设计协作平台尝试用官方 MCP 拉取标注信息再结合 Skills 生成开发清单。这些项目有个共同特征外部动作靠 MCP核心逻辑靠 Tools流程规范靠 Skills。做完任何一个你对三者的理解都会上一个台阶。8. 常见问题与排查技巧实录实操中大概率会踩到一些典型问题。我整理一份速查按问题现象给出定位思路。8.1 MCP 一直连接不上现象可能原因排查建议客户端提示无法启动服务器command 不存在或路径不对先在终端执行命令验证再检查 PATH启动后马上断开stdout 被日志污染关闭服务里所有 print日志写入文件能启动但看不到工具协议版本或客户端能力不兼容用官方 demo 配置验证客户端远程 MCP 鉴权失败token 过期或未配置检查配置文件里的 token 与过期时间8.2 Tools 执行时报权限或环境错误最常见的不是代码逻辑错而是环境不一致模型运行时所在的工作目录和你预期不一样环境变量没有传递给子进程临时目录被沙箱化写入失败。我给本地工具加了一层“自检逻辑”启动时往当前目录写一个测试文件读回校验失败就直接报错避免后续操作在错误环境里继续。8.3 Skills 一直没被触发这个问题在自定义 Skill 时特别容易出现。排查顺序如下先确认 Agent 配置里能读取技能目录再确认 SKILL.md 里的描述和任务关键词匹配最后确认触发条件是否被项目级提示词覆盖。很多时候不是文件结构错了而是描述写得过于狭窄模型根本没判断出“这个任务应该用这个skill”。你把描述写得更贴近真实任务语义触发率会立刻提升。8.4 上下文一长Agent 就开始“发疯”大上下文条件下Agent 容易遗忘早期约束、重复调用工具、输出格式漂移。我的应对是不要把超长文本直接塞进对话而是把它放到 MCP Resource 里让模型按需读取固定要求在 Skill 的“禁止事项”里写清楚将重要格式约束放到每轮工具调用之后的 System Message 里。这个方法在多次实践中都能明显拉回模型的输出质量。9. 几句实在话折腾了这么久我自己最大的体会是真正让 Agent 变强的不是某一个“神奇协议”而是你对任务本身的理解。Tools、MCP、Skills 都只是放大器你脑子里若没有清晰的任务拆解它们放大出来的也只是混乱。最后分享一个我一直在用的小技巧写 Skill 时不要追求一步到位。先写一个最简版本拿真实任务跑记录模型哪里做得不到位再回头改 SKILL.md 和脚本。迭代三四个版本后这个技能包才开始真正接近“老手水平”。不要被“从入门到精通”这种标题吓到你只需要先做一个小项目把三个概念串起来就已经超过大部分停留在纸面讨论的人。