07. 工具、技能与 MCP¶
Claude Code 的动作能力分成三层:模型可见的工具规格、运行时内部的工具对象、本地真正执行的处理器。模型只看到工具名、描述和结构说明;运行时持有工具的校验、权限、渲染、并发和安全属性;处理器才会读取文件、运行命令、访问网络或调用 MCP 服务。模型请求工具不等于工具已经执行。
工具系统同时管理能力暴露、任务方法和实际执行。技能(skill,指可复用的任务说明和约束)改变模型的工作方式;MCP 将外部服务的工具、资源或提示接入工具池;真正的本地副作用仍然由工具处理器和权限系统控制。
工具对象承载了比结构说明更多的信息。它会声明是否只读、是否有破坏性、是否并发安全、是否需要用户交互、是否应该延迟加载、是否来自 MCP、最大输出大小、如何把结果映射为工具结果、如何渲染给界面、如何做工具特定权限检查。查询循环只处理“有工具调用需要执行”这个事实,具体工具行为由工具对象封装。
执行时,运行时会先把本轮工具调用分批。连续的并发安全工具可以并行执行,不安全工具串行执行。并发批次的上下文修改会在批次结束后统一应用,避免多个工具同时修改共享状态造成顺序混乱。比如多个只读搜索可以并行,编辑文件或影响任务状态的工具更可能串行。
工具执行管线的第一步是校验。模型给出的输入必须通过 JSON 结构说明和工具自定义校验。校验失败不会进入处理器,而是直接生成错误工具结果。第二步是钩子。工具使用前钩子可以观察或改写输入,也可以要求阻止继续。第三步是权限判断。只有权限系统返回允许,处理器才会执行。处理器返回后,运行时会截断或持久化大输出,运行工具使用后钩子,把结果转换成模型能理解的工具结果。
MCP 工具是同一套工具系统的扩展。MCP 客户端提供远端工具名称、描述、结构说明和调用能力,运行时把它们包装成普通工具对象,放进工具池。对模型来说,MCP 工具和内置工具一样表现为工具结构说明;对运行时来说,它们仍然要经过校验、权限、钩子、输出处理和结果回填。MCP 的区别在于处理器调用的是外部服务,而不是本地内置函数。
技能和工具不同。技能更接近“可复用的任务提示和运行方式”,不是直接副作用能力。一个技能通常由 SKILL.md 或命令定义描述:什么时候使用、参数是什么、允许哪些工具、是否禁用模型调用、是否分叉、是否指定模型或推理强度、是否带钩子。模型可以通过技能工具请求某个技能,但技能本身通常会展开成提示词、上下文、允许工具或子智能体任务,再由后续查询循环使用普通工具完成实际动作。
技能的发现分静态和动态。静态来源包括内置技能、插件技能、用户目录、项目目录、额外目录和 MCP 提供的提示命令。动态来源来自路径触发:当工具读写某些文件后,运行时可以沿目录向上发现嵌套 .claude/skills,或激活 frontmatter 中带 paths 条件的技能。被发现的技能会进入后续上下文或工具可见面,但这不代表它自动获得更多权限;它只是改变模型可调用的任务模板和提示。
工具搜索和延迟工具处理工具数量问题。当工具池很大时,全部结构说明都放进提示词会浪费上下文。运行时可以让模型先使用搜索工具定位相关能力,或者根据历史中的工具引用再加载具体结构说明。这一层影响“模型能看到哪些工具说明”,不改变本地权限判断。即使工具结构说明被加载,真正执行时仍然要走同一条校验、钩子、权限、处理器流程。
可以用一条检查线区分能力边界:模型能看到什么、运行时能执行什么、权限在哪层判断、结果如何回到模型。技能只改变模型上下文;工具规范只暴露动作接口;处理器才产生本地副作用;权限系统决定是否放行;工具结果再把外部世界的变化反馈给模型。下一章会展开这条链路上的权限和安全控制。