@runpod/mcp-server 1.3.0 → 1.4.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 +18 -0
- package/README.md +10 -0
- package/dist/{chunk-CRHHCQRI.mjs → chunk-D4AEYJ2O.mjs} +206 -154
- package/dist/chunk-D4AEYJ2O.mjs.map +1 -0
- package/dist/http.cjs +206 -154
- package/dist/http.cjs.map +1 -1
- package/dist/http.mjs +2 -2
- package/dist/stdio.cjs +685 -204
- package/dist/stdio.cjs.map +1 -1
- package/dist/stdio.mjs +262 -200
- package/dist/stdio.mjs.map +1 -1
- package/dist/tools.cjs +205 -153
- package/dist/tools.cjs.map +1 -1
- package/dist/tools.mjs +1 -1
- package/dist/wizard-37ZJSVB5.mjs +402 -0
- package/dist/wizard-37ZJSVB5.mjs.map +1 -0
- package/package.json +4 -1
- package/dist/chunk-CRHHCQRI.mjs.map +0 -1
package/dist/stdio.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stdio.ts","../src/server.ts","../src/tools.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createServer } from './server.js';\nimport { registerTools } from './tools.js';\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\nconst server = createServer();\n\n// Register all tools with the API key from the environment\nregisterTools(server, { apiKey: API_KEY, transport: 'stdio' });\n\n// Start receiving messages on stdin and sending messages on stdout\nconst transport = new StdioServerTransport();\nserver.connect(transport);\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\n// `__PACKAGE_VERSION__` is replaced at build time by tsup's `define` with the\n// current `version` from package.json. Falls back to `'dev'` when the\n// substitution doesn't happen (e.g. running via tsx).\ndeclare const __PACKAGE_VERSION__: string;\n\nexport const SERVER_NAME = 'Runpod API Server';\nexport const SERVER_VERSION =\n typeof __PACKAGE_VERSION__ !== 'undefined' ? __PACKAGE_VERSION__ : 'dev';\n\n// `version` defaults to the build-time value (correct for the npm/stdio build).\n// The hosted entrypoint passes a runtime value read from package.json, since\n// tsup's define doesn't run when Vercel compiles api/index.ts.\nexport function createServer(version: string = SERVER_VERSION): McpServer {\n return new McpServer({\n name: SERVER_NAME,\n version,\n capabilities: {\n resources: {},\n tools: {},\n },\n });\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.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 REST API. Override via RUNPOD_REST_API_URL to point at a\n// non-production environment (e.g. when authenticating with a dev API key).\nconst API_BASE_URL =\n process.env.RUNPOD_REST_API_URL ?? 'https://rest.runpod.io/v1';\n\n// Serverless API base URL for endpoint runtime operations (run, status, cancel, etc.).\n// Override via RUNPOD_SERVERLESS_API_URL for non-production environments.\nconst SERVERLESS_API_BASE_URL =\n process.env.RUNPOD_SERVERLESS_API_URL ?? 'https://api.runpod.ai/v2';\n\n// GraphQL endpoint for public queries (GPU types, data centers). Override via\n// RUNPOD_PUBLIC_GRAPHQL_URL for non-production environments. This is distinct\n// from the flash auth backend (RUNPOD_GRAPHQL_URL, used only by the OAuth flow\n// in api/index.ts).\nconst GRAPHQL_URL =\n process.env.RUNPOD_PUBLIC_GRAPHQL_URL ?? 'https://api.runpod.io/graphql';\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 Code,\n// Cursor, Codex, Gemini CLI, etc.) and count distinct agent sessions. Pure\n// observability — no tool behavior changes.\n//\n// `__PACKAGE_VERSION__` is replaced at build time by tsup's `define` with the\n// current `version` from package.json. Falls back to `'dev'` when the\n// 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// 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 * Sanitizes a value for inclusion in a User-Agent token. RFC 7230 reserves\n * parens and a few other chars; strip them so the structured UA stays\n * parseable, and bound the length so a hostile client can't blow up a header.\n */\nfunction sanitizeUaToken(value: string): string {\n return value.replace(/[()<>@,;:\\\\\"/[\\]?={}\\s]/g, '_').slice(0, 64);\n}\n\n/**\n * Builds the headers that identify the calling MCP client and session on every\n * outbound HTTP call. Client identity comes from the `initialize` handshake's\n * `clientInfo` (exposed by the SDK via `server.server.getClientVersion()`),\n * which works for the long-lived stdio server. In stateless HTTP that handshake\n * is on a different request, so we fall back to the inbound HTTP User-Agent.\n */\nfunction trackingHeaders(\n server: McpServer,\n ctx: ToolContext\n): Record<string, string> {\n const info = server.server.getClientVersion();\n const fallbackName = ctx.clientUserAgent || 'unknown';\n const name = sanitizeUaToken(info?.name || fallbackName);\n const version = sanitizeUaToken(info?.version || 'unknown');\n // Prefer a server version supplied by the caller (the hosted entrypoint reads\n // it from package.json at runtime, since tsup's build-time define does not\n // run when Vercel compiles api/index.ts). Fall back to the build-time value.\n const serverVersion = ctx.serverVersion || MCP_SERVER_VERSION;\n const userAgent = `runpod-mcp-server/${serverVersion} (caller=mcp; client=${name}; client_version=${version}; transport=${ctx.transport})`;\n return {\n 'User-Agent': userAgent,\n 'X-Runpod-Session-Id': SESSION_ID,\n };\n}\n\n/**\n * Context passed to every tool handler. Contains the API key used to\n * authenticate against the Runpod REST and Serverless APIs, the transport the\n * server is running under, and (for stateless HTTP) the inbound client\n * User-Agent — all used for outbound caller-tracking headers.\n */\nexport interface ToolContext {\n apiKey: string;\n transport: 'stdio' | 'http';\n clientUserAgent?: string;\n serverVersion?: string;\n}\n\n// Helper function to make GraphQL requests to Runpod (public, no auth required)\nasync function graphqlRequest<T>(\n query: string,\n tracking: () => Record<string, string>\n): Promise<T> {\n const response = await fetch(GRAPHQL_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...tracking(),\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 REST API\nfunction createRunpodRequest(\n apiKey: string,\n tracking: () => Record<string, string>\n) {\n return async 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 ${apiKey}`,\n 'Content-Type': 'application/json',\n ...tracking(),\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\n// Helper function to make authenticated requests to the Serverless runtime API\nfunction createServerlessRequest(\n apiKey: string,\n tracking: () => Record<string, string>\n) {\n return async 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 ${apiKey}`,\n 'Content-Type': 'application/json',\n ...tracking(),\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\n/**\n * Register all Runpod tools on the given MCP server instance. The provided\n * context supplies the API key that authenticated request helpers will use.\n */\nexport function registerTools(server: McpServer, ctx: ToolContext): void {\n const tracking = () => trackingHeaders(server, ctx);\n const runpodRequest = createRunpodRequest(ctx.apiKey, tracking);\n const serverlessRequest = createServerlessRequest(ctx.apiKey, tracking);\n\n // ============== INFRASTRUCTURE TOOLS ==============\n\n // List GPU Types\n server.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 `\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 tracking\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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // List Data Centers\n server.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 `\n query {\n dataCenters {\n id\n name\n location\n }\n }\n `,\n tracking\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' as const,\n text: JSON.stringify(dataCenters, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== POD MANAGEMENT TOOLS ==============\n\n // List Pods\n server.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 const queryParams = new URLSearchParams();\n\n if (params.computeType)\n queryParams.append('computeType', params.computeType);\n if (params.gpuTypeId)\n params.gpuTypeId.forEach((type) =>\n queryParams.append('gpuTypeId', type)\n );\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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Get Pod Details\n server.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 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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Create Pod\n server.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\n .string()\n .optional()\n .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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Update Pod\n server.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\n .record(z.string())\n .optional()\n .describe('New environment variables'),\n },\n async (params) => {\n const { podId, ...updateParams } = params;\n const result = await runpodRequest(\n `/pods/${podId}`,\n 'PATCH',\n updateParams\n );\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Start Pod\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Stop Pod\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Delete Pod\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== ENDPOINT MANAGEMENT TOOLS ==============\n\n // List Endpoints\n server.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 const queryParams = new URLSearchParams();\n\n if (params.includeTemplate)\n queryParams.append(\n 'includeTemplate',\n params.includeTemplate.toString()\n );\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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Get Endpoint Details\n server.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 const queryParams = new URLSearchParams();\n\n if (params.includeTemplate)\n queryParams.append(\n 'includeTemplate',\n params.includeTemplate.toString()\n );\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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Create Endpoint\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Update Endpoint\n server.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\n .number()\n .optional()\n .describe('New minimum number of workers'),\n workersMax: z\n .number()\n .optional()\n .describe('New maximum number of workers'),\n idleTimeout: z\n .number()\n .optional()\n .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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Delete Endpoint\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== SERVERLESS RUNTIME TOOLS ==============\n\n // Shared schemas for serverless tools\n const endpointIdSchema = z\n .string()\n .regex(/^[a-zA-Z0-9_-]+$/, 'Invalid endpoint ID format');\n\n const jobIdSchema = z\n .string()\n .regex(/^[a-zA-Z0-9_-]+$/, 'Invalid job ID format');\n\n const 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\n const webhookSchema = z\n .string()\n .url()\n .optional()\n .describe(\n 'Webhook URL to receive job completion notifications instead of polling'\n );\n\n const 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\n const 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)\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Run Endpoint Sync\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Get Job Status\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Stream Job Results\n server.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 let lastError: string | undefined;\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 lastError = error instanceof Error ? error.message : String(error);\n if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {\n finalResult.error = `Polling aborted after ${MAX_CONSECUTIVE_ERRORS} consecutive errors: ${lastError}`;\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 // Surface the most recent error (if any) instead of discarding it —\n // the last poll may have been failing (e.g. job expired) even though\n // earlier polls succeeded.\n if (lastError) finalResult.lastError = lastError;\n break;\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(\n { ...finalResult, stream: allChunks },\n null,\n 2\n ),\n },\n ],\n };\n }\n );\n\n // Cancel Job\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Retry Job\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Endpoint Health\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Purge Endpoint Queue\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== TEMPLATE MANAGEMENT TOOLS ==============\n\n // List Templates\n server.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(\n `/templates${query ? `?${query}` : ''}`\n );\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Get Template Details\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Create Template\n server.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\n .string()\n .optional()\n .describe('Path to mount the volume'),\n readme: z\n .string()\n .optional()\n .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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Update Template\n server.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\n .record(z.string())\n .optional()\n .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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Delete Template\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== NETWORK VOLUME MANAGEMENT TOOLS ==============\n\n // List Network Volumes\n server.tool('list-network-volumes', {}, async () => {\n const result = await runpodRequest('/networkvolumes');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n });\n\n // Get Network Volume Details\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Create Network Volume\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Update Network Volume\n server.tool(\n 'update-network-volume',\n {\n networkVolumeId: z\n .string()\n .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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Delete Network Volume\n server.tool(\n 'delete-network-volume',\n {\n networkVolumeId: z\n .string()\n .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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== CONTAINER REGISTRY AUTH TOOLS ==============\n\n // List Container Registry Auths\n server.tool('list-container-registry-auths', {}, async () => {\n const result = await runpodRequest('/containerregistryauth');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n });\n\n // Get Container Registry Auth Details\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Create Container Registry Auth\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Delete Container Registry Auth\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mBAAqC;;;ACArC,iBAA0B;AAOnB,IAAM,cAAc;AACpB,IAAM,iBACX,OAA6C,UAAsB;AAK9D,SAAS,aAAa,UAAkB,gBAA2B;AACxE,SAAO,IAAI,qBAAU;AAAA,IACnB,MAAM;AAAA,IACN;AAAA,IACA,cAAc;AAAA,MACZ,WAAW,CAAC;AAAA,MACZ,OAAO,CAAC;AAAA,IACV;AAAA,EACF,CAAC;AACH;;;ACtBA,iBAAkB;AAClB,wBAAgE;AAChE,yBAA2B;AAI3B,IAAM,eACJ,QAAQ,IAAI,uBAAuB;AAIrC,IAAM,0BACJ,QAAQ,IAAI,6BAA6B;AAM3C,IAAM,cACJ,QAAQ,IAAI,6BAA6B;AAY3C,IAAM,qBACJ,OAA6C,UAAsB;AAIrE,IAAM,iBAAa,+BAAW;AAO9B,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,MAAM,QAAQ,4BAA4B,GAAG,EAAE,MAAM,GAAG,EAAE;AACnE;AASA,SAAS,gBACPA,SACA,KACwB;AACxB,QAAM,OAAOA,QAAO,OAAO,iBAAiB;AAC5C,QAAM,eAAe,IAAI,mBAAmB;AAC5C,QAAM,OAAO,gBAAgB,MAAM,QAAQ,YAAY;AACvD,QAAM,UAAU,gBAAgB,MAAM,WAAW,SAAS;AAI1D,QAAM,gBAAgB,IAAI,iBAAiB;AAC3C,QAAM,YAAY,qBAAqB,aAAa,wBAAwB,IAAI,oBAAoB,OAAO,eAAe,IAAI,SAAS;AACvI,SAAO;AAAA,IACL,cAAc;AAAA,IACd,uBAAuB;AAAA,EACzB;AACF;AAgBA,eAAe,eACb,OACA,UACY;AACZ,QAAM,WAAW,UAAM,kBAAAC,SAAM,aAAa;AAAA,IACxC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,GAAG,SAAS;AAAA,IACd;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,EAChC,CAAC;AAED,QAAM,SAAU,MAAM,SAAS,KAAK;AAKpC,MAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAC7C,UAAM,IAAI;AAAA,MACR,kBAAkB,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,MAAM;AAChB,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AAEA,SAAO,OAAO;AAChB;AAGA,SAAS,oBACP,QACA,UACA;AACA,SAAO,eAAe,cACpB,UACA,SAAiB,OACjB,MACA;AACA,UAAM,MAAM,GAAG,YAAY,GAAG,QAAQ;AACtC,UAAM,UAAU;AAAA,MACd,eAAe,UAAU,MAAM;AAAA,MAC/B,gBAAgB;AAAA,MAChB,GAAG,SAAS;AAAA,IACd;AAEA,UAAM,UAAgC;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,UAAU,WAAW,UAAU;AACrD,cAAQ,OAAO,KAAK,UAAU,IAAI;AAAA,IACpC;AAEA,QAAI;AACF,YAAM,WAAW,UAAM,kBAAAA,SAAM,KAAK,OAAO;AAEzC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAM,IAAI,MAAM,qBAAqB,SAAS,MAAM,MAAM,SAAS,EAAE;AAAA,MACvE;AAGA,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAI,eAAe,YAAY,SAAS,kBAAkB,GAAG;AAC3D,eAAO,MAAM,SAAS,KAAK;AAAA,MAC7B;AAEA,aAAO,EAAE,SAAS,MAAM,QAAQ,SAAS,OAAO;AAAA,IAClD,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAGA,SAAS,wBACP,QACA,UACA;AACA,SAAO,eAAe,kBACpB,YACA,MACA,SAAiB,OACjB,MACA;AACA,UAAM,MAAM,GAAG,uBAAuB,IAAI,UAAU,GAAG,IAAI;AAC3D,UAAM,UAAkC;AAAA,MACtC,eAAe,UAAU,MAAM;AAAA,MAC/B,gBAAgB;AAAA,MAChB,GAAG,SAAS;AAAA,IACd;AAEA,UAAM,UAAgC;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,UAAU,WAAW,UAAU;AACrD,cAAQ,OAAO,KAAK,UAAU,IAAI;AAAA,IACpC;AAEA,QAAI;AACF,YAAM,WAAW,UAAM,kBAAAA,SAAM,KAAK,OAAO;AAEzC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAM,IAAI;AAAA,UACR,gCAAgC,SAAS,MAAM,MAAM,SAAS;AAAA,QAChE;AAAA,MACF;AAEA,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAI,eAAe,YAAY,SAAS,kBAAkB,GAAG;AAC3D,eAAO,MAAM,SAAS,KAAK;AAAA,MAC7B;AAEA,aAAO,EAAE,SAAS,MAAM,QAAQ,SAAS,OAAO;AAAA,IAClD,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,KAAK;AAC3D,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAMO,SAAS,cAAcD,SAAmB,KAAwB;AACvE,QAAM,WAAW,MAAM,gBAAgBA,SAAQ,GAAG;AAClD,QAAM,gBAAgB,oBAAoB,IAAI,QAAQ,QAAQ;AAC9D,QAAM,oBAAoB,wBAAwB,IAAI,QAAQ,QAAQ;AAKtE,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa,aACV,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AAAA,MAC/D,iBAAiB,aACd,QAAQ,EACR,SAAS,EACT,SAAS,+CAA+C;AAAA,MAC3D,oBAAoB,aACjB,QAAQ,EACR,SAAS,EACT,SAAS,kDAAkD;AAAA,MAC9D,YAAY,aACT,OAAO,EACP,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,oBAAoB,aACjB,QAAQ,EACR,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,IACA,OAAO,WAAW;AAYhB,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAcA;AAAA,MACF;AAEA,YAAM,gBAAwC;AAAA,QAC5C,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,KAAK;AAAA,MACP;AAEA,YAAM,cAAc,CAAC,QAA8C;AACjE,cAAM,SAAS,IAAI,aAAa;AAChC,eAAO,CAAC,CAAC,UAAU,WAAW;AAAA,MAChC;AAEA,UAAI,WAAW,KAAK,SAAS,OAAO,CAAC,QAAQ,IAAI,OAAO,SAAS;AAEjE,UAAI,CAAC,OAAO,oBAAoB;AAC9B,mBAAW,SAAS,OAAO,WAAW;AAAA,MACxC;AACA,UAAI,OAAO,aAAa;AACtB,mBAAW,SAAS;AAAA,UAClB,CAAC,QAAQ,IAAI,cAAc,OAAO;AAAA,QACpC;AAAA,MACF;AACA,UAAI,OAAO,iBAAiB;AAC1B,mBAAW,SAAS,OAAO,CAAC,QAAQ,IAAI,WAAW;AAAA,MACrD;AACA,UAAI,OAAO,oBAAoB;AAC7B,mBAAW,SAAS,OAAO,CAAC,QAAQ,IAAI,cAAc;AAAA,MACxD;AACA,UAAI,OAAO,YAAY;AACrB,cAAM,OAAO,OAAO,WAAW,YAAY;AAC3C,mBAAW,SAAS;AAAA,UAClB,CAAC,QACC,IAAI,GAAG,YAAY,EAAE,SAAS,IAAI,KAClC,IAAI,YAAY,YAAY,EAAE,SAAS,IAAI;AAAA,QAC/C;AAAA,MACF;AAEA,eAAS,KAAK,CAAC,GAAG,MAAM;AACtB,cAAM,KAAK,cAAc,EAAE,aAAa,eAAe,EAAE,KAAK;AAC9D,cAAM,KAAK,cAAc,EAAE,aAAa,eAAe,EAAE,KAAK;AAC9D,YAAI,OAAO,GAAI,QAAO,KAAK;AAC3B,eAAO,EAAE,aAAa,EAAE;AAAA,MAC1B,CAAC;AAED,YAAM,SAAS,SAAS,IAAI,CAAC,SAAS;AAAA,QACpC,IAAI,IAAI;AAAA,QACR,aAAa,IAAI;AAAA,QACjB,UAAU,IAAI;AAAA,QACd,aAAa,IAAI;AAAA,QACjB,gBAAgB,IAAI;AAAA,QACpB,aAAa,IAAI,aAAa,eAAe;AAAA,QAC7C,WAAW,YAAY,GAAG;AAAA,MAC5B,EAAE;AAEF,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,QAAQ,aACL,OAAO,EACP,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,IACA,OAAO,WAAW;AAShB,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA;AAAA,MACF;AAEA,UAAI,cAAc,KAAK;AAEvB,UAAI,OAAO,QAAQ;AACjB,cAAM,OAAO,OAAO,OAAO,YAAY;AACvC,sBAAc,YAAY;AAAA,UAAO,CAAC,OAChC,GAAG,SAAS,YAAY,EAAE,SAAS,IAAI;AAAA,QACzC;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa,aACV,KAAK,CAAC,OAAO,KAAK,CAAC,EACnB,SAAS,EACT,SAAS,qCAAqC;AAAA,MACjD,WAAW,aACR,MAAM,aAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,iDAAiD;AAAA,MAC7D,cAAc,aACX,MAAM,aAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,oDAAoD;AAAA,MAChE,MAAM,aACH,OAAO,EACP,SAAS,EACT,SAAS,uCAAuC;AAAA,MACnD,gBAAgB,aACb,QAAQ,EACR,SAAS,EACT,SAAS,uCAAuC;AAAA,MACnD,sBAAsB,aACnB,QAAQ,EACR,SAAS,EACT,SAAS,oDAAoD;AAAA,IAClE;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,cAAc,IAAI,gBAAgB;AAExC,UAAI,OAAO;AACT,oBAAY,OAAO,eAAe,OAAO,WAAW;AACtD,UAAI,OAAO;AACT,eAAO,UAAU;AAAA,UAAQ,CAAC,SACxB,YAAY,OAAO,aAAa,IAAI;AAAA,QACtC;AACF,UAAI,OAAO;AACT,eAAO,aAAa;AAAA,UAAQ,CAAC,OAC3B,YAAY,OAAO,gBAAgB,EAAE;AAAA,QACvC;AACF,UAAI,OAAO,KAAM,aAAY,OAAO,QAAQ,OAAO,IAAI;AACvD,UAAI,OAAO;AACT,oBAAY,OAAO,kBAAkB,OAAO,eAAe,SAAS,CAAC;AACvE,UAAI,OAAO;AACT,oBAAY;AAAA,UACV;AAAA,UACA,OAAO,qBAAqB,SAAS;AAAA,QACvC;AAEF,YAAM,cAAc,YAAY,SAAS,IACrC,IAAI,YAAY,SAAS,CAAC,KAC1B;AACJ,YAAM,SAAS,MAAM,cAAc,QAAQ,WAAW,EAAE;AAExD,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO,aAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,MACtD,gBAAgB,aACb,QAAQ,EACR,SAAS,EACT,SAAS,uCAAuC;AAAA,MACnD,sBAAsB,aACnB,QAAQ,EACR,SAAS,EACT,SAAS,oDAAoD;AAAA,IAClE;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,cAAc,IAAI,gBAAgB;AAExC,UAAI,OAAO;AACT,oBAAY,OAAO,kBAAkB,OAAO,eAAe,SAAS,CAAC;AACvE,UAAI,OAAO;AACT,oBAAY;AAAA,UACV;AAAA,UACA,OAAO,qBAAqB,SAAS;AAAA,QACvC;AAEF,YAAM,cAAc,YAAY,SAAS,IACrC,IAAI,YAAY,SAAS,CAAC,KAC1B;AACJ,YAAM,SAAS,MAAM,cAAc,SAAS,OAAO,KAAK,GAAG,WAAW,EAAE;AAExE,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAM,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,MACvD,WAAW,aAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,MACpD,WAAW,aACR,KAAK,CAAC,UAAU,WAAW,CAAC,EAC5B,SAAS,EACT,SAAS,2BAA2B;AAAA,MACvC,YAAY,aACT,MAAM,aAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,8BAA8B;AAAA,MAC1C,UAAU,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB;AAAA,MACzD,mBAAmB,aAChB,OAAO,EACP,SAAS,EACT,SAAS,2BAA2B;AAAA,MACvC,YAAY,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC9D,iBAAiB,aACd,OAAO,EACP,SAAS,EACT,SAAS,0BAA0B;AAAA,MACtC,OAAO,aACJ,MAAM,aAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,+CAA+C;AAAA,MAC3D,KAAK,aAAE,OAAO,aAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,MACrE,eAAe,aACZ,MAAM,aAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,sBAAsB;AAAA,IACpC;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM,cAAc,SAAS,QAAQ,MAAM;AAE1D,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO,aAAE,OAAO,EAAE,SAAS,yBAAyB;AAAA,MACpD,MAAM,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,MAC3D,WAAW,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,MAC5D,mBAAmB,aAChB,OAAO,EACP,SAAS,EACT,SAAS,+BAA+B;AAAA,MAC3C,YAAY,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,MAClE,iBAAiB,aACd,OAAO,EACP,SAAS,EACT,SAAS,8BAA8B;AAAA,MAC1C,OAAO,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,MACpE,KAAK,aACF,OAAO,aAAE,OAAO,CAAC,EACjB,SAAS,EACT,SAAS,2BAA2B;AAAA,IACzC;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,EAAE,OAAO,GAAG,aAAa,IAAI;AACnC,YAAM,SAAS,MAAM;AAAA,QACnB,SAAS,KAAK;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO,aAAE,OAAO,EAAE,SAAS,wBAAwB;AAAA,IACrD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM,cAAc,SAAS,OAAO,KAAK,UAAU,MAAM;AAExE,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO,aAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,IACpD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM,cAAc,SAAS,OAAO,KAAK,SAAS,MAAM;AAEvE,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO,aAAE,OAAO,EAAE,SAAS,yBAAyB;AAAA,IACtD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM,cAAc,SAAS,OAAO,KAAK,IAAI,QAAQ;AAEpE,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,iBAAiB,aACd,QAAQ,EACR,SAAS,EACT,SAAS,8BAA8B;AAAA,MAC1C,gBAAgB,aACb,QAAQ,EACR,SAAS,EACT,SAAS,mCAAmC;AAAA,IACjD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,cAAc,IAAI,gBAAgB;AAExC,UAAI,OAAO;AACT,oBAAY;AAAA,UACV;AAAA,UACA,OAAO,gBAAgB,SAAS;AAAA,QAClC;AACF,UAAI,OAAO;AACT,oBAAY,OAAO,kBAAkB,OAAO,eAAe,SAAS,CAAC;AAEvE,YAAM,cAAc,YAAY,SAAS,IACrC,IAAI,YAAY,SAAS,CAAC,KAC1B;AACJ,YAAM,SAAS,MAAM,cAAc,aAAa,WAAW,EAAE;AAE7D,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,YAAY,aAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,MAChE,iBAAiB,aACd,QAAQ,EACR,SAAS,EACT,SAAS,8BAA8B;AAAA,MAC1C,gBAAgB,aACb,QAAQ,EACR,SAAS,EACT,SAAS,mCAAmC;AAAA,IACjD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,cAAc,IAAI,gBAAgB;AAExC,UAAI,OAAO;AACT,oBAAY;AAAA,UACV;AAAA,UACA,OAAO,gBAAgB,SAAS;AAAA,QAClC;AACF,UAAI,OAAO;AACT,oBAAY,OAAO,kBAAkB,OAAO,eAAe,SAAS,CAAC;AAEvE,YAAM,cAAc,YAAY,SAAS,IACrC,IAAI,YAAY,SAAS,CAAC,KAC1B;AACJ,YAAM,SAAS,MAAM;AAAA,QACnB,cAAc,OAAO,UAAU,GAAG,WAAW;AAAA,MAC/C;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,MAAM,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,MAC5D,YAAY,aAAE,OAAO,EAAE,SAAS,oBAAoB;AAAA,MACpD,aAAa,aACV,KAAK,CAAC,OAAO,KAAK,CAAC,EACnB,SAAS,EACT,SAAS,qBAAqB;AAAA,MACjC,YAAY,aACT,MAAM,aAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,8BAA8B;AAAA,MAC1C,UAAU,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MACpE,YAAY,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MACtE,YAAY,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MACtE,eAAe,aACZ,MAAM,aAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,sBAAsB;AAAA,IACpC;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM,cAAc,cAAc,QAAQ,MAAM;AAE/D,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,YAAY,aAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,MAC9D,MAAM,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAChE,YAAY,aACT,OAAO,EACP,SAAS,EACT,SAAS,+BAA+B;AAAA,MAC3C,YAAY,aACT,OAAO,EACP,SAAS,EACT,SAAS,+BAA+B;AAAA,MAC3C,aAAa,aACV,OAAO,EACP,SAAS,EACT,SAAS,6BAA6B;AAAA,MACzC,YAAY,aACT,KAAK,CAAC,eAAe,eAAe,CAAC,EACrC,SAAS,EACT,SAAS,aAAa;AAAA,MACzB,aAAa,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,cAAc;AAAA,IAC5D;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,EAAE,YAAY,GAAG,aAAa,IAAI;AACxC,YAAM,SAAS,MAAM;AAAA,QACnB,cAAc,UAAU;AAAA,QACxB;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,YAAY,aAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,IAChE;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB,cAAc,OAAO,UAAU;AAAA,QAC/B;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,QAAM,mBAAmB,aACtB,OAAO,EACP,MAAM,oBAAoB,4BAA4B;AAEzD,QAAM,cAAc,aACjB,OAAO,EACP,MAAM,oBAAoB,uBAAuB;AAEpD,QAAM,cAAc,aACjB,OAAO,aAAE,QAAQ,CAAC,EAClB;AAAA,IACC;AAAA,EACF;AAEF,QAAM,gBAAgB,aACnB,OAAO,EACP,IAAI,EACJ,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAEF,QAAM,eAAe,aAClB,OAAO;AAAA,IACN,kBAAkB,aACf,OAAO,EACP,SAAS,EACT,SAAS,wCAAwC;AAAA,IACpD,aAAa,aACV,QAAQ,EACR,SAAS,EACT,SAAS,8BAA8B;AAAA,IAC1C,KAAK,aACF,OAAO,EACP,SAAS,EACT,SAAS,iDAAiD;AAAA,EAC/D,CAAC,EACA,SAAS,EACT,SAAS,0BAA0B;AAEtC,QAAM,iBAAiB,aACpB,OAAO;AAAA,IACN,UAAU,aAAE,OAAO,EAAE,SAAS,kBAAkB;AAAA,IAChD,cAAc,aAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,IACxD,YAAY,aAAE,OAAO,EAAE,SAAS,gBAAgB;AAAA,IAChD,aAAa,aAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,EACpD,CAAC,EACA,SAAS,EACT,SAAS,gDAAgD;AAG5D,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,iBAAiB;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,EAAE,YAAY,GAAG,KAAK,IAAI;AAChC,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,iBAAiB;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MACP,MAAM,aACH,OAAO,EACP,IAAI,GAAI,EACR,IAAI,GAAM,EACV,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,EAAE,YAAY,MAAM,GAAG,KAAK,IAAI;AACtC,YAAM,OAAO,OAAO,iBAAiB,IAAI,KAAK;AAC9C,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,iBAAiB;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,OAAO,YAAY,SAAS,wBAAwB;AAAA,IACtD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO;AAAA,QACP,WAAW,OAAO,KAAK;AAAA,MACzB;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,iBAAiB;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,OAAO,YAAY,SAAS,sCAAsC;AAAA,IACpE;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,oBAAoB,oBAAI,IAAI;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,YAAM,mBAAmB,IAAI,KAAK;AAClC,YAAM,mBAAmB;AACzB,YAAM,yBAAyB;AAC/B,YAAM,YAAuB,CAAC;AAC9B,UAAI,cAAuC,CAAC;AAC5C,UAAI,oBAAoB;AACxB,UAAI;AACJ,YAAM,YAAY,KAAK,IAAI;AAE3B,aAAO,MAAM;AACX,YAAI;AACF,gBAAM,SAAU,MAAM;AAAA,YACpB,OAAO;AAAA,YACP,WAAW,OAAO,KAAK;AAAA,UACzB;AAEA,8BAAoB;AAEpB,cAAI,MAAM,QAAQ,OAAO,MAAM,GAAG;AAChC,sBAAU,KAAK,GAAG,OAAO,MAAM;AAAA,UACjC;AAEA,wBAAc;AAEd,cAAI,kBAAkB,IAAI,OAAO,MAAgB,GAAG;AAClD;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd;AACA,sBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,cAAI,qBAAqB,wBAAwB;AAC/C,wBAAY,QAAQ,yBAAyB,sBAAsB,wBAAwB,SAAS;AACpG;AAAA,UACF;AAAA,QACF;AAEA,YAAI,KAAK,IAAI,IAAI,YAAY,kBAAkB;AAC7C,sBAAY,kBAAkB;AAC9B,sBAAY,OACV;AAIF,cAAI,UAAW,aAAY,YAAY;AACvC;AAAA,QACF;AAEA,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,gBAAgB,CAAC;AAAA,MACtE;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK;AAAA,cACT,EAAE,GAAG,aAAa,QAAQ,UAAU;AAAA,cACpC;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,iBAAiB;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,OAAO,YAAY,SAAS,yBAAyB;AAAA,IACvD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO;AAAA,QACP,WAAW,OAAO,KAAK;AAAA,QACvB;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,iBAAiB;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,OAAO,YAAY,SAAS,wBAAwB;AAAA,IACtD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO;AAAA,QACP,UAAU,OAAO,KAAK;AAAA,QACtB;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,iBAAiB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM,kBAAkB,OAAO,YAAY,SAAS;AAEnE,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,iBAAiB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,wBAAwB,aACrB,QAAQ,EACR,SAAS,EACT,SAAS,mDAAmD;AAAA,MAC/D,wBAAwB,aACrB,QAAQ,EACR,SAAS,EACT,SAAS,yDAAyD;AAAA,MACrE,+BAA+B,aAC5B,QAAQ,EACR,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,cAAc,IAAI,gBAAgB;AACxC,UAAI,OAAO;AACT,oBAAY,IAAI,0BAA0B,MAAM;AAClD,UAAI,OAAO;AACT,oBAAY,IAAI,0BAA0B,MAAM;AAClD,UAAI,OAAO;AACT,oBAAY,IAAI,iCAAiC,MAAM;AACzD,YAAM,QAAQ,YAAY,SAAS;AACnC,YAAM,SAAS,MAAM;AAAA,QACnB,aAAa,QAAQ,IAAI,KAAK,KAAK,EAAE;AAAA,MACvC;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,YAAY,aAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,IAClE;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM,cAAc,cAAc,OAAO,UAAU,EAAE;AAEpE,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,MAAM,aAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,MACjD,WAAW,aAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,MACpD,cAAc,aACX,QAAQ,EACR,SAAS,EACT,SAAS,+BAA+B;AAAA,MAC3C,OAAO,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,MAChE,kBAAkB,aACf,MAAM,aAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,4BAA4B;AAAA,MACxC,gBAAgB,aACb,MAAM,aAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,uBAAuB;AAAA,MACnC,KAAK,aAAE,OAAO,aAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,MACrE,mBAAmB,aAChB,OAAO,EACP,SAAS,EACT,SAAS,2BAA2B;AAAA,MACvC,YAAY,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC9D,iBAAiB,aACd,OAAO,EACP,SAAS,EACT,SAAS,0BAA0B;AAAA,MACtC,QAAQ,aACL,OAAO,EACP,SAAS,EACT,SAAS,mCAAmC;AAAA,IACjD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM,cAAc,cAAc,QAAQ,MAAM;AAE/D,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,YAAY,aAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,MAC9D,MAAM,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAChE,WAAW,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,MAC5D,OAAO,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,MACpE,KAAK,aACF,OAAO,aAAE,OAAO,CAAC,EACjB,SAAS,EACT,SAAS,2BAA2B;AAAA,MACvC,QAAQ,aACL,OAAO,EACP,SAAS,EACT,SAAS,uCAAuC;AAAA,IACrD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,EAAE,YAAY,GAAG,aAAa,IAAI;AACxC,YAAM,SAAS,MAAM;AAAA,QACnB,cAAc,UAAU;AAAA,QACxB;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,YAAY,aAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,IAChE;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB,cAAc,OAAO,UAAU;AAAA,QAC/B;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,EAAAA,QAAO,KAAK,wBAAwB,CAAC,GAAG,YAAY;AAClD,UAAM,SAAS,MAAM,cAAc,iBAAiB;AAEpD,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,iBAAiB,aACd,OAAO,EACP,SAAS,sCAAsC;AAAA,IACpD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB,mBAAmB,OAAO,eAAe;AAAA,MAC3C;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,MAAM,aAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,MACvD,MAAM,aAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,MAC/C,cAAc,aAAE,OAAO,EAAE,SAAS,gBAAgB;AAAA,IACpD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM,cAAc,mBAAmB,QAAQ,MAAM;AAEpE,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,iBAAiB,aACd,OAAO,EACP,SAAS,oCAAoC;AAAA,MAChD,MAAM,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iCAAiC;AAAA,MACtE,MAAM,aACH,OAAO,EACP,SAAS,EACT,SAAS,8CAA8C;AAAA,IAC5D;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,EAAE,iBAAiB,GAAG,aAAa,IAAI;AAC7C,YAAM,SAAS,MAAM;AAAA,QACnB,mBAAmB,eAAe;AAAA,QAClC;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,iBAAiB,aACd,OAAO,EACP,SAAS,oCAAoC;AAAA,IAClD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB,mBAAmB,OAAO,eAAe;AAAA,QACzC;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,EAAAA,QAAO,KAAK,iCAAiC,CAAC,GAAG,YAAY;AAC3D,UAAM,SAAS,MAAM,cAAc,wBAAwB;AAE3D,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,yBAAyB,aACtB,OAAO,EACP,SAAS,+CAA+C;AAAA,IAC7D;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB,0BAA0B,OAAO,uBAAuB;AAAA,MAC1D;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,MAAM,aAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,MAChE,UAAU,aAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,MACjD,UAAU,aAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,IACnD;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,yBAAyB,aACtB,OAAO,EACP,SAAS,6CAA6C;AAAA,IAC3D;AAAA,IACA,OAAO,WAAW;AAChB,YAAM,SAAS,MAAM;AAAA,QACnB,0BAA0B,OAAO,uBAAuB;AAAA,QACxD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AFniDA,IAAM,UAAU,QAAQ,IAAI;AAC5B,IAAI,CAAC,SAAS;AACZ,UAAQ,MAAM,iDAAiD;AAC/D,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,SAAS,aAAa;AAG5B,cAAc,QAAQ,EAAE,QAAQ,SAAS,WAAW,QAAQ,CAAC;AAG7D,IAAM,YAAY,IAAI,kCAAqB;AAC3C,OAAO,QAAQ,SAAS;","names":["server","fetch"]}
|
|
1
|
+
{"version":3,"sources":["../src/install/clients.ts","../src/install/wizard.ts","../src/stdio.ts","../src/server.ts","../src/tools.ts","../src/pagination.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { execSync, execFileSync } from 'child_process';\nimport * as jsonc from 'jsonc-parser';\n\n// The npm package and the name the server is registered under in client config.\nexport const SERVER_NAME = 'runpod';\nexport const NPM_PACKAGE = '@runpod/mcp-server@latest';\n\n// The hosted Streamable HTTP endpoint. Clients point here and authenticate with\n// the OAuth \"Sign in with Runpod\" flow — no API key is stored in their config.\n// Overridable so a non-production deployment can be targeted during testing.\nexport const HOSTED_URL =\n process.env.RUNPOD_MCP_URL ?? 'https://mcp.getrunpod.io/';\n\n// How the user wants the server wired up:\n// - local: run via npx on this machine, authenticated by an API key in the env.\n// - hosted: connect to the hosted HTTP server and sign in with Runpod (OAuth).\nexport type AddMode =\n | { kind: 'local'; apiKey: string }\n | { kind: 'hosted'; url: string };\n\nexport interface AddResult {\n success: boolean;\n message?: string;\n}\n\nexport interface McpClient {\n // Stable id used as the multiselect value.\n id: string;\n // Human-readable label shown in the picker.\n name: string;\n // True when the client appears to be installed on this machine.\n detect(): Promise<boolean>;\n // Write (or update) the Runpod server entry in the client's config.\n add(mode: AddMode): Promise<AddResult>;\n // Remove the Runpod server entry from the client's config.\n remove(): Promise<AddResult>;\n // Where the config lives, for display and manual fallback.\n describeTarget(): string;\n}\n\n// The local stdio config: Runpod's MCP server runs via npx and reads the API\n// key from the environment. VS Code's `servers` map requires an explicit\n// transport type for stdio servers (mcpServers-style clients infer it).\nfunction localServerConfig(apiKey: string, serverProperty: string) {\n const config = {\n command: 'npx',\n args: ['-y', NPM_PACKAGE],\n env: { RUNPOD_API_KEY: apiKey },\n };\n return serverProperty === 'servers' ? { type: 'stdio', ...config } : config;\n}\n\n// The hosted config. Clients with native remote-MCP support take the URL\n// directly (VS Code additionally needs `type: 'http'`); the rest reach the\n// hosted server through the `mcp-remote` stdio bridge, which also drives OAuth.\nfunction hostedServerConfig(\n strategy: 'http' | 'mcp-remote',\n serverProperty: string,\n url: string\n) {\n if (strategy === 'mcp-remote') {\n return { command: 'npx', args: ['-y', 'mcp-remote', url] };\n }\n return serverProperty === 'servers' ? { type: 'http', url } : { url };\n}\n\n// Read, edit, and write a JSON config while preserving the user's existing\n// formatting and comments (jsonc). Creates the file and parent dirs if missing.\nfunction upsertJsonServer(\n configPath: string,\n serverProperty: string,\n value: unknown\n): AddResult {\n try {\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n const content = fs.existsSync(configPath)\n ? fs.readFileSync(configPath, 'utf8')\n : '';\n const edits = jsonc.modify(content, [serverProperty, SERVER_NAME], value, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n });\n fs.writeFileSync(configPath, jsonc.applyEdits(content, edits), 'utf8');\n return { success: true };\n } catch (error) {\n return { success: false, message: errMessage(error) };\n }\n}\n\nfunction removeJsonServer(\n configPath: string,\n serverProperty: string\n): AddResult {\n try {\n if (!fs.existsSync(configPath)) {\n return { success: true, message: 'nothing to remove' };\n }\n const content = fs.readFileSync(configPath, 'utf8');\n const edits = jsonc.modify(\n content,\n [serverProperty, SERVER_NAME],\n undefined,\n { formattingOptions: { tabSize: 2, insertSpaces: true } }\n );\n fs.writeFileSync(configPath, jsonc.applyEdits(content, edits), 'utf8');\n return { success: true };\n } catch (error) {\n return { success: false, message: errMessage(error) };\n }\n}\n\nfunction errMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction exists(p: string): boolean {\n try {\n return fs.existsSync(p);\n } catch {\n return false;\n }\n}\n\n// A JSON-config client that differs only in config path, server property, and\n// how it reaches the hosted server.\nfunction jsonClient(opts: {\n id: string;\n name: string;\n serverProperty?: string;\n // Native HTTP support, or the `mcp-remote` bridge for stdio-only clients.\n hostedStrategy?: 'http' | 'mcp-remote';\n configPath: () => string;\n detectPaths?: () => string[];\n}): McpClient {\n const serverProperty = opts.serverProperty ?? 'mcpServers';\n const hostedStrategy = opts.hostedStrategy ?? 'http';\n return {\n id: opts.id,\n name: opts.name,\n detect: () =>\n Promise.resolve(\n (opts.detectPaths?.() ?? [path.dirname(opts.configPath())]).some(exists)\n ),\n add: (mode) => {\n const value =\n mode.kind === 'local'\n ? localServerConfig(mode.apiKey, serverProperty)\n : hostedServerConfig(hostedStrategy, serverProperty, mode.url);\n return Promise.resolve(\n upsertJsonServer(opts.configPath(), serverProperty, value)\n );\n },\n remove: () =>\n Promise.resolve(removeJsonServer(opts.configPath(), serverProperty)),\n describeTarget: () => opts.configPath(),\n };\n}\n\n// Locate the Claude Code CLI binary across common install locations and PATH.\nfunction findClaudeBinary(): string | null {\n const candidates = [\n path.join(os.homedir(), '.claude', 'local', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ];\n for (const candidate of candidates) {\n if (exists(candidate)) return candidate;\n }\n try {\n execSync('command -v claude', { stdio: 'pipe' });\n return 'claude';\n } catch {\n return null;\n }\n}\n\nfunction runClaude(binary: string, args: string[]): AddResult {\n try {\n // execFileSync (no shell) — args pass directly, so an API key with shell\n // metacharacters can't be interpreted by a shell.\n execFileSync(binary, args, { stdio: 'pipe' });\n return { success: true };\n } catch (error) {\n const message = errMessage(error);\n // Re-running the wizard should be idempotent, not an error.\n if (message.includes('already exists')) {\n return { success: true, message: 'already configured' };\n }\n return { success: false, message };\n }\n}\n\n// Claude Code manages its own config, so we drive its CLI rather than writing\n// files directly. This mirrors the documented `claude mcp add` command.\nconst claudeCodeClient: McpClient = {\n id: 'claude-code',\n name: 'Claude Code',\n detect: () => Promise.resolve(findClaudeBinary() !== null),\n add: (mode) => {\n const binary = findClaudeBinary();\n if (!binary) {\n return Promise.resolve({\n success: false,\n message: 'claude CLI not found',\n });\n }\n const args =\n mode.kind === 'local'\n ? [\n 'mcp',\n 'add',\n SERVER_NAME,\n '--scope',\n 'user',\n '-e',\n `RUNPOD_API_KEY=${mode.apiKey}`,\n '--',\n 'npx',\n '-y',\n NPM_PACKAGE,\n ]\n : [\n 'mcp',\n 'add',\n '--transport',\n 'http',\n '--scope',\n 'user',\n SERVER_NAME,\n mode.url,\n ];\n return Promise.resolve(runClaude(binary, args));\n },\n remove: () => {\n const binary = findClaudeBinary();\n if (!binary) {\n return Promise.resolve({\n success: false,\n message: 'claude CLI not found',\n });\n }\n try {\n execFileSync(binary, ['mcp', 'remove', '--scope', 'user', SERVER_NAME], {\n stdio: 'pipe',\n });\n return Promise.resolve({ success: true });\n } catch (error) {\n return Promise.resolve({ success: true, message: errMessage(error) });\n }\n },\n describeTarget: () => 'Claude Code user config (via `claude mcp` CLI)',\n};\n\nconst home = os.homedir();\nconst appData = process.env.APPDATA ?? path.join(home, 'AppData', 'Roaming');\n\n// Claude Desktop stores its config in an OS-specific location.\nfunction claudeDesktopConfigPath(): string {\n if (process.platform === 'win32') {\n return path.join(appData, 'Claude', 'claude_desktop_config.json');\n }\n return path.join(\n home,\n 'Library',\n 'Application Support',\n 'Claude',\n 'claude_desktop_config.json'\n );\n}\n\n// VS Code uses a `servers` property (not `mcpServers`) in a per-user mcp.json.\nfunction vsCodeConfigPath(): string {\n if (process.platform === 'win32') {\n return path.join(appData, 'Code', 'User', 'mcp.json');\n }\n if (process.platform === 'darwin') {\n return path.join(\n home,\n 'Library',\n 'Application Support',\n 'Code',\n 'User',\n 'mcp.json'\n );\n }\n return path.join(home, '.config', 'Code', 'User', 'mcp.json');\n}\n\nexport const CLIENTS: McpClient[] = [\n claudeCodeClient,\n jsonClient({\n id: 'cursor',\n name: 'Cursor',\n configPath: () => path.join(home, '.cursor', 'mcp.json'),\n }),\n jsonClient({\n id: 'windsurf',\n name: 'Windsurf',\n // Windsurf is stdio-only, so it reaches the hosted server via mcp-remote.\n hostedStrategy: 'mcp-remote',\n configPath: () =>\n path.join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n }),\n jsonClient({\n id: 'claude-desktop',\n name: 'Claude Desktop',\n // Claude Desktop config files are stdio-only; use the mcp-remote bridge.\n hostedStrategy: 'mcp-remote',\n configPath: claudeDesktopConfigPath,\n // Detect by the application/support directory, which exists once the app runs.\n detectPaths: () => [path.dirname(claudeDesktopConfigPath())],\n }),\n jsonClient({\n id: 'vscode',\n name: 'Visual Studio Code',\n serverProperty: 'servers',\n configPath: vsCodeConfigPath,\n detectPaths: () => [path.dirname(vsCodeConfigPath())],\n }),\n];\n","import { execFileSync } from 'child_process';\nimport * as p from '@clack/prompts';\nimport {\n CLIENTS,\n HOSTED_URL,\n type AddMode,\n type McpClient,\n} from './clients.js';\n\nconst API_KEYS_URL = 'https://www.runpod.io/console/user/settings';\n\n// Open a URL in the user's default browser. Best-effort and non-fatal.\nfunction openBrowser(url: string): void {\n try {\n // No shell: pass the URL as a literal arg. On Windows the opener is the cmd\n // built-in `start` (first quoted arg is the window title, hence the empty '').\n if (process.platform === 'darwin') {\n execFileSync('open', [url], { stdio: 'ignore' });\n } else if (process.platform === 'win32') {\n execFileSync('cmd', ['/c', 'start', '', url], { stdio: 'ignore' });\n } else {\n execFileSync('xdg-open', [url], { stdio: 'ignore' });\n }\n } catch {\n // Ignore — the user can open the URL manually.\n }\n}\n\n// Verify the API key works by calling a read-only REST endpoint. Returns true\n// on success, false on auth failure, and null when the check itself failed\n// (offline, etc.) so we can warn without blocking.\nasync function verifyApiKey(apiKey: string): Promise<boolean | null> {\n try {\n const base = process.env.RUNPOD_REST_API_URL ?? 'https://rest.runpod.io/v1';\n const response = await fetch(`${base}/pods`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (response.ok) return true;\n if (response.status === 401 || response.status === 403) return false;\n return null;\n } catch {\n return null;\n }\n}\n\nfunction bail(message = 'Cancelled.'): never {\n p.cancel(message);\n process.exit(0);\n}\n\nasync function promptForApiKey(): Promise<string> {\n const fromEnv = process.env.RUNPOD_API_KEY;\n if (fromEnv) {\n const useEnv = await p.confirm({\n message: 'Use the RUNPOD_API_KEY from your environment?',\n });\n if (p.isCancel(useEnv)) bail();\n if (useEnv) return fromEnv;\n }\n\n const create = await p.confirm({\n message: 'Open the Runpod console to create or copy an API key?',\n });\n if (p.isCancel(create)) bail();\n if (create) {\n openBrowser(API_KEYS_URL);\n p.log.info(`Opening ${API_KEYS_URL}`);\n }\n\n const apiKey = await p.password({\n message: 'Paste your Runpod API key',\n validate: (value) =>\n !value || value.trim().length === 0\n ? 'API key cannot be empty'\n : undefined,\n });\n if (p.isCancel(apiKey)) bail();\n return apiKey.trim();\n}\n\nasync function selectClients(\n detected: Map<string, boolean>,\n verb: string\n): Promise<McpClient[]> {\n const options = CLIENTS.map((client) => ({\n value: client.id,\n label: client.name,\n hint: detected.get(client.id) ? 'detected' : undefined,\n }));\n\n const selected = await p.multiselect<string>({\n message: `Which agents should we ${verb}?`,\n options,\n // Pre-select detected clients so the common case is a single Enter press.\n initialValues: CLIENTS.filter((c) => detected.get(c.id)).map((c) => c.id),\n required: true,\n });\n if (p.isCancel(selected)) bail();\n\n return CLIENTS.filter((c) => selected.includes(c.id));\n}\n\nasync function detectAll(): Promise<Map<string, boolean>> {\n const entries = await Promise.all(\n CLIENTS.map(async (c) => [c.id, await c.detect()] as const)\n );\n return new Map(entries);\n}\n\n// Ask how the server should be wired up, then collect what that mode needs.\n// Hosted is the default: the client signs in with Runpod over OAuth and no key\n// is ever written to disk. Local runs the server via npx with an API key.\nasync function selectMode(): Promise<AddMode> {\n const kind = await p.select({\n message: 'How do you want to connect to Runpod?',\n options: [\n {\n value: 'hosted',\n label: 'Sign in with Runpod (recommended)',\n hint: 'hosted, OAuth, no API key stored',\n },\n {\n value: 'local',\n label: 'Run locally with an API key',\n hint: 'runs on this machine via npx',\n },\n ],\n initialValue: 'hosted',\n });\n if (p.isCancel(kind)) bail();\n\n if (kind === 'hosted') {\n return { kind: 'hosted', url: HOSTED_URL };\n }\n\n const apiKey = await promptForApiKey();\n\n const verifySpinner = p.spinner();\n verifySpinner.start('Verifying API key');\n const valid = await verifyApiKey(apiKey);\n if (valid === true) {\n verifySpinner.stop('API key verified.');\n } else if (valid === false) {\n verifySpinner.stop('API key rejected by Runpod.');\n const proceed = await p.confirm({\n message: 'The key did not authenticate. Continue anyway?',\n initialValue: false,\n });\n if (p.isCancel(proceed) || !proceed) bail();\n } else {\n verifySpinner.stop('Could not verify the key (offline?). Continuing.');\n }\n\n return { kind: 'local', apiKey };\n}\n\nasync function runAdd(): Promise<void> {\n const detected = await detectAll();\n const clients = await selectClients(detected, 'set up');\n const mode = await selectMode();\n\n const results: string[] = [];\n for (const client of clients) {\n const spinner = p.spinner();\n spinner.start(`Configuring ${client.name}`);\n const result = await client.add(mode);\n if (result.success) {\n spinner.stop(`${client.name} configured.`);\n results.push(`✓ ${client.name} — ${client.describeTarget()}`);\n } else {\n spinner.stop(`${client.name} failed.`);\n results.push(`✗ ${client.name} — ${result.message ?? 'unknown error'}`);\n }\n }\n\n p.note(results.join('\\n'), 'Results');\n p.outro(\n mode.kind === 'hosted'\n ? 'Restart your agent, then complete \"Sign in with Runpod\" when it connects.'\n : 'Restart your agent (or reconnect MCP) to load the Runpod tools.'\n );\n}\n\nasync function runRemove(): Promise<void> {\n const detected = await detectAll();\n const clients = await selectClients(detected, 'remove Runpod from');\n\n const results: string[] = [];\n for (const client of clients) {\n const spinner = p.spinner();\n spinner.start(`Removing from ${client.name}`);\n const result = await client.remove();\n spinner.stop(\n result.success ? `${client.name} cleaned up.` : `${client.name} failed.`\n );\n results.push(\n `${result.success ? '✓' : '✗'} ${client.name}${\n result.message ? ` — ${result.message}` : ''\n }`\n );\n }\n\n p.note(results.join('\\n'), 'Results');\n p.outro('Done.');\n}\n\n// Entry point for `npx @runpod/mcp-server <add|remove>`.\nexport async function runWizard(subcommand: string): Promise<void> {\n p.intro('Runpod MCP server installer');\n\n if (subcommand === 'remove') {\n await runRemove();\n } else {\n await runAdd();\n }\n}\n","import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createServer } from './server.js';\nimport { registerTools } from './tools.js';\n\n// Detect the install wizard subcommand (`add` / `remove`). In this mode we run\n// the interactive installer instead of starting the stdio server, and the API\n// key is collected by the wizard rather than required up front.\nconst WIZARD_SUBCOMMANDS = ['add', 'remove'];\nconst subcommand = process.argv[2];\nconst isWizardMode = WIZARD_SUBCOMMANDS.includes(subcommand);\n\nif (isWizardMode) {\n import('./install/wizard.js')\n .then(({ runWizard }) => runWizard(subcommand))\n .catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n });\n} else {\n // Get API key from environment variable\n const API_KEY = process.env.RUNPOD_API_KEY;\n if (!API_KEY) {\n console.error('RUNPOD_API_KEY environment variable is required');\n process.exit(1);\n }\n\n const server = createServer();\n\n // Register all tools with the API key from the environment\n registerTools(server, { apiKey: API_KEY, transport: 'stdio' });\n\n // Start receiving messages on stdin and sending messages on stdout\n const transport = new StdioServerTransport();\n server.connect(transport);\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\n// `__PACKAGE_VERSION__` is replaced at build time by tsup's `define` with the\n// current `version` from package.json. Falls back to `'dev'` when the\n// substitution doesn't happen (e.g. running via tsx).\ndeclare const __PACKAGE_VERSION__: string;\n\nexport const SERVER_NAME = 'Runpod API Server';\nexport const SERVER_VERSION =\n typeof __PACKAGE_VERSION__ !== 'undefined' ? __PACKAGE_VERSION__ : 'dev';\n\n// `version` defaults to the build-time value (correct for the npm/stdio build).\n// The hosted entrypoint passes a runtime value read from package.json, since\n// tsup's define doesn't run when Vercel compiles api/index.ts.\nexport function createServer(version: string = SERVER_VERSION): McpServer {\n return new McpServer({\n name: SERVER_NAME,\n version,\n capabilities: {\n resources: {},\n tools: {},\n },\n });\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport fetch, { type RequestInit as NodeFetchRequestInit } from 'node-fetch';\nimport { randomUUID } from 'node:crypto';\nimport { capListResult, listPaginationParams } from './pagination.js';\n\n// Base URL for Runpod REST API. Override via RUNPOD_REST_API_URL to point at a\n// non-production environment (e.g. when authenticating with a dev API key).\nconst API_BASE_URL =\n process.env.RUNPOD_REST_API_URL ?? 'https://rest.runpod.io/v1';\n\n// Serverless API base URL for endpoint runtime operations (run, status, cancel, etc.).\n// Override via RUNPOD_SERVERLESS_API_URL for non-production environments.\nconst SERVERLESS_API_BASE_URL =\n process.env.RUNPOD_SERVERLESS_API_URL ?? 'https://api.runpod.ai/v2';\n\n// GraphQL endpoint for public queries (GPU types, data centers). Override via\n// RUNPOD_PUBLIC_GRAPHQL_URL for non-production environments. This is distinct\n// from the flash auth backend (RUNPOD_GRAPHQL_URL, used only by the OAuth flow\n// in api/index.ts).\nconst GRAPHQL_URL =\n process.env.RUNPOD_PUBLIC_GRAPHQL_URL ?? 'https://api.runpod.io/graphql';\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 Code,\n// Cursor, Codex, Gemini CLI, etc.) and count distinct agent sessions. Pure\n// observability — no tool behavior changes.\n//\n// `__PACKAGE_VERSION__` is replaced at build time by tsup's `define` with the\n// current `version` from package.json. Falls back to `'dev'` when the\n// 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// 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 * Sanitizes a value for inclusion in a User-Agent token. RFC 7230 reserves\n * parens and a few other chars; strip them so the structured UA stays\n * parseable, and bound the length so a hostile client can't blow up a header.\n */\nfunction sanitizeUaToken(value: string): string {\n return value.replace(/[()<>@,;:\\\\\"/[\\]?={}\\s]/g, '_').slice(0, 64);\n}\n\n/**\n * Builds the headers that identify the calling MCP client and session on every\n * outbound HTTP call. Client identity comes from the `initialize` handshake's\n * `clientInfo` (exposed by the SDK via `server.server.getClientVersion()`),\n * which works for the long-lived stdio server. In stateless HTTP that handshake\n * is on a different request, so we fall back to the inbound HTTP User-Agent.\n */\nfunction trackingHeaders(\n server: McpServer,\n ctx: ToolContext\n): Record<string, string> {\n const info = server.server.getClientVersion();\n const fallbackName = ctx.clientUserAgent || 'unknown';\n const name = sanitizeUaToken(info?.name || fallbackName);\n const version = sanitizeUaToken(info?.version || 'unknown');\n // Prefer a server version supplied by the caller (the hosted entrypoint reads\n // it from package.json at runtime, since tsup's build-time define does not\n // run when Vercel compiles api/index.ts). Fall back to the build-time value.\n const serverVersion = ctx.serverVersion || MCP_SERVER_VERSION;\n const userAgent = `runpod-mcp-server/${serverVersion} (caller=mcp; client=${name}; client_version=${version}; transport=${ctx.transport})`;\n return {\n 'User-Agent': userAgent,\n 'X-Runpod-Session-Id': SESSION_ID,\n };\n}\n\n/**\n * Context passed to every tool handler. Contains the API key used to\n * authenticate against the Runpod REST and Serverless APIs, the transport the\n * server is running under, and (for stateless HTTP) the inbound client\n * User-Agent — all used for outbound caller-tracking headers.\n */\nexport interface ToolContext {\n apiKey: string;\n transport: 'stdio' | 'http';\n clientUserAgent?: string;\n serverVersion?: string;\n}\n\n// Helper function to make GraphQL requests to Runpod (public, no auth required)\nasync function graphqlRequest<T>(\n query: string,\n tracking: () => Record<string, string>\n): Promise<T> {\n const response = await fetch(GRAPHQL_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...tracking(),\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 REST API\nfunction createRunpodRequest(\n apiKey: string,\n tracking: () => Record<string, string>\n) {\n return async 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 ${apiKey}`,\n 'Content-Type': 'application/json',\n ...tracking(),\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\n// Helper function to make authenticated requests to the Serverless runtime API\nfunction createServerlessRequest(\n apiKey: string,\n tracking: () => Record<string, string>\n) {\n return async 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 ${apiKey}`,\n 'Content-Type': 'application/json',\n ...tracking(),\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\n/**\n * Register all Runpod tools on the given MCP server instance. The provided\n * context supplies the API key that authenticated request helpers will use.\n */\nexport function registerTools(server: McpServer, ctx: ToolContext): void {\n const tracking = () => trackingHeaders(server, ctx);\n const runpodRequest = createRunpodRequest(ctx.apiKey, tracking);\n const serverlessRequest = createServerlessRequest(ctx.apiKey, tracking);\n\n // ============== INFRASTRUCTURE TOOLS ==============\n\n // List GPU Types\n server.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 `\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 tracking\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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // List Data Centers\n server.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 `\n query {\n dataCenters {\n id\n name\n location\n }\n }\n `,\n tracking\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' as const,\n text: JSON.stringify(dataCenters, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== POD MANAGEMENT TOOLS ==============\n\n // List Pods\n server.tool(\n 'list-pods',\n {\n ...listPaginationParams,\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 const queryParams = new URLSearchParams();\n\n if (params.computeType)\n queryParams.append('computeType', params.computeType);\n if (params.gpuTypeId)\n params.gpuTypeId.forEach((type) =>\n queryParams.append('gpuTypeId', type)\n );\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 capListResult(result, {\n limit: params.limit,\n cursor: params.cursor,\n });\n }\n );\n\n // Get Pod Details\n server.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 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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Create Pod\n server.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\n .string()\n .optional()\n .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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Update Pod\n server.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\n .record(z.string())\n .optional()\n .describe('New environment variables'),\n },\n async (params) => {\n const { podId, ...updateParams } = params;\n const result = await runpodRequest(\n `/pods/${podId}`,\n 'PATCH',\n updateParams\n );\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Start Pod\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Stop Pod\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Delete Pod\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== ENDPOINT MANAGEMENT TOOLS ==============\n\n // List Endpoints\n server.tool(\n 'list-endpoints',\n {\n ...listPaginationParams,\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 const queryParams = new URLSearchParams();\n\n if (params.includeTemplate)\n queryParams.append(\n 'includeTemplate',\n params.includeTemplate.toString()\n );\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 capListResult(result, {\n limit: params.limit,\n cursor: params.cursor,\n });\n }\n );\n\n // Get Endpoint Details\n server.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 const queryParams = new URLSearchParams();\n\n if (params.includeTemplate)\n queryParams.append(\n 'includeTemplate',\n params.includeTemplate.toString()\n );\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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Create Endpoint\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Update Endpoint\n server.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\n .number()\n .optional()\n .describe('New minimum number of workers'),\n workersMax: z\n .number()\n .optional()\n .describe('New maximum number of workers'),\n idleTimeout: z\n .number()\n .optional()\n .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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Delete Endpoint\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== SERVERLESS RUNTIME TOOLS ==============\n\n // Shared schemas for serverless tools\n const endpointIdSchema = z\n .string()\n .regex(/^[a-zA-Z0-9_-]+$/, 'Invalid endpoint ID format');\n\n const jobIdSchema = z\n .string()\n .regex(/^[a-zA-Z0-9_-]+$/, 'Invalid job ID format');\n\n const 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\n const webhookSchema = z\n .string()\n .url()\n .optional()\n .describe(\n 'Webhook URL to receive job completion notifications instead of polling'\n );\n\n const 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\n const 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)\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Run Endpoint Sync\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Get Job Status\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Stream Job Results\n server.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 let lastError: string | undefined;\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 lastError = error instanceof Error ? error.message : String(error);\n if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {\n finalResult.error = `Polling aborted after ${MAX_CONSECUTIVE_ERRORS} consecutive errors: ${lastError}`;\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 // Surface the most recent error (if any) instead of discarding it —\n // the last poll may have been failing (e.g. job expired) even though\n // earlier polls succeeded.\n if (lastError) finalResult.lastError = lastError;\n break;\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(\n { ...finalResult, stream: allChunks },\n null,\n 2\n ),\n },\n ],\n };\n }\n );\n\n // Cancel Job\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Retry Job\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Endpoint Health\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Purge Endpoint Queue\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== TEMPLATE MANAGEMENT TOOLS ==============\n\n // List Templates\n server.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 ...listPaginationParams,\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(\n `/templates${query ? `?${query}` : ''}`\n );\n\n return capListResult(result, {\n limit: params.limit,\n cursor: params.cursor,\n });\n }\n );\n\n // Get Template Details\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Create Template\n server.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\n .string()\n .optional()\n .describe('Path to mount the volume'),\n readme: z\n .string()\n .optional()\n .describe('README content in markdown format'),\n containerRegistryAuthId: z\n .string()\n .optional()\n .describe(\n 'ID of a container registry credential (from create-container-registry-auth / list-container-registry-auths) used to pull a private image. Required when imageName points at a private registry; without it serverless workers fail the image pull.'\n ),\n },\n async (params) => {\n const result = await runpodRequest('/templates', 'POST', params);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Update Template\n server.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\n .record(z.string())\n .optional()\n .describe('New environment variables'),\n readme: z\n .string()\n .optional()\n .describe('New README content in markdown format'),\n containerRegistryAuthId: z\n .string()\n .optional()\n .describe(\n 'ID of a container registry credential (from create-container-registry-auth / list-container-registry-auths) used to pull a private image. Set this to attach a credential to a template referencing a private registry.'\n ),\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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Delete Template\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== NETWORK VOLUME MANAGEMENT TOOLS ==============\n\n // List Network Volumes\n server.tool('list-network-volumes', listPaginationParams, async (params) => {\n const result = await runpodRequest('/networkvolumes');\n\n return capListResult(result, {\n limit: params.limit,\n cursor: params.cursor,\n });\n });\n\n // Get Network Volume Details\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Create Network Volume\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Update Network Volume\n server.tool(\n 'update-network-volume',\n {\n networkVolumeId: z\n .string()\n .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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Delete Network Volume\n server.tool(\n 'delete-network-volume',\n {\n networkVolumeId: z\n .string()\n .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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // ============== CONTAINER REGISTRY AUTH TOOLS ==============\n\n // List Container Registry Auths\n server.tool(\n 'list-container-registry-auths',\n listPaginationParams,\n async (params) => {\n const result = await runpodRequest('/containerregistryauth');\n\n return capListResult(result, {\n limit: params.limit,\n cursor: params.cursor,\n });\n }\n );\n\n // Get Container Registry Auth Details\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Create Container Registry Auth\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Delete Container Registry Auth\n server.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' as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n}\n","// ============== LIST RESULT PAGINATION / TOKEN CAPS ==============\n// The REST list endpoints do not yet support server-side pagination, so a\n// large account can return a payload many times the size of an LLM's context\n// window (e.g. list-templates has been observed at ~15x Claude Code's window),\n// which ends the agent session. Until the REST API ships cursor pagination,\n// the MCP caps list responses client-side: it returns at most `limit` items\n// and reports how many were omitted so the agent knows to narrow its query.\n//\n// The `limit` and `cursor` parameters are shaped to match the cursor-based\n// pagination the REST API will add, so the tool signatures do not change when\n// server-side pagination lands; the MCP will simply forward them and surface a\n// real `nextCursor` instead of the client-side offset used here.\n\nimport { z } from 'zod';\n\n// Default and maximum number of items returned by a list tool in a single\n// call. The cap is what protects the agent's context; `limit` lets a caller\n// ask for fewer (or more, up to the ceiling) when they know what they want.\nexport const DEFAULT_LIST_LIMIT = 20;\nexport const MAX_LIST_LIMIT = 100;\n\n// Shared Zod parameters added to every list-* tool. Optional so existing\n// callers that pass nothing keep working (they get the default page).\nexport const listPaginationParams = {\n limit: z\n .number()\n .int()\n .positive()\n .max(MAX_LIST_LIMIT)\n .optional()\n .describe(\n `Maximum number of items to return (default ${DEFAULT_LIST_LIMIT}, max ${MAX_LIST_LIMIT}). Use the returned nextCursor to fetch the next page.`\n ),\n cursor: z\n .string()\n .optional()\n .describe(\n 'Opaque pagination cursor from a previous response (nextCursor). Omit to start from the beginning.'\n ),\n};\n\n// Decodes the opaque cursor into a numeric offset. The cursor is currently a\n// base64-encoded offset; when the REST API ships real cursors this becomes a\n// passthrough. Invalid cursors are treated as the start so a bad value never\n// throws in an agent's face.\nexport function decodeCursorOffset(cursor: string | undefined): number {\n if (!cursor) return 0;\n try {\n const decoded = Buffer.from(cursor, 'base64').toString('utf8');\n const offset = Number.parseInt(decoded, 10);\n return Number.isFinite(offset) && offset >= 0 ? offset : 0;\n } catch {\n return 0;\n }\n}\n\nexport function encodeCursorOffset(offset: number): string {\n return Buffer.from(String(offset), 'utf8').toString('base64');\n}\n\n// Caps a list response to `limit` items starting at `cursor`, returning an\n// envelope that tells the agent how much it is seeing and how to get the rest.\n// Only arrays are paginated; any other shape is passed through untouched.\nexport function capListResult(\n result: unknown,\n options: { limit?: number; cursor?: string }\n): { content: Array<{ type: 'text'; text: string }> } {\n const limit = Math.min(options.limit ?? DEFAULT_LIST_LIMIT, MAX_LIST_LIMIT);\n const offset = decodeCursorOffset(options.cursor);\n\n if (!Array.isArray(result)) {\n return {\n content: [\n { type: 'text' as const, text: JSON.stringify(result, null, 2) },\n ],\n };\n }\n\n const total = result.length;\n const page = result.slice(offset, offset + limit);\n const nextOffset = offset + page.length;\n const hasMore = nextOffset < total;\n\n const envelope = {\n items: page,\n pagination: {\n total,\n returned: page.length,\n offset,\n truncated: hasMore,\n nextCursor: hasMore ? encodeCursorOffset(nextOffset) : null,\n note: hasMore\n ? `Showing ${page.length} of ${total}. Pass cursor=nextCursor to fetch more, or narrow the query with filters.`\n : undefined,\n },\n };\n\n return {\n content: [\n { type: 'text' as const, text: JSON.stringify(envelope, null, 2) },\n ],\n };\n}\n"],"mappings":"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","names":["SERVER_NAME","p","spinner","subcommand","import_child_process","import_zod","fetch","path","runWizard"]}
|