@epcc-sdk/sdks-files 0.4.0 → 0.4.1
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/client/mcp-support.gen.cjs +129 -22
- package/dist/client/mcp-support.gen.cjs.map +1 -1
- package/dist/client/mcp-support.gen.d.cts +2 -1
- package/dist/client/mcp-support.gen.d.ts +2 -1
- package/dist/client/mcp-support.gen.mjs +127 -21
- package/dist/client/mcp-support.gen.mjs.map +1 -1
- package/dist/client/mcp.gen.cjs +6 -3
- package/dist/client/mcp.gen.cjs.map +1 -1
- package/dist/client/mcp.gen.mjs +8 -4
- package/dist/client/mcp.gen.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -31,7 +31,8 @@ __export(mcp_support_gen_exports, {
|
|
|
31
31
|
dataUriFields: () => dataUriFields,
|
|
32
32
|
decodeDataUris: () => decodeDataUris,
|
|
33
33
|
loose: () => loose,
|
|
34
|
-
toToolResult: () => toToolResult
|
|
34
|
+
toToolResult: () => toToolResult,
|
|
35
|
+
withSharedSchemaIds: () => withSharedSchemaIds
|
|
35
36
|
});
|
|
36
37
|
module.exports = __toCommonJS(mcp_support_gen_exports);
|
|
37
38
|
var z = __toESM(require("zod"), 1);
|
|
@@ -53,44 +54,149 @@ const toToolResult = async (request) => {
|
|
|
53
54
|
}
|
|
54
55
|
return { isError: true, content: [{ type: "text", text }] };
|
|
55
56
|
};
|
|
56
|
-
const
|
|
57
|
+
const WRAPPER_TYPES = [
|
|
58
|
+
"optional",
|
|
59
|
+
"nullable",
|
|
60
|
+
"default",
|
|
61
|
+
"readonly",
|
|
62
|
+
"nonoptional",
|
|
63
|
+
"catch",
|
|
64
|
+
"prefault"
|
|
65
|
+
];
|
|
66
|
+
const madeByLoose = /* @__PURE__ */ new WeakSet();
|
|
67
|
+
function shapeCopiedOnFirstRead(copies, shape) {
|
|
68
|
+
const copy = {};
|
|
69
|
+
for (const key of Object.keys(shape)) {
|
|
70
|
+
Object.defineProperty(copy, key, {
|
|
71
|
+
configurable: true,
|
|
72
|
+
enumerable: true,
|
|
73
|
+
get() {
|
|
74
|
+
const value = looseIn(copies, shape[key]);
|
|
75
|
+
Object.defineProperty(copy, key, {
|
|
76
|
+
configurable: true,
|
|
77
|
+
enumerable: true,
|
|
78
|
+
writable: true,
|
|
79
|
+
value
|
|
80
|
+
});
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return copy;
|
|
86
|
+
}
|
|
87
|
+
function looseCopyOf(copies, schema) {
|
|
57
88
|
const def = schema._zod.def;
|
|
58
89
|
const copy = (changes) => schema.clone({ ...def, ...changes }, { parent: true });
|
|
90
|
+
const looseChild = (child) => looseIn(copies, child);
|
|
59
91
|
if (def.type === "object") {
|
|
60
92
|
return copy({
|
|
61
93
|
catchall: z.unknown(),
|
|
62
|
-
shape:
|
|
63
|
-
Object.keys(def.shape).map((key) => [key, loose(def.shape[key])])
|
|
64
|
-
)
|
|
94
|
+
shape: shapeCopiedOnFirstRead(copies, def.shape)
|
|
65
95
|
});
|
|
66
96
|
}
|
|
67
97
|
if (def.type === "array") {
|
|
68
|
-
return copy({ element:
|
|
98
|
+
return copy({ element: looseChild(def.element) });
|
|
69
99
|
}
|
|
70
100
|
if (def.type === "record") {
|
|
71
|
-
return copy({ valueType:
|
|
101
|
+
return copy({ valueType: looseChild(def.valueType) });
|
|
72
102
|
}
|
|
73
103
|
if (def.type === "lazy") {
|
|
74
|
-
return copy({ getter: () =>
|
|
75
|
-
}
|
|
76
|
-
if (
|
|
77
|
-
|
|
78
|
-
"nullable",
|
|
79
|
-
"default",
|
|
80
|
-
"readonly",
|
|
81
|
-
"nonoptional",
|
|
82
|
-
"catch",
|
|
83
|
-
"prefault"
|
|
84
|
-
].includes(def.type)) {
|
|
85
|
-
return copy({ innerType: loose(def.innerType) });
|
|
104
|
+
return copy({ getter: () => looseChild(def.getter()) });
|
|
105
|
+
}
|
|
106
|
+
if (WRAPPER_TYPES.includes(def.type)) {
|
|
107
|
+
return copy({ innerType: looseChild(def.innerType) });
|
|
86
108
|
}
|
|
87
109
|
if (def.type === "union") {
|
|
88
|
-
return copy({ options: def.options.map(
|
|
110
|
+
return copy({ options: def.options.map(looseChild) });
|
|
89
111
|
}
|
|
90
112
|
if (def.type === "intersection") {
|
|
91
|
-
return copy({ left:
|
|
113
|
+
return copy({ left: looseChild(def.left), right: looseChild(def.right) });
|
|
92
114
|
}
|
|
93
115
|
return schema;
|
|
116
|
+
}
|
|
117
|
+
function looseIn(copies, schema) {
|
|
118
|
+
if (madeByLoose.has(schema)) return schema;
|
|
119
|
+
const known = copies.get(schema);
|
|
120
|
+
if (known) return known;
|
|
121
|
+
const copy = looseCopyOf(copies, schema);
|
|
122
|
+
copies.set(schema, copy);
|
|
123
|
+
if (copy !== schema) madeByLoose.add(copy);
|
|
124
|
+
return copy;
|
|
125
|
+
}
|
|
126
|
+
const loose = (schema) => looseIn(/* @__PURE__ */ new WeakMap(), schema);
|
|
127
|
+
const SHARED_SCHEMA_MIN_LENGTH = 1e3;
|
|
128
|
+
function reachesFrom(schema, name) {
|
|
129
|
+
const def = schema._zod.def;
|
|
130
|
+
const reach = (child) => [name, child];
|
|
131
|
+
if (def.type === "object") {
|
|
132
|
+
return Object.keys(def.shape).map((key) => [
|
|
133
|
+
key,
|
|
134
|
+
def.shape[key]
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
if (def.type === "array") return [reach(def.element)];
|
|
138
|
+
if (def.type === "record") return [reach(def.valueType)];
|
|
139
|
+
if (def.type === "lazy") return [reach(def.getter())];
|
|
140
|
+
if (WRAPPER_TYPES.includes(def.type)) return [reach(def.innerType)];
|
|
141
|
+
if (def.type === "union") {
|
|
142
|
+
return def.options.map((option) => reach(option));
|
|
143
|
+
}
|
|
144
|
+
if (def.type === "intersection") return [reach(def.left), reach(def.right)];
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
147
|
+
function reachedSchemas(input) {
|
|
148
|
+
const reached = /* @__PURE__ */ new Map();
|
|
149
|
+
const visit = (name, schema) => {
|
|
150
|
+
const seen = reached.get(schema);
|
|
151
|
+
if (seen) {
|
|
152
|
+
seen.count++;
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
reached.set(schema, { name, count: 1 });
|
|
156
|
+
for (const [childName, child] of reachesFrom(schema, name)) {
|
|
157
|
+
visit(childName, child);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
visit("input", input);
|
|
161
|
+
return reached;
|
|
162
|
+
}
|
|
163
|
+
const listedLengthOf = (schema) => JSON.stringify(
|
|
164
|
+
z.toJSONSchema(schema, {
|
|
165
|
+
io: "input",
|
|
166
|
+
target: "draft-7",
|
|
167
|
+
unrepresentable: "any"
|
|
168
|
+
})
|
|
169
|
+
).length;
|
|
170
|
+
function unusedIdFor(api, name) {
|
|
171
|
+
const base = `${api}_${name.replace(/[^A-Za-z0-9_]/g, "_")}`;
|
|
172
|
+
let id = base;
|
|
173
|
+
for (let suffix = 2; z.globalRegistry._idmap.has(id); suffix++) {
|
|
174
|
+
id = `${base}_${suffix}`;
|
|
175
|
+
}
|
|
176
|
+
return id;
|
|
177
|
+
}
|
|
178
|
+
const withSharedSchemaIds = (api, input) => {
|
|
179
|
+
const candidates = [...reachedSchemas(input)].filter(
|
|
180
|
+
([schema, { count }]) => count > 1 && madeByLoose.has(schema) && !z.globalRegistry.has(schema)
|
|
181
|
+
).map(([schema, { name }]) => ({
|
|
182
|
+
schema,
|
|
183
|
+
name,
|
|
184
|
+
length: listedLengthOf(schema)
|
|
185
|
+
})).filter(({ length }) => length >= SHARED_SCHEMA_MIN_LENGTH).sort((a, b) => b.length - a.length);
|
|
186
|
+
let inputLength = listedLengthOf(input);
|
|
187
|
+
for (const { schema, name } of candidates) {
|
|
188
|
+
z.globalRegistry.add(schema, {
|
|
189
|
+
...z.globalRegistry.get(schema),
|
|
190
|
+
id: unusedIdFor(api, name)
|
|
191
|
+
});
|
|
192
|
+
const lengthWithId = listedLengthOf(input);
|
|
193
|
+
if (lengthWithId < inputLength) {
|
|
194
|
+
inputLength = lengthWithId;
|
|
195
|
+
} else {
|
|
196
|
+
z.globalRegistry.remove(schema);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return input;
|
|
94
200
|
};
|
|
95
201
|
const dataUriFields = (schema, fields, maxBytes) => schema.extend(
|
|
96
202
|
Object.fromEntries(
|
|
@@ -204,6 +310,7 @@ const decodeDataUris = async (body, fields, maxBytes) => {
|
|
|
204
310
|
dataUriFields,
|
|
205
311
|
decodeDataUris,
|
|
206
312
|
loose,
|
|
207
|
-
toToolResult
|
|
313
|
+
toToolResult,
|
|
314
|
+
withSharedSchemaIds
|
|
208
315
|
});
|
|
209
316
|
//# sourceMappingURL=mcp-support.gen.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/mcp-support.gen.ts"],"sourcesContent":["import type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport type { AnySchema } from \"@modelcontextprotocol/sdk/server/zod-compat.js\"\nimport type {\n CallToolResult,\n ToolAnnotations,\n} from \"@modelcontextprotocol/sdk/types.js\"\nimport * as z from \"zod\"\n\nexport type OperationMeta = {\n id: string\n method: string\n path: string\n risk: \"read\" | \"create\" | \"update\" | \"delete\"\n}\n\nexport type ToolConfig = {\n title?: string\n description?: string\n inputSchema: z.ZodObject<Record<string, z.ZodType<any>>>\n outputSchema?: AnySchema\n annotations?: ToolAnnotations\n _meta: {\n \"com.elasticpath/operation\": OperationMeta\n }\n}\n\nexport type Tool = {\n readonly name: string\n readonly config: ToolConfig\n readonly handler: ToolCallback<AnySchema>\n}\n\nconst messageOf = (error: unknown) =>\n error instanceof Error ? error.message : JSON.stringify(error)\n\nexport const toToolResult = async (\n request: Promise<{\n data?: unknown\n error?: unknown\n response?: Response\n }>,\n): Promise<CallToolResult> => {\n let text: string\n try {\n const result = await request\n if (result.error === undefined) {\n const structuredContent =\n typeof result.data === \"object\" &&\n result.data !== null &&\n !Array.isArray(result.data)\n ? (result.data as Record<string, unknown>)\n : { data: result.data ?? null }\n return {\n structuredContent,\n content: [{ type: \"text\", text: JSON.stringify(structuredContent) }],\n }\n }\n text = result.response\n ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}`\n : messageOf(result.error)\n } catch (error) {\n text = messageOf(error)\n }\n return { isError: true, content: [{ type: \"text\", text }] }\n}\n\nexport const loose = <T extends z.ZodType>(schema: T): T => {\n const def: any = schema._zod.def\n const copy = (changes: object): T =>\n schema.clone({ ...def, ...changes }, { parent: true })\n if (def.type === \"object\") {\n return copy({\n catchall: z.unknown(),\n shape: Object.fromEntries(\n Object.keys(def.shape).map((key) => [key, loose(def.shape[key])]),\n ),\n })\n }\n if (def.type === \"array\") {\n return copy({ element: loose(def.element) })\n }\n if (def.type === \"record\") {\n return copy({ valueType: loose(def.valueType) })\n }\n if (def.type === \"lazy\") {\n return copy({ getter: () => loose(def.getter()) })\n }\n if (\n [\n \"optional\",\n \"nullable\",\n \"default\",\n \"readonly\",\n \"nonoptional\",\n \"catch\",\n \"prefault\",\n ].includes(def.type)\n ) {\n return copy({ innerType: loose(def.innerType) })\n }\n if (def.type === \"union\") {\n return copy({ options: def.options.map(loose) })\n }\n if (def.type === \"intersection\") {\n return copy({ left: loose(def.left), right: loose(def.right) })\n }\n return schema\n}\n\ntype FileNameFields<K extends string> = {\n [P in `${K}_name`]: z.ZodOptional<z.ZodString>\n}\n\nexport const dataUriFields = <\n S extends z.ZodRawShape,\n C extends z.core.$ZodObjectConfig,\n K extends string,\n>(\n schema: z.ZodObject<S, C>,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C> =>\n schema.extend(\n Object.fromEntries(\n fields.flatMap((field) => {\n const current = schema.shape[field] as unknown as z.ZodType\n const uri = z.string().meta({\n format: \"uri\",\n \"x-mcp-file\": { maxSize: maxBytes },\n description: [\n current.description,\n `Send the file as a data: URI, such as data:text/csv;base64,<base64 bytes>, at most ${maxBytes} bytes once decoded.`,\n ]\n .filter(Boolean)\n .join(\" \"),\n })\n const name = z\n .string()\n .meta({\n description: `The name of the file sent in ${field}, such as products.csv.`,\n })\n .optional()\n return [\n [field, current.isOptional() ? uri.optional() : uri],\n [`${field}_name`, name],\n ]\n }),\n ),\n ) as unknown as z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C>\n\ntype DataUrisDecoded<T, K extends string> = T extends object\n ? Omit<T, K | `${K}_name`> & {\n [P in K & keyof T]: undefined extends T[P] ? File | undefined : File\n }\n : T\n\nconst DATA_URI = /^data:([^,]*),(.*)$/is\nconst PERCENT_ENCODED = /^[0-9a-f]{2}$/i\n\nconst notADataUriError = (field: string) =>\n new Error(\n `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`,\n )\n\nconst fileTooBigError = (field: string, bytes: number, maxBytes: number) =>\n new Error(\n `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`,\n )\n\nfunction percentDecoded(field: string, text: string) {\n const bytes: number[] = []\n const encoder = new TextEncoder()\n for (let index = 0; index < text.length; index++) {\n if (text[index] === \"%\") {\n const hex = text.slice(index + 1, index + 3)\n if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field)\n bytes.push(parseInt(hex, 16))\n index += 2\n } else {\n const codePoint = text.codePointAt(index)!\n const character = String.fromCodePoint(codePoint)\n bytes.push(...encoder.encode(character))\n index += character.length - 1\n }\n }\n return new Uint8Array(bytes)\n}\n\nfunction base64Decoded(field: string, text: string, maxBytes: number) {\n const data = text.replace(/\\s/g, \"\")\n const padding = data.endsWith(\"==\") ? 2 : data.endsWith(\"=\") ? 1 : 0\n const bytes = Math.floor((data.length * 3) / 4) - padding\n if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes)\n let binary: string\n try {\n binary = atob(data)\n } catch {\n throw new Error(`${field} is not valid base64`)\n }\n return Uint8Array.from(binary, (character) => character.charCodeAt(0))\n}\n\nfunction fileFromDataUri(\n field: string,\n uri: unknown,\n maxBytes: number,\n givenName: unknown,\n) {\n const match = typeof uri === \"string\" ? DATA_URI.exec(uri) : null\n if (!match) throw notADataUriError(field)\n const parameters = match[1]!.split(\";\")\n const isBase64 = parameters.at(-1)!.toLowerCase() === \"base64\"\n if (isBase64) parameters.pop()\n const mediaType = parameters.shift()!.trim()\n const nameParameter = parameters.find((parameter) =>\n parameter.trim().toLowerCase().startsWith(\"name=\"),\n )\n let name = field\n if (typeof givenName === \"string\" && givenName.trim()) {\n name = givenName.trim()\n } else if (nameParameter) {\n try {\n name = decodeURIComponent(nameParameter.trim().slice(\"name=\".length))\n } catch {\n throw notADataUriError(field)\n }\n }\n const bytes = isBase64\n ? base64Decoded(field, match[2]!, maxBytes)\n : percentDecoded(field, match[2]!)\n if (bytes.length > maxBytes)\n throw fileTooBigError(field, bytes.length, maxBytes)\n return new File([bytes], name, {\n type: mediaType.includes(\"/\") ? mediaType : \"text/plain\",\n })\n}\n\nexport const decodeDataUris = async <T, K extends string>(\n body: T,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): Promise<DataUrisDecoded<T, K>> => {\n if (typeof body !== \"object\" || body === null) {\n return body as DataUrisDecoded<T, K>\n }\n const decoded = { ...body } as Record<string, unknown>\n for (const field of fields) {\n const givenName = decoded[`${field}_name`]\n delete decoded[`${field}_name`]\n if (decoded[field] !== undefined) {\n decoded[field] = fileFromDataUri(\n field,\n decoded[field],\n maxBytes,\n givenName,\n )\n }\n }\n return decoded as DataUrisDecoded<T, K>\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/mcp-support.gen.ts"],"sourcesContent":["import type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport type { AnySchema } from \"@modelcontextprotocol/sdk/server/zod-compat.js\"\nimport type {\n CallToolResult,\n ToolAnnotations,\n} from \"@modelcontextprotocol/sdk/types.js\"\nimport * as z from \"zod\"\n\nexport type OperationMeta = {\n id: string\n method: string\n path: string\n risk: \"read\" | \"create\" | \"update\" | \"delete\"\n}\n\nexport type ToolConfig = {\n title?: string\n description?: string\n inputSchema: z.ZodObject<Record<string, z.ZodType<any>>>\n outputSchema?: AnySchema\n annotations?: ToolAnnotations\n _meta: {\n \"com.elasticpath/operation\": OperationMeta\n }\n}\n\nexport type Tool = {\n readonly name: string\n readonly config: ToolConfig\n readonly handler: ToolCallback<AnySchema>\n}\n\nconst messageOf = (error: unknown) =>\n error instanceof Error ? error.message : JSON.stringify(error)\n\nexport const toToolResult = async (\n request: Promise<{\n data?: unknown\n error?: unknown\n response?: Response\n }>,\n): Promise<CallToolResult> => {\n let text: string\n try {\n const result = await request\n if (result.error === undefined) {\n const structuredContent =\n typeof result.data === \"object\" &&\n result.data !== null &&\n !Array.isArray(result.data)\n ? (result.data as Record<string, unknown>)\n : { data: result.data ?? null }\n return {\n structuredContent,\n content: [{ type: \"text\", text: JSON.stringify(structuredContent) }],\n }\n }\n text = result.response\n ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}`\n : messageOf(result.error)\n } catch (error) {\n text = messageOf(error)\n }\n return { isError: true, content: [{ type: \"text\", text }] }\n}\n\nconst WRAPPER_TYPES = [\n \"optional\",\n \"nullable\",\n \"default\",\n \"readonly\",\n \"nonoptional\",\n \"catch\",\n \"prefault\",\n]\n\ntype LooseCopies = WeakMap<z.ZodType, z.ZodType>\n\nconst madeByLoose = new WeakSet<z.ZodType>()\n\nfunction shapeCopiedOnFirstRead(\n copies: LooseCopies,\n shape: Record<string, z.ZodType>,\n) {\n const copy: Record<string, z.ZodType> = {}\n for (const key of Object.keys(shape)) {\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n get() {\n const value = looseIn(copies, shape[key]!)\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value,\n })\n return value\n },\n })\n }\n return copy\n}\n\nfunction looseCopyOf<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n const def: any = schema._zod.def\n const copy = (changes: object): T =>\n schema.clone({ ...def, ...changes }, { parent: true })\n const looseChild = (child: z.ZodType) => looseIn(copies, child)\n if (def.type === \"object\") {\n return copy({\n catchall: z.unknown(),\n shape: shapeCopiedOnFirstRead(copies, def.shape),\n })\n }\n if (def.type === \"array\") {\n return copy({ element: looseChild(def.element) })\n }\n if (def.type === \"record\") {\n return copy({ valueType: looseChild(def.valueType) })\n }\n if (def.type === \"lazy\") {\n return copy({ getter: () => looseChild(def.getter()) })\n }\n if (WRAPPER_TYPES.includes(def.type)) {\n return copy({ innerType: looseChild(def.innerType) })\n }\n if (def.type === \"union\") {\n return copy({ options: def.options.map(looseChild) })\n }\n if (def.type === \"intersection\") {\n return copy({ left: looseChild(def.left), right: looseChild(def.right) })\n }\n return schema\n}\n\nfunction looseIn<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n if (madeByLoose.has(schema)) return schema\n const known = copies.get(schema)\n if (known) return known as T\n const copy = looseCopyOf(copies, schema)\n copies.set(schema, copy)\n if (copy !== schema) madeByLoose.add(copy)\n return copy\n}\n\nexport const loose = <T extends z.ZodType>(schema: T): T =>\n looseIn(new WeakMap(), schema)\n\nconst SHARED_SCHEMA_MIN_LENGTH = 1000\n\nfunction reachesFrom(schema: z.ZodType, name: string) {\n const def: any = schema._zod.def\n const reach = (child: z.ZodType): [string, z.ZodType] => [name, child]\n if (def.type === \"object\") {\n return Object.keys(def.shape).map((key): [string, z.ZodType] => [\n key,\n def.shape[key],\n ])\n }\n if (def.type === \"array\") return [reach(def.element)]\n if (def.type === \"record\") return [reach(def.valueType)]\n if (def.type === \"lazy\") return [reach(def.getter())]\n if (WRAPPER_TYPES.includes(def.type)) return [reach(def.innerType)]\n if (def.type === \"union\") {\n return def.options.map((option: z.ZodType) => reach(option))\n }\n if (def.type === \"intersection\") return [reach(def.left), reach(def.right)]\n return []\n}\n\nfunction reachedSchemas(input: z.ZodType) {\n const reached = new Map<z.ZodType, { name: string; count: number }>()\n const visit = (name: string, schema: z.ZodType) => {\n const seen = reached.get(schema)\n if (seen) {\n seen.count++\n return\n }\n reached.set(schema, { name, count: 1 })\n for (const [childName, child] of reachesFrom(schema, name)) {\n visit(childName, child)\n }\n }\n visit(\"input\", input)\n return reached\n}\n\nconst listedLengthOf = (schema: z.ZodType) =>\n JSON.stringify(\n z.toJSONSchema(schema, {\n io: \"input\",\n target: \"draft-7\",\n unrepresentable: \"any\",\n }),\n ).length\n\nfunction unusedIdFor(api: string, name: string) {\n const base = `${api}_${name.replace(/[^A-Za-z0-9_]/g, \"_\")}`\n let id = base\n for (let suffix = 2; z.globalRegistry._idmap.has(id); suffix++) {\n id = `${base}_${suffix}`\n }\n return id\n}\n\nexport const withSharedSchemaIds = <T extends z.ZodType>(\n api: string,\n input: T,\n): T => {\n const candidates = [...reachedSchemas(input)]\n .filter(\n ([schema, { count }]) =>\n count > 1 && madeByLoose.has(schema) && !z.globalRegistry.has(schema),\n )\n .map(([schema, { name }]) => ({\n schema,\n name,\n length: listedLengthOf(schema),\n }))\n .filter(({ length }) => length >= SHARED_SCHEMA_MIN_LENGTH)\n .sort((a, b) => b.length - a.length)\n let inputLength = listedLengthOf(input)\n for (const { schema, name } of candidates) {\n z.globalRegistry.add(schema, {\n ...z.globalRegistry.get(schema),\n id: unusedIdFor(api, name),\n })\n const lengthWithId = listedLengthOf(input)\n if (lengthWithId < inputLength) {\n inputLength = lengthWithId\n } else {\n z.globalRegistry.remove(schema)\n }\n }\n return input\n}\n\ntype FileNameFields<K extends string> = {\n [P in `${K}_name`]: z.ZodOptional<z.ZodString>\n}\n\nexport const dataUriFields = <\n S extends z.ZodRawShape,\n C extends z.core.$ZodObjectConfig,\n K extends string,\n>(\n schema: z.ZodObject<S, C>,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C> =>\n schema.extend(\n Object.fromEntries(\n fields.flatMap((field) => {\n const current = schema.shape[field] as unknown as z.ZodType\n const uri = z.string().meta({\n format: \"uri\",\n \"x-mcp-file\": { maxSize: maxBytes },\n description: [\n current.description,\n `Send the file as a data: URI, such as data:text/csv;base64,<base64 bytes>, at most ${maxBytes} bytes once decoded.`,\n ]\n .filter(Boolean)\n .join(\" \"),\n })\n const name = z\n .string()\n .meta({\n description: `The name of the file sent in ${field}, such as products.csv.`,\n })\n .optional()\n return [\n [field, current.isOptional() ? uri.optional() : uri],\n [`${field}_name`, name],\n ]\n }),\n ),\n ) as unknown as z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C>\n\ntype DataUrisDecoded<T, K extends string> = T extends object\n ? Omit<T, K | `${K}_name`> & {\n [P in K & keyof T]: undefined extends T[P] ? File | undefined : File\n }\n : T\n\nconst DATA_URI = /^data:([^,]*),(.*)$/is\nconst PERCENT_ENCODED = /^[0-9a-f]{2}$/i\n\nconst notADataUriError = (field: string) =>\n new Error(\n `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`,\n )\n\nconst fileTooBigError = (field: string, bytes: number, maxBytes: number) =>\n new Error(\n `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`,\n )\n\nfunction percentDecoded(field: string, text: string) {\n const bytes: number[] = []\n const encoder = new TextEncoder()\n for (let index = 0; index < text.length; index++) {\n if (text[index] === \"%\") {\n const hex = text.slice(index + 1, index + 3)\n if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field)\n bytes.push(parseInt(hex, 16))\n index += 2\n } else {\n const codePoint = text.codePointAt(index)!\n const character = String.fromCodePoint(codePoint)\n bytes.push(...encoder.encode(character))\n index += character.length - 1\n }\n }\n return new Uint8Array(bytes)\n}\n\nfunction base64Decoded(field: string, text: string, maxBytes: number) {\n const data = text.replace(/\\s/g, \"\")\n const padding = data.endsWith(\"==\") ? 2 : data.endsWith(\"=\") ? 1 : 0\n const bytes = Math.floor((data.length * 3) / 4) - padding\n if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes)\n let binary: string\n try {\n binary = atob(data)\n } catch {\n throw new Error(`${field} is not valid base64`)\n }\n return Uint8Array.from(binary, (character) => character.charCodeAt(0))\n}\n\nfunction fileFromDataUri(\n field: string,\n uri: unknown,\n maxBytes: number,\n givenName: unknown,\n) {\n const match = typeof uri === \"string\" ? DATA_URI.exec(uri) : null\n if (!match) throw notADataUriError(field)\n const parameters = match[1]!.split(\";\")\n const isBase64 = parameters.at(-1)!.toLowerCase() === \"base64\"\n if (isBase64) parameters.pop()\n const mediaType = parameters.shift()!.trim()\n const nameParameter = parameters.find((parameter) =>\n parameter.trim().toLowerCase().startsWith(\"name=\"),\n )\n let name = field\n if (typeof givenName === \"string\" && givenName.trim()) {\n name = givenName.trim()\n } else if (nameParameter) {\n try {\n name = decodeURIComponent(nameParameter.trim().slice(\"name=\".length))\n } catch {\n throw notADataUriError(field)\n }\n }\n const bytes = isBase64\n ? base64Decoded(field, match[2]!, maxBytes)\n : percentDecoded(field, match[2]!)\n if (bytes.length > maxBytes)\n throw fileTooBigError(field, bytes.length, maxBytes)\n return new File([bytes], name, {\n type: mediaType.includes(\"/\") ? mediaType : \"text/plain\",\n })\n}\n\nexport const decodeDataUris = async <T, K extends string>(\n body: T,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): Promise<DataUrisDecoded<T, K>> => {\n if (typeof body !== \"object\" || body === null) {\n return body as DataUrisDecoded<T, K>\n }\n const decoded = { ...body } as Record<string, unknown>\n for (const field of fields) {\n const givenName = decoded[`${field}_name`]\n delete decoded[`${field}_name`]\n if (decoded[field] !== undefined) {\n decoded[field] = fileFromDataUri(\n field,\n decoded[field],\n maxBytes,\n givenName,\n )\n }\n }\n return decoded as DataUrisDecoded<T, K>\n}\n"],"mappings":"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","names":[]}
|
|
@@ -30,6 +30,7 @@ declare const toToolResult: (request: Promise<{
|
|
|
30
30
|
response?: Response;
|
|
31
31
|
}>) => Promise<CallToolResult>;
|
|
32
32
|
declare const loose: <T extends z.ZodType>(schema: T) => T;
|
|
33
|
+
declare const withSharedSchemaIds: <T extends z.ZodType>(api: string, input: T) => T;
|
|
33
34
|
type FileNameFields<K extends string> = {
|
|
34
35
|
[P in `${K}_name`]: z.ZodOptional<z.ZodString>;
|
|
35
36
|
};
|
|
@@ -39,4 +40,4 @@ type DataUrisDecoded<T, K extends string> = T extends object ? Omit<T, K | `${K}
|
|
|
39
40
|
} : T;
|
|
40
41
|
declare const decodeDataUris: <T, K extends string>(body: T, fields: ReadonlyArray<K>, maxBytes: number) => Promise<DataUrisDecoded<T, K>>;
|
|
41
42
|
|
|
42
|
-
export { type OperationMeta, type Tool, type ToolConfig, dataUriFields, decodeDataUris, loose, toToolResult };
|
|
43
|
+
export { type OperationMeta, type Tool, type ToolConfig, dataUriFields, decodeDataUris, loose, toToolResult, withSharedSchemaIds };
|
|
@@ -30,6 +30,7 @@ declare const toToolResult: (request: Promise<{
|
|
|
30
30
|
response?: Response;
|
|
31
31
|
}>) => Promise<CallToolResult>;
|
|
32
32
|
declare const loose: <T extends z.ZodType>(schema: T) => T;
|
|
33
|
+
declare const withSharedSchemaIds: <T extends z.ZodType>(api: string, input: T) => T;
|
|
33
34
|
type FileNameFields<K extends string> = {
|
|
34
35
|
[P in `${K}_name`]: z.ZodOptional<z.ZodString>;
|
|
35
36
|
};
|
|
@@ -39,4 +40,4 @@ type DataUrisDecoded<T, K extends string> = T extends object ? Omit<T, K | `${K}
|
|
|
39
40
|
} : T;
|
|
40
41
|
declare const decodeDataUris: <T, K extends string>(body: T, fields: ReadonlyArray<K>, maxBytes: number) => Promise<DataUrisDecoded<T, K>>;
|
|
41
42
|
|
|
42
|
-
export { type OperationMeta, type Tool, type ToolConfig, dataUriFields, decodeDataUris, loose, toToolResult };
|
|
43
|
+
export { type OperationMeta, type Tool, type ToolConfig, dataUriFields, decodeDataUris, loose, toToolResult, withSharedSchemaIds };
|
|
@@ -17,44 +17,149 @@ const toToolResult = async (request) => {
|
|
|
17
17
|
}
|
|
18
18
|
return { isError: true, content: [{ type: "text", text }] };
|
|
19
19
|
};
|
|
20
|
-
const
|
|
20
|
+
const WRAPPER_TYPES = [
|
|
21
|
+
"optional",
|
|
22
|
+
"nullable",
|
|
23
|
+
"default",
|
|
24
|
+
"readonly",
|
|
25
|
+
"nonoptional",
|
|
26
|
+
"catch",
|
|
27
|
+
"prefault"
|
|
28
|
+
];
|
|
29
|
+
const madeByLoose = /* @__PURE__ */ new WeakSet();
|
|
30
|
+
function shapeCopiedOnFirstRead(copies, shape) {
|
|
31
|
+
const copy = {};
|
|
32
|
+
for (const key of Object.keys(shape)) {
|
|
33
|
+
Object.defineProperty(copy, key, {
|
|
34
|
+
configurable: true,
|
|
35
|
+
enumerable: true,
|
|
36
|
+
get() {
|
|
37
|
+
const value = looseIn(copies, shape[key]);
|
|
38
|
+
Object.defineProperty(copy, key, {
|
|
39
|
+
configurable: true,
|
|
40
|
+
enumerable: true,
|
|
41
|
+
writable: true,
|
|
42
|
+
value
|
|
43
|
+
});
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return copy;
|
|
49
|
+
}
|
|
50
|
+
function looseCopyOf(copies, schema) {
|
|
21
51
|
const def = schema._zod.def;
|
|
22
52
|
const copy = (changes) => schema.clone({ ...def, ...changes }, { parent: true });
|
|
53
|
+
const looseChild = (child) => looseIn(copies, child);
|
|
23
54
|
if (def.type === "object") {
|
|
24
55
|
return copy({
|
|
25
56
|
catchall: z.unknown(),
|
|
26
|
-
shape:
|
|
27
|
-
Object.keys(def.shape).map((key) => [key, loose(def.shape[key])])
|
|
28
|
-
)
|
|
57
|
+
shape: shapeCopiedOnFirstRead(copies, def.shape)
|
|
29
58
|
});
|
|
30
59
|
}
|
|
31
60
|
if (def.type === "array") {
|
|
32
|
-
return copy({ element:
|
|
61
|
+
return copy({ element: looseChild(def.element) });
|
|
33
62
|
}
|
|
34
63
|
if (def.type === "record") {
|
|
35
|
-
return copy({ valueType:
|
|
64
|
+
return copy({ valueType: looseChild(def.valueType) });
|
|
36
65
|
}
|
|
37
66
|
if (def.type === "lazy") {
|
|
38
|
-
return copy({ getter: () =>
|
|
39
|
-
}
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
"nullable",
|
|
43
|
-
"default",
|
|
44
|
-
"readonly",
|
|
45
|
-
"nonoptional",
|
|
46
|
-
"catch",
|
|
47
|
-
"prefault"
|
|
48
|
-
].includes(def.type)) {
|
|
49
|
-
return copy({ innerType: loose(def.innerType) });
|
|
67
|
+
return copy({ getter: () => looseChild(def.getter()) });
|
|
68
|
+
}
|
|
69
|
+
if (WRAPPER_TYPES.includes(def.type)) {
|
|
70
|
+
return copy({ innerType: looseChild(def.innerType) });
|
|
50
71
|
}
|
|
51
72
|
if (def.type === "union") {
|
|
52
|
-
return copy({ options: def.options.map(
|
|
73
|
+
return copy({ options: def.options.map(looseChild) });
|
|
53
74
|
}
|
|
54
75
|
if (def.type === "intersection") {
|
|
55
|
-
return copy({ left:
|
|
76
|
+
return copy({ left: looseChild(def.left), right: looseChild(def.right) });
|
|
56
77
|
}
|
|
57
78
|
return schema;
|
|
79
|
+
}
|
|
80
|
+
function looseIn(copies, schema) {
|
|
81
|
+
if (madeByLoose.has(schema)) return schema;
|
|
82
|
+
const known = copies.get(schema);
|
|
83
|
+
if (known) return known;
|
|
84
|
+
const copy = looseCopyOf(copies, schema);
|
|
85
|
+
copies.set(schema, copy);
|
|
86
|
+
if (copy !== schema) madeByLoose.add(copy);
|
|
87
|
+
return copy;
|
|
88
|
+
}
|
|
89
|
+
const loose = (schema) => looseIn(/* @__PURE__ */ new WeakMap(), schema);
|
|
90
|
+
const SHARED_SCHEMA_MIN_LENGTH = 1e3;
|
|
91
|
+
function reachesFrom(schema, name) {
|
|
92
|
+
const def = schema._zod.def;
|
|
93
|
+
const reach = (child) => [name, child];
|
|
94
|
+
if (def.type === "object") {
|
|
95
|
+
return Object.keys(def.shape).map((key) => [
|
|
96
|
+
key,
|
|
97
|
+
def.shape[key]
|
|
98
|
+
]);
|
|
99
|
+
}
|
|
100
|
+
if (def.type === "array") return [reach(def.element)];
|
|
101
|
+
if (def.type === "record") return [reach(def.valueType)];
|
|
102
|
+
if (def.type === "lazy") return [reach(def.getter())];
|
|
103
|
+
if (WRAPPER_TYPES.includes(def.type)) return [reach(def.innerType)];
|
|
104
|
+
if (def.type === "union") {
|
|
105
|
+
return def.options.map((option) => reach(option));
|
|
106
|
+
}
|
|
107
|
+
if (def.type === "intersection") return [reach(def.left), reach(def.right)];
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
function reachedSchemas(input) {
|
|
111
|
+
const reached = /* @__PURE__ */ new Map();
|
|
112
|
+
const visit = (name, schema) => {
|
|
113
|
+
const seen = reached.get(schema);
|
|
114
|
+
if (seen) {
|
|
115
|
+
seen.count++;
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
reached.set(schema, { name, count: 1 });
|
|
119
|
+
for (const [childName, child] of reachesFrom(schema, name)) {
|
|
120
|
+
visit(childName, child);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
visit("input", input);
|
|
124
|
+
return reached;
|
|
125
|
+
}
|
|
126
|
+
const listedLengthOf = (schema) => JSON.stringify(
|
|
127
|
+
z.toJSONSchema(schema, {
|
|
128
|
+
io: "input",
|
|
129
|
+
target: "draft-7",
|
|
130
|
+
unrepresentable: "any"
|
|
131
|
+
})
|
|
132
|
+
).length;
|
|
133
|
+
function unusedIdFor(api, name) {
|
|
134
|
+
const base = `${api}_${name.replace(/[^A-Za-z0-9_]/g, "_")}`;
|
|
135
|
+
let id = base;
|
|
136
|
+
for (let suffix = 2; z.globalRegistry._idmap.has(id); suffix++) {
|
|
137
|
+
id = `${base}_${suffix}`;
|
|
138
|
+
}
|
|
139
|
+
return id;
|
|
140
|
+
}
|
|
141
|
+
const withSharedSchemaIds = (api, input) => {
|
|
142
|
+
const candidates = [...reachedSchemas(input)].filter(
|
|
143
|
+
([schema, { count }]) => count > 1 && madeByLoose.has(schema) && !z.globalRegistry.has(schema)
|
|
144
|
+
).map(([schema, { name }]) => ({
|
|
145
|
+
schema,
|
|
146
|
+
name,
|
|
147
|
+
length: listedLengthOf(schema)
|
|
148
|
+
})).filter(({ length }) => length >= SHARED_SCHEMA_MIN_LENGTH).sort((a, b) => b.length - a.length);
|
|
149
|
+
let inputLength = listedLengthOf(input);
|
|
150
|
+
for (const { schema, name } of candidates) {
|
|
151
|
+
z.globalRegistry.add(schema, {
|
|
152
|
+
...z.globalRegistry.get(schema),
|
|
153
|
+
id: unusedIdFor(api, name)
|
|
154
|
+
});
|
|
155
|
+
const lengthWithId = listedLengthOf(input);
|
|
156
|
+
if (lengthWithId < inputLength) {
|
|
157
|
+
inputLength = lengthWithId;
|
|
158
|
+
} else {
|
|
159
|
+
z.globalRegistry.remove(schema);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return input;
|
|
58
163
|
};
|
|
59
164
|
const dataUriFields = (schema, fields, maxBytes) => schema.extend(
|
|
60
165
|
Object.fromEntries(
|
|
@@ -167,6 +272,7 @@ export {
|
|
|
167
272
|
dataUriFields,
|
|
168
273
|
decodeDataUris,
|
|
169
274
|
loose,
|
|
170
|
-
toToolResult
|
|
275
|
+
toToolResult,
|
|
276
|
+
withSharedSchemaIds
|
|
171
277
|
};
|
|
172
278
|
//# sourceMappingURL=mcp-support.gen.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/mcp-support.gen.ts"],"sourcesContent":["import type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport type { AnySchema } from \"@modelcontextprotocol/sdk/server/zod-compat.js\"\nimport type {\n CallToolResult,\n ToolAnnotations,\n} from \"@modelcontextprotocol/sdk/types.js\"\nimport * as z from \"zod\"\n\nexport type OperationMeta = {\n id: string\n method: string\n path: string\n risk: \"read\" | \"create\" | \"update\" | \"delete\"\n}\n\nexport type ToolConfig = {\n title?: string\n description?: string\n inputSchema: z.ZodObject<Record<string, z.ZodType<any>>>\n outputSchema?: AnySchema\n annotations?: ToolAnnotations\n _meta: {\n \"com.elasticpath/operation\": OperationMeta\n }\n}\n\nexport type Tool = {\n readonly name: string\n readonly config: ToolConfig\n readonly handler: ToolCallback<AnySchema>\n}\n\nconst messageOf = (error: unknown) =>\n error instanceof Error ? error.message : JSON.stringify(error)\n\nexport const toToolResult = async (\n request: Promise<{\n data?: unknown\n error?: unknown\n response?: Response\n }>,\n): Promise<CallToolResult> => {\n let text: string\n try {\n const result = await request\n if (result.error === undefined) {\n const structuredContent =\n typeof result.data === \"object\" &&\n result.data !== null &&\n !Array.isArray(result.data)\n ? (result.data as Record<string, unknown>)\n : { data: result.data ?? null }\n return {\n structuredContent,\n content: [{ type: \"text\", text: JSON.stringify(structuredContent) }],\n }\n }\n text = result.response\n ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}`\n : messageOf(result.error)\n } catch (error) {\n text = messageOf(error)\n }\n return { isError: true, content: [{ type: \"text\", text }] }\n}\n\nexport const loose = <T extends z.ZodType>(schema: T): T => {\n const def: any = schema._zod.def\n const copy = (changes: object): T =>\n schema.clone({ ...def, ...changes }, { parent: true })\n if (def.type === \"object\") {\n return copy({\n catchall: z.unknown(),\n shape: Object.fromEntries(\n Object.keys(def.shape).map((key) => [key, loose(def.shape[key])]),\n ),\n })\n }\n if (def.type === \"array\") {\n return copy({ element: loose(def.element) })\n }\n if (def.type === \"record\") {\n return copy({ valueType: loose(def.valueType) })\n }\n if (def.type === \"lazy\") {\n return copy({ getter: () => loose(def.getter()) })\n }\n if (\n [\n \"optional\",\n \"nullable\",\n \"default\",\n \"readonly\",\n \"nonoptional\",\n \"catch\",\n \"prefault\",\n ].includes(def.type)\n ) {\n return copy({ innerType: loose(def.innerType) })\n }\n if (def.type === \"union\") {\n return copy({ options: def.options.map(loose) })\n }\n if (def.type === \"intersection\") {\n return copy({ left: loose(def.left), right: loose(def.right) })\n }\n return schema\n}\n\ntype FileNameFields<K extends string> = {\n [P in `${K}_name`]: z.ZodOptional<z.ZodString>\n}\n\nexport const dataUriFields = <\n S extends z.ZodRawShape,\n C extends z.core.$ZodObjectConfig,\n K extends string,\n>(\n schema: z.ZodObject<S, C>,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C> =>\n schema.extend(\n Object.fromEntries(\n fields.flatMap((field) => {\n const current = schema.shape[field] as unknown as z.ZodType\n const uri = z.string().meta({\n format: \"uri\",\n \"x-mcp-file\": { maxSize: maxBytes },\n description: [\n current.description,\n `Send the file as a data: URI, such as data:text/csv;base64,<base64 bytes>, at most ${maxBytes} bytes once decoded.`,\n ]\n .filter(Boolean)\n .join(\" \"),\n })\n const name = z\n .string()\n .meta({\n description: `The name of the file sent in ${field}, such as products.csv.`,\n })\n .optional()\n return [\n [field, current.isOptional() ? uri.optional() : uri],\n [`${field}_name`, name],\n ]\n }),\n ),\n ) as unknown as z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C>\n\ntype DataUrisDecoded<T, K extends string> = T extends object\n ? Omit<T, K | `${K}_name`> & {\n [P in K & keyof T]: undefined extends T[P] ? File | undefined : File\n }\n : T\n\nconst DATA_URI = /^data:([^,]*),(.*)$/is\nconst PERCENT_ENCODED = /^[0-9a-f]{2}$/i\n\nconst notADataUriError = (field: string) =>\n new Error(\n `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`,\n )\n\nconst fileTooBigError = (field: string, bytes: number, maxBytes: number) =>\n new Error(\n `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`,\n )\n\nfunction percentDecoded(field: string, text: string) {\n const bytes: number[] = []\n const encoder = new TextEncoder()\n for (let index = 0; index < text.length; index++) {\n if (text[index] === \"%\") {\n const hex = text.slice(index + 1, index + 3)\n if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field)\n bytes.push(parseInt(hex, 16))\n index += 2\n } else {\n const codePoint = text.codePointAt(index)!\n const character = String.fromCodePoint(codePoint)\n bytes.push(...encoder.encode(character))\n index += character.length - 1\n }\n }\n return new Uint8Array(bytes)\n}\n\nfunction base64Decoded(field: string, text: string, maxBytes: number) {\n const data = text.replace(/\\s/g, \"\")\n const padding = data.endsWith(\"==\") ? 2 : data.endsWith(\"=\") ? 1 : 0\n const bytes = Math.floor((data.length * 3) / 4) - padding\n if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes)\n let binary: string\n try {\n binary = atob(data)\n } catch {\n throw new Error(`${field} is not valid base64`)\n }\n return Uint8Array.from(binary, (character) => character.charCodeAt(0))\n}\n\nfunction fileFromDataUri(\n field: string,\n uri: unknown,\n maxBytes: number,\n givenName: unknown,\n) {\n const match = typeof uri === \"string\" ? DATA_URI.exec(uri) : null\n if (!match) throw notADataUriError(field)\n const parameters = match[1]!.split(\";\")\n const isBase64 = parameters.at(-1)!.toLowerCase() === \"base64\"\n if (isBase64) parameters.pop()\n const mediaType = parameters.shift()!.trim()\n const nameParameter = parameters.find((parameter) =>\n parameter.trim().toLowerCase().startsWith(\"name=\"),\n )\n let name = field\n if (typeof givenName === \"string\" && givenName.trim()) {\n name = givenName.trim()\n } else if (nameParameter) {\n try {\n name = decodeURIComponent(nameParameter.trim().slice(\"name=\".length))\n } catch {\n throw notADataUriError(field)\n }\n }\n const bytes = isBase64\n ? base64Decoded(field, match[2]!, maxBytes)\n : percentDecoded(field, match[2]!)\n if (bytes.length > maxBytes)\n throw fileTooBigError(field, bytes.length, maxBytes)\n return new File([bytes], name, {\n type: mediaType.includes(\"/\") ? mediaType : \"text/plain\",\n })\n}\n\nexport const decodeDataUris = async <T, K extends string>(\n body: T,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): Promise<DataUrisDecoded<T, K>> => {\n if (typeof body !== \"object\" || body === null) {\n return body as DataUrisDecoded<T, K>\n }\n const decoded = { ...body } as Record<string, unknown>\n for (const field of fields) {\n const givenName = decoded[`${field}_name`]\n delete decoded[`${field}_name`]\n if (decoded[field] !== undefined) {\n decoded[field] = fileFromDataUri(\n field,\n decoded[field],\n maxBytes,\n givenName,\n )\n }\n }\n return decoded as DataUrisDecoded<T, K>\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/mcp-support.gen.ts"],"sourcesContent":["import type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport type { AnySchema } from \"@modelcontextprotocol/sdk/server/zod-compat.js\"\nimport type {\n CallToolResult,\n ToolAnnotations,\n} from \"@modelcontextprotocol/sdk/types.js\"\nimport * as z from \"zod\"\n\nexport type OperationMeta = {\n id: string\n method: string\n path: string\n risk: \"read\" | \"create\" | \"update\" | \"delete\"\n}\n\nexport type ToolConfig = {\n title?: string\n description?: string\n inputSchema: z.ZodObject<Record<string, z.ZodType<any>>>\n outputSchema?: AnySchema\n annotations?: ToolAnnotations\n _meta: {\n \"com.elasticpath/operation\": OperationMeta\n }\n}\n\nexport type Tool = {\n readonly name: string\n readonly config: ToolConfig\n readonly handler: ToolCallback<AnySchema>\n}\n\nconst messageOf = (error: unknown) =>\n error instanceof Error ? error.message : JSON.stringify(error)\n\nexport const toToolResult = async (\n request: Promise<{\n data?: unknown\n error?: unknown\n response?: Response\n }>,\n): Promise<CallToolResult> => {\n let text: string\n try {\n const result = await request\n if (result.error === undefined) {\n const structuredContent =\n typeof result.data === \"object\" &&\n result.data !== null &&\n !Array.isArray(result.data)\n ? (result.data as Record<string, unknown>)\n : { data: result.data ?? null }\n return {\n structuredContent,\n content: [{ type: \"text\", text: JSON.stringify(structuredContent) }],\n }\n }\n text = result.response\n ? `HTTP ${result.response.status}: ${JSON.stringify(result.error)}`\n : messageOf(result.error)\n } catch (error) {\n text = messageOf(error)\n }\n return { isError: true, content: [{ type: \"text\", text }] }\n}\n\nconst WRAPPER_TYPES = [\n \"optional\",\n \"nullable\",\n \"default\",\n \"readonly\",\n \"nonoptional\",\n \"catch\",\n \"prefault\",\n]\n\ntype LooseCopies = WeakMap<z.ZodType, z.ZodType>\n\nconst madeByLoose = new WeakSet<z.ZodType>()\n\nfunction shapeCopiedOnFirstRead(\n copies: LooseCopies,\n shape: Record<string, z.ZodType>,\n) {\n const copy: Record<string, z.ZodType> = {}\n for (const key of Object.keys(shape)) {\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n get() {\n const value = looseIn(copies, shape[key]!)\n Object.defineProperty(copy, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value,\n })\n return value\n },\n })\n }\n return copy\n}\n\nfunction looseCopyOf<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n const def: any = schema._zod.def\n const copy = (changes: object): T =>\n schema.clone({ ...def, ...changes }, { parent: true })\n const looseChild = (child: z.ZodType) => looseIn(copies, child)\n if (def.type === \"object\") {\n return copy({\n catchall: z.unknown(),\n shape: shapeCopiedOnFirstRead(copies, def.shape),\n })\n }\n if (def.type === \"array\") {\n return copy({ element: looseChild(def.element) })\n }\n if (def.type === \"record\") {\n return copy({ valueType: looseChild(def.valueType) })\n }\n if (def.type === \"lazy\") {\n return copy({ getter: () => looseChild(def.getter()) })\n }\n if (WRAPPER_TYPES.includes(def.type)) {\n return copy({ innerType: looseChild(def.innerType) })\n }\n if (def.type === \"union\") {\n return copy({ options: def.options.map(looseChild) })\n }\n if (def.type === \"intersection\") {\n return copy({ left: looseChild(def.left), right: looseChild(def.right) })\n }\n return schema\n}\n\nfunction looseIn<T extends z.ZodType>(copies: LooseCopies, schema: T): T {\n if (madeByLoose.has(schema)) return schema\n const known = copies.get(schema)\n if (known) return known as T\n const copy = looseCopyOf(copies, schema)\n copies.set(schema, copy)\n if (copy !== schema) madeByLoose.add(copy)\n return copy\n}\n\nexport const loose = <T extends z.ZodType>(schema: T): T =>\n looseIn(new WeakMap(), schema)\n\nconst SHARED_SCHEMA_MIN_LENGTH = 1000\n\nfunction reachesFrom(schema: z.ZodType, name: string) {\n const def: any = schema._zod.def\n const reach = (child: z.ZodType): [string, z.ZodType] => [name, child]\n if (def.type === \"object\") {\n return Object.keys(def.shape).map((key): [string, z.ZodType] => [\n key,\n def.shape[key],\n ])\n }\n if (def.type === \"array\") return [reach(def.element)]\n if (def.type === \"record\") return [reach(def.valueType)]\n if (def.type === \"lazy\") return [reach(def.getter())]\n if (WRAPPER_TYPES.includes(def.type)) return [reach(def.innerType)]\n if (def.type === \"union\") {\n return def.options.map((option: z.ZodType) => reach(option))\n }\n if (def.type === \"intersection\") return [reach(def.left), reach(def.right)]\n return []\n}\n\nfunction reachedSchemas(input: z.ZodType) {\n const reached = new Map<z.ZodType, { name: string; count: number }>()\n const visit = (name: string, schema: z.ZodType) => {\n const seen = reached.get(schema)\n if (seen) {\n seen.count++\n return\n }\n reached.set(schema, { name, count: 1 })\n for (const [childName, child] of reachesFrom(schema, name)) {\n visit(childName, child)\n }\n }\n visit(\"input\", input)\n return reached\n}\n\nconst listedLengthOf = (schema: z.ZodType) =>\n JSON.stringify(\n z.toJSONSchema(schema, {\n io: \"input\",\n target: \"draft-7\",\n unrepresentable: \"any\",\n }),\n ).length\n\nfunction unusedIdFor(api: string, name: string) {\n const base = `${api}_${name.replace(/[^A-Za-z0-9_]/g, \"_\")}`\n let id = base\n for (let suffix = 2; z.globalRegistry._idmap.has(id); suffix++) {\n id = `${base}_${suffix}`\n }\n return id\n}\n\nexport const withSharedSchemaIds = <T extends z.ZodType>(\n api: string,\n input: T,\n): T => {\n const candidates = [...reachedSchemas(input)]\n .filter(\n ([schema, { count }]) =>\n count > 1 && madeByLoose.has(schema) && !z.globalRegistry.has(schema),\n )\n .map(([schema, { name }]) => ({\n schema,\n name,\n length: listedLengthOf(schema),\n }))\n .filter(({ length }) => length >= SHARED_SCHEMA_MIN_LENGTH)\n .sort((a, b) => b.length - a.length)\n let inputLength = listedLengthOf(input)\n for (const { schema, name } of candidates) {\n z.globalRegistry.add(schema, {\n ...z.globalRegistry.get(schema),\n id: unusedIdFor(api, name),\n })\n const lengthWithId = listedLengthOf(input)\n if (lengthWithId < inputLength) {\n inputLength = lengthWithId\n } else {\n z.globalRegistry.remove(schema)\n }\n }\n return input\n}\n\ntype FileNameFields<K extends string> = {\n [P in `${K}_name`]: z.ZodOptional<z.ZodString>\n}\n\nexport const dataUriFields = <\n S extends z.ZodRawShape,\n C extends z.core.$ZodObjectConfig,\n K extends string,\n>(\n schema: z.ZodObject<S, C>,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C> =>\n schema.extend(\n Object.fromEntries(\n fields.flatMap((field) => {\n const current = schema.shape[field] as unknown as z.ZodType\n const uri = z.string().meta({\n format: \"uri\",\n \"x-mcp-file\": { maxSize: maxBytes },\n description: [\n current.description,\n `Send the file as a data: URI, such as data:text/csv;base64,<base64 bytes>, at most ${maxBytes} bytes once decoded.`,\n ]\n .filter(Boolean)\n .join(\" \"),\n })\n const name = z\n .string()\n .meta({\n description: `The name of the file sent in ${field}, such as products.csv.`,\n })\n .optional()\n return [\n [field, current.isOptional() ? uri.optional() : uri],\n [`${field}_name`, name],\n ]\n }),\n ),\n ) as unknown as z.ZodObject<z.core.util.Extend<S, FileNameFields<K>>, C>\n\ntype DataUrisDecoded<T, K extends string> = T extends object\n ? Omit<T, K | `${K}_name`> & {\n [P in K & keyof T]: undefined extends T[P] ? File | undefined : File\n }\n : T\n\nconst DATA_URI = /^data:([^,]*),(.*)$/is\nconst PERCENT_ENCODED = /^[0-9a-f]{2}$/i\n\nconst notADataUriError = (field: string) =>\n new Error(\n `${field} must be a data: URI, such as data:image/png;base64,iVBORw0KGgo. This tool does not download URLs.`,\n )\n\nconst fileTooBigError = (field: string, bytes: number, maxBytes: number) =>\n new Error(\n `${field} is ${bytes} bytes, over the ${maxBytes} bytes this tool accepts`,\n )\n\nfunction percentDecoded(field: string, text: string) {\n const bytes: number[] = []\n const encoder = new TextEncoder()\n for (let index = 0; index < text.length; index++) {\n if (text[index] === \"%\") {\n const hex = text.slice(index + 1, index + 3)\n if (!PERCENT_ENCODED.test(hex)) throw notADataUriError(field)\n bytes.push(parseInt(hex, 16))\n index += 2\n } else {\n const codePoint = text.codePointAt(index)!\n const character = String.fromCodePoint(codePoint)\n bytes.push(...encoder.encode(character))\n index += character.length - 1\n }\n }\n return new Uint8Array(bytes)\n}\n\nfunction base64Decoded(field: string, text: string, maxBytes: number) {\n const data = text.replace(/\\s/g, \"\")\n const padding = data.endsWith(\"==\") ? 2 : data.endsWith(\"=\") ? 1 : 0\n const bytes = Math.floor((data.length * 3) / 4) - padding\n if (bytes > maxBytes) throw fileTooBigError(field, bytes, maxBytes)\n let binary: string\n try {\n binary = atob(data)\n } catch {\n throw new Error(`${field} is not valid base64`)\n }\n return Uint8Array.from(binary, (character) => character.charCodeAt(0))\n}\n\nfunction fileFromDataUri(\n field: string,\n uri: unknown,\n maxBytes: number,\n givenName: unknown,\n) {\n const match = typeof uri === \"string\" ? DATA_URI.exec(uri) : null\n if (!match) throw notADataUriError(field)\n const parameters = match[1]!.split(\";\")\n const isBase64 = parameters.at(-1)!.toLowerCase() === \"base64\"\n if (isBase64) parameters.pop()\n const mediaType = parameters.shift()!.trim()\n const nameParameter = parameters.find((parameter) =>\n parameter.trim().toLowerCase().startsWith(\"name=\"),\n )\n let name = field\n if (typeof givenName === \"string\" && givenName.trim()) {\n name = givenName.trim()\n } else if (nameParameter) {\n try {\n name = decodeURIComponent(nameParameter.trim().slice(\"name=\".length))\n } catch {\n throw notADataUriError(field)\n }\n }\n const bytes = isBase64\n ? base64Decoded(field, match[2]!, maxBytes)\n : percentDecoded(field, match[2]!)\n if (bytes.length > maxBytes)\n throw fileTooBigError(field, bytes.length, maxBytes)\n return new File([bytes], name, {\n type: mediaType.includes(\"/\") ? mediaType : \"text/plain\",\n })\n}\n\nexport const decodeDataUris = async <T, K extends string>(\n body: T,\n fields: ReadonlyArray<K>,\n maxBytes: number,\n): Promise<DataUrisDecoded<T, K>> => {\n if (typeof body !== \"object\" || body === null) {\n return body as DataUrisDecoded<T, K>\n }\n const decoded = { ...body } as Record<string, unknown>\n for (const field of fields) {\n const givenName = decoded[`${field}_name`]\n delete decoded[`${field}_name`]\n if (decoded[field] !== undefined) {\n decoded[field] = fileFromDataUri(\n field,\n decoded[field],\n maxBytes,\n givenName,\n )\n }\n }\n return decoded as DataUrisDecoded<T, K>\n}\n"],"mappings":"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","names":[]}
|
package/dist/client/mcp.gen.cjs
CHANGED
|
@@ -75,9 +75,12 @@ const getAllFilesTool = (options) => {
|
|
|
75
75
|
handler
|
|
76
76
|
};
|
|
77
77
|
};
|
|
78
|
-
const createAFileInput =
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
const createAFileInput = (0, import_mcp_support.withSharedSchemaIds)(
|
|
79
|
+
"files",
|
|
80
|
+
z.object({
|
|
81
|
+
body: (0, import_mcp_support.dataUriFields)((0, import_mcp_support.loose)(import_zod.zCreateAFileBody), ["file"], 8388608)
|
|
82
|
+
}).strict()
|
|
83
|
+
);
|
|
81
84
|
const createAFileTool = (options) => {
|
|
82
85
|
const handler = (args, extra) => (0, import_mcp_support.toToolResult)(
|
|
83
86
|
(0, import_mcp_support.decodeDataUris)(args.body, ["file"], 8388608).then(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/mcp.gen.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport * as z from \"zod\"\n\nimport type { Client } from \"./client\"\nimport {\n dataUriFields,\n decodeDataUris,\n loose,\n type Tool,\n toToolResult,\n} from \"./mcp-support.gen\"\nimport { createAFile, deleteAFile, getAFile, getAllFiles } from \"./sdk.gen\"\nimport {\n zCreateAFileBody,\n zDeleteAFilePath,\n zGetAFilePath,\n zGetAllFilesQuery,\n} from \"./zod.gen\"\n\ntype ToolOptions = {\n client?: Client\n}\n\nconst getAllFilesInput = z\n .object({\n query: zGetAllFilesQuery.strict().optional(),\n })\n .strict()\n\n/**\n * Get all Files\n *\n * Retrieves all files.\n *\n * ### Filtering\n *\n * For general filtering syntax, see [Filtering](/guides/Getting-Started/filtering).\n *\n * The following operators and attributes are available when filtering on this endpoint.\n *\n * | Attribute | Type | Operators | Example |\n * |:----------------------|:----------|:--------------------------|:-------------|\n * | `id` | `string` | `in` | `in(id,file-id-1,file-id-2,file-id-3)` |\n * | `file_name` | `string` | `eq` / `like` | `eq(file_name, my_image.jpg)` |\n * | `width` | `integer` | `gt` / `ge` / `lt` / `le` | `gt(width,200)` |\n * | `height` | `integer` | `gt` / `ge` / `lt` / `le` | `lt(height,500)` |\n * | `file_size` | `integer` | `gt` / `ge` / `lt` / `le` | `le(file_size,20953)` |\n *\n * #### Bulk File Retrieval\n *\n * To retrieve multiple files by their IDs in a single request, use the `in` operator with a comma-separated list of file IDs:\n *\n * ```\n * GET /v2/files?filter=in(id,06b881bd-f152-4c36-8658-7132a8fab49c,ec73567b-04e8-4000-a11a-7e1407cc2f21)\n * ```\n *\n * This is more efficient than making separate requests for each file and is recommended for bulk operations.\n *\n * **Note on invalid IDs**: If any IDs in the filter are missing, malformed, or do not exist in the store, they will be silently ignored. The response will only include files that were successfully found. For example, if you request 5 IDs but only 3 exist, the response will contain 3 files with `total: 3` in the metadata.\n *\n */\nexport const getAllFilesTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof getAllFilesInput> = (args, extra) =>\n toToolResult(\n getAllFiles({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_get_all_files\" as const,\n config: {\n title: \"Get all Files\",\n description:\n \"Lists the files in the store, such as product images, videos and documents, with each file's link, name, type and size. Filter by file name, width, height or file size, or get several files at once by ID with the in operator; IDs that do not exist are left out without an error. Returns at most 100 files per page.\",\n inputSchema: getAllFilesInput,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.getAllFiles\",\n method: \"GET\",\n path: \"/v2/files\",\n risk: \"read\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst createAFileInput = z\n .object({\n body: dataUriFields(loose(zCreateAFileBody), [\"file\"], 8388608),\n })\n .strict()\n\n/**\n * Create a File\n *\n * Create a File\n */\nexport const createAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof createAFileInput> = (args, extra) =>\n toToolResult(\n decodeDataUris(args.body, [\"file\"], 8388608).then((body) =>\n createAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n body,\n }),\n ),\n )\n return {\n name: \"files_create_a_file\" as const,\n config: {\n title: \"Create a File\",\n description:\n \"Uploads a file, such as a product image, video or PDF, or registers an image hosted elsewhere by its URL. Files are limited to 8MB by default; store a larger file elsewhere and register it by URL. Returns the new file's ID and link, which you use to attach the file to a product.\",\n inputSchema: createAFileInput,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.createAFile\",\n method: \"POST\",\n path: \"/v2/files\",\n risk: \"create\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst deleteAFileInput = z\n .object({\n path: zDeleteAFilePath.strict(),\n })\n .strict()\n\n/**\n * Delete a File\n *\n * Delete a File\n */\nexport const deleteAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof deleteAFileInput> = (args, extra) =>\n toToolResult(\n deleteAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_delete_a_file\" as const,\n config: {\n title: \"Delete a File\",\n description:\n \"Deletes a file from the store by its ID. To find a file's ID, list the files and filter by file name.\",\n inputSchema: deleteAFileInput,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.deleteAFile\",\n method: \"DELETE\",\n path: \"/v2/files/{fileID}\",\n risk: \"delete\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst getAFileInput = z\n .object({\n path: zGetAFilePath.strict(),\n })\n .strict()\n\n/**\n * Get a File\n *\n * Get a File\n */\nexport const getAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof getAFileInput> = (args, extra) =>\n toToolResult(\n getAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_get_a_file\" as const,\n config: {\n title: \"Get a File\",\n description:\n \"Gets one file by ID, including its link, name, type, size and dimensions. To get several files at once, list the files filtered by ID.\",\n inputSchema: getAFileInput,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.getAFile\",\n method: \"GET\",\n path: \"/v2/files/{fileID}\",\n risk: \"read\" as const,\n },\n },\n },\n handler,\n }\n}\n\nexport const tools = (options?: ToolOptions): Array<Tool> => [\n getAllFilesTool(options),\n createAFileTool(options),\n deleteAFileTool(options),\n getAFileTool(options),\n]\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/mcp.gen.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport * as z from \"zod\"\n\nimport type { Client } from \"./client\"\nimport {\n dataUriFields,\n decodeDataUris,\n loose,\n type Tool,\n toToolResult,\n withSharedSchemaIds,\n} from \"./mcp-support.gen\"\nimport { createAFile, deleteAFile, getAFile, getAllFiles } from \"./sdk.gen\"\nimport {\n zCreateAFileBody,\n zDeleteAFilePath,\n zGetAFilePath,\n zGetAllFilesQuery,\n} from \"./zod.gen\"\n\ntype ToolOptions = {\n client?: Client\n}\n\nconst getAllFilesInput = z\n .object({\n query: zGetAllFilesQuery.strict().optional(),\n })\n .strict()\n\n/**\n * Get all Files\n *\n * Retrieves all files.\n *\n * ### Filtering\n *\n * For general filtering syntax, see [Filtering](/guides/Getting-Started/filtering).\n *\n * The following operators and attributes are available when filtering on this endpoint.\n *\n * | Attribute | Type | Operators | Example |\n * |:----------------------|:----------|:--------------------------|:-------------|\n * | `id` | `string` | `in` | `in(id,file-id-1,file-id-2,file-id-3)` |\n * | `file_name` | `string` | `eq` / `like` | `eq(file_name, my_image.jpg)` |\n * | `width` | `integer` | `gt` / `ge` / `lt` / `le` | `gt(width,200)` |\n * | `height` | `integer` | `gt` / `ge` / `lt` / `le` | `lt(height,500)` |\n * | `file_size` | `integer` | `gt` / `ge` / `lt` / `le` | `le(file_size,20953)` |\n *\n * #### Bulk File Retrieval\n *\n * To retrieve multiple files by their IDs in a single request, use the `in` operator with a comma-separated list of file IDs:\n *\n * ```\n * GET /v2/files?filter=in(id,06b881bd-f152-4c36-8658-7132a8fab49c,ec73567b-04e8-4000-a11a-7e1407cc2f21)\n * ```\n *\n * This is more efficient than making separate requests for each file and is recommended for bulk operations.\n *\n * **Note on invalid IDs**: If any IDs in the filter are missing, malformed, or do not exist in the store, they will be silently ignored. The response will only include files that were successfully found. For example, if you request 5 IDs but only 3 exist, the response will contain 3 files with `total: 3` in the metadata.\n *\n */\nexport const getAllFilesTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof getAllFilesInput> = (args, extra) =>\n toToolResult(\n getAllFiles({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_get_all_files\" as const,\n config: {\n title: \"Get all Files\",\n description:\n \"Lists the files in the store, such as product images, videos and documents, with each file's link, name, type and size. Filter by file name, width, height or file size, or get several files at once by ID with the in operator; IDs that do not exist are left out without an error. Returns at most 100 files per page.\",\n inputSchema: getAllFilesInput,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.getAllFiles\",\n method: \"GET\",\n path: \"/v2/files\",\n risk: \"read\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst createAFileInput = withSharedSchemaIds(\n \"files\",\n z\n .object({\n body: dataUriFields(loose(zCreateAFileBody), [\"file\"], 8388608),\n })\n .strict(),\n)\n\n/**\n * Create a File\n *\n * Create a File\n */\nexport const createAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof createAFileInput> = (args, extra) =>\n toToolResult(\n decodeDataUris(args.body, [\"file\"], 8388608).then((body) =>\n createAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n body,\n }),\n ),\n )\n return {\n name: \"files_create_a_file\" as const,\n config: {\n title: \"Create a File\",\n description:\n \"Uploads a file, such as a product image, video or PDF, or registers an image hosted elsewhere by its URL. Files are limited to 8MB by default; store a larger file elsewhere and register it by URL. Returns the new file's ID and link, which you use to attach the file to a product.\",\n inputSchema: createAFileInput,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.createAFile\",\n method: \"POST\",\n path: \"/v2/files\",\n risk: \"create\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst deleteAFileInput = z\n .object({\n path: zDeleteAFilePath.strict(),\n })\n .strict()\n\n/**\n * Delete a File\n *\n * Delete a File\n */\nexport const deleteAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof deleteAFileInput> = (args, extra) =>\n toToolResult(\n deleteAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_delete_a_file\" as const,\n config: {\n title: \"Delete a File\",\n description:\n \"Deletes a file from the store by its ID. To find a file's ID, list the files and filter by file name.\",\n inputSchema: deleteAFileInput,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.deleteAFile\",\n method: \"DELETE\",\n path: \"/v2/files/{fileID}\",\n risk: \"delete\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst getAFileInput = z\n .object({\n path: zGetAFilePath.strict(),\n })\n .strict()\n\n/**\n * Get a File\n *\n * Get a File\n */\nexport const getAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof getAFileInput> = (args, extra) =>\n toToolResult(\n getAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_get_a_file\" as const,\n config: {\n title: \"Get a File\",\n description:\n \"Gets one file by ID, including its link, name, type, size and dimensions. To get several files at once, list the files filtered by ID.\",\n inputSchema: getAFileInput,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.getAFile\",\n method: \"GET\",\n path: \"/v2/files/{fileID}\",\n risk: \"read\" as const,\n },\n },\n },\n handler,\n }\n}\n\nexport const tools = (options?: ToolOptions): Array<Tool> => [\n getAllFilesTool(options),\n createAFileTool(options),\n deleteAFileTool(options),\n getAFileTool(options),\n]\n"],"mappings":"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","names":[]}
|
package/dist/client/mcp.gen.mjs
CHANGED
|
@@ -3,7 +3,8 @@ import {
|
|
|
3
3
|
dataUriFields,
|
|
4
4
|
decodeDataUris,
|
|
5
5
|
loose,
|
|
6
|
-
toToolResult
|
|
6
|
+
toToolResult,
|
|
7
|
+
withSharedSchemaIds
|
|
7
8
|
} from "./mcp-support.gen.mjs";
|
|
8
9
|
import { createAFile, deleteAFile, getAFile, getAllFiles } from "./sdk.gen.mjs";
|
|
9
10
|
import {
|
|
@@ -48,9 +49,12 @@ const getAllFilesTool = (options) => {
|
|
|
48
49
|
handler
|
|
49
50
|
};
|
|
50
51
|
};
|
|
51
|
-
const createAFileInput =
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
const createAFileInput = withSharedSchemaIds(
|
|
53
|
+
"files",
|
|
54
|
+
z.object({
|
|
55
|
+
body: dataUriFields(loose(zCreateAFileBody), ["file"], 8388608)
|
|
56
|
+
}).strict()
|
|
57
|
+
);
|
|
54
58
|
const createAFileTool = (options) => {
|
|
55
59
|
const handler = (args, extra) => toToolResult(
|
|
56
60
|
decodeDataUris(args.body, ["file"], 8388608).then(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/mcp.gen.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport * as z from \"zod\"\n\nimport type { Client } from \"./client\"\nimport {\n dataUriFields,\n decodeDataUris,\n loose,\n type Tool,\n toToolResult,\n} from \"./mcp-support.gen\"\nimport { createAFile, deleteAFile, getAFile, getAllFiles } from \"./sdk.gen\"\nimport {\n zCreateAFileBody,\n zDeleteAFilePath,\n zGetAFilePath,\n zGetAllFilesQuery,\n} from \"./zod.gen\"\n\ntype ToolOptions = {\n client?: Client\n}\n\nconst getAllFilesInput = z\n .object({\n query: zGetAllFilesQuery.strict().optional(),\n })\n .strict()\n\n/**\n * Get all Files\n *\n * Retrieves all files.\n *\n * ### Filtering\n *\n * For general filtering syntax, see [Filtering](/guides/Getting-Started/filtering).\n *\n * The following operators and attributes are available when filtering on this endpoint.\n *\n * | Attribute | Type | Operators | Example |\n * |:----------------------|:----------|:--------------------------|:-------------|\n * | `id` | `string` | `in` | `in(id,file-id-1,file-id-2,file-id-3)` |\n * | `file_name` | `string` | `eq` / `like` | `eq(file_name, my_image.jpg)` |\n * | `width` | `integer` | `gt` / `ge` / `lt` / `le` | `gt(width,200)` |\n * | `height` | `integer` | `gt` / `ge` / `lt` / `le` | `lt(height,500)` |\n * | `file_size` | `integer` | `gt` / `ge` / `lt` / `le` | `le(file_size,20953)` |\n *\n * #### Bulk File Retrieval\n *\n * To retrieve multiple files by their IDs in a single request, use the `in` operator with a comma-separated list of file IDs:\n *\n * ```\n * GET /v2/files?filter=in(id,06b881bd-f152-4c36-8658-7132a8fab49c,ec73567b-04e8-4000-a11a-7e1407cc2f21)\n * ```\n *\n * This is more efficient than making separate requests for each file and is recommended for bulk operations.\n *\n * **Note on invalid IDs**: If any IDs in the filter are missing, malformed, or do not exist in the store, they will be silently ignored. The response will only include files that were successfully found. For example, if you request 5 IDs but only 3 exist, the response will contain 3 files with `total: 3` in the metadata.\n *\n */\nexport const getAllFilesTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof getAllFilesInput> = (args, extra) =>\n toToolResult(\n getAllFiles({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_get_all_files\" as const,\n config: {\n title: \"Get all Files\",\n description:\n \"Lists the files in the store, such as product images, videos and documents, with each file's link, name, type and size. Filter by file name, width, height or file size, or get several files at once by ID with the in operator; IDs that do not exist are left out without an error. Returns at most 100 files per page.\",\n inputSchema: getAllFilesInput,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.getAllFiles\",\n method: \"GET\",\n path: \"/v2/files\",\n risk: \"read\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst createAFileInput = z\n .object({\n body: dataUriFields(loose(zCreateAFileBody), [\"file\"], 8388608),\n })\n .strict()\n\n/**\n * Create a File\n *\n * Create a File\n */\nexport const createAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof createAFileInput> = (args, extra) =>\n toToolResult(\n decodeDataUris(args.body, [\"file\"], 8388608).then((body) =>\n createAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n body,\n }),\n ),\n )\n return {\n name: \"files_create_a_file\" as const,\n config: {\n title: \"Create a File\",\n description:\n \"Uploads a file, such as a product image, video or PDF, or registers an image hosted elsewhere by its URL. Files are limited to 8MB by default; store a larger file elsewhere and register it by URL. Returns the new file's ID and link, which you use to attach the file to a product.\",\n inputSchema: createAFileInput,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.createAFile\",\n method: \"POST\",\n path: \"/v2/files\",\n risk: \"create\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst deleteAFileInput = z\n .object({\n path: zDeleteAFilePath.strict(),\n })\n .strict()\n\n/**\n * Delete a File\n *\n * Delete a File\n */\nexport const deleteAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof deleteAFileInput> = (args, extra) =>\n toToolResult(\n deleteAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_delete_a_file\" as const,\n config: {\n title: \"Delete a File\",\n description:\n \"Deletes a file from the store by its ID. To find a file's ID, list the files and filter by file name.\",\n inputSchema: deleteAFileInput,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.deleteAFile\",\n method: \"DELETE\",\n path: \"/v2/files/{fileID}\",\n risk: \"delete\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst getAFileInput = z\n .object({\n path: zGetAFilePath.strict(),\n })\n .strict()\n\n/**\n * Get a File\n *\n * Get a File\n */\nexport const getAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof getAFileInput> = (args, extra) =>\n toToolResult(\n getAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_get_a_file\" as const,\n config: {\n title: \"Get a File\",\n description:\n \"Gets one file by ID, including its link, name, type, size and dimensions. To get several files at once, list the files filtered by ID.\",\n inputSchema: getAFileInput,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.getAFile\",\n method: \"GET\",\n path: \"/v2/files/{fileID}\",\n risk: \"read\" as const,\n },\n },\n },\n handler,\n }\n}\n\nexport const tools = (options?: ToolOptions): Array<Tool> => [\n getAllFilesTool(options),\n createAFileTool(options),\n deleteAFileTool(options),\n getAFileTool(options),\n]\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/mcp.gen.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport * as z from \"zod\"\n\nimport type { Client } from \"./client\"\nimport {\n dataUriFields,\n decodeDataUris,\n loose,\n type Tool,\n toToolResult,\n withSharedSchemaIds,\n} from \"./mcp-support.gen\"\nimport { createAFile, deleteAFile, getAFile, getAllFiles } from \"./sdk.gen\"\nimport {\n zCreateAFileBody,\n zDeleteAFilePath,\n zGetAFilePath,\n zGetAllFilesQuery,\n} from \"./zod.gen\"\n\ntype ToolOptions = {\n client?: Client\n}\n\nconst getAllFilesInput = z\n .object({\n query: zGetAllFilesQuery.strict().optional(),\n })\n .strict()\n\n/**\n * Get all Files\n *\n * Retrieves all files.\n *\n * ### Filtering\n *\n * For general filtering syntax, see [Filtering](/guides/Getting-Started/filtering).\n *\n * The following operators and attributes are available when filtering on this endpoint.\n *\n * | Attribute | Type | Operators | Example |\n * |:----------------------|:----------|:--------------------------|:-------------|\n * | `id` | `string` | `in` | `in(id,file-id-1,file-id-2,file-id-3)` |\n * | `file_name` | `string` | `eq` / `like` | `eq(file_name, my_image.jpg)` |\n * | `width` | `integer` | `gt` / `ge` / `lt` / `le` | `gt(width,200)` |\n * | `height` | `integer` | `gt` / `ge` / `lt` / `le` | `lt(height,500)` |\n * | `file_size` | `integer` | `gt` / `ge` / `lt` / `le` | `le(file_size,20953)` |\n *\n * #### Bulk File Retrieval\n *\n * To retrieve multiple files by their IDs in a single request, use the `in` operator with a comma-separated list of file IDs:\n *\n * ```\n * GET /v2/files?filter=in(id,06b881bd-f152-4c36-8658-7132a8fab49c,ec73567b-04e8-4000-a11a-7e1407cc2f21)\n * ```\n *\n * This is more efficient than making separate requests for each file and is recommended for bulk operations.\n *\n * **Note on invalid IDs**: If any IDs in the filter are missing, malformed, or do not exist in the store, they will be silently ignored. The response will only include files that were successfully found. For example, if you request 5 IDs but only 3 exist, the response will contain 3 files with `total: 3` in the metadata.\n *\n */\nexport const getAllFilesTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof getAllFilesInput> = (args, extra) =>\n toToolResult(\n getAllFiles({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_get_all_files\" as const,\n config: {\n title: \"Get all Files\",\n description:\n \"Lists the files in the store, such as product images, videos and documents, with each file's link, name, type and size. Filter by file name, width, height or file size, or get several files at once by ID with the in operator; IDs that do not exist are left out without an error. Returns at most 100 files per page.\",\n inputSchema: getAllFilesInput,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.getAllFiles\",\n method: \"GET\",\n path: \"/v2/files\",\n risk: \"read\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst createAFileInput = withSharedSchemaIds(\n \"files\",\n z\n .object({\n body: dataUriFields(loose(zCreateAFileBody), [\"file\"], 8388608),\n })\n .strict(),\n)\n\n/**\n * Create a File\n *\n * Create a File\n */\nexport const createAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof createAFileInput> = (args, extra) =>\n toToolResult(\n decodeDataUris(args.body, [\"file\"], 8388608).then((body) =>\n createAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n body,\n }),\n ),\n )\n return {\n name: \"files_create_a_file\" as const,\n config: {\n title: \"Create a File\",\n description:\n \"Uploads a file, such as a product image, video or PDF, or registers an image hosted elsewhere by its URL. Files are limited to 8MB by default; store a larger file elsewhere and register it by URL. Returns the new file's ID and link, which you use to attach the file to a product.\",\n inputSchema: createAFileInput,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.createAFile\",\n method: \"POST\",\n path: \"/v2/files\",\n risk: \"create\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst deleteAFileInput = z\n .object({\n path: zDeleteAFilePath.strict(),\n })\n .strict()\n\n/**\n * Delete a File\n *\n * Delete a File\n */\nexport const deleteAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof deleteAFileInput> = (args, extra) =>\n toToolResult(\n deleteAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_delete_a_file\" as const,\n config: {\n title: \"Delete a File\",\n description:\n \"Deletes a file from the store by its ID. To find a file's ID, list the files and filter by file name.\",\n inputSchema: deleteAFileInput,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.deleteAFile\",\n method: \"DELETE\",\n path: \"/v2/files/{fileID}\",\n risk: \"delete\" as const,\n },\n },\n },\n handler,\n }\n}\n\nconst getAFileInput = z\n .object({\n path: zGetAFilePath.strict(),\n })\n .strict()\n\n/**\n * Get a File\n *\n * Get a File\n */\nexport const getAFileTool = (options?: ToolOptions) => {\n const handler: ToolCallback<typeof getAFileInput> = (args, extra) =>\n toToolResult(\n getAFile({\n ...args,\n client: options?.client,\n signal: extra.signal,\n throwOnError: false,\n }),\n )\n return {\n name: \"files_get_a_file\" as const,\n config: {\n title: \"Get a File\",\n description:\n \"Gets one file by ID, including its link, name, type, size and dimensions. To get several files at once, list the files filtered by ID.\",\n inputSchema: getAFileInput,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n _meta: {\n \"com.elasticpath/operation\": {\n id: \"files.getAFile\",\n method: \"GET\",\n path: \"/v2/files/{fileID}\",\n risk: \"read\" as const,\n },\n },\n },\n handler,\n }\n}\n\nexport const tools = (options?: ToolOptions): Array<Tool> => [\n getAllFilesTool(options),\n createAFileTool(options),\n deleteAFileTool(options),\n getAFileTool(options),\n]\n"],"mappings":"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","names":[]}
|