lark-bridge-mcp 1.0.4 → 1.0.7
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/dist/index.js +10 -286
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.js +457 -0
- package/dist/server.js.map +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,291 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const PKG_VERSION = _require("../package.json").version;
|
|
12
|
-
// ── 环境变量 ──────────────────────────────────────────────
|
|
13
|
-
const LARK_APP_ID = process.env.LARK_APP_ID ?? "";
|
|
14
|
-
const LARK_APP_SECRET = process.env.LARK_APP_SECRET ?? "";
|
|
15
|
-
const LARK_ENCRYPT_KEY = process.env.LARK_ENCRYPT_KEY ?? "";
|
|
16
|
-
const LARK_RECEIVE_ID_TYPE = process.env.LARK_RECEIVE_ID_TYPE ?? "";
|
|
17
|
-
const LARK_RECEIVE_ID = process.env.LARK_RECEIVE_ID ?? "";
|
|
18
|
-
const WAIT_TIMEOUT_SECONDS = Number(process.env.LARK_WAIT_TIMEOUT_SECONDS ?? "60");
|
|
19
|
-
const COLLECT_WINDOW_SECONDS = Number(process.env.LARK_COLLECT_WINDOW_SECONDS ?? "3");
|
|
20
|
-
const MESSAGE_PREFIX = process.env.LARK_MESSAGE_PREFIX ?? "📢 Cursor 任务同步:\n";
|
|
21
|
-
// ── Lark Client ──────────────────────────────────────────
|
|
22
|
-
const larkClient = new Lark.Client({
|
|
23
|
-
appId: LARK_APP_ID,
|
|
24
|
-
appSecret: LARK_APP_SECRET,
|
|
25
|
-
appType: Lark.AppType.SelfBuild,
|
|
26
|
-
domain: Lark.Domain.Feishu,
|
|
27
|
-
});
|
|
28
|
-
let resolvedTarget = null;
|
|
29
|
-
let autoOpenId = "";
|
|
30
|
-
async function resolveEmailToOpenId(email) {
|
|
31
|
-
try {
|
|
32
|
-
const res = await larkClient.contact.user.batchGetId({
|
|
33
|
-
params: { user_id_type: "open_id" },
|
|
34
|
-
data: { emails: [email] },
|
|
35
|
-
});
|
|
36
|
-
const users = res.data?.user_list;
|
|
37
|
-
if (users && users.length > 0 && users[0].user_id) {
|
|
38
|
-
console.error(`[LarkBridge] 邮箱 ${email} → open_id: ${users[0].user_id}`);
|
|
39
|
-
return users[0].user_id;
|
|
40
|
-
}
|
|
41
|
-
console.error(`[LarkBridge] 邮箱 ${email} 未找到对应用户`);
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
catch (e) {
|
|
45
|
-
console.error("[LarkBridge] 通过邮箱查找用户失败:", e);
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
async function resolveMobileToOpenId(mobile) {
|
|
50
|
-
try {
|
|
51
|
-
const res = await larkClient.contact.user.batchGetId({
|
|
52
|
-
params: { user_id_type: "open_id" },
|
|
53
|
-
data: { mobiles: [mobile] },
|
|
54
|
-
});
|
|
55
|
-
const users = res.data?.user_list;
|
|
56
|
-
if (users && users.length > 0 && users[0].user_id) {
|
|
57
|
-
console.error(`[LarkBridge] 手机号 ${mobile} → open_id: ${users[0].user_id}`);
|
|
58
|
-
return users[0].user_id;
|
|
59
|
-
}
|
|
60
|
-
console.error(`[LarkBridge] 手机号 ${mobile} 未找到对应用户`);
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
catch (e) {
|
|
64
|
-
console.error("[LarkBridge] 通过手机号查找用户失败:", e);
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
async function initSendTarget() {
|
|
69
|
-
if (!LARK_RECEIVE_ID) {
|
|
70
|
-
console.error("[LarkBridge] 未配置 LARK_RECEIVE_ID,将自动从收到的消息中获取发送目标");
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const idType = LARK_RECEIVE_ID_TYPE || "auto";
|
|
74
|
-
if (idType === "open_id" || idType === "user_id" || idType === "union_id" || idType === "chat_id") {
|
|
75
|
-
resolvedTarget = { receiveIdType: idType, receiveId: LARK_RECEIVE_ID };
|
|
76
|
-
console.error(`[LarkBridge] 发送目标: ${idType}=${LARK_RECEIVE_ID}`);
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
if (idType === "email" || (idType === "auto" && LARK_RECEIVE_ID.includes("@"))) {
|
|
80
|
-
const openId = await resolveEmailToOpenId(LARK_RECEIVE_ID);
|
|
81
|
-
if (openId) {
|
|
82
|
-
resolvedTarget = { receiveIdType: "open_id", receiveId: openId };
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
console.error("[LarkBridge] 邮箱解析失败,将尝试自动从消息中获取目标");
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
if (idType === "mobile" || (idType === "auto" && /^\+?\d{7,}$/.test(LARK_RECEIVE_ID))) {
|
|
89
|
-
const openId = await resolveMobileToOpenId(LARK_RECEIVE_ID);
|
|
90
|
-
if (openId) {
|
|
91
|
-
resolvedTarget = { receiveIdType: "open_id", receiveId: openId };
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
console.error("[LarkBridge] 手机号解析失败,将尝试自动从消息中获取目标");
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
console.error(`[LarkBridge] 无法识别 LARK_RECEIVE_ID_TYPE="${idType}",尝试作为 open_id 使用`);
|
|
98
|
-
resolvedTarget = { receiveIdType: "open_id", receiveId: LARK_RECEIVE_ID };
|
|
99
|
-
}
|
|
100
|
-
function getSendTarget() {
|
|
101
|
-
if (resolvedTarget)
|
|
102
|
-
return resolvedTarget;
|
|
103
|
-
if (autoOpenId)
|
|
104
|
-
return { receiveIdType: "open_id", receiveId: autoOpenId };
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
const _g = globalThis;
|
|
108
|
-
if (!_g.__larkMQ)
|
|
109
|
-
_g.__larkMQ = [];
|
|
110
|
-
if (!_g.__larkDedup)
|
|
111
|
-
_g.__larkDedup = new Set();
|
|
112
|
-
const messageQueue = _g.__larkMQ;
|
|
113
|
-
const processedMessageIds = _g.__larkDedup;
|
|
114
|
-
const MAX_DEDUP_SIZE = 200;
|
|
115
|
-
const POLL_INTERVAL_MS = 300;
|
|
116
|
-
function pushMessage(content, messageId) {
|
|
117
|
-
if (messageId) {
|
|
118
|
-
if (processedMessageIds.has(messageId)) {
|
|
119
|
-
console.error(`[LarkBridge] 跳过重复消息: ${messageId}`);
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
processedMessageIds.add(messageId);
|
|
123
|
-
if (processedMessageIds.size > MAX_DEDUP_SIZE) {
|
|
124
|
-
const first = processedMessageIds.values().next().value;
|
|
125
|
-
if (first !== undefined)
|
|
126
|
-
processedMessageIds.delete(first);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
messageQueue.push(content);
|
|
130
|
-
console.error(`[LarkBridge] 消息入队: "${content.slice(0, 60)}", 队列长度=${messageQueue.length}`);
|
|
131
|
-
}
|
|
132
|
-
function pullMessage(timeoutMs) {
|
|
133
|
-
if (messageQueue.length > 0) {
|
|
134
|
-
return Promise.resolve(messageQueue.shift());
|
|
135
|
-
}
|
|
136
|
-
return new Promise((resolve) => {
|
|
137
|
-
const deadline = Date.now() + timeoutMs;
|
|
138
|
-
const poll = setInterval(() => {
|
|
139
|
-
if (messageQueue.length > 0) {
|
|
140
|
-
clearInterval(poll);
|
|
141
|
-
resolve(messageQueue.shift());
|
|
142
|
-
}
|
|
143
|
-
else if (Date.now() >= deadline) {
|
|
144
|
-
clearInterval(poll);
|
|
145
|
-
resolve(null);
|
|
146
|
-
}
|
|
147
|
-
}, POLL_INTERVAL_MS);
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
// ── 通过机器人 API 发送消息 ──────────────────────────────
|
|
151
|
-
async function sendLarkMessage(text) {
|
|
152
|
-
const target = getSendTarget();
|
|
153
|
-
if (!target) {
|
|
154
|
-
console.error("[LarkBridge] 无发送目标!请先在飞书给机器人发一条消息,或配置 LARK_RECEIVE_ID");
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
try {
|
|
158
|
-
const res = await larkClient.im.message.create({
|
|
159
|
-
params: { receive_id_type: target.receiveIdType },
|
|
160
|
-
data: {
|
|
161
|
-
receive_id: target.receiveId,
|
|
162
|
-
content: JSON.stringify({ text: `${MESSAGE_PREFIX}${text}` }),
|
|
163
|
-
msg_type: "text",
|
|
164
|
-
},
|
|
165
|
-
});
|
|
166
|
-
if (res.code === 0) {
|
|
167
|
-
console.error(`[LarkBridge] 消息已发送`);
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
console.error(`[LarkBridge] 发送失败: code=${res.code}, msg=${res.msg}`);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
catch (e) {
|
|
174
|
-
console.error(`[LarkBridge] 发送飞书消息异常: ${e?.message ?? e}`);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
// ── 等待/检查用户回复 ────────────────────────────────────
|
|
178
|
-
async function waitForReply(timeoutMs) {
|
|
179
|
-
const collectMs = COLLECT_WINDOW_SECONDS * 1000;
|
|
180
|
-
const first = await pullMessage(timeoutMs);
|
|
181
|
-
if (first === null)
|
|
182
|
-
return null;
|
|
183
|
-
console.error(`[LarkBridge] 收到回复: ${first}`);
|
|
184
|
-
const messages = [first];
|
|
185
|
-
let next;
|
|
186
|
-
while ((next = await pullMessage(collectMs)) !== null) {
|
|
187
|
-
console.error(`[LarkBridge] 收到后续: ${next}`);
|
|
188
|
-
messages.push(next);
|
|
189
|
-
}
|
|
190
|
-
return messages.join("\n");
|
|
191
|
-
}
|
|
192
|
-
// ── 飞书 WebSocket 长连接 ────────────────────────────────
|
|
193
|
-
function startLarkConnection() {
|
|
194
|
-
if (!LARK_APP_ID || !LARK_APP_SECRET) {
|
|
195
|
-
console.error("[LarkBridge] LARK_APP_ID 或 LARK_APP_SECRET 未配置,跳过启动");
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
const eventDispatcher = new Lark.EventDispatcher(LARK_ENCRYPT_KEY ? { encryptKey: LARK_ENCRYPT_KEY } : {}).register({
|
|
199
|
-
"im.message.receive_v1": (data) => {
|
|
200
|
-
const msg = data.message;
|
|
201
|
-
const sender = data.sender;
|
|
202
|
-
const messageId = msg?.message_id;
|
|
203
|
-
const content = msg?.content;
|
|
204
|
-
const chatId = msg?.chat_id;
|
|
205
|
-
const chatType = msg?.chat_type;
|
|
206
|
-
console.error(`[LarkBridge] 收到消息: id=${messageId}, chat=${chatId}(${chatType}), content=${content}`);
|
|
207
|
-
const senderOpenId = sender?.sender_id?.open_id;
|
|
208
|
-
if (senderOpenId && !resolvedTarget) {
|
|
209
|
-
autoOpenId = senderOpenId;
|
|
210
|
-
console.error(`[LarkBridge] 自动记录 open_id: ${senderOpenId}`);
|
|
211
|
-
}
|
|
212
|
-
setTimeout(() => {
|
|
213
|
-
try {
|
|
214
|
-
let textContent = content;
|
|
215
|
-
try {
|
|
216
|
-
const parsed = JSON.parse(content);
|
|
217
|
-
if (parsed.text) {
|
|
218
|
-
textContent = parsed.text;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
catch { /* not JSON */ }
|
|
222
|
-
pushMessage(textContent, messageId);
|
|
223
|
-
}
|
|
224
|
-
catch (e) {
|
|
225
|
-
console.error("[LarkBridge] pushMessage 异常:", e);
|
|
226
|
-
}
|
|
227
|
-
}, 0);
|
|
228
|
-
},
|
|
229
|
-
});
|
|
230
|
-
const wsClient = new Lark.WSClient({
|
|
231
|
-
appId: LARK_APP_ID,
|
|
232
|
-
appSecret: LARK_APP_SECRET,
|
|
233
|
-
loggerLevel: Lark.LoggerLevel.error,
|
|
234
|
-
});
|
|
235
|
-
wsClient.start({ eventDispatcher });
|
|
236
|
-
console.error("[LarkBridge] Lark WebSocket 长连接已启动");
|
|
237
|
-
}
|
|
238
|
-
// ── MCP Server ───────────────────────────────────────────
|
|
239
|
-
async function main() {
|
|
240
|
-
startLarkConnection();
|
|
241
|
-
await initSendTarget();
|
|
242
|
-
console.error(`[LarkBridge] lark-bridge-mcp v${PKG_VERSION} 启动中...`);
|
|
243
|
-
const server = new McpServer({
|
|
244
|
-
name: "lark-bridge",
|
|
245
|
-
version: PKG_VERSION,
|
|
246
|
-
});
|
|
247
|
-
server.tool("send_message", "通过飞书机器人发送消息给用户(立即返回,不等待回复)", { message: z.string().describe("要发送给用户的消息内容") }, async ({ message }) => {
|
|
248
|
-
await sendLarkMessage(message);
|
|
249
|
-
return { content: [{ type: "text", text: "消息已发送" }] };
|
|
250
|
-
});
|
|
251
|
-
server.tool("ask_user", "通过飞书向用户提问并等待回复。传入 prompt 会先发送消息再等待;prompt 为空则仅检查是否有新回复(用于轮询模式)。等待超时后返回 waiting 状态,不会打扰用户。", {
|
|
252
|
-
prompt: z.string().default("").describe("要发送给用户的消息。为空则不发送,仅检查待处理回复"),
|
|
253
|
-
timeout_seconds: z.number().default(0).describe("等待超时秒数,0 表示使用默认值"),
|
|
254
|
-
}, async ({ prompt: promptText, timeout_seconds }) => {
|
|
255
|
-
console.error(`[LarkBridge] ask_user 调用: prompt=${promptText ? `"${promptText.slice(0, 50)}..."` : "(空)"}, queue=${messageQueue.length}`);
|
|
256
|
-
if (messageQueue.length > 0) {
|
|
257
|
-
const pending = await waitForReply(COLLECT_WINDOW_SECONDS * 1000);
|
|
258
|
-
if (pending !== null) {
|
|
259
|
-
console.error(`[LarkBridge] ask_user 返回队列中的待处理消息(${pending.length}字)`);
|
|
260
|
-
if (promptText) {
|
|
261
|
-
await sendLarkMessage(promptText);
|
|
262
|
-
}
|
|
263
|
-
return { content: [{ type: "text", text: pending }] };
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
if (promptText) {
|
|
267
|
-
await sendLarkMessage(promptText);
|
|
268
|
-
}
|
|
269
|
-
const timeout = (timeout_seconds > 0 ? timeout_seconds : WAIT_TIMEOUT_SECONDS) * 1000;
|
|
270
|
-
const reply = await waitForReply(timeout);
|
|
271
|
-
if (reply !== null) {
|
|
272
|
-
console.error(`[LarkBridge] ask_user 返回用户回复(${reply.length}字)`);
|
|
273
|
-
return { content: [{ type: "text", text: reply }] };
|
|
274
|
-
}
|
|
275
|
-
console.error("[LarkBridge] ask_user 返回 [waiting]");
|
|
276
|
-
return {
|
|
277
|
-
content: [{
|
|
278
|
-
type: "text",
|
|
279
|
-
text: "[waiting] 用户尚未回复。请稍后再调用 ask_user(prompt 留空)检查新回复,不要重复发送消息打扰用户。",
|
|
280
|
-
}],
|
|
281
|
-
};
|
|
282
|
-
});
|
|
283
|
-
const transport = new StdioServerTransport();
|
|
284
|
-
await server.connect(transport);
|
|
285
|
-
console.error(`[LarkBridge] MCP Server v${PKG_VERSION} (stdio) 已就绪`);
|
|
286
|
-
}
|
|
287
|
-
main().catch((e) => {
|
|
2
|
+
// MCP stdio 模式下 stdout 只能传 JSON-RPC 数据。
|
|
3
|
+
// 必须在任何 SDK 模块加载之前拦截所有 console 输出方法,
|
|
4
|
+
// 因此使用 dynamic import 加载主逻辑,避免 ESM 静态 import 提升。
|
|
5
|
+
const _noop = () => { };
|
|
6
|
+
console.log = _noop;
|
|
7
|
+
console.info = _noop;
|
|
8
|
+
console.warn = _noop;
|
|
9
|
+
console.debug = _noop;
|
|
10
|
+
import("./server.js").catch((e) => {
|
|
288
11
|
console.error("[LarkBridge] 启动失败:", e);
|
|
289
12
|
process.exit(1);
|
|
290
13
|
});
|
|
14
|
+
export {};
|
|
291
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,wCAAwC;AACxC,qCAAqC;AACrC,iDAAiD;AACjD,MAAM,KAAK,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;AAC7B,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC;AACpB,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC;AACrB,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC;AACrB,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;AAEtB,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IAChC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function main(): Promise<void>;
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import * as Lark from "@larksuiteoapi/node-sdk";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { createRequire } from "module";
|
|
6
|
+
import * as fs from "fs";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import * as os from "os";
|
|
9
|
+
const _require = createRequire(import.meta.url);
|
|
10
|
+
const PKG_VERSION = _require("../package.json").version;
|
|
11
|
+
function log(level, ...args) {
|
|
12
|
+
const msg = args.map(a => typeof a === "string" ? a : JSON.stringify(a)).join(" ");
|
|
13
|
+
process.stderr.write(`[LarkBridge][${level}] ${msg}\n`);
|
|
14
|
+
}
|
|
15
|
+
// ── 环境变量 ──────────────────────────────────────────────
|
|
16
|
+
const LARK_APP_ID = process.env.LARK_APP_ID ?? "";
|
|
17
|
+
const LARK_APP_SECRET = process.env.LARK_APP_SECRET ?? "";
|
|
18
|
+
const LARK_ENCRYPT_KEY = process.env.LARK_ENCRYPT_KEY ?? "";
|
|
19
|
+
const LARK_RECEIVE_ID_TYPE = process.env.LARK_RECEIVE_ID_TYPE ?? "";
|
|
20
|
+
const LARK_RECEIVE_ID = process.env.LARK_RECEIVE_ID ?? "";
|
|
21
|
+
const WAIT_TIMEOUT_SECONDS = Number(process.env.LARK_WAIT_TIMEOUT_SECONDS ?? "60");
|
|
22
|
+
const COLLECT_WINDOW_SECONDS = Number(process.env.LARK_COLLECT_WINDOW_SECONDS ?? "3");
|
|
23
|
+
const MESSAGE_PREFIX = process.env.LARK_MESSAGE_PREFIX ?? "";
|
|
24
|
+
// ── Lark Client ──────────────────────────────────────────
|
|
25
|
+
const larkClient = new Lark.Client({
|
|
26
|
+
appId: LARK_APP_ID,
|
|
27
|
+
appSecret: LARK_APP_SECRET,
|
|
28
|
+
appType: Lark.AppType.SelfBuild,
|
|
29
|
+
domain: Lark.Domain.Feishu,
|
|
30
|
+
loggerLevel: Lark.LoggerLevel.error,
|
|
31
|
+
});
|
|
32
|
+
let resolvedTarget = null;
|
|
33
|
+
let autoOpenId = "";
|
|
34
|
+
async function resolveEmailToOpenId(email) {
|
|
35
|
+
try {
|
|
36
|
+
const res = await larkClient.contact.user.batchGetId({
|
|
37
|
+
params: { user_id_type: "open_id" },
|
|
38
|
+
data: { emails: [email] },
|
|
39
|
+
});
|
|
40
|
+
const users = res.data?.user_list;
|
|
41
|
+
if (users && users.length > 0 && users[0].user_id) {
|
|
42
|
+
log("INFO", `邮箱 ${email} → open_id: ${users[0].user_id}`);
|
|
43
|
+
return users[0].user_id;
|
|
44
|
+
}
|
|
45
|
+
log("WARN", `邮箱 ${email} 未找到对应用户`);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
log("ERROR", "通过邮箱查找用户失败:", e);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function resolveMobileToOpenId(mobile) {
|
|
54
|
+
try {
|
|
55
|
+
const res = await larkClient.contact.user.batchGetId({
|
|
56
|
+
params: { user_id_type: "open_id" },
|
|
57
|
+
data: { mobiles: [mobile] },
|
|
58
|
+
});
|
|
59
|
+
const users = res.data?.user_list;
|
|
60
|
+
if (users && users.length > 0 && users[0].user_id) {
|
|
61
|
+
log("INFO", `手机号 ${mobile} → open_id: ${users[0].user_id}`);
|
|
62
|
+
return users[0].user_id;
|
|
63
|
+
}
|
|
64
|
+
log("WARN", `手机号 ${mobile} 未找到对应用户`);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
log("ERROR", "通过手机号查找用户失败:", e);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function initSendTarget() {
|
|
73
|
+
if (!LARK_RECEIVE_ID) {
|
|
74
|
+
log("INFO", "未配置 LARK_RECEIVE_ID,将自动从收到的消息中获取发送目标");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const idType = LARK_RECEIVE_ID_TYPE || "auto";
|
|
78
|
+
if (idType === "open_id" || idType === "user_id" || idType === "union_id" || idType === "chat_id") {
|
|
79
|
+
resolvedTarget = { receiveIdType: idType, receiveId: LARK_RECEIVE_ID };
|
|
80
|
+
log("INFO", `发送目标: ${idType}=${LARK_RECEIVE_ID}`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (idType === "email" || (idType === "auto" && LARK_RECEIVE_ID.includes("@"))) {
|
|
84
|
+
const openId = await resolveEmailToOpenId(LARK_RECEIVE_ID);
|
|
85
|
+
if (openId) {
|
|
86
|
+
resolvedTarget = { receiveIdType: "open_id", receiveId: openId };
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
log("WARN", "邮箱解析失败,将尝试自动从消息中获取目标");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (idType === "mobile" || (idType === "auto" && /^\+?\d{7,}$/.test(LARK_RECEIVE_ID))) {
|
|
93
|
+
const openId = await resolveMobileToOpenId(LARK_RECEIVE_ID);
|
|
94
|
+
if (openId) {
|
|
95
|
+
resolvedTarget = { receiveIdType: "open_id", receiveId: openId };
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
log("WARN", "手机号解析失败,将尝试自动从消息中获取目标");
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
log("WARN", `无法识别 LARK_RECEIVE_ID_TYPE="${idType}",尝试作为 open_id 使用`);
|
|
102
|
+
resolvedTarget = { receiveIdType: "open_id", receiveId: LARK_RECEIVE_ID };
|
|
103
|
+
}
|
|
104
|
+
function getSendTarget() {
|
|
105
|
+
if (resolvedTarget)
|
|
106
|
+
return resolvedTarget;
|
|
107
|
+
if (autoOpenId)
|
|
108
|
+
return { receiveIdType: "open_id", receiveId: autoOpenId };
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const _g = globalThis;
|
|
112
|
+
if (!_g.__larkMQ)
|
|
113
|
+
_g.__larkMQ = [];
|
|
114
|
+
if (!_g.__larkDedup)
|
|
115
|
+
_g.__larkDedup = new Set();
|
|
116
|
+
const messageQueue = _g.__larkMQ;
|
|
117
|
+
const processedMessageIds = _g.__larkDedup;
|
|
118
|
+
const MAX_DEDUP_SIZE = 200;
|
|
119
|
+
const POLL_INTERVAL_MS = 300;
|
|
120
|
+
function pushMessage(content, messageId) {
|
|
121
|
+
if (messageId) {
|
|
122
|
+
if (processedMessageIds.has(messageId)) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
processedMessageIds.add(messageId);
|
|
126
|
+
if (processedMessageIds.size > MAX_DEDUP_SIZE) {
|
|
127
|
+
const first = processedMessageIds.values().next().value;
|
|
128
|
+
if (first !== undefined)
|
|
129
|
+
processedMessageIds.delete(first);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
messageQueue.push(content);
|
|
133
|
+
log("INFO", `消息入队: "${content.slice(0, 60)}", 队列长度=${messageQueue.length}`);
|
|
134
|
+
}
|
|
135
|
+
function pullMessage(timeoutMs) {
|
|
136
|
+
if (messageQueue.length > 0) {
|
|
137
|
+
return Promise.resolve(messageQueue.shift());
|
|
138
|
+
}
|
|
139
|
+
return new Promise((resolve) => {
|
|
140
|
+
const deadline = Date.now() + timeoutMs;
|
|
141
|
+
const poll = setInterval(() => {
|
|
142
|
+
if (messageQueue.length > 0) {
|
|
143
|
+
clearInterval(poll);
|
|
144
|
+
resolve(messageQueue.shift());
|
|
145
|
+
}
|
|
146
|
+
else if (Date.now() >= deadline) {
|
|
147
|
+
clearInterval(poll);
|
|
148
|
+
resolve(null);
|
|
149
|
+
}
|
|
150
|
+
}, POLL_INTERVAL_MS);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// ── 通过机器人 API 发送消息 ──────────────────────────────
|
|
154
|
+
async function sendLarkMessage(text) {
|
|
155
|
+
const target = getSendTarget();
|
|
156
|
+
if (!target) {
|
|
157
|
+
log("WARN", "无发送目标!请先在飞书给机器人发一条消息,或配置 LARK_RECEIVE_ID");
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
const res = await larkClient.im.message.create({
|
|
162
|
+
params: { receive_id_type: target.receiveIdType },
|
|
163
|
+
data: {
|
|
164
|
+
receive_id: target.receiveId,
|
|
165
|
+
content: JSON.stringify({ text: `${MESSAGE_PREFIX}${text}` }),
|
|
166
|
+
msg_type: "text",
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
if (res.code === 0) {
|
|
170
|
+
log("INFO", "消息已发送");
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
log("ERROR", `发送失败: code=${res.code}, msg=${res.msg}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
log("ERROR", `发送飞书消息异常: ${e?.message ?? e}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function sendLarkImage(imagePath) {
|
|
181
|
+
const target = getSendTarget();
|
|
182
|
+
if (!target) {
|
|
183
|
+
log("WARN", "无发送目标!请先在飞书给机器人发一条消息,或配置 LARK_RECEIVE_ID");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const absPath = path.resolve(imagePath);
|
|
187
|
+
if (!fs.existsSync(absPath)) {
|
|
188
|
+
log("ERROR", `图片文件不存在: ${absPath}`);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
const uploadRes = await larkClient.im.image.create({
|
|
193
|
+
data: {
|
|
194
|
+
image_type: "message",
|
|
195
|
+
image: fs.createReadStream(absPath),
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
const imageKey = uploadRes?.data?.image_key ?? uploadRes?.image_key;
|
|
199
|
+
if (!imageKey) {
|
|
200
|
+
log("ERROR", `图片上传失败: ${JSON.stringify(uploadRes)}`);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
log("INFO", `图片已上传: ${imageKey}`);
|
|
204
|
+
const sendRes = await larkClient.im.message.create({
|
|
205
|
+
params: { receive_id_type: target.receiveIdType },
|
|
206
|
+
data: {
|
|
207
|
+
receive_id: target.receiveId,
|
|
208
|
+
content: JSON.stringify({ image_key: imageKey }),
|
|
209
|
+
msg_type: "image",
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
if (sendRes.code === 0) {
|
|
213
|
+
log("INFO", "图片消息已发送");
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
log("ERROR", `图片消息发送失败: code=${sendRes.code}, msg=${sendRes.msg}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
log("ERROR", `发送飞书图片异常: ${e?.message ?? e}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ── 下载飞书图片 ──────────────────────────────────────────
|
|
224
|
+
const IMAGE_DOWNLOAD_DIR = path.join(os.tmpdir(), "lark-bridge-images");
|
|
225
|
+
function ensureImageDir() {
|
|
226
|
+
if (!fs.existsSync(IMAGE_DOWNLOAD_DIR)) {
|
|
227
|
+
fs.mkdirSync(IMAGE_DOWNLOAD_DIR, { recursive: true });
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async function downloadLarkImage(messageId, imageKey) {
|
|
231
|
+
try {
|
|
232
|
+
ensureImageDir();
|
|
233
|
+
const resp = await larkClient.im.messageResource.get({
|
|
234
|
+
path: { message_id: messageId, file_key: imageKey },
|
|
235
|
+
params: { type: "image" },
|
|
236
|
+
});
|
|
237
|
+
if (!resp || !resp.writeFile) {
|
|
238
|
+
const data = resp;
|
|
239
|
+
if (data && typeof data.pipe === "function") {
|
|
240
|
+
const filePath = path.join(IMAGE_DOWNLOAD_DIR, `${imageKey}.png`);
|
|
241
|
+
const ws = fs.createWriteStream(filePath);
|
|
242
|
+
await new Promise((resolve, reject) => {
|
|
243
|
+
data.pipe(ws);
|
|
244
|
+
ws.on("finish", resolve);
|
|
245
|
+
ws.on("error", reject);
|
|
246
|
+
});
|
|
247
|
+
log("INFO", `图片已下载: ${filePath}`);
|
|
248
|
+
return filePath;
|
|
249
|
+
}
|
|
250
|
+
if (data?.writeFile) {
|
|
251
|
+
const filePath = path.join(IMAGE_DOWNLOAD_DIR, `${imageKey}.png`);
|
|
252
|
+
await data.writeFile(filePath);
|
|
253
|
+
log("INFO", `图片已下载(writeFile): ${filePath}`);
|
|
254
|
+
return filePath;
|
|
255
|
+
}
|
|
256
|
+
log("WARN", `图片下载返回未知格式: ${typeof data}`);
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
const filePath = path.join(IMAGE_DOWNLOAD_DIR, `${imageKey}.png`);
|
|
260
|
+
await resp.writeFile(filePath);
|
|
261
|
+
log("INFO", `图片已下载(writeFile): ${filePath}`);
|
|
262
|
+
return filePath;
|
|
263
|
+
}
|
|
264
|
+
catch (e) {
|
|
265
|
+
log("ERROR", `下载飞书图片异常: ${e?.message ?? e}`);
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function parseMessageContent(messageId, messageType, content) {
|
|
270
|
+
const result = { text: "", imageKeys: [] };
|
|
271
|
+
try {
|
|
272
|
+
const parsed = JSON.parse(content);
|
|
273
|
+
switch (messageType) {
|
|
274
|
+
case "text":
|
|
275
|
+
result.text = parsed.text ?? content;
|
|
276
|
+
break;
|
|
277
|
+
case "image":
|
|
278
|
+
if (parsed.image_key) {
|
|
279
|
+
result.imageKeys.push({ messageId, imageKey: parsed.image_key });
|
|
280
|
+
result.text = "[图片]";
|
|
281
|
+
}
|
|
282
|
+
break;
|
|
283
|
+
case "post": {
|
|
284
|
+
const parts = [];
|
|
285
|
+
if (parsed.title)
|
|
286
|
+
parts.push(parsed.title);
|
|
287
|
+
const contentBlocks = parsed.content ?? [];
|
|
288
|
+
for (const line of contentBlocks) {
|
|
289
|
+
for (const element of line) {
|
|
290
|
+
if (element.tag === "text" && element.text) {
|
|
291
|
+
parts.push(element.text);
|
|
292
|
+
}
|
|
293
|
+
else if (element.tag === "img" && element.image_key) {
|
|
294
|
+
result.imageKeys.push({ messageId, imageKey: element.image_key });
|
|
295
|
+
parts.push("[图片]");
|
|
296
|
+
}
|
|
297
|
+
else if (element.tag === "a" && element.text) {
|
|
298
|
+
parts.push(element.text);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
result.text = parts.join("");
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
default:
|
|
306
|
+
result.text = parsed.text ?? content;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
result.text = content;
|
|
311
|
+
}
|
|
312
|
+
return result;
|
|
313
|
+
}
|
|
314
|
+
async function processIncomingMessage(messageId, messageType, content) {
|
|
315
|
+
const parsed = parseMessageContent(messageId, messageType, content);
|
|
316
|
+
const parts = [];
|
|
317
|
+
if (parsed.text) {
|
|
318
|
+
parts.push(parsed.text);
|
|
319
|
+
}
|
|
320
|
+
for (const img of parsed.imageKeys) {
|
|
321
|
+
const localPath = await downloadLarkImage(img.messageId, img.imageKey);
|
|
322
|
+
if (localPath) {
|
|
323
|
+
parts.push(`[图片已保存: ${localPath}]`);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
parts.push(`[图片下载失败: ${img.imageKey}]`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return parts.join("\n");
|
|
330
|
+
}
|
|
331
|
+
// ── 等待/检查用户回复 ────────────────────────────────────
|
|
332
|
+
async function waitForReply(timeoutMs) {
|
|
333
|
+
const collectMs = COLLECT_WINDOW_SECONDS * 1000;
|
|
334
|
+
const first = await pullMessage(timeoutMs);
|
|
335
|
+
if (first === null)
|
|
336
|
+
return null;
|
|
337
|
+
log("INFO", `收到回复: ${first}`);
|
|
338
|
+
const messages = [first];
|
|
339
|
+
let next;
|
|
340
|
+
while ((next = await pullMessage(collectMs)) !== null) {
|
|
341
|
+
log("INFO", `收到后续: ${next}`);
|
|
342
|
+
messages.push(next);
|
|
343
|
+
}
|
|
344
|
+
return messages.join("\n");
|
|
345
|
+
}
|
|
346
|
+
// ── 飞书 WebSocket 长连接 ────────────────────────────────
|
|
347
|
+
let _wsStarted = false;
|
|
348
|
+
function startLarkConnection() {
|
|
349
|
+
if (_wsStarted) {
|
|
350
|
+
log("WARN", "WebSocket 已启动,跳过重复连接");
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
_wsStarted = true;
|
|
354
|
+
if (!LARK_APP_ID || !LARK_APP_SECRET) {
|
|
355
|
+
log("ERROR", "LARK_APP_ID 或 LARK_APP_SECRET 未配置,跳过启动");
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
const eventDispatcher = new Lark.EventDispatcher(LARK_ENCRYPT_KEY ? { encryptKey: LARK_ENCRYPT_KEY } : {}).register({
|
|
359
|
+
"im.message.receive_v1": (data) => {
|
|
360
|
+
const msg = data.message;
|
|
361
|
+
const sender = data.sender;
|
|
362
|
+
const messageId = msg?.message_id;
|
|
363
|
+
const content = msg?.content;
|
|
364
|
+
const messageType = msg?.message_type ?? "text";
|
|
365
|
+
log("INFO", `收到消息: id=${messageId}, type=${messageType}, content=${content}`);
|
|
366
|
+
const senderOpenId = sender?.sender_id?.open_id;
|
|
367
|
+
if (senderOpenId && !resolvedTarget) {
|
|
368
|
+
autoOpenId = senderOpenId;
|
|
369
|
+
log("INFO", `自动记录 open_id: ${senderOpenId}`);
|
|
370
|
+
}
|
|
371
|
+
setTimeout(async () => {
|
|
372
|
+
try {
|
|
373
|
+
const processed = await processIncomingMessage(messageId, messageType, content);
|
|
374
|
+
pushMessage(processed, messageId);
|
|
375
|
+
}
|
|
376
|
+
catch (e) {
|
|
377
|
+
log("ERROR", "processIncomingMessage 异常:", e);
|
|
378
|
+
pushMessage(content, messageId);
|
|
379
|
+
}
|
|
380
|
+
}, 0);
|
|
381
|
+
},
|
|
382
|
+
});
|
|
383
|
+
const wsClient = new Lark.WSClient({
|
|
384
|
+
appId: LARK_APP_ID,
|
|
385
|
+
appSecret: LARK_APP_SECRET,
|
|
386
|
+
loggerLevel: Lark.LoggerLevel.error,
|
|
387
|
+
});
|
|
388
|
+
wsClient.start({ eventDispatcher });
|
|
389
|
+
log("INFO", "Lark WebSocket 长连接已启动");
|
|
390
|
+
}
|
|
391
|
+
// ── MCP Server ───────────────────────────────────────────
|
|
392
|
+
export async function main() {
|
|
393
|
+
if (_g.__larkBridgeStarted) {
|
|
394
|
+
log("WARN", "检测到模块重复加载,跳过初始化");
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
_g.__larkBridgeStarted = true;
|
|
398
|
+
process.stdin.on("close", () => {
|
|
399
|
+
log("INFO", "MCP stdin 通道关闭,退出进程防止产生僵尸...");
|
|
400
|
+
process.exit(0);
|
|
401
|
+
});
|
|
402
|
+
startLarkConnection();
|
|
403
|
+
await initSendTarget();
|
|
404
|
+
const server = new McpServer({
|
|
405
|
+
name: "lark-bridge",
|
|
406
|
+
version: PKG_VERSION,
|
|
407
|
+
});
|
|
408
|
+
log("INFO", `lark-bridge-mcp v${PKG_VERSION} 启动中...`);
|
|
409
|
+
server.tool("send_message", "通过飞书机器人发送消息给用户(立即返回,不等待回复)", { message: z.string().describe("要发送给用户的消息内容") }, async ({ message }) => {
|
|
410
|
+
await sendLarkMessage(message);
|
|
411
|
+
return { content: [{ type: "text", text: "消息已发送" }] };
|
|
412
|
+
});
|
|
413
|
+
server.tool("send_image", "通过飞书机器人发送本地图片给用户", { image_path: z.string().describe("要发送的本地图片文件路径(支持 jpg/png/gif/webp 等格式)") }, async ({ image_path }) => {
|
|
414
|
+
await sendLarkImage(image_path);
|
|
415
|
+
return { content: [{ type: "text", text: "图片已发送" }] };
|
|
416
|
+
});
|
|
417
|
+
server.tool("ask_user", "通过飞书向用户提问并等待回复。传入 prompt 会先发送消息再等待;prompt 为空则仅检查是否有新回复(用于轮询模式)。等待超时后返回 waiting 状态,不会打扰用户。", {
|
|
418
|
+
prompt: z.string().default("").describe("要发送给用户的消息。为空则不发送,仅检查待处理回复"),
|
|
419
|
+
timeout_seconds: z.number().default(0).describe("等待超时秒数,0 表示使用默认值"),
|
|
420
|
+
}, async ({ prompt: promptText, timeout_seconds }) => {
|
|
421
|
+
log("INFO", `ask_user: prompt=${promptText ? `"${promptText.slice(0, 50)}..."` : "(空)"}, queue=${messageQueue.length}`);
|
|
422
|
+
if (messageQueue.length > 0) {
|
|
423
|
+
const pending = await waitForReply(COLLECT_WINDOW_SECONDS * 1000);
|
|
424
|
+
if (pending !== null) {
|
|
425
|
+
log("INFO", `ask_user 返回待处理消息(${pending.length}字)`);
|
|
426
|
+
if (promptText) {
|
|
427
|
+
await sendLarkMessage(promptText);
|
|
428
|
+
}
|
|
429
|
+
return { content: [{ type: "text", text: pending }] };
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (promptText) {
|
|
433
|
+
await sendLarkMessage(promptText);
|
|
434
|
+
}
|
|
435
|
+
const timeout = (timeout_seconds > 0 ? timeout_seconds : WAIT_TIMEOUT_SECONDS) * 1000;
|
|
436
|
+
const reply = await waitForReply(timeout);
|
|
437
|
+
if (reply !== null) {
|
|
438
|
+
log("INFO", `ask_user 返回回复(${reply.length}字)`);
|
|
439
|
+
return { content: [{ type: "text", text: reply }] };
|
|
440
|
+
}
|
|
441
|
+
log("INFO", "ask_user 超时 → [waiting]");
|
|
442
|
+
return {
|
|
443
|
+
content: [{
|
|
444
|
+
type: "text",
|
|
445
|
+
text: "[waiting] 用户尚未回复。请稍后再调用 ask_user(prompt 留空)检查新回复,不要重复发送消息打扰用户。",
|
|
446
|
+
}],
|
|
447
|
+
};
|
|
448
|
+
});
|
|
449
|
+
const transport = new StdioServerTransport();
|
|
450
|
+
await server.connect(transport);
|
|
451
|
+
log("INFO", `MCP Server v${PKG_VERSION} (stdio) 已就绪`);
|
|
452
|
+
}
|
|
453
|
+
main().catch((e) => {
|
|
454
|
+
log("ERROR", "启动失败:", e);
|
|
455
|
+
process.exit(1);
|
|
456
|
+
});
|
|
457
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|