@dsh-cc/mcp-client 0.6.0 → 0.6.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.i18n.yaml +3 -3
- package/lib/registry.d.ts +11 -0
- package/lib/registry.d.ts.map +1 -1
- package/lib/registry.js +27 -0
- package/lib/registry.js.map +1 -1
- package/lib/tools.d.ts +1 -1
- package/lib/tools.js +1 -1
- package/package.json +4 -4
package/README.i18n.yaml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
|
|
2
2
|
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
3
|
# after editing either side, bring the other along and re-record with:
|
|
4
|
-
# pnpm
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
4
|
+
# pnpm check:readme --write
|
|
5
|
+
README.md: 56082ed650435edfad0ab56b3a75cb05418572f8
|
|
6
|
+
README.zh.md: 07ab20f026d2b821c6710b1b6fed7ea2d6b387d9
|
package/lib/registry.d.ts
CHANGED
|
@@ -45,10 +45,21 @@ export interface McpConnectionControl {
|
|
|
45
45
|
/** Tear down the current connection and establish a fresh one; the entry is marked `connecting` then `ready`/`error`. */
|
|
46
46
|
reconnect(): Promise<void>;
|
|
47
47
|
}
|
|
48
|
+
/** Listener invoked with a snapshot copy whenever a registry entry mutates. */
|
|
49
|
+
export type McpConnectionChangeListener = (entry: McpConnectionEntry) => void;
|
|
48
50
|
/** The `mcpConnections` service: enumerate and drive the registered MCP servers. */
|
|
49
51
|
export declare class McpConnectionsService extends Service {
|
|
50
52
|
/** Live instances keyed by `serverName`. */
|
|
51
53
|
private readonly managed;
|
|
54
|
+
private readonly listeners;
|
|
55
|
+
/**
|
|
56
|
+
* Subscribe to entry mutations (register / report / unregister). Each event
|
|
57
|
+
* delivers a snapshot COPY of the entry (mutating it does not affect the
|
|
58
|
+
* registry). Listener exceptions are contained and logged.
|
|
59
|
+
* @returns a disposer that stops delivery.
|
|
60
|
+
*/
|
|
61
|
+
onDidChange(listener: McpConnectionChangeListener): () => void;
|
|
62
|
+
private notify;
|
|
52
63
|
constructor(ctx: Context);
|
|
53
64
|
/**
|
|
54
65
|
* Register a live mcp-client instance's control surface, initially `connecting`.
|
package/lib/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE3D,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,iFAAiF;QACjF,cAAc,EAAE,qBAAqB,CAAA;KACtC;CACF;AAED,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,cAAc,CAAA;AAElF,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAA;IACZ,0CAA0C;IAC1C,KAAK,EAAE,kBAAkB,CAAA;IACzB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,yFAAyF;AACzF,MAAM,WAAW,oBAAoB;IACnC,gGAAgG;IAChG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,yHAAyH;IACzH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAQD,oFAAoF;AACpF,qBAAa,qBAAsB,SAAQ,OAAO;IAChD,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE3D,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,iFAAiF;QACjF,cAAc,EAAE,qBAAqB,CAAA;KACtC;CACF;AAED,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,cAAc,CAAA;AAElF,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAA;IACZ,0CAA0C;IAC1C,KAAK,EAAE,kBAAkB,CAAA;IACzB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,yFAAyF;AACzF,MAAM,WAAW,oBAAoB;IACnC,gGAAgG;IAChG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,yHAAyH;IACzH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAQD,+EAA+E;AAC/E,MAAM,MAAM,2BAA2B,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;AAE7E,oFAAoF;AACpF,qBAAa,qBAAsB,SAAQ,OAAO;IAChD,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IAEnE;;;;;OAKG;IACH,WAAW,CAAC,QAAQ,EAAE,2BAA2B,GAAG,MAAM,IAAI;IAK9D,OAAO,CAAC,MAAM;gBAWF,GAAG,EAAE,OAAO;IAIxB;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI;IAQnF,0DAA0D;IAC1D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM9B,+DAA+D;IAC/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,IAAI;IASpF,+DAA+D;IAC/D,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAKnD;;;;OAIG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQpF,mDAAmD;IACnD,OAAO,IAAI,kBAAkB,EAAE;IAI/B;;;;;OAKG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C;;;;OAIG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5C,OAAO,CAAC,OAAO;CAKhB"}
|
package/lib/registry.js
CHANGED
|
@@ -17,6 +17,28 @@ import { Service } from '@deepseek-ai/cordis';
|
|
|
17
17
|
export class McpConnectionsService extends Service {
|
|
18
18
|
/** Live instances keyed by `serverName`. */
|
|
19
19
|
managed = new Map();
|
|
20
|
+
listeners = new Set();
|
|
21
|
+
/**
|
|
22
|
+
* Subscribe to entry mutations (register / report / unregister). Each event
|
|
23
|
+
* delivers a snapshot COPY of the entry (mutating it does not affect the
|
|
24
|
+
* registry). Listener exceptions are contained and logged.
|
|
25
|
+
* @returns a disposer that stops delivery.
|
|
26
|
+
*/
|
|
27
|
+
onDidChange(listener) {
|
|
28
|
+
this.listeners.add(listener);
|
|
29
|
+
return () => { this.listeners.delete(listener); };
|
|
30
|
+
}
|
|
31
|
+
notify(entry) {
|
|
32
|
+
const snapshot = { ...entry };
|
|
33
|
+
for (const listener of this.listeners) {
|
|
34
|
+
try {
|
|
35
|
+
listener(snapshot);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
this.ctx.logger.warn(`mcpConnections: onDidChange listener failed: ${String(error)}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
20
42
|
constructor(ctx) {
|
|
21
43
|
super(ctx, 'mcpConnections');
|
|
22
44
|
}
|
|
@@ -31,9 +53,13 @@ export class McpConnectionsService extends Service {
|
|
|
31
53
|
throw new Error(`mcpConnections: server "${name}" is already registered by another mcp-client instance`);
|
|
32
54
|
}
|
|
33
55
|
this.managed.set(name, { entry: { name, state: 'connecting', ...authRequired === undefined ? {} : { authRequired } }, control });
|
|
56
|
+
this.notify(this.managed.get(name).entry);
|
|
34
57
|
}
|
|
35
58
|
/** Remove an instance (on teardown / full disconnect). */
|
|
36
59
|
unregister(name) {
|
|
60
|
+
const managed = this.managed.get(name);
|
|
61
|
+
if (managed)
|
|
62
|
+
this.notify(managed.entry);
|
|
37
63
|
this.managed.delete(name);
|
|
38
64
|
}
|
|
39
65
|
/** Report a lifecycle transition for a registered instance. */
|
|
@@ -46,6 +72,7 @@ export class McpConnectionsService extends Service {
|
|
|
46
72
|
managed.entry.error = info.error;
|
|
47
73
|
if (state === 'ready' || state === 'connecting')
|
|
48
74
|
delete managed.entry.error;
|
|
75
|
+
this.notify(managed.entry);
|
|
49
76
|
}
|
|
50
77
|
/** Record the current tool count for a registered instance. */
|
|
51
78
|
setToolCount(name, toolCount) {
|
package/lib/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAgB,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/lib/tools.d.ts
CHANGED
|
@@ -149,7 +149,7 @@ export declare function syncTools(client: Client, ctx: Context, opts: ToolBridge
|
|
|
149
149
|
* Run an MCP request, retrying once on a mid-session `UnauthorizedError`.
|
|
150
150
|
* Between the original attempt and the retry, `onUnauthorized` runs to drop
|
|
151
151
|
* stale OAuth state and re-establish a token. Only a single retry is attempted
|
|
152
|
-
* (the spec's "401
|
|
152
|
+
* (the spec's "retry once automatically on a 401"); a second failure propagates to the caller.
|
|
153
153
|
*
|
|
154
154
|
* @param request - the MCP request to attempt.
|
|
155
155
|
* @param onUnauthorized - re-auth hook run before the single retry.
|
package/lib/tools.js
CHANGED
|
@@ -258,7 +258,7 @@ function createOutput(rawName, structuredSchema) {
|
|
|
258
258
|
* Run an MCP request, retrying once on a mid-session `UnauthorizedError`.
|
|
259
259
|
* Between the original attempt and the retry, `onUnauthorized` runs to drop
|
|
260
260
|
* stale OAuth state and re-establish a token. Only a single retry is attempted
|
|
261
|
-
* (the spec's "401
|
|
261
|
+
* (the spec's "retry once automatically on a 401"); a second failure propagates to the caller.
|
|
262
262
|
*
|
|
263
263
|
* @param request - the MCP request to attempt.
|
|
264
264
|
* @param onUnauthorized - re-auth hook run before the single retry.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dsh-cc/mcp-client",
|
|
3
3
|
"description": "MCP client bridge: connects to MCP servers and registers their tools on ctx.tools",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.2",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/dsh-cc/dsh-cc.git",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"@deepseek-ai/dsh-timeout": ">=0.1.2-rc.1",
|
|
34
34
|
"@deepseek-ai/cordis": ">=0.1.2-rc.1",
|
|
35
35
|
"@deepseek-ai/schemastery": "^3.18.1",
|
|
36
|
-
"@dsh-cc/tools": "^0.6.
|
|
36
|
+
"@dsh-cc/tools": "^0.6.2"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"@deepseek-ai/schemastery": "link:../../../../deepseek-harness/vendor/schemastery",
|
|
54
54
|
"@deepseek-ai/cordis-plugin-loader": "link:../../../../deepseek-harness/vendor/loader",
|
|
55
55
|
"@deepseek-ai/dsh-system-prompt": "link:../../../../deepseek-harness/packages/core/system-prompt",
|
|
56
|
-
"@dsh-cc/tools": "^0.6.
|
|
57
|
-
"@dsh-cc/tool-search": "^0.6.
|
|
56
|
+
"@dsh-cc/tools": "^0.6.2",
|
|
57
|
+
"@dsh-cc/tool-search": "^0.6.2"
|
|
58
58
|
},
|
|
59
59
|
"publishConfig": {
|
|
60
60
|
"access": "public"
|