@@ -7,7 +7,6 @@ import type {
77} from '@transloadit/node'
88import {
99 getRobotHelp ,
10- goldenTemplates ,
1110 listRobots ,
1211 mergeTemplateContent ,
1312 prepareInputFiles ,
@@ -58,8 +57,6 @@ type GoldenTemplate = {
5857
5958type LintAssemblyInstructionsInput = Parameters < Transloadit [ 'lintAssemblyInstructions' ] > [ 0 ]
6059
61- const goldenTemplatesMap = goldenTemplates as Record < string , GoldenTemplate >
62-
6360const lintIssueSchema = z . object ( {
6461 path : z . string ( ) ,
6562 message : z . string ( ) ,
@@ -341,6 +338,9 @@ const createLiveClient = (
341338const isRecord = ( value : unknown ) : value is Record < string , unknown > =>
342339 typeof value === 'object' && value !== null
343340
341+ const isNonEmptyString = ( value : unknown ) : value is string =>
342+ typeof value === 'string' && value . length > 0
343+
344344const isErrnoException = ( value : unknown ) : value is NodeJS . ErrnoException =>
345345 isRecord ( value ) && typeof value . code === 'string'
346346
@@ -383,19 +383,78 @@ const resolveAssemblyAccess = (
383383 }
384384}
385385
386- const resolveGoldenTemplate = ( slug : string , version ?: string ) : GoldenTemplate | undefined => {
387- if ( slug . includes ( '@' ) ) {
388- return goldenTemplatesMap [ slug ]
386+ type ApiTemplateRecord = {
387+ id ?: unknown
388+ name ?: unknown
389+ description ?: unknown
390+ golden_version ?: unknown
391+ content ?: unknown
392+ }
393+
394+ const buildGoldenTemplateId = ( slug : string , version ?: string ) : string => {
395+ if ( slug . includes ( '@' ) ) return slug
396+ if ( version ) return `${ slug } @${ version } `
397+ return slug
398+ }
399+
400+ const extractTemplateSteps = ( content : unknown ) : Record < string , unknown > | undefined => {
401+ if ( ! isRecord ( content ) ) return undefined
402+ const steps = content . steps
403+ return isRecord ( steps ) ? ( steps as Record < string , unknown > ) : undefined
404+ }
405+
406+ const mapGoldenTemplate = ( template : ApiTemplateRecord ) : GoldenTemplate | undefined => {
407+ const slug = isNonEmptyString ( template . name )
408+ ? template . name
409+ : isNonEmptyString ( template . id )
410+ ? template . id
411+ : undefined
412+
413+ if ( ! slug || ! slug . startsWith ( '~' ) ) return undefined
414+
415+ const steps = extractTemplateSteps ( template . content )
416+ if ( ! steps ) return undefined
417+
418+ const version = isNonEmptyString ( template . golden_version )
419+ ? template . golden_version
420+ : slug . includes ( '@' )
421+ ? ( slug . split ( '@' ) [ 1 ] ?? '' )
422+ : ''
423+
424+ return {
425+ slug,
426+ version,
427+ description : isNonEmptyString ( template . description ) ? template . description : '' ,
428+ steps,
389429 }
430+ }
390431
391- if ( version ) {
392- return goldenTemplatesMap [ `${ slug } @${ version } ` ]
432+ const fetchGoldenTemplates = async ( client : Transloadit ) : Promise < GoldenTemplate [ ] > => {
433+ const response = ( await client . listTemplates ( {
434+ include_golden : 'latest' ,
435+ page : 1 ,
436+ pagesize : 100 ,
437+ } ) ) as {
438+ items ?: ApiTemplateRecord [ ]
393439 }
394440
395- const matches = Object . keys ( goldenTemplatesMap ) . filter ( ( key ) => key . startsWith ( `${ slug } @` ) )
396- if ( matches . length === 0 ) return undefined
397- const latest = matches . sort ( ) . at ( - 1 )
398- return latest ? goldenTemplatesMap [ latest ] : undefined
441+ const items = Array . isArray ( response . items ) ? response . items : [ ]
442+ return items
443+ . map ( ( template ) => mapGoldenTemplate ( template ) )
444+ . filter ( ( template ) : template is GoldenTemplate => Boolean ( template ) )
445+ }
446+
447+ const fetchGoldenTemplateContent = async (
448+ client : Transloadit ,
449+ slug : string ,
450+ version ?: string ,
451+ ) : Promise < TemplateContent | undefined > => {
452+ const templateId = buildGoldenTemplateId ( slug , version )
453+ const template = ( await client . getTemplate ( templateId ) ) as {
454+ content ?: unknown
455+ }
456+ if ( ! template ?. content || ! isRecord ( template . content ) ) return undefined
457+ return template . content as TemplateContent
399458}
400459
401460const parseInstructions = ( input : unknown ) : CreateAssemblyParams | undefined => {
@@ -496,9 +555,13 @@ export const createTransloaditMcpServer = (
496555 let params = parseInstructions ( instructions ) ?? ( { } as CreateAssemblyParams )
497556
498557 if ( golden_template ) {
499- const template = resolveGoldenTemplate ( golden_template . slug , golden_template . version )
558+ const templateContent = await fetchGoldenTemplateContent (
559+ client ,
560+ golden_template . slug ,
561+ golden_template . version ,
562+ )
500563
501- if ( ! template ) {
564+ if ( ! templateContent ) {
502565 return buildToolError (
503566 'mcp_unknown_template' ,
504567 `Unknown golden template: ${ golden_template . slug } ` ,
@@ -507,9 +570,6 @@ export const createTransloaditMcpServer = (
507570 }
508571
509572 const overrides = golden_template . overrides
510- const templateContent = {
511- steps : template . steps ,
512- } as TemplateContent
513573 params = mergeTemplateContent (
514574 templateContent ,
515575 overrides && isRecord ( overrides ) ? ( overrides as Record < string , unknown > ) : undefined ,
@@ -722,11 +782,41 @@ export const createTransloaditMcpServer = (
722782 inputSchema : listGoldenTemplatesInputSchema ,
723783 outputSchema : listGoldenTemplatesOutputSchema ,
724784 } ,
725- ( ) => {
726- return buildToolResponse ( {
727- status : 'ok' ,
728- templates : Object . values ( goldenTemplatesMap ) ,
729- } )
785+ async ( _args , extra ) => {
786+ const liveClient = createLiveClient ( options , extra )
787+ if ( 'error' in liveClient ) {
788+ return buildToolResponse ( {
789+ status : 'error' ,
790+ templates : [ ] ,
791+ errors : [
792+ {
793+ code : 'mcp_missing_auth' ,
794+ message :
795+ 'Missing TRANSLOADIT_KEY/TRANSLOADIT_SECRET or Authorization: Bearer token for live API calls.' ,
796+ } ,
797+ ] ,
798+ } )
799+ }
800+
801+ try {
802+ const templates = await fetchGoldenTemplates ( liveClient . client )
803+ return buildToolResponse ( {
804+ status : 'ok' ,
805+ templates,
806+ } )
807+ } catch ( error ) {
808+ const message = error instanceof Error ? error . message : 'Failed to fetch golden templates.'
809+ return buildToolResponse ( {
810+ status : 'error' ,
811+ templates : [ ] ,
812+ errors : [
813+ {
814+ code : 'mcp_golden_templates_failed' ,
815+ message,
816+ } ,
817+ ] ,
818+ } )
819+ }
730820 } ,
731821 )
732822
0 commit comments