mcp-multi-bridge 2.3.1 → 2.3.2
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 +48 -0
- package/lib/higress.js +32 -1
- package/package.json +34 -34
package/README.md
CHANGED
|
@@ -300,6 +300,54 @@ bridge 侧**不维护任何业务词对照表**。
|
|
|
300
300
|
两种做法的取舍:拆 server 简单但要维护多套配置和凭证;分层只维护一套,
|
|
301
301
|
代价是每次找工具多一跳。系统数量不多时,拆 server 更省事。
|
|
302
302
|
|
|
303
|
+
### 网关侧认证(key-auth)
|
|
304
|
+
|
|
305
|
+
桥接默认只发 `Content-Type`,不带任何认证头——业务登录 token 是作为**工具参数**
|
|
306
|
+
传给后端的,不参与网关认证。所以当网关对某个端点开了 Key 认证时,
|
|
307
|
+
必须让桥接额外带一个头,否则该端点会直接 401(表现为只剩本地的 `login` 工具)。
|
|
308
|
+
|
|
309
|
+
三个来源,后者覆盖前者:
|
|
310
|
+
|
|
311
|
+
| 来源 | 作用范围 | 适合 |
|
|
312
|
+
| --- | --- | --- |
|
|
313
|
+
| `MCP_BRIDGE_HEADERS`(环境变量,JSON) | 本实例所有组织 | 一套凭证走全部环境 |
|
|
314
|
+
| `config.json` 顶层 `headers` | 本实例所有组织 | 同上,但想写进配置文件 |
|
|
315
|
+
| `orgs[].headers` | 单个组织 | 每个环境用不同凭证 |
|
|
316
|
+
|
|
317
|
+
最省事的是写在客户端条目的 `env` 里:
|
|
318
|
+
|
|
319
|
+
```json
|
|
320
|
+
{
|
|
321
|
+
"mcpServers": {
|
|
322
|
+
"mes": {
|
|
323
|
+
"command": "mcp-multi-bridge",
|
|
324
|
+
"args": ["--name", "mes"],
|
|
325
|
+
"env": {
|
|
326
|
+
"MCP_BRIDGE_HEADERS": "{\"Authorization\":\"Bearer <网关消费者凭证>\"}"
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
要给不同环境配不同消费者,就写进 `config.json` 的组织里(优先级更高):
|
|
334
|
+
|
|
335
|
+
```json
|
|
336
|
+
{
|
|
337
|
+
"orgs": [
|
|
338
|
+
{ "key": "test", "path": "/mcp-servers/mes-mcp-server" },
|
|
339
|
+
{ "key": "prod", "path": "/mcp-servers/tc-mes-mcp-server",
|
|
340
|
+
"headers": { "Authorization": "Bearer <prod 的凭证>" } }
|
|
341
|
+
]
|
|
342
|
+
}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
三个来源都没配时,请求头与旧版完全一致,不影响未开认证的网关。
|
|
346
|
+
|
|
347
|
+
> 凭证是明文,别提交进仓库;`MCP_BRIDGE_HEADERS` 不是合法 JSON 时会被忽略并打一行提示,
|
|
348
|
+
> 不会让进程退出——但那个端点会因此 401,排查时先看这条提示。
|
|
349
|
+
|
|
350
|
+
|
|
303
351
|
## 检查安装的版本
|
|
304
352
|
|
|
305
353
|
```bash
|
package/lib/higress.js
CHANGED
|
@@ -12,13 +12,44 @@ import { orgUrl } from './config.js';
|
|
|
12
12
|
// 自增 id,避免同毫秒并发撞号
|
|
13
13
|
let rpcSeq = 0;
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* 附加到网关请求上的头
|
|
17
|
+
*
|
|
18
|
+
* 用于网关侧的消费者认证(如 key-auth 的 Authorization)。三个来源按优先级合并,
|
|
19
|
+
* 后者覆盖前者:
|
|
20
|
+
* 1. 环境变量 MCP_BRIDGE_HEADERS —— 客户端 mcp.json 的 env 里配,JSON 字符串
|
|
21
|
+
* 2. config.json 顶层 headers —— 对本实例所有组织生效
|
|
22
|
+
* 3. orgs[].headers —— 只对该组织生效,用于不同环境不同凭证
|
|
23
|
+
*
|
|
24
|
+
* 都没配时返回空对象,请求头与旧版完全一致(不改变既有行为)。
|
|
25
|
+
* 为什么不放在工具参数里:网关的 key-auth 只认请求头,参数是给后端业务用的。
|
|
26
|
+
*/
|
|
27
|
+
export function bridgeHeaders(cfg, org) {
|
|
28
|
+
let fromEnv = {};
|
|
29
|
+
const raw = process.env.MCP_BRIDGE_HEADERS;
|
|
30
|
+
if (raw) {
|
|
31
|
+
try {
|
|
32
|
+
const v = JSON.parse(raw);
|
|
33
|
+
if (v && typeof v === 'object' && !Array.isArray(v)) fromEnv = v;
|
|
34
|
+
else console.error('[bridge] MCP_BRIDGE_HEADERS 必须是 JSON 对象,已忽略');
|
|
35
|
+
} catch (e) {
|
|
36
|
+
console.error('[bridge] MCP_BRIDGE_HEADERS 不是合法 JSON,已忽略');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
...fromEnv,
|
|
41
|
+
...((cfg && cfg.headers) || {}),
|
|
42
|
+
...((org && org.headers) || {})
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
15
46
|
/**
|
|
16
47
|
* 发一个 JSON-RPC 请求到网关
|
|
17
48
|
*/
|
|
18
49
|
export async function rpc(cfg, org, method, params) {
|
|
19
50
|
const res = await fetch(orgUrl(cfg, org), {
|
|
20
51
|
method: 'POST',
|
|
21
|
-
headers: { 'Content-Type': 'application/json' },
|
|
52
|
+
headers: { 'Content-Type': 'application/json', ...bridgeHeaders(cfg, org) },
|
|
22
53
|
body: JSON.stringify({ jsonrpc: '2.0', id: ++rpcSeq, method, params })
|
|
23
54
|
});
|
|
24
55
|
const text = await res.text();
|
package/package.json
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "mcp-multi-bridge",
|
|
3
|
-
"version": "2.3.
|
|
4
|
-
"description": "多后端 MCP 桥接:把网关后多个后端、多个租户的工具集合并成一个 MCP 服务,凭据由登录 CLI 提供",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"mcp-multi-bridge": "bin.js"
|
|
8
|
-
},
|
|
9
|
-
"files": [
|
|
10
|
-
"bin.js",
|
|
11
|
-
"lib/",
|
|
12
|
-
"README.md"
|
|
13
|
-
],
|
|
14
|
-
"engines": {
|
|
15
|
-
"node": ">=18"
|
|
16
|
-
},
|
|
17
|
-
"scripts": {
|
|
18
|
-
"start": "node bin.js",
|
|
19
|
-
"pack:check": "npm pack --dry-run",
|
|
20
|
-
"test": "node test/toolindex.test.mjs"
|
|
21
|
-
},
|
|
22
|
-
"keywords": [
|
|
23
|
-
"mcp",
|
|
24
|
-
"model-context-protocol",
|
|
25
|
-
"bridge",
|
|
26
|
-
"multi-tenant",
|
|
27
|
-
"multi-backend",
|
|
28
|
-
"mes"
|
|
29
|
-
],
|
|
30
|
-
"license": "MIT",
|
|
31
|
-
"dependencies": {
|
|
32
|
-
"@modelcontextprotocol/sdk": "^1.20.2"
|
|
33
|
-
}
|
|
34
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-multi-bridge",
|
|
3
|
+
"version": "2.3.2",
|
|
4
|
+
"description": "多后端 MCP 桥接:把网关后多个后端、多个租户的工具集合并成一个 MCP 服务,凭据由登录 CLI 提供",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mcp-multi-bridge": "bin.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin.js",
|
|
11
|
+
"lib/",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=18"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"start": "node bin.js",
|
|
19
|
+
"pack:check": "npm pack --dry-run",
|
|
20
|
+
"test": "node test/toolindex.test.mjs && node test/headers.test.mjs"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"mcp",
|
|
24
|
+
"model-context-protocol",
|
|
25
|
+
"bridge",
|
|
26
|
+
"multi-tenant",
|
|
27
|
+
"multi-backend",
|
|
28
|
+
"mes"
|
|
29
|
+
],
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@modelcontextprotocol/sdk": "^1.20.2"
|
|
33
|
+
}
|
|
34
|
+
}
|