cursor-feishu

Cursor 飞书集成 — 通过飞书 WebSocket 长连接将飞书消息接入 Cursor Headless CLI。
传输模式(FEISHU_TRANSPORT / createFeishuService({ transport }))
http(默认) | 由宿主(如 Express)提供 Webhook;飞书选「发送到开发者服务器」,需公网/ngrok |
ws | Lark.WSClient 长连接;飞书选「使用长连接接收事件」,无需配置请求地址 |
both | 同时启用 WS + HTTP;请勿在飞书对同一事件重复订阅,否则依赖包内 message_id 去重 |
特性
- 🚀 WebSocket 长连接 —
transport: ws 时实时收消息,无需公网 Webhook
- 🌐 HTTP Webhook —
transport: http 时由宿主提供 POST 回调
- 🤖 多媒体支持 — 图片、文件、音频、富文本消息自动处理
- 👥 智能群聊 — 仅 @提及时回复,其他消息静默监听作为上下文
- 💬 流式响应 — 支持实时更新消息(流式输出)
- 🔧 灵活配置 — 支持环境变量注入和配置文件加载
- 📝 完整类型 — TypeScript 类型定义,开发友好
快速开始
1. 安装依赖
npm install cursor-feishu
2. 创建飞书配置文件
创建 ~/.config/cursor/plugins/feishu.json:
{
"appId": "cli_xxxxxxxxxxxx",
"appSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
也支持通过环境变量注入敏感值(适合容器部署):
{
"appId": "${FEISHU_APP_ID}",
"appSecret": "${FEISHU_APP_SECRET}"
}
3. 配置飞书应用
在 飞书开放平台 创建自建应用,然后:
- 添加机器人能力
- 事件订阅 — 添加
im.message.receive_v1 和 im.chat.member.bot.added_v1
- 订阅方式(与
FEISHU_TRANSPORT 一致)
- 使用
ws:选「使用长连接接收事件」
- 使用
http:选「发送到开发者服务器」并填写你的 Webhook URL
- 权限 — 开通
im:message、im:message:send_as_bot、im:chat
- 发布应用
4. 使用
import { createFeishuService } from 'cursor-feishu'
const service = await createFeishuService({
transport: process.env.FEISHU_TRANSPORT === 'ws' ? 'ws' : 'http',
onMessage: async (msgCtx) => {
console.log(`收到消息: ${msgCtx.content}`)
},
onBotAdded: async (chatId) => {
console.log(`Bot 已加入群聊: ${chatId}`)
}
})
await service.run()
API 文档
createFeishuService(options)
创建飞书服务实例。
参数:
interface FeishuServiceOptions {
config?: Partial<ResolvedConfig>
appId?: string
appSecret?: string
transport?: 'http' | 'ws' | 'both'
onMessage?: (msgCtx: FeishuMessageContext) => Promise<void>
onBotAdded?: (chatId: string) => Promise<void>
onCardAction?: (action: any) => Promise<void>
log?: LogFn
}
返回:
interface FeishuService {
readonly transport: 'http' | 'ws' | 'both'
run: () => Promise<void>
shutdown: () => Promise<void>
getSender: () => FeishuSender
getClient: () => LarkClient
}
FeishuMessageContext
收到的消息上下文:
interface FeishuMessageContext {
chatId: string
messageId: string
messageType: string
content: string
rawContent: string
chatType: "p2p" | "group"
senderId: string
rootId?: string
createTime?: string
shouldReply: boolean
}
FeishuSender
消息发送器:
class FeishuSender {
sendText(chatId: string, text: string): Promise<boolean>
sendCard(chatId: string, card: any): Promise<boolean>
updateMessage(messageId: string, text: string): Promise<boolean>
}
配置说明
完整配置字段(~/.config/cursor/plugins/feishu.json):
appId | string | ✅ | — | 飞书应用 App ID |
appSecret | string | ✅ | — | 飞书应用 App Secret |
timeout | number | ❌ | 120000 | AI 响应超时(毫秒) |
logLevel | string | ❌ | "info" | 日志级别:fatal/error/warn/info/debug/trace |
maxHistoryMessages | number | ❌ | 200 | 入群时拉取历史消息的最大条数 |
pollInterval | number | ❌ | 1000 | 轮询响应的间隔(毫秒) |
stablePolls | number | ❌ | 3 | 连续几次轮询内容不变视为回复完成 |
dedupTtl | number | ❌ | 600000 | 消息去重缓存过期时间(毫秒) |
directory | string | ❌ | "" | 默认工作目录,支持 ~ 和 ${ENV_VAR} 展开 |
群聊行为
| 单聊 | ✅ | ✅ |
| 群聊 + @bot | ✅ | ✅ |
| 群聊未 @bot | ✅ (静默) | ❌ |
| bot 入群 | ✅ (历史) | ❌ |
环境变量
FEISHU_DEBUG=1
FEISHU_APP_ID=cli_xxxxxxxxxxxx
FEISHU_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
HTTP_PROXY=http://proxy.company.com:8080
HTTPS_PROXY=http://proxy.company.com:8080
开发
npm install
npm run build
npm run dev
npm run typecheck
npm run release
npm publish
项目结构
src/
├── index.ts # 主入口,导出 createFeishuService
├── types.ts # 类型定义
├── feishu/
│ ├── gateway.ts # WebSocket 网关,连接飞书
│ └── sender.ts # 消息发送器
常见问题
Q: 消息无法接收?
检查以下几点:
- 飞书应用凭证是否正确(在飞书开放平台验证)
- 是否订阅了
im.message.receive_v1 事件
- 是否使用「长连接」方式(不是 Webhook)
- 查看调试日志:
FEISHU_DEBUG=1 node app.js 2>&1 | grep error
Q: 群聊消息无法回复?
群聊中必须 @bot,否则消息只会静默监听。这是设计行为,可以避免 bot 过度回复。
Q: 如何支持代理?
设置环境变量即可:
HTTP_PROXY=http://proxy:8080 npm start
Q: 如何与 cursor-agent 容器集成?
在 Dockerfile 中安装 cursor-feishu,然后启动一个长期运行的 Node.js 服务来处理飞书消息,再调用 cursor-agent 容器执行任务。
示例见 cursor-agent 仓库的 docs/feishu/ 目录。
许可证
MIT
相关项目