资讯动态

MCP / Subagents / Hooks / Skills 怎么配起来用:把重复动作搬出对话

发布时间:2026/9/3 10:11:25 来源:尧图企业网站定制
你正在看的这个系列从选题、查资料、写正文、配图到审核、排版没有一步是我在对话框里一条条手敲指令催出来的。它们是一条流水线/topic进选题、/research派研究员搜资料、/write撰稿、/illustrate出图、/review过审、/publish适配两个平台六个我自己建的 skill 首尾相接。研究那一步还派了 subagent 去隔离调研免得一堆搜索结果糊进主对话。换句话说这篇讲四块怎么配的文章本身就是这四块配出来的产物。上一篇第 6 篇用 subagent 给上下文减负只是顺手用了一下。这一篇把 MCP、Subagents、Hooks、Skills 当一等公民来搭给你能直接照抄的 YAML 和 JSON跑通四件事接外部工具、隔离脏活、固化必做动作、封装重复流程。说明本篇所有配置以 Claude 官方文档code.claude.com/docs2026-06 版为准逐项核对过示例一律用通用 / 开源 / 个人小项目一个天气 App不涉及任何业务代码。一、先立心智模型四块各解决什么问题这四个词很多人都眼熟可真到用的时候常常不知道该上哪个因为它们听着都像让 Claude 更强。想分清先问一句它们各自动的是哪根弦我借一个理解视角社区、讲师的叫法不是官方术语只当地图看把一个 AI 智能体能不能干好活拆成四个旋钮——上下文c、动作空间a、状态s、任务t。四块东西正好各管一头机制一句话用途主要拧哪个旋钮配置文件MCP给 Claude 接外部工具 / 数据源GitHub、数据库、监控a动作要够得到目标.mcp.jsonSubagent把会污染主上下文的子任务扔进独立窗口只回摘要s主会话不被噪声稀释.claude/agents/*.mdHook在生命周期事件上挂确定性脚本改完文件就跑 lint把每次必做固化不靠模型记settings.jsonSkill把反复粘贴的流程 / 知识封装成按需加载的能力c平时不占窗口用到才加载.claude/skills/名/SKILL.md简单记要它够得到外部世界用 MCP别把脏活弄脏主对话用 Subagent某件事每次都自动发生用 Hook把重复流程沉淀成一键能力用 Skill。下面四节每节都给可照抄的配置、一个真实场景、必须知道的坑。二、MCP让它够得到外部系统它解决什么MCPModel Context Protocol是个开源标准让 Claude Code 连到外部工具、数据库、API。官方给的判断信号很直白当你发现自己在反复从另一个工具里复制数据、粘进对话把 issue 列表、监控面板、数据库查询结果一遍遍贴给它那就该接一个 MCP server 了。接上之后Claude 直接读、直接操作那个系统你不用再当人肉搬运工。它有三种连接方式transportHTTP推荐连云端远程 server 的首选。stdio本地进程跑本地脚本、或需要直接访问本机的工具。SSE官方已标注废弃deprecated很多老教程还在教能换就换成 HTTP。可照抄配置方式一命令行claude mcp add# 远程 HTTP server推荐 claude mcp add --transport http notion https://mcp.notion.com/mcp # 带 token 的 HTTP server claude mcp add --transport http github https://api.githubcopilot.com/mcp/ \ --header Authorization: Bearer YOUR_GITHUB_PAT # 本地 stdio server —— 注意 -- 之后才是启动 server 的命令 claude mcp add --env AIRTABLE_API_KEYYOUR_KEY --transport stdio airtable \ -- npx -y airtable-mcp-server # 管理 claude mcp list # 列出全部 claude mcp get github # 看详情 claude mcp remove github # 删除 # 会话里输入 /mcp 看状态、跑 OAuth 登录这里有个必须讲的机制坑stdio 那条命令里的--双横线是分界线左边是 Claude 自己的参数--transport、--env右边才是启动 server 的命令和它自己的参数。少了--Claude 会把 server 的--port之类当成自己的参数去解析然后报错。方式二可照抄的.mcp.json项目级提交进 git团队共享{ mcpServers: { weather-api: { type: http, url: ${WEATHER_API_BASE:-https://api.weather.com}/mcp, headers: { Authorization: Bearer ${WEATHER_API_KEY} } }, local-db: { type: stdio, command: npx, args: [-y, bytebase/dbhub, --dsn, ${DB_DSN}], env: {} } } }几个官方确认的要点${VAR}展开环境变量${VAR:-默认值}带兜底没设又没默认值会解析失败可展开的位置有command、args、env、url、headers出于安全项目级.mcp.json里的 server 第一次用之前会要你批准。scope装在哪一层同一个 server你可以装到三个层级决定它在哪些项目可见、要不要团队共享Scope作用范围团队共享存哪local默认仅当前项目否私有~/.claude.jsonproject仅当前项目是随.mcp.json进 git项目根.mcp.jsonuser你的所有项目否私有~/.claude.jsonclaude mcp add --transport http stripe --scope local https://mcp.stripe.com claude mcp add --transport http paypal --scope project https://mcp.paypal.com/mcp claude mcp add --transport http hubspot --scope user https://mcp.hubspot.com/anthropic两个容易踩的点。一是 MCP 的localscope 存的是家目录的~/.claude.json和项目本地设置.claude/settings.local.json不是一回事别搞混。二是术语变过旧版的projectscope 现在叫local旧版的global现在叫user你看老教程时留意一下。一个真实场景我在做一个天气 App想让 Claude 直接读线上 Postgres 里的用户反馈表而不是每次手动导出 CSV 再粘进来claude mcp add --transport stdio db -- npx -y bytebase/dbhub \ --dsn postgresql://readonly:passprod.db.com:5432/analytics接上之后直接问这个月没下过单的用户有哪些Claude 通过这个 MCP 工具去查库回答。人肉搬运的那一步就消失了。必须知道的坑接了 MCP可能反而更费 token这点最该老实说单次工具输出超 10,000 token 官方会警告默认上限 25,000 token可用MAX_MCP_OUTPUT_TOKENS调高。一个话痨 server 能把你上下文撑得很快。但多接几个 server本身影响很小。因为 MCP 工具定义默认走 Tool Search 按需加载session 启动时只加载工具名和 server 简介真正用到才把完整定义搜出来。所以费 token 的是输出不是接入。远程 server 要授权返回 401/403 时在/mcp里跑一次浏览器 OAuth 登录token 会自动存储和刷新。注意 prompt injection会拉取外部内容的 server 有注入风险接之前确认来源可信。一句话MCP 是给动作空间做加法让 Claude 够得到原本够不到的系统。代价是输出要管住别让外部数据反过来淹了你。三、Subagent把脏活扔进独立上下文它解决什么子代理是专门干某类任务的助手。它最核心的价值第 6 篇我们已经用数字见过了它跑在自己独立的上下文窗口里干完只把一段摘要返回主会话。官方给的判断信号是当一个旁支任务会用搜索结果、日志、文件内容把主对话灌满而这些你之后根本不会再看时就交给子代理。第 6 篇那个会话里我派 8 个 subagent 读图、查资料它们自己烧掉约 36 万 token主会话只收到 8 段几百字摘要那就是这个机制在干活。除了隔离上下文子代理还能用工具白名单约束能力、跨项目复用配置、用专注的提示词特化行为还能把任务路由到更便宜的模型比如 Haiku来控成本。可照抄配置文件放.claude/agents/名.md项目级或~/.claude/agents/名.md个人级。格式是 Markdown 加 YAML frontmatter正文就是这个子代理的系统提示词。官方最小骨架--- name: code-reviewer description: Reviews code for quality and best practices tools: Read, Glob, Grep model: sonnet --- You are a code reviewer. When invoked, analyze the code and provide specific, actionable feedback on quality, security, and best practices.frontmatter 字段只有name和description必填字段必填说明name是小写字母 连字符的唯一标识description是描述什么时候该委派给它Claude 据此自动触发tools否工具白名单。省略等于继承主会话全部工具disallowedTools否工具黑名单model否sonnet/opus/haiku/fable或完整 ID默认inherit跟主会话一个天气 App 能直接用的例子放~/.claude/agents/test-writer.md--- name: test-writer description: 在新增或修改函数后为其补写单元测试。当用户说补测试加 test或刚改完业务逻辑时使用。 tools: Read, Grep, Glob, Edit, Write, Bash model: haiku --- 你是单元测试专家。被调用时 1. 读取目标函数及其现有测试风格。 2. 覆盖正常路径、边界值、异常输入三类用例。 3. 只写测试文件不改业务代码。 4. 写完跑一次测试命令把结果摘要返回主会话。注意这里我特意指定了model: haiku。补测试是规整活用更便宜的模型干省钱。怎么触发自动Claude 遇到匹配description的任务时自动委派所以 description 一定要写清何时用这是它能不能被正确触发的关键。显式直接点名Use the test-writer agent to ...。管理会话里/agents打开管理界面创建 / 编辑 / 删除 / 看正在运行的。必须知道的坑tools省略等于继承全部工具。你想用子代理约束能力比如让 reviewer 只读不写就必须显式写tools白名单否则等于没约束。直接在磁盘新建或改 agent 文件要重启 session 才加载用/agents界面创建的立即生效。它不是免费的子代理另开一个上下文窗口、可能用更贵的模型适合探索 / 隔离噪声这类有规模的活别拿它干一句话能完成的琐事。部分工具拿不到像AskUserQuestion、ExitPlanMode这类依赖主会话界面的工具即使写进tools子代理也用不了。Subagent 则是给主会话状态做减法把噪声大、你又不复看的活隔到别处烧主对话只留干净的结论。四、Hook让 harness 替你保证每次都做它解决什么这是四块里最容易被低估的一块。Hook 是挂在 Claude Code 生命周期事件上的确定性脚本关键在于它由 harness运行 Claude Code 的程序执行不是模型执行。这个区别决定了它的不可替代性。凡是从今往后每次 X 都要 Y的自动化改完文件就跑 lint、提交前必跑测试、危险命令必须拦靠在 CLAUDE.md 里写一句、靠模型记都不可靠模型会忘上下文一压缩就丢。只有 hook 能保证它每次确定性地发生。可照抄配置配置写在settings.json.claude/settings.json或~/.claude/settings.json。官方结构{ hooks: { PostToolUse: [ { matcher: Edit|Write, hooks: [ { type: command, command: ${CLAUDE_PROJECT_DIR}/.claude/hooks/lint-check.sh } ] } ] } }意思是每次Edit或Write工具成功后自动跑这个脚本。配套的.claude/hooks/lint-check.sh#!/bin/bash input$(cat) # 从 stdin 读 JSON file_path$(jq -r .tool_input.file_path // empty $input) [ -z $file_path ] exit 0 if eslint $file_path --fix; then exit 0 else # 把错误反馈给 Claude让它自己修 jq -n { systemMessage: Linting failed. Please review and fix. } exit 0 fi关键机制常用事件全量 20 多个这里挑高频的事件触发时机PreToolUse工具执行前可拦截PostToolUse工具执行成功后UserPromptSubmit你提交 prompt、处理前StopClaude 回答结束做完成门控用PreCompact/PostCompact上下文压缩前 / 后SessionStart/SessionEndsession 开始 / 结束退出码是这套机制的核心脚本返回0表示成功返回2是阻断性错误stderr 的内容会反馈给 ClaudePreToolUse就是靠exit 2来拦截一个工具调用的。比如你想禁止 Claude 跑rm -rf就在PreToolUse脚本里判断命令、命中就exit 2并把原因写进 stderr。matcher的写法*或省略等于匹配全部工具Edit|Write精确匹配这两个也支持正则。一个真实场景天气 App 是 Android 项目我希望 Claude 每次改完 Kotlin 文件就自动跑ktlint -F格式化。把上面那段配置的matcher保持Edit|Write脚本里把eslint换成ktlint -F即可。从此不用每次提醒记得格式化harness 替我保证。必须知道的坑路径别写死脚本路径用${CLAUDE_PROJECT_DIR}指向项目根比绝对路径可移植。拦截只认退出码 2想阻止某个操作必须exit 2别的非零码只是非阻断错误会显示但不拦。hook 会跑任意 shell项目级 hook 执行的是仓库里的脚本clone 别人的仓库时留个心眼这是信任问题。Hook 是把必须每次发生的事从模型的记忆搬到 harness 的确定性执行里。模型会忘脚本不会。五、Skill把重复流程封装成按需能力它解决什么Skill 就是一个SKILL.md文件把你反复粘贴的指令 / 清单 / 多步流程或者CLAUDE.md 里长成一段流程的那部分封装成 Claude 工具箱里的一项能力。开头说的那条内容流水线就是六个 skill。它最大的卖点是省上下文skill 正文只在被用到时才加载那些长长的参考资料在用到之前几乎不占 token。它既能被 Claude 自动调用也能你手动/skill-名触发。顺带一提官方已经把自定义命令并进了 skills老的.claude/commands/deploy.md和新的.claude/skills/deploy/SKILL.md都生成/deploy老文件继续能用。渐进式加载描述常驻、正文按需、附件再按需社区习惯把 skill 的加载分成 L1/L2/L3 三层这个编号是社区叫法不是官方术语但官方确实是这个三级递进机制层内容何时进上下文L1frontmatter 的namedescription描述始终在上下文让 Claude 知道有这个 skill 可用L2SKILL.md正文仅在 skill 被调用时才加载全文L3同目录的reference.md/scripts/*.py等在正文里被引用用到时才读脚本是被执行、不是被加载进上下文这套设计的妙处在于你可以建一堆 skill平时它们只用一行描述常驻、几乎不占窗口真正用到某一个才把它的正文拉进来。可照抄配置目录结构每个 skill 是一个目录SKILL.md是入口my-skill/ ├── SKILL.md # 主指令必需 ├── reference.md # 详细参考用到才加载 └── scripts/ └── helper.py # 脚本被执行不进上下文存放位置个人级~/.claude/skills/名/SKILL.md所有项目可用项目级.claude/skills/名/SKILL.md仅本项目。一个天气 App 能用的SKILL.md骨架--- name: summarize-changes description: 总结未提交改动并标出风险点。当用户问改了啥、要 commit message、或要 review diff 时使用。 allowed-tools: Read Grep --- ## 当前改动 !git diff HEAD ## 指令 把上面的改动用 2-3 个要点概括然后列出风险缺错误处理、 硬编码值、要更新的测试等。diff 为空就说明没有未提交改动。 ## 附加资源用到才读 - 完整规范见 [reference.md](reference.md)这里!git diff HEAD是个好东西叫动态上下文注入Claude Code 会先把这条命令跑掉、把输出替换进 skill 内容等 Claude 读到时 diff 已经内联在里面了。另外$ARGUMENTS、$1这些可以接收/summarize-changes后面跟的参数。frontmatter 常用字段description最重要决定能否被自动触发把关键用例放最前、disable-model-invocation: true只许你手动触发、allowed-tools激活时免询问可用的工具。一个真实场景我每次发版前都手敲一串跑测试 → 构建 → 打 tag → 推。把它封装成~/.claude/skills/release/SKILL.md加上disable-model-invocation: true防止 Claude 看代码挺好就自作主张发版以后/release一键跑完。平时这段流程一个字都不占上下文发版时才加载。必须知道的坑命令名取的是目录名不是name字段.claude/skills/deploy-staging/对应的就是/deploy-staging。正文别写长skill 一旦加载会跨轮次留在上下文里每一行都是重复的 token 成本。官方建议SKILL.md控制在 500 行内长内容塞进 L3 附件。有副作用的流程一定加disable-model-invocation: true部署、发消息、发版这类别让 Claude 自动触发。Skill 是给上下文做减法把重复流程沉淀成平时隐身、用时现身的一键能力知识在盘上、不在每轮的账单里。六、四块串起来顺便破一个伪对立讲到这里最该澄清一个流传很广、但其实不成立的对比Skill 比 MCP 省上下文所以能用 Skill 就别用 MCP。这话半对半错。Skill 按需加载、占上下文低是对的官方确认。但用它推出MCP 更费、要少用就错了前面说过MCP 现在默认也走 Tool Search 按需加载接入本身对上下文影响很小。更根本的是这俩压根解决不同的问题MCP 管的是够不够得到——连数据库、连 GitHub、连监控给的是动作空间。Skill 管的是重不重复——把你的发版流程、审查清单固化成一键能力给的是封装。谁更省是个伪命题。正确的问法是要连外部系统用 MCP要固化重复流程用 Skill而且它们经常配合着用。一个 skill 可以在 frontmatter 里直接挂allowed-tools、挂mcpServers、甚至context: fork把自己丢进子代理里跑四块东西本就是能串起来的。举个把四块连起来的组合天气 App 要做每周自动出一份线上反馈周报。MCP接上线上数据库让 Claude 够得到反馈表建一个Skill/weekly-report把查上周反馈 → 分类 → 写成周报的流程固化成一键这个 skill 内部派一个Subagent去拉取和清洗一周的原始数据量大、噪声多只把结构化结果返回不污染主对话配一个StopHook在周报生成后自动校验是否包含数据来源和时间范围缺了就打回。你看MCP 够得到、Skill 一键起、Subagent 隔噪声、Hook 守底线四块各司其职拼成一条你只需敲一个命令的自动化。结尾把判断留给自己把动作交给配置回到开头那条写出这个系列的流水线。它和这一篇讲的四块其实是同一件事的两面。/clear、/compact、subagent 隔离都是在替主会话卸东西。这一篇看起来相反是在给能力做加法——接 MCP、配 hook、建 skill。但方向相反、目的一致把你每天重复做的那些动作和检查从对话里搬进配置文件好让主会话只剩下真正需要你判断的事。四块的分工各记一条就够机制一句话MCP让它够得到外部系统Subagent让脏活别弄脏主对话Hook让该做的每次自动做Skill让重复流程一键起、平时不占窗口把它们配明白你的 Claude Code 就从一个很强的对话框变成一套替你跑流程的系统。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价