@runpod/mcp-server 1.1.0 → 1.2.0
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/CHANGELOG.md +8 -0
- package/README.md +177 -39
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +511 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +500 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport fetch, { type RequestInit as NodeFetchRequestInit } from 'node-fetch';\n\n// Base URL for RunPod API\nconst API_BASE_URL = 'https://rest.runpod.io/v1';\n\n// Get API key from environment variable\nconst API_KEY = process.env.RUNPOD_API_KEY;\nif (!API_KEY) {\n console.error('RUNPOD_API_KEY environment variable is required');\n process.exit(1);\n}\n\n// Create an MCP server\nconst server = new McpServer({\n name: 'RunPod API Server',\n version: '1.0.0',\n capabilities: {\n resources: {},\n tools: {},\n },\n});\n\n// Helper function to make authenticated API requests to RunPod\nasync function runpodRequest(\n endpoint: string,\n method: string = 'GET',\n body?: Record<string, unknown>\n) {\n const url = `${API_BASE_URL}${endpoint}`;\n const headers = {\n Authorization: `Bearer ${API_KEY}`,\n 'Content-Type': 'application/json',\n };\n\n const options: NodeFetchRequestInit = {\n method,\n headers,\n };\n\n if (body && (method === 'POST' || method === 'PATCH')) {\n options.body = JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`RunPod API Error: ${response.status} - ${errorText}`);\n }\n\n // Some endpoints might not return JSON\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return await response.json();\n }\n\n return { success: true, status: response.status };\n } catch (error) {\n console.error('Error calling RunPod API:', error);\n throw error;\n }\n}\n\n// ============== POD MANAGEMENT TOOLS ==============\n\n// List Pods\nserver.tool(\n 'list-pods',\n {\n computeType: z\n .enum(['GPU', 'CPU'])\n .optional()\n .describe('Filter to only GPU or only CPU Pods'),\n gpuTypeId: z\n .array(z.string())\n .optional()\n .describe('Filter to Pods with any of the listed GPU types'),\n dataCenterId: z\n .array(z.string())\n .optional()\n .describe('Filter to Pods in any of the provided data centers'),\n name: z\n .string()\n .optional()\n .describe('Filter to Pods with the provided name'),\n includeMachine: z\n .boolean()\n .optional()\n .describe('Include information about the machine'),\n includeNetworkVolume: z\n .boolean()\n .optional()\n .describe('Include information about attached network volumes'),\n },\n async (params) => {\n // Construct query parameters\n const queryParams = new URLSearchParams();\n\n if (params.computeType)\n queryParams.append('computeType', params.computeType);\n if (params.gpuTypeId)\n params.gpuTypeId.forEach((type) => queryParams.append('gpuTypeId', type));\n if (params.dataCenterId)\n params.dataCenterId.forEach((dc) =>\n queryParams.append('dataCenterId', dc)\n );\n if (params.name) queryParams.append('name', params.name);\n if (params.includeMachine)\n queryParams.append('includeMachine', params.includeMachine.toString());\n if (params.includeNetworkVolume)\n queryParams.append(\n 'includeNetworkVolume',\n params.includeNetworkVolume.toString()\n );\n\n const queryString = queryParams.toString()\n ? `?${queryParams.toString()}`\n : '';\n const result = await runpodRequest(`/pods${queryString}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Get Pod Details\nserver.tool(\n 'get-pod',\n {\n podId: z.string().describe('ID of the pod to retrieve'),\n includeMachine: z\n .boolean()\n .optional()\n .describe('Include information about the machine'),\n includeNetworkVolume: z\n .boolean()\n .optional()\n .describe('Include information about attached network volumes'),\n },\n async (params) => {\n // Construct query parameters\n const queryParams = new URLSearchParams();\n\n if (params.includeMachine)\n queryParams.append('includeMachine', params.includeMachine.toString());\n if (params.includeNetworkVolume)\n queryParams.append(\n 'includeNetworkVolume',\n params.includeNetworkVolume.toString()\n );\n\n const queryString = queryParams.toString()\n ? `?${queryParams.toString()}`\n : '';\n const result = await runpodRequest(`/pods/${params.podId}${queryString}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Create Pod\nserver.tool(\n 'create-pod',\n {\n name: z.string().optional().describe('Name for the pod'),\n imageName: z.string().describe('Docker image to use'),\n cloudType: z\n .enum(['SECURE', 'COMMUNITY'])\n .optional()\n .describe('SECURE or COMMUNITY cloud'),\n gpuTypeIds: z\n .array(z.string())\n .optional()\n .describe('List of acceptable GPU types'),\n gpuCount: z.number().optional().describe('Number of GPUs'),\n containerDiskInGb: z\n .number()\n .optional()\n .describe('Container disk size in GB'),\n volumeInGb: z.number().optional().describe('Volume size in GB'),\n volumeMountPath: z.string().optional().describe('Path to mount the volume'),\n ports: z\n .array(z.string())\n .optional()\n .describe(\"Ports to expose (e.g., '8888/http', '22/tcp')\"),\n env: z.record(z.string()).optional().describe('Environment variables'),\n dataCenterIds: z\n .array(z.string())\n .optional()\n .describe('List of data centers'),\n },\n async (params) => {\n const result = await runpodRequest('/pods', 'POST', params);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Update Pod\nserver.tool(\n 'update-pod',\n {\n podId: z.string().describe('ID of the pod to update'),\n name: z.string().optional().describe('New name for the pod'),\n imageName: z.string().optional().describe('New Docker image'),\n containerDiskInGb: z\n .number()\n .optional()\n .describe('New container disk size in GB'),\n volumeInGb: z.number().optional().describe('New volume size in GB'),\n volumeMountPath: z\n .string()\n .optional()\n .describe('New path to mount the volume'),\n ports: z.array(z.string()).optional().describe('New ports to expose'),\n env: z.record(z.string()).optional().describe('New environment variables'),\n },\n async (params) => {\n const { podId, ...updateParams } = params;\n const result = await runpodRequest(`/pods/${podId}`, 'PATCH', updateParams);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Start Pod\nserver.tool(\n 'start-pod',\n {\n podId: z.string().describe('ID of the pod to start'),\n },\n async (params) => {\n const result = await runpodRequest(`/pods/${params.podId}/start`, 'POST');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Stop Pod\nserver.tool(\n 'stop-pod',\n {\n podId: z.string().describe('ID of the pod to stop'),\n },\n async (params) => {\n const result = await runpodRequest(`/pods/${params.podId}/stop`, 'POST');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Delete Pod\nserver.tool(\n 'delete-pod',\n {\n podId: z.string().describe('ID of the pod to delete'),\n },\n async (params) => {\n const result = await runpodRequest(`/pods/${params.podId}`, 'DELETE');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// ============== ENDPOINT MANAGEMENT TOOLS ==============\n\n// List Endpoints\nserver.tool(\n 'list-endpoints',\n {\n includeTemplate: z\n .boolean()\n .optional()\n .describe('Include template information'),\n includeWorkers: z\n .boolean()\n .optional()\n .describe('Include information about workers'),\n },\n async (params) => {\n // Construct query parameters\n const queryParams = new URLSearchParams();\n\n if (params.includeTemplate)\n queryParams.append('includeTemplate', params.includeTemplate.toString());\n if (params.includeWorkers)\n queryParams.append('includeWorkers', params.includeWorkers.toString());\n\n const queryString = queryParams.toString()\n ? `?${queryParams.toString()}`\n : '';\n const result = await runpodRequest(`/endpoints${queryString}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Get Endpoint Details\nserver.tool(\n 'get-endpoint',\n {\n endpointId: z.string().describe('ID of the endpoint to retrieve'),\n includeTemplate: z\n .boolean()\n .optional()\n .describe('Include template information'),\n includeWorkers: z\n .boolean()\n .optional()\n .describe('Include information about workers'),\n },\n async (params) => {\n // Construct query parameters\n const queryParams = new URLSearchParams();\n\n if (params.includeTemplate)\n queryParams.append('includeTemplate', params.includeTemplate.toString());\n if (params.includeWorkers)\n queryParams.append('includeWorkers', params.includeWorkers.toString());\n\n const queryString = queryParams.toString()\n ? `?${queryParams.toString()}`\n : '';\n const result = await runpodRequest(\n `/endpoints/${params.endpointId}${queryString}`\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Create Endpoint\nserver.tool(\n 'create-endpoint',\n {\n name: z.string().optional().describe('Name for the endpoint'),\n templateId: z.string().describe('Template ID to use'),\n computeType: z\n .enum(['GPU', 'CPU'])\n .optional()\n .describe('GPU or CPU endpoint'),\n gpuTypeIds: z\n .array(z.string())\n .optional()\n .describe('List of acceptable GPU types'),\n gpuCount: z.number().optional().describe('Number of GPUs per worker'),\n workersMin: z.number().optional().describe('Minimum number of workers'),\n workersMax: z.number().optional().describe('Maximum number of workers'),\n dataCenterIds: z\n .array(z.string())\n .optional()\n .describe('List of data centers'),\n },\n async (params) => {\n const result = await runpodRequest('/endpoints', 'POST', params);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Update Endpoint\nserver.tool(\n 'update-endpoint',\n {\n endpointId: z.string().describe('ID of the endpoint to update'),\n name: z.string().optional().describe('New name for the endpoint'),\n workersMin: z.number().optional().describe('New minimum number of workers'),\n workersMax: z.number().optional().describe('New maximum number of workers'),\n idleTimeout: z.number().optional().describe('New idle timeout in seconds'),\n scalerType: z\n .enum(['QUEUE_DELAY', 'REQUEST_COUNT'])\n .optional()\n .describe('Scaler type'),\n scalerValue: z.number().optional().describe('Scaler value'),\n },\n async (params) => {\n const { endpointId, ...updateParams } = params;\n const result = await runpodRequest(\n `/endpoints/${endpointId}`,\n 'PATCH',\n updateParams\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Delete Endpoint\nserver.tool(\n 'delete-endpoint',\n {\n endpointId: z.string().describe('ID of the endpoint to delete'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/endpoints/${params.endpointId}`,\n 'DELETE'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// ============== TEMPLATE MANAGEMENT TOOLS ==============\n\n// List Templates\nserver.tool('list-templates', {}, async () => {\n const result = await runpodRequest('/templates');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n});\n\n// Get Template Details\nserver.tool(\n 'get-template',\n {\n templateId: z.string().describe('ID of the template to retrieve'),\n },\n async (params) => {\n const result = await runpodRequest(`/templates/${params.templateId}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Create Template\nserver.tool(\n 'create-template',\n {\n name: z.string().describe('Name for the template'),\n imageName: z.string().describe('Docker image to use'),\n isServerless: z\n .boolean()\n .optional()\n .describe('Is this a serverless template'),\n ports: z.array(z.string()).optional().describe('Ports to expose'),\n dockerEntrypoint: z\n .array(z.string())\n .optional()\n .describe('Docker entrypoint commands'),\n dockerStartCmd: z\n .array(z.string())\n .optional()\n .describe('Docker start commands'),\n env: z.record(z.string()).optional().describe('Environment variables'),\n containerDiskInGb: z\n .number()\n .optional()\n .describe('Container disk size in GB'),\n volumeInGb: z.number().optional().describe('Volume size in GB'),\n volumeMountPath: z.string().optional().describe('Path to mount the volume'),\n readme: z.string().optional().describe('README content in markdown format'),\n },\n async (params) => {\n const result = await runpodRequest('/templates', 'POST', params);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Update Template\nserver.tool(\n 'update-template',\n {\n templateId: z.string().describe('ID of the template to update'),\n name: z.string().optional().describe('New name for the template'),\n imageName: z.string().optional().describe('New Docker image'),\n ports: z.array(z.string()).optional().describe('New ports to expose'),\n env: z.record(z.string()).optional().describe('New environment variables'),\n readme: z\n .string()\n .optional()\n .describe('New README content in markdown format'),\n },\n async (params) => {\n const { templateId, ...updateParams } = params;\n const result = await runpodRequest(\n `/templates/${templateId}`,\n 'PATCH',\n updateParams\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Delete Template\nserver.tool(\n 'delete-template',\n {\n templateId: z.string().describe('ID of the template to delete'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/templates/${params.templateId}`,\n 'DELETE'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// ============== NETWORK VOLUME MANAGEMENT TOOLS ==============\n\n// List Network Volumes\nserver.tool('list-network-volumes', {}, async () => {\n const result = await runpodRequest('/networkvolumes');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n});\n\n// Get Network Volume Details\nserver.tool(\n 'get-network-volume',\n {\n networkVolumeId: z\n .string()\n .describe('ID of the network volume to retrieve'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/networkvolumes/${params.networkVolumeId}`\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Create Network Volume\nserver.tool(\n 'create-network-volume',\n {\n name: z.string().describe('Name for the network volume'),\n size: z.number().describe('Size in GB (1-4000)'),\n dataCenterId: z.string().describe('Data center ID'),\n },\n async (params) => {\n const result = await runpodRequest('/networkvolumes', 'POST', params);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Update Network Volume\nserver.tool(\n 'update-network-volume',\n {\n networkVolumeId: z.string().describe('ID of the network volume to update'),\n name: z.string().optional().describe('New name for the network volume'),\n size: z\n .number()\n .optional()\n .describe('New size in GB (must be larger than current)'),\n },\n async (params) => {\n const { networkVolumeId, ...updateParams } = params;\n const result = await runpodRequest(\n `/networkvolumes/${networkVolumeId}`,\n 'PATCH',\n updateParams\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Delete Network Volume\nserver.tool(\n 'delete-network-volume',\n {\n networkVolumeId: z.string().describe('ID of the network volume to delete'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/networkvolumes/${params.networkVolumeId}`,\n 'DELETE'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// ============== CONTAINER REGISTRY AUTH TOOLS ==============\n\n// List Container Registry Auths\nserver.tool('list-container-registry-auths', {}, async () => {\n const result = await runpodRequest('/containerregistryauth');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n});\n\n// Get Container Registry Auth Details\nserver.tool(\n 'get-container-registry-auth',\n {\n containerRegistryAuthId: z\n .string()\n .describe('ID of the container registry auth to retrieve'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/containerregistryauth/${params.containerRegistryAuthId}`\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Create Container Registry Auth\nserver.tool(\n 'create-container-registry-auth',\n {\n name: z.string().describe('Name for the container registry auth'),\n username: z.string().describe('Registry username'),\n password: z.string().describe('Registry password'),\n },\n async (params) => {\n const result = await runpodRequest(\n '/containerregistryauth',\n 'POST',\n params\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Delete Container Registry Auth\nserver.tool(\n 'delete-container-registry-auth',\n {\n containerRegistryAuthId: z\n .string()\n .describe('ID of the container registry auth to delete'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/containerregistryauth/${params.containerRegistryAuthId}`,\n 'DELETE'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Start receiving messages on stdin and sending messages on stdout\nconst transport = new StdioServerTransport();\nserver.connect(transport);\n"],"mappings":"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","names":["fetch"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport fetch, { type RequestInit as NodeFetchRequestInit } from 'node-fetch';\nimport { randomUUID } from 'node:crypto';\n\n// Base URL for RunPod API\nconst API_BASE_URL = 'https://rest.runpod.io/v1';\n\n// Get API key from environment variable\nconst API_KEY = process.env.RUNPOD_API_KEY;\nif (!API_KEY) {\n console.error('RUNPOD_API_KEY environment variable is required');\n process.exit(1);\n}\n\n// Server identity — also used in the outbound User-Agent header.\nconst MCP_SERVER_NAME = 'RunPod API Server';\n\n// `__PACKAGE_VERSION__` is replaced at build time by tsup's `define` (see\n// tsup.config.ts) with the current `version` from package.json so the User-Agent\n// always matches the published version. Falls back to `'dev'` in environments\n// where the substitution doesn't happen (e.g. `pnpm dev` via tsx).\ndeclare const __PACKAGE_VERSION__: string;\nconst MCP_SERVER_VERSION =\n typeof __PACKAGE_VERSION__ !== 'undefined' ? __PACKAGE_VERSION__ : 'dev';\n\n// Transport the server is running under. Defaults to 'stdio'; HTTP entrypoints\n// should call `setTransport('http')` before starting the server so the\n// outbound User-Agent reports the correct value.\nlet MCP_TRANSPORT: 'stdio' | 'http' = 'stdio';\nexport function setTransport(t: 'stdio' | 'http'): void {\n MCP_TRANSPORT = t;\n}\n\n// Create an MCP server\nconst server = new McpServer({\n name: MCP_SERVER_NAME,\n version: MCP_SERVER_VERSION,\n capabilities: {\n resources: {},\n tools: {},\n },\n});\n\n// ============== CALLER TRACKING ==============\n// Adds structured caller identification to every outbound API call so the\n// Runpod platform can attribute traffic to a specific MCP client (Claude\n// Code, Cursor, Codex, Gemini CLI, etc.). Pure observability — no tool\n// behavior changes.\n//\n// `clientInfo` is sourced from the `initialize` handshake (MCP spec\n// 2025-06-18 and earlier). The SDK caches the value and exposes it via\n// `server.server.getClientVersion()`.\n\n// One session ID per server process. Anonymous; lets the data side count\n// distinct agent sessions without per-user attribution.\nconst SESSION_ID = randomUUID();\n\n/**\n * Returns the calling MCP client's identity from the `initialize` handshake.\n * Returns `{ name: 'unknown', version: 'unknown' }` before the handshake\n * completes or if the client did not send `clientInfo` (the MCP spec\n * requires it, so this should be rare in practice).\n */\nfunction resolveClientInfo(): { name: string; version: string } {\n const info = server.server.getClientVersion();\n if (info?.name) {\n return { name: info.name, version: info.version || 'unknown' };\n }\n return { name: 'unknown', version: 'unknown' };\n}\n\n/**\n * Sanitizes a value for inclusion in a User-Agent token. RFC 7230 reserves\n * parens and a few other chars; we strip them so the structured UA stays\n * parseable. Also bounds the length so a hostile or buggy client can't blow\n * up a header.\n */\nfunction sanitizeUaToken(value: string): string {\n return value.replace(/[()<>@,;:\\\\\"/\\[\\]?={}\\s]/g, '_').slice(0, 64);\n}\n\n/**\n * Builds the structured User-Agent string for outbound HTTP calls.\n *\n * runpod-mcp-server/<version> (caller=mcp; client=<name>; client_version=<ver>; transport=<stdio|http>)\n *\n * Gateway parsers should treat unknown tokens as opaque and key off the\n * `caller=` / `client=` / `client_version=` / `transport=` pairs.\n */\nfunction buildUserAgent(): string {\n const { name, version } = resolveClientInfo();\n const safeName = sanitizeUaToken(name);\n const safeVersion = sanitizeUaToken(version);\n return `runpod-mcp-server/${MCP_SERVER_VERSION} (caller=mcp; client=${safeName}; client_version=${safeVersion}; transport=${MCP_TRANSPORT})`;\n}\n\n/**\n * Headers to attach to every outbound HTTP call so the Runpod platform can\n * attribute traffic to an MCP session and client.\n */\nfunction trackingHeaders(): Record<string, string> {\n return {\n 'User-Agent': buildUserAgent(),\n 'X-Runpod-Session-Id': SESSION_ID,\n };\n}\n\n// GraphQL endpoint for public queries (GPU types, data centers)\nconst GRAPHQL_URL = 'https://api.runpod.io/graphql';\n\n// Helper function to make GraphQL requests to RunPod\nasync function graphqlRequest<T>(query: string): Promise<T> {\n const response = await fetch(GRAPHQL_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...trackingHeaders(),\n },\n body: JSON.stringify({ query }),\n });\n\n const result = (await response.json()) as {\n data?: T;\n errors?: Array<{ message: string }>;\n };\n\n if (result.errors && result.errors.length > 0) {\n throw new Error(\n `GraphQL Error: ${result.errors.map((e) => e.message).join(', ')}`\n );\n }\n\n if (!result.data) {\n throw new Error('No data returned from GraphQL query');\n }\n\n return result.data;\n}\n\n// Helper function to make authenticated API requests to RunPod\nasync function runpodRequest(\n endpoint: string,\n method: string = 'GET',\n body?: Record<string, unknown>\n) {\n const url = `${API_BASE_URL}${endpoint}`;\n const headers = {\n Authorization: `Bearer ${API_KEY}`,\n 'Content-Type': 'application/json',\n ...trackingHeaders(),\n };\n\n const options: NodeFetchRequestInit = {\n method,\n headers,\n };\n\n if (body && (method === 'POST' || method === 'PATCH')) {\n options.body = JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`RunPod API Error: ${response.status} - ${errorText}`);\n }\n\n // Some endpoints might not return JSON\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return await response.json();\n }\n\n return { success: true, status: response.status };\n } catch (error) {\n console.error('Error calling RunPod API:', error);\n throw error;\n }\n}\n\n// ============== INFRASTRUCTURE TOOLS ==============\n\n// List GPU Types\nserver.tool(\n 'list-gpu-types',\n {\n minMemoryGb: z\n .number()\n .optional()\n .describe('Filter to GPUs with at least this much VRAM in GB'),\n secureCloudOnly: z\n .boolean()\n .optional()\n .describe('Filter to only GPUs available in secure cloud'),\n communityCloudOnly: z\n .boolean()\n .optional()\n .describe('Filter to only GPUs available in community cloud'),\n searchTerm: z\n .string()\n .optional()\n .describe(\n \"Search term to filter GPUs by name (e.g., 'A100', 'RTX 4090')\"\n ),\n includeUnavailable: z\n .boolean()\n .optional()\n .describe(\n 'Include GPUs that are currently out of stock. Default is false'\n ),\n },\n async (params) => {\n interface GpuTypesResponse {\n gpuTypes: Array<{\n id: string;\n displayName: string;\n memoryInGb: number;\n secureCloud: boolean;\n communityCloud: boolean;\n lowestPrice?: { stockStatus: string | null } | null;\n }>;\n }\n\n const data = await graphqlRequest<GpuTypesResponse>(`\n query {\n gpuTypes {\n id\n displayName\n memoryInGb\n secureCloud\n communityCloud\n lowestPrice(input: { gpuCount: 1 }) {\n stockStatus\n }\n }\n }\n `);\n\n const stockPriority: Record<string, number> = {\n High: 3,\n Medium: 2,\n Low: 1,\n };\n\n const isAvailable = (gpu: GpuTypesResponse['gpuTypes'][number]) => {\n const status = gpu.lowestPrice?.stockStatus;\n return !!status && status !== 'Out';\n };\n\n let gpuTypes = data.gpuTypes.filter((gpu) => gpu.id !== 'unknown');\n\n if (!params.includeUnavailable) {\n gpuTypes = gpuTypes.filter(isAvailable);\n }\n if (params.minMemoryGb) {\n gpuTypes = gpuTypes.filter(\n (gpu) => gpu.memoryInGb >= params.minMemoryGb!\n );\n }\n if (params.secureCloudOnly) {\n gpuTypes = gpuTypes.filter((gpu) => gpu.secureCloud);\n }\n if (params.communityCloudOnly) {\n gpuTypes = gpuTypes.filter((gpu) => gpu.communityCloud);\n }\n if (params.searchTerm) {\n const term = params.searchTerm.toLowerCase();\n gpuTypes = gpuTypes.filter(\n (gpu) =>\n gpu.id.toLowerCase().includes(term) ||\n gpu.displayName.toLowerCase().includes(term)\n );\n }\n\n gpuTypes.sort((a, b) => {\n const aP = stockPriority[a.lowestPrice?.stockStatus || ''] || 0;\n const bP = stockPriority[b.lowestPrice?.stockStatus || ''] || 0;\n if (bP !== aP) return bP - aP;\n return b.memoryInGb - a.memoryInGb;\n });\n\n const result = gpuTypes.map((gpu) => ({\n id: gpu.id,\n displayName: gpu.displayName,\n memoryGb: gpu.memoryInGb,\n secureCloud: gpu.secureCloud,\n communityCloud: gpu.communityCloud,\n stockStatus: gpu.lowestPrice?.stockStatus || 'unavailable',\n available: isAvailable(gpu),\n }));\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// List Data Centers\nserver.tool(\n 'list-data-centers',\n {\n region: z\n .string()\n .optional()\n .describe(\n \"Filter by region/location (e.g., 'United States', 'Europe', 'Canada')\"\n ),\n },\n async (params) => {\n interface DataCentersResponse {\n dataCenters: Array<{\n id: string;\n name: string;\n location: string;\n }>;\n }\n\n const data = await graphqlRequest<DataCentersResponse>(`\n query {\n dataCenters {\n id\n name\n location\n }\n }\n `);\n\n let dataCenters = data.dataCenters;\n\n if (params.region) {\n const term = params.region.toLowerCase();\n dataCenters = dataCenters.filter((dc) =>\n dc.location.toLowerCase().includes(term)\n );\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(dataCenters, null, 2),\n },\n ],\n };\n }\n);\n\n// Serverless API base URL for endpoint runtime operations (run, status, cancel, etc.)\nconst SERVERLESS_API_BASE_URL = 'https://api.runpod.ai/v2';\n\n// Helper function to make authenticated requests to the Serverless runtime API\nasync function serverlessRequest(\n endpointId: string,\n path: string,\n method: string = 'GET',\n body?: Record<string, unknown>\n) {\n const url = `${SERVERLESS_API_BASE_URL}/${endpointId}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${API_KEY}`,\n 'Content-Type': 'application/json',\n ...trackingHeaders(),\n };\n\n const options: NodeFetchRequestInit = {\n method,\n headers,\n };\n\n if (body && (method === 'POST' || method === 'PATCH')) {\n options.body = JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `RunPod Serverless API Error: ${response.status} - ${errorText}`\n );\n }\n\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return await response.json();\n }\n\n return { success: true, status: response.status };\n } catch (error) {\n console.error('Error calling RunPod Serverless API:', error);\n throw error;\n }\n}\n\n// ============== POD MANAGEMENT TOOLS ==============\n\n// List Pods\nserver.tool(\n 'list-pods',\n {\n computeType: z\n .enum(['GPU', 'CPU'])\n .optional()\n .describe('Filter to only GPU or only CPU Pods'),\n gpuTypeId: z\n .array(z.string())\n .optional()\n .describe('Filter to Pods with any of the listed GPU types'),\n dataCenterId: z\n .array(z.string())\n .optional()\n .describe('Filter to Pods in any of the provided data centers'),\n name: z\n .string()\n .optional()\n .describe('Filter to Pods with the provided name'),\n includeMachine: z\n .boolean()\n .optional()\n .describe('Include information about the machine'),\n includeNetworkVolume: z\n .boolean()\n .optional()\n .describe('Include information about attached network volumes'),\n },\n async (params) => {\n // Construct query parameters\n const queryParams = new URLSearchParams();\n\n if (params.computeType)\n queryParams.append('computeType', params.computeType);\n if (params.gpuTypeId)\n params.gpuTypeId.forEach((type) => queryParams.append('gpuTypeId', type));\n if (params.dataCenterId)\n params.dataCenterId.forEach((dc) =>\n queryParams.append('dataCenterId', dc)\n );\n if (params.name) queryParams.append('name', params.name);\n if (params.includeMachine)\n queryParams.append('includeMachine', params.includeMachine.toString());\n if (params.includeNetworkVolume)\n queryParams.append(\n 'includeNetworkVolume',\n params.includeNetworkVolume.toString()\n );\n\n const queryString = queryParams.toString()\n ? `?${queryParams.toString()}`\n : '';\n const result = await runpodRequest(`/pods${queryString}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Get Pod Details\nserver.tool(\n 'get-pod',\n {\n podId: z.string().describe('ID of the pod to retrieve'),\n includeMachine: z\n .boolean()\n .optional()\n .describe('Include information about the machine'),\n includeNetworkVolume: z\n .boolean()\n .optional()\n .describe('Include information about attached network volumes'),\n },\n async (params) => {\n // Construct query parameters\n const queryParams = new URLSearchParams();\n\n if (params.includeMachine)\n queryParams.append('includeMachine', params.includeMachine.toString());\n if (params.includeNetworkVolume)\n queryParams.append(\n 'includeNetworkVolume',\n params.includeNetworkVolume.toString()\n );\n\n const queryString = queryParams.toString()\n ? `?${queryParams.toString()}`\n : '';\n const result = await runpodRequest(`/pods/${params.podId}${queryString}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Create Pod\nserver.tool(\n 'create-pod',\n 'Create a new GPU/CPU pod on RunPod. If the user does not specify an image, recommend the \"Runpod Pytorch 2.8.0\" image (runpod/pytorch:1.0.2-cu1281-torch280-ubuntu2404) as the default — it has the most up-to-date CUDA and PyTorch versions.',\n {\n name: z.string().optional().describe('Name for the pod'),\n imageName: z.string().describe('Docker image to use'),\n cloudType: z\n .enum(['SECURE', 'COMMUNITY'])\n .optional()\n .describe('SECURE or COMMUNITY cloud'),\n gpuTypeIds: z\n .array(z.string())\n .optional()\n .describe('List of acceptable GPU types'),\n gpuCount: z.number().optional().describe('Number of GPUs'),\n containerDiskInGb: z\n .number()\n .optional()\n .describe('Container disk size in GB'),\n volumeInGb: z.number().optional().describe('Volume size in GB'),\n volumeMountPath: z.string().optional().describe('Path to mount the volume'),\n ports: z\n .array(z.string())\n .optional()\n .describe(\"Ports to expose (e.g., '8888/http', '22/tcp')\"),\n env: z.record(z.string()).optional().describe('Environment variables'),\n dataCenterIds: z\n .array(z.string())\n .optional()\n .describe('List of data centers'),\n },\n async (params) => {\n const result = await runpodRequest('/pods', 'POST', params);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Update Pod\nserver.tool(\n 'update-pod',\n {\n podId: z.string().describe('ID of the pod to update'),\n name: z.string().optional().describe('New name for the pod'),\n imageName: z.string().optional().describe('New Docker image'),\n containerDiskInGb: z\n .number()\n .optional()\n .describe('New container disk size in GB'),\n volumeInGb: z.number().optional().describe('New volume size in GB'),\n volumeMountPath: z\n .string()\n .optional()\n .describe('New path to mount the volume'),\n ports: z.array(z.string()).optional().describe('New ports to expose'),\n env: z.record(z.string()).optional().describe('New environment variables'),\n },\n async (params) => {\n const { podId, ...updateParams } = params;\n const result = await runpodRequest(`/pods/${podId}`, 'PATCH', updateParams);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Start Pod\nserver.tool(\n 'start-pod',\n {\n podId: z.string().describe('ID of the pod to start'),\n },\n async (params) => {\n const result = await runpodRequest(`/pods/${params.podId}/start`, 'POST');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Stop Pod\nserver.tool(\n 'stop-pod',\n {\n podId: z.string().describe('ID of the pod to stop'),\n },\n async (params) => {\n const result = await runpodRequest(`/pods/${params.podId}/stop`, 'POST');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Delete Pod\nserver.tool(\n 'delete-pod',\n {\n podId: z.string().describe('ID of the pod to delete'),\n },\n async (params) => {\n const result = await runpodRequest(`/pods/${params.podId}`, 'DELETE');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// ============== ENDPOINT MANAGEMENT TOOLS ==============\n\n// List Endpoints\nserver.tool(\n 'list-endpoints',\n {\n includeTemplate: z\n .boolean()\n .optional()\n .describe('Include template information'),\n includeWorkers: z\n .boolean()\n .optional()\n .describe('Include information about workers'),\n },\n async (params) => {\n // Construct query parameters\n const queryParams = new URLSearchParams();\n\n if (params.includeTemplate)\n queryParams.append('includeTemplate', params.includeTemplate.toString());\n if (params.includeWorkers)\n queryParams.append('includeWorkers', params.includeWorkers.toString());\n\n const queryString = queryParams.toString()\n ? `?${queryParams.toString()}`\n : '';\n const result = await runpodRequest(`/endpoints${queryString}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Get Endpoint Details\nserver.tool(\n 'get-endpoint',\n {\n endpointId: z.string().describe('ID of the endpoint to retrieve'),\n includeTemplate: z\n .boolean()\n .optional()\n .describe('Include template information'),\n includeWorkers: z\n .boolean()\n .optional()\n .describe('Include information about workers'),\n },\n async (params) => {\n // Construct query parameters\n const queryParams = new URLSearchParams();\n\n if (params.includeTemplate)\n queryParams.append('includeTemplate', params.includeTemplate.toString());\n if (params.includeWorkers)\n queryParams.append('includeWorkers', params.includeWorkers.toString());\n\n const queryString = queryParams.toString()\n ? `?${queryParams.toString()}`\n : '';\n const result = await runpodRequest(\n `/endpoints/${params.endpointId}${queryString}`\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Create Endpoint\nserver.tool(\n 'create-endpoint',\n {\n name: z.string().optional().describe('Name for the endpoint'),\n templateId: z.string().describe('Template ID to use'),\n computeType: z\n .enum(['GPU', 'CPU'])\n .optional()\n .describe('GPU or CPU endpoint'),\n gpuTypeIds: z\n .array(z.string())\n .optional()\n .describe('List of acceptable GPU types'),\n gpuCount: z.number().optional().describe('Number of GPUs per worker'),\n workersMin: z.number().optional().describe('Minimum number of workers'),\n workersMax: z.number().optional().describe('Maximum number of workers'),\n dataCenterIds: z\n .array(z.string())\n .optional()\n .describe('List of data centers'),\n },\n async (params) => {\n const result = await runpodRequest('/endpoints', 'POST', params);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Update Endpoint\nserver.tool(\n 'update-endpoint',\n {\n endpointId: z.string().describe('ID of the endpoint to update'),\n name: z.string().optional().describe('New name for the endpoint'),\n workersMin: z.number().optional().describe('New minimum number of workers'),\n workersMax: z.number().optional().describe('New maximum number of workers'),\n idleTimeout: z.number().optional().describe('New idle timeout in seconds'),\n scalerType: z\n .enum(['QUEUE_DELAY', 'REQUEST_COUNT'])\n .optional()\n .describe('Scaler type'),\n scalerValue: z.number().optional().describe('Scaler value'),\n },\n async (params) => {\n const { endpointId, ...updateParams } = params;\n const result = await runpodRequest(\n `/endpoints/${endpointId}`,\n 'PATCH',\n updateParams\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Delete Endpoint\nserver.tool(\n 'delete-endpoint',\n {\n endpointId: z.string().describe('ID of the endpoint to delete'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/endpoints/${params.endpointId}`,\n 'DELETE'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// ============== SERVERLESS RUNTIME TOOLS ==============\n\n// Shared schemas for serverless tools\nconst endpointIdSchema = z\n .string()\n .regex(/^[a-zA-Z0-9_-]+$/, 'Invalid endpoint ID format');\n\nconst jobIdSchema = z\n .string()\n .regex(/^[a-zA-Z0-9_-]+$/, 'Invalid job ID format');\n\nconst inputSchema = z\n .record(z.unknown())\n .describe(\n 'Input payload for the worker handler. The expected fields depend on the deployed model or worker.'\n );\n\nconst webhookSchema = z\n .string()\n .url()\n .optional()\n .describe(\n 'Webhook URL to receive job completion notifications instead of polling'\n );\n\nconst policySchema = z\n .object({\n executionTimeout: z\n .number()\n .optional()\n .describe('Maximum execution time in milliseconds'),\n lowPriority: z\n .boolean()\n .optional()\n .describe('Submit as a low-priority job'),\n ttl: z\n .number()\n .optional()\n .describe('Time-to-live for the job result in milliseconds'),\n })\n .optional()\n .describe('Execution policy options');\n\nconst s3ConfigSchema = z\n .object({\n accessId: z.string().describe('S3 access key ID'),\n accessSecret: z.string().describe('S3 secret access key'),\n bucketName: z.string().describe('S3 bucket name'),\n endpointUrl: z.string().describe('S3 endpoint URL'),\n })\n .optional()\n .describe('S3-compatible storage config for large outputs');\n\n// Run Endpoint (Async)\nserver.tool(\n 'run-endpoint',\n 'Submit an asynchronous job to a Serverless endpoint. Returns a job ID immediately — use get-job-status to poll for results. Async results are available for 30 minutes after completion.',\n {\n endpointId: endpointIdSchema.describe(\n 'ID of the Serverless endpoint to run'\n ),\n input: inputSchema,\n webhook: webhookSchema,\n policy: policySchema,\n s3Config: s3ConfigSchema,\n },\n async (params) => {\n const { endpointId, ...body } = params;\n const result = await serverlessRequest(\n endpointId,\n '/run',\n 'POST',\n body as Record<string, unknown>\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Run Endpoint Sync\nserver.tool(\n 'runsync-endpoint',\n 'Submit a synchronous job to a Serverless endpoint and wait for the result. Best for tasks completing within 90 seconds. If processing exceeds 90 seconds, the response returns a job ID to poll with get-job-status. Max payload: 20 MB. Results expire after 1 minute. Use the wait parameter to extend the server-side wait up to 5 minutes (300000 ms).',\n {\n endpointId: endpointIdSchema.describe(\n 'ID of the Serverless endpoint to run synchronously'\n ),\n input: inputSchema,\n wait: z\n .number()\n .min(1000)\n .max(300000)\n .optional()\n .describe(\n 'How long in milliseconds the server should wait for a result before returning a job ID to poll (1000–300000). Defaults to 90000 (90 seconds).'\n ),\n webhook: webhookSchema,\n policy: policySchema,\n s3Config: s3ConfigSchema,\n },\n async (params) => {\n const { endpointId, wait, ...body } = params;\n const path = wait ? `/runsync?wait=${wait}` : '/runsync';\n const result = await serverlessRequest(\n endpointId,\n path,\n 'POST',\n body as Record<string, unknown>\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Get Job Status\nserver.tool(\n 'get-job-status',\n 'Check the status of an asynchronous Serverless job. Returns the current status and output when complete. Job statuses: IN_QUEUE, IN_PROGRESS, COMPLETED, FAILED, CANCELLED, TIMED_OUT.',\n {\n endpointId: endpointIdSchema.describe(\n 'ID of the Serverless endpoint the job belongs to'\n ),\n jobId: jobIdSchema.describe('ID of the job to check'),\n },\n async (params) => {\n const result = await serverlessRequest(\n params.endpointId,\n `/status/${params.jobId}`\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Stream Job Results\nserver.tool(\n 'stream-job',\n 'Retrieve all streaming output from a Serverless job by polling until the job reaches a terminal state. The worker must support streaming output. Polls /stream/{jobId} repeatedly and collects every chunk until status is COMPLETED, FAILED, CANCELLED, or TIMED_OUT.',\n {\n endpointId: endpointIdSchema.describe(\n 'ID of the Serverless endpoint the job belongs to'\n ),\n jobId: jobIdSchema.describe('ID of the job to stream results from'),\n },\n async (params) => {\n const TERMINAL_STATUSES = new Set([\n 'COMPLETED',\n 'FAILED',\n 'CANCELLED',\n 'TIMED_OUT',\n ]);\n const MAX_POLL_TIME_MS = 5 * 60 * 1000; // 5 minutes\n const POLL_INTERVAL_MS = 1000;\n const MAX_CONSECUTIVE_ERRORS = 5;\n const allChunks: unknown[] = [];\n let finalResult: Record<string, unknown> = {};\n let consecutiveErrors = 0;\n const startTime = Date.now();\n\n while (true) {\n try {\n const result = (await serverlessRequest(\n params.endpointId,\n `/stream/${params.jobId}`\n )) as Record<string, unknown>;\n\n consecutiveErrors = 0;\n\n if (Array.isArray(result.stream)) {\n allChunks.push(...result.stream);\n }\n\n finalResult = result;\n\n if (TERMINAL_STATUSES.has(result.status as string)) {\n break;\n }\n } catch (error) {\n consecutiveErrors++;\n if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {\n finalResult.error = `Polling aborted after ${MAX_CONSECUTIVE_ERRORS} consecutive errors: ${error instanceof Error ? error.message : String(error)}`;\n break;\n }\n }\n\n if (Date.now() - startTime > MAX_POLL_TIME_MS) {\n finalResult.pollingTimedOut = true;\n finalResult.note =\n 'Polling timed out after 5 minutes. Use get-job-status to check the job later.';\n break;\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ ...finalResult, stream: allChunks }, null, 2),\n },\n ],\n };\n }\n);\n\n// Cancel Job\nserver.tool(\n 'cancel-job',\n 'Cancel a Serverless job that is queued or in progress.',\n {\n endpointId: endpointIdSchema.describe(\n 'ID of the Serverless endpoint the job belongs to'\n ),\n jobId: jobIdSchema.describe('ID of the job to cancel'),\n },\n async (params) => {\n const result = await serverlessRequest(\n params.endpointId,\n `/cancel/${params.jobId}`,\n 'POST'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Retry Job\nserver.tool(\n 'retry-job',\n 'Retry a failed or timed-out Serverless job. Only works for jobs with FAILED or TIMED_OUT status. The previous output is removed and the job is requeued.',\n {\n endpointId: endpointIdSchema.describe(\n 'ID of the Serverless endpoint the job belongs to'\n ),\n jobId: jobIdSchema.describe('ID of the job to retry'),\n },\n async (params) => {\n const result = await serverlessRequest(\n params.endpointId,\n `/retry/${params.jobId}`,\n 'POST'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Endpoint Health\nserver.tool(\n 'endpoint-health',\n 'Get the health and operational status of a Serverless endpoint, including worker counts and job statistics.',\n {\n endpointId: endpointIdSchema.describe(\n 'ID of the Serverless endpoint to check health for'\n ),\n },\n async (params) => {\n const result = await serverlessRequest(params.endpointId, '/health');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Purge Endpoint Queue\nserver.tool(\n 'purge-endpoint-queue',\n 'Remove all pending jobs from a Serverless endpoint queue. Only affects queued jobs — in-progress jobs continue running. Use this for error recovery or clearing outdated requests.',\n {\n endpointId: endpointIdSchema.describe(\n 'ID of the Serverless endpoint to purge the queue for'\n ),\n },\n async (params) => {\n const result = await serverlessRequest(\n params.endpointId,\n '/purge-queue',\n 'POST'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// ============== TEMPLATE MANAGEMENT TOOLS ==============\n\n// List Templates\nserver.tool(\n 'list-templates',\n 'List available templates. By default returns only the user\\'s own templates. Use includeRunpodTemplates to also include official RunPod templates. The recommended default template for new pods is \"Runpod Pytorch 2.8.0\" (ID: runpod-torch-v280) — it has the latest CUDA and PyTorch versions.',\n {\n includeRunpodTemplates: z\n .boolean()\n .optional()\n .describe('Include official RunPod templates in the response'),\n includePublicTemplates: z\n .boolean()\n .optional()\n .describe('Include community-made public templates in the response'),\n includeEndpointBoundTemplates: z\n .boolean()\n .optional()\n .describe(\n 'Include templates bound to Serverless endpoints in the response'\n ),\n },\n async (params) => {\n const queryParams = new URLSearchParams();\n if (params.includeRunpodTemplates)\n queryParams.set('includeRunpodTemplates', 'true');\n if (params.includePublicTemplates)\n queryParams.set('includePublicTemplates', 'true');\n if (params.includeEndpointBoundTemplates)\n queryParams.set('includeEndpointBoundTemplates', 'true');\n const query = queryParams.toString();\n const result = await runpodRequest(`/templates${query ? `?${query}` : ''}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Get Template Details\nserver.tool(\n 'get-template',\n {\n templateId: z.string().describe('ID of the template to retrieve'),\n },\n async (params) => {\n const result = await runpodRequest(`/templates/${params.templateId}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Create Template\nserver.tool(\n 'create-template',\n {\n name: z.string().describe('Name for the template'),\n imageName: z.string().describe('Docker image to use'),\n isServerless: z\n .boolean()\n .optional()\n .describe('Is this a serverless template'),\n ports: z.array(z.string()).optional().describe('Ports to expose'),\n dockerEntrypoint: z\n .array(z.string())\n .optional()\n .describe('Docker entrypoint commands'),\n dockerStartCmd: z\n .array(z.string())\n .optional()\n .describe('Docker start commands'),\n env: z.record(z.string()).optional().describe('Environment variables'),\n containerDiskInGb: z\n .number()\n .optional()\n .describe('Container disk size in GB'),\n volumeInGb: z.number().optional().describe('Volume size in GB'),\n volumeMountPath: z.string().optional().describe('Path to mount the volume'),\n readme: z.string().optional().describe('README content in markdown format'),\n },\n async (params) => {\n const result = await runpodRequest('/templates', 'POST', params);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Update Template\nserver.tool(\n 'update-template',\n {\n templateId: z.string().describe('ID of the template to update'),\n name: z.string().optional().describe('New name for the template'),\n imageName: z.string().optional().describe('New Docker image'),\n ports: z.array(z.string()).optional().describe('New ports to expose'),\n env: z.record(z.string()).optional().describe('New environment variables'),\n readme: z\n .string()\n .optional()\n .describe('New README content in markdown format'),\n },\n async (params) => {\n const { templateId, ...updateParams } = params;\n const result = await runpodRequest(\n `/templates/${templateId}`,\n 'PATCH',\n updateParams\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Delete Template\nserver.tool(\n 'delete-template',\n {\n templateId: z.string().describe('ID of the template to delete'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/templates/${params.templateId}`,\n 'DELETE'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// ============== NETWORK VOLUME MANAGEMENT TOOLS ==============\n\n// List Network Volumes\nserver.tool('list-network-volumes', {}, async () => {\n const result = await runpodRequest('/networkvolumes');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n});\n\n// Get Network Volume Details\nserver.tool(\n 'get-network-volume',\n {\n networkVolumeId: z\n .string()\n .describe('ID of the network volume to retrieve'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/networkvolumes/${params.networkVolumeId}`\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Create Network Volume\nserver.tool(\n 'create-network-volume',\n {\n name: z.string().describe('Name for the network volume'),\n size: z.number().describe('Size in GB (1-4000)'),\n dataCenterId: z.string().describe('Data center ID'),\n },\n async (params) => {\n const result = await runpodRequest('/networkvolumes', 'POST', params);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Update Network Volume\nserver.tool(\n 'update-network-volume',\n {\n networkVolumeId: z.string().describe('ID of the network volume to update'),\n name: z.string().optional().describe('New name for the network volume'),\n size: z\n .number()\n .optional()\n .describe('New size in GB (must be larger than current)'),\n },\n async (params) => {\n const { networkVolumeId, ...updateParams } = params;\n const result = await runpodRequest(\n `/networkvolumes/${networkVolumeId}`,\n 'PATCH',\n updateParams\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Delete Network Volume\nserver.tool(\n 'delete-network-volume',\n {\n networkVolumeId: z.string().describe('ID of the network volume to delete'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/networkvolumes/${params.networkVolumeId}`,\n 'DELETE'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// ============== CONTAINER REGISTRY AUTH TOOLS ==============\n\n// List Container Registry Auths\nserver.tool('list-container-registry-auths', {}, async () => {\n const result = await runpodRequest('/containerregistryauth');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n});\n\n// Get Container Registry Auth Details\nserver.tool(\n 'get-container-registry-auth',\n {\n containerRegistryAuthId: z\n .string()\n .describe('ID of the container registry auth to retrieve'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/containerregistryauth/${params.containerRegistryAuthId}`\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Create Container Registry Auth\nserver.tool(\n 'create-container-registry-auth',\n {\n name: z.string().describe('Name for the container registry auth'),\n username: z.string().describe('Registry username'),\n password: z.string().describe('Registry password'),\n },\n async (params) => {\n const result = await runpodRequest(\n '/containerregistryauth',\n 'POST',\n params\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Delete Container Registry Auth\nserver.tool(\n 'delete-container-registry-auth',\n {\n containerRegistryAuthId: z\n .string()\n .describe('ID of the container registry auth to delete'),\n },\n async (params) => {\n const result = await runpodRequest(\n `/containerregistryauth/${params.containerRegistryAuthId}`,\n 'DELETE'\n );\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n);\n\n// Start receiving messages on stdin and sending messages on stdout\nconst transport = new StdioServerTransport();\nserver.connect(transport);\n"],"mappings":"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","names":["fetch"]}
|