@softure-ai/mcp-access 0.2.5 → 0.2.8
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/CHANGELOG.md +40 -0
- package/README.md +121 -2
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/messages/en.d.ts +8 -0
- package/dist/messages/en.d.ts.map +1 -1
- package/dist/messages/en.js +8 -0
- package/dist/messages/en.js.map +1 -1
- package/dist/messages/index.d.ts +8 -0
- package/dist/messages/index.d.ts.map +1 -1
- package/dist/server/action-tool.d.ts +6 -2
- package/dist/server/action-tool.d.ts.map +1 -1
- package/dist/server/action-tool.js +10 -3
- package/dist/server/action-tool.js.map +1 -1
- package/dist/server/index.d.ts +6 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +6 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/server-factory.d.ts +31 -0
- package/dist/server/server-factory.d.ts.map +1 -0
- package/dist/server/server-factory.js +49 -0
- package/dist/server/server-factory.js.map +1 -0
- package/dist/server/server-info.d.ts +34 -0
- package/dist/server/server-info.d.ts.map +1 -0
- package/dist/server/server-info.js +30 -0
- package/dist/server/server-info.js.map +1 -0
- package/dist/server/strict-input.d.ts +17 -0
- package/dist/server/strict-input.d.ts.map +1 -0
- package/dist/server/strict-input.js +157 -0
- package/dist/server/strict-input.js.map +1 -0
- package/dist/server/tokens.d.ts +5 -0
- package/dist/server/tokens.d.ts.map +1 -1
- package/dist/server/tokens.js +10 -0
- package/dist/server/tokens.js.map +1 -1
- package/dist/server/tool-list.d.ts +35 -0
- package/dist/server/tool-list.d.ts.map +1 -0
- package/dist/server/tool-list.js +68 -0
- package/dist/server/tool-list.js.map +1 -0
- package/dist/server/tools.d.ts +40 -1
- package/dist/server/tools.d.ts.map +1 -1
- package/dist/server/tools.js +41 -3
- package/dist/server/tools.js.map +1 -1
- package/dist/testing/catalog.d.ts +8 -0
- package/dist/testing/catalog.d.ts.map +1 -1
- package/dist/testing/catalog.js +8 -19
- package/dist/testing/catalog.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -1
- package/module.json +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -1
- package/src/messages/en.ts +9 -0
- package/src/server/action-tool.ts +15 -4
- package/src/server/index.ts +34 -1
- package/src/server/server-factory.ts +78 -0
- package/src/server/server-info.ts +76 -0
- package/src/server/strict-input.ts +191 -0
- package/src/server/tokens.ts +10 -0
- package/src/server/tool-list.ts +105 -0
- package/src/server/tools.ts +78 -5
- package/src/testing/catalog.ts +14 -23
- package/src/testing/index.ts +7 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/server";
|
|
2
|
+
import { en } from "../messages/en.js";
|
|
3
|
+
/** The texts of a refused field: `toolInput` of the module dictionary (`getMcpAccessMessages(config).toolInput`). */
|
|
4
|
+
export type StrictToolInputMessages = typeof en.toolInput;
|
|
5
|
+
export interface StrictToolInputOptions {
|
|
6
|
+
/** Old field name → new field name, refused as `input.field_renamed` wherever an object accepts the new name. */
|
|
7
|
+
readonly renamedFields?: Readonly<Record<string, string>>;
|
|
8
|
+
/** Boolean fields also take `"true"`/`"false"` and number fields a number written as text. Default: `true`. */
|
|
9
|
+
readonly coerceTextScalars?: boolean;
|
|
10
|
+
/** Default: the module's English dictionary. */
|
|
11
|
+
readonly messages?: StrictToolInputMessages;
|
|
12
|
+
}
|
|
13
|
+
/** Makes every tool registered on the server from now on strict; wrapping a server twice changes nothing. */
|
|
14
|
+
export declare function withStrictToolInput<Server extends McpServer>(server: Server, options?: StrictToolInputOptions): Server;
|
|
15
|
+
/** The strict form of a tool's input schema: a zod 4 schema or raw shape is rewritten, anything else passes unchanged. */
|
|
16
|
+
export declare function toStrictToolInput(schema: unknown, options?: StrictToolInputOptions): unknown;
|
|
17
|
+
//# sourceMappingURL=strict-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strict-input.d.ts","sourceRoot":"","sources":["../../src/server/strict-input.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAI9D,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,qHAAqH;AACrH,MAAM,MAAM,uBAAuB,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC;AAE1D,MAAM,WAAW,sBAAsB;IACrC,iHAAiH;IACjH,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,+GAA+G;IAC/G,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,uBAAuB,CAAC;CAC7C;AAUD,6GAA6G;AAC7G,wBAAgB,mBAAmB,CAAC,MAAM,SAAS,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,MAAM,CAS1H;AAED,0HAA0H;AAC1H,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAShG"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { formatMessage } from "@softure-ai/core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { en } from "../messages/en.js";
|
|
4
|
+
/** A JSON number literal: no spaces, no hex, no empty text. */
|
|
5
|
+
const NUMBER_TEXT = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
|
|
6
|
+
const strictServers = new WeakSet();
|
|
7
|
+
/** Makes every tool registered on the server from now on strict; wrapping a server twice changes nothing. */
|
|
8
|
+
export function withStrictToolInput(server, options = {}) {
|
|
9
|
+
if (strictServers.has(server))
|
|
10
|
+
return server;
|
|
11
|
+
// The SDK's overloads only differ in how the schema is typed; at runtime it is one method.
|
|
12
|
+
const register = server.registerTool.bind(server);
|
|
13
|
+
const registerStrict = (name, config, callback) => register(name, config.inputSchema === undefined ? config : { ...config, inputSchema: toStrictToolInput(config.inputSchema, options) }, callback);
|
|
14
|
+
Object.defineProperty(server, "registerTool", { value: registerStrict, configurable: true, writable: true });
|
|
15
|
+
strictServers.add(server);
|
|
16
|
+
return server;
|
|
17
|
+
}
|
|
18
|
+
/** The strict form of a tool's input schema: a zod 4 schema or raw shape is rewritten, anything else passes unchanged. */
|
|
19
|
+
export function toStrictToolInput(schema, options = {}) {
|
|
20
|
+
const zodSchema = isZodSchema(schema) ? schema : isRawShape(schema) ? z.object(schema) : null;
|
|
21
|
+
if (zodSchema === null)
|
|
22
|
+
return schema;
|
|
23
|
+
const rewriter = new StrictRewriter({
|
|
24
|
+
renamedFields: options.renamedFields ?? {},
|
|
25
|
+
coerceTextScalars: options.coerceTextScalars ?? true,
|
|
26
|
+
messages: options.messages ?? en.toolInput,
|
|
27
|
+
});
|
|
28
|
+
return rewriter.rewrite(zodSchema);
|
|
29
|
+
}
|
|
30
|
+
function isZodSchema(value) {
|
|
31
|
+
return typeof value === "object" && value !== null && "_zod" in value;
|
|
32
|
+
}
|
|
33
|
+
function isRawShape(value) {
|
|
34
|
+
if (typeof value !== "object" || value === null || Object.getPrototypeOf(value) !== Object.prototype)
|
|
35
|
+
return false;
|
|
36
|
+
return Object.values(value).every(isZodSchema);
|
|
37
|
+
}
|
|
38
|
+
class StrictRewriter {
|
|
39
|
+
settings;
|
|
40
|
+
// The same node (a shared field, a recursive `z.lazy`) is rewritten once.
|
|
41
|
+
rewritten = new Map();
|
|
42
|
+
constructor(settings) {
|
|
43
|
+
this.settings = settings;
|
|
44
|
+
}
|
|
45
|
+
rewrite(schema) {
|
|
46
|
+
const known = this.rewritten.get(schema);
|
|
47
|
+
if (known !== undefined)
|
|
48
|
+
return known;
|
|
49
|
+
const result = this.rewriteNode(schema);
|
|
50
|
+
this.rewritten.set(schema, result);
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
rewriteNode(schema) {
|
|
54
|
+
const def = schema._zod.def;
|
|
55
|
+
switch (def.type) {
|
|
56
|
+
case "object":
|
|
57
|
+
return this.rewriteObject(schema);
|
|
58
|
+
case "array":
|
|
59
|
+
return this.cloneWith(schema, { element: this.rewrite(def.element) });
|
|
60
|
+
case "optional":
|
|
61
|
+
case "nullable":
|
|
62
|
+
case "default":
|
|
63
|
+
case "prefault":
|
|
64
|
+
case "nonoptional":
|
|
65
|
+
case "readonly":
|
|
66
|
+
case "catch":
|
|
67
|
+
return this.cloneWith(schema, { innerType: this.rewrite(def.innerType) });
|
|
68
|
+
case "union":
|
|
69
|
+
return this.cloneWith(schema, { options: def.options.map((option) => this.rewrite(option)) });
|
|
70
|
+
case "intersection":
|
|
71
|
+
return this.cloneWith(schema, { left: this.rewrite(def.left), right: this.rewrite(def.right) });
|
|
72
|
+
case "record":
|
|
73
|
+
return this.cloneWith(schema, { valueType: this.rewrite(def.valueType) });
|
|
74
|
+
case "tuple":
|
|
75
|
+
return this.cloneWith(schema, {
|
|
76
|
+
items: def.items.map((item) => this.rewrite(item)),
|
|
77
|
+
rest: def.rest === null ? null : this.rewrite(def.rest),
|
|
78
|
+
});
|
|
79
|
+
case "pipe":
|
|
80
|
+
return this.rewritePipe(schema, def);
|
|
81
|
+
case "lazy": {
|
|
82
|
+
const getter = def.getter;
|
|
83
|
+
return this.cloneWith(schema, { getter: () => this.rewrite(getter()) });
|
|
84
|
+
}
|
|
85
|
+
case "boolean":
|
|
86
|
+
return this.settings.coerceTextScalars && def.coerce !== true ? z.preprocess(readBooleanText, schema) : schema;
|
|
87
|
+
case "number":
|
|
88
|
+
return this.settings.coerceTextScalars && def.coerce !== true ? z.preprocess(readNumberText, schema) : schema;
|
|
89
|
+
default:
|
|
90
|
+
return schema;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Only the input side: `in`, or `out` after a preprocess (whose `in` is the transform). */
|
|
94
|
+
rewritePipe(schema, def) {
|
|
95
|
+
const input = def.in;
|
|
96
|
+
if (input._zod.traits.has("$ZodTransform"))
|
|
97
|
+
return this.cloneWith(schema, { out: this.rewrite(def.out) });
|
|
98
|
+
return this.cloneWith(schema, { in: this.rewrite(input) });
|
|
99
|
+
}
|
|
100
|
+
rewriteObject(schema) {
|
|
101
|
+
const def = schema._zod.def;
|
|
102
|
+
const shape = Object.fromEntries(Object.entries(def.shape).map(([name, field]) => [name, this.rewrite(field)]));
|
|
103
|
+
// An object with its own catchall (`looseObject`, `.catchall(x)`) accepts extra fields on purpose.
|
|
104
|
+
if (def.catchall !== undefined && def.catchall._zod.def.type !== "never")
|
|
105
|
+
return this.cloneWith(schema, { shape });
|
|
106
|
+
// The object's own map, read for any issue: its parameter type is narrowed to the issues an object raises.
|
|
107
|
+
const ownError = def.error;
|
|
108
|
+
const describe = (issue) => describeUnknownFields(issue, Object.keys(shape), this.settings);
|
|
109
|
+
const error = (issue) => describe(issue) ?? ownError?.(issue);
|
|
110
|
+
return this.cloneWith(schema, { shape, catchall: z.never(), error });
|
|
111
|
+
}
|
|
112
|
+
/** A copy of the node with some parts replaced; its description and other metadata stay with it. */
|
|
113
|
+
cloneWith(schema, parts) {
|
|
114
|
+
const copy = schema.clone({ ...schema._zod.def, ...parts });
|
|
115
|
+
const meta = z.globalRegistry.get(schema);
|
|
116
|
+
if (meta !== undefined) {
|
|
117
|
+
// An id names one schema in the JSON Schema output; the copy replaces the original, so it may not carry it twice.
|
|
118
|
+
const rest = { ...meta };
|
|
119
|
+
delete rest.id;
|
|
120
|
+
z.globalRegistry.add(copy, rest);
|
|
121
|
+
}
|
|
122
|
+
return copy;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** The text for an object's unknown fields: renamed ones first, then the rest with the fields it accepts. */
|
|
126
|
+
function describeUnknownFields(issue, accepted, settings) {
|
|
127
|
+
if (issue.code !== "unrecognized_keys")
|
|
128
|
+
return undefined;
|
|
129
|
+
const { messages, renamedFields } = settings;
|
|
130
|
+
const renamed = [];
|
|
131
|
+
const unknown = [];
|
|
132
|
+
for (const field of issue.keys) {
|
|
133
|
+
const newName = Object.hasOwn(renamedFields, field) ? renamedFields[field] : undefined;
|
|
134
|
+
if (newName !== undefined && accepted.includes(newName))
|
|
135
|
+
renamed.push(formatMessage(messages.fieldRenamed, { field, renamed: newName }));
|
|
136
|
+
else
|
|
137
|
+
unknown.push(field);
|
|
138
|
+
}
|
|
139
|
+
if (unknown.length > 0) {
|
|
140
|
+
renamed.push(formatMessage(messages.unknownFields, { fields: quoteAll(unknown), accepted: accepted.length > 0 ? quoteAll(accepted) : messages.noFields }));
|
|
141
|
+
}
|
|
142
|
+
return renamed.join(" ");
|
|
143
|
+
}
|
|
144
|
+
function quoteAll(names) {
|
|
145
|
+
return names.map((name) => JSON.stringify(name)).join(", ");
|
|
146
|
+
}
|
|
147
|
+
function readBooleanText(value) {
|
|
148
|
+
if (value === "true")
|
|
149
|
+
return true;
|
|
150
|
+
if (value === "false")
|
|
151
|
+
return false;
|
|
152
|
+
return value;
|
|
153
|
+
}
|
|
154
|
+
function readNumberText(value) {
|
|
155
|
+
return typeof value === "string" && NUMBER_TEXT.test(value) ? Number(value) : value;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=strict-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strict-input.js","sourceRoot":"","sources":["../../src/server/strict-input.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAcvC,+DAA+D;AAC/D,MAAM,WAAW,GAAG,+CAA+C,CAAC;AAEpE,MAAM,aAAa,GAAG,IAAI,OAAO,EAAa,CAAC;AAK/C,6GAA6G;AAC7G,MAAM,UAAU,mBAAmB,CAA2B,MAAc,EAAE,UAAkC,EAAE;IAChH,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,2FAA2F;IAC3F,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAA4B,CAAC;IAC7E,MAAM,cAAc,GAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnJ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7G,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0HAA0H;AAC1H,MAAM,UAAU,iBAAiB,CAAC,MAAe,EAAE,UAAkC,EAAE;IACrF,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC;QAClC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE;QAC1C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI;QACpD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,SAAS;KAC3C,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;AACxE,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACnH,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACjD,CAAC;AAOD,MAAM,cAAc;IAIW;IAH7B,0EAA0E;IACzD,SAAS,GAAG,IAAI,GAAG,EAAgC,CAAC;IAErE,YAA6B,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAE1D,OAAO,CAAC,MAAqB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,WAAW,CAAC,MAAqB;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAa,CAAC;QACtC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,aAAa,CAAC,MAAyB,CAAC,CAAC;YACvD,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAwB,CAAC,EAAE,CAAC,CAAC;YACzF,KAAK,UAAU,CAAC;YAChB,KAAK,UAAU,CAAC;YAChB,KAAK,SAAS,CAAC;YACf,KAAK,UAAU,CAAC;YAChB,KAAK,aAAa,CAAC;YACnB,KAAK,UAAU,CAAC;YAChB,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAA0B,CAAC,EAAE,CAAC,CAAC;YAC7F,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,EAAG,GAAG,CAAC,OAA2B,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YACrH,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAqB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAsB,CAAC,EAAE,CAAC,CAAC;YACpI,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAA0B,CAAC,EAAE,CAAC,CAAC;YAC7F,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;oBAC5B,KAAK,EAAG,GAAG,CAAC,KAAyB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACvE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAqB,CAAC;iBACzE,CAAC,CAAC;YACL,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACvC,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,MAAM,GAAG,GAAG,CAAC,MAA6B,CAAC;gBACjD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACjH,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAChH;gBACE,OAAO,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;IAED,4FAA4F;IACpF,WAAW,CAAC,MAAqB,EAAE,GAAW;QACpD,MAAM,KAAK,GAAG,GAAG,CAAC,EAAmB,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAoB,CAAC,EAAE,CAAC,CAAC;QAC3H,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IAEO,aAAa,CAAC,MAAuB;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChH,mGAAmG;QACnG,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACnH,2GAA2G;QAC3G,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAsC,CAAC;QAC5D,MAAM,QAAQ,GAAG,CAAC,KAAwB,EAAsB,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnI,MAAM,KAAK,GAAsB,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,oGAAoG;IAC5F,SAAS,CAAC,MAAqB,EAAE,KAA8B;QACrE,MAAM,IAAI,GAAI,MAA+B,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,kHAAkH;YAClH,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,EAAE,CAAC;YACf,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,6GAA6G;AAC7G,SAAS,qBAAqB,CAAC,KAAwB,EAAE,QAA2B,EAAE,QAAyB;IAC7G,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB;QAAE,OAAO,SAAS,CAAC;IACzD,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;;YACpI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC7J,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAwB;IACxC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACtF,CAAC"}
|
package/dist/server/tokens.d.ts
CHANGED
|
@@ -62,6 +62,11 @@ export interface VerifiedAccessToken {
|
|
|
62
62
|
/** The OAuth grant the token was issued from; null for a hand-issued token. */
|
|
63
63
|
readonly grantId: string | null;
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* A token's name, the client it was issued for ("Laptop", an OAuth client's name), for a record of tool calls:
|
|
67
|
+
* `null` for an id that is not a stored token's (the stdio id, a pruned or unknown token).
|
|
68
|
+
*/
|
|
69
|
+
export declare function findTokenClientName(ctx: McpAccessContext, tokenId: string): Promise<string | null>;
|
|
65
70
|
/**
|
|
66
71
|
* The identity behind a token, or null for anything unknown, revoked or expired: the caller cannot
|
|
67
72
|
* tell which, so a guess learns nothing. The expiry sits in the query, so no code path can forget
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/server/tokens.ts"],"names":[],"mappings":"AAIA,OAAO,EAA0B,KAAK,GAAG,EAAE,KAAK,aAAa,EAAE,KAAK,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;AAExD,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAU7C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAYD,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAGrG;AAED,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,sBAAsB,GAC9B,EAAE,CAAC,iBAAiB,CAAC,GACrB,GAAG,CAAC,0BAA0B,GAAG,0BAA0B,GAAG,gCAAgC,CAAC,CAAC;AAEpG;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA4B3H;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAaxG;AAED,MAAM,WAAW,sBAAsB;IACrC,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAO5D;AAED,yCAAyC;AACzC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAwBjH;AAsBD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9E"}
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/server/tokens.ts"],"names":[],"mappings":"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"}
|
package/dist/server/tokens.js
CHANGED
|
@@ -106,6 +106,16 @@ export async function revokeAccessToken(ctx, input) {
|
|
|
106
106
|
.returning();
|
|
107
107
|
return removed.length > 0 ? ok() : err("mcp-access.token_not_found");
|
|
108
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* A token's name, the client it was issued for ("Laptop", an OAuth client's name), for a record of tool calls:
|
|
111
|
+
* `null` for an id that is not a stored token's (the stdio id, a pruned or unknown token).
|
|
112
|
+
*/
|
|
113
|
+
export async function findTokenClientName(ctx, tokenId) {
|
|
114
|
+
if (!UUID_SHAPE.test(tokenId))
|
|
115
|
+
return null;
|
|
116
|
+
const [row] = await ctx.db.select({ name: accessTokens.name }).from(accessTokens).where(eq(accessTokens.id, tokenId));
|
|
117
|
+
return row?.name ?? null;
|
|
118
|
+
}
|
|
109
119
|
/**
|
|
110
120
|
* The identity behind a token, or null for anything unknown, revoked or expired: the caller cannot
|
|
111
121
|
* tell which, so a guess learns nothing. The expiry sits in the query, so no code path can forget
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/server/tokens.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/server/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { McpServer, type McpServerOptions, type Server } from "@modelcontextprotocol/server";
|
|
2
|
+
/** The release part when none is given. */
|
|
3
|
+
export declare const DEFAULT_TOOL_LIST_RELEASE = "1.0.0";
|
|
4
|
+
/** What a client reads from `tools/list`: one entry per tool, as JSON. */
|
|
5
|
+
export type ServedTool = Readonly<Record<string, unknown>> & {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
};
|
|
8
|
+
export interface ToolListMeasurement {
|
|
9
|
+
/** `<release>-tools-<12 hex>`, for `serverInfo.version`. */
|
|
10
|
+
readonly toolListVersion: string;
|
|
11
|
+
readonly toolCount: number;
|
|
12
|
+
}
|
|
13
|
+
/** Registers the app's tools on the server it is given, e.g. `(server) => registerNoteTools(server, identity)`. */
|
|
14
|
+
export type RegisterTools = (server: McpServer) => unknown;
|
|
15
|
+
export interface MeasureToolListOptions {
|
|
16
|
+
/** The `MAJOR.MINOR.PATCH` before `-tools-`. Default: `1.0.0`. */
|
|
17
|
+
readonly release?: string;
|
|
18
|
+
/** The served server's name, so the recording server is shaped like it. Default: `tool-list`. */
|
|
19
|
+
readonly name?: string;
|
|
20
|
+
/** The served server's options (capabilities, instructions), for the same reason. */
|
|
21
|
+
readonly serverOptions?: McpServerOptions;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Registers the tools on a recording server shaped like the served one, lists them the way the endpoint
|
|
25
|
+
* serves them and returns the version with the tool count. Any change of a tool's name, title,
|
|
26
|
+
* description, annotations or input or output schema changes the version; the order of registration does not.
|
|
27
|
+
*/
|
|
28
|
+
export declare function measureToolList(registerTools: RegisterTools, options?: MeasureToolListOptions): Promise<ToolListMeasurement>;
|
|
29
|
+
/** The version and count for a listed tool set. */
|
|
30
|
+
export declare function describeToolList(tools: readonly ServedTool[], release?: string): ToolListMeasurement;
|
|
31
|
+
/** The first 12 hex digits of a sha256 over the tools in name order, each as canonical JSON (keys sorted at every level). */
|
|
32
|
+
export declare function fingerprintToolList(tools: readonly ServedTool[]): string;
|
|
33
|
+
/** Every tool a fresh server from the factory lists (none when it registered none), asked with one stateless `tools/list` as the endpoint serves it. */
|
|
34
|
+
export declare function listServedTools(createServer: () => McpServer | Server | Promise<McpServer | Server>): Promise<ServedTool[]>;
|
|
35
|
+
//# sourceMappingURL=tool-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-list.d.ts","sourceRoot":"","sources":["../../src/server/tool-list.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoB,SAAS,EAAoB,KAAK,gBAAgB,EAAE,KAAK,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAEjI,2CAA2C;AAC3C,eAAO,MAAM,yBAAyB,UAAU,CAAC;AAMjD,0EAA0E;AAC1E,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,mHAAmH;AACnH,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC;AAE3D,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,iGAAiG;IACjG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,QAAQ,CAAC,aAAa,CAAC,EAAE,gBAAgB,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,aAAa,EAAE,aAAa,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAMtI;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,GAAE,MAAkC,GAAG,mBAAmB,CAG/H;AAED,6HAA6H;AAC7H,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAGxE;AAED,wJAAwJ;AACxJ,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAgBjI"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// The server version that follows the tool list. MCP clients keep a cached `tools/list` until the
|
|
2
|
+
// version they read at `initialize` changes, so a release that adds a tool or changes a schema under
|
|
3
|
+
// the same version leaves the assistant on the old schemas. `measureToolList` fingerprints the list
|
|
4
|
+
// as the client reads it, `<release>-tools-<12 hex>`: a semver prerelease, since comparisons ignore
|
|
5
|
+
// build metadata. The same registrations always give the same version.
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
import { createMcpHandler, McpServer, METHOD_NOT_FOUND } from "@modelcontextprotocol/server";
|
|
8
|
+
/** The release part when none is given. */
|
|
9
|
+
export const DEFAULT_TOOL_LIST_RELEASE = "1.0.0";
|
|
10
|
+
/** Hex digits of the fingerprint in the version. */
|
|
11
|
+
const FINGERPRINT_LENGTH = 12;
|
|
12
|
+
const RELEASE_PATTERN = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
|
|
13
|
+
/**
|
|
14
|
+
* Registers the tools on a recording server shaped like the served one, lists them the way the endpoint
|
|
15
|
+
* serves them and returns the version with the tool count. Any change of a tool's name, title,
|
|
16
|
+
* description, annotations or input or output schema changes the version; the order of registration does not.
|
|
17
|
+
*/
|
|
18
|
+
export async function measureToolList(registerTools, options = {}) {
|
|
19
|
+
const release = options.release ?? DEFAULT_TOOL_LIST_RELEASE;
|
|
20
|
+
assertRelease(release);
|
|
21
|
+
const server = new McpServer({ name: options.name ?? "tool-list", version: release }, options.serverOptions);
|
|
22
|
+
await registerTools(server);
|
|
23
|
+
return describeToolList(await listServedTools(() => server), release);
|
|
24
|
+
}
|
|
25
|
+
/** The version and count for a listed tool set. */
|
|
26
|
+
export function describeToolList(tools, release = DEFAULT_TOOL_LIST_RELEASE) {
|
|
27
|
+
assertRelease(release);
|
|
28
|
+
return { toolListVersion: `${release}-tools-${fingerprintToolList(tools)}`, toolCount: tools.length };
|
|
29
|
+
}
|
|
30
|
+
/** The first 12 hex digits of a sha256 over the tools in name order, each as canonical JSON (keys sorted at every level). */
|
|
31
|
+
export function fingerprintToolList(tools) {
|
|
32
|
+
const ordered = [...tools].sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
|
|
33
|
+
return createHash("sha256").update(toCanonicalJson(ordered)).digest("hex").slice(0, FINGERPRINT_LENGTH);
|
|
34
|
+
}
|
|
35
|
+
/** Every tool a fresh server from the factory lists (none when it registered none), asked with one stateless `tools/list` as the endpoint serves it. */
|
|
36
|
+
export async function listServedTools(createServer) {
|
|
37
|
+
const handler = createMcpHandler(createServer, { responseMode: "json" });
|
|
38
|
+
const response = await handler.fetch(new Request("http://localhost/api/mcp", {
|
|
39
|
+
method: "POST",
|
|
40
|
+
headers: { "content-type": "application/json", accept: "application/json, text/event-stream" },
|
|
41
|
+
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/list", params: {} }),
|
|
42
|
+
}));
|
|
43
|
+
const answer = readAnswer(await response.text());
|
|
44
|
+
// A server that registered no tool declares no tools capability, so it does not know the method.
|
|
45
|
+
if (answer.error?.code === METHOD_NOT_FOUND)
|
|
46
|
+
return [];
|
|
47
|
+
if (answer.result?.tools === undefined) {
|
|
48
|
+
throw new Error(`@softure-ai/mcp-access: listing the server's tools failed: ${typeof answer.error?.message === "string" ? answer.error.message : `HTTP ${String(response.status)}`}`);
|
|
49
|
+
}
|
|
50
|
+
return answer.result.tools.filter((tool) => typeof tool.name === "string" && tool.name !== "");
|
|
51
|
+
}
|
|
52
|
+
/** The JSON-RPC answer, sent as JSON or as one SSE `message` event. */
|
|
53
|
+
function readAnswer(body) {
|
|
54
|
+
const data = body.startsWith("event:") ? (body.split("\n").find((line) => line.startsWith("data: "))?.slice("data: ".length) ?? "null") : body;
|
|
55
|
+
return (JSON.parse(data) ?? {});
|
|
56
|
+
}
|
|
57
|
+
function toCanonicalJson(value) {
|
|
58
|
+
return JSON.stringify(value, (_key, entry) => entry !== null && typeof entry === "object" && !Array.isArray(entry)
|
|
59
|
+
? Object.fromEntries(Object.entries(entry).sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0)))
|
|
60
|
+
: entry);
|
|
61
|
+
}
|
|
62
|
+
/** A release that is not `MAJOR.MINOR.PATCH` would make an invalid version: a setup bug, thrown. */
|
|
63
|
+
function assertRelease(release) {
|
|
64
|
+
if (!RELEASE_PATTERN.test(release)) {
|
|
65
|
+
throw new Error(`@softure-ai/mcp-access: the tool list release must be MAJOR.MINOR.PATCH, got "${release}"`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=tool-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-list.js","sourceRoot":"","sources":["../../src/server/tool-list.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,qGAAqG;AACrG,oGAAoG;AACpG,oGAAoG;AACpG,uEAAuE;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAsC,MAAM,8BAA8B,CAAC;AAEjI,2CAA2C;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AAEjD,oDAAoD;AACpD,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,eAAe,GAAG,4CAA4C,CAAC;AAuBrE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,aAA4B,EAAE,UAAkC,EAAE;IACtG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,yBAAyB,CAAC;IAC7D,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7G,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,gBAAgB,CAAC,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,gBAAgB,CAAC,KAA4B,EAAE,UAAkB,yBAAyB;IACxG,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,UAAU,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACxG,CAAC;AAED,6HAA6H;AAC7H,MAAM,UAAU,mBAAmB,CAAC,KAA4B;IAC9D,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAC1G,CAAC;AAED,wJAAwJ;AACxJ,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,YAAoE;IACxG,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAClC,IAAI,OAAO,CAAC,0BAA0B,EAAE;QACtC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE,qCAAqC,EAAE;QAC9F,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;KAClF,CAAC,CACH,CAAC;IACF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,iGAAiG;IACjG,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,gBAAgB;QAAE,OAAO,EAAE,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,8DAA8D,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACxL,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAsB,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AACrH,CAAC;AAOD,uEAAuE;AACvE,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/I,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAoB,CAAC;AACrD,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAc,EAAE,EAAE,CACpD,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAClE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjH,CAAC,CAAC,KAAK,CACV,CAAC;AACJ,CAAC;AAED,oGAAoG;AACpG,SAAS,aAAa,CAAC,OAAe;IACpC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,iFAAiF,OAAO,GAAG,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC"}
|
package/dist/server/tools.d.ts
CHANGED
|
@@ -1,12 +1,51 @@
|
|
|
1
1
|
import { type CallToolResult } from "@modelcontextprotocol/server";
|
|
2
|
+
import { type CoreErrorCode } from "@softure-ai/core";
|
|
2
3
|
/** What the assistant reads for an error code: the app's own text per code, e.g. `{ "orders.not_found": "No order with that number." }`. */
|
|
3
4
|
export type ToolErrorHints = Readonly<Record<string, string>>;
|
|
4
5
|
export interface ToolErrorOptions {
|
|
5
6
|
/** Texts per error code; a code without one is answered as the code itself. */
|
|
6
7
|
readonly hints?: ToolErrorHints;
|
|
7
|
-
/** The tool's name in the log line. */
|
|
8
|
+
/** The tool's name in the log line and in the `onToolCall` record. */
|
|
8
9
|
readonly label?: string;
|
|
10
|
+
/** Called once after each call with its record. Its failure is logged by kind and never changes the answer. */
|
|
11
|
+
readonly onToolCall?: ToolCallHook;
|
|
12
|
+
/** Who called, for the record: built once per request in the app's server factory. */
|
|
13
|
+
readonly caller?: ToolCaller;
|
|
14
|
+
/** The tool's arguments, for the record: only their names are read, never their values. */
|
|
15
|
+
readonly args?: Readonly<Record<string, unknown>>;
|
|
9
16
|
}
|
|
17
|
+
/** The client behind a call: the token's id (`McpServerIdentity.tokenId`) and its name (`findTokenClientName`). */
|
|
18
|
+
export interface ToolCaller {
|
|
19
|
+
readonly tokenId: string;
|
|
20
|
+
readonly clientName: string | null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* How a call ended. `succeeded`: `itemCount` is the length of an array value, else `null`. `failed`: the
|
|
24
|
+
* result's error code, `null` for a `CallToolResult` the tool marked `isError` itself. `thrown`: the
|
|
25
|
+
* `safeError` code, `null` for a `PublicError` (a deliberate message, no code).
|
|
26
|
+
*/
|
|
27
|
+
export type ToolCallOutcome = {
|
|
28
|
+
readonly kind: "succeeded";
|
|
29
|
+
readonly itemCount: number | null;
|
|
30
|
+
} | {
|
|
31
|
+
readonly kind: "failed";
|
|
32
|
+
readonly code: string | null;
|
|
33
|
+
} | {
|
|
34
|
+
readonly kind: "thrown";
|
|
35
|
+
readonly code: CoreErrorCode | null;
|
|
36
|
+
};
|
|
37
|
+
/** One tool call as the `onToolCall` hook sees it. */
|
|
38
|
+
export interface ToolCallRecord {
|
|
39
|
+
/** The tool's `label`, else `"call"`. */
|
|
40
|
+
readonly tool: string;
|
|
41
|
+
readonly tokenId: string | null;
|
|
42
|
+
readonly clientName: string | null;
|
|
43
|
+
readonly argumentNames: readonly string[];
|
|
44
|
+
readonly outcome: ToolCallOutcome;
|
|
45
|
+
readonly startedAt: Date;
|
|
46
|
+
readonly durationMs: number;
|
|
47
|
+
}
|
|
48
|
+
export type ToolCallHook = (record: ToolCallRecord) => unknown;
|
|
10
49
|
/** A successful tool answer: a string as text, anything else as JSON text. */
|
|
11
50
|
export declare function toolResult(value: unknown): CallToolResult;
|
|
12
51
|
/** A failed tool answer the assistant reads and may act on. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAA8C,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAElG,4IAA4I;AAC5I,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAChC,sEAAsE;IACtE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,+GAA+G;IAC/G,QAAQ,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC;IACnC,sFAAsF;IACtF,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD;AAED,mHAAmH;AACnH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACjE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAA;CAAE,CAAC;AAErE,sDAAsD;AACtD,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC;AAQ/D,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAEzD;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAEzD;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,OAAO,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,CAcjH;AA8BD,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,GAAE,cAAmB,GAAG,cAAc,CAItF;AAUD,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM,CAExE"}
|
package/dist/server/tools.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Tool results for the app's MCP server and the boundary that keeps failures safe: the assistant gets
|
|
2
2
|
// a value, a `PublicError`'s message or a hint, never a thrown error's text (a failed query carries
|
|
3
|
-
// its SQL and parameters). The log gets the error's kind only (`errorLogLabel`).
|
|
3
|
+
// its SQL and parameters). The log gets the error's kind only (`errorLogLabel`). An optional hook sees
|
|
4
|
+
// each call as a whole: which tool, which client, the outcome with its code, and how long it took.
|
|
4
5
|
import { isCallToolResult } from "@modelcontextprotocol/server";
|
|
5
6
|
import { errorLogLabel, getPublicMessage, safeError } from "@softure-ai/core";
|
|
6
7
|
/** For failures the tool did not expect: what `safeError` makes of them, unless a hint replaces it. */
|
|
@@ -23,12 +24,49 @@ export function toolError(message) {
|
|
|
23
24
|
* anything else is logged by kind and answered with the hint for its `safeError` code, else a fixed text.
|
|
24
25
|
*/
|
|
25
26
|
export async function withToolErrors(work, options = {}) {
|
|
27
|
+
const startedAt = Date.now();
|
|
28
|
+
let answer;
|
|
29
|
+
let outcome;
|
|
26
30
|
try {
|
|
27
|
-
|
|
31
|
+
const value = await work();
|
|
32
|
+
answer = answerValue(value, options.hints);
|
|
33
|
+
outcome = describeValueOutcome(value);
|
|
28
34
|
}
|
|
29
35
|
catch (error) {
|
|
30
|
-
|
|
36
|
+
answer = answerFailure(error, options);
|
|
37
|
+
outcome = { kind: "thrown", code: getPublicMessage(error) === null ? safeError(error).error : null };
|
|
31
38
|
}
|
|
39
|
+
if (options.onToolCall !== undefined)
|
|
40
|
+
await reportToolCall(options, outcome, startedAt);
|
|
41
|
+
return answer;
|
|
42
|
+
}
|
|
43
|
+
async function reportToolCall(options, outcome, startedAt) {
|
|
44
|
+
const tool = options.label ?? "call";
|
|
45
|
+
const record = {
|
|
46
|
+
tool,
|
|
47
|
+
tokenId: options.caller?.tokenId ?? null,
|
|
48
|
+
clientName: options.caller?.clientName ?? null,
|
|
49
|
+
argumentNames: Object.keys(options.args ?? {}),
|
|
50
|
+
outcome,
|
|
51
|
+
startedAt: new Date(startedAt),
|
|
52
|
+
durationMs: Date.now() - startedAt,
|
|
53
|
+
};
|
|
54
|
+
try {
|
|
55
|
+
await options.onToolCall?.(record);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error(`@softure-ai/mcp-access: the onToolCall hook failed for tool ${tool}: ${errorLogLabel(error)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function describeValueOutcome(value) {
|
|
62
|
+
if (isCallToolResult(value))
|
|
63
|
+
return value.isError === true ? { kind: "failed", code: null } : { kind: "succeeded", itemCount: null };
|
|
64
|
+
if (isResult(value))
|
|
65
|
+
return value.ok ? countItems(value.value) : { kind: "failed", code: value.error };
|
|
66
|
+
return countItems(value);
|
|
67
|
+
}
|
|
68
|
+
function countItems(value) {
|
|
69
|
+
return { kind: "succeeded", itemCount: Array.isArray(value) ? value.length : null };
|
|
32
70
|
}
|
|
33
71
|
/** The answer for a value a tool or an action returned. */
|
|
34
72
|
export function answerValue(value, hints = {}) {
|
package/dist/server/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,oGAAoG;AACpG,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SoftureConfig } from "@softure-ai/core";
|
|
2
2
|
import type { McpServerFactory } from "../server/endpoint.js";
|
|
3
|
+
import { type ToolListMeasurement } from "../server/tool-list.js";
|
|
3
4
|
export interface ToolCatalogDifferences {
|
|
4
5
|
/** Configured tools the server does not register for the identity that should get them. */
|
|
5
6
|
readonly missing: readonly string[];
|
|
@@ -8,8 +9,15 @@ export interface ToolCatalogDifferences {
|
|
|
8
9
|
/** Configured write tools the server gives a read-only identity. */
|
|
9
10
|
readonly writeForReaders: readonly string[];
|
|
10
11
|
}
|
|
12
|
+
/** What `measureServedToolLists` reports: a read-only and a write identity. */
|
|
13
|
+
export interface ServedToolLists {
|
|
14
|
+
readonly read: ToolListMeasurement;
|
|
15
|
+
readonly write: ToolListMeasurement;
|
|
16
|
+
}
|
|
11
17
|
/** Every difference between the configured catalog and the server, each list in the catalog's order, then the server's. */
|
|
12
18
|
export declare function getToolCatalogDifferences(config: SoftureConfig, createServer: McpServerFactory): Promise<ToolCatalogDifferences>;
|
|
13
19
|
/** Throws a list of every difference, e.g. in a unit test next to the server. */
|
|
14
20
|
export declare function expectToolCatalogMatchesServer(config: SoftureConfig, createServer: McpServerFactory): Promise<void>;
|
|
21
|
+
/** The tool list's version and count for each access level, for a snapshot that changes whenever a tool's schema does. */
|
|
22
|
+
export declare function measureServedToolLists(createServer: McpServerFactory, release?: string): Promise<ServedToolLists>;
|
|
15
23
|
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/testing/catalog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/testing/catalog.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAqC,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAErG,MAAM,WAAW,sBAAsB;IACrC,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,oEAAoE;IACpE,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;CACrC;AAKD,2HAA2H;AAC3H,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAUtI;AAED,iFAAiF;AACjF,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUzH;AAOD,0HAA0H;AAC1H,wBAAsB,sBAAsB,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAKvH"}
|
package/dist/testing/catalog.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
// Catalog parity: the tools listed in softure.config.ts (the token page shows them, agent docs read
|
|
2
|
-
// them) against the tools the app's MCP server really registers, for a read-only and a write identity.
|
|
3
|
-
// Framework-free: `expectToolCatalogMatchesServer` throws, so it works in any test runner.
|
|
4
|
-
import { createMcpHandler } from "@modelcontextprotocol/server";
|
|
5
1
|
import { getMcpAccessOptions } from "../server/options.js";
|
|
2
|
+
import { describeToolList, listServedTools } from "../server/tool-list.js";
|
|
6
3
|
const READER = { userId: "00000000-0000-4000-8000-000000000001", canWrite: false, tokenId: "catalog-check" };
|
|
7
4
|
const WRITER = { ...READER, canWrite: true };
|
|
8
5
|
/** Every difference between the configured catalog and the server, each list in the catalog's order, then the server's. */
|
|
@@ -31,21 +28,13 @@ export async function expectToolCatalogMatchesServer(config, createServer) {
|
|
|
31
28
|
}
|
|
32
29
|
/** The tool names a fresh server lists for the identity, asked the way the endpoint serves it. */
|
|
33
30
|
async function listServerTools(createServer, identity) {
|
|
34
|
-
|
|
35
|
-
const response = await handler.fetch(new Request("http://localhost/api/mcp", {
|
|
36
|
-
method: "POST",
|
|
37
|
-
headers: { "content-type": "application/json", accept: "application/json, text/event-stream" },
|
|
38
|
-
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/list", params: {} }),
|
|
39
|
-
}));
|
|
40
|
-
const answer = readAnswer(await response.text());
|
|
41
|
-
if (answer.result?.tools === undefined) {
|
|
42
|
-
throw new Error(`@softure-ai/mcp-access: listing the server's tools failed: ${typeof answer.error?.message === "string" ? answer.error.message : `HTTP ${String(response.status)}`}`);
|
|
43
|
-
}
|
|
44
|
-
return answer.result.tools.map((tool) => (typeof tool.name === "string" ? tool.name : "")).filter((name) => name !== "");
|
|
31
|
+
return (await listServedTools(() => createServer(identity))).map((tool) => tool.name);
|
|
45
32
|
}
|
|
46
|
-
/** The
|
|
47
|
-
function
|
|
48
|
-
|
|
49
|
-
|
|
33
|
+
/** The tool list's version and count for each access level, for a snapshot that changes whenever a tool's schema does. */
|
|
34
|
+
export async function measureServedToolLists(createServer, release) {
|
|
35
|
+
return {
|
|
36
|
+
read: describeToolList(await listServedTools(() => createServer(READER)), release),
|
|
37
|
+
write: describeToolList(await listServedTools(() => createServer(WRITER)), release),
|
|
38
|
+
};
|
|
50
39
|
}
|
|
51
40
|
//# sourceMappingURL=catalog.js.map
|