mcp-multi-bridge 0.0.0-stage → 2.1.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 CHANGED
@@ -1,3 +1,337 @@
1
- # Temporary Holding Version
1
+ # mcp-multi-bridge
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ 多后端 MCP 桥接(stdio 代理)。
4
+
5
+ 把一个网关后面「多个后端 × 多个租户」的工具集,合并成一个 MCP 服务暴露给客户端;
6
+ 调用时按 `orgKey` 选中租户,自动注入凭据后转发。
7
+
8
+ **只做转发,不做登录。** 没有 HTTP 服务、不监听端口、不弹浏览器。
9
+
10
+ 最初为 MES 系统而写,现已与具体业务系统解耦:系统名、租户称谓、凭据字段名、
11
+ 登录失效错误码、登录命令全部可配置(见[自定义](#自定义系统差异))。不配置时沿用 MES 的默认值。
12
+
13
+ ## 安装
14
+
15
+ ```bash
16
+ npm i -g mcp-multi-bridge mcp-multi-login
17
+ ```
18
+
19
+ 两个包配合使用:
20
+
21
+ - `mcp-multi-login` 负责登录,把 token 写入本地文件(旧名 `mes-login-cli`,命令 `mes-login` 仍可用)
22
+ - `mcp-multi-bridge` 负责读取 token 并转发请求
23
+
24
+ > **从 `mes-mcp-bridge` 升级是破坏性的,按下面三步走**
25
+ >
26
+ > 1. 卸载旧包、装新包:
27
+ >
28
+ > ```bash
29
+ > npm rm -g mes-mcp-bridge
30
+ > npm i -g mcp-multi-bridge
31
+ > ```
32
+ >
33
+ > 2. **改 `mcp.json` 里的 command**(这一步不能省——本包只提供 `mcp-multi-bridge`
34
+ > 一个命令名,旧的 `mes-mcp-bridge` 不再存在):
35
+ >
36
+ > ```diff
37
+ > - "command": "mes-mcp-bridge"
38
+ > + "command": "mcp-multi-bridge"
39
+ > ```
40
+ >
41
+ > 3. 重启 MCP 客户端。
42
+ >
43
+ > 配置目录与 `config.json` 结构不变,无需重新登录。
44
+
45
+ ## 多后端与工具列表
46
+
47
+ `config.json` 里的每个组织都带一个 `path`,指向它在 Higress 上的 MCP 路由。
48
+ **多个组织可能共享同一个 path**(比如测试环境的太仓和具身智能),
49
+ 它们只是登录身份不同,后台是同一个 MCP Server。
50
+
51
+ bridge 拉取工具列表的规则:
52
+
53
+ 1. 按 `path` 去重,同一 path 只查一次(不是按组织逐个查)
54
+ 2. 多个 path 并行查询
55
+ 3. 按**工具名**合并:同名工具只出现一次,`orgKey` 的可选值是提供该工具的所有组织
56
+ 4. 单个 path 失败不阻断整体,能拿到多少给多少,失败的写进 `login` 工具的告警里
57
+
58
+ ### `orgKey` 只能选同后端的组织
59
+
60
+ 这是为了避免一种必然失败的情况:工具来自 A 后端,`orgKey` 却指向 B 后端的组织,
61
+ 请求发过去那边不认识这个工具。bridge 会在调用前校验,跨后端直接拒绝并列出可用选项。
62
+
63
+ ### 工具数量上限
64
+
65
+ 默认上限 40 个。超过后会在 `login` 工具的描述里告警——工具过多会挤占模型上下文,
66
+ 也会降低工具选择的准确率。真到这一步,说明该拆 server 了。
67
+
68
+ ### 拆成多个客户端条目
69
+
70
+ 不想把所有后端压在一个 bridge 里,可以用环境变量限定本实例负责的 path:
71
+
72
+ ```json
73
+ {
74
+ "mcpServers": {
75
+ "mes-test": {
76
+ "command": "mcp-multi-bridge",
77
+ "args": [],
78
+ "env": { "MES_MCP_PATHS": "mes-mcp-server" }
79
+ },
80
+ "mes-prod": {
81
+ "command": "mcp-multi-bridge",
82
+ "args": [],
83
+ "env": { "MES_MCP_PATHS": "tc-mes-mcp-server" }
84
+ }
85
+ }
86
+ }
87
+ ```
88
+
89
+ `MES_MCP_PATHS` 用逗号分隔,可以写完整 path(`/mcp-servers/xxx`),
90
+ 也可以只写末段(`xxx`),两种都识别。
91
+
92
+ 这样客户端列表里会出现两个独立条目,各自的工具集和 `orgKey` 范围互不干扰。
93
+
94
+ ## 检查安装的版本
95
+
96
+ ```bash
97
+ mcp-multi-bridge --version # 只输出版本号,如 1.4.0
98
+ mcp-multi-bridge --status # 版本 + 安装位置 + 网关地址 + 后端分组 + 各组织登录状态
99
+ mcp-multi-bridge --help # 帮助
100
+ ```
101
+
102
+ `--version` 只输出纯版本号,方便脚本取值:
103
+
104
+ ```bash
105
+ mcp-multi-bridge --version | xargs echo "当前版本:"
106
+ ```
107
+
108
+ 如果怀疑跑的不是自己想跑的那份(比如同时存在 `npm link` 的软链和全局安装),
109
+ 用 `--status` 看「安装位置」即可确认。
110
+
111
+ `mes-login` 同样支持 `--version`。
112
+
113
+ ## 配置 MCP 客户端
114
+
115
+ 任选其一。
116
+
117
+ ### 方式一:npx(免安装)
118
+
119
+ ```json
120
+ {
121
+ "mcpServers": {
122
+ "mes": {
123
+ "command": "npx",
124
+ "args": ["-y", "mcp-multi-bridge"]
125
+ }
126
+ }
127
+ }
128
+ ```
129
+
130
+ ### 方式二:全局安装(推荐)
131
+
132
+ ```bash
133
+ npm i -g mcp-multi-bridge
134
+ ```
135
+
136
+ ```json
137
+ {
138
+ "mcpServers": {
139
+ "mes": {
140
+ "command": "mcp-multi-bridge",
141
+ "args": []
142
+ }
143
+ }
144
+ }
145
+ ```
146
+
147
+ 全局安装的好处是升级可控:`npx` 只跳过安装确认,**不会因为发布了新版本就刷新本地缓存**。
148
+
149
+ ### 方式三:绝对路径(最稳)
150
+
151
+ 如果客户端启动子进程时找不到命令(`ENOENT`),直接用 node 加绝对路径:
152
+
153
+ ```json
154
+ {
155
+ "mcpServers": {
156
+ "mes": {
157
+ "command": "node",
158
+ "args": ["C:/Users/你的用户名/AppData/Roaming/npm/node_modules/mcp-multi-bridge/bin.js"]
159
+ }
160
+ }
161
+ }
162
+ ```
163
+
164
+ 实际路径用这条命令查:
165
+
166
+ ```bash
167
+ npm root -g
168
+ ```
169
+
170
+ ## 使用流程
171
+
172
+ 1. 首次使用,或 token 过期时,执行登录:
173
+
174
+ ```bash
175
+ mes-login
176
+ ```
177
+
178
+ 2. 在打开的登录页里完成账号密码和图形验证码
179
+
180
+ 3. 回到 MCP 客户端,直接调用工具即可
181
+
182
+ **登录后无需重启客户端。** bridge 每次调用都重新读取 token 文件,所以登录结果立即生效。
183
+
184
+ ## 未登录时的表现
185
+
186
+ 工具调用会返回明确的引导文案,说明该执行 `mes-login` 以及要等人工完成验证码。模型拿到这段文字后可以自行发起登录。
187
+
188
+ ## 多组织
189
+
190
+ 登录页支持切换组织,每个组织单独保存 token,互不覆盖。
191
+
192
+ 调用工具时可以指定组织:
193
+
194
+ ```json
195
+ { "orgKey": "tc" }
196
+ ```
197
+
198
+ `orgKey` 的取值就是 `config.json` 里各组织的 `key`,不传则用最后一次登录的组织。
199
+
200
+ ## 自定义系统差异
201
+
202
+ 合并、路由、凭据注入这套逻辑与具体业务系统无关,真正随系统变化的是六件事。
203
+ 全部在 `config.json` 里配置,**都不写则沿用 MES 的默认值,升级后行为不变**。
204
+
205
+ ```json
206
+ {
207
+ "systemName": "ERP 中台",
208
+ "tenantLabel": "租户",
209
+ "credentialField": "authToken",
210
+ "tenantIdField": "tenantId",
211
+ "hiddenArgs": ["authToken", "tenantId"],
212
+ "invalidCodes": [401, 403],
213
+ "invalidCodeReasons": { "401": "未授权,请重新登录" },
214
+ "loginCommand": "erp-login"
215
+ }
216
+ ```
217
+
218
+ | 字段 | 默认值 | 作用 |
219
+ |---|---|---|
220
+ | `systemName` | `MES` | 系统名,出现在登录引导与状态标题里 |
221
+ | `tenantLabel` | `组织` | 租户称谓,出现在 `orgKey` 参数说明、状态清单与各类提示里 |
222
+ | `credentialField` | `access_token` | 注入到工具参数里的凭据字段名,**必须与网关 requestTemplate 取值的字段一致** |
223
+ | `tenantIdField` | `orgId` | 注入租户 ID 时用的参数名,取值来自配置的 `orgs[].orgId` |
224
+ | `hiddenArgs` | 跟随上面两个字段 | 对模型隐藏的参数。凭据与租户 ID 由本层填,露给模型只会引发「我该填什么」 |
225
+ | `invalidCodes` | `[613,614,615,616]` | 视为「登录失效」的业务错误码,命中后返回重新登录引导 |
226
+ | `invalidCodeReasons` | MES 的四个码 | 错误码说明,与默认值**合并**,只写要覆盖的项 |
227
+ | `loginCommand` | `mes-login` | 登录引导里让模型执行的命令名 |
228
+
229
+ > **租户 ID 由本层注入,不让模型填。** 网关的工具模板通常是
230
+ > `{{if .args.orgId}}{{.args.orgId}}{{else}}1{{end}}` —— 不传就一律按 1 查,
231
+ > 同一个后端下的其他租户会静默查到错误组织的数据。所以本层总是把
232
+ > `orgs[].orgId` 注入进去,客户端传的同名字段会被覆盖。
233
+
234
+ ### 显示效果对比
235
+
236
+ | | 默认 | 上面那份配置 |
237
+ |---|---|---|
238
+ | 工具描述 | 查询 MES 的组织与登录状态 | 查询 ERP 中台的租户与登录状态 |
239
+ | 参数说明 | 要操作的组织标识 | 要操作的租户标识 |
240
+ | 状态标题 | ## MES 组织状态 | ## ERP 中台租户状态 |
241
+ | 更新提示 | 该组织尚未登录 | 该租户尚未登录 |
242
+ | 引导命令 | `mes-login --org tc` | `erp-login --org tc` |
243
+
244
+ `orgKey` 这个参数名不会变——它是路由用的标识,改文案不影响调用方代码。
245
+
246
+ ### 容错
247
+
248
+ 所有字段都做了类型校验,配错(`null`、空串、非数组、非数字)时**静默回落默认值**,
249
+ 不会让服务起不来。`systemName` 以汉字结尾时不加空格(「查询 ERP 中台的租户」),
250
+ 以拉丁字母结尾时加(「查询 MES 的组织」)。
251
+
252
+ ## 配置目录与多系统并存
253
+
254
+ **默认目录 `~/.mes-mcp-login`**,不设环境变量就用它。现有用户升级后行为不变。
255
+
256
+ 目录名带 `mes` 是历史沿革:`mcp-multi-login` 的默认值也是它,两边必须一致,
257
+ 否则登录完桥接层找不到 token。要改名得两个包一起改。
258
+
259
+ **同一个客户端接多套系统**时,每个 bridge 实例指向不同目录:
260
+
261
+ ```json
262
+ {
263
+ "mcpServers": {
264
+ "mes": {
265
+ "command": "mcp-multi-bridge",
266
+ "args": [],
267
+ "env": { "MCP_MULTI_HOME": "C:/Users/你/.mes-mcp-login" }
268
+ },
269
+ "erp": {
270
+ "command": "mcp-multi-bridge",
271
+ "args": [],
272
+ "env": { "MCP_MULTI_HOME": "C:/Users/你/.erp-login" }
273
+ }
274
+ }
275
+ }
276
+ ```
277
+
278
+ 工具名由客户端加前缀区分(`mcp__mes__captchaGet` / `mcp__erp__captchaGet`),同名工具不冲突。
279
+
280
+ | 环境变量 | 作用 | 默认 |
281
+ |---|---|---|
282
+ | `MCP_MULTI_HOME` | 配置目录 | `~/.mes-mcp-login` |
283
+ | `MCP_BRIDGE_HOME` | 同上(旧名,仍兼容) | — |
284
+ | `MCP_BRIDGE_PATHS` | 限定本实例负责的 path,逗号分隔 | 不限制(全部加载) |
285
+
286
+ > `MCP_MULTI_HOME` 优先于 `MCP_BRIDGE_HOME`;`MCP_BRIDGE_PATHS` 优先于旧名 `MES_MCP_PATHS`。
287
+
288
+ ### 登录引导会带上 `--home`
289
+
290
+ 未登录或登录失效时,本服务返回的引导命令是**完整可执行**的:
291
+
292
+ ```bash
293
+ mcp-multi-login --home "C:/Users/你/.mes-mcp-login" --org tc
294
+ ```
295
+
296
+ `--home` 指向本实例实际读取的目录,不能省——省了就会写到默认目录去,
297
+ 表现是「登录成功了但这边还是未登录」,非常难查。
298
+
299
+ 若登录命令不是默认的 `mcp-multi-login`(例如仍在用旧的 `mes-login`),
300
+ 用 `loginCommand` 配置改:
301
+
302
+ ```json
303
+ { "loginCommand": "mes-login" }
304
+ ```
305
+
306
+ ## 文件依赖
307
+
308
+ 读取配置目录下的两个文件:
309
+
310
+ | 文件 | 由谁创建 |
311
+ |---|---|
312
+ | `config.json` | 登录侧 CLI(`mcp-multi-login` / 旧 `mes-login-cli`),也可手写 |
313
+ | `token.json` | 登录侧 CLI(登录时写入) |
314
+
315
+ 本包**只读不写**,不会创建、修改或删除这两个文件。
316
+
317
+ 所以使用前必须先安装并运行一次登录 CLI(`mcp-multi-login`)。
318
+
319
+ ## 提供的工具
320
+
321
+ 工具列表由网关返回,本包原样透传。`login` 会被本包替换成本地状态查询工具。
322
+
323
+ 工具本身(有哪些、叫什么、什么参数)完全取决于网关侧配置,本包不做增删。
324
+ 当前 MES 网关提供的是:
325
+
326
+ - `login` 登录态查询(本包接管)
327
+ - `captchaGet` 获取验证码
328
+ - `captchaCheck` 校验验证码
329
+ - `searchRidReport` RID 明细报表
330
+
331
+ ## 平台支持
332
+
333
+ Windows / macOS / Linux。需要 Node.js >= 18。
334
+
335
+ ## License
336
+
337
+ MIT