@vllnt/convex-helpers 0.1.0-canary.d8af8ef → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mcp/resources/register.d.ts +2 -0
- package/dist/mcp/resources/register.d.ts.map +1 -1
- package/dist/mcp/resources/register.js +9 -3
- package/dist/mcp/resources/register.js.map +1 -1
- package/dist/mcp/serialization.d.ts +3 -0
- package/dist/mcp/serialization.d.ts.map +1 -0
- package/dist/mcp/serialization.js +6 -0
- package/dist/mcp/serialization.js.map +1 -0
- package/dist/mcp/tools/register.d.ts.map +1 -1
- package/dist/mcp/tools/register.js +5 -1
- package/dist/mcp/tools/register.js.map +1 -1
- package/dist/mcp/validators.d.ts.map +1 -1
- package/dist/mcp/validators.js +21 -2
- package/dist/mcp/validators.js.map +1 -1
- package/package.json +12 -11
- package/src/mcp/resources/register.ts +20 -3
- package/src/mcp/serialization.ts +6 -0
- package/src/mcp/tools/register.ts +7 -1
- package/src/mcp/validators.ts +23 -2
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
3
|
import type { ConvexClient } from "../types.js";
|
|
4
|
+
import { convexArgsToZod } from "../validators.js";
|
|
4
5
|
import type { ResourceDef } from "./types.js";
|
|
5
6
|
type PreparedResource = {
|
|
7
|
+
argsSchema: ReturnType<typeof convexArgsToZod> | undefined;
|
|
6
8
|
description: string | undefined;
|
|
7
9
|
resourceDef: ResourceDef;
|
|
8
10
|
template: ResourceTemplate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/mcp/resources/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/mcp/resources/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAG3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,KAAK,gBAAgB,GAAG;IACtB,UAAU,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,GAAG,SAAS,CAAC;IAC3D,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GACrC,gBAAgB,EAAE,CAUpB;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,gBAAgB,EAAE,GAC5B,IAAI,CA4CN"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { stringifyConvex } from "../serialization.js";
|
|
3
|
+
import { convexArgsToZod } from "../validators.js";
|
|
2
4
|
export function prepareResources(resources) {
|
|
3
5
|
return Object.entries(resources).map(([uriPattern, resourceDef]) => ({
|
|
6
|
+
argsSchema: resourceDef.args
|
|
7
|
+
? convexArgsToZod(resourceDef.args)
|
|
8
|
+
: undefined,
|
|
4
9
|
description: resourceDef.description,
|
|
5
10
|
resourceDef,
|
|
6
11
|
template: new ResourceTemplate(uriPattern, { list: undefined }),
|
|
@@ -8,18 +13,19 @@ export function prepareResources(resources) {
|
|
|
8
13
|
}));
|
|
9
14
|
}
|
|
10
15
|
export function registerResources(mcpServer, client, resources) {
|
|
11
|
-
for (const { description, resourceDef, template, uriPattern } of resources) {
|
|
16
|
+
for (const { argsSchema, description, resourceDef, template, uriPattern, } of resources) {
|
|
12
17
|
mcpServer.resource(uriPattern, template, {
|
|
13
18
|
description,
|
|
14
19
|
mimeType: "application/json",
|
|
15
20
|
}, async (uri, parameters) => {
|
|
16
21
|
try {
|
|
17
|
-
const
|
|
22
|
+
const validatedParameters = argsSchema?.parse(parameters) ?? parameters;
|
|
23
|
+
const result = await client.query(resourceDef.ref, validatedParameters);
|
|
18
24
|
return {
|
|
19
25
|
contents: [
|
|
20
26
|
{
|
|
21
27
|
mimeType: "application/json",
|
|
22
|
-
text:
|
|
28
|
+
text: stringifyConvex(result),
|
|
23
29
|
uri: uri.href,
|
|
24
30
|
},
|
|
25
31
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/mcp/resources/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/mcp/resources/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAE3E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAYnD,MAAM,UAAU,gBAAgB,CAC9B,SAAsC;IAEtC,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,UAAU,EAAE,WAAW,CAAC,IAAI;YAC1B,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC;YACnC,CAAC,CAAC,SAAS;QACb,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,WAAW;QACX,QAAQ,EAAE,IAAI,gBAAgB,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC/D,UAAU;KACX,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,SAAoB,EACpB,MAAoB,EACpB,SAA6B;IAE7B,KAAK,MAAM,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,UAAU,GACX,IAAI,SAAS,EAAE,CAAC;QACf,SAAS,CAAC,QAAQ,CAChB,UAAU,EACV,QAAQ,EACR;YACE,WAAW;YACX,QAAQ,EAAE,kBAAkB;SAC7B,EACD,KAAK,EAAE,GAAG,EAAE,UAAmC,EAAE,EAAE;YACjD,IAAI,CAAC;gBACH,MAAM,mBAAmB,GACvB,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;gBAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B,WAAW,CAAC,GAAG,EACf,mBAAmB,CACpB,CAAC;gBACF,OAAO;oBACL,QAAQ,EAAE;wBACR;4BACE,QAAQ,EAAE,kBAAkB;4BAC5B,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC;4BAC7B,GAAG,EAAE,GAAG,CAAC,IAAI;yBACd;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE;oBACjD,KAAK;oBACL,QAAQ,EAAE,UAAU;iBACrB,CAAC,CAAC;gBACH,kEAAkE;gBAClE,wDAAwD;gBACxD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../src/mcp/serialization.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { convexToJson } from "convex/values";
|
|
2
|
+
/** Serialize native Convex values using Convex's lossless tagged JSON format. */
|
|
3
|
+
export function stringifyConvex(value) {
|
|
4
|
+
return JSON.stringify(convexToJson((value ?? null)), null, 2);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=serialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../src/mcp/serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAc,MAAM,eAAe,CAAC;AAEzD,iFAAiF;AACjF,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,IAAI,IAAI,CAAU,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAEV,cAAc,EAEd,OAAO,EACR,MAAM,YAAY,CAAC;AAEpB,KAAK,YAAY,GAAG;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;CACxC,CAAC;AA0BF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,CAkB3E;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAQvB;AAiDD,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EAAE,EACrB,KAAK,EAAE,cAAc,GAAG,SAAS,EACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,IAAI,CA0HN"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { stringifyConvex } from "../serialization.js";
|
|
1
2
|
import { convexArgsToZod as convexArgumentsToZod } from "../validators.js";
|
|
2
3
|
/**
|
|
3
4
|
* Underscore-prefixed arg keys are reserved for framework-injected context.
|
|
@@ -21,6 +22,9 @@ function stripReservedFromShape(shape) {
|
|
|
21
22
|
}
|
|
22
23
|
export function prepareTools(tools) {
|
|
23
24
|
return Object.entries(tools).map(([name, toolDef]) => {
|
|
25
|
+
if (toolDef.timeout !== undefined && toolDef.type !== "query") {
|
|
26
|
+
throw new Error(`Tool "${name}" cannot set a timeout on ${toolDef.type}: Convex execution cannot be cancelled safely`);
|
|
27
|
+
}
|
|
24
28
|
const zodSchema = toolDef.args
|
|
25
29
|
? convexArgumentsToZod(toolDef.args)
|
|
26
30
|
: undefined;
|
|
@@ -162,7 +166,7 @@ export function registerTools(mcpServer, client, tools, hooks, requestId, apiKey
|
|
|
162
166
|
return {
|
|
163
167
|
content: [
|
|
164
168
|
{
|
|
165
|
-
text:
|
|
169
|
+
text: stringifyConvex(result),
|
|
166
170
|
type: "text",
|
|
167
171
|
},
|
|
168
172
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/mcp/tools/register.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/mcp/tools/register.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAgB3E;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAmC;IAEnC,MAAM,QAAQ,GAAiC,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAA8B;IACzD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE;QACnD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CACb,SAAS,IAAI,6BAA6B,OAAO,CAAC,IAAI,+CAA+C,CACtG,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI;YAC5B,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC;YACpC,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,SAAS,GAAG,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC;QACzC,OAAO;YACL,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;YACtC,IAAI;YACJ,OAAO;YACP,QAAQ,EAAE,sBAAsB,CAAC,SAAS,CAAC;SAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAA8B;IAE9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,KAAiC,EACjC,GAAgB,EAChB,OAAgB;IAEhB,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAClC,GAAuC,CACxC,CAAC;YACF,OAAO,MAAM,IAAI,SAAS,CAAC;QAC7B,CAAC;QACD,IAAI,KAAK,EAAE,UAAU,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC3C,OAAO,MAAM,IAAI,SAAS,CAAC;QAC7B,CAAC;QACD,OAAO;IACT,CAAC;IAAC,OAAO,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE;YACnD,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,IAAI,EAAE,GAAG,CAAC,QAAQ;SACnB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAmB,EACnB,SAA6B;IAE7B,IAAI,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC;IAE/B,IAAI,MAAqC,CAAC;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YACnB,YAAY,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC,CAAC;QACF,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/B,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE;gBACvB,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAChD,CAAC,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,SAAoB,EACpB,MAAoB,EACpB,KAAqB,EACrB,KAAiC,EACjC,SAAiB,EACjB,MAA0B;IAE1B,KAAK,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,KAAK,EAAE,CAAC;QAC7D,SAAS,CAAC,IAAI,CACZ,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,KAAK,EAAE,UAAmC,EAAE,EAAE;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC;YAE7D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACnE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE;oBAC/C,IAAI,EAAE,YAAY;oBAClB,SAAS;oBACT,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EACF,6CAA6C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gCACxE,qEAAqE;4BACvE,IAAI,EAAE,MAAe;yBACtB;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG;gBACd,MAAM;gBACN,IAAI,EAAE,UAAU;gBAChB,SAAS;gBACT,SAAS;gBACT,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,IAAI;aACf,CAAC;YAEF,MAAM,SAAS,GAAgB,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YAC/D,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACjE,IAAI,YAAY,EAAE,KAAK,EAAE,CAAC;gBACxB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,YAAY,CAAC,YAAY,IAAI,oBAAoB;4BACvD,IAAI,EAAE,MAAe;yBACtB;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,iBAAiB,GACrB,YAAY,EAAE,UAAU;gBACxB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC;gBAC7C,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,GAAG,YAAY,CAAC,UAAU,EAAE;gBAC/C,CAAC,CAAC,UAAU,CAAC;YAEjB,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;oBAC9B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;wBACrB,KAAK,OAAO;4BACV,OAAO,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;wBAC5D,KAAK,UAAU;4BACb,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;wBAC/D,KAAK,QAAQ;4BACX,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;wBAC7D;4BACE,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CACjD,CAAC;oBACN,CAAC;gBACH,CAAC,CAAC,EAAE,CAAC;gBAEL,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;gBACtE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAE1C,MAAM,UAAU,GAAgB;oBAC9B,GAAG,OAAO;oBACV,UAAU;oBACV,KAAK,EAAE,SAAS;oBAChB,MAAM;iBACP,CAAC;gBACF,MAAM,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;gBAE7C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC;4BAC7B,IAAI,EAAE,MAAe;yBACtB;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC1C,MAAM,QAAQ,GAAgB;oBAC5B,GAAG,OAAO;oBACV,UAAU;oBACV,KAAK;oBACL,KAAK,EAAE,OAAO;iBACf,CAAC;gBAEF,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/D,MAAM,YAAY,GAChB,WAAW,EAAE,OAAO,IAAI,2BAA2B,CAAC;gBAEtD,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE;oBAClD,UAAU;oBACV,KAAK;oBACL,SAAS;oBACT,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC;oBACxD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/mcp/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,YAAY,IAAI,EAAE,MAAM,EAKvB;CACF;
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/mcp/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,YAAY,IAAI,EAAE,MAAM,EAKvB;CACF;AAkKD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,eAAe,GAAG,CAAC,CAAC,UAAU,CAMzE;AAED,wBAAgB,eAAe,CAC7B,kBAAkB,EAAE,eAAe,GAClC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAY3C"}
|
package/dist/mcp/validators.js
CHANGED
|
@@ -43,9 +43,28 @@ function convertKind(validator) {
|
|
|
43
43
|
case "int64":
|
|
44
44
|
return z
|
|
45
45
|
.string()
|
|
46
|
-
.
|
|
46
|
+
.regex(/^-?\d+$/, "Expected a decimal 64-bit integer string")
|
|
47
|
+
.refine((value) => {
|
|
48
|
+
const parsed = BigInt(value);
|
|
49
|
+
return parsed >= -(1n << 63n) && parsed <= (1n << 63n) - 1n;
|
|
50
|
+
}, "Integer is outside the signed 64-bit range")
|
|
51
|
+
.transform(BigInt)
|
|
52
|
+
.describe("64-bit integer as string (converted to BigInt before Convex dispatch)");
|
|
47
53
|
case "bytes":
|
|
48
|
-
return z
|
|
54
|
+
return z
|
|
55
|
+
.string()
|
|
56
|
+
.refine((value) => {
|
|
57
|
+
try {
|
|
58
|
+
atob(value);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}, "Expected base64-encoded binary data")
|
|
65
|
+
.transform((value) => Uint8Array.from(atob(value), (character) => character.charCodeAt(0))
|
|
66
|
+
.buffer)
|
|
67
|
+
.describe("Binary data as base64-encoded string");
|
|
49
68
|
case "id":
|
|
50
69
|
return z
|
|
51
70
|
.string()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/mcp/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,IAAY;QACtB,KAAK,CACH,uCAAuC,IAAI,gDAAgD,CAC5F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,YAAY,IAAI,KAAK,CACtB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,KAAc;IAEd,MAAM,CAAC,GAAG,OAAO,KAAK,CAAC;IACvB,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AAC/E,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAA0B;IAE1B,OAAO,CACL,OAAO,CAAC,MAAM,GAAG,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAI,KAAU;IAClC,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,0GAA0G;AAC1G,SAAS,OAAO,CAAI,KAAU;IAC5B,sDAAsD;IACtD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC3E,oBAAoB;IACpB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,SAA0B;IAC7C,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QAEpB,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QAEpB,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QAErB,KAAK,MAAM;YACT,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAElB,KAAK,OAAO;YACV,OAAO,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,CACP,
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/mcp/validators.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vllnt/convex-helpers",
|
|
3
|
-
"version": "0.1.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Typed host-side helpers for Convex backends — builders, errors, validators, relationships, pagination, HTTP, env, and observability.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -27,12 +27,13 @@
|
|
|
27
27
|
"build": "tsc --project ./tsconfig.build.json",
|
|
28
28
|
"typecheck": "tsc --noEmit && tsc --noEmit --project tsconfig.test.json",
|
|
29
29
|
"typecheck:ci": "tsc --noEmit --project tsconfig.ci.json && tsc --noEmit --project tsconfig.test.json",
|
|
30
|
-
"lint": "eslint .",
|
|
30
|
+
"lint": "pnpm check:agents && eslint .",
|
|
31
31
|
"test": "vitest run --passWithNoTests",
|
|
32
32
|
"test:watch": "vitest --typecheck --clearScreen false",
|
|
33
33
|
"test:coverage": "vitest run --coverage --coverage.reporter=text",
|
|
34
34
|
"generate:llms": "node scripts/generate-llms.mjs",
|
|
35
|
-
"preversion": "pnpm install --frozen-lockfile && pnpm build && pnpm test && pnpm typecheck && pnpm generate:llms"
|
|
35
|
+
"preversion": "pnpm install --frozen-lockfile && pnpm build && pnpm test && pnpm typecheck && pnpm generate:llms",
|
|
36
|
+
"check:agents": "node -e \"const f=require('node:fs');if(!f.existsSync('AGENTS.md')||f.existsSync('CLAUDE.md')||f.existsSync('.claude'))process.exit(1)\""
|
|
36
37
|
},
|
|
37
38
|
"peerDependencies": {
|
|
38
39
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
@@ -48,19 +49,19 @@
|
|
|
48
49
|
}
|
|
49
50
|
},
|
|
50
51
|
"devDependencies": {
|
|
51
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
52
|
-
"@types/node": "^
|
|
52
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
53
|
+
"@types/node": "^26.4.0",
|
|
53
54
|
"@typescript/native": "npm:typescript@7.0.2",
|
|
54
|
-
"@vitest/coverage-v8": "^
|
|
55
|
-
"@vllnt/eslint-config": "2.0.0
|
|
55
|
+
"@vitest/coverage-v8": "^4.1.11",
|
|
56
|
+
"@vllnt/eslint-config": "2.0.0",
|
|
56
57
|
"@vllnt/typescript": "2.0.0",
|
|
57
58
|
"convex": "^1.45.0",
|
|
58
59
|
"convex-test": "^0.0.56",
|
|
59
|
-
"eslint": "^9.
|
|
60
|
-
"prettier": "^3.
|
|
60
|
+
"eslint": "^9.39.5",
|
|
61
|
+
"prettier": "^3.9.6",
|
|
61
62
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
62
|
-
"vitest": "^
|
|
63
|
-
"zod": "^4.
|
|
63
|
+
"vitest": "^4.1.11",
|
|
64
|
+
"zod": "^4.5.4"
|
|
64
65
|
},
|
|
65
66
|
"engines": {
|
|
66
67
|
"node": ">=18"
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
3
|
|
|
4
|
+
import { stringifyConvex } from "../serialization.js";
|
|
4
5
|
import type { ConvexClient } from "../types.js";
|
|
6
|
+
import { convexArgsToZod } from "../validators.js";
|
|
5
7
|
|
|
6
8
|
import type { ResourceDef } from "./types.js";
|
|
7
9
|
|
|
8
10
|
type PreparedResource = {
|
|
11
|
+
argsSchema: ReturnType<typeof convexArgsToZod> | undefined;
|
|
9
12
|
description: string | undefined;
|
|
10
13
|
resourceDef: ResourceDef;
|
|
11
14
|
template: ResourceTemplate;
|
|
@@ -16,6 +19,9 @@ export function prepareResources(
|
|
|
16
19
|
resources: Record<string, ResourceDef>,
|
|
17
20
|
): PreparedResource[] {
|
|
18
21
|
return Object.entries(resources).map(([uriPattern, resourceDef]) => ({
|
|
22
|
+
argsSchema: resourceDef.args
|
|
23
|
+
? convexArgsToZod(resourceDef.args)
|
|
24
|
+
: undefined,
|
|
19
25
|
description: resourceDef.description,
|
|
20
26
|
resourceDef,
|
|
21
27
|
template: new ResourceTemplate(uriPattern, { list: undefined }),
|
|
@@ -28,7 +34,13 @@ export function registerResources(
|
|
|
28
34
|
client: ConvexClient,
|
|
29
35
|
resources: PreparedResource[],
|
|
30
36
|
): void {
|
|
31
|
-
for (const {
|
|
37
|
+
for (const {
|
|
38
|
+
argsSchema,
|
|
39
|
+
description,
|
|
40
|
+
resourceDef,
|
|
41
|
+
template,
|
|
42
|
+
uriPattern,
|
|
43
|
+
} of resources) {
|
|
32
44
|
mcpServer.resource(
|
|
33
45
|
uriPattern,
|
|
34
46
|
template,
|
|
@@ -38,12 +50,17 @@ export function registerResources(
|
|
|
38
50
|
},
|
|
39
51
|
async (uri, parameters: Record<string, unknown>) => {
|
|
40
52
|
try {
|
|
41
|
-
const
|
|
53
|
+
const validatedParameters =
|
|
54
|
+
argsSchema?.parse(parameters) ?? parameters;
|
|
55
|
+
const result = await client.query(
|
|
56
|
+
resourceDef.ref,
|
|
57
|
+
validatedParameters,
|
|
58
|
+
);
|
|
42
59
|
return {
|
|
43
60
|
contents: [
|
|
44
61
|
{
|
|
45
62
|
mimeType: "application/json",
|
|
46
|
-
text:
|
|
63
|
+
text: stringifyConvex(result),
|
|
47
64
|
uri: uri.href,
|
|
48
65
|
},
|
|
49
66
|
],
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { convexToJson, type Value } from "convex/values";
|
|
2
|
+
|
|
3
|
+
/** Serialize native Convex values using Convex's lossless tagged JSON format. */
|
|
4
|
+
export function stringifyConvex(value: unknown): string {
|
|
5
|
+
return JSON.stringify(convexToJson((value ?? null) as Value), null, 2);
|
|
6
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { z } from "zod";
|
|
3
3
|
|
|
4
|
+
import { stringifyConvex } from "../serialization.js";
|
|
4
5
|
import type { ConvexClient } from "../types.js";
|
|
5
6
|
import { convexArgsToZod as convexArgumentsToZod } from "../validators.js";
|
|
6
7
|
|
|
@@ -44,6 +45,11 @@ function stripReservedFromShape(
|
|
|
44
45
|
|
|
45
46
|
export function prepareTools(tools: Record<string, ToolDef>): PreparedTool[] {
|
|
46
47
|
return Object.entries(tools).map(([name, toolDef]) => {
|
|
48
|
+
if (toolDef.timeout !== undefined && toolDef.type !== "query") {
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Tool "${name}" cannot set a timeout on ${toolDef.type}: Convex execution cannot be cancelled safely`,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
47
53
|
const zodSchema = toolDef.args
|
|
48
54
|
? convexArgumentsToZod(toolDef.args)
|
|
49
55
|
: undefined;
|
|
@@ -220,7 +226,7 @@ export function registerTools(
|
|
|
220
226
|
return {
|
|
221
227
|
content: [
|
|
222
228
|
{
|
|
223
|
-
text:
|
|
229
|
+
text: stringifyConvex(result),
|
|
224
230
|
type: "text" as const,
|
|
225
231
|
},
|
|
226
232
|
],
|
package/src/mcp/validators.ts
CHANGED
|
@@ -65,12 +65,33 @@ function convertKind(validator: ConvexValidator): z.ZodTypeAny {
|
|
|
65
65
|
case "int64":
|
|
66
66
|
return z
|
|
67
67
|
.string()
|
|
68
|
+
.regex(/^-?\d+$/, "Expected a decimal 64-bit integer string")
|
|
69
|
+
.refine((value) => {
|
|
70
|
+
const parsed = BigInt(value);
|
|
71
|
+
return parsed >= -(1n << 63n) && parsed <= (1n << 63n) - 1n;
|
|
72
|
+
}, "Integer is outside the signed 64-bit range")
|
|
73
|
+
.transform(BigInt)
|
|
68
74
|
.describe(
|
|
69
|
-
"64-bit integer as string (
|
|
75
|
+
"64-bit integer as string (converted to BigInt before Convex dispatch)",
|
|
70
76
|
);
|
|
71
77
|
|
|
72
78
|
case "bytes":
|
|
73
|
-
return z
|
|
79
|
+
return z
|
|
80
|
+
.string()
|
|
81
|
+
.refine((value) => {
|
|
82
|
+
try {
|
|
83
|
+
atob(value);
|
|
84
|
+
return true;
|
|
85
|
+
} catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}, "Expected base64-encoded binary data")
|
|
89
|
+
.transform(
|
|
90
|
+
(value) =>
|
|
91
|
+
Uint8Array.from(atob(value), (character) => character.charCodeAt(0))
|
|
92
|
+
.buffer,
|
|
93
|
+
)
|
|
94
|
+
.describe("Binary data as base64-encoded string");
|
|
74
95
|
|
|
75
96
|
case "id":
|
|
76
97
|
return z
|