@toolgrain/mcp 0.3.0-alpha.1 → 0.3.0-alpha.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/CHANGELOG.md +12 -0
- package/README.md +10 -0
- package/dist/apps.d.ts +9 -0
- package/dist/apps.d.ts.map +1 -0
- package/dist/apps.js +21 -0
- package/dist/apps.js.map +1 -0
- package/dist/dispatcher.d.ts +2 -1
- package/dist/dispatcher.d.ts.map +1 -1
- package/dist/dispatcher.js +3 -3
- package/dist/dispatcher.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy/dispatcher.d.ts +2 -1
- package/dist/legacy/dispatcher.d.ts.map +1 -1
- package/dist/legacy/dispatcher.js +23 -8
- package/dist/legacy/dispatcher.js.map +1 -1
- package/dist/legacy/handlers.d.ts +1 -1
- package/dist/legacy/handlers.d.ts.map +1 -1
- package/dist/legacy/handlers.js +2 -2
- package/dist/legacy/handlers.js.map +1 -1
- package/dist/modern/dispatcher.d.ts +2 -1
- package/dist/modern/dispatcher.d.ts.map +1 -1
- package/dist/modern/dispatcher.js +22 -8
- package/dist/modern/dispatcher.js.map +1 -1
- package/dist/modern/handlers.d.ts +1 -1
- package/dist/modern/handlers.d.ts.map +1 -1
- package/dist/modern/handlers.js +2 -2
- package/dist/modern/handlers.js.map +1 -1
- package/dist/modern/results.d.ts +6 -0
- package/dist/modern/results.d.ts.map +1 -1
- package/dist/modern/results.js +9 -0
- package/dist/modern/results.js.map +1 -1
- package/dist/resources/definition.d.ts +45 -0
- package/dist/resources/definition.d.ts.map +1 -0
- package/dist/resources/definition.js +46 -0
- package/dist/resources/definition.js.map +1 -0
- package/dist/resources/registry.d.ts +13 -0
- package/dist/resources/registry.d.ts.map +1 -0
- package/dist/resources/registry.js +48 -0
- package/dist/resources/registry.js.map +1 -0
- package/dist/resources/requests.d.ts +13 -0
- package/dist/resources/requests.d.ts.map +1 -0
- package/dist/resources/requests.js +43 -0
- package/dist/resources/requests.js.map +1 -0
- package/dist/resources/validation.d.ts +33 -0
- package/dist/resources/validation.d.ts.map +1 -0
- package/dist/resources/validation.js +61 -0
- package/dist/resources/validation.js.map +1 -0
- package/dist/server.d.ts +7 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +6 -3
- package/dist/server.js.map +1 -1
- package/dist/tools/context.d.ts +2 -2
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +1 -1
- package/dist/tools/rich-result.d.ts +19 -19
- package/dist/tools/rich-result.d.ts.map +1 -1
- package/dist/tools/rich-result.js.map +1 -1
- package/package.json +2 -2
- package/src/apps.ts +23 -0
- package/src/dispatcher.ts +4 -0
- package/src/index.ts +9 -0
- package/src/legacy/dispatcher.ts +55 -13
- package/src/legacy/handlers.ts +2 -1
- package/src/modern/dispatcher.ts +57 -21
- package/src/modern/handlers.ts +2 -1
- package/src/modern/results.ts +10 -0
- package/src/resources/definition.ts +92 -0
- package/src/resources/registry.ts +72 -0
- package/src/resources/requests.ts +59 -0
- package/src/resources/validation.ts +82 -0
- package/src/server.ts +11 -4
- package/src/tools/context.ts +2 -2
- package/src/tools/rich-result.ts +53 -27
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,IAAI,gBAAgB,EAClC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,KAAK,uBAAuB,EAE7B,MAAM,iBAAiB,CAAC;AAEzB,KAAK,MAAM,GAAG,CACZ,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAAC;AAClD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,IAAI,gBAAgB,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,SAAS,QAAQ,EAAE,EAChC,OAAO,CAAC,EAAE,YAAY,GACrB,gBAAgB,CAyClB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { INTERNAL_ERROR, } from "@toolgrain/protocol";
|
|
2
|
+
import { reportError } from "../diagnostics.js";
|
|
3
|
+
import { ProtocolError } from "../protocol/responses.js";
|
|
4
|
+
import { assertJSON } from "../tools/json-value.js";
|
|
5
|
+
import { isResource, RESOURCE_METADATA_KEYS, } from "./definition.js";
|
|
6
|
+
import { copyReadResult, resourceMetadata, } from "./validation.js";
|
|
7
|
+
export function createResourceRegistry(definitions, onError) {
|
|
8
|
+
const entries = new Map();
|
|
9
|
+
for (const definition of definitions) {
|
|
10
|
+
if (!isResource(definition))
|
|
11
|
+
throw new TypeError("Resources must be created with resource()");
|
|
12
|
+
const fields = {};
|
|
13
|
+
for (const key of RESOURCE_METADATA_KEYS)
|
|
14
|
+
if (definition[key] !== undefined)
|
|
15
|
+
fields[key] = definition[key];
|
|
16
|
+
assertJSON(fields);
|
|
17
|
+
const metadata = resourceMetadata.parse(structuredClone(fields));
|
|
18
|
+
if (entries.has(metadata.uri))
|
|
19
|
+
throw new TypeError(`Duplicate resource URI: ${metadata.uri}`);
|
|
20
|
+
if (typeof definition.read !== "function")
|
|
21
|
+
throw new TypeError("Resources require a read function");
|
|
22
|
+
entries.set(metadata.uri, {
|
|
23
|
+
metadata,
|
|
24
|
+
async read(ctx) {
|
|
25
|
+
if (ctx.signal.aborted)
|
|
26
|
+
return;
|
|
27
|
+
try {
|
|
28
|
+
const value = await definition.read(metadata.uri, ctx);
|
|
29
|
+
if (ctx.signal.aborted)
|
|
30
|
+
return;
|
|
31
|
+
const result = copyReadResult(value);
|
|
32
|
+
return ctx.signal.aborted ? undefined : result;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (ctx.signal.aborted)
|
|
36
|
+
return;
|
|
37
|
+
reportError(onError, error);
|
|
38
|
+
throw new ProtocolError(INTERNAL_ERROR, "Internal error");
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
list: () => structuredClone(Array.from(entries.values(), ({ metadata }) => metadata)),
|
|
45
|
+
reader: (uri) => entries.get(uri)?.read,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAqB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,UAAU,EACV,sBAAsB,GAEvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EAEd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAUzB,MAAM,UAAU,sBAAsB,CACpC,WAAgC,EAChC,OAAsB;IAEtB,MAAM,OAAO,GAAG,IAAI,GAAG,EAGpB,CAAC;IACJ,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YACzB,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;QACnE,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,sBAAsB;YACtC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACnE,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CACrC,eAAe,CAAC,MAAM,CAAC,CACJ,CAAC;QACtB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC3B,MAAM,IAAI,SAAS,CAAC,2BAA2B,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QACjE,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,UAAU;YACvC,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;YACxB,QAAQ;YACR,KAAK,CAAC,IAAI,CAAC,GAAG;gBACZ,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC/B,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;oBACvD,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;wBAAE,OAAO;oBAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;oBACrC,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBACjD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;wBAAE,OAAO;oBAC/B,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBAC5B,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CACT,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ToolContext } from "../tools/context.js";
|
|
2
|
+
import type { ResourceRegistry } from "./registry.js";
|
|
3
|
+
export declare function requireResources(resources: ResourceRegistry | undefined): ResourceRegistry;
|
|
4
|
+
export declare function listResources(params: unknown, resources: ResourceRegistry): {
|
|
5
|
+
resources: import("@toolgrain/protocol").Resource[];
|
|
6
|
+
};
|
|
7
|
+
export declare function listResourceTemplates(params: unknown, _resources: ResourceRegistry): {
|
|
8
|
+
resourceTemplates: never[];
|
|
9
|
+
};
|
|
10
|
+
export declare function readResource(params: unknown, resources: ResourceRegistry, ctx: (params: {
|
|
11
|
+
_meta?: Record<string, unknown> | undefined;
|
|
12
|
+
}) => ToolContext, notFoundCode: number): Promise<import("./validation.js").ResourceExecutionResult | undefined>;
|
|
13
|
+
//# sourceMappingURL=requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../src/resources/requests.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAYtD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,gBAAgB,GAAG,SAAS,GACtC,gBAAgB,CAGlB;AAQD,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB;IAE/D,SAAS;EACnB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,gBAAgB;IAGnB,iBAAiB;EAC3B;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,gBAAgB,EAC3B,GAAG,EAAE,CAAC,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;CAAE,KAAK,WAAW,EAC7E,YAAY,EAAE,MAAM,0EAWrB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { INVALID_PARAMS, METHOD_NOT_FOUND } from "@toolgrain/protocol";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { object } from "../protocol/messages.js";
|
|
4
|
+
import { ProtocolError } from "../protocol/responses.js";
|
|
5
|
+
import { resourceUri } from "./validation.js";
|
|
6
|
+
const listParams = z.looseObject({
|
|
7
|
+
_meta: object.optional(),
|
|
8
|
+
cursor: z.string().optional(),
|
|
9
|
+
});
|
|
10
|
+
const readParams = z.looseObject({
|
|
11
|
+
_meta: object.optional(),
|
|
12
|
+
uri: resourceUri,
|
|
13
|
+
});
|
|
14
|
+
export function requireResources(resources) {
|
|
15
|
+
if (!resources)
|
|
16
|
+
throw new ProtocolError(METHOD_NOT_FOUND, "Method not found");
|
|
17
|
+
return resources;
|
|
18
|
+
}
|
|
19
|
+
function validateList(params) {
|
|
20
|
+
const parsed = listParams.safeParse(params ?? {});
|
|
21
|
+
if (!parsed.success || parsed.data.cursor !== undefined)
|
|
22
|
+
throw new ProtocolError(INVALID_PARAMS, "Invalid resource list parameters");
|
|
23
|
+
}
|
|
24
|
+
export function listResources(params, resources) {
|
|
25
|
+
validateList(params);
|
|
26
|
+
return { resources: resources.list() };
|
|
27
|
+
}
|
|
28
|
+
export function listResourceTemplates(params, _resources) {
|
|
29
|
+
validateList(params);
|
|
30
|
+
return { resourceTemplates: [] };
|
|
31
|
+
}
|
|
32
|
+
export async function readResource(params, resources, ctx, notFoundCode) {
|
|
33
|
+
const parsed = readParams.safeParse(params);
|
|
34
|
+
if (!parsed.success)
|
|
35
|
+
throw new ProtocolError(INVALID_PARAMS, "Invalid resource read parameters");
|
|
36
|
+
const read = resources.reader(parsed.data.uri);
|
|
37
|
+
if (!read)
|
|
38
|
+
throw new ProtocolError(notFoundCode, "Resource not found", {
|
|
39
|
+
uri: parsed.data.uri,
|
|
40
|
+
});
|
|
41
|
+
return read(ctx(parsed.data));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.js","sourceRoot":"","sources":["../../src/resources/requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;IACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AACH,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;IACxB,GAAG,EAAE,WAAW;CACjB,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAC9B,SAAuC;IAEvC,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAC9E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,MAAe;IACnC,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;QACrD,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,kCAAkC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAe,EAAE,SAA2B;IACxE,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAe,EACf,UAA4B;IAE5B,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAe,EACf,SAA2B,EAC3B,GAA6E,EAC7E,YAAoB;IAEpB,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,OAAO;QACjB,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,kCAAkC,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI;QACP,MAAM,IAAI,aAAa,CAAC,YAAY,EAAE,oBAAoB,EAAE;YAC1D,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;SACrB,CAAC,CAAC;IACL,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ReadResourceResult } from "@toolgrain/protocol";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export type ResourceExecutionResult = Pick<ReadResourceResult, "contents" | "_meta">;
|
|
4
|
+
/** Validate URI components without normalizing registry identities or treating them as URLs. */
|
|
5
|
+
export declare const resourceUri: z.ZodString;
|
|
6
|
+
export declare const resourceMetadata: z.ZodObject<{
|
|
7
|
+
uri: z.ZodString;
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
title: z.ZodOptional<z.ZodString>;
|
|
10
|
+
description: z.ZodOptional<z.ZodString>;
|
|
11
|
+
mimeType: z.ZodOptional<z.ZodString>;
|
|
12
|
+
annotations: z.ZodOptional<z.ZodObject<{
|
|
13
|
+
audience: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
14
|
+
assistant: "assistant";
|
|
15
|
+
user: "user";
|
|
16
|
+
}>>>;
|
|
17
|
+
priority: z.ZodOptional<z.ZodNumber>;
|
|
18
|
+
lastModified: z.ZodOptional<z.ZodString>;
|
|
19
|
+
}, z.core.$loose>>;
|
|
20
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
icons: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
22
|
+
src: z.ZodString;
|
|
23
|
+
mimeType: z.ZodOptional<z.ZodString>;
|
|
24
|
+
sizes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
25
|
+
theme: z.ZodOptional<z.ZodEnum<{
|
|
26
|
+
dark: "dark";
|
|
27
|
+
light: "light";
|
|
28
|
+
}>>;
|
|
29
|
+
}, z.core.$loose>>>;
|
|
30
|
+
_meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
31
|
+
}, z.core.$strict>;
|
|
32
|
+
export declare function copyReadResult(value: unknown): ResourceExecutionResult;
|
|
33
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/resources/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,kBAAkB,EAClB,UAAU,GAAG,OAAO,CACrB,CAAC;AAWF,gGAAgG;AAChG,eAAO,MAAM,WAAW,aAmBkB,CAAC;AAE3C,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;kBAgB3B,CAAC;AAmBH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAKtE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { icon } from "../protocol/icon.js";
|
|
3
|
+
import { object } from "../protocol/messages.js";
|
|
4
|
+
import { assertJSON } from "../tools/json-value.js";
|
|
5
|
+
// RFC 3986 components: percent-encoded bytes, unreserved characters, and sub-delimiters.
|
|
6
|
+
const atom = "(?:[A-Za-z0-9._~-]|%[A-Fa-f0-9]{2}|[!$&'()*+,;=])";
|
|
7
|
+
const path = new RegExp(`^(?:${atom}|[:@/])*$`);
|
|
8
|
+
const queryOrFragment = new RegExp(`^(?:${atom}|[:@/?])*$`);
|
|
9
|
+
const authority = new RegExp(`^(?:(?:${atom}|:)*@)?(?:${atom}*|\\[([^\\]]+)\\])(?::[0-9]*)?$`);
|
|
10
|
+
const ipFuture = /^v[A-Fa-f0-9]+\.[A-Za-z0-9._~!$&'()*+,;=:-]+$/i;
|
|
11
|
+
/** Validate URI components without normalizing registry identities or treating them as URLs. */
|
|
12
|
+
export const resourceUri = z.string().refine((value) => {
|
|
13
|
+
const parts = /^[A-Za-z][A-Za-z0-9+.-]*:(?:\/\/([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#([^#]*))?$/.exec(value);
|
|
14
|
+
if (!parts ||
|
|
15
|
+
!path.test(parts[2] ?? "") ||
|
|
16
|
+
!queryOrFragment.test(parts[3] ?? "") ||
|
|
17
|
+
!queryOrFragment.test(parts[4] ?? ""))
|
|
18
|
+
return false;
|
|
19
|
+
if (parts[1] === undefined)
|
|
20
|
+
return true;
|
|
21
|
+
const host = authority.exec(parts[1]);
|
|
22
|
+
if (!host)
|
|
23
|
+
return false;
|
|
24
|
+
const ip = host[1];
|
|
25
|
+
return (ip === undefined || ipFuture.test(ip) || URL.canParse(`https://[${ip}]/`));
|
|
26
|
+
}, "Resource URI must be an absolute URI");
|
|
27
|
+
export const resourceMetadata = z.strictObject({
|
|
28
|
+
uri: resourceUri,
|
|
29
|
+
name: z.string().min(1),
|
|
30
|
+
title: z.string().optional(),
|
|
31
|
+
description: z.string().optional(),
|
|
32
|
+
mimeType: z.string().optional(),
|
|
33
|
+
annotations: z
|
|
34
|
+
.looseObject({
|
|
35
|
+
audience: z.array(z.enum(["user", "assistant"])).optional(),
|
|
36
|
+
priority: z.number().min(0).max(1).optional(),
|
|
37
|
+
lastModified: z.string().optional(),
|
|
38
|
+
})
|
|
39
|
+
.optional(),
|
|
40
|
+
size: z.number().int().nonnegative().optional(),
|
|
41
|
+
icons: z.array(icon).optional(),
|
|
42
|
+
_meta: object.optional(),
|
|
43
|
+
});
|
|
44
|
+
const contents = z
|
|
45
|
+
.looseObject({
|
|
46
|
+
uri: resourceUri,
|
|
47
|
+
mimeType: z.string().optional(),
|
|
48
|
+
text: z.string().optional(),
|
|
49
|
+
blob: z.base64().optional(),
|
|
50
|
+
_meta: object.optional(),
|
|
51
|
+
})
|
|
52
|
+
.refine((value) => Object.hasOwn(value, "text") !== Object.hasOwn(value, "blob"), "Resource contents require exactly one of text or blob");
|
|
53
|
+
const readResult = z.strictObject({
|
|
54
|
+
contents: z.array(contents),
|
|
55
|
+
_meta: object.optional(),
|
|
56
|
+
});
|
|
57
|
+
export function copyReadResult(value) {
|
|
58
|
+
assertJSON(value, { omitUndefined: true });
|
|
59
|
+
return readResult.parse(JSON.parse(JSON.stringify(value)));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/resources/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -2,9 +2,10 @@ import type { ProgressNotification, ProtocolResponse, Tool as ProtocolTool, Supp
|
|
|
2
2
|
import type { AuthMetadata, AuthProvider, AuthScope } from "./auth/types.js";
|
|
3
3
|
import type { RegisteredContextProvider } from "./context/definition.js";
|
|
4
4
|
import { type ErrorHandler } from "./diagnostics.js";
|
|
5
|
+
import type { Resource } from "./resources/definition.js";
|
|
5
6
|
import type { ToolMap } from "./tools/registry.js";
|
|
6
7
|
import { type RequestTransport, type Transport } from "./transport.js";
|
|
7
|
-
/** Tool registrations, identity, and shared configuration for an MCP server. */
|
|
8
|
+
/** Tool/resource registrations, identity, and shared configuration for an MCP server. */
|
|
8
9
|
export interface ServerOptions<Tools extends ToolMap = ToolMap> {
|
|
9
10
|
/** Server implementation name advertised to clients. */
|
|
10
11
|
name: string;
|
|
@@ -12,12 +13,14 @@ export interface ServerOptions<Tools extends ToolMap = ToolMap> {
|
|
|
12
13
|
version: string;
|
|
13
14
|
/** Tools made with `tool()`; each registration key becomes its exposed tool name. */
|
|
14
15
|
tools: Tools;
|
|
16
|
+
/** Fixed resources made with `resource()`; supplying an empty array enables an empty resource service. */
|
|
17
|
+
resources?: readonly Resource[];
|
|
15
18
|
/** Optional usage instructions advertised to clients during discovery or initialization. */
|
|
16
19
|
instructions?: string;
|
|
17
20
|
/**
|
|
18
21
|
* Receives original unexpected failures for private diagnostics. Tool failures
|
|
19
22
|
* include frozen tool/request details; auth and transport failures pass only
|
|
20
|
-
* the error. Throws and rejected promises from this callback are ignored.
|
|
23
|
+
* the error, as do resource failures. Throws and rejected promises from this callback are ignored.
|
|
21
24
|
*/
|
|
22
25
|
onError?: ErrorHandler;
|
|
23
26
|
/** Eager endpoint authorization; requires a request transport rather than stdio. */
|
|
@@ -87,8 +90,8 @@ export interface Server {
|
|
|
87
90
|
close(): Promise<void>;
|
|
88
91
|
}
|
|
89
92
|
/**
|
|
90
|
-
* Create a server from reusable tools, optional auth, and lazy context providers.
|
|
91
|
-
* Registration validates tool names,
|
|
93
|
+
* Create a server from reusable tools/resources, optional auth, and lazy context providers.
|
|
94
|
+
* Registration validates tool names/schemas, resource URIs, and metadata immediately.
|
|
92
95
|
* Creating the server does not start a transport or resolve context providers.
|
|
93
96
|
*
|
|
94
97
|
* @param options - Server identity and application-owned tool/provider registrations.
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAChB,IAAI,IAAI,YAAY,EACpB,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAChB,IAAI,IAAI,YAAY,EACpB,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,kBAAkB,CAAC;AAIlE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AASxB,yFAAyF;AACzF,MAAM,WAAW,aAAa,CAAC,KAAK,SAAS,OAAO,GAAG,OAAO;IAC5D,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,KAAK,EAAE,KAAK,CAAC;IACb,0GAA0G;IAC1G,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChC,4FAA4F;IAC5F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,oFAAoF;IACpF,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,iGAAiG;IACjG,OAAO,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAChD;AAED,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC5B,oGAAoG;IACpG,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C,uFAAuF;IACvF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AAED,sFAAsF;AACtF,MAAM,WAAW,MAAM;IACrB;;;;;;;;OAQG;IACH,MAAM,CACJ,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IACzC,6EAA6E;IAC7E,kBAAkB,IAAI,YAAY,EAAE,CAAC;IACrC,yFAAyF;IACzF,eAAe,IAAI,YAAY,GAAG,SAAS,CAAC;IAC5C;;;;;;;;OAQG;IACH,SAAS,CACP,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;QACP,gFAAgF;QAChF,QAAQ,EAAE,MAAM,CAAC;QACjB,kFAAkF;QAClF,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GACA,OAAO,CAAC,SAAS,CAAC,CAAC;IACtB;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,6FAA6F;IAC7F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,KAAK,SAAS,OAAO,EACtD,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,GAC5B,MAAM,CA8JR"}
|
package/dist/server.js
CHANGED
|
@@ -7,14 +7,15 @@ import { reportError } from "./diagnostics.js";
|
|
|
7
7
|
import { createDispatcher, formatErrorResponse } from "./dispatcher.js";
|
|
8
8
|
import { executeRequest } from "./execute-request.js";
|
|
9
9
|
import { decode } from "./protocol/decode.js";
|
|
10
|
+
import { createResourceRegistry } from "./resources/registry.js";
|
|
10
11
|
import { createToolAdapter } from "./tools/adapter.js";
|
|
11
12
|
import { isRequestTransport, } from "./transport.js";
|
|
12
13
|
// Internal adapter contract: final delivery remains part of the active request.
|
|
13
14
|
// A global symbol preserves the hook across compatible package copies.
|
|
14
15
|
const responseDelivery = Symbol.for("@toolgrain/mcp/response-delivery/v1");
|
|
15
16
|
/**
|
|
16
|
-
* Create a server from reusable tools, optional auth, and lazy context providers.
|
|
17
|
-
* Registration validates tool names,
|
|
17
|
+
* Create a server from reusable tools/resources, optional auth, and lazy context providers.
|
|
18
|
+
* Registration validates tool names/schemas, resource URIs, and metadata immediately.
|
|
18
19
|
* Creating the server does not start a transport or resolve context providers.
|
|
19
20
|
*
|
|
20
21
|
* @param options - Server identity and application-owned tool/provider registrations.
|
|
@@ -24,7 +25,9 @@ const responseDelivery = Symbol.for("@toolgrain/mcp/response-delivery/v1");
|
|
|
24
25
|
export function createServer(options) {
|
|
25
26
|
const authorization = createAuthorization(options.auth);
|
|
26
27
|
const tools = createToolAdapter(options.tools, options.onError);
|
|
27
|
-
const dispatch = createDispatcher(tools, { name: options.name, version: options.version }, options.instructions, createContextRegistry(options.context)
|
|
28
|
+
const dispatch = createDispatcher(tools, { name: options.name, version: options.version }, options.instructions, createContextRegistry(options.context), options.resources === undefined
|
|
29
|
+
? undefined
|
|
30
|
+
: createResourceRegistry(options.resources, options.onError));
|
|
28
31
|
let closed = false;
|
|
29
32
|
const running = new Set();
|
|
30
33
|
const closeIndependent = () => {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAqB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/context.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ export interface ToolRequest {
|
|
|
23
23
|
/** A deeply frozen copy of the request's `_meta`; empty when the request carried none. */
|
|
24
24
|
readonly meta: Readonly<Record<string, unknown>>;
|
|
25
25
|
}
|
|
26
|
-
/** Per-invocation data passed to tool handlers and lazy context resolvers. */
|
|
26
|
+
/** Per-invocation data passed to tool handlers, resource readers, and lazy context resolvers. */
|
|
27
27
|
export interface ToolContext {
|
|
28
28
|
/** Aborts when the client cancels or disconnects, or the transport or server closes. */
|
|
29
29
|
readonly signal: AbortSignal;
|
|
@@ -49,7 +49,7 @@ export interface ToolContextOptions {
|
|
|
49
49
|
context?: readonly RegisteredContextProvider[];
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
* Build an unauthenticated context for direct `execute()`
|
|
52
|
+
* Build an unauthenticated context for direct tool `execute()` or resource `read()` calls.
|
|
53
53
|
* Request metadata is copied and deeply frozen; each call creates a fresh provider cache.
|
|
54
54
|
* Direct execution still bypasses server authorization, validation, and MCP conversion.
|
|
55
55
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,kBAAkB,IAAI,wBAAwB,EAC9C,cAAc,IAAI,oBAAoB,EACvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,gGAAgG;AAChG,MAAM,WAAW,UAAU;IACzB,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,cAAc,GAAG,oBAAoB,CAAC,CAAC;IACpE,sFAAsF;IACtF,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAClC,kBAAkB,GAAG,wBAAwB,CAC9C,CAAC;CACH;AAED,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAC;IACnD,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD;AAED,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,kBAAkB,IAAI,wBAAwB,EAC9C,cAAc,IAAI,oBAAoB,EACvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,gGAAgG;AAChG,MAAM,WAAW,UAAU;IACzB,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,cAAc,GAAG,oBAAoB,CAAC,CAAC;IACpE,sFAAsF;IACtF,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAClC,kBAAkB,GAAG,wBAAwB,CAC9C,CAAC;CACH;AAED,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAC;IACnD,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD;AAED,iGAAiG;AACjG,MAAM,WAAW,WAAW;IAC1B,wFAAwF;IACxF,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,wFAAwF;AACxF,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gGAAgG;IAChG,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/B,8FAA8F;IAC9F,OAAO,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAChD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAmBzE;AAED,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,EAAE,WAAW,EACnC,IAAI,CAAC,EAAE,YAAY,EACnB,SAAS,GAAE,eAAyC,EACpD,cAAc,GAAE,WAAW,CAAC,gBAAgB,CAA2B,GACtE,WAAW,CAkBb;AAED,4EAA4E;AAC5E,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EACxB,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,GACvC,UAAU,CAKZ"}
|
package/dist/tools/context.js
CHANGED
|
@@ -3,7 +3,7 @@ import { attachAuth } from "../auth/context.js";
|
|
|
3
3
|
import { createContextRegistry, } from "../context/registry.js";
|
|
4
4
|
import { createContextScope } from "../context/scope.js";
|
|
5
5
|
/**
|
|
6
|
-
* Build an unauthenticated context for direct `execute()`
|
|
6
|
+
* Build an unauthenticated context for direct tool `execute()` or resource `read()` calls.
|
|
7
7
|
* Request metadata is copied and deeply frozen; each call creates a fresh provider cache.
|
|
8
8
|
* Direct execution still bypasses server authorization, validation, and MCP conversion.
|
|
9
9
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ContentBlock, MetaObject } from "@toolgrain/protocol";
|
|
2
2
|
import type { DeepReadonly, JsonCompatible } from "./json-value.js";
|
|
3
3
|
/** Explicit MCP content and optional structured data, wrapped with `mcpResult()`. */
|
|
4
|
-
export interface McpResultOptions<Structured = unknown> {
|
|
4
|
+
export interface McpResultOptions<Structured = unknown, Meta extends MetaObject = MetaObject> {
|
|
5
5
|
/** Content blocks for the client; readonly authoring arrays are accepted. */
|
|
6
6
|
content: readonly DeepReadonly<ContentBlock>[];
|
|
7
7
|
/** JSON-compatible data; required for successful rich results with a declared output schema. */
|
|
@@ -9,35 +9,35 @@ export interface McpResultOptions<Structured = unknown> {
|
|
|
9
9
|
/** Marks an expected, client-visible tool failure; omitted or false indicates success. */
|
|
10
10
|
isError?: boolean;
|
|
11
11
|
/** Optional protocol result metadata, distinct from application structured data. */
|
|
12
|
-
_meta?:
|
|
12
|
+
_meta?: Meta;
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Branded rich-result wrapper recognized by compatible Toolgrain package copies.
|
|
16
16
|
* Use `mcpResult()` to construct one; a plain object with the same fields remains application data.
|
|
17
17
|
*/
|
|
18
|
-
export declare class McpResult<Structured> {
|
|
18
|
+
export declare class McpResult<Structured, Meta extends MetaObject = MetaObject> {
|
|
19
19
|
/** Explicit MCP result envelope, before server validation and revision-specific conversion. */
|
|
20
|
-
readonly value: McpResultOptions<Structured>;
|
|
20
|
+
readonly value: McpResultOptions<Structured, Meta>;
|
|
21
21
|
constructor(
|
|
22
22
|
/** Explicit MCP result envelope, before server validation and revision-specific conversion. */
|
|
23
|
-
value: McpResultOptions<Structured>);
|
|
23
|
+
value: McpResultOptions<Structured, Meta>);
|
|
24
24
|
/** Structural brand shared by package copies; object spreads do not keep it. */
|
|
25
25
|
"~toolgrain"(): "result@1";
|
|
26
26
|
}
|
|
27
27
|
/** Recognize results created by any compatible copy of this package. */
|
|
28
28
|
export declare function isMcpResult(value: unknown): value is McpResult<unknown>;
|
|
29
29
|
/** Explicit, client-visible tool error; structured data may be omitted for text-only errors. */
|
|
30
|
-
export type McpErrorResult<Structured = never> = McpResult<Structured> & {
|
|
30
|
+
export type McpErrorResult<Structured = never, Meta extends MetaObject = MetaObject> = McpResult<Structured, Meta> & {
|
|
31
31
|
/** Envelope statically marked as an error. */
|
|
32
|
-
readonly value: McpResultOptions<Structured> & {
|
|
32
|
+
readonly value: McpResultOptions<Structured, Meta> & {
|
|
33
33
|
/** Explicit expected-failure marker, preserved in the MCP result. */
|
|
34
34
|
isError: true;
|
|
35
35
|
};
|
|
36
36
|
};
|
|
37
37
|
/** A result whose structured data is present, as required by an output schema. */
|
|
38
|
-
export type McpStructuredResult<Structured> = McpResult<Structured> & {
|
|
38
|
+
export type McpStructuredResult<Structured, Meta extends MetaObject = MetaObject> = McpResult<Structured, Meta> & {
|
|
39
39
|
/** Envelope with required application structured data. */
|
|
40
|
-
readonly value: McpResultOptions<Structured> & {
|
|
40
|
+
readonly value: McpResultOptions<Structured, Meta> & {
|
|
41
41
|
/** Structured value validated against the tool's output schema when one is declared. */
|
|
42
42
|
structuredContent: Structured;
|
|
43
43
|
};
|
|
@@ -48,45 +48,45 @@ export type McpStructuredResult<Structured> = McpResult<Structured> & {
|
|
|
48
48
|
* @param value - Error content and JSON-compatible data, parsed by any declared output schema.
|
|
49
49
|
* @returns A branded result typed as both an error and a structured result.
|
|
50
50
|
*/
|
|
51
|
-
export declare function mcpResult<Structured = never>(value: McpResultOptions<Structured> & {
|
|
51
|
+
export declare function mcpResult<Structured = never, const Meta extends MetaObject = MetaObject>(value: McpResultOptions<Structured, Meta> & {
|
|
52
52
|
/** Mark this result as an expected, client-visible tool failure. */
|
|
53
53
|
isError: true;
|
|
54
54
|
/** Structured error data, subject to output-schema validation when declared. */
|
|
55
55
|
structuredContent: Structured;
|
|
56
|
-
}): McpErrorResult<Structured> & McpStructuredResult<Structured>;
|
|
56
|
+
}): McpErrorResult<Structured, Meta> & McpStructuredResult<Structured, Meta>;
|
|
57
57
|
/**
|
|
58
58
|
* Wrap a text/content-only public tool error, allowed even when the tool declares output.
|
|
59
59
|
* @param value - Explicit error content without structured application data.
|
|
60
60
|
* @returns A branded error result whose `isError` flag is statically true.
|
|
61
61
|
*/
|
|
62
|
-
export declare function mcpResult(value: McpResultOptions<never> & {
|
|
62
|
+
export declare function mcpResult<Structured = never, const Meta extends MetaObject = MetaObject>(value: McpResultOptions<never, Meta> & {
|
|
63
63
|
/** Mark this result as an expected, client-visible tool failure. */
|
|
64
64
|
isError: true;
|
|
65
|
-
}): McpErrorResult<
|
|
65
|
+
}): McpErrorResult<Structured, Meta>;
|
|
66
66
|
/**
|
|
67
67
|
* Wrap a public tool error with an optional structured-data contract.
|
|
68
68
|
* @param value - Error content and any JSON-compatible structured data.
|
|
69
69
|
* @returns A branded error result; provided structured data still undergoes output validation.
|
|
70
70
|
*/
|
|
71
|
-
export declare function mcpResult<Structured>(value: McpResultOptions<Structured> & {
|
|
71
|
+
export declare function mcpResult<Structured, const Meta extends MetaObject = MetaObject>(value: McpResultOptions<Structured, Meta> & {
|
|
72
72
|
/** Mark this result as an expected, client-visible tool failure. */
|
|
73
73
|
isError: true;
|
|
74
|
-
}): McpErrorResult<Structured>;
|
|
74
|
+
}): McpErrorResult<Structured, Meta>;
|
|
75
75
|
/**
|
|
76
76
|
* Wrap rich content with required structured application data.
|
|
77
77
|
* @param value - Client content and JSON-compatible data; a successful output-schema result needs both.
|
|
78
78
|
* @returns A branded structured result; the server validates and converts it for the selected revision.
|
|
79
79
|
*/
|
|
80
|
-
export declare function mcpResult<Structured>(value: McpResultOptions<Structured> & {
|
|
80
|
+
export declare function mcpResult<Structured, const Meta extends MetaObject = MetaObject>(value: McpResultOptions<Structured, Meta> & {
|
|
81
81
|
/** Required application data, parsed by the declared output schema when present. */
|
|
82
82
|
structuredContent: Structured;
|
|
83
|
-
}): McpStructuredResult<Structured>;
|
|
83
|
+
}): McpStructuredResult<Structured, Meta>;
|
|
84
84
|
/**
|
|
85
85
|
* Wrap explicit client content without structured application data.
|
|
86
86
|
* @param value - Rich content; successful results of this form require a tool without an output schema.
|
|
87
87
|
* @returns A branded MCP result. Ordinary result-shaped objects are not treated as rich results.
|
|
88
88
|
*/
|
|
89
|
-
export declare function mcpResult(value: McpResultOptions<never>): McpResult<
|
|
89
|
+
export declare function mcpResult<Structured = never, const Meta extends MetaObject = MetaObject>(value: McpResultOptions<never, Meta>): McpResult<Structured, Meta>;
|
|
90
90
|
/**
|
|
91
91
|
* Explicitly return MCP content instead of ordinary application JSON.
|
|
92
92
|
* The server validates the envelope, parses supplied output data, and converts it for the protocol revision.
|
|
@@ -94,5 +94,5 @@ export declare function mcpResult(value: McpResultOptions<never>): McpResult<nev
|
|
|
94
94
|
* @param value - Content blocks, optional structured data, an error marker, and protocol metadata.
|
|
95
95
|
* @returns A frozen result wrapper; content is checked during server invocation.
|
|
96
96
|
*/
|
|
97
|
-
export declare function mcpResult<Structured = never>(value: McpResultOptions<Structured>): McpResult<Structured>;
|
|
97
|
+
export declare function mcpResult<Structured = never, const Meta extends MetaObject = MetaObject>(value: McpResultOptions<Structured, Meta>): McpResult<Structured, Meta>;
|
|
98
98
|
//# sourceMappingURL=rich-result.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rich-result.d.ts","sourceRoot":"","sources":["../../src/tools/rich-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEpE,qFAAqF;AACrF,MAAM,WAAW,gBAAgB,
|
|
1
|
+
{"version":3,"file":"rich-result.d.ts","sourceRoot":"","sources":["../../src/tools/rich-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rich-result.js","sourceRoot":"","sources":["../../src/tools/rich-result.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rich-result.js","sourceRoot":"","sources":["../../src/tools/rich-result.ts"],"names":[],"mappings":"AAkBA,kFAAkF;AAClF,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAE3D;;;GAGG;AACH,MAAM,OAAO,SAAS;IAGT,KAAK;IAFhB;IACE,+FAA+F;IACtF,KAAyC;qBAAzC,KAAK;QAEd,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,gFAAgF;IAChF,YAAY;QACV,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AACD,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAE1E,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAsC,CAAC,YAAY,CAAC,KAAK,IAAI,CAC/D,CAAC;AACJ,CAAC;AAyGD,MAAM,UAAU,SAAS,CAGvB,KAAyC;IACzC,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toolgrain/mcp",
|
|
3
|
-
"version": "0.3.0-alpha.
|
|
3
|
+
"version": "0.3.0-alpha.2",
|
|
4
4
|
"description": "Define reusable, typed MCP tools and servers with Zod validation.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"@toolgrain/repo-tools": "0.0.0"
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@toolgrain/protocol": "0.3.0-alpha.
|
|
62
|
+
"@toolgrain/protocol": "0.3.0-alpha.2"
|
|
63
63
|
},
|
|
64
64
|
"engines": {
|
|
65
65
|
"node": "^24.20.0",
|
package/src/apps.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { APPS_EXTENSION_ID, APPS_MIME_TYPE } from "@toolgrain/protocol/apps";
|
|
2
|
+
import type { ToolContext } from "./tools/context.js";
|
|
3
|
+
|
|
4
|
+
/** Advisory client claim; never an authorization decision. */
|
|
5
|
+
export type AppSupport = "supported" | "not-advertised" | "unknown";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Read the current request's MCP Apps claim. Legacy independent HTTP has no
|
|
9
|
+
* retained client capabilities and returns unknown. A claim is not verified.
|
|
10
|
+
*/
|
|
11
|
+
export function getAppSupport(ctx: ToolContext): AppSupport {
|
|
12
|
+
const capabilities = ctx.request.client?.capabilities;
|
|
13
|
+
if (!capabilities) return "unknown";
|
|
14
|
+
const extensions = (capabilities as { extensions?: unknown }).extensions;
|
|
15
|
+
if (typeof extensions !== "object" || extensions === null)
|
|
16
|
+
return "not-advertised";
|
|
17
|
+
const ui = (extensions as Record<string, unknown>)[APPS_EXTENSION_ID];
|
|
18
|
+
if (typeof ui !== "object" || ui === null) return "not-advertised";
|
|
19
|
+
const mimeTypes = (ui as { mimeTypes?: unknown }).mimeTypes;
|
|
20
|
+
return Array.isArray(mimeTypes) && mimeTypes.includes(APPS_MIME_TYPE)
|
|
21
|
+
? "supported"
|
|
22
|
+
: "not-advertised";
|
|
23
|
+
}
|
package/src/dispatcher.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { errorResponse as legacyErrorResponse } from "./legacy/responses.js";
|
|
|
16
16
|
import { createModernDispatcher } from "./modern/dispatcher.js";
|
|
17
17
|
import type { Request } from "./protocol/messages.js";
|
|
18
18
|
import { validateVersionContext } from "./protocol/version-metadata.js";
|
|
19
|
+
import type { ResourceRegistry } from "./resources/registry.js";
|
|
19
20
|
import type { ToolAdapter } from "./tools/adapter.js";
|
|
20
21
|
import type { ToolClient, ToolContext } from "./tools/context.js";
|
|
21
22
|
|
|
@@ -41,18 +42,21 @@ export function createDispatcher(
|
|
|
41
42
|
identity: Implementation,
|
|
42
43
|
instructions?: string,
|
|
43
44
|
providers?: ContextRegistry,
|
|
45
|
+
resources?: ResourceRegistry,
|
|
44
46
|
): Dispatcher {
|
|
45
47
|
const legacy = createLegacyDispatcher(
|
|
46
48
|
tools,
|
|
47
49
|
identity,
|
|
48
50
|
instructions,
|
|
49
51
|
providers,
|
|
52
|
+
resources,
|
|
50
53
|
);
|
|
51
54
|
const modern = createModernDispatcher(
|
|
52
55
|
tools,
|
|
53
56
|
identity,
|
|
54
57
|
instructions,
|
|
55
58
|
providers,
|
|
59
|
+
resources,
|
|
56
60
|
);
|
|
57
61
|
return (request, scope, protocolVersion) => {
|
|
58
62
|
validateVersionContext(request, protocolVersion);
|
package/src/index.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export type { AppSupport } from "./apps.js";
|
|
2
|
+
export { getAppSupport } from "./apps.js";
|
|
1
3
|
export { validateTokenAudience } from "./auth/audience.js";
|
|
2
4
|
export { createAuthAccessor } from "./auth/context.js";
|
|
3
5
|
export type { AuthErrorCode } from "./auth/errors.js";
|
|
@@ -14,6 +16,13 @@ export { authUrl as validateAuthUrl } from "./auth/url.js";
|
|
|
14
16
|
export type { ContextProvider } from "./context/definition.js";
|
|
15
17
|
export { createContext } from "./context/definition.js";
|
|
16
18
|
export type { ToolErrorDetails } from "./diagnostics.js";
|
|
19
|
+
export type {
|
|
20
|
+
Resource,
|
|
21
|
+
ResourceDefinition,
|
|
22
|
+
ResourceMetadata,
|
|
23
|
+
ResourceReadResult,
|
|
24
|
+
} from "./resources/definition.js";
|
|
25
|
+
export { resource } from "./resources/definition.js";
|
|
17
26
|
export type { HandleOptions, Server, ServerOptions } from "./server.js";
|
|
18
27
|
export { createServer } from "./server.js";
|
|
19
28
|
export type {
|