import { z } from 'zod' import { assetTypeSchema, generateAssetSchema, generateStatusInputSchema } from '../schemas.js' import type { MarketV1Client } from '../v1/client.js' import { result } from './result.js' import type { MarketMcpServer } from './types.js' const generationBaseSchema = generateAssetSchema .omit({ access: true, type: true }) .extend({ type: assetTypeSchema }) const generateMarketAssetSchema = z.discriminatedUnion('access', [ generationBaseSchema .extend({ access: z .literal('public') .describe('Publish the generated asset to the public Market after its approval flow.'), confirmPublicPublication: z .literal(true) .describe('Must be true only after the user explicitly approves public publication.'), }) .strict(), generationBaseSchema .extend({ access: z .literal('private') .describe('Keep the generated asset private to the authenticated owner.'), }) .strict(), ]) export function registerGenerationTools(server: MarketMcpServer, client: MarketV1Client): void { server.registerTool( 'generate_market_asset', { title: 'Generate Market asset', description: 'Create one external Drawcall Market asset. Visibility is required; public publication is allowed only after explicit user consent. A slow provider returns a jobId to pass to get_market_asset_generation.', inputSchema: generateMarketAssetSchema, annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true, idempotentHint: false, }, }, async (input) => { if (input.access === 'public') { const { confirmPublicPublication: _confirmed, ...generation } = input return result({ generation: await client.asset.generate(generation) }) } return result({ generation: await client.asset.generate(input) }) }, ) server.registerTool( 'get_market_asset_generation', { title: 'Get Market asset generation', description: 'Get the current state of a Market asset generation job.', inputSchema: generateStatusInputSchema.strict(), annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: true, idempotentHint: true, }, }, async (input) => result({ generation: await client.asset.generateStatus(input) }), ) }