产品经理在飞书群里丢了一段话——「@claude-claw 给『用户中心』加个需求,登录页接入 Google OAuth,优先级 P1,指派给小王。」几秒后机器人回了一张卡片:禅道需求单 #1287 已创建,标题、优先级、负责人全部到位,点一下直接跳转工单页。这就是 claude-claw——一只每天在公司群里值班的 AI 员工。 |
01从一句话需求说起
PM 不用切系统、不用填表单、不用复制粘贴。他只说了一句人话。这就是我最近给公司造的一个小玩意儿——claude-claw,一只"爪子",专门从飞书群里抓需求、扔进禅道、顺带回复你一声"好嘞"。它不是原型 demo,而是每天都在公司群里值班的 AI 员工。
这篇文章想聊一聊:它是怎么搭起来的,为什么我没有选"做一个大而全的 Agent 平台",以及在生产环境里让一个 AI 跑起来,到底要解决哪些真问题。
02claude-claw 是什么
一句话概括:claude-claw 是一个运行在受限 Docker 沙箱里、通过飞书机器人接收指令、调用 Claude Code 执行任务的 AI 员工。
🧑💼真实习生:会请假、会摸鱼、记性时好时坏、权限靠 HR 手动约束、同时只能服务一个老板。 🤖claude-claw:7×24 在线,对话上下文天然延续,只能碰你允许的东西,同时为整个团队服务,每个人一份独立会话。 |
它的底层是 Claude Code——也就是 Anthropic 官方那个 CLI,搭配@anthropic-ai/claude-agent-sdk常驻在容器里。我没有从零造 Agent 框架,而是直接把 Claude Code 的能力"搬"到了飞书群里:工具编排、文件读写、代码执行、记忆压缩,这些基础能力 SDK 已经做得很好,我要做的是把它"装进"公司的工作流里。
03架构:三层楼的小房子
整个系统只有三层,每层职责清清楚楚。
| 📍 第一层:Gateway 网关(Node + TypeScript) 网关做三件事——接入飞书(用 WSClient 长连接,不走 webhook,公司内网无公网域名也能跑)、身份校验(whitelist.json 热加载,30 秒内生效)、容器调度(每个飞书用户按 user_id 哈希到固定容器,对话上下文自然连贯,空闲 30 分钟自动回收)。 |
| 📍 第二层:Sandbox 沙箱(Docker) 容器里跑着一个 Node HTTP 服务,收到 prompt 就喂给 Claude Agent SDK 的query(),把流式事件以 SSE 推回 Gateway。用node:22-slim起,rootfs 只读,唯一可写的目录是/work——用户上传的图片、生成的截图、临时文件全落这里,出这一格就动不了。 |
| 📍 第三层:MCP 工具服务 这是 claude-claw 的"手"。我写了四个 MCP Server:mcp-lark(回消息/建飞书文档/授权)、mcp-zentao(建需求/任务/Bug)、mcp-history(查历史聊天归档)、mcp-web(常驻 Playwright 浏览器读带登录态的内网站点)。另外还装了lark-cli,封装 200+ 飞书 API,Claude 直接通过 Bash 调用。 |
04它到底能干什么
一期上线后,团队里用得最多的五个场景:
| 💬 把聊天变工单 PM 讨论到一半说"这个录到禅道里,指派给我",claude-claw 就会抽出关键信息、调用mcp__zentao__create_story,建完回复带工单号和链接的交互卡片。整个过程没有任何表单填写。 |
| 📝 把评审变文档 评审结束,一句"把刚才结论整理成文档放在这个群",claude-claw 回溯前 20 条消息,生成带标题、分段、待办的飞书 Doc,并自动给群成员授予编辑权限——这一步是个暗坑,等会儿单独讲。 |
| 🕰️ 在群里回忆历史 "上周有人提到 OAuth 的问题吗?"一句话,mcp-history扫 SQLite 里的聊天归档,返回相关消息片段。时间维度、关键词维度都能查。 |
| 🌐 读带登录态的网页 设计师把内部 CoDesign 链接丢进群:"帮我看看这个稿子",claude-claw 通过常驻 Playwright 浏览器(复用真实登录态)打开页面、截图、读文字,然后基于内容回答。 |
| 🖼️ 多模态输入 用户可直接在消息里带图片、PDF、视频。Gateway 把附件下载到/work/sessions/xxx/,在 prompt 里以绝对路径传进去。视频则由 ffmpeg 预抽 N 张关键帧,当成一条时间线来理解。 |
05最难的不是让它跑起来,是让它跑得安全
我在开发过程中花最多时间想清楚的一件事是:怎么让一个能执行 Bash、能读文件、能发消息的 AI,不做任何越权的事?
答案是一套"纵深防御",从内到外一共四层:
| 🛡️ 第一层:容器隔离 沙箱容器--read-only根文件系统,cap-drop=ALL,没有 host 网络,没有挂载 docker.sock。就算 AI 被骗着写rm -rf /,它也只能在 /work 里自己玩自己。 |
| 🛡️ 第二层:Claude Code 权限模板 settings.json 默认deny 一切,只 allow 白名单:Read 限定 /work,Bash 限定 ls/cat/grep/git log 这类只读命令,Write 同样只许写 /work。这层是 Claude Code 原生机制,不需要额外开发。 |
| 🛡️ 第三层:Hook 运行时拦截 pre_tool_use钩子在每次工具调用前做二次校验:路径前缀合法吗?命令是否命中黑名单(curl/wget/nc/ssh/...)?MCP 参数有没有拼接执行风险?这一层是兜底,防止权限配置自身出现疏漏。 |
| 🛡️ 第四层:身份模型约束(最关键) lark-cli 支持bot和user两种身份。不加约束时 Claude 会为了"办成事"自动 fallback 到 user——结果就是A 问一句话,机器人拿着 B 的账号去读 B 的私人日历。我在 system prompt 和 hook 里双重约束"永远不要用 --as user"。 |
⚠️ 这个坑是我上线前两天才意识到的。真实项目里,AI 会为了完成任务而"聪明"地找捷径,而这些捷径往往就是权限漏洞。多想一步,不让它"自由发挥"。 |
06让 Claude 直接说话
做 AI 机器人时,大家第一反应是"Claude 调用reply_to_lark工具发回消息"。我一开始也这么做,然后发现 Claude 会把消息发两遍——一遍通过工具调用,一遍作为最终 assistant text。
后来我改了设计:Claude 的最终回复文本就是用户看到的消息。Gateway 捕获 SDK 的 result 事件,把最后一段文本直接当成飞书回复发出去。mcp-lark 只用来发"特殊形态"消息——交互卡片、图片、中间进度提示。
这个改动看似很小,体验差别却很大。Claude 不再"表演"自己在调用工具,它只是自然地回答问题。沉默的 MCP 调用留给需要结构化输出的场合,日常对话就像跟一个人说话。
07怎么落地:五步路线图
如果你也想给自己公司做一个类似的 AI 员工,每一步都独立可验证:
- 第一步 · 把飞书接入打通
:WSClient 订阅消息 + 白名单热加载 + 回一个pong: <原文>。验证基础通路,半天搞定。 - 第二步 · 搭沙箱镜像
:Dockerfile + settings.json 权限模板 + 三个 hook + 容器内 HTTP server。安全地基,值得花一整天。 - 第三步 · 写 mcp-lark
:把回复消息的能力包成 MCP,沙箱内手动测通。 - 第四步 · 接禅道
:fork 开源的 mcp-zentao,扩展create_story / create_task / create_bug三个工具,用自己的测试产品验证。 - 第五步 · 端到端串联
:容器池、图片处理、用户队列。这一步会暴露前面所有偷懒的地方,做好被打脸的准备。
整个过程我用了大约一周时间。真正写代码的时间不到一半,剩下的都在想清楚"边界"——哪些事必须拦,哪些事可以放,出错时该反问还是该兜底。
✓写在最后的体会
做完 claude-claw 后,我对"AI 员工"这个词的理解变了。
它不是一个通用 Agent,不需要无所不能。AI 员工真正有价值的地方是对你公司特定流程的深度理解——知道禅道里有哪些产品、知道飞书群的聊天习惯、知道评审纪要该放进哪个文档库。这些东西不在预训练里,也不在任何通用工具里,它们只存在于你公司的上下文中。
它也不是一个被严格脚本约束的 RPA。我最初的版本给 Claude 写了一大堆"必须先调用 A 再调用 B"的规则,结果它畏首畏尾,回答问题都怪怪的。后来我把规则精简成三条红线——权限边界、身份约束、工具调用形态——其他全部交给模型自己判断。效果反而好得多。
如果你也在考虑给团队做类似的事,送你三句话: 1️⃣从一个高频且痛的场景开始——不要一上来就想"做一个能做所有事的助手"。我选禅道,是因为每天都在用,填表单又烦。 2️⃣权限设计先于功能设计——想清楚 AI 能碰什么、不能碰什么,再想它能做什么。反过来做会爆炸。 3️⃣让 Claude Code 自己决定怎么做——你负责画边界,它负责做决定。别把它当函数调。 |
AI 员工不是未来,它已经在我们的飞书群里了。剩下的,只是你愿不愿意给它发工牌。
🔗 相关资源:
Claude Code:claude.com/claude-code
Claude Agent SDK:npmjs.com/package/@anthropic-ai/claude-agent-sdk
飞书开放平台 SDK:npmjs.com/package/@larksuiteoapi/node-sdk
项目仓库与更多细节,欢迎在公众号后台回复「claude-claw」索取。
夜雨聆风