OpenClaw 教程 E08 · MCP、扩展与团队治理(收官)
从“能用”到“能定制”:MCP、扩展与团队治理
一、MCP 就三个方法,先把神秘感撕掉
Model Context Protocol,2024 年 11 月末 Anthropic 开源,一年半时间已经成为 AI 应用的 USB-C 端口——官方原话,也是最精炼的类比。它做的事其实很朴素:让任何模型通过标准 JSON-RPC 调用任何工具。把它剥到最小骨架,就三个方法:
| 方法 | 用途 |
|---|---|
initialize |
握手,交换协议版本与能力集 |
tools/list |
服务器告诉客户端有哪些工具 |
tools/call |
客户端调工具,服务器返回结果 |
传输方式有三种:stdio(本地进程管道,最简单)、SSE(HTTP 长连)、Streamable HTTP(2025-06 起主推,替代了早期的 HTTP+SSE)。本地开发用 stdio,公开服务器用 Streamable HTTP,中间还有 OAuth 2.1/OpenID Connect 统一鉴权——这些细节 MCP 生态已经把答案铺好,你抄配置就行。
一位在 Fintech 做 API 平台的朋友讲过 MCP 的价值给他带来的震撼:公司内部原本有 12 个内部 API 需要接入 AI 助手,以前是为每一个都写一个 Copilot / Claude / Cursor 三份适配器,合计 36 套代码。切到 MCP 之后,一次写好一个 MCP server,三个客户端都能用——工作量从 36 降到 12,而且新加一个客户端(比如 Windsurf)成本几乎为零。这就是“从 N×M 到 N+M”最朴素的现场感受。他事后总结:“MCP 不是让 AI 变聪明的协议,是让 AI 集成变便宜的协议。”这句话点得很准。
MCP 从 2024 年 11 月末发布到 2026 年年中的这一年半,生态铺得极快。Anthropic 首批就拉了 Block、Apollo;工具集成方 Zed / Replit / Codeium / Sourcegraph 紧跟;主流客户端 Claude Desktop / Cursor / VS Code Copilot / ChatGPT / Windsurf / Cline 全线落地;2025 年 9 月官方 Registry 上线预览,2026 年 6 月 Enterprise-Managed Authorization 稳定。AISTOC 团队估算 GitHub Copilot、Cursor Enterprise、Anthropic 官方三大生态今年内都会把 MCP 作为“外部工具接入的默认协议”。这一条协议的意义,在于让“AI 应用×外部世界”的接口从 N×M 变成 N+M。这就是”USB-C”这个比喻的分量所在。
—— Anthropic 官宣,2024-11-25
二、80 行 Node 写一个 MCP 服务器
AISTOC 内部实测:一个零依赖的 Node 脚本,跑通 initialize + tools/list + 三次成功 tools/call + 一次错误请求,全部通过——总代码 80 行以内,跑起来大约十几秒——一个能被 Claude Desktop 和 Cursor 直接挂载的合法 MCP 服务器就诞生了。核心结构:
rl.on(‘line’, async line => {
const req = JSON.parse(line);
const resp = await handle(req);
if (resp) process.stdout.write(JSON.stringify(resp) + ‘\n’);
});
逻辑就是“读一行 JSON、处理、回一行 JSON”。90% 的复杂度不在写代码,而在几个第一次都会踩的坑:
- stdout 是 JSON-RPC 通道,日志一定要写 stderr——用
console.error,别用console.log,否则日志会混进协议流 - 每条消息一行 = 一个 JSON,收发严格以
\n分帧 notifications/initialized是通知(没有id),别回复- Windows 下
\r\n行尾,客户端要.trim()
挂到 Claude Desktop 或 Cursor 只需一个几行的 JSON 配置:
“mcpServers”: {
“hello-mcp”: {
“command”: “node”,
“args”: [“/path/to/hello-mcp/server.mjs”]
}
}
}
安全上有一件事必须点破:MCP 服务器不是无害的。stdio 服务器通常以 npx -y 直接跑任意 npm 包,恶意 server 可以扫描本地文件、窃取 token。官方规范里 Tool Safety 一条明写:tool descriptions 视为 untrusted。OpenClaw 的应对是分层——openclaw mcp doctor 做静态检查、probe 做启动时活性验证、Plugin Hook 层的 before_tool_call 做运行时拦截。装 MCP 服务器就像装浏览器插件——生态好东西多,但每一次授权都值得深呼吸一次。也别忘了 2025 年 9 月上线的官方 Registry:作为公开 MCP 服务器的 single source of truth,它给了你查证一个 server 是否可信的官方入口,别再从随机的博客链接 npx -y 陌生包。
这套挂法在 Claude Desktop 与 Cursor 里几乎一样,OpenClaw 也支持通过 openclaw mcp add 把外部 MCP 服务器注册到本地会话里。传输选项覆盖 stdio、SSE、streamable-http 三档,HTTP 侧还支持 OAuth 登录、静态 header、TLS 验证甚至 mTLS。想只暴露某几个 tool?加 toolFilter.include/exclude,支持 glob。所有这些细节 OpenClaw 官方文档 docs/cli/mcp.md 里都有一手参考,写完你自己的 MCP 服务器后半小时内可以完成上线。国内团队多看一眼 EMA(Enterprise-Managed Authorization)——2026 年 6 月 stable 之前,多个 MCP server 反复弹授权是最常见槽点,EMA 之后 Anthropic/Microsoft/Okta 三方推动 SSO 化,未来 MCP 生态的授权疲劳会显著缓解。
三、写自定义 Tool,还是写 Skill?
E03 讲了 Skill,E08 讲 Tool——两者最常见的困惑是“我到底该用哪个”。一张表说清:
| 维度 | Skill | Tool |
|---|---|---|
| 触发 | description 匹配 + 上下文加载 | Agent 主动调用(有名字 + schema) |
| 实现 | Markdown + scripts | JavaScript 模块 |
| 输入 | 自然语言 | 严格 JSON schema |
| 输出 | scripts 的 stdout | JSON 对象 |
| 场景 | 工作流 / 手册 | 确定性函数(计算、格式化、外部 API) |
选择原则一句话:能用确定性代码表达的,写 Tool;有工作流步骤要 Agent 判断的,写 Skill。AISTOC 内部实测的样板是一个中英混排字数统计 Tool word_count——20 行代码,处理码点、CJK、标点分词,四组用例全绿。装到 ~/.openclaw/plugin-skills/ 下,openclaw skills list 就能看到。
再往下走一层,OpenClaw 的扩展面其实有三层:Internal Hooks(HOOK.md 文件式,覆盖命令生命周期、Gateway 启动/重启/关闭、消息事件)、Plugin Hooks(进程内中间件,before_tool_call、before_agent_reply 等,能拦截、改写、要求 approval)、Capability 注册(Provider / Channel / Tool / 图像 / 音频等能力入口)。三者不是替代关系,是分工——文件式 hook 管生命周期,插件 hook 管中间件,Capability 管新增能力。分工清楚,扩展性才有天花板。每个 hook 还支持 priority 排序与 timeoutMs 预算,operator 侧可以覆盖插件作者设定,防止某个插件卡住整条流水线。这些细节 docs/plugins/hooks.md 里有完整表格,写插件之前值得通读一遍。
四、一个 Gateway 装下 3 个 Agent 的路由术
E04 讲多 Agent 协作时提过一句:一个 Gateway 可以承载多个 Agent。真到落地一步,需要三个概念——agents.list(声明谁是谁)、bindings(哪个通道 × 哪个联系人给谁接)、channels.<channel>.accounts.<id>.allowFrom / groupAllowFrom(谁能开口)。一段 JSON5 配置片段:
agents: {
list: [
{ id: “coordinator”, workspace: “~/.openclaw/workspace-coordinator” },
{ id: “engineer”, workspace: “~/.openclaw/workspace-engineer” },
{ id: “researcher”, workspace: “~/.openclaw/workspace-researcher” },
],
},
bindings: [
{ agentId: “engineer”, match: { channel: “feishu”, peer: { kind: “direct”, id: “ou_xxx” } } },
{ agentId: “researcher”, match: { channel: “feishu”, peer: { kind: “group”, id: “oc_xxx” } } },
{ agentId: “coordinator”, match: { channel: “feishu”, accountId: “*” } },
],
channels: {
feishu: {
accounts: {
default: {
appId: “cli_xxx”,
appSecret: “FEISHU_APP_SECRET”,
dmPolicy: “allowlist”,
allowFrom: [“ou_owner_open_id”],
groupAllowFrom: [“oc_group_id”],
},
},
},
},
}
上面这段是从 OpenClaw 官方文档 docs/concepts/multi-agent.md 逐字抠出的权威骨架——AISTOC 团队内部实测确认可以直接落进 openclaw.json 生效。三条链路:agents.list 声明谁是谁、顶层 bindings 声明谁接哪个通道×哪个联系人、channels.<channel>.accounts.<id> 里的 allowFrom/groupAllowFrom 声明谁能开口。三个字段各司其职,别搞混。
治理浓缩五条:
- 1 个 Agent = 1 个 workspace + 1 套人格文件(AGENTS.md/SOUL.md/USER.md)
- bindings 从具体到通配,通配放最后——顺序错,全被兜底吞
- 敏感 Agent 一定要挂
dmPolicy: "allowlist"与allowFrom / groupAllowFrom,别裸奔 - heartbeat 只留 1 个总协调 Agent 打开,其它按 cron 或事件唤起
- 跨 Agent 通信只走
sessions_send,别用飞书 @ 替代
关于第 3 条 dmPolicy + allowFrom 这一条再啰嗦一次:Agent 不设访问白名单,就等于把电话号码放在公共电话簿上,任何走通同一通道的人都能开口跟它对话——多数场景不合适。allowFrom 一份 owner 联系人清单、groupAllowFrom 一份团队群清单,是最基础的访问控制。E01 里说过入口挪位是 OpenClaw 的精髓,那这一层就是“入口的门禁”。
第 4 条 heartbeat 治理更容易被忽略。一个 Agent 每 30 分钟被自动唤起并不便宜——多个 Agent 都开着 heartbeat,token 消耗与推送噪音会呈线性叠加。生产上更聪明的做法是:只留一个总协调 Agent 开 heartbeat 巡检;专业 Agent(工程、研究、法务)改用 cron 或事件驱动,谁找它谁唤它,不闲着也不吵人。这条经验来自 AISTOC 内部多 Agent 团队的真实运行。
配置的正确应用姿势是三步走:先备份 openclaw.json,再用 gateway(action="config.patch") 增量合入需要新加的分支,最后 openclaw config validate 校验通过后 gateway(action="restart", note="apply multi-agent bindings")。这一套下来大约 3 分钟,比手改整份 JSON 稳一个数量级——增量合入不容易误伤已有配置,validate 会在真重启前把 schema 层错误拦下。
本节铁律:只读展示,未写入本机 openclaw.json。上述配置片段以及应用步骤(备份 → config.patch → validate → restart),AISTOC 内部作为可复用操作手册验证过完整逻辑,但实际未合入本机生产配置——写入前后 openclaw.json 大小与最后修改时间均未变。这份克制是我们对读者的诚意:教程演示,不做真操作。凡是“改系统级配置”的动作,都值得让人先深呼吸一次——尤其在生产环境里,慢一步比错一步值钱。
五、五个最容易踩的坑
| 症状 | 怎么救 |
|---|---|
MCP initialize 之后无响应 |
99% 是 console.log 混进 stdout;日志改走 stderr |
| Windows 正常 / Mac 挂 | 行尾 \r\n——客户端 .trim() |
| 自定义 Tool 加载不到 | 目录名 = tool.js 里的 name,加上 package.json 的 "type": "module" |
| bindings 顺序错,全被兜底吃 | accountId: "*" 通配必须放最后一个 |
| bindings 改动热重载不生效 | gateway(action=restart)——bindings 属于重启才刷新的一档 |
六、系列回顾:一句话八集
| 期号 | 主题 | 一句话 |
|---|---|---|
| E01 | 5 分钟跑通 | 入口从终端挪到聊天窗 |
| E02 | Agent 帮你写代码 | 补全 vs Agent 分水岭:意图 vs 击键 |
| E03 | Skills 与 Tools | description ≤ 160 字节是你与 Agent 的合同 |
| E04 | 多 Agent 协作 | 只有两把锤子——send 与 spawn |
| E05 | 从需求到 MVP | 写代码是艺术,AI 压缩的是艺术之前的摩擦 |
| E06 | 部署双轨 | 写代码是艺术,部署是工程 |
| E07 | 运维闭环 | 让服务替你安静运转,是给未来自己发工资 |
| E08 | MCP 与治理 | 从“能用”顺利走到“能定制” |
七、收官行动清单:你现在可以做的三件事
读到系列最后一集,如果只做一件事,那就选下面第一件;如果时间充裕,把三件都跑一遍。这三件事都不难,但落到你自己手里,才能让这八集从“我读过”变成“我用过”。
☐ 第二件:写一个属于你自己的 Tool。不要求业务复杂——一个
word_count、一个把日期文本转 ISO 时间戳的 parse_date、一个把 markdown 转纯文本的 md_to_text,都够了。写完让 Agent 主动调用一次,才算完成回路。☐ 第三件:回顾自己的 Agent 治理配置。打开你自己的
openclaw.json,对着本期五条治理原则逐条自检——bindings 顺序对不对、敏感 Agent 有没有 dmPolicy="allowlist"+allowFrom、heartbeat 是不是多开着几个。发现问题就用 config.patch 三步走修一次,把你自己的日常先规范起来。
八、写在最后
八集下来,我们从“5 分钟装完”一路走到了“自定义 MCP + 多 Agent 治理”。回头看,OpenClaw 让人舒服的其实不是任何单一功能,而是整套设计的克制感——只留两把锤子(send 与 spawn)、Skill 一个文件夹搞定、cron 跑在 Gateway 里不多不少一个数据库、bindings 从具体到通配一条线走通。每一处选择都在拒绝“多一点抽象、多一层框架”的诱惑。这在 AI 框架泛滥的今天尤其难得——很多同类项目喜欢用抽象换代码量,让读者以为学得更多,实际却离能落地更远。
AI 时代的工程能力,说到底还是“把复杂系统留在简单心智里”。这不是新问题,也不是 AI 独有的问题——只是这一次,AI 让我们有机会用更少的模板去做更多的事。
如果你读到这里已经不是工程师身份,也不必焦虑。这 8 期能带走的最小心智其实只有两句:入口比工具更重要(E01)、把工作流写成 Skill 才让 Agent 稳定接管(E03)。剩下的技术细节,等你团队里的工程师需要时再回来看即可。
愿你也能在自己的场景里,把这份“少即是多”落到能长期跑的代码里去。下次不见——除非你自己写下一集,然后回过来告诉我们。
—— AISTOC产品团队
E02 · 让 Agent 帮你写代码
E03 · Skills 与 Tools 详解
E04 · 多 Agent 协作
E05 · 应用开发实战:从需求到 MVP
E06 · 部署到服务器(Windows / Linux 双轨)
上一篇:E07 · 运维闭环
◎ E08 · 进阶:MCP、扩展与团队治理(当前 · 收官)
夜雨聆风