37b 飞书机器人与 MCP 搭建
上一篇: 37a 全景架构与决策框架 | 下一篇: 37c 多维表格自动化
本篇从零搭建 Agent 基础设施:安装 OpenClaw、创建飞书应用、配置消息通道(飞书 WebSocket / Lark Webhook)、接入 MCP 工具层,最终完成一个端到端的 Hello World 验证。这是后续所有 Skill 和工作流的前置基础。
1. OpenClaw 安装与配置
1.1 系统要求
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | Linux / macOS | Ubuntu 22.04+ |
| Node.js | 18+ | 20 LTS |
| 内存 | 2GB | 4GB+ |
| 磁盘 | 1GB 可用空间 | 10GB+(含记忆和日志) |
| 网络 | 可访问飞书 API | 稳定的外网连接 |
1.2 安装
# 全局安装 OpenClaw
npm install -g openclaw
# 验证安装
openclaw --version
# 初始化项目目录
mkdir ~/hackquest-agent && cd ~/hackquest-agent
openclaw init初始化后的目录结构:
hackquest-agent/
├── .openclaw/
│ ├── config.json ← 主配置文件
│ ├── memory/ ← 记忆系统存储目录
│ └── logs/ ← 运行日志
├── skills/ ← Skill 文件目录
│ └── example.md ← 示例 Skill
└── mcp/ ← MCP 配置目录
└── servers.json ← MCP Server 配置1.3 daemon 模式配置
生产环境需要 OpenClaw 以 daemon 模式持久运行:
# 启动 daemon 模式
openclaw daemon start
# 查看运行状态
openclaw daemon status
# 停止
openclaw daemon stop
# 查看日志
openclaw daemon logs --tail 100主配置文件 .openclaw/config.json:
{
"name": "hackquest-agent",
"model": {
"provider": "anthropic",
"model": "claude-sonnet-4-20250514",
"fallback": "claude-haiku-4-20250514"
},
"daemon": {
"enabled": true,
"port": 3100,
"logLevel": "info",
"maxConcurrent": 5
},
"memory": {
"enabled": true,
"persistPath": ".openclaw/memory"
},
"plugins": [],
"mcp": {
"configPath": "mcp/servers.json"
}
}注意:
model字段中的模型名称请以 OpenClaw 官方文档为准,不同版本支持的模型列表可能不同。
2. 飞书/Lark 应用创建
2.1 创建应用
- 登录 飞书开放平台 (国内版)或 Lark Developer (国际版)
- 进入「开发者后台」→「创建企业自建应用」
- 填写应用信息:
- 应用名称:
HackQuest AI Agent - 应用描述:
团队 AI 助手,覆盖需求管理、数据分析、团队协作等场景
- 应用名称:
- 记录
App ID和App Secret,后续配置需要
2.2 权限配置
在「权限管理」页面开通以下权限:
| 权限分类 | 权限标识 | 说明 | 用途 |
|---|---|---|---|
| 消息 | im:message:send_as_bot | 以机器人身份发送消息 | 所有 Skill 的消息回复 |
| 消息 | im:message:receive | 接收消息 | 接收用户指令 |
| 消息 | im:message:read | 读取消息 | 获取消息上下文 |
| 群组 | im:chat:create | 创建群组 | 自动创建项目群 |
| 群组 | im:chat:member | 管理群成员 | 自动拉人入群 |
| 多维表格 | bitable:app | 多维表格全部权限 | 需求/缺陷/迭代表操作 |
| 文档 | docx:document:readonly | 读取文档 | RAG 知识库索引 |
| 知识库 | wiki:wiki:readonly | 读取知识库 | RAG 知识库索引 |
| 日历 | calendar:calendar | 日历读写 | 会议安排、提醒 |
| 通讯录 | contact:user.base:readonly | 读取用户基本信息 | 人员匹配 |
2.3 事件订阅
在「事件订阅」页面配置需要监听的事件:
| 事件 | 事件标识 | 触发时机 |
|---|---|---|
| 接收消息 | im.message.receive_v1 | 用户 @机器人 或私聊发消息 |
| 消息已读 | im.message.message_read_v1 | 用户已读机器人消息 |
| 多维表格记录变更 | drive.file.bitable_record_changed_v1 | 多维表格记录增删改 |
| 群成员变更 | im.chat.member.user.added_v1 | 新成员加入群组 |
2.4 机器人配置
在「机器人」页面:
- 启用机器人功能
- 设置机器人头像和描述
- 配置消息卡片回调地址(Lark Webhook 模式需要)
3. 消息通道方案:飞书 vs Lark
这是架构搭建中最关键的决策点之一。飞书(国内版)和 Lark(国际版)在消息通道上有本质区别:
3.1 方案对比
| 维度 | 飞书(国内版)WebSocket | Lark(国际版)Webhook 回调 | Lark 轮询模式 |
|---|---|---|---|
| 连接方式 | WebSocket 长连接 | HTTP POST 回调 | 定时 HTTP GET |
| 是否需要公网 IP | ❌ 不需要 | ✅ 需要(或用隧道) | ❌ 不需要 |
| 消息延迟 | <100ms | <500ms | 取决于轮询间隔(秒级~分钟级) |
| 实现复杂度 | 低(OpenClaw 插件直接支持) | 中(需部署 HTTP 服务) | 低(但延迟高) |
| 稳定性 | 高(自动重连) | 高(需处理重试和幂等) | 中(可能丢消息) |
| 适用场景 | 国内团队首选 | 国际团队 / HackQuest 场景 | 低频通知场景 |
| 月成本 | ¥0 | ¥0(Cloudflare Tunnel 免费) | ¥0 |
3.2 飞书(国内版):WebSocket 长连接
飞书原生支持 WebSocket 长连接,OpenClaw 的 feishu 插件可以直接使用,无需公网 IP,配置最简单:
{
"plugins": [
{
"name": "feishu",
"config": {
"appId": "cli_xxxxxxxxxxxx",
"appSecret": "xxxxxxxxxxxxxxxxxxxxxxxx",
"mode": "websocket",
"eventTypes": [
"im.message.receive_v1",
"drive.file.bitable_record_changed_v1"
]
}
}
]
}配置完成后 OpenClaw 会自动建立 WebSocket 连接,接收飞书事件并路由到对应 Skill。
3.3 Lark(国际版):Webhook 回调方案
Lark 国际版不支持 WebSocket 长连接,需要通过 Webhook 回调接收事件。推荐使用 Cloudflare Tunnel 将本地服务暴露到公网:
架构示意:
Lark 服务器 → HTTPS → Cloudflare Tunnel → localhost:3100 → OpenClaw步骤 1:安装 Cloudflare Tunnel
# macOS
brew install cloudflared
# Linux
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared
chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/
# 登录 Cloudflare(首次使用)
cloudflared tunnel login
# 创建隧道
cloudflared tunnel create hackquest-agent
# 配置隧道路由
cloudflared tunnel route dns hackquest-agent agent-webhook.hackquest.io步骤 2:配置隧道
创建 ~/.cloudflared/config.yml:
tunnel: <TUNNEL_ID>
credentials-file: ~/.cloudflared/<TUNNEL_ID>.json
ingress:
- hostname: agent-webhook.hackquest.io
service: http://localhost:3100
- service: http_status:404# 启动隧道(生产环境用 systemd 管理)
cloudflared tunnel run hackquest-agent步骤 3:配置 OpenClaw feishu 插件(Webhook 模式)
{
"plugins": [
{
"name": "feishu",
"config": {
"appId": "cli_xxxxxxxxxxxx",
"appSecret": "xxxxxxxxxxxxxxxxxxxxxxxx",
"mode": "webhook",
"webhookPort": 3100,
"webhookPath": "/lark/event",
"verificationToken": "xxxxxxxxxxxxxxxx",
"encryptKey": "xxxxxxxxxxxxxxxx",
"eventTypes": [
"im.message.receive_v1",
"drive.file.bitable_record_changed_v1"
]
}
}
]
}步骤 4:在 Lark 开放平台配置回调地址
在「事件订阅」页面设置请求地址为:
https://agent-webhook.hackquest.io/lark/eventLark 会发送一个 challenge 验证请求,OpenClaw 的 feishu 插件会自动处理验证。
3.4 Lark 替代方案对比
如果不想用 Cloudflare Tunnel,还有其他选择:
| 方案 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| Cloudflare Tunnel | 免费、稳定、自动 HTTPS | 依赖 Cloudflare 服务 | ⭐⭐⭐⭐⭐ |
| ngrok | 配置简单 | 免费版域名随机变化,需付费固定 | ⭐⭐⭐ |
| 云服务器直接部署 | 无需隧道 | 需要购买公网 IP 服务器 | ⭐⭐⭐⭐ |
| Lark 事件 → 消息队列 → OpenClaw | 解耦、可靠 | 架构复杂,需要额外中间件 | ⭐⭐ |
| 轮询模式 | 最简单,无需公网 | 延迟高,可能丢消息 | ⭐ |
4. MCP 工具层配置
MCP(Model Context Protocol)是 Agent 与外部工具交互的标准协议。OpenClaw 内置 MCP Client,只需在配置文件中声明 MCP Server 即可使用。
4.1 MCP Server 配置文件
编辑 mcp/servers.json:
{
"mcpServers": {
"lark-mcp": {
"command": "npx",
"args": ["-y", "@anthropic/lark-mcp@latest"],
"env": {
"LARK_APP_ID": "cli_xxxxxxxxxxxx",
"LARK_APP_SECRET": "xxxxxxxxxxxxxxxxxxxxxxxx",
"LARK_BASE_URL": "https://open.feishu.cn"
}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxx"
}
},
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"POSTGRES_CONNECTION_STRING": "postgresql://readonly:password@localhost:5432/hackquest"
}
}
}
}注意:
- 飞书国内版使用
https://open.feishu.cn,Lark 国际版使用https://open.larksuite.com- MCP Server 的包名和参数请以各项目 GitHub README 为准,版本可能更新
- 数据库连接建议使用只读账户,详见 37g 数据分析与运营 Agent
4.2 MCP 工具能力矩阵
| MCP Server | 核心能力 | 对应 Skill 组 |
|---|---|---|
| lark-mcp | 消息发送/接收、多维表格 CRUD、文档读取、知识库读取、日历管理、通讯录查询 | 所有 Skill |
| github | PR 查看/创建/审查、Issue 管理、代码搜索、Actions 触发、分支管理 | 代码 Skill |
| postgres | SQL 查询执行、Schema 查看 | 数据分析 Skill |
4.3 验证 MCP 连接
# 查看已配置的 MCP Server
openclaw mcp list
# 测试单个 MCP Server 连接
openclaw mcp test lark-mcp
openclaw mcp test github
openclaw mcp test postgres
# 查看某个 MCP Server 提供的工具列表
openclaw mcp tools lark-mcp5. 端到端 Hello World 测试
5.1 编写第一个 Skill
创建 skills/hello-world.md:
# hello-world
当用户发送包含"你好"、"hello"、"测试"的消息时,回复一条欢迎消息。
## 触发条件
用户消息包含"你好"、"hello"、"hi"、"测试"等问候词。
## 执行步骤
1. 识别用户的飞书昵称
2. 回复一条包含用户昵称的欢迎消息
3. 简要介绍自己能做什么
## 输出格式
回复消息格式:
- 第一行:问候语 + 用户昵称
- 第二行:自我介绍(一句话)
- 第三行:列出 3-5 个核心能力
## 示例输出
你好,张三!👋
我是 HackQuest AI Agent,你的团队智能助手。
我可以帮你:
• 创建和管理需求/缺陷
• 查询项目数据和生成报表
• 搜索知识库回答问题
• 查看 GitHub PR 和代码
• 生成工作总结和 OKR 报告5.2 加载并测试
# 重新加载 Skill(如果 daemon 已运行,Skill 会自动热加载)
openclaw skill reload
# 查看已加载的 Skill 列表
openclaw skill list
# 本地测试(不经过飞书,直接在终端对话)
openclaw chat
> 你好5.3 飞书端验证
- 在飞书中搜索机器人名称
HackQuest AI Agent - 发送私聊消息:
你好 - 预期:机器人在 1-2 秒内回复欢迎消息
- 在群组中 @机器人:
@HackQuest AI Agent 测试 - 预期:机器人在群组中回复
5.4 验证 MCP 工具调用
创建一个测试 Skill 验证 MCP 工具是否正常工作:
# test-mcp
测试 MCP 工具连接是否正常。
## 触发条件
用户消息包含"测试 MCP"、"测试工具"。
## 执行步骤
1. 调用 lark-mcp 获取当前用户信息
2. 调用 github MCP 获取仓库列表
3. 汇总测试结果
## 输出格式
以表格形式展示每个 MCP 工具的连接状态:
| 工具 | 状态 | 说明 |6. 常见问题排错
6.1 OpenClaw 安装问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
npm install -g 权限不足 | 全局安装需要权限 | 使用 sudo npm install -g openclaw 或配置 npm prefix |
| Node.js 版本不兼容 | OpenClaw 要求 Node 18+ | 使用 nvm 安装指定版本:nvm install 20 |
| daemon 启动失败 | 端口被占用 | 检查端口:lsof -i :3100,修改配置中的端口号 |
| 内存不足 | LLM 调用消耗内存 | 确保至少 2GB 可用内存,或使用更轻量的模型 |
6.2 飞书/Lark 连接问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| WebSocket 连接失败 | App ID/Secret 错误 | 检查配置文件中的凭证是否正确 |
| 收不到消息事件 | 事件订阅未配置 | 在开放平台检查事件订阅是否已启用 |
| Webhook 验证失败 | verification token 不匹配 | 确认 verificationToken 与开放平台一致 |
| Cloudflare Tunnel 连接不上 | 隧道未启动或 DNS 未生效 | 检查 cloudflared tunnel run 是否正常,等待 DNS 传播 |
| 机器人无响应 | 权限不足 | 检查是否开通了 im:message:send_as_bot 权限 |
| Lark 长连接报错 | Lark 不支持 WebSocket | 切换到 Webhook 回调模式,参考 3.3 节 |
6.3 MCP 工具问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| MCP Server 启动失败 | 依赖未安装 | 确保 npx 可用,检查网络连接 |
| lark-mcp 认证失败 | Token 过期或权限不足 | 重新获取 App Secret,检查权限配置 |
| GitHub MCP 无法访问仓库 | Token 权限不足 | 生成新的 PAT,确保包含 repo 权限 |
| PostgreSQL 连接超时 | 网络不通或凭证错误 | 检查连接字符串,确认数据库可达 |
7. 工具与资源推荐
| 工具 | 用途 | 价格 | 链接 |
|---|---|---|---|
| OpenClaw | Agent 运行时 | 开源免费 | GitHub |
| Cloudflare Tunnel | 内网穿透 | 免费 | 文档 |
| ngrok | 内网穿透(备选) | 免费版可用 / Pro $10/月 | 官网 |
| lark-mcp | 飞书 MCP Server | 开源免费 | GitHub |
| GitHub MCP Server | GitHub MCP Server | 开源免费 | GitHub |
| nvm | Node.js 版本管理 | 开源免费 | GitHub |
下一篇: 37c 多维表格自动化 — 设计需求/缺陷/迭代多维表格 Schema,实现 Skill 自动创建和 CRUD 操作