@cyanmycelium/mcp-broker 0.4.0 → 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/.mcp-broker.example/CONFIGURATION-EN.md +861 -0
- package/.mcp-broker.example/CONFIGURATION-FR.md +871 -0
- package/.mcp-broker.example/README.md +8 -3
- package/.mcp-broker.example/config.json +86 -0
- package/README.md +122 -3
- package/dist/bin.d.ts +0 -1
- package/dist/bin.js +180 -208
- package/dist/bin.js.map +1 -1
- package/dist/chunk-FTDKH2C4.js +3670 -0
- package/dist/chunk-FTDKH2C4.js.map +1 -0
- package/dist/{broker/grammars → grammars}/claude/en.json +1 -1
- package/dist/{broker/grammars → grammars}/claude/fr.json +1 -1
- package/dist/index.d.ts +1790 -18
- package/dist/index.js +2 -14
- package/dist/index.js.map +1 -1
- package/package.json +14 -8
- package/scripts/copy-assets.mjs +16 -10
- package/scripts/gen-cert.mjs +5 -5
- package/scripts/pack-mcpb.mjs +5 -5
- package/scripts/sign-bundle.mjs +6 -6
- package/src/auth/auth.config.ts +98 -0
- package/src/auth/auth.types.ts +120 -0
- package/src/auth/http.auth.ts +128 -0
- package/src/auth/index.ts +34 -0
- package/src/auth/jwt.validator.ts +63 -0
- package/src/auth/provider.auth.ts +114 -0
- package/src/auth/resource.metadata.ts +34 -0
- package/src/authorization/audit.ts +35 -0
- package/src/authorization/capability.classifier.ts +114 -0
- package/src/authorization/index.ts +37 -0
- package/src/authorization/policy.engine.ts +212 -0
- package/src/authorization/policy.types.ts +105 -0
- package/src/authorization/resource.path.ts +126 -0
- package/src/authorization/runtime.ts +56 -0
- package/src/authorization/slot.resource.ts +50 -0
- package/src/authorization/subject.mapper.ts +81 -0
- package/src/bin.ts +90 -7
- package/src/broker/adapters/broker.adapter.info.ts +3 -3
- package/src/broker/adapters/broker.adapter.providers.ts +3 -3
- package/src/broker/aggregate/aggregate.catalog.ts +49 -21
- package/src/broker/aggregate/aggregate.server.ts +149 -19
- package/src/broker/aggregate/provider.client.session.ts +22 -22
- package/src/broker/behaviors/broker.behavior.info.ts +4 -4
- package/src/broker/behaviors/broker.behavior.providers.ts +6 -6
- package/src/broker/broker.context.ts +10 -4
- package/src/broker/broker.grammars.ts +16 -13
- package/src/broker/broker.server.ts +12 -9
- package/src/broker/grammars/claude/en.json +1 -1
- package/src/broker/grammars/claude/fr.json +1 -1
- package/src/broker/index.ts +9 -9
- package/src/config.ts +81 -8
- package/src/index.ts +121 -20
- package/src/{mcpb.loader.ts → mcpb/mcpb.loader.ts} +24 -21
- package/src/{mcpb.unzip.ts → mcpb/mcpb.unzip.ts} +2 -2
- package/src/remote.transports.ts +11 -8
- package/src/remote.upstream.ts +11 -8
- package/src/stdio.upstream.ts +9 -6
- package/src/upstream.ts +6 -3
- package/src/ws/ws.interfaces.ts +357 -0
- package/src/{ws.tunnel.builder.ts → ws/ws.tunnel.builder.ts} +112 -9
- package/src/{ws.tunnel.ts → ws/ws.tunnel.ts} +646 -457
- package/web/README.md +94 -0
- package/web/assets/logo.png +0 -0
- package/web/broker-self-mcp.html +338 -0
- package/web/css/styles.css +580 -0
- package/web/demos/DemoPlaceholder.html +258 -0
- package/web/demos/broker-explorer/css/app.css +393 -0
- package/web/demos/broker-explorer/index.html +94 -0
- package/web/demos/broker-explorer/js/app.js +271 -0
- package/web/demos/broker-explorer/js/mcp-ws-client.js +132 -0
- package/web/demos/oauth-lab/README.md +94 -0
- package/web/demos/oauth-lab/config.json +117 -0
- package/web/demos/oauth-lab/css/app.css +1097 -0
- package/web/demos/oauth-lab/index.html +323 -0
- package/web/demos/oauth-lab/js/app.js +654 -0
- package/web/demos/oauth-lab/server/auth-server.mjs +426 -0
- package/web/demos/oauth-lab/server/factory-provider.mjs +269 -0
- package/web/demos/oauth-lab/server/smoke-test.mjs +308 -0
- package/web/demos/oauth-lab/server/start.mjs +106 -0
- package/web/demos/provider-tunnel/css/app.css +384 -0
- package/web/demos/provider-tunnel/index.html +99 -0
- package/web/demos/provider-tunnel/js/app.js +226 -0
- package/web/demos/provider-tunnel/js/toolbox-server.js +186 -0
- package/web/index.html +558 -0
- package/web/js/lib/broker-tunnel.js +173 -0
- package/dist/broker/adapters/broker.adapter.info.d.ts +0 -16
- package/dist/broker/adapters/broker.adapter.info.js +0 -43
- package/dist/broker/adapters/broker.adapter.info.js.map +0 -1
- package/dist/broker/adapters/broker.adapter.providers.d.ts +0 -18
- package/dist/broker/adapters/broker.adapter.providers.js +0 -61
- package/dist/broker/adapters/broker.adapter.providers.js.map +0 -1
- package/dist/broker/aggregate/aggregate.catalog.d.ts +0 -54
- package/dist/broker/aggregate/aggregate.catalog.js +0 -105
- package/dist/broker/aggregate/aggregate.catalog.js.map +0 -1
- package/dist/broker/aggregate/aggregate.server.d.ts +0 -47
- package/dist/broker/aggregate/aggregate.server.js +0 -151
- package/dist/broker/aggregate/aggregate.server.js.map +0 -1
- package/dist/broker/aggregate/provider.client.session.d.ts +0 -52
- package/dist/broker/aggregate/provider.client.session.js +0 -140
- package/dist/broker/aggregate/provider.client.session.js.map +0 -1
- package/dist/broker/behaviors/broker.behavior.info.d.ts +0 -15
- package/dist/broker/behaviors/broker.behavior.info.js +0 -41
- package/dist/broker/behaviors/broker.behavior.info.js.map +0 -1
- package/dist/broker/behaviors/broker.behavior.providers.d.ts +0 -19
- package/dist/broker/behaviors/broker.behavior.providers.js +0 -69
- package/dist/broker/behaviors/broker.behavior.providers.js.map +0 -1
- package/dist/broker/broker.context.d.ts +0 -59
- package/dist/broker/broker.context.js +0 -2
- package/dist/broker/broker.context.js.map +0 -1
- package/dist/broker/broker.grammars.d.ts +0 -130
- package/dist/broker/broker.grammars.js +0 -229
- package/dist/broker/broker.grammars.js.map +0 -1
- package/dist/broker/broker.server.d.ts +0 -66
- package/dist/broker/broker.server.js +0 -73
- package/dist/broker/broker.server.js.map +0 -1
- package/dist/broker/index.d.ts +0 -9
- package/dist/broker/index.js +0 -7
- package/dist/broker/index.js.map +0 -1
- package/dist/config.d.ts +0 -136
- package/dist/config.js +0 -61
- package/dist/config.js.map +0 -1
- package/dist/mcpb.loader.d.ts +0 -24
- package/dist/mcpb.loader.js +0 -161
- package/dist/mcpb.loader.js.map +0 -1
- package/dist/mcpb.unzip.d.ts +0 -6
- package/dist/mcpb.unzip.js +0 -95
- package/dist/mcpb.unzip.js.map +0 -1
- package/dist/remote.transports.d.ts +0 -16
- package/dist/remote.transports.js +0 -297
- package/dist/remote.transports.js.map +0 -1
- package/dist/remote.upstream.d.ts +0 -36
- package/dist/remote.upstream.js +0 -52
- package/dist/remote.upstream.js.map +0 -1
- package/dist/stdio.upstream.d.ts +0 -45
- package/dist/stdio.upstream.js +0 -85
- package/dist/stdio.upstream.js.map +0 -1
- package/dist/upstream.d.ts +0 -33
- package/dist/upstream.js +0 -2
- package/dist/upstream.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.js +0 -9
- package/dist/version.js.map +0 -1
- package/dist/ws.tunnel.builder.d.ts +0 -139
- package/dist/ws.tunnel.builder.js +0 -205
- package/dist/ws.tunnel.builder.js.map +0 -1
- package/dist/ws.tunnel.d.ts +0 -373
- package/dist/ws.tunnel.js +0 -1090
- package/dist/ws.tunnel.js.map +0 -1
- /package/dist/{broker/grammars → grammars}/default/en.json +0 -0
- /package/dist/{broker/grammars → grammars}/default/fr.json +0 -0
- /package/dist/{broker/grammars → grammars}/default/zh.json +0 -0
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { AggregateCatalog } from "./aggregate.catalog.js";
|
|
2
|
-
import { ProviderClientSession } from "./provider.client.session.js";
|
|
3
|
-
/** MCP protocol version advertised by the aggregate server. */
|
|
4
|
-
const PROTOCOL_VERSION = "2024-11-05";
|
|
5
|
-
/**
|
|
6
|
-
* The `_all` aggregate MCP server. Presents the union of every opted-in
|
|
7
|
-
* provider's tools and prompts as a single MCP server, reachable on the
|
|
8
|
-
* reserved `_all` slot.
|
|
9
|
-
*
|
|
10
|
-
* It implements {@link IMessageTransport} so it can be registered on the
|
|
11
|
-
* WsTunnel as a loopback provider: `send` receives client requests, `onMessage`
|
|
12
|
-
* (assigned by the tunnel) carries responses and notifications back to clients.
|
|
13
|
-
*/
|
|
14
|
-
export class AggregateServer {
|
|
15
|
-
/** Reserved provider slot the aggregate is published on. */
|
|
16
|
-
static SLOT = "_all";
|
|
17
|
-
_catalog = new AggregateCatalog();
|
|
18
|
-
_sessions = new Map();
|
|
19
|
-
_openClient;
|
|
20
|
-
_running = false;
|
|
21
|
-
onMessage = null;
|
|
22
|
-
onOpen = null;
|
|
23
|
-
onClose = null;
|
|
24
|
-
onError = null;
|
|
25
|
-
constructor(openClient) {
|
|
26
|
-
this._openClient = openClient;
|
|
27
|
-
}
|
|
28
|
-
get isOpen() {
|
|
29
|
-
return this._running;
|
|
30
|
-
}
|
|
31
|
-
/** Number of providers currently in the aggregate. */
|
|
32
|
-
get providerCount() {
|
|
33
|
-
return this._sessions.size;
|
|
34
|
-
}
|
|
35
|
-
/** Marks the aggregate transport open. Call before registering it. */
|
|
36
|
-
start() {
|
|
37
|
-
this._running = true;
|
|
38
|
-
}
|
|
39
|
-
/** WsTunnel hands a client request for the `_all` slot here. */
|
|
40
|
-
send(data) {
|
|
41
|
-
void this._handleClientMessage(data);
|
|
42
|
-
}
|
|
43
|
-
/** Closes every provider session and the aggregate transport. */
|
|
44
|
-
close() {
|
|
45
|
-
if (!this._running)
|
|
46
|
-
return;
|
|
47
|
-
this._running = false;
|
|
48
|
-
for (const session of this._sessions.values())
|
|
49
|
-
session.close();
|
|
50
|
-
this._sessions.clear();
|
|
51
|
-
this.onClose?.();
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Adds a provider to the aggregate: opens an internal client, runs the
|
|
55
|
-
* session handshake, and merges the provider's catalog. A no-op for an
|
|
56
|
-
* already-aggregated provider or the reserved `_all` slot itself.
|
|
57
|
-
*/
|
|
58
|
-
async addProvider(name) {
|
|
59
|
-
if (name === AggregateServer.SLOT || this._sessions.has(name))
|
|
60
|
-
return;
|
|
61
|
-
const session = new ProviderClientSession(name, this._openClient(name));
|
|
62
|
-
this._sessions.set(name, session);
|
|
63
|
-
session.onCatalogChanged = () => {
|
|
64
|
-
this._catalog.setProvider(name, { tools: session.tools, prompts: session.prompts });
|
|
65
|
-
this._emitListChanged();
|
|
66
|
-
};
|
|
67
|
-
session.onClosed = () => this.removeProvider(name);
|
|
68
|
-
try {
|
|
69
|
-
await session.initialize();
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
this.removeProvider(name);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/** Removes a provider from the aggregate. */
|
|
76
|
-
removeProvider(name) {
|
|
77
|
-
const session = this._sessions.get(name);
|
|
78
|
-
if (!session)
|
|
79
|
-
return;
|
|
80
|
-
this._sessions.delete(name);
|
|
81
|
-
session.close();
|
|
82
|
-
this._catalog.removeProvider(name);
|
|
83
|
-
this._emitListChanged();
|
|
84
|
-
}
|
|
85
|
-
async _handleClientMessage(data) {
|
|
86
|
-
let msg;
|
|
87
|
-
try {
|
|
88
|
-
msg = JSON.parse(data);
|
|
89
|
-
}
|
|
90
|
-
catch {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const id = msg.id;
|
|
94
|
-
if (id == null)
|
|
95
|
-
return; // client notification — nothing to answer
|
|
96
|
-
switch (msg.method) {
|
|
97
|
-
case "initialize":
|
|
98
|
-
this._reply(id, {
|
|
99
|
-
result: {
|
|
100
|
-
protocolVersion: PROTOCOL_VERSION,
|
|
101
|
-
serverInfo: { name: AggregateServer.SLOT, version: "0" },
|
|
102
|
-
capabilities: { tools: { listChanged: true }, prompts: { listChanged: true } },
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
break;
|
|
106
|
-
case "ping":
|
|
107
|
-
this._reply(id, { result: {} });
|
|
108
|
-
break;
|
|
109
|
-
case "tools/list":
|
|
110
|
-
this._reply(id, { result: { tools: this._catalog.tools } });
|
|
111
|
-
break;
|
|
112
|
-
case "prompts/list":
|
|
113
|
-
this._reply(id, { result: { prompts: this._catalog.prompts } });
|
|
114
|
-
break;
|
|
115
|
-
case "tools/call":
|
|
116
|
-
await this._route(id, msg.params, "tool");
|
|
117
|
-
break;
|
|
118
|
-
case "prompts/get":
|
|
119
|
-
await this._route(id, msg.params, "prompt");
|
|
120
|
-
break;
|
|
121
|
-
default:
|
|
122
|
-
this._reply(id, { error: { code: -32601, message: `Method not found: ${msg.method ?? "(none)"}` } });
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
async _route(id, params, kind) {
|
|
126
|
-
const p = (params ?? {});
|
|
127
|
-
const route = p.name ? (kind === "tool" ? this._catalog.resolveTool(p.name) : this._catalog.resolvePrompt(p.name)) : undefined;
|
|
128
|
-
if (!route) {
|
|
129
|
-
this._reply(id, { error: { code: -32602, message: `Unknown aggregated ${kind}: ${p.name ?? "(none)"}` } });
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
const session = this._sessions.get(route.provider);
|
|
133
|
-
if (!session) {
|
|
134
|
-
this._reply(id, { error: { code: -32000, message: `Provider "${route.provider}" is no longer connected` } });
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
const args = p.arguments ?? {};
|
|
138
|
-
const outcome = kind === "tool" ? await session.callTool(route.original, args) : await session.getPrompt(route.original, args);
|
|
139
|
-
this._reply(id, outcome.error !== undefined ? { error: outcome.error } : { result: outcome.result });
|
|
140
|
-
}
|
|
141
|
-
_reply(id, body) {
|
|
142
|
-
this.onMessage?.(JSON.stringify({ jsonrpc: "2.0", id, ...body }));
|
|
143
|
-
}
|
|
144
|
-
_emitListChanged() {
|
|
145
|
-
if (!this._running)
|
|
146
|
-
return;
|
|
147
|
-
this.onMessage?.(JSON.stringify({ jsonrpc: "2.0", method: "notifications/tools/list_changed" }));
|
|
148
|
-
this.onMessage?.(JSON.stringify({ jsonrpc: "2.0", method: "notifications/prompts/list_changed" }));
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=aggregate.server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate.server.js","sourceRoot":"","sources":["../../../src/broker/aggregate/aggregate.server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,+DAA+D;AAC/D,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAgBtC;;;;;;;;GAQG;AACH,MAAM,OAAO,eAAe;IACxB,4DAA4D;IAC5D,MAAM,CAAU,IAAI,GAAG,MAAM,CAAC;IAEb,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAClC,SAAS,GAAG,IAAI,GAAG,EAAiC,CAAC;IACrD,WAAW,CAAwB;IAC5C,QAAQ,GAAG,KAAK,CAAC;IAEzB,SAAS,GAAoC,IAAI,CAAC;IAClD,MAAM,GAAwB,IAAI,CAAC;IACnC,OAAO,GAAwB,IAAI,CAAC;IACpC,OAAO,GAAoC,IAAI,CAAC;IAEhD,YAAY,UAAiC;QACzC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,sDAAsD;IACtD,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,sEAAsE;IACtE,KAAK;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,gEAAgE;IAChE,IAAI,CAAC,IAAY;QACb,KAAK,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,iEAAiE;IACjE,KAAK;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/D,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY;QAC1B,IAAI,IAAI,KAAK,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QAEtE,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAElC,OAAO,CAAC,gBAAgB,GAAG,GAAS,EAAE;YAClC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAEzD,IAAI,CAAC;YACD,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,cAAc,CAAC,IAAY;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,IAAY;QAC3C,IAAI,GAAkB,CAAC;QACvB,IAAI,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACL,OAAO;QACX,CAAC;QACD,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,EAAE,IAAI,IAAI;YAAE,OAAO,CAAC,0CAA0C;QAElE,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,YAAY;gBACb,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;oBACZ,MAAM,EAAE;wBACJ,eAAe,EAAE,gBAAgB;wBACjC,UAAU,EAAE,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;wBACxD,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;qBACjF;iBACJ,CAAC,CAAC;gBACH,MAAM;YACV,KAAK,MAAM;gBACP,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChC,MAAM;YACV,KAAK,YAAY;gBACb,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC5D,MAAM;YACV,KAAK,cAAc;gBACf,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM;YACV,KAAK,YAAY;gBACb,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC1C,MAAM;YACV,KAAK,aAAa;gBACd,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAC5C,MAAM;YACV;gBACI,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,qBAAqB,GAAG,CAAC,MAAM,IAAI,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7G,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,EAAmB,EAAE,MAAe,EAAE,IAAuB;QAC9E,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAe,CAAC;QACvC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/H,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,sBAAsB,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAC3G,OAAO;QACX,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,KAAK,CAAC,QAAQ,0BAA0B,EAAE,EAAE,CAAC,CAAC;YAC7G,OAAO;QACX,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/H,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzG,CAAC;IAEO,MAAM,CAAC,EAAmB,EAAE,IAA2C;QAC3E,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAEO,gBAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC,CAAC,CAAC;IACvG,CAAC"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import type { InternalClient } from "../../ws.tunnel.js";
|
|
2
|
-
import type { CatalogTool, CatalogPrompt } from "./aggregate.catalog.js";
|
|
3
|
-
/** Outcome of a JSON-RPC request: exactly one of `result` / `error` is set. */
|
|
4
|
-
interface RpcOutcome {
|
|
5
|
-
result?: unknown;
|
|
6
|
-
error?: unknown;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* A hand-rolled JSON-RPC client session to one aggregated provider, running
|
|
10
|
-
* over an in-process {@link InternalClient}.
|
|
11
|
-
*
|
|
12
|
-
* Performs the MCP `initialize` handshake, caches the provider's `tools/list`
|
|
13
|
-
* and `prompts/list`, and re-fetches them when the provider emits a
|
|
14
|
-
* `list_changed` notification. `tools/call` and `prompts/get` are forwarded and
|
|
15
|
-
* their raw result or error relayed back unchanged.
|
|
16
|
-
*/
|
|
17
|
-
export declare class ProviderClientSession {
|
|
18
|
-
readonly provider: string;
|
|
19
|
-
private readonly _client;
|
|
20
|
-
private readonly _idPrefix;
|
|
21
|
-
private readonly _pending;
|
|
22
|
-
private _nextId;
|
|
23
|
-
private _tools;
|
|
24
|
-
private _prompts;
|
|
25
|
-
private _closed;
|
|
26
|
-
/** Fires after the cached catalog changes (initial load or `list_changed`). */
|
|
27
|
-
onCatalogChanged: (() => void) | null;
|
|
28
|
-
/** Fires when the underlying provider slot disconnects. */
|
|
29
|
-
onClosed: (() => void) | null;
|
|
30
|
-
constructor(provider: string, client: InternalClient);
|
|
31
|
-
get tools(): CatalogTool[];
|
|
32
|
-
get prompts(): CatalogPrompt[];
|
|
33
|
-
/** Runs the `initialize` handshake and the first catalog fetch. */
|
|
34
|
-
initialize(): Promise<void>;
|
|
35
|
-
/** Forwards a `tools/call` to the provider, relaying the raw outcome. */
|
|
36
|
-
callTool(name: string, args: Record<string, unknown>): Promise<RpcOutcome>;
|
|
37
|
-
/** Forwards a `prompts/get` to the provider, relaying the raw outcome. */
|
|
38
|
-
getPrompt(name: string, args: Record<string, unknown>): Promise<RpcOutcome>;
|
|
39
|
-
/** Detaches the session and its internal client. */
|
|
40
|
-
close(): void;
|
|
41
|
-
private _refresh;
|
|
42
|
-
/**
|
|
43
|
-
* Calls a list method, following `nextCursor` pagination. A provider that
|
|
44
|
-
* does not implement the primitive answers with an error, which is treated
|
|
45
|
-
* as an empty list.
|
|
46
|
-
*/
|
|
47
|
-
private _listAll;
|
|
48
|
-
private _request;
|
|
49
|
-
private _handleMessage;
|
|
50
|
-
private _rejectAll;
|
|
51
|
-
}
|
|
52
|
-
export {};
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
/** MCP protocol version the aggregate sessions negotiate with sub-providers. */
|
|
2
|
-
const PROTOCOL_VERSION = "2024-11-05";
|
|
3
|
-
/** Per-request timeout for sub-provider calls. */
|
|
4
|
-
const REQUEST_TIMEOUT_MS = 30_000;
|
|
5
|
-
/**
|
|
6
|
-
* A hand-rolled JSON-RPC client session to one aggregated provider, running
|
|
7
|
-
* over an in-process {@link InternalClient}.
|
|
8
|
-
*
|
|
9
|
-
* Performs the MCP `initialize` handshake, caches the provider's `tools/list`
|
|
10
|
-
* and `prompts/list`, and re-fetches them when the provider emits a
|
|
11
|
-
* `list_changed` notification. `tools/call` and `prompts/get` are forwarded and
|
|
12
|
-
* their raw result or error relayed back unchanged.
|
|
13
|
-
*/
|
|
14
|
-
export class ProviderClientSession {
|
|
15
|
-
provider;
|
|
16
|
-
_client;
|
|
17
|
-
_idPrefix;
|
|
18
|
-
_pending = new Map();
|
|
19
|
-
_nextId = 0;
|
|
20
|
-
_tools = [];
|
|
21
|
-
_prompts = [];
|
|
22
|
-
_closed = false;
|
|
23
|
-
/** Fires after the cached catalog changes (initial load or `list_changed`). */
|
|
24
|
-
onCatalogChanged = null;
|
|
25
|
-
/** Fires when the underlying provider slot disconnects. */
|
|
26
|
-
onClosed = null;
|
|
27
|
-
constructor(provider, client) {
|
|
28
|
-
this.provider = provider;
|
|
29
|
-
this._client = client;
|
|
30
|
-
this._idPrefix = `agg-${provider}-`;
|
|
31
|
-
client.onMessage = (data) => this._handleMessage(data);
|
|
32
|
-
client.onClose = () => {
|
|
33
|
-
if (this._closed)
|
|
34
|
-
return;
|
|
35
|
-
this._rejectAll("provider disconnected");
|
|
36
|
-
this.onClosed?.();
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
get tools() {
|
|
40
|
-
return this._tools;
|
|
41
|
-
}
|
|
42
|
-
get prompts() {
|
|
43
|
-
return this._prompts;
|
|
44
|
-
}
|
|
45
|
-
/** Runs the `initialize` handshake and the first catalog fetch. */
|
|
46
|
-
async initialize() {
|
|
47
|
-
await this._request("initialize", {
|
|
48
|
-
protocolVersion: PROTOCOL_VERSION,
|
|
49
|
-
capabilities: {},
|
|
50
|
-
clientInfo: { name: "mcp-broker-aggregate", version: "0" },
|
|
51
|
-
});
|
|
52
|
-
this._client.send(JSON.stringify({ jsonrpc: "2.0", method: "notifications/initialized" }));
|
|
53
|
-
await this._refresh();
|
|
54
|
-
}
|
|
55
|
-
/** Forwards a `tools/call` to the provider, relaying the raw outcome. */
|
|
56
|
-
callTool(name, args) {
|
|
57
|
-
return this._request("tools/call", { name, arguments: args });
|
|
58
|
-
}
|
|
59
|
-
/** Forwards a `prompts/get` to the provider, relaying the raw outcome. */
|
|
60
|
-
getPrompt(name, args) {
|
|
61
|
-
return this._request("prompts/get", { name, arguments: args });
|
|
62
|
-
}
|
|
63
|
-
/** Detaches the session and its internal client. */
|
|
64
|
-
close() {
|
|
65
|
-
if (this._closed)
|
|
66
|
-
return;
|
|
67
|
-
this._closed = true;
|
|
68
|
-
this._rejectAll("session closed");
|
|
69
|
-
this._client.close();
|
|
70
|
-
}
|
|
71
|
-
async _refresh() {
|
|
72
|
-
this._tools = await this._listAll("tools/list", "tools");
|
|
73
|
-
this._prompts = await this._listAll("prompts/list", "prompts");
|
|
74
|
-
this.onCatalogChanged?.();
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Calls a list method, following `nextCursor` pagination. A provider that
|
|
78
|
-
* does not implement the primitive answers with an error, which is treated
|
|
79
|
-
* as an empty list.
|
|
80
|
-
*/
|
|
81
|
-
async _listAll(method, key) {
|
|
82
|
-
const items = [];
|
|
83
|
-
let cursor;
|
|
84
|
-
do {
|
|
85
|
-
const { result, error } = await this._request(method, cursor ? { cursor } : {});
|
|
86
|
-
if (error)
|
|
87
|
-
return [];
|
|
88
|
-
const page = (result ?? {});
|
|
89
|
-
const list = page[key];
|
|
90
|
-
if (Array.isArray(list))
|
|
91
|
-
items.push(...list);
|
|
92
|
-
cursor = typeof page.nextCursor === "string" ? page.nextCursor : undefined;
|
|
93
|
-
} while (cursor);
|
|
94
|
-
return items;
|
|
95
|
-
}
|
|
96
|
-
_request(method, params) {
|
|
97
|
-
return new Promise((resolve) => {
|
|
98
|
-
if (this._closed) {
|
|
99
|
-
resolve({ error: { code: -32000, message: "session closed" } });
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
const id = this._idPrefix + String(++this._nextId);
|
|
103
|
-
const timer = setTimeout(() => {
|
|
104
|
-
this._pending.delete(id);
|
|
105
|
-
resolve({ error: { code: -32000, message: `request "${method}" timed out` } });
|
|
106
|
-
}, REQUEST_TIMEOUT_MS);
|
|
107
|
-
this._pending.set(id, { resolve, timer });
|
|
108
|
-
this._client.send(JSON.stringify({ jsonrpc: "2.0", id, method, params }));
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
_handleMessage(data) {
|
|
112
|
-
let msg;
|
|
113
|
-
try {
|
|
114
|
-
msg = JSON.parse(data);
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (typeof msg.id === "string") {
|
|
120
|
-
const pending = this._pending.get(msg.id);
|
|
121
|
-
if (pending) {
|
|
122
|
-
this._pending.delete(msg.id);
|
|
123
|
-
clearTimeout(pending.timer);
|
|
124
|
-
pending.resolve({ result: msg.result, error: msg.error });
|
|
125
|
-
}
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
if (msg.id == null && (msg.method === "notifications/tools/list_changed" || msg.method === "notifications/prompts/list_changed")) {
|
|
129
|
-
void this._refresh();
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
_rejectAll(reason) {
|
|
133
|
-
for (const pending of this._pending.values()) {
|
|
134
|
-
clearTimeout(pending.timer);
|
|
135
|
-
pending.resolve({ error: { code: -32000, message: reason } });
|
|
136
|
-
}
|
|
137
|
-
this._pending.clear();
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
//# sourceMappingURL=provider.client.session.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider.client.session.js","sourceRoot":"","sources":["../../../src/broker/aggregate/provider.client.session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { McpBehavior } from "@cyanmycelium/mcp-core";
|
|
2
|
-
import type { McpResource, McpTool } from "@cyanmycelium/mcp-core";
|
|
3
|
-
import type { BrokerContext } from "../broker.context.js";
|
|
4
|
-
/**
|
|
5
|
-
* Exposes basic broker identity (name, version, uptime, listening config) as
|
|
6
|
-
* one tool (`broker_info`) and one resource (`broker://info`).
|
|
7
|
-
*
|
|
8
|
-
* An MCP agent typically calls `broker_info` first to learn who it is talking to.
|
|
9
|
-
*/
|
|
10
|
-
export declare class BrokerInfoBehavior extends McpBehavior {
|
|
11
|
-
static readonly NAMESPACE = "broker";
|
|
12
|
-
constructor(context: BrokerContext);
|
|
13
|
-
protected _buildResources(): McpResource[];
|
|
14
|
-
protected _buildTools(): McpTool[];
|
|
15
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { McpBehavior } from "@cyanmycelium/mcp-core";
|
|
2
|
-
import { BROKER_INFO_URI, BrokerInfoAdapter } from "../adapters/broker.adapter.info.js";
|
|
3
|
-
import { brokerBaselineResourceDescription, brokerBaselineResourceName, brokerBaselineToolDescription } from "../broker.grammars.js";
|
|
4
|
-
/**
|
|
5
|
-
* Exposes basic broker identity (name, version, uptime, listening config) as
|
|
6
|
-
* one tool (`broker_info`) and one resource (`broker://info`).
|
|
7
|
-
*
|
|
8
|
-
* An MCP agent typically calls `broker_info` first to learn who it is talking to.
|
|
9
|
-
*/
|
|
10
|
-
export class BrokerInfoBehavior extends McpBehavior {
|
|
11
|
-
static NAMESPACE = "broker";
|
|
12
|
-
constructor(context) {
|
|
13
|
-
super(new BrokerInfoAdapter(context), {
|
|
14
|
-
namespace: BrokerInfoBehavior.NAMESPACE,
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
_buildResources() {
|
|
18
|
-
return [
|
|
19
|
-
{
|
|
20
|
-
uri: BROKER_INFO_URI,
|
|
21
|
-
name: brokerBaselineResourceName(BROKER_INFO_URI),
|
|
22
|
-
mimeType: "application/json",
|
|
23
|
-
description: brokerBaselineResourceDescription(BROKER_INFO_URI),
|
|
24
|
-
},
|
|
25
|
-
];
|
|
26
|
-
}
|
|
27
|
-
_buildTools() {
|
|
28
|
-
return [
|
|
29
|
-
{
|
|
30
|
-
name: "broker_info",
|
|
31
|
-
description: brokerBaselineToolDescription("broker_info"),
|
|
32
|
-
inputSchema: {
|
|
33
|
-
type: "object",
|
|
34
|
-
properties: {},
|
|
35
|
-
additionalProperties: false,
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
];
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=broker.behavior.info.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"broker.behavior.info.js","sourceRoot":"","sources":["../../../src/broker/behaviors/broker.behavior.info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACxF,OAAO,EAAE,iCAAiC,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAGrI;;;;;GAKG;AACH,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACxC,MAAM,CAAU,SAAS,GAAG,QAAQ,CAAC;IAE5C,YAAY,OAAsB;QAC9B,KAAK,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;YAClC,SAAS,EAAE,kBAAkB,CAAC,SAAS;SAC1C,CAAC,CAAC;IACP,CAAC;IAEkB,eAAe;QAC9B,OAAO;YACH;gBACI,GAAG,EAAE,eAAe;gBACpB,IAAI,EAAE,0BAA0B,CAAC,eAAe,CAAC;gBACjD,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE,iCAAiC,CAAC,eAAe,CAAC;aAClE;SACJ,CAAC;IACN,CAAC;IAEkB,WAAW;QAC1B,OAAO;YACH;gBACI,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,6BAA6B,CAAC,aAAa,CAAC;gBACzD,WAAW,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE;oBACd,oBAAoB,EAAE,KAAK;iBAC9B;aACJ;SACJ,CAAC;IACN,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { McpBehavior } from "@cyanmycelium/mcp-core";
|
|
2
|
-
import type { McpResource, McpResourceTemplate, McpTool } from "@cyanmycelium/mcp-core";
|
|
3
|
-
import type { BrokerContext } from "../broker.context.js";
|
|
4
|
-
/**
|
|
5
|
-
* Exposes the broker's provider slots so an MCP agent can discover what is
|
|
6
|
-
* currently routable behind the broker, with two tools:
|
|
7
|
-
*
|
|
8
|
-
* - `providers_list` — every slot (including disconnected ones).
|
|
9
|
-
* - `provider_status({ name })` — detail on one slot.
|
|
10
|
-
*
|
|
11
|
-
* Plus matching resources at `broker://providers` and `broker://providers/<name>`.
|
|
12
|
-
*/
|
|
13
|
-
export declare class BrokerProvidersBehavior extends McpBehavior {
|
|
14
|
-
static readonly NAMESPACE = "broker_providers";
|
|
15
|
-
constructor(context: BrokerContext);
|
|
16
|
-
protected _buildResources(): McpResource[];
|
|
17
|
-
protected _buildTemplate(): McpResourceTemplate[];
|
|
18
|
-
protected _buildTools(): McpTool[];
|
|
19
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { McpBehavior } from "@cyanmycelium/mcp-core";
|
|
2
|
-
import { BrokerProvidersAdapter, PROVIDERS_URI, PROVIDER_URI_TEMPLATE } from "../adapters/broker.adapter.providers.js";
|
|
3
|
-
import { brokerBaselinePropertyDescription, brokerBaselineResourceDescription, brokerBaselineResourceName, brokerBaselineResourceTemplateDescription, brokerBaselineResourceTemplateName, brokerBaselineToolDescription, } from "../broker.grammars.js";
|
|
4
|
-
/**
|
|
5
|
-
* Exposes the broker's provider slots so an MCP agent can discover what is
|
|
6
|
-
* currently routable behind the broker, with two tools:
|
|
7
|
-
*
|
|
8
|
-
* - `providers_list` — every slot (including disconnected ones).
|
|
9
|
-
* - `provider_status({ name })` — detail on one slot.
|
|
10
|
-
*
|
|
11
|
-
* Plus matching resources at `broker://providers` and `broker://providers/<name>`.
|
|
12
|
-
*/
|
|
13
|
-
export class BrokerProvidersBehavior extends McpBehavior {
|
|
14
|
-
static NAMESPACE = "broker_providers";
|
|
15
|
-
constructor(context) {
|
|
16
|
-
super(new BrokerProvidersAdapter(context), {
|
|
17
|
-
namespace: BrokerProvidersBehavior.NAMESPACE,
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
_buildResources() {
|
|
21
|
-
return [
|
|
22
|
-
{
|
|
23
|
-
uri: PROVIDERS_URI,
|
|
24
|
-
name: brokerBaselineResourceName(PROVIDERS_URI),
|
|
25
|
-
mimeType: "application/json",
|
|
26
|
-
description: brokerBaselineResourceDescription(PROVIDERS_URI),
|
|
27
|
-
},
|
|
28
|
-
];
|
|
29
|
-
}
|
|
30
|
-
_buildTemplate() {
|
|
31
|
-
return [
|
|
32
|
-
{
|
|
33
|
-
uriTemplate: PROVIDER_URI_TEMPLATE,
|
|
34
|
-
name: brokerBaselineResourceTemplateName(PROVIDER_URI_TEMPLATE),
|
|
35
|
-
mimeType: "application/json",
|
|
36
|
-
description: brokerBaselineResourceTemplateDescription(PROVIDER_URI_TEMPLATE),
|
|
37
|
-
},
|
|
38
|
-
];
|
|
39
|
-
}
|
|
40
|
-
_buildTools() {
|
|
41
|
-
return [
|
|
42
|
-
{
|
|
43
|
-
name: "providers_list",
|
|
44
|
-
description: brokerBaselineToolDescription("providers_list"),
|
|
45
|
-
inputSchema: {
|
|
46
|
-
type: "object",
|
|
47
|
-
properties: {},
|
|
48
|
-
additionalProperties: false,
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
name: "provider_status",
|
|
53
|
-
description: brokerBaselineToolDescription("provider_status"),
|
|
54
|
-
inputSchema: {
|
|
55
|
-
type: "object",
|
|
56
|
-
properties: {
|
|
57
|
-
name: {
|
|
58
|
-
type: "string",
|
|
59
|
-
description: brokerBaselinePropertyDescription("provider_status", "name"),
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
required: ["name"],
|
|
63
|
-
additionalProperties: false,
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
];
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=broker.behavior.providers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"broker.behavior.providers.js","sourceRoot":"","sources":["../../../src/broker/behaviors/broker.behavior.providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACvH,OAAO,EACH,iCAAiC,EACjC,iCAAiC,EACjC,0BAA0B,EAC1B,yCAAyC,EACzC,kCAAkC,EAClC,6BAA6B,GAChC,MAAM,uBAAuB,CAAC;AAG/B;;;;;;;;GAQG;AACH,MAAM,OAAO,uBAAwB,SAAQ,WAAW;IAC7C,MAAM,CAAU,SAAS,GAAG,kBAAkB,CAAC;IAEtD,YAAY,OAAsB;QAC9B,KAAK,CAAC,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE;YACvC,SAAS,EAAE,uBAAuB,CAAC,SAAS;SAC/C,CAAC,CAAC;IACP,CAAC;IAEkB,eAAe;QAC9B,OAAO;YACH;gBACI,GAAG,EAAE,aAAa;gBAClB,IAAI,EAAE,0BAA0B,CAAC,aAAa,CAAC;gBAC/C,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE,iCAAiC,CAAC,aAAa,CAAC;aAChE;SACJ,CAAC;IACN,CAAC;IAEkB,cAAc;QAC7B,OAAO;YACH;gBACI,WAAW,EAAE,qBAAqB;gBAClC,IAAI,EAAE,kCAAkC,CAAC,qBAAqB,CAAC;gBAC/D,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE,yCAAyC,CAAC,qBAAqB,CAAC;aAChF;SACJ,CAAC;IACN,CAAC;IAEkB,WAAW;QAC1B,OAAO;YACH;gBACI,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,6BAA6B,CAAC,gBAAgB,CAAC;gBAC5D,WAAW,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE;oBACd,oBAAoB,EAAE,KAAK;iBAC9B;aACJ;YACD;gBACI,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,6BAA6B,CAAC,iBAAiB,CAAC;gBAC7D,WAAW,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACR,IAAI,EAAE;4BACF,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,iCAAiC,CAAC,iBAAiB,EAAE,MAAM,CAAC;yBAC5E;qBACJ;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;oBAClB,oBAAoB,EAAE,KAAK;iBAC9B;aACJ;SACJ,CAAC;IACN,CAAC"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Read-only view of the broker's runtime state, exposed to broker behaviors.
|
|
3
|
-
*
|
|
4
|
-
* Decouples the behaviors from the concrete `WsTunnel` class, making them
|
|
5
|
-
* unit-testable and reusable (e.g. a future .NET-backed context).
|
|
6
|
-
*/
|
|
7
|
-
export interface BrokerContext {
|
|
8
|
-
/** Package version (from package.json). */
|
|
9
|
-
readonly version: string;
|
|
10
|
-
/** Logical broker name reported to MCP clients. */
|
|
11
|
-
readonly name: string;
|
|
12
|
-
/** Timestamp of the most recent successful `start()`, or `null` if never started. */
|
|
13
|
-
readonly startedAt: Date | null;
|
|
14
|
-
/** Seconds since `startedAt`, or `0` if not running. */
|
|
15
|
-
readonly uptimeSeconds: number;
|
|
16
|
-
/** Bind host. `undefined` means default (`0.0.0.0`). */
|
|
17
|
-
readonly host: string | undefined;
|
|
18
|
-
/** TCP port the broker is listening on. */
|
|
19
|
-
readonly port: number;
|
|
20
|
-
/** Whether TLS is active for the HTTP/WS server. */
|
|
21
|
-
readonly tls: boolean;
|
|
22
|
-
/** All configured URL paths, with defaults already substituted. */
|
|
23
|
-
readonly paths: {
|
|
24
|
-
provider: string;
|
|
25
|
-
providers: string;
|
|
26
|
-
client: string;
|
|
27
|
-
mcp: string;
|
|
28
|
-
sse: string;
|
|
29
|
-
messages: string;
|
|
30
|
-
};
|
|
31
|
-
/** Snapshot of every known provider slot, including disconnected ones. */
|
|
32
|
-
getProvidersInfo(): BrokerProviderInfo[];
|
|
33
|
-
/** Snapshot of a single provider slot, or `undefined` if the name is unknown. */
|
|
34
|
-
getProviderInfo(name: string): BrokerProviderInfo | undefined;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Transport kind currently feeding a provider slot.
|
|
38
|
-
*
|
|
39
|
-
* - `ws`: dedicated WebSocket provider (`/provider/<name>`).
|
|
40
|
-
* - `ws-multiplex`: multiplexed WebSocket envelope on `/providers`.
|
|
41
|
-
* - `stdio`: child process spawned at broker startup.
|
|
42
|
-
* - `loopback`: in-process transport (e.g. the broker exposing itself as `_broker`).
|
|
43
|
-
* - `none`: the slot was referenced by a client but no provider has attached yet.
|
|
44
|
-
*/
|
|
45
|
-
export type BrokerProviderTransport = "ws" | "ws-multiplex" | "stdio" | "loopback" | "none";
|
|
46
|
-
export interface BrokerProviderInfo {
|
|
47
|
-
/** Slot name as advertised on `/<name>/...` endpoints. */
|
|
48
|
-
name: string;
|
|
49
|
-
/** Which transport is currently feeding the slot. */
|
|
50
|
-
transport: BrokerProviderTransport;
|
|
51
|
-
/** `true` iff the slot is reachable for routing right now. */
|
|
52
|
-
connected: boolean;
|
|
53
|
-
/** Number of raw-WebSocket MCP clients on this slot. */
|
|
54
|
-
clientCount: number;
|
|
55
|
-
/** Number of long-lived sessions (SSE + Streamable HTTP GET streams). */
|
|
56
|
-
sessionCount: number;
|
|
57
|
-
/** Number of in-flight JSON-RPC requests awaiting a response. */
|
|
58
|
-
pendingCount: number;
|
|
59
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"broker.context.js","sourceRoot":"","sources":["../../src/broker/broker.context.ts"],"names":[],"mappings":""}
|