lark-bridge-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,140 @@
1
+ # lark-mcp-server
2
+
3
+ 飞书/Lark MCP Server —— 通过飞书机器人与用户交互的 Model Context Protocol 工具服务。
4
+
5
+ ## 功能
6
+
7
+ | 工具 | 说明 |
8
+ |------|------|
9
+ | `ask_user` | 通过飞书发送消息给用户,并等待用户回复(有限次超时重试后返回) |
10
+ | `send_message` | 通过飞书机器人发送消息给用户(不等待回复) |
11
+
12
+ ## 安装
13
+
14
+ ```bash
15
+ npm install -g lark-mcp-server
16
+ ```
17
+
18
+ 或直接通过 npx 使用:
19
+
20
+ ```bash
21
+ npx lark-mcp-server
22
+ ```
23
+
24
+ ## 快速开始
25
+
26
+ ### 方式一:零配置(推荐新手)
27
+
28
+ 只需要 APP_ID 和 APP_SECRET,首次使用时在飞书私聊机器人发一条消息即可:
29
+
30
+ ```json
31
+ {
32
+ "mcpServers": {
33
+ "lark-bridge": {
34
+ "command": "npx",
35
+ "args": ["-y", "lark-mcp-server"],
36
+ "env": {
37
+ "LARK_APP_ID": "你的 App ID",
38
+ "LARK_APP_SECRET": "你的 App Secret"
39
+ }
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ 启动后在飞书找到机器人,私聊发一条消息,程序会自动记录你的身份。日志中会打印你的 `open_id`,可以保存下来用于方式二。
46
+
47
+ ### 方式二:固定用户(推荐)
48
+
49
+ 用从方式一获取到的 `open_id` 固定配置,重启后无需再发消息:
50
+
51
+ ```json
52
+ {
53
+ "mcpServers": {
54
+ "lark-bridge": {
55
+ "command": "npx",
56
+ "args": ["-y", "lark-mcp-server"],
57
+ "env": {
58
+ "LARK_APP_ID": "你的 App ID",
59
+ "LARK_APP_SECRET": "你的 App Secret",
60
+ "LARK_RECEIVE_ID": "ou_xxxxxxxxxxxxxx",
61
+ "LARK_RECEIVE_ID_TYPE": "open_id"
62
+ }
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ ### 方式三:邮箱/手机号查找用户
69
+
70
+ 如果飞书应用开通了通讯录权限(`contact:user.email:readonly` 或 `contact:user.phone:readonly`),可以直接用邮箱或手机号:
71
+
72
+ ```json
73
+ "env": {
74
+ "LARK_APP_ID": "你的 App ID",
75
+ "LARK_APP_SECRET": "你的 App Secret",
76
+ "LARK_RECEIVE_ID": "your@company.com",
77
+ "LARK_RECEIVE_ID_TYPE": "email"
78
+ }
79
+ ```
80
+
81
+ ```json
82
+ "env": {
83
+ "LARK_APP_ID": "你的 App ID",
84
+ "LARK_APP_SECRET": "你的 App Secret",
85
+ "LARK_RECEIVE_ID": "13800138000",
86
+ "LARK_RECEIVE_ID_TYPE": "mobile"
87
+ }
88
+ ```
89
+
90
+ ## 环境变量
91
+
92
+ | 变量 | 必填 | 说明 |
93
+ |------|------|------|
94
+ | `LARK_APP_ID` | ✅ | 飞书应用的 App ID |
95
+ | `LARK_APP_SECRET` | ✅ | 飞书应用的 App Secret |
96
+ | `LARK_RECEIVE_ID` | 可选 | 消息接收者标识 |
97
+ | `LARK_RECEIVE_ID_TYPE` | 可选 | ID 类型:`open_id`/`user_id`/`union_id`/`chat_id`/`email`/`mobile`,不填则自动推断 |
98
+ | `LARK_ENCRYPT_KEY` | 可选 | 事件加密密钥(长连接模式通常不需要) |
99
+ | `LARK_ASK_TIMEOUT_MINUTES` | 可选 | ask_user 单次等待超时(分钟),默认 `5` |
100
+ | `LARK_ASK_MAX_RETRIES` | 可选 | ask_user 超时后最大提醒次数,默认 `2` |
101
+ | `LARK_COLLECT_WINDOW_SECONDS` | 可选 | 收到回复后的收集窗口(秒),默认 `3` |
102
+ | `LARK_MESSAGE_PREFIX` | 可选 | 发送消息前缀,默认 `📢 Cursor 任务同步:\n` |
103
+
104
+ ## 飞书应用配置
105
+
106
+ 1. 前往 [飞书开放平台](https://open.feishu.cn/app/) 创建自建应用
107
+ 2. 获取 App ID 和 App Secret
108
+ 3. 添加「机器人」能力
109
+ 4. 在「权限管理」中开通权限:
110
+ - **必须**:`im:message`(获取与发送单聊、群组消息)
111
+ - **必须**:`im:message.p2p_msg:readonly`(获取用户发给机器人的单聊消息)
112
+ - *可选*:`contact:user.email:readonly`(通过邮箱查找用户,方式三需要)
113
+ - *可选*:`contact:user.phone:readonly`(通过手机号查找用户,方式三需要)
114
+ 5. 在「事件与回调」中选择「使用长连接」,添加 `im.message.receive_v1` 事件
115
+ 6. 在「版本管理与发布」中发布应用
116
+
117
+ ## 工作原理
118
+
119
+ ```
120
+ ┌──────────────────────────────────────────────────────┐
121
+ │ lark-mcp-server │
122
+ │ │
123
+ │ ┌─────────────────────┐ ┌──────────────────────┐ │
124
+ │ │ Lark WebSocket │ │ MCP Server (stdio) │ │
125
+ │ │ 长连接 (接收消息) │ │ ask_user │ │
126
+ │ │ │ │ send_message │ │
127
+ │ └────────┬────────────┘ └──────────┬───────────┘ │
128
+ │ │ 消息队列 (bridge) │ │
129
+ │ └──────────────────────────┘ │
130
+ │ │
131
+ │ ┌─────────────────────┐ │
132
+ │ │ Lark Client API │ │
133
+ │ │ (机器人发送消息) │ │
134
+ │ └─────────────────────┘ │
135
+ └──────────────────────────────────────────────────────┘
136
+ ```
137
+
138
+ ## License
139
+
140
+ MIT
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,263 @@
1
+ #!/usr/bin/env node
2
+ // Lark SDK 内部用 console.log 输出日志,会污染 MCP 的 stdio 通道,
3
+ // 必须在加载 SDK 之前将 console.log 重定向到 stderr
4
+ const _originalLog = console.log;
5
+ console.log = (...args) => console.error(...args);
6
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
8
+ import * as Lark from "@larksuiteoapi/node-sdk";
9
+ import { z } from "zod";
10
+ // ── 环境变量 ──────────────────────────────────────────────
11
+ const LARK_APP_ID = process.env.LARK_APP_ID ?? "";
12
+ const LARK_APP_SECRET = process.env.LARK_APP_SECRET ?? "";
13
+ const LARK_ENCRYPT_KEY = process.env.LARK_ENCRYPT_KEY ?? "";
14
+ const LARK_RECEIVE_ID_TYPE = process.env.LARK_RECEIVE_ID_TYPE ?? "";
15
+ const LARK_RECEIVE_ID = process.env.LARK_RECEIVE_ID ?? "";
16
+ const WAIT_TIMEOUT_SECONDS = Number(process.env.LARK_WAIT_TIMEOUT_SECONDS ?? "60");
17
+ const COLLECT_WINDOW_SECONDS = Number(process.env.LARK_COLLECT_WINDOW_SECONDS ?? "3");
18
+ const MESSAGE_PREFIX = process.env.LARK_MESSAGE_PREFIX ?? "📢 Cursor 任务同步:\n";
19
+ // ── Lark Client ──────────────────────────────────────────
20
+ const larkClient = new Lark.Client({
21
+ appId: LARK_APP_ID,
22
+ appSecret: LARK_APP_SECRET,
23
+ appType: Lark.AppType.SelfBuild,
24
+ domain: Lark.Domain.Feishu,
25
+ });
26
+ let resolvedTarget = null;
27
+ let autoOpenId = "";
28
+ async function resolveEmailToOpenId(email) {
29
+ try {
30
+ const res = await larkClient.contact.user.batchGetId({
31
+ params: { user_id_type: "open_id" },
32
+ data: { emails: [email] },
33
+ });
34
+ const users = res.data?.user_list;
35
+ if (users && users.length > 0 && users[0].user_id) {
36
+ console.error(`[LarkBridge] 邮箱 ${email} → open_id: ${users[0].user_id}`);
37
+ return users[0].user_id;
38
+ }
39
+ console.error(`[LarkBridge] 邮箱 ${email} 未找到对应用户`);
40
+ return null;
41
+ }
42
+ catch (e) {
43
+ console.error("[LarkBridge] 通过邮箱查找用户失败:", e);
44
+ return null;
45
+ }
46
+ }
47
+ async function resolveMobileToOpenId(mobile) {
48
+ try {
49
+ const res = await larkClient.contact.user.batchGetId({
50
+ params: { user_id_type: "open_id" },
51
+ data: { mobiles: [mobile] },
52
+ });
53
+ const users = res.data?.user_list;
54
+ if (users && users.length > 0 && users[0].user_id) {
55
+ console.error(`[LarkBridge] 手机号 ${mobile} → open_id: ${users[0].user_id}`);
56
+ return users[0].user_id;
57
+ }
58
+ console.error(`[LarkBridge] 手机号 ${mobile} 未找到对应用户`);
59
+ return null;
60
+ }
61
+ catch (e) {
62
+ console.error("[LarkBridge] 通过手机号查找用户失败:", e);
63
+ return null;
64
+ }
65
+ }
66
+ async function initSendTarget() {
67
+ if (!LARK_RECEIVE_ID) {
68
+ console.error("[LarkBridge] 未配置 LARK_RECEIVE_ID,将自动从收到的消息中获取发送目标");
69
+ return;
70
+ }
71
+ const idType = LARK_RECEIVE_ID_TYPE || "auto";
72
+ if (idType === "open_id" || idType === "user_id" || idType === "union_id" || idType === "chat_id") {
73
+ resolvedTarget = { receiveIdType: idType, receiveId: LARK_RECEIVE_ID };
74
+ console.error(`[LarkBridge] 发送目标: ${idType}=${LARK_RECEIVE_ID}`);
75
+ return;
76
+ }
77
+ if (idType === "email" || (idType === "auto" && LARK_RECEIVE_ID.includes("@"))) {
78
+ const openId = await resolveEmailToOpenId(LARK_RECEIVE_ID);
79
+ if (openId) {
80
+ resolvedTarget = { receiveIdType: "open_id", receiveId: openId };
81
+ return;
82
+ }
83
+ console.error("[LarkBridge] 邮箱解析失败,将尝试自动从消息中获取目标");
84
+ return;
85
+ }
86
+ if (idType === "mobile" || (idType === "auto" && /^\+?\d{7,}$/.test(LARK_RECEIVE_ID))) {
87
+ const openId = await resolveMobileToOpenId(LARK_RECEIVE_ID);
88
+ if (openId) {
89
+ resolvedTarget = { receiveIdType: "open_id", receiveId: openId };
90
+ return;
91
+ }
92
+ console.error("[LarkBridge] 手机号解析失败,将尝试自动从消息中获取目标");
93
+ return;
94
+ }
95
+ console.error(`[LarkBridge] 无法识别 LARK_RECEIVE_ID_TYPE="${idType}",尝试作为 open_id 使用`);
96
+ resolvedTarget = { receiveIdType: "open_id", receiveId: LARK_RECEIVE_ID };
97
+ }
98
+ function getSendTarget() {
99
+ if (resolvedTarget)
100
+ return resolvedTarget;
101
+ if (autoOpenId)
102
+ return { receiveIdType: "open_id", receiveId: autoOpenId };
103
+ return null;
104
+ }
105
+ let waitingResolve = null;
106
+ const messageQueue = [];
107
+ function pushMessage(content) {
108
+ if (waitingResolve) {
109
+ const resolve = waitingResolve;
110
+ waitingResolve = null;
111
+ resolve(content);
112
+ }
113
+ else {
114
+ messageQueue.push(content);
115
+ }
116
+ }
117
+ function pullMessage(timeoutMs) {
118
+ if (messageQueue.length > 0) {
119
+ return Promise.resolve(messageQueue.shift());
120
+ }
121
+ return new Promise((resolve) => {
122
+ const timer = setTimeout(() => {
123
+ waitingResolve = null;
124
+ resolve(null);
125
+ }, timeoutMs);
126
+ waitingResolve = (value) => {
127
+ clearTimeout(timer);
128
+ resolve(value);
129
+ };
130
+ });
131
+ }
132
+ // ── 通过机器人 API 发送消息 ──────────────────────────────
133
+ async function sendLarkMessage(text) {
134
+ const target = getSendTarget();
135
+ if (!target) {
136
+ console.error("[LarkBridge] 无发送目标!请先在飞书给机器人发一条消息,或配置 LARK_RECEIVE_ID");
137
+ return;
138
+ }
139
+ try {
140
+ const res = await larkClient.im.message.create({
141
+ params: { receive_id_type: target.receiveIdType },
142
+ data: {
143
+ receive_id: target.receiveId,
144
+ content: JSON.stringify({ text: `${MESSAGE_PREFIX}${text}` }),
145
+ msg_type: "text",
146
+ },
147
+ });
148
+ if (res.code === 0) {
149
+ console.error(`[LarkBridge] 消息已发送`);
150
+ }
151
+ else {
152
+ console.error(`[LarkBridge] 发送失败: code=${res.code}, msg=${res.msg}`);
153
+ }
154
+ }
155
+ catch (e) {
156
+ console.error(`[LarkBridge] 发送飞书消息异常: ${e?.message ?? e}`);
157
+ }
158
+ }
159
+ // ── 等待/检查用户回复 ────────────────────────────────────
160
+ async function waitForReply(timeoutMs) {
161
+ const collectMs = COLLECT_WINDOW_SECONDS * 1000;
162
+ const first = await pullMessage(timeoutMs);
163
+ if (first === null)
164
+ return null;
165
+ console.error(`[LarkBridge] 收到回复: ${first}`);
166
+ const messages = [first];
167
+ let next;
168
+ while ((next = await pullMessage(collectMs)) !== null) {
169
+ console.error(`[LarkBridge] 收到后续: ${next}`);
170
+ messages.push(next);
171
+ }
172
+ return messages.join("\n");
173
+ }
174
+ // ── 飞书 WebSocket 长连接 ────────────────────────────────
175
+ function startLarkConnection() {
176
+ if (!LARK_APP_ID || !LARK_APP_SECRET) {
177
+ console.error("[LarkBridge] LARK_APP_ID 或 LARK_APP_SECRET 未配置,跳过启动");
178
+ return;
179
+ }
180
+ const eventDispatcher = new Lark.EventDispatcher(LARK_ENCRYPT_KEY ? { encryptKey: LARK_ENCRYPT_KEY } : {}).register({
181
+ "im.message.receive_v1": async (data) => {
182
+ console.error("[LarkBridge] ====== 收到飞书消息事件 ======");
183
+ try {
184
+ const msg = data.message;
185
+ const sender = data.sender;
186
+ console.error(`[LarkBridge] 消息ID: ${msg.message_id}`);
187
+ console.error(`[LarkBridge] chat_id: ${msg.chat_id}, type: ${msg.chat_type}`);
188
+ console.error(`[LarkBridge] 内容: ${msg.content}`);
189
+ const senderOpenId = sender?.sender_id?.open_id;
190
+ if (senderOpenId && !resolvedTarget) {
191
+ autoOpenId = senderOpenId;
192
+ console.error(`[LarkBridge] ✅ 已自动记录发送者 open_id: ${senderOpenId}`);
193
+ console.error(`[LarkBridge] 💡 如需固定配置,可将以下内容添加到 MCP env:`);
194
+ console.error(`[LarkBridge] "LARK_RECEIVE_ID": "${senderOpenId}"`);
195
+ console.error(`[LarkBridge] "LARK_RECEIVE_ID_TYPE": "open_id"`);
196
+ }
197
+ let textContent = msg.content;
198
+ try {
199
+ const parsed = JSON.parse(msg.content);
200
+ if (parsed.text) {
201
+ textContent = parsed.text;
202
+ }
203
+ }
204
+ catch {
205
+ // content 不是 JSON,直接使用原始内容
206
+ }
207
+ pushMessage(textContent);
208
+ }
209
+ catch (e) {
210
+ console.error("[LarkBridge] 处理消息异常:", e);
211
+ }
212
+ },
213
+ });
214
+ const wsClient = new Lark.WSClient({
215
+ appId: LARK_APP_ID,
216
+ appSecret: LARK_APP_SECRET,
217
+ loggerLevel: Lark.LoggerLevel.error,
218
+ });
219
+ wsClient.start({ eventDispatcher });
220
+ console.error("[LarkBridge] Lark WebSocket 长连接已启动");
221
+ }
222
+ // ── MCP Server ───────────────────────────────────────────
223
+ async function main() {
224
+ startLarkConnection();
225
+ await initSendTarget();
226
+ const server = new McpServer({
227
+ name: "lark-bridge",
228
+ version: "1.0.0",
229
+ });
230
+ server.tool("send_message", "通过飞书机器人发送消息给用户(立即返回,不等待回复)", { message: z.string().describe("要发送给用户的消息内容") }, async ({ message }) => {
231
+ await sendLarkMessage(message);
232
+ return { content: [{ type: "text", text: "消息已发送" }] };
233
+ });
234
+ server.tool("ask_user", "通过飞书向用户提问并等待回复。传入 prompt 会先发送消息再等待;prompt 为空则仅检查是否有新回复(用于轮询模式)。等待超时后返回 waiting 状态,不会打扰用户。", {
235
+ prompt: z.string().default("").describe("要发送给用户的消息。为空则不发送,仅检查待处理回复"),
236
+ timeout_seconds: z.number().default(0).describe("等待超时秒数,0 表示使用默认值"),
237
+ }, async ({ prompt: promptText, timeout_seconds }) => {
238
+ if (promptText) {
239
+ messageQueue.length = 0;
240
+ waitingResolve = null;
241
+ await sendLarkMessage(promptText);
242
+ }
243
+ const timeout = (timeout_seconds > 0 ? timeout_seconds : WAIT_TIMEOUT_SECONDS) * 1000;
244
+ const reply = await waitForReply(timeout);
245
+ if (reply !== null) {
246
+ return { content: [{ type: "text", text: reply }] };
247
+ }
248
+ return {
249
+ content: [{
250
+ type: "text",
251
+ text: "[waiting] 用户尚未回复。请稍后再调用 ask_user(prompt 留空)检查新回复,不要重复发送消息打扰用户。",
252
+ }],
253
+ };
254
+ });
255
+ const transport = new StdioServerTransport();
256
+ await server.connect(transport);
257
+ console.error("[LarkBridge] MCP Server (stdio) 已就绪");
258
+ }
259
+ main().catch((e) => {
260
+ console.error("[LarkBridge] 启动失败:", e);
261
+ process.exit(1);
262
+ });
263
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "lark-bridge-mcp",
3
+ "version": "1.0.0",
4
+ "description": "飞书/Lark MCP Server - 通过飞书机器人与用户交互的 MCP 工具服务",
5
+ "keywords": [
6
+ "mcp",
7
+ "lark",
8
+ "feishu",
9
+ "飞书",
10
+ "bot",
11
+ "model-context-protocol"
12
+ ],
13
+ "author": "",
14
+ "license": "MIT",
15
+ "type": "module",
16
+ "main": "dist/index.js",
17
+ "bin": {
18
+ "lark-bridge-mcp": "dist/index.js"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "dev": "tsx src/index.ts",
27
+ "prepublishOnly": "npm run build"
28
+ },
29
+ "dependencies": {
30
+ "@larksuiteoapi/node-sdk": "^1.59.0",
31
+ "@modelcontextprotocol/sdk": "^1.27.1",
32
+ "zod": "^3.24.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^22.0.0",
36
+ "tsx": "^4.19.0",
37
+ "typescript": "^5.7.0"
38
+ },
39
+ "engines": {
40
+ "node": ">=18.0.0"
41
+ }
42
+ }