@moxxy/plugin-mcp 0.28.0 → 0.29.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/dist/admin/config-io.d.ts.map +1 -1
- package/dist/admin/config-io.js +4 -2
- package/dist/admin/config-io.js.map +1 -1
- package/dist/admin/index.js +8 -6
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/runtime.d.ts.map +1 -1
- package/dist/admin/runtime.js +6 -3
- package/dist/admin/runtime.js.map +1 -1
- package/package.json +4 -4
- package/src/admin/config-io.ts +4 -2
- package/src/admin/index.ts +8 -6
- package/src/admin/runtime.test.ts +3 -1
- package/src/admin/runtime.ts +6 -2
- package/src/admin/skill.test.ts +23 -11
- package/src/discovery.test.ts +6 -1
- package/src/index.test.ts +15 -4
- package/src/wrap.test.ts +56 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-io.d.ts","sourceRoot":"","sources":["../../src/admin/config-io.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnE;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AASD,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC,CAwB9D;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,EAAE,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC,GACjH,OAAO,CAAC,CAAC,CAAC,CAOZ;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"config-io.d.ts","sourceRoot":"","sources":["../../src/admin/config-io.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnE;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AASD,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC,CAwB9D;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,EAAE,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC,GACjH,OAAO,CAAC,CAAC,CAAC,CAOZ;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAYxG;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ3E"}
|
package/dist/admin/config-io.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
|
-
import { createMutex } from '@moxxy/sdk';
|
|
2
|
+
import { assertDefined, createMutex } from '@moxxy/sdk';
|
|
3
3
|
import { moxxyPath, writeFileAtomic } from '@moxxy/sdk/server';
|
|
4
4
|
import { mcpStoredConfigRootSchema, mcpStoredServerSchema } from './config-schema.js';
|
|
5
5
|
/**
|
|
@@ -85,7 +85,9 @@ export async function setServerDisabled(name, disabled) {
|
|
|
85
85
|
// Unknown name → same reference skips the write (mutateMcpConfig no-op).
|
|
86
86
|
if (idx < 0)
|
|
87
87
|
return { next: cfg, result: null };
|
|
88
|
-
const
|
|
88
|
+
const existing = cfg.servers[idx];
|
|
89
|
+
assertDefined(existing, `mcp server at index ${idx} must exist (findIndex matched name "${name}")`);
|
|
90
|
+
const updated = { ...existing, disabled };
|
|
89
91
|
const nextServers = [...cfg.servers];
|
|
90
92
|
nextServers[idx] = updated;
|
|
91
93
|
return { next: { servers: nextServers }, result: updated };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-io.js","sourceRoot":"","sources":["../../src/admin/config-io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config-io.js","sourceRoot":"","sources":["../../src/admin/config-io.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/index.js
CHANGED
|
@@ -146,9 +146,10 @@ function buildMcpAdminPluginInternal(opts) {
|
|
|
146
146
|
return await runtime.refreshServerCache(server);
|
|
147
147
|
}
|
|
148
148
|
catch (err) {
|
|
149
|
-
log?.warn
|
|
150
|
-
|
|
151
|
-
|
|
149
|
+
if (log?.warn)
|
|
150
|
+
log.warn(`mcp: failed to refresh cache for "${server.name}"`, {
|
|
151
|
+
err: err instanceof Error ? err.message : String(err),
|
|
152
|
+
});
|
|
152
153
|
return null;
|
|
153
154
|
}
|
|
154
155
|
}));
|
|
@@ -162,9 +163,10 @@ function buildMcpAdminPluginInternal(opts) {
|
|
|
162
163
|
runtime.attachServerLazy(entry);
|
|
163
164
|
}
|
|
164
165
|
catch (err) {
|
|
165
|
-
log?.warn
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
if (log?.warn)
|
|
167
|
+
log.warn(`mcp: failed to attach lazy stubs for "${entry.name}"`, {
|
|
168
|
+
err: err instanceof Error ? err.message : String(err),
|
|
169
|
+
});
|
|
168
170
|
}
|
|
169
171
|
}
|
|
170
172
|
},
|
package/dist/admin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoC,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAoBtD,OAAO,EACL,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAA0B,MAAM,cAAc,CAAC;AAE5E,MAAM,UAAU,0BAA0B,CACxC,OAAmC,EAAE,YAAY,EAAE,IAAI,EAAE;IAEzD,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAmC,EAAE,YAAY,EAAE,IAAI,EAAE;IAC3F,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB,CAAmB,GAAmB,EAAE,KAAa;IAC7E,OAAO,IAAI,KAAK,CAAC,EAAO,EAAE;QACxB,GAAG,CAAC,OAAO,EAAE,IAAI;YACf,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,qDAAqD,CAAC,CAAC;YACzG,CAAC;YACD,MAAM,KAAK,GAAI,QAAwD,CAAC,IAAI,CAAC,CAAC;YAC9E,OAAO,OAAO,KAAK,KAAK,UAAU;gBAChC,CAAC,CAAE,KAAyC,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAC3D,CAAC,CAAC,KAAK,CAAC;QACZ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAW,CAAC,GAAG,EAAE;IAC1C,IAAI,aAAa,GAAiC,IAAI,CAAC;IACvD,IAAI,cAAc,GAAkC,IAAI,CAAC;IACzD,IAAI,eAAe,GAA6B,IAAI,CAAC;IAErD,MAAM,SAAS,GAAG,iBAAiB,CAAwB,GAAG,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,iBAAiB,CAAyB,GAAG,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC7F,MAAM,cAAc,GAAsB,CAAC,KAAK,EAAE,EAAE,CAClD,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEpE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,0BAA0B,CAAC;QACjD,YAAY,EAAE,SAAS;QACvB,aAAa,EAAE,UAAU;QACzB,cAAc;KACf,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;IAEzC,MAAM,KAAK,GAAmB;QAC5B,GAAG,MAAM,CAAC,KAAK;QACf,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpB,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAwB,OAAO,CAAC,IAAI,IAAI,CAAC;YACzE,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAyB,QAAQ,CAAC,IAAI,IAAI,CAAC;YAC5E,eAAe,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAoB,gBAAgB,CAAC,IAAI,IAAI,CAAC;YAChF,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YACvC,wEAAwE;YACxE,MAAM,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC;IAEF,OAAO,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,CAAC,CAAC,EAAE,CAAC;AAEL;;;;;GAKG;AACH,SAAS,2BAA2B,CAClC,IAAgC;IAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;IACnC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC;IAEnD,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;IAC/D,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;IAEvF,MAAM,GAAG,GAAgB;QACvB,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YACxB,IAAI,KAAK,GAAoB,KAAK,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzD,KAAK,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC;YACD,OAAO,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,EAAE,OAAO,CAAC,YAAY;QAC5B,WAAW,EAAE,KAAK,IAAI,EAAE;YACtB,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAC;YAClC,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI;gBAC5B,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;aACxC,CAAC,CAAC,CAAC;QACN,CAAC;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE;YACL,oBAAoB,EAAE;YACtB,kBAAkB,CAAC;gBACjB,QAAQ;gBACR,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,kBAAkB;aACnB,CAAC;YACF,qBAAqB,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;YAC7D,mBAAmB,CAAC,EAAE,cAAc,EAAE,CAAC;SACxC;QACD,KAAK,EAAE;YACL,mEAAmE;YACnE,gEAAgE;YAChE,+DAA+D;YAC/D,iEAAiE;YACjE,2DAA2D;YAC3D,+DAA+D;YAC/D,qDAAqD;YACrD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBACpB,IAAI,CAAC,QAAQ;oBAAE,OAAO;gBACtB,MAAM,GAAG,GAAI,GAAoE,CAAC,MAAM,CAAC;gBACzF,IAAI,GAAoB,CAAC;gBACzB,IAAI,CAAC;oBACH,GAAG,GAAG,MAAM,aAAa,EAAE,CAAC;gBAC9B,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;gBACT,CAAC;gBACD,4DAA4D;gBAC5D,mEAAmE;gBACnE,sEAAsE;gBACtE,sEAAsE;gBACtE,oEAAoE;gBACpE,8CAA8C;gBAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACtD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAmC,EAAE;oBAC3D,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;wBAAE,OAAO,MAAM,CAAC;oBACvE,IAAI,CAAC;wBACH,OAAO,MAAM,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;oBAClD,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,GAAG,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/admin/runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKrF,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACjD,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC;QAC7C,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACjC,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;KAC/C,CAAC,CAAC;IACH,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG;QAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;IAChF,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACtE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACpD;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,qBAAqB,GAAG,IAAI,EACtC,OAAO,GAAE,iBAAsB,GAC9B,UAAU,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/admin/runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKrF,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACjD,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC;QAC7C,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACjC,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;KAC/C,CAAC,CAAC;IACH,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG;QAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;IAChF,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACtE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACpD;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,qBAAqB,GAAG,IAAI,EACtC,OAAO,GAAE,iBAAsB,GAC9B,UAAU,CAmNZ"}
|
package/dist/admin/runtime.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MoxxyError } from '@moxxy/sdk';
|
|
1
|
+
import { assertDefined, MoxxyError } from '@moxxy/sdk';
|
|
2
2
|
import { defaultClientFactory } from '../client.js';
|
|
3
3
|
import { MCP_CONNECT_TIMEOUT_MS, withTimeout } from '../timeout.js';
|
|
4
4
|
import { wrapMcpServerToolsLazy } from '../wrap.js';
|
|
@@ -76,8 +76,11 @@ export function createMcpRuntime(registry, options = {}) {
|
|
|
76
76
|
const attachServerLazy = (server) => {
|
|
77
77
|
if (!registry)
|
|
78
78
|
return { toolNames: [] };
|
|
79
|
-
if (runtimes.has(server.name))
|
|
80
|
-
|
|
79
|
+
if (runtimes.has(server.name)) {
|
|
80
|
+
const existing = runtimes.get(server.name);
|
|
81
|
+
assertDefined(existing, `runtime for "${server.name}" must exist (has() returned true)`);
|
|
82
|
+
return { toolNames: existing.toolNames };
|
|
83
|
+
}
|
|
81
84
|
const descriptors = server.cachedTools ?? [];
|
|
82
85
|
if (descriptors.length === 0) {
|
|
83
86
|
return { toolNames: [] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/admin/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/admin/runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moxxy/plugin-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
4
|
"description": "MCP (Model Context Protocol) client plugin for moxxy — connect to MCP servers and surface their tools.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"moxxy",
|
|
@@ -45,14 +45,14 @@
|
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
47
47
|
"zod": "^3.24.0",
|
|
48
|
-
"@moxxy/sdk": "0.
|
|
48
|
+
"@moxxy/sdk": "0.29.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@types/node": "^22.10.0",
|
|
52
52
|
"typescript": "^5.7.3",
|
|
53
53
|
"vitest": "^2.1.8",
|
|
54
|
-
"@moxxy/
|
|
55
|
-
"@moxxy/
|
|
54
|
+
"@moxxy/tsconfig": "0.0.0",
|
|
55
|
+
"@moxxy/vitest-preset": "0.0.0"
|
|
56
56
|
},
|
|
57
57
|
"scripts": {
|
|
58
58
|
"build": "tsc -p tsconfig.json",
|
package/src/admin/config-io.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
|
-
import { createMutex } from '@moxxy/sdk';
|
|
2
|
+
import { assertDefined, createMutex } from '@moxxy/sdk';
|
|
3
3
|
import { moxxyPath, writeFileAtomic } from '@moxxy/sdk/server';
|
|
4
4
|
import { mcpStoredConfigRootSchema, mcpStoredServerSchema } from './config-schema.js';
|
|
5
5
|
import type { McpStoredConfig, McpStoredServer } from './types.js';
|
|
@@ -90,7 +90,9 @@ export async function setServerDisabled(name: string, disabled: boolean): Promis
|
|
|
90
90
|
const idx = cfg.servers.findIndex((s) => s.name === name);
|
|
91
91
|
// Unknown name → same reference skips the write (mutateMcpConfig no-op).
|
|
92
92
|
if (idx < 0) return { next: cfg, result: null };
|
|
93
|
-
const
|
|
93
|
+
const existing = cfg.servers[idx];
|
|
94
|
+
assertDefined(existing, `mcp server at index ${idx} must exist (findIndex matched name "${name}")`);
|
|
95
|
+
const updated: McpStoredServer = { ...existing, disabled };
|
|
94
96
|
const nextServers = [...cfg.servers];
|
|
95
97
|
nextServers[idx] = updated;
|
|
96
98
|
return { next: { servers: nextServers }, result: updated };
|
package/src/admin/index.ts
CHANGED
|
@@ -185,9 +185,10 @@ function buildMcpAdminPluginInternal(
|
|
|
185
185
|
try {
|
|
186
186
|
return await runtime.refreshServerCache(server);
|
|
187
187
|
} catch (err) {
|
|
188
|
-
log?.warn
|
|
189
|
-
|
|
190
|
-
|
|
188
|
+
if (log?.warn)
|
|
189
|
+
log.warn(`mcp: failed to refresh cache for "${server.name}"`, {
|
|
190
|
+
err: err instanceof Error ? err.message : String(err),
|
|
191
|
+
});
|
|
191
192
|
return null;
|
|
192
193
|
}
|
|
193
194
|
}),
|
|
@@ -200,9 +201,10 @@ function buildMcpAdminPluginInternal(
|
|
|
200
201
|
try {
|
|
201
202
|
runtime.attachServerLazy(entry);
|
|
202
203
|
} catch (err) {
|
|
203
|
-
log?.warn
|
|
204
|
-
|
|
205
|
-
|
|
204
|
+
if (log?.warn)
|
|
205
|
+
log.warn(`mcp: failed to attach lazy stubs for "${entry.name}"`, {
|
|
206
|
+
err: err instanceof Error ? err.message : String(err),
|
|
207
|
+
});
|
|
206
208
|
}
|
|
207
209
|
}
|
|
208
210
|
},
|
|
@@ -2,6 +2,7 @@ import { mkdtemp, rm } from 'node:fs/promises';
|
|
|
2
2
|
import { tmpdir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { assertDefined } from '@moxxy/sdk';
|
|
5
6
|
import type { McpClientLike, McpServerConfig, McpToolDescriptor } from '../types.js';
|
|
6
7
|
import type { AdminToolRegistryLike, McpStoredServer } from './types.js';
|
|
7
8
|
|
|
@@ -162,7 +163,8 @@ describe('admin/runtime', () => {
|
|
|
162
163
|
const registry = makeRegistry();
|
|
163
164
|
const rt = createMcpRuntime(registry);
|
|
164
165
|
rt.attachServerLazy(stored());
|
|
165
|
-
const handle = rt.runtimes.get('demo')
|
|
166
|
+
const handle = rt.runtimes.get('demo');
|
|
167
|
+
assertDefined(handle, "runtime 'demo' registered by attachServerLazy");
|
|
166
168
|
// Closing before any tool runs must not connect or throw.
|
|
167
169
|
await handle.client.close();
|
|
168
170
|
expect(hoisted.connectCalls).toHaveLength(0);
|
package/src/admin/runtime.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MoxxyError } from '@moxxy/sdk';
|
|
1
|
+
import { assertDefined, MoxxyError } from '@moxxy/sdk';
|
|
2
2
|
import type { McpClientLike, McpServerConfig, McpToolDescriptor } from '../types.js';
|
|
3
3
|
import { defaultClientFactory } from '../client.js';
|
|
4
4
|
import { MCP_CONNECT_TIMEOUT_MS, withTimeout } from '../timeout.js';
|
|
@@ -115,7 +115,11 @@ export function createMcpRuntime(
|
|
|
115
115
|
*/
|
|
116
116
|
const attachServerLazy: McpRuntime['attachServerLazy'] = (server) => {
|
|
117
117
|
if (!registry) return { toolNames: [] };
|
|
118
|
-
if (runtimes.has(server.name))
|
|
118
|
+
if (runtimes.has(server.name)) {
|
|
119
|
+
const existing = runtimes.get(server.name);
|
|
120
|
+
assertDefined(existing, `runtime for "${server.name}" must exist (has() returned true)`);
|
|
121
|
+
return { toolNames: existing.toolNames };
|
|
122
|
+
}
|
|
119
123
|
const descriptors = server.cachedTools ?? [];
|
|
120
124
|
if (descriptors.length === 0) {
|
|
121
125
|
return { toolNames: [] };
|
package/src/admin/skill.test.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { readFile } from 'node:fs/promises';
|
|
|
2
2
|
import { mkdtemp, rm } from 'node:fs/promises';
|
|
3
3
|
import { tmpdir } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
+
import { assertDefined } from '@moxxy/sdk';
|
|
5
6
|
import type { Skill } from '@moxxy/sdk';
|
|
6
7
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
7
8
|
import type { McpServerConfig, McpToolDescriptor } from '../types.js';
|
|
@@ -22,20 +23,27 @@ function parseFrontmatter(raw: string): { fm: Record<string, unknown>; body: str
|
|
|
22
23
|
const fm: Record<string, unknown> = {};
|
|
23
24
|
const lines = fmText.split('\n');
|
|
24
25
|
for (let i = 0; i < lines.length; i++) {
|
|
25
|
-
const line = lines[i]
|
|
26
|
+
const line = lines[i];
|
|
27
|
+
assertDefined(line, 'frontmatter line present within bounds');
|
|
26
28
|
if (!line.trim()) continue;
|
|
27
29
|
const m = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line);
|
|
28
30
|
if (!m) throw new Error(`unparseable frontmatter line: ${JSON.stringify(line)}`);
|
|
29
31
|
const [, key, val] = m;
|
|
32
|
+
assertDefined(key, 'regex capture group 1 present when the line matched');
|
|
30
33
|
if (val) {
|
|
31
|
-
fm[key
|
|
34
|
+
fm[key] = val;
|
|
32
35
|
} else {
|
|
33
36
|
const items: string[] = [];
|
|
34
|
-
while (i + 1 < lines.length
|
|
37
|
+
while (i + 1 < lines.length) {
|
|
38
|
+
const next = lines[i + 1];
|
|
39
|
+
assertDefined(next, 'next frontmatter line present within bounds');
|
|
40
|
+
if (!/^\s+-\s/.test(next)) break;
|
|
35
41
|
i++;
|
|
36
|
-
|
|
42
|
+
const item = lines[i];
|
|
43
|
+
assertDefined(item, 'frontmatter sequence item present');
|
|
44
|
+
items.push(item.replace(/^\s+-\s*/, '').replace(/^"(.*)"$/, '$1'));
|
|
37
45
|
}
|
|
38
|
-
fm[key
|
|
46
|
+
fm[key] = items;
|
|
39
47
|
}
|
|
40
48
|
}
|
|
41
49
|
return { fm, body };
|
|
@@ -73,10 +81,11 @@ describe('admin/skill (createMcpUsageSkillWriter)', () => {
|
|
|
73
81
|
const write = createMcpUsageSkillWriter({ skillRegistry: registry, userSkillsDir: dir });
|
|
74
82
|
const result = await write(server, DESCRIPTORS);
|
|
75
83
|
expect(result).not.toBeNull();
|
|
76
|
-
|
|
77
|
-
expect(result
|
|
84
|
+
assertDefined(result, 'write() returns a result for a fresh skill');
|
|
85
|
+
expect(result.skillName).toBe('acme-mcp');
|
|
86
|
+
expect(result.path).toBe(join(dir, 'acme-mcp.md'));
|
|
78
87
|
|
|
79
|
-
const raw = await readFile(result
|
|
88
|
+
const raw = await readFile(result.path, 'utf8');
|
|
80
89
|
const { fm, body } = parseFrontmatter(raw);
|
|
81
90
|
expect(fm.name).toBe('acme-mcp');
|
|
82
91
|
expect(fm.description).toBe('Use the acme MCP server (2 tools).');
|
|
@@ -95,7 +104,8 @@ describe('admin/skill (createMcpUsageSkillWriter)', () => {
|
|
|
95
104
|
const write = createMcpUsageSkillWriter({ skillRegistry: registry, userSkillsDir: dir });
|
|
96
105
|
await write(server, DESCRIPTORS);
|
|
97
106
|
expect(registry.registered).toHaveLength(1);
|
|
98
|
-
const skill = registry.registered[0]
|
|
107
|
+
const skill = registry.registered[0];
|
|
108
|
+
assertDefined(skill, 'first registered skill present');
|
|
99
109
|
expect(skill.id).toBe('user/acme-mcp');
|
|
100
110
|
expect(skill.scope).toBe('user');
|
|
101
111
|
expect(skill.path).toBe(join(dir, 'acme-mcp.md'));
|
|
@@ -119,7 +129,8 @@ describe('admin/skill (createMcpUsageSkillWriter)', () => {
|
|
|
119
129
|
const write = createMcpUsageSkillWriter({ skillRegistry: null, userSkillsDir: dir });
|
|
120
130
|
const result = await write(server, DESCRIPTORS);
|
|
121
131
|
expect(result).not.toBeNull();
|
|
122
|
-
|
|
132
|
+
assertDefined(result, 'write() returns a result even with no registry');
|
|
133
|
+
const raw = await readFile(result.path, 'utf8');
|
|
123
134
|
expect(raw).toContain('name: acme-mcp');
|
|
124
135
|
});
|
|
125
136
|
|
|
@@ -131,7 +142,8 @@ describe('admin/skill (createMcpUsageSkillWriter)', () => {
|
|
|
131
142
|
}));
|
|
132
143
|
const write = createMcpUsageSkillWriter({ skillRegistry: null, userSkillsDir: dir });
|
|
133
144
|
const result = await write(server, many);
|
|
134
|
-
|
|
145
|
+
assertDefined(result, 'write() returns a result for a fresh skill');
|
|
146
|
+
const raw = await readFile(result.path, 'utf8');
|
|
135
147
|
const { fm, body } = parseFrontmatter(raw);
|
|
136
148
|
expect(fm.description).toBe('Use the acme MCP server (5 tools).');
|
|
137
149
|
expect((fm['allowed-tools'] as string[])).toHaveLength(5);
|
package/src/discovery.test.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { assertDefined } from '@moxxy/sdk';
|
|
2
3
|
import type { ServiceRegistry } from '@moxxy/sdk';
|
|
3
4
|
import { mcpAdminPlugin } from './index.js';
|
|
4
5
|
|
|
@@ -35,7 +36,11 @@ describe('mcpAdminPlugin (discovery-loadable)', () => {
|
|
|
35
36
|
|
|
36
37
|
// The inner onInit reads ~/.moxxy/mcp.json (absent on CI → caught + skipped);
|
|
37
38
|
// we only assert the service wiring here.
|
|
38
|
-
|
|
39
|
+
const hooks = mcpAdminPlugin.hooks;
|
|
40
|
+
assertDefined(hooks, 'mcpAdminPlugin.hooks present');
|
|
41
|
+
const onInit = hooks.onInit;
|
|
42
|
+
assertDefined(onInit, 'mcpAdminPlugin onInit hook present');
|
|
43
|
+
await onInit({ services } as never);
|
|
39
44
|
|
|
40
45
|
expect(get).toHaveBeenCalledWith('tools');
|
|
41
46
|
expect(get).toHaveBeenCalledWith('skills');
|
package/src/index.test.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { assertDefined } from '@moxxy/sdk';
|
|
2
3
|
import { createMcpPlugin } from './index.js';
|
|
3
4
|
import type { McpClientLike } from './types.js';
|
|
4
5
|
|
|
@@ -24,7 +25,11 @@ describe('createMcpPlugin', () => {
|
|
|
24
25
|
});
|
|
25
26
|
expect(plugin.name).toBe('@moxxy/plugin-mcp');
|
|
26
27
|
expect(plugin.tools).toHaveLength(1);
|
|
27
|
-
|
|
28
|
+
const tools = plugin.tools;
|
|
29
|
+
assertDefined(tools, 'plugin.tools present after createMcpPlugin');
|
|
30
|
+
const first = tools[0];
|
|
31
|
+
assertDefined(first, 'first mcp tool present');
|
|
32
|
+
expect(first.name).toBe('mcp__demo__ping');
|
|
28
33
|
});
|
|
29
34
|
|
|
30
35
|
it('aggregates tools across multiple servers', async () => {
|
|
@@ -36,7 +41,9 @@ describe('createMcpPlugin', () => {
|
|
|
36
41
|
clientFactory: async () => fakeClient,
|
|
37
42
|
});
|
|
38
43
|
expect(plugin.tools).toHaveLength(2);
|
|
39
|
-
|
|
44
|
+
const tools = plugin.tools;
|
|
45
|
+
assertDefined(tools, 'plugin.tools present after createMcpPlugin');
|
|
46
|
+
expect(tools.map((t) => t.name)).toEqual(['mcp__a__ping', 'mcp__b__ping']);
|
|
40
47
|
});
|
|
41
48
|
|
|
42
49
|
it('connects servers in parallel and bounds boot at the slowest, not the sum (u86-5)', async () => {
|
|
@@ -59,7 +66,9 @@ describe('createMcpPlugin', () => {
|
|
|
59
66
|
clientFactory: async (s) => slowClient(s.name),
|
|
60
67
|
});
|
|
61
68
|
const elapsed = Date.now() - start;
|
|
62
|
-
|
|
69
|
+
const tools = plugin.tools;
|
|
70
|
+
assertDefined(tools, 'plugin.tools present after createMcpPlugin');
|
|
71
|
+
expect(tools.map((t) => t.name)).toEqual(['mcp__a__ping', 'mcp__b__ping']);
|
|
63
72
|
expect(elapsed).toBeLessThan(90); // < the ~100ms serial sum
|
|
64
73
|
});
|
|
65
74
|
|
|
@@ -89,7 +98,9 @@ describe('createMcpPlugin', () => {
|
|
|
89
98
|
servers: [{ name: 'a', command: 'noop' }, { name: 'b', command: 'noop' }],
|
|
90
99
|
clientFactory: async () => c,
|
|
91
100
|
});
|
|
92
|
-
|
|
101
|
+
const hooks = plugin.hooks;
|
|
102
|
+
assertDefined(hooks, 'plugin.hooks registered by createMcpPlugin');
|
|
103
|
+
await hooks.onShutdown?.({} as never);
|
|
93
104
|
expect(closed).toBe(2);
|
|
94
105
|
});
|
|
95
106
|
});
|
package/src/wrap.test.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
2
|
import { wrapMcpServerTools, wrapMcpServerToolsLazy } from './wrap.js';
|
|
3
3
|
import type { McpClientLike, McpToolDescriptor } from './types.js';
|
|
4
|
-
import { asSessionId, asToolCallId, asTurnId } from '@moxxy/sdk';
|
|
4
|
+
import { asSessionId, asToolCallId, asTurnId, assertDefined } from '@moxxy/sdk';
|
|
5
5
|
|
|
6
6
|
const baseCtx = () => ({
|
|
7
7
|
sessionId: asSessionId('s'),
|
|
@@ -52,15 +52,19 @@ describe('wrapMcpServerTools', () => {
|
|
|
52
52
|
client,
|
|
53
53
|
});
|
|
54
54
|
expect(tools).toHaveLength(2);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
const t0 = tools[0];
|
|
56
|
+
assertDefined(t0, 'first wrapped mcp tool present');
|
|
57
|
+
const t1 = tools[1];
|
|
58
|
+
assertDefined(t1, 'second wrapped mcp tool present');
|
|
59
|
+
expect(t0.name).toBe('mcp__demo__fetch');
|
|
60
|
+
expect(t0.description).toBe('Fetch a URL');
|
|
61
|
+
expect(t0.inputJsonSchema).toEqual({
|
|
58
62
|
type: 'object',
|
|
59
63
|
properties: { url: { type: 'string' } },
|
|
60
64
|
required: ['url'],
|
|
61
65
|
});
|
|
62
|
-
expect(
|
|
63
|
-
expect(
|
|
66
|
+
expect(t1.name).toBe('mcp__demo__shell');
|
|
67
|
+
expect(t1.description).toContain('shell');
|
|
64
68
|
});
|
|
65
69
|
|
|
66
70
|
it('routes tool invocations through callTool and stringifies the content', async () => {
|
|
@@ -69,7 +73,9 @@ describe('wrapMcpServerTools', () => {
|
|
|
69
73
|
server: { name: 'demo', command: 'noop' },
|
|
70
74
|
client,
|
|
71
75
|
});
|
|
72
|
-
const
|
|
76
|
+
const first = tools[0];
|
|
77
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
78
|
+
const result = await first.handler({ url: 'https://x' }, baseCtx());
|
|
73
79
|
expect(result).toBe('called fetch');
|
|
74
80
|
expect(client.calls).toEqual([{ name: 'fetch', arguments: { url: 'https://x' } }]);
|
|
75
81
|
});
|
|
@@ -84,7 +90,9 @@ describe('wrapMcpServerTools', () => {
|
|
|
84
90
|
server: { name: 'demo', command: 'noop' },
|
|
85
91
|
client,
|
|
86
92
|
});
|
|
87
|
-
const
|
|
93
|
+
const first = tools[0];
|
|
94
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
95
|
+
const result = await first.handler({ url: 'https://x' }, baseCtx());
|
|
88
96
|
expect(result).toBe('[error] no permission');
|
|
89
97
|
});
|
|
90
98
|
|
|
@@ -95,7 +103,9 @@ describe('wrapMcpServerTools', () => {
|
|
|
95
103
|
isError: false,
|
|
96
104
|
} as never);
|
|
97
105
|
const tools = await wrapMcpServerTools({ server: { name: 'demo', command: 'noop' }, client });
|
|
98
|
-
const
|
|
106
|
+
const first = tools[0];
|
|
107
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
108
|
+
const result = await first.handler({ url: 'x' }, baseCtx());
|
|
99
109
|
expect(result).toBe('hello body');
|
|
100
110
|
});
|
|
101
111
|
|
|
@@ -106,7 +116,9 @@ describe('wrapMcpServerTools', () => {
|
|
|
106
116
|
isError: false,
|
|
107
117
|
} as never);
|
|
108
118
|
const tools = await wrapMcpServerTools({ server: { name: 'demo', command: 'noop' }, client });
|
|
109
|
-
const
|
|
119
|
+
const first = tools[0];
|
|
120
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
121
|
+
const result = await first.handler({ url: 'x' }, baseCtx());
|
|
110
122
|
expect(result).toBe('[resource:file:///a.bin application/octet-stream]');
|
|
111
123
|
});
|
|
112
124
|
|
|
@@ -117,7 +129,9 @@ describe('wrapMcpServerTools', () => {
|
|
|
117
129
|
isError: false,
|
|
118
130
|
} as never);
|
|
119
131
|
const tools = await wrapMcpServerTools({ server: { name: 'demo', command: 'noop' }, client });
|
|
120
|
-
const
|
|
132
|
+
const first = tools[0];
|
|
133
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
134
|
+
const result = await first.handler({ url: 'x' }, baseCtx());
|
|
121
135
|
expect(result).toBe('[image:image/png]');
|
|
122
136
|
});
|
|
123
137
|
|
|
@@ -128,7 +142,9 @@ describe('wrapMcpServerTools', () => {
|
|
|
128
142
|
client,
|
|
129
143
|
toolNamePrefix: (s, t) => `x_${s}_${t}`,
|
|
130
144
|
});
|
|
131
|
-
|
|
145
|
+
const first = tools[0];
|
|
146
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
147
|
+
expect(first.name).toBe('x_demo_fetch');
|
|
132
148
|
});
|
|
133
149
|
|
|
134
150
|
it('aborts when ctx.signal is fired', async () => {
|
|
@@ -140,14 +156,18 @@ describe('wrapMcpServerTools', () => {
|
|
|
140
156
|
const controller = new AbortController();
|
|
141
157
|
const ctx = { ...baseCtx(), signal: controller.signal };
|
|
142
158
|
controller.abort();
|
|
143
|
-
|
|
159
|
+
const first = tools[0];
|
|
160
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
161
|
+
await expect(first.handler({ url: 'x' }, ctx)).rejects.toThrow(/aborted/);
|
|
144
162
|
});
|
|
145
163
|
|
|
146
164
|
it('rejects a missing required field WITHOUT calling the server', async () => {
|
|
147
165
|
const client = makeFakeClient();
|
|
148
166
|
const tools = await wrapMcpServerTools({ server: { name: 'demo', command: 'noop' }, client });
|
|
149
167
|
// `fetch` declares required: ['url']; emit it missing.
|
|
150
|
-
const
|
|
168
|
+
const first = tools[0];
|
|
169
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
170
|
+
const result = await first.handler({}, baseCtx());
|
|
151
171
|
expect(result).toMatch(/invalid arguments.*missing required field "url"/);
|
|
152
172
|
expect(client.calls).toHaveLength(0);
|
|
153
173
|
});
|
|
@@ -155,7 +175,9 @@ describe('wrapMcpServerTools', () => {
|
|
|
155
175
|
it('rejects a wrong primitive type WITHOUT calling the server', async () => {
|
|
156
176
|
const client = makeFakeClient();
|
|
157
177
|
const tools = await wrapMcpServerTools({ server: { name: 'demo', command: 'noop' }, client });
|
|
158
|
-
const
|
|
178
|
+
const first = tools[0];
|
|
179
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
180
|
+
const result = await first.handler({ url: 123 }, baseCtx());
|
|
159
181
|
expect(result).toMatch(/field "url" must be of type string/);
|
|
160
182
|
expect(client.calls).toHaveLength(0);
|
|
161
183
|
});
|
|
@@ -163,7 +185,9 @@ describe('wrapMcpServerTools', () => {
|
|
|
163
185
|
it('forwards a well-formed call that satisfies the declared schema', async () => {
|
|
164
186
|
const client = makeFakeClient();
|
|
165
187
|
const tools = await wrapMcpServerTools({ server: { name: 'demo', command: 'noop' }, client });
|
|
166
|
-
const
|
|
188
|
+
const first = tools[0];
|
|
189
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
190
|
+
const result = await first.handler({ url: 'https://ok' }, baseCtx());
|
|
167
191
|
expect(result).toBe('called fetch');
|
|
168
192
|
expect(client.calls).toEqual([{ name: 'fetch', arguments: { url: 'https://ok' } }]);
|
|
169
193
|
});
|
|
@@ -172,7 +196,9 @@ describe('wrapMcpServerTools', () => {
|
|
|
172
196
|
const client = makeFakeClient();
|
|
173
197
|
const tools = await wrapMcpServerTools({ server: { name: 'demo', command: 'noop' }, client });
|
|
174
198
|
// `shell` (tools[1]) declares only { type: 'object' } — anything passes.
|
|
175
|
-
const
|
|
199
|
+
const second = tools[1];
|
|
200
|
+
assertDefined(second, 'second wrapped mcp tool present');
|
|
201
|
+
const result = await second.handler({ anything: ['goes'] }, baseCtx());
|
|
176
202
|
expect(result).toBe('called shell');
|
|
177
203
|
});
|
|
178
204
|
});
|
|
@@ -189,7 +215,9 @@ describe('runMcpCallWithFallback (timeout + settle-once)', () => {
|
|
|
189
215
|
vi.spyOn(client, 'callTool').mockImplementation(() => new Promise<never>(() => {}));
|
|
190
216
|
const tools = await wrapMcpServerTools({ server: { name: 'demo', command: 'noop' }, client });
|
|
191
217
|
|
|
192
|
-
const
|
|
218
|
+
const first = tools[0];
|
|
219
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
220
|
+
const promise = first.handler({ url: 'x' }, baseCtx());
|
|
193
221
|
// Attach the rejection assertion before advancing so the rejection is observed.
|
|
194
222
|
const assertion = expect(promise).rejects.toThrow(/timed out/);
|
|
195
223
|
await vi.advanceTimersByTimeAsync(5 * 60 * 1000);
|
|
@@ -209,7 +237,9 @@ describe('runMcpCallWithFallback (timeout + settle-once)', () => {
|
|
|
209
237
|
const controller = new AbortController();
|
|
210
238
|
const ctx = { ...baseCtx(), signal: controller.signal };
|
|
211
239
|
|
|
212
|
-
const
|
|
240
|
+
const first = tools[0];
|
|
241
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
242
|
+
const promise = first.handler({ url: 'x' }, ctx);
|
|
213
243
|
controller.abort();
|
|
214
244
|
// The late resolution must NOT win or throw "already settled".
|
|
215
245
|
resolveCall({ content: [{ type: 'text', text: 'too late' }], isError: false });
|
|
@@ -232,8 +262,10 @@ describe('wrapMcpServerToolsLazy', () => {
|
|
|
232
262
|
});
|
|
233
263
|
expect(getClient).not.toHaveBeenCalled(); // building does not connect
|
|
234
264
|
|
|
235
|
-
|
|
236
|
-
|
|
265
|
+
const first = tools[0];
|
|
266
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
267
|
+
await first.handler({ url: 'a' }, baseCtx());
|
|
268
|
+
await first.handler({ url: 'b' }, baseCtx());
|
|
237
269
|
// Two invocations, but the lazy wrapper hands the same factory each time.
|
|
238
270
|
// The connection caching itself is the factory's job; here we assert the
|
|
239
271
|
// factory is invoked per call and the calls reach the client.
|
|
@@ -253,8 +285,10 @@ describe('wrapMcpServerToolsLazy', () => {
|
|
|
253
285
|
});
|
|
254
286
|
const controller = new AbortController();
|
|
255
287
|
controller.abort();
|
|
288
|
+
const first = tools[0];
|
|
289
|
+
assertDefined(first, 'wrapped mcp tool present');
|
|
256
290
|
await expect(
|
|
257
|
-
|
|
291
|
+
first.handler({ url: 'x' }, { ...baseCtx(), signal: controller.signal }),
|
|
258
292
|
).rejects.toThrow(/aborted/);
|
|
259
293
|
expect(getClient).not.toHaveBeenCalled();
|
|
260
294
|
});
|