Skip to content

Commit f7f45c7

Browse files
committed
validate builtin template responses
1 parent 4e2ced9 commit f7f45c7

1 file changed

Lines changed: 26 additions & 11 deletions

File tree

packages/mcp-server/src/server.ts

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,8 @@ const listBuiltinTemplatesOutputSchema = z.object({
207207
steps: z.record(z.string(), z.unknown()),
208208
}),
209209
),
210+
errors: z.array(toolMessageSchema).optional(),
211+
warnings: z.array(toolMessageSchema).optional(),
210212
})
211213

212214
const lintAssemblyInputSchema = z.object({
@@ -379,13 +381,23 @@ const resolveAssemblyAccess = (
379381
}
380382
}
381383

382-
type ApiTemplateRecord = {
383-
id?: unknown
384-
name?: unknown
385-
description?: unknown
386-
builtin_version?: unknown
387-
content?: unknown
388-
}
384+
const apiTemplateSchema = z
385+
.object({
386+
id: z.string().optional(),
387+
name: z.string().optional(),
388+
description: z.string().optional(),
389+
builtin_version: z.string().optional(),
390+
content: z.unknown().optional(),
391+
})
392+
.passthrough()
393+
394+
const listTemplatesResponseSchema = z
395+
.object({
396+
items: z.array(apiTemplateSchema).optional(),
397+
})
398+
.passthrough()
399+
400+
type ApiTemplateRecord = z.infer<typeof apiTemplateSchema>
389401

390402
const buildBuiltinTemplateId = (slug: string, version?: string): string => {
391403
if (slug.includes('@')) return slug
@@ -426,15 +438,18 @@ const mapBuiltinTemplate = (template: ApiTemplateRecord): BuiltinTemplate | unde
426438
}
427439

428440
const fetchBuiltinTemplates = async (client: Transloadit): Promise<BuiltinTemplate[]> => {
429-
const response = (await client.listTemplates({
441+
const response = await client.listTemplates({
430442
include_builtin: 'exclusively-latest',
431443
page: 1,
432444
pagesize: 100,
433-
})) as {
434-
items?: ApiTemplateRecord[]
445+
})
446+
447+
const parsed = listTemplatesResponseSchema.safeParse(response)
448+
if (!parsed.success) {
449+
throw new Error('Unexpected listTemplates response shape.')
435450
}
436451

437-
const items = Array.isArray(response.items) ? response.items : []
452+
const items = parsed.data.items ?? []
438453
return items
439454
.map((template) => mapBuiltinTemplate(template))
440455
.filter((template): template is BuiltinTemplate => Boolean(template))

0 commit comments

Comments
 (0)