im-connector 1.0.1 → 1.2.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 +43 -4
- package/dist/cli/runner.d.ts +13 -0
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +77 -10
- package/dist/cli/runner.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/login/session.d.ts +49 -0
- package/dist/login/session.d.ts.map +1 -0
- package/dist/login/session.js +181 -0
- package/dist/login/session.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -2
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +204 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/providers/dingtalk.d.ts.map +1 -1
- package/dist/providers/dingtalk.js +4 -0
- package/dist/providers/dingtalk.js.map +1 -1
- package/dist/providers/types.d.ts +8 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/wecom.d.ts.map +1 -1
- package/dist/providers/wecom.js +6 -1
- package/dist/providers/wecom.js.map +1 -1
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
## 前置条件
|
|
8
8
|
|
|
9
9
|
- Node.js >= 18
|
|
10
|
-
-
|
|
11
|
-
-
|
|
10
|
+
- 两个命令行工具(dws / wecom-cli)**已随包一起安装**(可选依赖),无需单独安装
|
|
11
|
+
- **登录一次即可**(凭据保存在 CLI 自己的本地登录态,本包不接触凭据)——见下方「登录」
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
> 使用 pnpm 安装时,若提示 CLI 不可用,允许依赖的安装脚本(`pnpm approve-builds`)或手动 `npm i -g dingtalk-workspace-cli @wecom/cli` 即可。
|
|
14
14
|
|
|
15
15
|
## 安装
|
|
16
16
|
|
|
@@ -19,6 +19,26 @@ npx -y im-connector # 直接用,无需安装
|
|
|
19
19
|
npm i -g im-connector # 或全局安装
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
+
> 注意:首次安装会下载两个 CLI(dws 约 130MB),之后无需再装。
|
|
23
|
+
|
|
24
|
+
## 登录(扫码即可,不用终端)
|
|
25
|
+
|
|
26
|
+
配置好 MCP 客户端后,让 Agent 调用 `login` 工具:
|
|
27
|
+
|
|
28
|
+
| 平台 | 调用 | 交互 |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| 企业微信 | `login {provider:"wecom"}` | 返回**二维码图片**,用企业微信扫码 |
|
|
31
|
+
| 钉钉 | `login {provider:"dingtalk"}` | 自动拉起**浏览器授权**(无头/远程环境用 `mode:"device"` 走设备码) |
|
|
32
|
+
|
|
33
|
+
授权完成后调用 `login_status {provider}`,看到 `authorized: true` 即可开始使用。
|
|
34
|
+
|
|
35
|
+
也可以在终端里手动登录:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
dws auth login --recommend # 钉钉(浏览器授权)
|
|
39
|
+
wecom-cli auth init --noninteractive # 企业微信(终端二维码)
|
|
40
|
+
```
|
|
41
|
+
|
|
22
42
|
## 配置 MCP 客户端
|
|
23
43
|
|
|
24
44
|
通用 MCP 客户端(如 Claude Desktop):
|
|
@@ -65,11 +85,30 @@ Agent 调用 `mcp__im__run`,参数是 `{ provider, args }`,`args` 就是对
|
|
|
65
85
|
|
|
66
86
|
完整命令见各 CLI 的 `--help`(如 `dws chat --help`、`wecom-cli message --help`)。
|
|
67
87
|
|
|
88
|
+
## 自检
|
|
89
|
+
|
|
90
|
+
调用 `info` 工具(无参数)返回每个平台的 CLI 版本、登录状态与实际可执行入口:
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"providers": [
|
|
95
|
+
{
|
|
96
|
+
"id": "dingtalk",
|
|
97
|
+
"displayName": "钉钉",
|
|
98
|
+
"version": "dws version v1.0.65 (...)",
|
|
99
|
+
"resolved": "<npm>/dingtalk-workspace-cli/bin/dws.js",
|
|
100
|
+
"auth": { "authenticated": true, "corp_name": "...", ... }
|
|
101
|
+
},
|
|
102
|
+
{ "id": "wecom", "version": "wecom-cli 1.3.4", "auth": "authorized" }
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
68
107
|
## 说明
|
|
69
108
|
|
|
70
109
|
- **写操作**(发消息、提交审批等)请先让 Agent 确认意图;不确定时用 `--dry-run` 预览(两平台都支持)
|
|
71
110
|
- 参数会原样透传给 CLI,返回其 JSON 输出
|
|
72
|
-
- 支持的 provider:`dingtalk
|
|
111
|
+
- 支持的 provider:`dingtalk`(dws,24 个服务域 + `api`/`aicard`/`audit` 等)、`wecom`(wecom-cli,`--schema`/`--page-count`/`--dry-run`)
|
|
73
112
|
|
|
74
113
|
## 开发
|
|
75
114
|
|
package/dist/cli/runner.d.ts
CHANGED
|
@@ -16,6 +16,11 @@ export interface CliExecution {
|
|
|
16
16
|
/** stdout 解析后的 JSON(无法解析时为原始文本)。 */
|
|
17
17
|
data: unknown;
|
|
18
18
|
}
|
|
19
|
+
export interface LaunchSpec {
|
|
20
|
+
command: string;
|
|
21
|
+
prefix: string[];
|
|
22
|
+
shell: boolean;
|
|
23
|
+
}
|
|
19
24
|
/**
|
|
20
25
|
* 通用 CLI 透传执行器:按 provider 规格定位 CLI(npm 全局 bin 脚本 → node 直跑,
|
|
21
26
|
* 规避 Windows shim),追加 provider 的 formatArgs,收集 stdout/stderr,解析 JSON,
|
|
@@ -27,7 +32,15 @@ export declare class CliRunner {
|
|
|
27
32
|
get providerId(): string;
|
|
28
33
|
/** 运行并返回解析后的 stdout JSON;失败抛 CliError。 */
|
|
29
34
|
runJson(args: string[], opts?: CliRunOptions): Promise<unknown>;
|
|
35
|
+
/** 运行命令(追加 provider 的 formatArgs)。 */
|
|
30
36
|
run(args: string[], opts?: CliRunOptions): Promise<CliExecution>;
|
|
37
|
+
/** 运行原始命令(不追加 formatArgs,用于 --version 等非业务查询)。 */
|
|
38
|
+
runRaw(args: string[], opts?: CliRunOptions): Promise<CliExecution>;
|
|
39
|
+
/** 解析实际使用的 CLI 入口(脚本路径或命令名),用于诊断。 */
|
|
40
|
+
resolveScript(binOverride?: string): Promise<string>;
|
|
41
|
+
/** 暴露启动规格(供登录会话等需要自行 spawn 的场景复用解析逻辑)。 */
|
|
42
|
+
resolveLaunch(binOverride?: string): Promise<LaunchSpec>;
|
|
43
|
+
private execute;
|
|
31
44
|
private launch;
|
|
32
45
|
}
|
|
33
46
|
//# sourceMappingURL=runner.d.ts.map
|
package/dist/cli/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oCAAoC;IACpC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,cAAc;IAEjD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,0CAA0C;IACpC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrE,sCAAsC;IAChC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAItE,kDAAkD;IAC5C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAIzE,qCAAqC;IAC/B,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1D,0CAA0C;IACpC,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YAIhD,OAAO;YAuEP,MAAM;CAkCrB"}
|
package/dist/cli/runner.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
import { existsSync } from "node:fs";
|
|
3
|
-
import {
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
4
5
|
import { CliError, parseErrorEnvelope } from "./errors.js";
|
|
5
6
|
/**
|
|
6
7
|
* 通用 CLI 透传执行器:按 provider 规格定位 CLI(npm 全局 bin 脚本 → node 直跑,
|
|
@@ -20,13 +21,30 @@ export class CliRunner {
|
|
|
20
21
|
const exec = await this.run(args, opts);
|
|
21
22
|
return exec.data;
|
|
22
23
|
}
|
|
24
|
+
/** 运行命令(追加 provider 的 formatArgs)。 */
|
|
23
25
|
async run(args, opts) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
return this.execute(args, [...args, ...this.spec.formatArgs], opts);
|
|
27
|
+
}
|
|
28
|
+
/** 运行原始命令(不追加 formatArgs,用于 --version 等非业务查询)。 */
|
|
29
|
+
async runRaw(args, opts) {
|
|
30
|
+
return this.execute(args, args, opts);
|
|
31
|
+
}
|
|
32
|
+
/** 解析实际使用的 CLI 入口(脚本路径或命令名),用于诊断。 */
|
|
33
|
+
async resolveScript(binOverride) {
|
|
34
|
+
const launch = await this.launch(binOverride);
|
|
35
|
+
return launch.shell ? launch.command : (launch.prefix[0] ?? launch.command);
|
|
36
|
+
}
|
|
37
|
+
/** 暴露启动规格(供登录会话等需要自行 spawn 的场景复用解析逻辑)。 */
|
|
38
|
+
async resolveLaunch(binOverride) {
|
|
39
|
+
return this.launch(binOverride);
|
|
40
|
+
}
|
|
41
|
+
async execute(displayArgs, cliArgs, opts) {
|
|
42
|
+
const launch = await this.launch(opts?.bin);
|
|
43
|
+
const finalArgs = [...launch.prefix, ...cliArgs];
|
|
44
|
+
const command = `${this.spec.bin} ${displayArgs.join(" ")}`;
|
|
27
45
|
return new Promise((resolve, reject) => {
|
|
28
|
-
const child = spawn(
|
|
29
|
-
shell:
|
|
46
|
+
const child = spawn(launch.command, finalArgs, {
|
|
47
|
+
shell: launch.shell,
|
|
30
48
|
cwd: opts?.cwd,
|
|
31
49
|
env: { ...process.env, ...opts?.env },
|
|
32
50
|
stdio: ["ignore", "pipe", "pipe"],
|
|
@@ -56,7 +74,7 @@ export class CliRunner {
|
|
|
56
74
|
}
|
|
57
75
|
child.on("error", (e) => {
|
|
58
76
|
reject(new CliError({
|
|
59
|
-
message: `Failed to launch ${this.spec.bin} (${
|
|
77
|
+
message: `Failed to launch ${this.spec.bin} (${launch.command}): ${e.message}`,
|
|
60
78
|
command,
|
|
61
79
|
retryable: true,
|
|
62
80
|
}));
|
|
@@ -95,8 +113,13 @@ export class CliRunner {
|
|
|
95
113
|
if (bin !== this.spec.bin && existsSync(bin)) {
|
|
96
114
|
return { command: bin, prefix: [], shell: false };
|
|
97
115
|
}
|
|
98
|
-
// 3)
|
|
116
|
+
// 3) 随包安装的 CLI(optionalDependencies 里的依赖,开箱即用)
|
|
99
117
|
if (bin === this.spec.bin) {
|
|
118
|
+
const local = localCliScript(this.spec);
|
|
119
|
+
if (local) {
|
|
120
|
+
return { command: process.execPath, prefix: [local], shell: false };
|
|
121
|
+
}
|
|
122
|
+
// 4) 回退:npm 全局安装的 CLI
|
|
100
123
|
const globalRoot = await npmGlobalRoot();
|
|
101
124
|
if (globalRoot) {
|
|
102
125
|
const script = join(globalRoot, ...this.spec.binScript.split("/"));
|
|
@@ -104,11 +127,55 @@ export class CliRunner {
|
|
|
104
127
|
return { command: process.execPath, prefix: [script], shell: false };
|
|
105
128
|
}
|
|
106
129
|
}
|
|
130
|
+
// 5) 通过 package.json 的 bin 字段再找一次(处理 binScript 与安装布局不一致)
|
|
131
|
+
const viaManifest = await cliScriptFromManifest(this.spec);
|
|
132
|
+
if (viaManifest) {
|
|
133
|
+
return { command: process.execPath, prefix: [viaManifest], shell: false };
|
|
134
|
+
}
|
|
107
135
|
}
|
|
108
|
-
//
|
|
136
|
+
// 6) 回退:shell 执行(Windows shim)
|
|
109
137
|
return { command: bin, prefix: [], shell: process.platform === "win32" };
|
|
110
138
|
}
|
|
111
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* 解析随包安装的 CLI 脚本(包内 node_modules,如 optionalDependencies)。
|
|
142
|
+
* 返回可直接用 `node <script>` 执行的脚本路径;找不到返回 undefined。
|
|
143
|
+
*/
|
|
144
|
+
function localCliScript(spec) {
|
|
145
|
+
try {
|
|
146
|
+
const require = createRequire(import.meta.url);
|
|
147
|
+
const pkgJson = require.resolve(`${spec.npmPackage}/package.json`);
|
|
148
|
+
const pkgDir = dirname(pkgJson);
|
|
149
|
+
// binScript = "<npmPackage>/bin/xxx.js" → 相对包目录的脚本路径
|
|
150
|
+
const rel = spec.binScript.slice(spec.npmPackage.length + 1);
|
|
151
|
+
const script = join(pkgDir, rel);
|
|
152
|
+
if (existsSync(script))
|
|
153
|
+
return script;
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** 通过包 manifest 的 bin 字段定位脚本(兼容 binScript 与实际 bin 布局不同的情况)。 */
|
|
161
|
+
async function cliScriptFromManifest(spec) {
|
|
162
|
+
try {
|
|
163
|
+
const require = createRequire(import.meta.url);
|
|
164
|
+
const pkgJson = require.resolve(`${spec.npmPackage}/package.json`);
|
|
165
|
+
const manifest = JSON.parse(readFileSync(pkgJson, "utf8"));
|
|
166
|
+
const pkgDir = dirname(pkgJson);
|
|
167
|
+
const bins = typeof manifest.bin === "string" ? [manifest.bin] : Object.values(manifest.bin ?? {});
|
|
168
|
+
for (const rel of bins) {
|
|
169
|
+
const script = join(pkgDir, rel);
|
|
170
|
+
if (existsSync(script))
|
|
171
|
+
return script;
|
|
172
|
+
}
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
112
179
|
function parseStdoutJson(stdout) {
|
|
113
180
|
const text = stdout.trim();
|
|
114
181
|
if (!text)
|
package/dist/cli/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,4 +5,5 @@ export { dingtalk } from "./providers/dingtalk.js";
|
|
|
5
5
|
export { wecom } from "./providers/wecom.js";
|
|
6
6
|
export { getProvider, listProviders } from "./providers/registry.js";
|
|
7
7
|
export { buildMcpServer, type McpServerOptions } from "./mcp/server.js";
|
|
8
|
+
export { authorizedOf, loginStatus, startLogin, stopLogin, type LoginSnapshot, type LoginStatusResult, } from "./login/session.js";
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnF,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnF,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,4 +4,5 @@ export { dingtalk } from "./providers/dingtalk.js";
|
|
|
4
4
|
export { wecom } from "./providers/wecom.js";
|
|
5
5
|
export { getProvider, listProviders } from "./providers/registry.js";
|
|
6
6
|
export { buildMcpServer } from "./mcp/server.js";
|
|
7
|
+
export { authorizedOf, loginStatus, startLogin, stopLogin, } from "./login/session.js";
|
|
7
8
|
//# 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAyB,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAE,SAAS,EAAyC,MAAM,iBAAiB,CAAC;AAEnF,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAyB,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAyB,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAE,SAAS,EAAyC,MAAM,iBAAiB,CAAC;AAEnF,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAyB,MAAM,iBAAiB,CAAC;AACxE,OAAO,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,GAGV,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { CliRunner } from "../cli/runner.js";
|
|
2
|
+
import type { ImProviderSpec } from "../providers/types.js";
|
|
3
|
+
/** 一次登录会话的可观察状态。 */
|
|
4
|
+
export interface LoginSnapshot {
|
|
5
|
+
provider: string;
|
|
6
|
+
displayName: string;
|
|
7
|
+
running: boolean;
|
|
8
|
+
startedAt: number;
|
|
9
|
+
endedAt?: number;
|
|
10
|
+
exitCode: number | null;
|
|
11
|
+
/** 输出尾部(用于展示授权链接 / 设备码 / 错误信息)。 */
|
|
12
|
+
output: string;
|
|
13
|
+
/** 二维码 PNG 的 data URL(企业微信扫码)。 */
|
|
14
|
+
qrDataUrl?: string;
|
|
15
|
+
/** 二维码文件路径(若 CLI 输出到文件)。 */
|
|
16
|
+
qrPath?: string;
|
|
17
|
+
}
|
|
18
|
+
/** 登录状态查询结果。 */
|
|
19
|
+
export interface LoginStatusResult {
|
|
20
|
+
provider: string;
|
|
21
|
+
authorized: boolean;
|
|
22
|
+
running: boolean;
|
|
23
|
+
/** 登录进程退出码(未结束时为 null)。 */
|
|
24
|
+
exitCode: number | null;
|
|
25
|
+
/** auth 查询的原始结果(JSON 或文本)。 */
|
|
26
|
+
auth?: unknown;
|
|
27
|
+
authError?: string;
|
|
28
|
+
output: string;
|
|
29
|
+
qrDataUrl?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 发起登录(后台进程,不阻塞):
|
|
33
|
+
* - 钉钉:`dws auth login --recommend` 会打开浏览器完成授权;
|
|
34
|
+
* - 企业微信:`auth init --noninteractive --output-qrcode <png>` 生成扫码图。
|
|
35
|
+
* 返回会话快照;已有进行中的会话则直接返回当前状态。
|
|
36
|
+
*/
|
|
37
|
+
export declare function startLogin(spec: ImProviderSpec, runner: CliRunner, opts?: {
|
|
38
|
+
bin?: string;
|
|
39
|
+
mode?: "browser" | "device";
|
|
40
|
+
}): Promise<LoginSnapshot>;
|
|
41
|
+
/** 查询登录状态:auth 查询 + 会话运行状态 + 二维码(若仍在生成中)。 */
|
|
42
|
+
export declare function loginStatus(spec: ImProviderSpec, runner: CliRunner, opts?: {
|
|
43
|
+
bin?: string;
|
|
44
|
+
}): Promise<LoginStatusResult>;
|
|
45
|
+
/** 结束并清理登录会话。 */
|
|
46
|
+
export declare function stopLogin(provider: string): boolean;
|
|
47
|
+
/** 把各种 CLI 的认证输出归一化为布尔值。 */
|
|
48
|
+
export declare function authorizedOf(data: unknown): boolean;
|
|
49
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/login/session.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,oBAAoB;AACpB,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmBD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,SAAS,EACjB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAO,GACvD,OAAO,CAAC,aAAa,CAAC,CAiExB;AAED,6CAA6C;AAC7C,wBAAsB,WAAW,CAC/B,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,SAAS,EACjB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAyB5B;AAED,iBAAiB;AACjB,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAWnD;AAED,4BAA4B;AAC5B,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAiBnD"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync, readFileSync, rmSync, statSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
/** 每个 provider 最多一个进行中的登录会话。 */
|
|
6
|
+
const sessions = new Map();
|
|
7
|
+
const MAX_OUTPUT = 8 * 1024;
|
|
8
|
+
const LOGIN_TIMEOUT_MS = 10 * 60 * 1000;
|
|
9
|
+
const QR_WAIT_MS = 5_000;
|
|
10
|
+
/**
|
|
11
|
+
* 发起登录(后台进程,不阻塞):
|
|
12
|
+
* - 钉钉:`dws auth login --recommend` 会打开浏览器完成授权;
|
|
13
|
+
* - 企业微信:`auth init --noninteractive --output-qrcode <png>` 生成扫码图。
|
|
14
|
+
* 返回会话快照;已有进行中的会话则直接返回当前状态。
|
|
15
|
+
*/
|
|
16
|
+
export async function startLogin(spec, runner, opts = {}) {
|
|
17
|
+
const existing = sessions.get(spec.id);
|
|
18
|
+
if (existing && existing.exitCode === null) {
|
|
19
|
+
return await snapshot(spec, existing);
|
|
20
|
+
}
|
|
21
|
+
const launch = await runner.resolveLaunch(opts.bin);
|
|
22
|
+
const args = [...(spec.loginArgs ?? ["auth", "login"])];
|
|
23
|
+
if (spec.id === "dingtalk" && opts.mode === "device") {
|
|
24
|
+
args[args.length - 1] = "--device";
|
|
25
|
+
}
|
|
26
|
+
let qrPath;
|
|
27
|
+
if (spec.qrOutputFlag) {
|
|
28
|
+
qrPath = join(tmpdir(), `im-connector-${spec.id}-${Date.now()}.png`);
|
|
29
|
+
if (existsSync(qrPath))
|
|
30
|
+
rmSync(qrPath, { force: true });
|
|
31
|
+
args.push(spec.qrOutputFlag, qrPath);
|
|
32
|
+
}
|
|
33
|
+
const child = spawn(launch.command, [...launch.prefix, ...args], {
|
|
34
|
+
shell: launch.shell,
|
|
35
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
36
|
+
windowsHide: true,
|
|
37
|
+
});
|
|
38
|
+
const session = {
|
|
39
|
+
child,
|
|
40
|
+
output: "",
|
|
41
|
+
startedAt: Date.now(),
|
|
42
|
+
exitCode: null,
|
|
43
|
+
qrPath,
|
|
44
|
+
};
|
|
45
|
+
sessions.set(spec.id, session);
|
|
46
|
+
const append = (chunk) => {
|
|
47
|
+
session.output = (session.output + chunk.toString("utf8")).slice(-MAX_OUTPUT);
|
|
48
|
+
};
|
|
49
|
+
child.stdout?.on("data", append);
|
|
50
|
+
child.stderr?.on("data", append);
|
|
51
|
+
child.on("exit", (code) => {
|
|
52
|
+
session.exitCode = code;
|
|
53
|
+
session.endedAt = Date.now();
|
|
54
|
+
if (session.timer)
|
|
55
|
+
clearTimeout(session.timer);
|
|
56
|
+
});
|
|
57
|
+
child.on("error", (e) => {
|
|
58
|
+
session.output = (session.output + `\n[launch error] ${e.message}`).slice(-MAX_OUTPUT);
|
|
59
|
+
session.exitCode = -1;
|
|
60
|
+
session.endedAt = Date.now();
|
|
61
|
+
});
|
|
62
|
+
session.timer = setTimeout(() => {
|
|
63
|
+
try {
|
|
64
|
+
child.kill("SIGTERM");
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
/* ignore */
|
|
68
|
+
}
|
|
69
|
+
}, LOGIN_TIMEOUT_MS);
|
|
70
|
+
// 企业微信:等待二维码 PNG 写盘并写完(最多 QR_WAIT_MS)
|
|
71
|
+
if (qrPath) {
|
|
72
|
+
const deadline = Date.now() + QR_WAIT_MS;
|
|
73
|
+
while (Date.now() < deadline && !hasNonEmptyFile(qrPath) && session.exitCode === null) {
|
|
74
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return await snapshot(spec, session);
|
|
78
|
+
}
|
|
79
|
+
/** 查询登录状态:auth 查询 + 会话运行状态 + 二维码(若仍在生成中)。 */
|
|
80
|
+
export async function loginStatus(spec, runner, opts = {}) {
|
|
81
|
+
const session = sessions.get(spec.id);
|
|
82
|
+
const result = {
|
|
83
|
+
provider: spec.id,
|
|
84
|
+
authorized: false,
|
|
85
|
+
running: false,
|
|
86
|
+
exitCode: session?.exitCode ?? null,
|
|
87
|
+
output: session?.output ?? "",
|
|
88
|
+
};
|
|
89
|
+
if (session) {
|
|
90
|
+
result.running = session.exitCode === null;
|
|
91
|
+
if (session.qrPath && existsSync(session.qrPath)) {
|
|
92
|
+
result.qrDataUrl = pngDataUrl(session.qrPath);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (spec.authArgs) {
|
|
96
|
+
try {
|
|
97
|
+
const data = await runner.runJson(spec.authArgs, { bin: opts.bin });
|
|
98
|
+
result.auth = data;
|
|
99
|
+
result.authorized = authorizedOf(data);
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
result.authError = e instanceof Error ? e.message : String(e);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
/** 结束并清理登录会话。 */
|
|
108
|
+
export function stopLogin(provider) {
|
|
109
|
+
const session = sessions.get(provider);
|
|
110
|
+
if (!session)
|
|
111
|
+
return false;
|
|
112
|
+
if (session.timer)
|
|
113
|
+
clearTimeout(session.timer);
|
|
114
|
+
try {
|
|
115
|
+
session.child.kill("SIGTERM");
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
/* ignore */
|
|
119
|
+
}
|
|
120
|
+
sessions.delete(provider);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
/** 把各种 CLI 的认证输出归一化为布尔值。 */
|
|
124
|
+
export function authorizedOf(data) {
|
|
125
|
+
if (typeof data === "string") {
|
|
126
|
+
const text = data.trim().toLowerCase();
|
|
127
|
+
return text === "authorized" || text === "ok" || text === "true";
|
|
128
|
+
}
|
|
129
|
+
if (data && typeof data === "object") {
|
|
130
|
+
const record = data;
|
|
131
|
+
for (const key of ["authenticated", "authorized", "authorized_status", "logged_in", "success"]) {
|
|
132
|
+
const value = record[key];
|
|
133
|
+
if (typeof value === "boolean")
|
|
134
|
+
return value;
|
|
135
|
+
if (typeof value === "string")
|
|
136
|
+
return value.toLowerCase() === "authorized" || value === "true";
|
|
137
|
+
}
|
|
138
|
+
// wecom-cli 的 auth show 可能包一层 results
|
|
139
|
+
const nested = record.results ?? record.result;
|
|
140
|
+
if (nested !== undefined)
|
|
141
|
+
return authorizedOf(nested);
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
async function snapshot(spec, session) {
|
|
146
|
+
const snap = {
|
|
147
|
+
provider: spec.id,
|
|
148
|
+
displayName: spec.displayName,
|
|
149
|
+
running: session.exitCode === null,
|
|
150
|
+
startedAt: session.startedAt,
|
|
151
|
+
endedAt: session.endedAt,
|
|
152
|
+
exitCode: session.exitCode,
|
|
153
|
+
output: session.output,
|
|
154
|
+
};
|
|
155
|
+
if (session.qrPath && existsSync(session.qrPath)) {
|
|
156
|
+
snap.qrPath = session.qrPath;
|
|
157
|
+
snap.qrDataUrl = pngDataUrl(session.qrPath);
|
|
158
|
+
}
|
|
159
|
+
return snap;
|
|
160
|
+
}
|
|
161
|
+
function pngDataUrl(path) {
|
|
162
|
+
try {
|
|
163
|
+
const bytes = readFileSync(path);
|
|
164
|
+
if (bytes.length === 0)
|
|
165
|
+
return undefined;
|
|
166
|
+
return `data:image/png;base64,${bytes.toString("base64")}`;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** PNG 是否已写盘且写完(CLI 会先创建空文件再写入内容)。 */
|
|
173
|
+
function hasNonEmptyFile(path) {
|
|
174
|
+
try {
|
|
175
|
+
return statSync(path).size > 0;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/login/session.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
3
|
/**
|
|
4
|
-
* 构建统一 IM 透传 MCP server
|
|
5
|
-
*
|
|
4
|
+
* 构建统一 IM 透传 MCP server:暴露
|
|
5
|
+
* - `run { provider, args }`:业务透传;
|
|
6
|
+
* - `info`:版本/登录自检;
|
|
7
|
+
* - `login { provider }`:发起扫码/浏览器登录(返回二维码图片);
|
|
8
|
+
* - `login_status { provider }`:查询登录状态。
|
|
9
|
+
* 按 provider 注册表路由到底层 CLI;新增平台只需在 registry 追加 spec。
|
|
6
10
|
*/
|
|
7
11
|
export interface McpServerOptions {
|
|
8
12
|
name?: string;
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAgKnE;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,MAAM,CA0KrE"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
2
4
|
import { pathToFileURL } from "node:url";
|
|
3
5
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
4
6
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
@@ -6,6 +8,7 @@ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextpro
|
|
|
6
8
|
import { getProvider, listProviders } from "../providers/registry.js";
|
|
7
9
|
import { CliRunner } from "../cli/runner.js";
|
|
8
10
|
import { isCliError } from "../cli/errors.js";
|
|
11
|
+
import { loginStatus, startLogin } from "../login/session.js";
|
|
9
12
|
function buildRunTool() {
|
|
10
13
|
const providers = listProviders();
|
|
11
14
|
const lines = providers
|
|
@@ -36,16 +39,215 @@ function buildRunTool() {
|
|
|
36
39
|
},
|
|
37
40
|
};
|
|
38
41
|
}
|
|
42
|
+
function buildInfoTool() {
|
|
43
|
+
return {
|
|
44
|
+
name: "info",
|
|
45
|
+
description: "查看已接入平台的 CLI 版本、登录状态与实际可执行入口(环境自检 / 排障用)。返回每个 provider 的 id、displayName、版本、登录状态与解析到的 CLI 路径。",
|
|
46
|
+
inputSchema: {
|
|
47
|
+
type: "object",
|
|
48
|
+
properties: {},
|
|
49
|
+
additionalProperties: false,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function collectProviderInfo(spec, binOverride) {
|
|
54
|
+
const runner = new CliRunner(spec);
|
|
55
|
+
const info = { id: spec.id, displayName: spec.displayName, bin: spec.bin };
|
|
56
|
+
try {
|
|
57
|
+
info.resolved = await runner.resolveScript(binOverride);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
/* ignore */
|
|
61
|
+
}
|
|
62
|
+
// 版本:优先 CLI --version,回退读包内 package.json
|
|
63
|
+
try {
|
|
64
|
+
const exec = await runner.runRaw(spec.versionArgs ?? ["--version"], { bin: binOverride });
|
|
65
|
+
const firstLine = exec.stdout
|
|
66
|
+
.split(/\r?\n/)
|
|
67
|
+
.map((l) => l.trim())
|
|
68
|
+
.find((l) => l.length > 0);
|
|
69
|
+
if (firstLine)
|
|
70
|
+
info.version = firstLine;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
/* ignore */
|
|
74
|
+
}
|
|
75
|
+
if (!info.version) {
|
|
76
|
+
try {
|
|
77
|
+
const require = createRequire(import.meta.url);
|
|
78
|
+
const pkgJson = require.resolve(`${spec.npmPackage}/package.json`);
|
|
79
|
+
const manifest = JSON.parse(readFileSync(pkgJson, "utf8"));
|
|
80
|
+
if (manifest.version)
|
|
81
|
+
info.version = manifest.version;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
/* ignore */
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// 登录状态:走 provider 的 authArgs(JSON 输出)
|
|
88
|
+
if (spec.authArgs) {
|
|
89
|
+
try {
|
|
90
|
+
info.auth = await runner.runJson(spec.authArgs, { bin: binOverride });
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
info.authError = isCliError(e) ? e.message : e instanceof Error ? e.message : String(e);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return info;
|
|
97
|
+
}
|
|
98
|
+
function buildLoginTool() {
|
|
99
|
+
const providers = listProviders();
|
|
100
|
+
return {
|
|
101
|
+
name: "login",
|
|
102
|
+
description: "发起平台登录(无需终端):企业微信会返回可直接渲染的扫码二维码图片;钉钉会拉起浏览器授权(或 mode=device 走设备码流程)。" +
|
|
103
|
+
"返回结果里的 markdown 字段是绝对路径图片语法,直接贴进回复即可在聊天里内联显示二维码。" +
|
|
104
|
+
`完成后调用 login_status 确认。平台:${providers.map((p) => `${p.id}=${p.displayName}`).join(",")}。`,
|
|
105
|
+
inputSchema: {
|
|
106
|
+
type: "object",
|
|
107
|
+
properties: {
|
|
108
|
+
provider: {
|
|
109
|
+
type: "string",
|
|
110
|
+
enum: providers.map((p) => p.id),
|
|
111
|
+
description: "要登录的平台。",
|
|
112
|
+
},
|
|
113
|
+
mode: {
|
|
114
|
+
type: "string",
|
|
115
|
+
enum: ["browser", "device"],
|
|
116
|
+
description: "钉钉登录方式:browser=本机浏览器授权(默认),device=设备码(无头/远程环境)。企业微信固定扫码。",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
required: ["provider"],
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function buildLoginStatusTool() {
|
|
124
|
+
return {
|
|
125
|
+
name: "login_status",
|
|
126
|
+
description: "查询登录状态:是否已授权、登录进程是否仍在运行、二维码(若可用)与最近输出。",
|
|
127
|
+
inputSchema: {
|
|
128
|
+
type: "object",
|
|
129
|
+
properties: {
|
|
130
|
+
provider: {
|
|
131
|
+
type: "string",
|
|
132
|
+
enum: listProviders().map((p) => p.id),
|
|
133
|
+
description: "要查询的平台。",
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
required: ["provider"],
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
39
140
|
export function buildMcpServer(options = {}) {
|
|
40
141
|
const server = new Server({ name: options.name ?? "im", version: options.version ?? "0.1.0" }, { capabilities: { tools: {} } });
|
|
41
142
|
const runTool = buildRunTool();
|
|
143
|
+
const infoTool = buildInfoTool();
|
|
144
|
+
const loginTool = buildLoginTool();
|
|
145
|
+
const loginStatusTool = buildLoginStatusTool();
|
|
42
146
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
43
|
-
tools: [runTool],
|
|
147
|
+
tools: [runTool, infoTool, loginTool, loginStatusTool],
|
|
44
148
|
}));
|
|
45
149
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
150
|
+
if (request.params.name === "login" || request.params.name === "login_status") {
|
|
151
|
+
const { provider, mode } = (request.params.arguments ?? {});
|
|
152
|
+
const spec = getProvider(provider);
|
|
153
|
+
if (!spec) {
|
|
154
|
+
return {
|
|
155
|
+
content: [
|
|
156
|
+
{
|
|
157
|
+
type: "text",
|
|
158
|
+
text: `未知平台 "${provider}"。可用:${listProviders().map((p) => p.id).join(",")}`,
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
isError: true,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const runner = new CliRunner(spec);
|
|
165
|
+
const bin = options.binOverrides?.[spec.id];
|
|
166
|
+
try {
|
|
167
|
+
if (request.params.name === "login_status") {
|
|
168
|
+
const status = await loginStatus(spec, runner, { bin });
|
|
169
|
+
return {
|
|
170
|
+
content: [
|
|
171
|
+
{
|
|
172
|
+
type: "text",
|
|
173
|
+
text: JSON.stringify({
|
|
174
|
+
...status,
|
|
175
|
+
hint: status.authorized
|
|
176
|
+
? "已登录,可以直接使用 run 工具。"
|
|
177
|
+
: status.running
|
|
178
|
+
? "登录会话进行中:请扫码/完成浏览器授权后再次查询。"
|
|
179
|
+
: status.exitCode === 0
|
|
180
|
+
? "授权流程已完成(exitCode=0),但 auth 查询仍未通过;请检查 CLI 登录态或重新 login。"
|
|
181
|
+
: status.exitCode === null
|
|
182
|
+
? "尚未发起登录;请调用 login 获取二维码/打开授权页。"
|
|
183
|
+
: `登录流程已结束(exitCode=${status.exitCode}),未成功;请重新调用 login。`,
|
|
184
|
+
}, null, 2),
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const login = await startLogin(spec, runner, {
|
|
190
|
+
bin,
|
|
191
|
+
mode: mode === "device" ? "device" : "browser",
|
|
192
|
+
});
|
|
193
|
+
const content = [];
|
|
194
|
+
if (login.qrDataUrl?.startsWith("data:image/png;base64,")) {
|
|
195
|
+
content.push({
|
|
196
|
+
type: "image",
|
|
197
|
+
data: login.qrDataUrl.slice("data:image/png;base64,".length),
|
|
198
|
+
mimeType: "image/png",
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
content.push({
|
|
202
|
+
type: "text",
|
|
203
|
+
text: JSON.stringify({
|
|
204
|
+
provider: login.provider,
|
|
205
|
+
displayName: login.displayName,
|
|
206
|
+
running: login.running,
|
|
207
|
+
exitCode: login.exitCode,
|
|
208
|
+
qrPath: login.qrPath,
|
|
209
|
+
// 可直接粘贴到回复里的 Markdown 图片(DSH 聊天会把本地绝对路径渲染为内联图片)
|
|
210
|
+
markdown: login.qrPath ? `})` : undefined,
|
|
211
|
+
outputTail: login.output.slice(-800),
|
|
212
|
+
hint: login.qrDataUrl
|
|
213
|
+
? "请用手机扫描二维码完成授权,然后调用 login_status 确认。"
|
|
214
|
+
: "请在浏览器完成授权(钉钉默认自动打开浏览器);完成后调用 login_status 确认。",
|
|
215
|
+
}, null, 2),
|
|
216
|
+
});
|
|
217
|
+
return { content };
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
return {
|
|
221
|
+
content: [
|
|
222
|
+
{
|
|
223
|
+
type: "text",
|
|
224
|
+
text: `${spec.displayName} ${request.params.name} failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
isError: true,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (request.params.name === "info") {
|
|
232
|
+
try {
|
|
233
|
+
const providers = [];
|
|
234
|
+
for (const spec of listProviders()) {
|
|
235
|
+
providers.push(await collectProviderInfo(spec, options.binOverrides?.[spec.id]));
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
content: [{ type: "text", text: JSON.stringify({ providers }, null, 2) }],
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
catch (e) {
|
|
242
|
+
return {
|
|
243
|
+
content: [{ type: "text", text: `info failed: ${e instanceof Error ? e.message : String(e)}` }],
|
|
244
|
+
isError: true,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
46
248
|
if (request.params.name !== "run") {
|
|
47
249
|
return {
|
|
48
|
-
content: [{ type: "text", text: `Unknown tool: ${request.params.name}.
|
|
250
|
+
content: [{ type: "text", text: `Unknown tool: ${request.params.name}. Available: "run", "info".` }],
|
|
49
251
|
isError: true,
|
|
50
252
|
};
|
|
51
253
|
}
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dingtalk.d.ts","sourceRoot":"","sources":["../../src/providers/dingtalk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,2CAA2C;AAC3C,eAAO,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"dingtalk.d.ts","sourceRoot":"","sources":["../../src/providers/dingtalk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,2CAA2C;AAC3C,eAAO,MAAM,QAAQ,EAAE,cAwBtB,CAAC"}
|
|
@@ -7,6 +7,9 @@ export const dingtalk = {
|
|
|
7
7
|
binScript: "dingtalk-workspace-cli/bin/dws.js",
|
|
8
8
|
formatArgs: ["--format", "json"],
|
|
9
9
|
envBin: "DINGTALK_DWS_BIN",
|
|
10
|
+
versionArgs: ["--version"],
|
|
11
|
+
authArgs: ["auth", "status"],
|
|
12
|
+
loginArgs: ["auth", "login", "--recommend"],
|
|
10
13
|
examples: [
|
|
11
14
|
'["contact","+me"]',
|
|
12
15
|
'["contact","+search-user","--query","张三"]',
|
|
@@ -18,6 +21,7 @@ export const dingtalk = {
|
|
|
18
21
|
'["doc","read","--node","<docId|url>"] / ["wiki","+space-list"]',
|
|
19
22
|
'["chat","+chat-messages","--group","<群名|id>","--limit","20"] / ["chat","+search-msg","--query","<kw>"]',
|
|
20
23
|
'写:["chat","+messages-send","--group","<cid>","--markdown","内容","--title","标题","--yes"]',
|
|
24
|
+
'其他服务域(dws --help 查看):aicard / api / attendance / audit / contract / devapp / devdoc / ding / drive / hrbrain / live / mail / minutes / sheet / whiteboard / wiki …',
|
|
21
25
|
],
|
|
22
26
|
};
|
|
23
27
|
//# sourceMappingURL=dingtalk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dingtalk.js","sourceRoot":"","sources":["../../src/providers/dingtalk.ts"],"names":[],"mappings":"AAEA,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACtC,EAAE,EAAE,UAAU;IACd,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,KAAK;IACV,UAAU,EAAE,wBAAwB;IACpC,SAAS,EAAE,mCAAmC;IAC9C,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;IAChC,MAAM,EAAE,kBAAkB;IAC1B,QAAQ,EAAE;QACR,mBAAmB;QACnB,2CAA2C;QAC3C,uBAAuB;QACvB,0BAA0B;QAC1B,sFAAsF;QACtF,8FAA8F;QAC9F,2EAA2E;QAC3E,gEAAgE;QAChE,wGAAwG;QACxG,wFAAwF;
|
|
1
|
+
{"version":3,"file":"dingtalk.js","sourceRoot":"","sources":["../../src/providers/dingtalk.ts"],"names":[],"mappings":"AAEA,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACtC,EAAE,EAAE,UAAU;IACd,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,KAAK;IACV,UAAU,EAAE,wBAAwB;IACpC,SAAS,EAAE,mCAAmC;IAC9C,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;IAChC,MAAM,EAAE,kBAAkB;IAC1B,WAAW,EAAE,CAAC,WAAW,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC5B,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;IAC3C,QAAQ,EAAE;QACR,mBAAmB;QACnB,2CAA2C;QAC3C,uBAAuB;QACvB,0BAA0B;QAC1B,sFAAsF;QACtF,8FAA8F;QAC9F,2EAA2E;QAC3E,gEAAgE;QAChE,wGAAwG;QACxG,wFAAwF;QACxF,oKAAoK;KACrK;CACF,CAAC"}
|
|
@@ -17,6 +17,14 @@ export interface ImProviderSpec {
|
|
|
17
17
|
formatArgs: string[];
|
|
18
18
|
/** 覆盖 bin 的环境变量名(可选),如 "DINGTALK_DWS_BIN"。 */
|
|
19
19
|
envBin?: string;
|
|
20
|
+
/** 查询 CLI 版本的原始参数(不追加 formatArgs),如 ["--version"]。 */
|
|
21
|
+
versionArgs?: string[];
|
|
22
|
+
/** 查询登录状态的命令(走 JSON 输出),如 ["auth","status"]。 */
|
|
23
|
+
authArgs?: string[];
|
|
24
|
+
/** 登录/授权命令(在 MCP 工具里后台执行),如 ["auth","login","--recommend"]。 */
|
|
25
|
+
loginArgs?: string[];
|
|
26
|
+
/** 扫码输出图片的参数名(值为 PNG 路径),如 wecom-cli 的 "--output-qrcode"。 */
|
|
27
|
+
qrOutputFlag?: string;
|
|
20
28
|
/** 展示在 MCP 工具描述里的示例命令(数组形式,便于模型理解)。 */
|
|
21
29
|
examples: string[];
|
|
22
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,EAAE,EAAE,MAAM,CAAC;IACX,cAAc;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,EAAE,EAAE,MAAM,CAAC;IACX,cAAc;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wecom.d.ts","sourceRoot":"","sources":["../../src/providers/wecom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,8DAA8D;AAC9D,eAAO,MAAM,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"wecom.d.ts","sourceRoot":"","sources":["../../src/providers/wecom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,8DAA8D;AAC9D,eAAO,MAAM,KAAK,EAAE,cAmBnB,CAAC"}
|
package/dist/providers/wecom.js
CHANGED
|
@@ -7,11 +7,16 @@ export const wecom = {
|
|
|
7
7
|
binScript: "@wecom/cli/bin/wecom.js",
|
|
8
8
|
formatArgs: [],
|
|
9
9
|
envBin: "WECOM_CLI_BIN",
|
|
10
|
+
versionArgs: ["--version"],
|
|
11
|
+
authArgs: ["auth", "show", "--status"],
|
|
12
|
+
loginArgs: ["auth", "init", "--noninteractive"],
|
|
13
|
+
qrOutputFlag: "--output-qrcode",
|
|
10
14
|
examples: [
|
|
11
15
|
'["contact","users","search","--keywords","张三"]',
|
|
12
16
|
'["chat","messages","list","--chat-id","<id>","--begin-time","2026-10-01 00:00:00","--end-time","2026-10-21 00:00:00"]',
|
|
17
|
+
'["message","send","--chat-id","<id>","--msg-type","text","--text","{\\"content\\":\\"通知\\"}"]',
|
|
13
18
|
'["auth","show","--status"]',
|
|
14
|
-
'通用形态:["<service>","<resource>","<operation>",...flags];--schema 查看方法 schema,--dry-run 预览不发送。',
|
|
19
|
+
'通用形态:["<service>","<resource>","<operation>",...flags];--schema 查看方法 schema,--page-count 自动分页(NDJSON),--dry-run 预览不发送。',
|
|
15
20
|
],
|
|
16
21
|
};
|
|
17
22
|
//# sourceMappingURL=wecom.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wecom.js","sourceRoot":"","sources":["../../src/providers/wecom.ts"],"names":[],"mappings":"AAEA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,KAAK,GAAmB;IACnC,EAAE,EAAE,OAAO;IACX,WAAW,EAAE,MAAM;IACnB,GAAG,EAAE,WAAW;IAChB,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,yBAAyB;IACpC,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,eAAe;IACvB,QAAQ,EAAE;QACR,gDAAgD;QAChD,uHAAuH;QACvH,4BAA4B;QAC5B,
|
|
1
|
+
{"version":3,"file":"wecom.js","sourceRoot":"","sources":["../../src/providers/wecom.ts"],"names":[],"mappings":"AAEA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,KAAK,GAAmB;IACnC,EAAE,EAAE,OAAO;IACX,WAAW,EAAE,MAAM;IACnB,GAAG,EAAE,WAAW;IAChB,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,yBAAyB;IACpC,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,eAAe;IACvB,WAAW,EAAE,CAAC,WAAW,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC;IACtC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,CAAC;IAC/C,YAAY,EAAE,iBAAiB;IAC/B,QAAQ,EAAE;QACR,gDAAgD;QAChD,uHAAuH;QACvH,+FAA+F;QAC/F,4BAA4B;QAC5B,wHAAwH;KACzH;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "im-connector",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "MCP server that lets agents drive DingTalk (dws) and WeCom (wecom-cli) CLIs: send messages, write reports, create todos, query calendars and approvals. Extensible provider registry for more IM platforms.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -40,6 +40,10 @@
|
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@modelcontextprotocol/sdk": "^1.12.0"
|
|
42
42
|
},
|
|
43
|
+
"optionalDependencies": {
|
|
44
|
+
"dingtalk-workspace-cli": "^1.0.65",
|
|
45
|
+
"@wecom/cli": "^1.3.4"
|
|
46
|
+
},
|
|
43
47
|
"devDependencies": {
|
|
44
48
|
"@types/node": "^22.10.0",
|
|
45
49
|
"typescript": "^5.7.0",
|