create-template
Create a new template on RunPod by specifying a Docker image and required name, with optional configuration for ports, environment variables, disk size, and more.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the template | |
| imageName | Yes | Docker image to use | |
| isServerless | No | Is this a serverless template | |
| ports | No | Ports to expose | |
| dockerEntrypoint | No | Docker entrypoint commands | |
| dockerStartCmd | No | Docker start commands | |
| env | No | Environment variables | |
| containerDiskInGb | No | Container disk size in GB | |
| volumeInGb | No | Volume size in GB | |
| volumeMountPath | No | Path to mount the volume | |
| readme | No | README content in markdown format |
Implementation Reference
- src/index.ts:1129-1169 (registration)Registration of the 'create-template' tool via server.tool(). Defines the tool name, Zod schema for parameters (name, imageName, isServerless, ports, dockerEntrypoint, dockerStartCmd, env, containerDiskInGb, volumeInGb, volumeMountPath, readme), and passes the handler.
// Create Template server.tool( 'create-template', { name: z.string().describe('Name for the template'), imageName: z.string().describe('Docker image to use'), isServerless: z .boolean() .optional() .describe('Is this a serverless template'), ports: z.array(z.string()).optional().describe('Ports to expose'), dockerEntrypoint: z .array(z.string()) .optional() .describe('Docker entrypoint commands'), dockerStartCmd: z .array(z.string()) .optional() .describe('Docker start commands'), env: z.record(z.string()).optional().describe('Environment variables'), containerDiskInGb: z .number() .optional() .describe('Container disk size in GB'), volumeInGb: z.number().optional().describe('Volume size in GB'), volumeMountPath: z.string().optional().describe('Path to mount the volume'), readme: z.string().optional().describe('README content in markdown format'), }, async (params) => { const result = await runpodRequest('/templates', 'POST', params); return { content: [ { type: 'text', text: JSON.stringify(result, null, 2), }, ], }; } ); - src/index.ts:1132-1156 (schema)Zod schema defining the input parameters for 'create-template': name (string), imageName (string), isServerless (optional boolean), ports (optional string array), dockerEntrypoint (optional string array), dockerStartCmd (optional string array), env (optional record of strings), containerDiskInGb (optional number), volumeInGb (optional number), volumeMountPath (optional string), readme (optional string).
{ name: z.string().describe('Name for the template'), imageName: z.string().describe('Docker image to use'), isServerless: z .boolean() .optional() .describe('Is this a serverless template'), ports: z.array(z.string()).optional().describe('Ports to expose'), dockerEntrypoint: z .array(z.string()) .optional() .describe('Docker entrypoint commands'), dockerStartCmd: z .array(z.string()) .optional() .describe('Docker start commands'), env: z.record(z.string()).optional().describe('Environment variables'), containerDiskInGb: z .number() .optional() .describe('Container disk size in GB'), volumeInGb: z.number().optional().describe('Volume size in GB'), volumeMountPath: z.string().optional().describe('Path to mount the volume'), readme: z.string().optional().describe('README content in markdown format'), }, - src/index.ts:1157-1168 (handler)Handler function for 'create-template'. Calls runpodRequest('/templates', 'POST', params) to create a new template via the RunPod API, then returns the JSON-stringified result as text content.
async (params) => { const result = await runpodRequest('/templates', 'POST', params); return { content: [ { type: 'text', text: JSON.stringify(result, null, 2), }, ], }; } - src/index.ts:60-99 (helper)The runpodRequest helper function used by the create-template handler. Makes authenticated HTTP requests to the RunPod REST API (base URL: https://rest.runpod.io/v1) using the API key from environment variable.
async function runpodRequest( endpoint: string, method: string = 'GET', body?: Record<string, unknown> ) { const url = `${API_BASE_URL}${endpoint}`; const headers = { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json', }; const options: NodeFetchRequestInit = { method, headers, }; if (body && (method === 'POST' || method === 'PATCH')) { options.body = JSON.stringify(body); } try { const response = await fetch(url, options); if (!response.ok) { const errorText = await response.text(); throw new Error(`RunPod API Error: ${response.status} - ${errorText}`); } // Some endpoints might not return JSON const contentType = response.headers.get('content-type'); if (contentType && contentType.includes('application/json')) { return await response.json(); } return { success: true, status: response.status }; } catch (error) { console.error('Error calling RunPod API:', error); throw error; } }