@runpod/mcp-server 4.5.0 → 4.7.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 CHANGED
@@ -1,5 +1,52 @@
1
1
  # @runpod/mcp-server
2
2
 
3
+ ## 4.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 506e813: Resync the vendored v2 OpenAPI spec with production as of 2026-10-26 and add
8
+ `list-audit-logs` for reading the account audit trail with filters and pagination.
9
+ `list-pods` no longer returns live utilization or the direct SSH mapping; use
10
+ `get-pod` to read those fields for an individual Pod.
11
+
12
+ Update run: https://github.com/runpod/runpod-mcp/actions/runs/40308747009
13
+
14
+ ### Patch Changes
15
+
16
+ - e669dca: Accept Cursor's OAuth callbacks on the hosted server (`cursor://anysphere.cursor-mcp/oauth/callback` and the `https://www.cursor.com/agents/...` and `/bot/...` web callbacks), so Cursor cloud agents and bot integrations can sign in with Runpod. `/register` now rejects a client up front (`invalid_redirect_uri`) when none of its callbacks can be used, and both errors explain how to connect with an API key instead. The install wizard and stdio `search-docs` now default to `https://mcp.runpod.io/` instead of the legacy `https://mcp.getrunpod.io/`.
17
+ - d527e91: Trim the `/directory` server instructions to one sentence listing what the tools cover, without naming secrets, SSH keys or registry credentials. OpenAI's plugin scan held the longer version for review.
18
+ - b7c0525: On `/directory`, stop showing credentials: schema examples that name or hold one (such as `{"JUPYTER_PASSWORD": "hunter2"}` on the `env` field) are dropped, and the secret and registry-credential tools (`list-secrets`, `get-secret`, `delete-secret`, `list-registries`, `get-registry`, `delete-registry`) are left out. OpenAI's plugin review rejected the submission for soliciting access credentials. The default surface is unchanged.
19
+ - 08ddd89: Point both MCP initialize profiles at the Runpod REST API v2 (the OpenAPI spec at
20
+ https://api.runpod.io/v2/openapi.json and the reference at
21
+ https://docs.runpod.io/api-reference-v2/overview) for operations outside their tool
22
+ lists. The default profile permits read-only GET calls when `RUNPOD_API_KEY` is
23
+ already in the environment and the response cannot expose secret environment
24
+ values, without accessing client credential stores or making writes outside the
25
+ MCP tool approval flow. The directory profile names
26
+ no credentials and presents the reference as informational.
27
+ - 4b8b68e: Address OpenAI plugin review findings. On `/directory`, `pod-action` is replaced by separate `start-pod`, `stop-pod` and `restart-pod` tools (terminate is `delete-pod`); the default surface keeps `pod-action`. `update-template` is now marked destructive, since it overwrites the image, env and registry and can make a template public.
28
+ - 0f519bf: Drop the non-portable `pattern` (a `\p{Z}` Unicode property escape) from the `name` argument of `create-global-volume` and `update-global-volume`. OpenAI's plugin tool scan rejected the schema; the API still enforces the rule and the field description states it.
29
+ - a274524: Generate the tools from the TypeScript SDK's patched copy of the v2 spec, now that the SDK lives in this repository. Argument examples use a placeholder AWS account ID and `changeme` instead of `hunter2` as the example Jupyter password, several argument descriptions drop internal or version-relative wording, and input schemas no longer carry the `x-enum-varnames` code-generation hint.
30
+
31
+ Resync the shared spec with production after rebasing, adding the audit logs operation to the SDK's generated types.
32
+
33
+ ## 4.6.0
34
+
35
+ ### Minor Changes
36
+
37
+ - 34bb467: Add a directory profile at `/directory` (hosted: `https://mcp.runpod.io/directory`) for app directories such as Anthropic's connector directory. It lists tool descriptions that only say what each tool does, full argument schemas, and a factual briefing, and leaves out the guide tools, `describe-tool`, the tools that take a secret or password as input (`create-secret`, `update-secret`, `create-registry`) and the S3 credentials argument of `run-endpoint` and `runsync-endpoint`, the agent-learning tools, the referral ask and the guide resources; its analytics record which tool ran but no argument values. A tool appears there only once it is classified in `DIRECTORY_TOOLS` per `specgen/DIRECTORY_POLICY.md`; tests fail on an unclassified tool or a directory tool that takes a credential. The default surface at `/` is unchanged. Separately, every profile now redacts secret-looking environment values (passwords, tokens, API keys) in tool results, keeping `{{ RUNPOD_SECRET_<name> }}` references.
38
+
39
+ ### Patch Changes
40
+
41
+ - 02a8f0c: Correct the MCP annotations on tools whose HTTP method understated what they do, so hosts gate them on a human. `update-endpoint`, `update-pod`, `update-secret`, `set-endpoint-gpus` and `retry-job` are now marked destructive: each can clear settings it was not sent, restart a container, overwrite a value that cannot be read back, or remove prior job output. `stream-job` is no longer marked read-only, because the stream hands out each chunk once. `create-secret` and the field-setting updates (`update-cluster`, `update-network-volume`, `update-global-volume`, `update-template`) are now marked idempotent.
42
+ - 8cfdf83: Accept ChatGPT's OAuth callbacks on the hosted server: the stable `https://chatgpt.com/connector_platform_oauth_redirect` and the per-connection `https://chatgpt.com/connector/oauth/{callback_id}`, so ChatGPT and Codex can sign in with Runpod.
43
+ - e39441f: Declare `type: object` on the `body` argument of the create and update tools whose request body is an `allOf` composition (`create-cluster`, `create-endpoint`, `create-pod`, `create-template`, `update-endpoint`, `update-pod`, `update-template`), so directory reviews that read top-level argument types see one on the full schema served at `/directory`.
44
+
45
+ On `/directory`, every tool that takes a request body (`body`) now ends its description with a link to the Runpod REST API v2 reference, which the Claude directory portal suggests for these tools.
46
+
47
+ - 31b1c7d: Every top-level tool argument now declares its `type` (arguments that referenced a shared definition, like `bucketSize`, `cloud` and several request bodies, carried only the reference), and each tool's title is also sent as `annotations.title`. Both were flagged by Anthropic's connector directory review.
48
+ - 77c2af7: Serve OpenAI's domain-verification token at `/.well-known/openai-apps-challenge` on the hosted server, so the OpenAI plugin portal can verify `mcp.runpod.io`.
49
+
3
50
  ## 4.5.0
4
51
 
5
52
  ### Minor Changes
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  The official Runpod Model Context Protocol (MCP) server. It lets MCP clients such as Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, opencode, and Pi manage your Runpod Pods, Serverless endpoints, templates, network volumes, and more.
4
4
 
5
- **We host it for you at [`https://mcp.getrunpod.io/`](https://mcp.getrunpod.io/)** — point your client at that URL and sign in with Runpod. Nothing to install, no API key on disk. Or run it locally from npm as [`@runpod/mcp-server`](https://www.npmjs.com/package/@runpod/mcp-server).
5
+ **We host it for you at [`https://mcp.runpod.io/`](https://mcp.runpod.io/)** — point your client at that URL and sign in with Runpod. Nothing to install, no API key on disk. Or run it locally from npm as [`@runpod/mcp-server`](https://www.npmjs.com/package/@runpod/mcp-server).
6
6
 
7
7
  ## Quick start
8
8
 
@@ -63,7 +63,7 @@ To configure a client by hand, point it at the hosted server over HTTP (no local
63
63
  **Claude Code:**
64
64
 
65
65
  ```bash
66
- claude mcp add --transport http runpod -s user https://mcp.getrunpod.io/
66
+ claude mcp add --transport http runpod -s user https://mcp.runpod.io/
67
67
  ```
68
68
 
69
69
  **Other clients** (Cursor, VS Code, Claude Desktop connectors, …) — use a URL-based MCP entry:
@@ -72,7 +72,7 @@ claude mcp add --transport http runpod -s user https://mcp.getrunpod.io/
72
72
  {
73
73
  "mcpServers": {
74
74
  "runpod": {
75
- "url": "https://mcp.getrunpod.io/"
75
+ "url": "https://mcp.runpod.io/"
76
76
  }
77
77
  }
78
78
  }
@@ -92,7 +92,7 @@ You can send your API key as a header instead of signing in with OAuth, as descr
92
92
 
93
93
  ```toml
94
94
  [mcp_servers.runpod]
95
- url = "https://mcp.getrunpod.io/"
95
+ url = "https://mcp.runpod.io/"
96
96
  bearer_token_env_var = "RUNPOD_API_KEY"
97
97
  ```
98
98
 
@@ -210,11 +210,13 @@ pnpm build
210
210
 
211
211
  Tools are generated from the vendored v2 OpenAPI spec rather than hand-written: see [specgen/DESIGN.md](specgen/DESIGN.md) for the walkthrough and [specgen/README.md](specgen/README.md) for the regeneration workflow and drift gates.
212
212
 
213
+ The REST client the tools call, [`@runpod/typescript-api-sdk`](https://www.npmjs.com/package/@runpod/typescript-api-sdk), lives in [`packages/typescript-api-sdk/`](packages/typescript-api-sdk/) and is published to npm separately. The vendored spec is in that package; both the SDK types and the MCP tools generate from it.
214
+
213
215
  This project uses [changesets](https://github.com/changesets/changesets) for versioning and npm publishing; every PR with user-facing changes needs a changeset. See `CLAUDE.md` and `docs/context.md` for full contributor guidance, architecture, and the test suite.
214
216
 
215
217
  ## License
216
218
 
217
- Apache-2.0
219
+ Apache-2.0. The SDK in `packages/typescript-api-sdk/` is MIT-licensed; see its `LICENSE`.
218
220
 
219
221
  ### JavaScript API migration
220
222
 
@@ -17,7 +17,7 @@ function authedGraphqlBase(env) {
17
17
  return pick(env.RUNPOD_AUTHED_GRAPHQL_URL, "https://api.runpod.io/graphql");
18
18
  }
19
19
  function hostedMcpBase(env) {
20
- return pick(env.RUNPOD_MCP_URL, "https://mcp.getrunpod.io");
20
+ return pick(env.RUNPOD_MCP_URL, "https://mcp.runpod.io");
21
21
  }
22
22
 
23
23
  export {
@@ -27,4 +27,4 @@ export {
27
27
  authedGraphqlBase,
28
28
  hostedMcpBase
29
29
  };
30
- //# sourceMappingURL=chunk-4GF3CMSH.mjs.map
30
+ //# sourceMappingURL=chunk-5IFIMVI6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/_shared/hosts.ts"],"sourcesContent":["// Env-resolved API base URLs, extracted from the retired dual-version backend\n// resolver (backend.ts) when the spec-generated surface became the only one.\n// The credential preflight compares only active SDK and runtime destinations.\n\nexport type Env = Record<string, string | undefined>;\n\n// '' reads as unset everywhere: the wrong-environment guard already strips\n// empty vars before comparing, and every consumer (the credential checker's\n// probe URL, the GraphQL/log clients) must resolve identically or the\n// guard's \"checker and guard cannot disagree\" invariant breaks.\nfunction pick(value: string | undefined, fallback: string): string {\n return value?.trim().replace(/\\/+$/, '') || fallback;\n}\n\n// Generated paths include /v2, so the SDK base is the API origin.\nexport function sdkBase(env: Env): string {\n return pick(env.RUNPOD_API_BASE_URL, 'https://api.runpod.io');\n}\nexport function serverlessBase(env: Env): string {\n return pick(env.RUNPOD_SERVERLESS_API_URL, 'https://api.runpod.ai/v2');\n}\nexport function publicGraphqlBase(env: Env): string {\n return pick(env.RUNPOD_PUBLIC_GRAPHQL_URL, 'https://api.runpod.io/graphql');\n}\n// A separate var from publicGraphqlBase despite the identical default:\n// RUNPOD_PUBLIC_GRAPHQL_URL is the documented credential-free discovery\n// override and gets pointed at stubs freely, so routing authed calls through it\n// would turn \"point this anywhere\" into \"send the caller's API key there\".\nexport function authedGraphqlBase(env: Env): string {\n return pick(env.RUNPOD_AUTHED_GRAPHQL_URL, 'https://api.runpod.io/graphql');\n}\n/** The hosted MCP server: install target, and stdio's search-docs backend. */\nexport function hostedMcpBase(env: Env): string {\n return pick(env.RUNPOD_MCP_URL, 'https://mcp.getrunpod.io');\n}\n/** The runpod-assistant Convex site serving /v1/search. No default: unset\n * means search is not configured. */\nexport function knowledgeSearchBase(env: Env): string | undefined {\n return pick(env.KNOWLEDGE_SEARCH_URL, '') || undefined;\n}\n"],"mappings":";;;AAUA,SAAS,KAAK,OAA2B,UAA0B;AACjE,SAAO,OAAO,KAAK,EAAE,QAAQ,QAAQ,EAAE,KAAK;AAC9C;AAGO,SAAS,QAAQ,KAAkB;AACxC,SAAO,KAAK,IAAI,qBAAqB,uBAAuB;AAC9D;AACO,SAAS,eAAe,KAAkB;AAC/C,SAAO,KAAK,IAAI,2BAA2B,0BAA0B;AACvE;AACO,SAAS,kBAAkB,KAAkB;AAClD,SAAO,KAAK,IAAI,2BAA2B,+BAA+B;AAC5E;AAKO,SAAS,kBAAkB,KAAkB;AAClD,SAAO,KAAK,IAAI,2BAA2B,+BAA+B;AAC5E;AAEO,SAAS,cAAc,KAAkB;AAC9C,SAAO,KAAK,IAAI,gBAAgB,0BAA0B;AAC5D;","names":[]}
1
+ {"version":3,"sources":["../src/_shared/hosts.ts"],"sourcesContent":["// Env-resolved API base URLs, extracted from the retired dual-version backend\n// resolver (backend.ts) when the spec-generated surface became the only one.\n// The credential preflight compares only active SDK and runtime destinations.\n\nexport type Env = Record<string, string | undefined>;\n\n// '' reads as unset everywhere: the wrong-environment guard already strips\n// empty vars before comparing, and every consumer (the credential checker's\n// probe URL, the GraphQL/log clients) must resolve identically or the\n// guard's \"checker and guard cannot disagree\" invariant breaks.\nfunction pick(value: string | undefined, fallback: string): string {\n return value?.trim().replace(/\\/+$/, '') || fallback;\n}\n\n// Generated paths include /v2, so the SDK base is the API origin.\nexport function sdkBase(env: Env): string {\n return pick(env.RUNPOD_API_BASE_URL, 'https://api.runpod.io');\n}\nexport function serverlessBase(env: Env): string {\n return pick(env.RUNPOD_SERVERLESS_API_URL, 'https://api.runpod.ai/v2');\n}\nexport function publicGraphqlBase(env: Env): string {\n return pick(env.RUNPOD_PUBLIC_GRAPHQL_URL, 'https://api.runpod.io/graphql');\n}\n// A separate var from publicGraphqlBase despite the identical default:\n// RUNPOD_PUBLIC_GRAPHQL_URL is the documented credential-free discovery\n// override and gets pointed at stubs freely, so routing authed calls through it\n// would turn \"point this anywhere\" into \"send the caller's API key there\".\nexport function authedGraphqlBase(env: Env): string {\n return pick(env.RUNPOD_AUTHED_GRAPHQL_URL, 'https://api.runpod.io/graphql');\n}\n/** The hosted MCP server: install target, and stdio's search-docs backend. */\nexport function hostedMcpBase(env: Env): string {\n return pick(env.RUNPOD_MCP_URL, 'https://mcp.runpod.io');\n}\n/** The runpod-assistant Convex site serving /v1/search. No default: unset\n * means search is not configured. */\nexport function knowledgeSearchBase(env: Env): string | undefined {\n return pick(env.KNOWLEDGE_SEARCH_URL, '') || undefined;\n}\n"],"mappings":";;;AAUA,SAAS,KAAK,OAA2B,UAA0B;AACjE,SAAO,OAAO,KAAK,EAAE,QAAQ,QAAQ,EAAE,KAAK;AAC9C;AAGO,SAAS,QAAQ,KAAkB;AACxC,SAAO,KAAK,IAAI,qBAAqB,uBAAuB;AAC9D;AACO,SAAS,eAAe,KAAkB;AAC/C,SAAO,KAAK,IAAI,2BAA2B,0BAA0B;AACvE;AACO,SAAS,kBAAkB,KAAkB;AAClD,SAAO,KAAK,IAAI,2BAA2B,+BAA+B;AAC5E;AAKO,SAAS,kBAAkB,KAAkB;AAClD,SAAO,KAAK,IAAI,2BAA2B,+BAA+B;AAC5E;AAEO,SAAS,cAAc,KAAkB;AAC9C,SAAO,KAAK,IAAI,gBAAgB,uBAAuB;AACzD;","names":[]}