diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 4e9d6c7e..eb0c51f1 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "7.1.1"
+ ".": "7.2.0"
}
diff --git a/.stats.yml b/.stats.yml
index f035d349..ae3aead6 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 42
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/imagekit-inc%2Fimagekit-c7ad6f552b38f2145781847f8b390fa1ec43068d64e45a33012a97a9299edc10.yml
-openapi_spec_hash: 50f281e91210ad5018ac7e4eee216f56
-config_hash: 74a8263b80c732a2b016177e7d56bb9c
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/imagekit-inc%2Fimagekit-9d184cb502ab32a85db2889c796cdfebe812f2a55a604df79c85dd4b5e7e2add.yml
+openapi_spec_hash: a9aa620376fce66532c84f9364209b0b
+config_hash: eb4cf65a4c6b26a2901076eff5810d5d
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0617e7cc..857f76c6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,38 @@
# Changelog
+## 7.2.0 (2025-11-07)
+
+Full Changelog: [v7.1.1...v7.2.0](https://github.com/imagekit-developer/imagekit-nodejs/compare/v7.1.1...v7.2.0)
+
+### Features
+
+* **api:** add GetImageAttributesOptions and ResponsiveImageAttributes schemas; update resource references in main.yaml; remove dummy endpoint ([9ea439a](https://github.com/imagekit-developer/imagekit-nodejs/commit/9ea439a2d0a4c8300d14d4424dc72ab40a67c4d4))
+* **mcp:** enable optional code execution tool on http mcp servers ([cc68e38](https://github.com/imagekit-developer/imagekit-nodejs/commit/cc68e38fa61078db6a5c961e7ed75dad342dc7e8))
+
+
+### Bug Fixes
+
+* **mcpb:** pin @anthropic-ai/mcpb version ([d81e225](https://github.com/imagekit-developer/imagekit-nodejs/commit/d81e22560aab772ee9b241fb44a50561b8837034))
+
+
+### Chores
+
+* extract some types in mcp docs ([de606ba](https://github.com/imagekit-developer/imagekit-nodejs/commit/de606ba3b734389e1c52a9929dbf8487828822e0))
+* **internal:** codegen related update ([662aa87](https://github.com/imagekit-developer/imagekit-nodejs/commit/662aa87091dc519bb811554438eaf978660d035e))
+* **internal:** codegen related update ([8c9026a](https://github.com/imagekit-developer/imagekit-nodejs/commit/8c9026ace5d217264e5753c01309a02a2c09095e))
+* **internal:** grammar fix (it's -> its) ([71e22a3](https://github.com/imagekit-developer/imagekit-nodejs/commit/71e22a30017324842fed5ab08ee1efbb1eecb6d2))
+* **internal:** use npm pack for build uploads ([bdfd369](https://github.com/imagekit-developer/imagekit-nodejs/commit/bdfd369118542dad02cf8a0fae8713d0d8bea4eb))
+* mcp code tool explicit error message when missing a run function ([6678ee1](https://github.com/imagekit-developer/imagekit-nodejs/commit/6678ee13cc1eee5ce1ac51b672144be77c38e9ea))
+* **mcp:** add friendlier MCP code tool errors on incorrect method invocations ([636829d](https://github.com/imagekit-developer/imagekit-nodejs/commit/636829d18a7dda730b65c0549298258afcea6341))
+* **mcp:** add line numbers to code tool errors ([25e4e59](https://github.com/imagekit-developer/imagekit-nodejs/commit/25e4e59f434c07c2d9afeef3f548dd99e250a7ab))
+* use structured error when code execution tool errors ([451f306](https://github.com/imagekit-developer/imagekit-nodejs/commit/451f306f6328e6c48374d0525dad9a0ddc6511d6))
+
+
+### Documentation
+
+* **mcp:** add a README button for one-click add to Cursor ([a7575d3](https://github.com/imagekit-developer/imagekit-nodejs/commit/a7575d308e3038715964f7416284bb012e27b240))
+* **mcp:** add a README link to add server to VS Code or Claude Code ([2a90d28](https://github.com/imagekit-developer/imagekit-nodejs/commit/2a90d2802e4814d97ec5bba77097eec2f0a5a718))
+
## 7.1.1 (2025-10-06)
Full Changelog: [v7.1.0...v7.1.1](https://github.com/imagekit-developer/imagekit-nodejs/compare/v7.1.0...v7.1.1)
diff --git a/api.md b/api.md
index 86719ecf..fc87a76f 100644
--- a/api.md
+++ b/api.md
@@ -4,10 +4,12 @@ Types:
- BaseOverlay
- Extensions
+- GetImageAttributesOptions
- ImageOverlay
- Overlay
- OverlayPosition
- OverlayTiming
+- ResponsiveImageAttributes
- SolidColorOverlay
- SolidColorOverlayTransformation
- SrcOptions
diff --git a/package.json b/package.json
index efd98c94..5fdf0c34 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@imagekit/nodejs",
- "version": "7.1.1",
+ "version": "7.2.0",
"description": "Offical NodeJS SDK for ImageKit.io integration",
"author": "Image Kit ",
"types": "dist/index.d.ts",
diff --git a/packages/mcp-server/README.md b/packages/mcp-server/README.md
index 38260a76..2c75fe1f 100644
--- a/packages/mcp-server/README.md
+++ b/packages/mcp-server/README.md
@@ -36,12 +36,36 @@ For clients with a configuration JSON, it might look something like this:
}
```
+### Cursor
+
+If you use Cursor, you can install the MCP server by using the button below. You will need to set your environment variables
+in Cursor's `mcp.json`, which can be found in Cursor Settings > Tools & MCP > New MCP Server.
+
+[](https://cursor.com/en-US/install-mcp?name=@imagekit/api-mcp&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBpbWFnZWtpdC9hcGktbWNwIl0sImVudiI6eyJJTUFHRUtJVF9QUklWQVRFX0tFWSI6IlNldCB5b3VyIElNQUdFS0lUX1BSSVZBVEVfS0VZIGhlcmUuIiwiT1BUSU9OQUxfSU1BR0VLSVRfSUdOT1JFU19USElTIjoiU2V0IHlvdXIgT1BUSU9OQUxfSU1BR0VLSVRfSUdOT1JFU19USElTIGhlcmUuIiwiSU1BR0VLSVRfV0VCSE9PS19TRUNSRVQiOiJTZXQgeW91ciBJTUFHRUtJVF9XRUJIT09LX1NFQ1JFVCBoZXJlLiJ9fQ)
+
+### VS Code
+
+If you use MCP, you can install the MCP server by clicking the link below. You will need to set your environment variables
+in VS Code's `mcp.json`, which can be found via Command Palette > MCP: Open User Configuration.
+
+[Open VS Code](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40imagekit%2Fapi-mcp%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40imagekit%2Fapi-mcp%22%5D%2C%22env%22%3A%7B%22IMAGEKIT_PRIVATE_KEY%22%3A%22Set%20your%20IMAGEKIT_PRIVATE_KEY%20here.%22%2C%22OPTIONAL_IMAGEKIT_IGNORES_THIS%22%3A%22Set%20your%20OPTIONAL_IMAGEKIT_IGNORES_THIS%20here.%22%2C%22IMAGEKIT_WEBHOOK_SECRET%22%3A%22Set%20your%20IMAGEKIT_WEBHOOK_SECRET%20here.%22%7D%7D)
+
+### Claude Code
+
+If you use Claude Code, you can install the MCP server by running the command below in your terminal. You will need to set your
+environment variables in Claude Code's `.claude.json`, which can be found in your home directory.
+
+```
+claude mcp add --transport stdio imagekit_nodejs_api --env IMAGEKIT_PRIVATE_KEY="Your IMAGEKIT_PRIVATE_KEY here." OPTIONAL_IMAGEKIT_IGNORES_THIS="Your OPTIONAL_IMAGEKIT_IGNORES_THIS here." IMAGEKIT_WEBHOOK_SECRET="Your IMAGEKIT_WEBHOOK_SECRET here." -- npx -y @imagekit/api-mcp
+```
+
## Exposing endpoints to your MCP Client
-There are two ways to expose endpoints as tools in the MCP server:
+There are three ways to expose endpoints as tools in the MCP server:
1. Exposing one tool per endpoint, and filtering as necessary
2. Exposing a set of tools to dynamically discover and invoke endpoints from the API
+3. Exposing a docs search tool and a code execution tool, allowing the client to write code to be executed against the TypeScript client
### Filtering endpoints and tools
@@ -76,6 +100,18 @@ All of these command-line options can be repeated, combined together, and have c
Use `--list` to see the list of available tools, or see below.
+### Code execution
+
+If you specify `--tools=code` to the MCP server, it will expose just two tools:
+
+- `search_docs` - Searches the API documentation and returns a list of markdown results
+- `execute` - Runs code against the TypeScript client
+
+This allows the LLM to implement more complex logic by chaining together many API calls without loading
+intermediary results into its context window.
+
+The code execution itself happens in a Deno sandbox that has network access only to the base URL for the API.
+
### Specifying the MCP Client
Different clients have varying abilities to handle arbitrary tools and schemas.
diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json
index 572eee54..b9314e08 100644
--- a/packages/mcp-server/package.json
+++ b/packages/mcp-server/package.json
@@ -1,6 +1,6 @@
{
"name": "@imagekit/api-mcp",
- "version": "7.1.1",
+ "version": "7.2.0",
"description": "The official MCP Server for the Image Kit API",
"author": "Image Kit ",
"types": "dist/index.d.ts",
@@ -36,8 +36,10 @@
"@valtown/deno-http-worker": "^0.0.21",
"cors": "^2.8.5",
"express": "^5.1.0",
+ "fuse.js": "^7.1.0",
"jq-web": "https://github.com/stainless-api/jq-web/releases/download/v0.8.6/jq-web.tar.gz",
"qs": "^6.14.0",
+ "typescript": "5.8.3",
"yargs": "^17.7.2",
"zod": "^3.25.20",
"zod-to-json-schema": "^3.24.5",
@@ -47,7 +49,7 @@
"mcp-server": "dist/index.js"
},
"devDependencies": {
- "@anthropic-ai/mcpb": "^1.1.0",
+ "@anthropic-ai/mcpb": "1.1.0",
"@types/cors": "^2.8.19",
"@types/express": "^5.0.3",
"@types/jest": "^29.4.0",
@@ -64,8 +66,7 @@
"ts-morph": "^19.0.0",
"ts-node": "^10.5.0",
"tsc-multi": "https://github.com/stainless-api/tsc-multi/releases/download/v1.1.9/tsc-multi.tgz",
- "tsconfig-paths": "^4.0.0",
- "typescript": "5.8.3"
+ "tsconfig-paths": "^4.0.0"
},
"imports": {
"@imagekit/api-mcp": ".",
diff --git a/packages/mcp-server/src/code-tool-worker.ts b/packages/mcp-server/src/code-tool-worker.ts
index 865c3928..36f587e2 100644
--- a/packages/mcp-server/src/code-tool-worker.ts
+++ b/packages/mcp-server/src/code-tool-worker.ts
@@ -1,11 +1,207 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
import util from 'node:util';
+
+import Fuse from 'fuse.js';
+import ts from 'typescript';
+
import { WorkerInput, WorkerSuccess, WorkerError } from './code-tool-types';
import { ImageKit } from '@imagekit/nodejs';
+function getRunFunctionNode(
+ code: string,
+): ts.FunctionDeclaration | ts.FunctionExpression | ts.ArrowFunction | null {
+ const sourceFile = ts.createSourceFile('code.ts', code, ts.ScriptTarget.Latest, true);
+
+ for (const statement of sourceFile.statements) {
+ // Check for top-level function declarations
+ if (ts.isFunctionDeclaration(statement)) {
+ if (statement.name?.text === 'run') {
+ return statement;
+ }
+ }
+
+ // Check for variable declarations: const run = () => {} or const run = function() {}
+ if (ts.isVariableStatement(statement)) {
+ for (const declaration of statement.declarationList.declarations) {
+ if (ts.isIdentifier(declaration.name) && declaration.name.text === 'run') {
+ // Check if it's initialized with a function
+ if (
+ declaration.initializer &&
+ (ts.isFunctionExpression(declaration.initializer) || ts.isArrowFunction(declaration.initializer))
+ ) {
+ return declaration.initializer;
+ }
+ }
+ }
+ }
+ }
+
+ return null;
+}
+
+const fuse = new Fuse(
+ [
+ 'client.customMetadataFields.create',
+ 'client.customMetadataFields.delete',
+ 'client.customMetadataFields.list',
+ 'client.customMetadataFields.update',
+ 'client.files.copy',
+ 'client.files.delete',
+ 'client.files.get',
+ 'client.files.move',
+ 'client.files.rename',
+ 'client.files.update',
+ 'client.files.upload',
+ 'client.files.bulk.addTags',
+ 'client.files.bulk.delete',
+ 'client.files.bulk.removeAITags',
+ 'client.files.bulk.removeTags',
+ 'client.files.versions.delete',
+ 'client.files.versions.get',
+ 'client.files.versions.list',
+ 'client.files.versions.restore',
+ 'client.files.metadata.get',
+ 'client.files.metadata.getFromURL',
+ 'client.assets.list',
+ 'client.cache.invalidation.create',
+ 'client.cache.invalidation.get',
+ 'client.folders.copy',
+ 'client.folders.create',
+ 'client.folders.delete',
+ 'client.folders.move',
+ 'client.folders.rename',
+ 'client.folders.job.get',
+ 'client.accounts.usage.get',
+ 'client.accounts.origins.create',
+ 'client.accounts.origins.delete',
+ 'client.accounts.origins.get',
+ 'client.accounts.origins.list',
+ 'client.accounts.origins.update',
+ 'client.accounts.urlEndpoints.create',
+ 'client.accounts.urlEndpoints.delete',
+ 'client.accounts.urlEndpoints.get',
+ 'client.accounts.urlEndpoints.list',
+ 'client.accounts.urlEndpoints.update',
+ 'client.beta.v2.files.upload',
+ 'client.webhooks.unsafeUnwrap',
+ 'client.webhooks.unwrap',
+ ],
+ { threshold: 1, shouldSort: true },
+);
+
+function getMethodSuggestions(fullyQualifiedMethodName: string): string[] {
+ return fuse
+ .search(fullyQualifiedMethodName)
+ .map(({ item }) => item)
+ .slice(0, 5);
+}
+
+const proxyToObj = new WeakMap();
+const objToProxy = new WeakMap();
+
+type ClientProxyConfig = {
+ path: string[];
+ isBelievedBad?: boolean;
+};
+
+function makeSdkProxy(obj: T, { path, isBelievedBad = false }: ClientProxyConfig): T {
+ let proxy: T = objToProxy.get(obj);
+
+ if (!proxy) {
+ proxy = new Proxy(obj, {
+ get(target, prop, receiver) {
+ const propPath = [...path, String(prop)];
+ const value = Reflect.get(target, prop, receiver);
+
+ if (isBelievedBad || (!(prop in target) && value === undefined)) {
+ // If we're accessing a path that doesn't exist, it will probably eventually error.
+ // Let's proxy it and mark it bad so that we can control the error message.
+ // We proxy an empty class so that an invocation or construction attempt is possible.
+ return makeSdkProxy(class {}, { path: propPath, isBelievedBad: true });
+ }
+
+ if (value !== null && (typeof value === 'object' || typeof value === 'function')) {
+ return makeSdkProxy(value, { path: propPath, isBelievedBad });
+ }
+
+ return value;
+ },
+
+ apply(target, thisArg, args) {
+ if (isBelievedBad || typeof target !== 'function') {
+ const fullyQualifiedMethodName = path.join('.');
+ const suggestions = getMethodSuggestions(fullyQualifiedMethodName);
+ throw new Error(
+ `${fullyQualifiedMethodName} is not a function. Did you mean: ${suggestions.join(', ')}`,
+ );
+ }
+
+ return Reflect.apply(target, proxyToObj.get(thisArg) ?? thisArg, args);
+ },
+
+ construct(target, args, newTarget) {
+ if (isBelievedBad || typeof target !== 'function') {
+ const fullyQualifiedMethodName = path.join('.');
+ const suggestions = getMethodSuggestions(fullyQualifiedMethodName);
+ throw new Error(
+ `${fullyQualifiedMethodName} is not a constructor. Did you mean: ${suggestions.join(', ')}`,
+ );
+ }
+
+ return Reflect.construct(target, args, newTarget);
+ },
+ });
+
+ objToProxy.set(obj, proxy);
+ proxyToObj.set(proxy, obj);
+ }
+
+ return proxy;
+}
+
+function parseError(code: string, error: unknown): string | undefined {
+ if (!(error instanceof Error)) return;
+ const message = error.name ? `${error.name}: ${error.message}` : error.message;
+ try {
+ // Deno uses V8; the first ":LINE:COLUMN" is the top of stack.
+ const lineNumber = error.stack?.match(/:([0-9]+):[0-9]+/)?.[1];
+ // -1 for the zero-based indexing
+ const line =
+ lineNumber &&
+ code
+ .split('\n')
+ .at(parseInt(lineNumber, 10) - 1)
+ ?.trim();
+ return line ? `${message}\n at line ${lineNumber}\n ${line}` : message;
+ } catch {
+ return message;
+ }
+}
+
const fetch = async (req: Request): Promise => {
const { opts, code } = (await req.json()) as WorkerInput;
+ if (code == null) {
+ return Response.json(
+ {
+ message:
+ 'The code param is missing. Provide one containing a top-level `run` function. Write code within this template:\n\n```\nasync function run(client) {\n // Fill this out\n}\n```',
+ } satisfies WorkerError,
+ { status: 400, statusText: 'Code execution error' },
+ );
+ }
+
+ const runFunctionNode = getRunFunctionNode(code);
+ if (!runFunctionNode) {
+ return Response.json(
+ {
+ message:
+ 'The code is missing a top-level `run` function. Write code within this template:\n\n```\nasync function run(client) {\n // Fill this out\n}\n```',
+ } satisfies WorkerError,
+ { status: 400, statusText: 'Code execution error' },
+ );
+ }
+
const client = new ImageKit({
...opts,
});
@@ -22,21 +218,17 @@ const fetch = async (req: Request): Promise => {
};
try {
let run_ = async (client: any) => {};
- eval(`
- ${code}
- run_ = run;
- `);
- const result = await run_(client);
+ eval(`${code}\nrun_ = run;`);
+ const result = await run_(makeSdkProxy(client, { path: ['client'] }));
return Response.json({
result,
logLines,
errLines,
} satisfies WorkerSuccess);
} catch (e) {
- const message = e instanceof Error ? e.message : undefined;
return Response.json(
{
- message,
+ message: parseError(code, e),
} satisfies WorkerError,
{ status: 400, statusText: 'Code execution error' },
);
diff --git a/packages/mcp-server/src/code-tool.ts b/packages/mcp-server/src/code-tool.ts
index 47d2064a..74b830ac 100644
--- a/packages/mcp-server/src/code-tool.ts
+++ b/packages/mcp-server/src/code-tool.ts
@@ -3,7 +3,7 @@
import { dirname } from 'node:path';
import { pathToFileURL } from 'node:url';
import ImageKit, { ClientOptions } from '@imagekit/nodejs';
-import { Endpoint, ContentBlock, Metadata } from './tools/types';
+import { ContentBlock, Endpoint, Metadata, ToolCallResult } from './tools/types';
import { Tool } from '@modelcontextprotocol/sdk/types.js';
@@ -12,7 +12,7 @@ import { WorkerInput, WorkerError, WorkerSuccess } from './code-tool-types';
/**
* A tool that runs code against a copy of the SDK.
*
- * Instead of exposing every endpoint as it's own tool, which uses up too many tokens for LLMs to use at once,
+ * Instead of exposing every endpoint as its own tool, which uses up too many tokens for LLMs to use at once,
* we expose a single tool that can be used to search for endpoints by name, resource, operation, or tag, and then
* a generic endpoint that can be used to invoke any endpoint with the provided arguments.
*
@@ -23,7 +23,7 @@ export async function codeTool(): Promise {
const tool: Tool = {
name: 'execute',
description:
- 'Runs Typescript code to interact with the API.\nYou are a skilled programmer writing code to interface with the service.\nDefine an async function named "run" that takes a single parameter of an initialized client, and it will be run.\nDo not initialize a client, but instead use the client that you are given as a parameter.\nYou will be returned anything that your function returns, plus the results of any console.log statements.\nIf any code triggers an error, the tool will return an error response, so you do not need to add error handling unless you want to output something more helpful than the raw error.\nIt is not necessary to add comments to code, unless by adding those comments you believe that you can generate better code.\nThis code will run in a container, and you will not be able to use fetch or otherwise interact with the network calls other than through the client you are given.\nAny variables you define won\'t live between successive uses of this call, so make sure to return or log any data you might need later.',
+ 'Runs JavaScript code to interact with the API.\n\nYou are a skilled programmer writing code to interface with the service.\nDefine an async function named "run" that takes a single parameter of an initialized client named "client", and it will be run.\nWrite code within this template:\n\n```\nasync function run(client) {\n // Fill this out\n}\n```\n\nYou will be returned anything that your function returns, plus the results of any console.log statements.\nIf any code triggers an error, the tool will return an error response, so you do not need to add error handling unless you want to output something more helpful than the raw error.\nIt is not necessary to add comments to code, unless by adding those comments you believe that you can generate better code.\nThis code will run in a container, and you will not be able to use fetch or otherwise interact with the network calls other than through the client you are given.\nAny variables you define won\'t live between successive uses of this call, so make sure to return or log any data you might need later.',
inputSchema: { type: 'object', properties: { code: { type: 'string' } } },
};
@@ -31,7 +31,7 @@ export async function codeTool(): Promise {
const { newDenoHTTPWorker } = await import('@valtown/deno-http-worker');
const { workerPath } = await import('./code-tool-paths.cjs');
- const handler = async (client: ImageKit, args: unknown) => {
+ const handler = async (client: ImageKit, args: unknown): Promise => {
const baseURLHostname = new URL(client.baseURL).hostname;
const { code } = args as { code: string };
@@ -99,7 +99,7 @@ export async function codeTool(): Promise {
} satisfies WorkerInput);
req.write(body, (err) => {
- if (err !== null && err !== undefined) {
+ if (err != null) {
reject(err);
}
});
@@ -110,12 +110,12 @@ export async function codeTool(): Promise {
if (resp.status === 200) {
const { result, logLines, errLines } = (await resp.json()) as WorkerSuccess;
const returnOutput: ContentBlock | null =
- result === null ? null
- : result === undefined ? null
- : {
+ result == null ? null : (
+ {
type: 'text',
- text: typeof result === 'string' ? (result as string) : JSON.stringify(result),
- };
+ text: typeof result === 'string' ? result : JSON.stringify(result),
+ }
+ );
const logOutput: ContentBlock | null =
logLines.length === 0 ?
null
@@ -135,10 +135,11 @@ export async function codeTool(): Promise {
};
} else {
const { message } = (await resp.json()) as WorkerError;
- throw new Error(message);
+ return {
+ content: message == null ? [] : [{ type: 'text', text: message }],
+ isError: true,
+ };
}
- } catch (e) {
- throw e;
} finally {
worker.terminate();
}
diff --git a/packages/mcp-server/src/dynamic-tools.ts b/packages/mcp-server/src/dynamic-tools.ts
index 47d60e0d..53676da1 100644
--- a/packages/mcp-server/src/dynamic-tools.ts
+++ b/packages/mcp-server/src/dynamic-tools.ts
@@ -14,7 +14,7 @@ function zodToInputSchema(schema: z.ZodSchema) {
/**
* A list of tools that expose all the endpoints in the API dynamically.
*
- * Instead of exposing every endpoint as it's own tool, which uses up too many tokens for LLMs to use at once,
+ * Instead of exposing every endpoint as its own tool, which uses up too many tokens for LLMs to use at once,
* we expose a single tool that can be used to search for endpoints by name, resource, operation, or tag, and then
* a generic endpoint that can be used to invoke any endpoint with the provided arguments.
*
diff --git a/packages/mcp-server/src/options.ts b/packages/mcp-server/src/options.ts
index 4fe3b987..b6ff5976 100644
--- a/packages/mcp-server/src/options.ts
+++ b/packages/mcp-server/src/options.ts
@@ -284,8 +284,10 @@ const coerceArray = (zodType: T) =>
);
const QueryOptions = z.object({
- tools: coerceArray(z.enum(['dynamic', 'all', 'docs'])).describe('Use dynamic tools or all tools'),
- no_tools: coerceArray(z.enum(['dynamic', 'all', 'docs'])).describe('Do not use dynamic tools or all tools'),
+ tools: coerceArray(z.enum(['dynamic', 'all', 'code', 'docs'])).describe('Specify which MCP tools to use'),
+ no_tools: coerceArray(z.enum(['dynamic', 'all', 'code', 'docs'])).describe(
+ 'Specify which MCP tools to not use.',
+ ),
tool: coerceArray(z.string()).describe('Include tools matching the specified names'),
resource: coerceArray(z.string()).describe('Include tools matching the specified resources'),
operation: coerceArray(z.enum(['read', 'write'])).describe(
@@ -385,11 +387,16 @@ export function parseQueryOptions(defaultOptions: McpOptions, query: unknown): M
: queryOptions.tools?.includes('docs') ? true
: defaultOptions.includeDocsTools;
+ let codeTools: boolean | undefined =
+ queryOptions.no_tools && queryOptions.no_tools?.includes('code') ? false
+ : queryOptions.tools?.includes('code') && defaultOptions.includeCodeTools ? true
+ : defaultOptions.includeCodeTools;
+
return {
client: queryOptions.client ?? defaultOptions.client,
includeDynamicTools: dynamicTools,
includeAllTools: allTools,
- includeCodeTools: undefined,
+ includeCodeTools: codeTools,
includeDocsTools: docsTools,
filters,
capabilities: clientCapabilities,
diff --git a/packages/mcp-server/src/server.ts b/packages/mcp-server/src/server.ts
index 457cbb4b..4d00ee65 100644
--- a/packages/mcp-server/src/server.ts
+++ b/packages/mcp-server/src/server.ts
@@ -34,7 +34,7 @@ export const newMcpServer = () =>
new McpServer(
{
name: 'imagekit_nodejs_api',
- version: '7.1.1',
+ version: '7.2.0',
},
{ capabilities: { tools: {}, logging: {} } },
);
diff --git a/packages/mcp-server/src/tools/accounts/url-endpoints/list-accounts-url-endpoints.ts b/packages/mcp-server/src/tools/accounts/url-endpoints/list-accounts-url-endpoints.ts
index b565f8ad..5bb31895 100644
--- a/packages/mcp-server/src/tools/accounts/url-endpoints/list-accounts-url-endpoints.ts
+++ b/packages/mcp-server/src/tools/accounts/url-endpoints/list-accounts-url-endpoints.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'list_accounts_url_endpoints',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\n**Note:** This API is currently in beta. \nReturns an array of all URL‑endpoints configured including the default URL-endpoint generated by ImageKit during account creation.\n\n\n# Response Schema\n```json\n{\n type: 'array',\n items: {\n $ref: '#/$defs/url_endpoint_response'\n },\n $defs: {\n url_endpoint_response: {\n type: 'object',\n title: 'URL‑endpoint Response',\n description: 'URL‑endpoint object as returned by the API.',\n properties: {\n id: {\n type: 'string',\n description: 'Unique identifier for the URL-endpoint. This is generated by ImageKit when you create a new URL-endpoint. For the default URL-endpoint, this is always `default`.'\n },\n description: {\n type: 'string',\n description: 'Description of the URL endpoint.'\n },\n origins: {\n type: 'array',\n description: 'Ordered list of origin IDs to try when the file isn’t in the Media Library; ImageKit checks them in the sequence provided. Origin must be created before it can be used in a URL endpoint.',\n items: {\n type: 'string',\n description: 'Unique identifier for the origin. This is generated by ImageKit when you create a new origin.'\n }\n },\n urlPrefix: {\n type: 'string',\n description: 'Path segment appended to your base URL to form the endpoint (letters, digits, and hyphens only — or empty for the default endpoint).'\n },\n urlRewriter: {\n anyOf: [ {\n type: 'object',\n title: 'Cloudinary URL Rewriter',\n properties: {\n preserveAssetDeliveryTypes: {\n type: 'boolean',\n description: 'Whether to preserve `/` in the rewritten URL.'\n },\n type: {\n type: 'string',\n enum: [ 'CLOUDINARY'\n ]\n }\n },\n required: [ 'preserveAssetDeliveryTypes',\n 'type'\n ]\n },\n {\n type: 'object',\n title: 'Imgix URL Rewriter',\n properties: {\n type: {\n type: 'string',\n enum: [ 'IMGIX'\n ]\n }\n },\n required: [ 'type'\n ]\n },\n {\n type: 'object',\n title: 'Akamai URL Rewriter',\n properties: {\n type: {\n type: 'string',\n enum: [ 'AKAMAI'\n ]\n }\n },\n required: [ 'type'\n ]\n }\n ],\n description: 'Configuration for third-party URL rewriting.'\n }\n },\n required: [ 'id',\n 'description',\n 'origins',\n 'urlPrefix'\n ]\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\n**Note:** This API is currently in beta. \nReturns an array of all URL‑endpoints configured including the default URL-endpoint generated by ImageKit during account creation.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/url_endpoint_list_response',\n $defs: {\n url_endpoint_list_response: {\n type: 'array',\n items: {\n $ref: '#/$defs/url_endpoint_response'\n }\n },\n url_endpoint_response: {\n type: 'object',\n title: 'URL‑endpoint Response',\n description: 'URL‑endpoint object as returned by the API.',\n properties: {\n id: {\n type: 'string',\n description: 'Unique identifier for the URL-endpoint. This is generated by ImageKit when you create a new URL-endpoint. For the default URL-endpoint, this is always `default`.'\n },\n description: {\n type: 'string',\n description: 'Description of the URL endpoint.'\n },\n origins: {\n type: 'array',\n description: 'Ordered list of origin IDs to try when the file isn’t in the Media Library; ImageKit checks them in the sequence provided. Origin must be created before it can be used in a URL endpoint.',\n items: {\n type: 'string',\n description: 'Unique identifier for the origin. This is generated by ImageKit when you create a new origin.'\n }\n },\n urlPrefix: {\n type: 'string',\n description: 'Path segment appended to your base URL to form the endpoint (letters, digits, and hyphens only — or empty for the default endpoint).'\n },\n urlRewriter: {\n anyOf: [ {\n type: 'object',\n title: 'Cloudinary URL Rewriter',\n properties: {\n preserveAssetDeliveryTypes: {\n type: 'boolean',\n description: 'Whether to preserve `/` in the rewritten URL.'\n },\n type: {\n type: 'string',\n enum: [ 'CLOUDINARY'\n ]\n }\n },\n required: [ 'preserveAssetDeliveryTypes',\n 'type'\n ]\n },\n {\n type: 'object',\n title: 'Imgix URL Rewriter',\n properties: {\n type: {\n type: 'string',\n enum: [ 'IMGIX'\n ]\n }\n },\n required: [ 'type'\n ]\n },\n {\n type: 'object',\n title: 'Akamai URL Rewriter',\n properties: {\n type: {\n type: 'string',\n enum: [ 'AKAMAI'\n ]\n }\n },\n required: [ 'type'\n ]\n }\n ],\n description: 'Configuration for third-party URL rewriting.'\n }\n },\n required: [ 'id',\n 'description',\n 'origins',\n 'urlPrefix'\n ]\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/accounts/usage/get-accounts-usage.ts b/packages/mcp-server/src/tools/accounts/usage/get-accounts-usage.ts
index 09f47703..d39f75c4 100644
--- a/packages/mcp-server/src/tools/accounts/usage/get-accounts-usage.ts
+++ b/packages/mcp-server/src/tools/accounts/usage/get-accounts-usage.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'get_accounts_usage',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nGet the account usage information between two dates. Note that the API response includes data from the start date while excluding data from the end date. In other words, the data covers the period starting from the specified start date up to, but not including, the end date.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n bandwidthBytes: {\n type: 'integer',\n description: 'Amount of bandwidth used in bytes.'\n },\n extensionUnitsCount: {\n type: 'integer',\n description: 'Number of extension units used.'\n },\n mediaLibraryStorageBytes: {\n type: 'integer',\n description: 'Storage used by media library in bytes.'\n },\n originalCacheStorageBytes: {\n type: 'integer',\n description: 'Storage used by the original cache in bytes.'\n },\n videoProcessingUnitsCount: {\n type: 'integer',\n description: 'Number of video processing units used.'\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nGet the account usage information between two dates. Note that the API response includes data from the start date while excluding data from the end date. In other words, the data covers the period starting from the specified start date up to, but not including, the end date.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/usage_get_response',\n $defs: {\n usage_get_response: {\n type: 'object',\n properties: {\n bandwidthBytes: {\n type: 'integer',\n description: 'Amount of bandwidth used in bytes.'\n },\n extensionUnitsCount: {\n type: 'integer',\n description: 'Number of extension units used.'\n },\n mediaLibraryStorageBytes: {\n type: 'integer',\n description: 'Storage used by media library in bytes.'\n },\n originalCacheStorageBytes: {\n type: 'integer',\n description: 'Storage used by the original cache in bytes.'\n },\n videoProcessingUnitsCount: {\n type: 'integer',\n description: 'Number of video processing units used.'\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/assets/list-assets.ts b/packages/mcp-server/src/tools/assets/list-assets.ts
index 6da6273a..180a2750 100644
--- a/packages/mcp-server/src/tools/assets/list-assets.ts
+++ b/packages/mcp-server/src/tools/assets/list-assets.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'list_assets',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API can list all the uploaded files and folders in your ImageKit.io media library. In addition, you can fine-tune your query by specifying various filters by generating a query string in a Lucene-like syntax and provide this generated string as the value of the `searchQuery`.\n\n\n# Response Schema\n```json\n{\n type: 'array',\n items: {\n anyOf: [ {\n $ref: '#/$defs/file'\n },\n {\n $ref: '#/$defs/folder'\n }\n ],\n description: 'Object containing details of a file or file version.'\n },\n $defs: {\n file: {\n type: 'object',\n title: 'File & File Version',\n description: 'Object containing details of a file or file version.',\n properties: {\n AITags: {\n type: 'array',\n description: 'An array of tags assigned to the file by auto tagging.\\n',\n items: {\n type: 'object',\n properties: {\n confidence: {\n type: 'number',\n description: 'Confidence score of the tag.'\n },\n name: {\n type: 'string',\n description: 'Name of the tag.'\n },\n source: {\n type: 'string',\n description: 'Source of the tag. Possible values are `google-auto-tagging` and `aws-auto-tagging`.'\n }\n }\n }\n },\n createdAt: {\n type: 'string',\n description: 'Date and time when the file was uploaded. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n },\n customCoordinates: {\n type: 'string',\n description: 'An string with custom coordinates of the file.\\n'\n },\n customMetadata: {\n type: 'object',\n description: 'An object with custom metadata for the file.\\n',\n additionalProperties: true\n },\n description: {\n type: 'string',\n description: 'Optional text to describe the contents of the file. Can be set by the user or the ai-auto-description extension.\\n'\n },\n fileId: {\n type: 'string',\n description: 'Unique identifier of the asset.'\n },\n filePath: {\n type: 'string',\n description: 'Path of the file. This is the path you would use in the URL to access the file. For example, if the file is at the root of the media library, the path will be `/file.jpg`. If the file is inside a folder named `images`, the path will be `/images/file.jpg`.\\n'\n },\n fileType: {\n type: 'string',\n description: 'Type of the file. Possible values are `image`, `non-image`.\\n'\n },\n hasAlpha: {\n type: 'boolean',\n description: 'Specifies if the image has an alpha channel.\\n'\n },\n height: {\n type: 'number',\n description: 'Height of the file.\\n'\n },\n isPrivateFile: {\n type: 'boolean',\n description: 'Specifies if the file is private or not.\\n'\n },\n isPublished: {\n type: 'boolean',\n description: 'Specifies if the file is published or not.\\n'\n },\n mime: {\n type: 'string',\n description: 'MIME type of the file.\\n'\n },\n name: {\n type: 'string',\n description: 'Name of the asset.'\n },\n selectedFieldsSchema: {\n type: 'object',\n description: 'This field is included in the response only if the Path policy feature is available in the plan.\\nIt contains schema definitions for the custom metadata fields selected for the specified file path.\\nField selection can only be done when the Path policy feature is enabled.\\n\\nKeys are the names of the custom metadata fields; the value object has details about the custom metadata schema.\\n',\n additionalProperties: true\n },\n size: {\n type: 'number',\n description: 'Size of the file in bytes.\\n'\n },\n tags: {\n type: 'array',\n description: 'An array of tags assigned to the file. Tags are used to search files in the media library.\\n',\n items: {\n type: 'string'\n }\n },\n thumbnail: {\n type: 'string',\n description: 'URL of the thumbnail image. This URL is used to access the thumbnail image of the file in the media library.\\n'\n },\n type: {\n type: 'string',\n description: 'Type of the asset.',\n enum: [ 'file',\n 'file-version'\n ]\n },\n updatedAt: {\n type: 'string',\n description: 'Date and time when the file was last updated. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n },\n url: {\n type: 'string',\n description: 'URL of the file.\\n'\n },\n versionInfo: {\n type: 'object',\n description: 'An object with details of the file version.\\n',\n properties: {\n id: {\n type: 'string',\n description: 'Unique identifier of the file version.'\n },\n name: {\n type: 'string',\n description: 'Name of the file version.'\n }\n }\n },\n width: {\n type: 'number',\n description: 'Width of the file.\\n'\n }\n }\n },\n folder: {\n type: 'object',\n title: 'Folder',\n properties: {\n createdAt: {\n type: 'string',\n description: 'Date and time when the folder was created. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n },\n folderId: {\n type: 'string',\n description: 'Unique identifier of the asset.'\n },\n folderPath: {\n type: 'string',\n description: 'Path of the folder. This is the path you would use in the URL to access the folder. For example, if the folder is at the root of the media library, the path will be /folder. If the folder is inside another folder named images, the path will be /images/folder.\\n'\n },\n name: {\n type: 'string',\n description: 'Name of the asset.'\n },\n type: {\n type: 'string',\n description: 'Type of the asset.',\n enum: [ 'folder'\n ]\n },\n updatedAt: {\n type: 'string',\n description: 'Date and time when the folder was last updated. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n }\n }\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API can list all the uploaded files and folders in your ImageKit.io media library. In addition, you can fine-tune your query by specifying various filters by generating a query string in a Lucene-like syntax and provide this generated string as the value of the `searchQuery`.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/asset_list_response',\n $defs: {\n asset_list_response: {\n type: 'array',\n items: {\n anyOf: [ {\n $ref: '#/$defs/file'\n },\n {\n $ref: '#/$defs/folder'\n }\n ],\n description: 'Object containing details of a file or file version.'\n }\n },\n file: {\n type: 'object',\n title: 'File & File Version',\n description: 'Object containing details of a file or file version.',\n properties: {\n AITags: {\n type: 'array',\n description: 'An array of tags assigned to the file by auto tagging.\\n',\n items: {\n type: 'object',\n properties: {\n confidence: {\n type: 'number',\n description: 'Confidence score of the tag.'\n },\n name: {\n type: 'string',\n description: 'Name of the tag.'\n },\n source: {\n type: 'string',\n description: 'Source of the tag. Possible values are `google-auto-tagging` and `aws-auto-tagging`.'\n }\n }\n }\n },\n createdAt: {\n type: 'string',\n description: 'Date and time when the file was uploaded. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n },\n customCoordinates: {\n type: 'string',\n description: 'An string with custom coordinates of the file.\\n'\n },\n customMetadata: {\n type: 'object',\n description: 'An object with custom metadata for the file.\\n',\n additionalProperties: true\n },\n description: {\n type: 'string',\n description: 'Optional text to describe the contents of the file. Can be set by the user or the ai-auto-description extension.\\n'\n },\n fileId: {\n type: 'string',\n description: 'Unique identifier of the asset.'\n },\n filePath: {\n type: 'string',\n description: 'Path of the file. This is the path you would use in the URL to access the file. For example, if the file is at the root of the media library, the path will be `/file.jpg`. If the file is inside a folder named `images`, the path will be `/images/file.jpg`.\\n'\n },\n fileType: {\n type: 'string',\n description: 'Type of the file. Possible values are `image`, `non-image`.\\n'\n },\n hasAlpha: {\n type: 'boolean',\n description: 'Specifies if the image has an alpha channel.\\n'\n },\n height: {\n type: 'number',\n description: 'Height of the file.\\n'\n },\n isPrivateFile: {\n type: 'boolean',\n description: 'Specifies if the file is private or not.\\n'\n },\n isPublished: {\n type: 'boolean',\n description: 'Specifies if the file is published or not.\\n'\n },\n mime: {\n type: 'string',\n description: 'MIME type of the file.\\n'\n },\n name: {\n type: 'string',\n description: 'Name of the asset.'\n },\n selectedFieldsSchema: {\n type: 'object',\n description: 'This field is included in the response only if the Path policy feature is available in the plan.\\nIt contains schema definitions for the custom metadata fields selected for the specified file path.\\nField selection can only be done when the Path policy feature is enabled.\\n\\nKeys are the names of the custom metadata fields; the value object has details about the custom metadata schema.\\n',\n additionalProperties: true\n },\n size: {\n type: 'number',\n description: 'Size of the file in bytes.\\n'\n },\n tags: {\n type: 'array',\n description: 'An array of tags assigned to the file. Tags are used to search files in the media library.\\n',\n items: {\n type: 'string'\n }\n },\n thumbnail: {\n type: 'string',\n description: 'URL of the thumbnail image. This URL is used to access the thumbnail image of the file in the media library.\\n'\n },\n type: {\n type: 'string',\n description: 'Type of the asset.',\n enum: [ 'file',\n 'file-version'\n ]\n },\n updatedAt: {\n type: 'string',\n description: 'Date and time when the file was last updated. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n },\n url: {\n type: 'string',\n description: 'URL of the file.\\n'\n },\n versionInfo: {\n type: 'object',\n description: 'An object with details of the file version.\\n',\n properties: {\n id: {\n type: 'string',\n description: 'Unique identifier of the file version.'\n },\n name: {\n type: 'string',\n description: 'Name of the file version.'\n }\n }\n },\n width: {\n type: 'number',\n description: 'Width of the file.\\n'\n }\n }\n },\n folder: {\n type: 'object',\n title: 'Folder',\n properties: {\n createdAt: {\n type: 'string',\n description: 'Date and time when the folder was created. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n },\n folderId: {\n type: 'string',\n description: 'Unique identifier of the asset.'\n },\n folderPath: {\n type: 'string',\n description: 'Path of the folder. This is the path you would use in the URL to access the folder. For example, if the folder is at the root of the media library, the path will be /folder. If the folder is inside another folder named images, the path will be /images/folder.\\n'\n },\n name: {\n type: 'string',\n description: 'Name of the asset.'\n },\n type: {\n type: 'string',\n description: 'Type of the asset.',\n enum: [ 'folder'\n ]\n },\n updatedAt: {\n type: 'string',\n description: 'Date and time when the folder was last updated. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/cache/invalidation/create-cache-invalidation.ts b/packages/mcp-server/src/tools/cache/invalidation/create-cache-invalidation.ts
index 1e73f174..47d7e67d 100644
--- a/packages/mcp-server/src/tools/cache/invalidation/create-cache-invalidation.ts
+++ b/packages/mcp-server/src/tools/cache/invalidation/create-cache-invalidation.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'create_cache_invalidation',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API will purge CDN cache and ImageKit.io's internal cache for a file. Note: Purge cache is an asynchronous process and it may take some time to reflect the changes.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n requestId: {\n type: 'string',\n description: 'Unique identifier of the purge request. This can be used to check the status of the purge request.\\n'\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API will purge CDN cache and ImageKit.io's internal cache for a file. Note: Purge cache is an asynchronous process and it may take some time to reflect the changes.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/invalidation_create_response',\n $defs: {\n invalidation_create_response: {\n type: 'object',\n properties: {\n requestId: {\n type: 'string',\n description: 'Unique identifier of the purge request. This can be used to check the status of the purge request.\\n'\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/cache/invalidation/get-cache-invalidation.ts b/packages/mcp-server/src/tools/cache/invalidation/get-cache-invalidation.ts
index a9a7afc4..78b3a46b 100644
--- a/packages/mcp-server/src/tools/cache/invalidation/get-cache-invalidation.ts
+++ b/packages/mcp-server/src/tools/cache/invalidation/get-cache-invalidation.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'get_cache_invalidation',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API returns the status of a purge cache request.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n status: {\n type: 'string',\n description: 'Status of the purge request.',\n enum: [ 'Pending',\n 'Completed'\n ]\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API returns the status of a purge cache request.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/invalidation_get_response',\n $defs: {\n invalidation_get_response: {\n type: 'object',\n properties: {\n status: {\n type: 'string',\n description: 'Status of the purge request.',\n enum: [ 'Pending',\n 'Completed'\n ]\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/custom-metadata-fields/delete-custom-metadata-fields.ts b/packages/mcp-server/src/tools/custom-metadata-fields/delete-custom-metadata-fields.ts
index f26b7b65..334361cf 100644
--- a/packages/mcp-server/src/tools/custom-metadata-fields/delete-custom-metadata-fields.ts
+++ b/packages/mcp-server/src/tools/custom-metadata-fields/delete-custom-metadata-fields.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'delete_custom_metadata_fields',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API deletes a custom metadata field. Even after deleting a custom metadata field, you cannot create any new custom metadata field with the same name.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {}\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API deletes a custom metadata field. Even after deleting a custom metadata field, you cannot create any new custom metadata field with the same name.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/custom_metadata_field_delete_response',\n $defs: {\n custom_metadata_field_delete_response: {\n type: 'object',\n properties: {}\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/custom-metadata-fields/list-custom-metadata-fields.ts b/packages/mcp-server/src/tools/custom-metadata-fields/list-custom-metadata-fields.ts
index 0367d7d1..9aa77973 100644
--- a/packages/mcp-server/src/tools/custom-metadata-fields/list-custom-metadata-fields.ts
+++ b/packages/mcp-server/src/tools/custom-metadata-fields/list-custom-metadata-fields.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'list_custom_metadata_fields',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API returns the array of created custom metadata field objects. By default the API returns only non deleted field objects, but you can include deleted fields in the API response.\n\nYou can also filter results by a specific folder path to retrieve custom metadata fields applicable at that location. This path-specific filtering is useful when using the **Path policy** feature to determine which custom metadata fields are selected for a given path.\n\n\n# Response Schema\n```json\n{\n type: 'array',\n items: {\n $ref: '#/$defs/custom_metadata_field'\n },\n $defs: {\n custom_metadata_field: {\n type: 'object',\n description: 'Object containing details of a custom metadata field.',\n properties: {\n id: {\n type: 'string',\n description: 'Unique identifier for the custom metadata field. Use this to update the field.'\n },\n label: {\n type: 'string',\n description: 'Human readable name of the custom metadata field. This name is displayed as form field label to the users while setting field value on the asset in the media library UI.\\n'\n },\n name: {\n type: 'string',\n description: 'API name of the custom metadata field. This becomes the key while setting `customMetadata` (key-value object) for an asset using upload or update API.\\n'\n },\n schema: {\n type: 'object',\n description: 'An object that describes the rules for the custom metadata field value.',\n properties: {\n type: {\n type: 'string',\n description: 'Type of the custom metadata field.',\n enum: [ 'Text',\n 'Textarea',\n 'Number',\n 'Date',\n 'Boolean',\n 'SingleSelect',\n 'MultiSelect'\n ]\n },\n defaultValue: {\n anyOf: [ {\n type: 'string'\n },\n {\n type: 'number'\n },\n {\n type: 'boolean'\n },\n {\n type: 'array',\n title: 'Mixed',\n description: 'Default value should be of type array when custom metadata field type is set to `MultiSelect`.\\n',\n items: {\n anyOf: [ {\n type: 'string'\n },\n {\n type: 'number'\n },\n {\n type: 'boolean'\n }\n ]\n }\n }\n ],\n description: 'The default value for this custom metadata field. Data type of default value depends on the field type.\\n'\n },\n isValueRequired: {\n type: 'boolean',\n description: 'Specifies if the this custom metadata field is required or not.\\n'\n },\n maxLength: {\n type: 'number',\n description: 'Maximum length of string. Only set if `type` is set to `Text` or `Textarea`.\\n'\n },\n maxValue: {\n anyOf: [ {\n type: 'string'\n },\n {\n type: 'number'\n }\n ],\n description: 'Maximum value of the field. Only set if field type is `Date` or `Number`. For `Date` type field, the value will be in ISO8601 string format. For `Number` type field, it will be a numeric value.\\n'\n },\n minLength: {\n type: 'number',\n description: 'Minimum length of string. Only set if `type` is set to `Text` or `Textarea`.\\n'\n },\n minValue: {\n anyOf: [ {\n type: 'string'\n },\n {\n type: 'number'\n }\n ],\n description: 'Minimum value of the field. Only set if field type is `Date` or `Number`. For `Date` type field, the value will be in ISO8601 string format. For `Number` type field, it will be a numeric value.\\n'\n },\n selectOptions: {\n type: 'array',\n description: 'An array of allowed values when field type is `SingleSelect` or `MultiSelect`.\\n',\n items: {\n anyOf: [ {\n type: 'string'\n },\n {\n type: 'number'\n },\n {\n type: 'boolean'\n }\n ]\n }\n }\n },\n required: [ 'type'\n ]\n }\n },\n required: [ 'id',\n 'label',\n 'name',\n 'schema'\n ]\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API returns the array of created custom metadata field objects. By default the API returns only non deleted field objects, but you can include deleted fields in the API response.\n\nYou can also filter results by a specific folder path to retrieve custom metadata fields applicable at that location. This path-specific filtering is useful when using the **Path policy** feature to determine which custom metadata fields are selected for a given path.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/custom_metadata_field_list_response',\n $defs: {\n custom_metadata_field_list_response: {\n type: 'array',\n items: {\n $ref: '#/$defs/custom_metadata_field'\n }\n },\n custom_metadata_field: {\n type: 'object',\n description: 'Object containing details of a custom metadata field.',\n properties: {\n id: {\n type: 'string',\n description: 'Unique identifier for the custom metadata field. Use this to update the field.'\n },\n label: {\n type: 'string',\n description: 'Human readable name of the custom metadata field. This name is displayed as form field label to the users while setting field value on the asset in the media library UI.\\n'\n },\n name: {\n type: 'string',\n description: 'API name of the custom metadata field. This becomes the key while setting `customMetadata` (key-value object) for an asset using upload or update API.\\n'\n },\n schema: {\n type: 'object',\n description: 'An object that describes the rules for the custom metadata field value.',\n properties: {\n type: {\n type: 'string',\n description: 'Type of the custom metadata field.',\n enum: [ 'Text',\n 'Textarea',\n 'Number',\n 'Date',\n 'Boolean',\n 'SingleSelect',\n 'MultiSelect'\n ]\n },\n defaultValue: {\n anyOf: [ {\n type: 'string'\n },\n {\n type: 'number'\n },\n {\n type: 'boolean'\n },\n {\n type: 'array',\n title: 'Mixed',\n description: 'Default value should be of type array when custom metadata field type is set to `MultiSelect`.\\n',\n items: {\n anyOf: [ {\n type: 'string'\n },\n {\n type: 'number'\n },\n {\n type: 'boolean'\n }\n ]\n }\n }\n ],\n description: 'The default value for this custom metadata field. Data type of default value depends on the field type.\\n'\n },\n isValueRequired: {\n type: 'boolean',\n description: 'Specifies if the this custom metadata field is required or not.\\n'\n },\n maxLength: {\n type: 'number',\n description: 'Maximum length of string. Only set if `type` is set to `Text` or `Textarea`.\\n'\n },\n maxValue: {\n anyOf: [ {\n type: 'string'\n },\n {\n type: 'number'\n }\n ],\n description: 'Maximum value of the field. Only set if field type is `Date` or `Number`. For `Date` type field, the value will be in ISO8601 string format. For `Number` type field, it will be a numeric value.\\n'\n },\n minLength: {\n type: 'number',\n description: 'Minimum length of string. Only set if `type` is set to `Text` or `Textarea`.\\n'\n },\n minValue: {\n anyOf: [ {\n type: 'string'\n },\n {\n type: 'number'\n }\n ],\n description: 'Minimum value of the field. Only set if field type is `Date` or `Number`. For `Date` type field, the value will be in ISO8601 string format. For `Number` type field, it will be a numeric value.\\n'\n },\n selectOptions: {\n type: 'array',\n description: 'An array of allowed values when field type is `SingleSelect` or `MultiSelect`.\\n',\n items: {\n anyOf: [ {\n type: 'string'\n },\n {\n type: 'number'\n },\n {\n type: 'boolean'\n }\n ]\n }\n }\n },\n required: [ 'type'\n ]\n }\n },\n required: [ 'id',\n 'label',\n 'name',\n 'schema'\n ]\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/files/bulk/add-tags-files-bulk.ts b/packages/mcp-server/src/tools/files/bulk/add-tags-files-bulk.ts
index 3aa9970c..3c163c97 100644
--- a/packages/mcp-server/src/tools/files/bulk/add-tags-files-bulk.ts
+++ b/packages/mcp-server/src/tools/files/bulk/add-tags-files-bulk.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'add_tags_files_bulk',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API adds tags to multiple files in bulk. A maximum of 50 files can be specified at a time.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n successfullyUpdatedFileIds: {\n type: 'array',\n description: 'An array of fileIds that in which tags were successfully added.\\n',\n items: {\n type: 'string'\n }\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API adds tags to multiple files in bulk. A maximum of 50 files can be specified at a time.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/bulk_add_tags_response',\n $defs: {\n bulk_add_tags_response: {\n type: 'object',\n properties: {\n successfullyUpdatedFileIds: {\n type: 'array',\n description: 'An array of fileIds that in which tags were successfully added.\\n',\n items: {\n type: 'string'\n }\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/files/bulk/delete-files-bulk.ts b/packages/mcp-server/src/tools/files/bulk/delete-files-bulk.ts
index 471b0c93..8527fb8d 100644
--- a/packages/mcp-server/src/tools/files/bulk/delete-files-bulk.ts
+++ b/packages/mcp-server/src/tools/files/bulk/delete-files-bulk.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'delete_files_bulk',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API deletes multiple files and all their file versions permanently.\n\nNote: If a file or specific transformation has been requested in the past, then the response is cached. Deleting a file does not purge the cache. You can purge the cache using purge cache API.\n\nA maximum of 100 files can be deleted at a time.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n successfullyDeletedFileIds: {\n type: 'array',\n description: 'An array of fileIds that were successfully deleted.\\n',\n items: {\n type: 'string'\n }\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API deletes multiple files and all their file versions permanently.\n\nNote: If a file or specific transformation has been requested in the past, then the response is cached. Deleting a file does not purge the cache. You can purge the cache using purge cache API.\n\nA maximum of 100 files can be deleted at a time.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/bulk_delete_response',\n $defs: {\n bulk_delete_response: {\n type: 'object',\n properties: {\n successfullyDeletedFileIds: {\n type: 'array',\n description: 'An array of fileIds that were successfully deleted.\\n',\n items: {\n type: 'string'\n }\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/files/bulk/remove-ai-tags-files-bulk.ts b/packages/mcp-server/src/tools/files/bulk/remove-ai-tags-files-bulk.ts
index 28ea4b62..3632b0c1 100644
--- a/packages/mcp-server/src/tools/files/bulk/remove-ai-tags-files-bulk.ts
+++ b/packages/mcp-server/src/tools/files/bulk/remove-ai-tags-files-bulk.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'remove_ai_tags_files_bulk',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API removes AITags from multiple files in bulk. A maximum of 50 files can be specified at a time.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n successfullyUpdatedFileIds: {\n type: 'array',\n description: 'An array of fileIds that in which AITags were successfully removed.\\n',\n items: {\n type: 'string'\n }\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API removes AITags from multiple files in bulk. A maximum of 50 files can be specified at a time.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/bulk_remove_ai_tags_response',\n $defs: {\n bulk_remove_ai_tags_response: {\n type: 'object',\n properties: {\n successfullyUpdatedFileIds: {\n type: 'array',\n description: 'An array of fileIds that in which AITags were successfully removed.\\n',\n items: {\n type: 'string'\n }\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/files/bulk/remove-tags-files-bulk.ts b/packages/mcp-server/src/tools/files/bulk/remove-tags-files-bulk.ts
index 2fd2661e..63efd0e0 100644
--- a/packages/mcp-server/src/tools/files/bulk/remove-tags-files-bulk.ts
+++ b/packages/mcp-server/src/tools/files/bulk/remove-tags-files-bulk.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'remove_tags_files_bulk',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API removes tags from multiple files in bulk. A maximum of 50 files can be specified at a time.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n successfullyUpdatedFileIds: {\n type: 'array',\n description: 'An array of fileIds that in which tags were successfully removed.\\n',\n items: {\n type: 'string'\n }\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API removes tags from multiple files in bulk. A maximum of 50 files can be specified at a time.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/bulk_remove_tags_response',\n $defs: {\n bulk_remove_tags_response: {\n type: 'object',\n properties: {\n successfullyUpdatedFileIds: {\n type: 'array',\n description: 'An array of fileIds that in which tags were successfully removed.\\n',\n items: {\n type: 'string'\n }\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/files/copy-files.ts b/packages/mcp-server/src/tools/files/copy-files.ts
index 6dffab77..27fd670a 100644
--- a/packages/mcp-server/src/tools/files/copy-files.ts
+++ b/packages/mcp-server/src/tools/files/copy-files.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'copy_files',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will copy a file from one folder to another. \n\nNote: If any file at the destination has the same name as the source file, then the source file and its versions (if `includeFileVersions` is set to true) will be appended to the destination file version history.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {}\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will copy a file from one folder to another. \n\nNote: If any file at the destination has the same name as the source file, then the source file and its versions (if `includeFileVersions` is set to true) will be appended to the destination file version history.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/file_copy_response',\n $defs: {\n file_copy_response: {\n type: 'object',\n properties: {}\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/files/move-files.ts b/packages/mcp-server/src/tools/files/move-files.ts
index 48c159a2..4539db6e 100644
--- a/packages/mcp-server/src/tools/files/move-files.ts
+++ b/packages/mcp-server/src/tools/files/move-files.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'move_files',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will move a file and all its versions from one folder to another. \n\nNote: If any file at the destination has the same name as the source file, then the source file and its versions will be appended to the destination file.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {}\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will move a file and all its versions from one folder to another. \n\nNote: If any file at the destination has the same name as the source file, then the source file and its versions will be appended to the destination file.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/file_move_response',\n $defs: {\n file_move_response: {\n type: 'object',\n properties: {}\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/files/rename-files.ts b/packages/mcp-server/src/tools/files/rename-files.ts
index 2e76c956..97484634 100644
--- a/packages/mcp-server/src/tools/files/rename-files.ts
+++ b/packages/mcp-server/src/tools/files/rename-files.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'rename_files',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nYou can rename an already existing file in the media library using rename file API. This operation would rename all file versions of the file. \n\nNote: The old URLs will stop working. The file/file version URLs cached on CDN will continue to work unless a purge is requested.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n purgeRequestId: {\n type: 'string',\n description: 'Unique identifier of the purge request. This can be used to check the status of the purge request.\\n'\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nYou can rename an already existing file in the media library using rename file API. This operation would rename all file versions of the file. \n\nNote: The old URLs will stop working. The file/file version URLs cached on CDN will continue to work unless a purge is requested.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/file_rename_response',\n $defs: {\n file_rename_response: {\n type: 'object',\n properties: {\n purgeRequestId: {\n type: 'string',\n description: 'Unique identifier of the purge request. This can be used to check the status of the purge request.\\n'\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/files/versions/delete-files-versions.ts b/packages/mcp-server/src/tools/files/versions/delete-files-versions.ts
index df4b1b92..17700066 100644
--- a/packages/mcp-server/src/tools/files/versions/delete-files-versions.ts
+++ b/packages/mcp-server/src/tools/files/versions/delete-files-versions.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'delete_files_versions',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API deletes a non-current file version permanently. The API returns an empty response.\n\nNote: If you want to delete all versions of a file, use the delete file API.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {}\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API deletes a non-current file version permanently. The API returns an empty response.\n\nNote: If you want to delete all versions of a file, use the delete file API.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/version_delete_response',\n $defs: {\n version_delete_response: {\n type: 'object',\n properties: {}\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/files/versions/list-files-versions.ts b/packages/mcp-server/src/tools/files/versions/list-files-versions.ts
index 7ea542e2..b520c583 100644
--- a/packages/mcp-server/src/tools/files/versions/list-files-versions.ts
+++ b/packages/mcp-server/src/tools/files/versions/list-files-versions.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'list_files_versions',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API returns details of all versions of a file.\n\n\n# Response Schema\n```json\n{\n type: 'array',\n items: {\n $ref: '#/$defs/file'\n },\n $defs: {\n file: {\n type: 'object',\n title: 'File & File Version',\n description: 'Object containing details of a file or file version.',\n properties: {\n AITags: {\n type: 'array',\n description: 'An array of tags assigned to the file by auto tagging.\\n',\n items: {\n type: 'object',\n properties: {\n confidence: {\n type: 'number',\n description: 'Confidence score of the tag.'\n },\n name: {\n type: 'string',\n description: 'Name of the tag.'\n },\n source: {\n type: 'string',\n description: 'Source of the tag. Possible values are `google-auto-tagging` and `aws-auto-tagging`.'\n }\n }\n }\n },\n createdAt: {\n type: 'string',\n description: 'Date and time when the file was uploaded. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n },\n customCoordinates: {\n type: 'string',\n description: 'An string with custom coordinates of the file.\\n'\n },\n customMetadata: {\n type: 'object',\n description: 'An object with custom metadata for the file.\\n',\n additionalProperties: true\n },\n description: {\n type: 'string',\n description: 'Optional text to describe the contents of the file. Can be set by the user or the ai-auto-description extension.\\n'\n },\n fileId: {\n type: 'string',\n description: 'Unique identifier of the asset.'\n },\n filePath: {\n type: 'string',\n description: 'Path of the file. This is the path you would use in the URL to access the file. For example, if the file is at the root of the media library, the path will be `/file.jpg`. If the file is inside a folder named `images`, the path will be `/images/file.jpg`.\\n'\n },\n fileType: {\n type: 'string',\n description: 'Type of the file. Possible values are `image`, `non-image`.\\n'\n },\n hasAlpha: {\n type: 'boolean',\n description: 'Specifies if the image has an alpha channel.\\n'\n },\n height: {\n type: 'number',\n description: 'Height of the file.\\n'\n },\n isPrivateFile: {\n type: 'boolean',\n description: 'Specifies if the file is private or not.\\n'\n },\n isPublished: {\n type: 'boolean',\n description: 'Specifies if the file is published or not.\\n'\n },\n mime: {\n type: 'string',\n description: 'MIME type of the file.\\n'\n },\n name: {\n type: 'string',\n description: 'Name of the asset.'\n },\n selectedFieldsSchema: {\n type: 'object',\n description: 'This field is included in the response only if the Path policy feature is available in the plan.\\nIt contains schema definitions for the custom metadata fields selected for the specified file path.\\nField selection can only be done when the Path policy feature is enabled.\\n\\nKeys are the names of the custom metadata fields; the value object has details about the custom metadata schema.\\n',\n additionalProperties: true\n },\n size: {\n type: 'number',\n description: 'Size of the file in bytes.\\n'\n },\n tags: {\n type: 'array',\n description: 'An array of tags assigned to the file. Tags are used to search files in the media library.\\n',\n items: {\n type: 'string'\n }\n },\n thumbnail: {\n type: 'string',\n description: 'URL of the thumbnail image. This URL is used to access the thumbnail image of the file in the media library.\\n'\n },\n type: {\n type: 'string',\n description: 'Type of the asset.',\n enum: [ 'file',\n 'file-version'\n ]\n },\n updatedAt: {\n type: 'string',\n description: 'Date and time when the file was last updated. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n },\n url: {\n type: 'string',\n description: 'URL of the file.\\n'\n },\n versionInfo: {\n type: 'object',\n description: 'An object with details of the file version.\\n',\n properties: {\n id: {\n type: 'string',\n description: 'Unique identifier of the file version.'\n },\n name: {\n type: 'string',\n description: 'Name of the file version.'\n }\n }\n },\n width: {\n type: 'number',\n description: 'Width of the file.\\n'\n }\n }\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API returns details of all versions of a file.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/version_list_response',\n $defs: {\n version_list_response: {\n type: 'array',\n items: {\n $ref: '#/$defs/file'\n }\n },\n file: {\n type: 'object',\n title: 'File & File Version',\n description: 'Object containing details of a file or file version.',\n properties: {\n AITags: {\n type: 'array',\n description: 'An array of tags assigned to the file by auto tagging.\\n',\n items: {\n type: 'object',\n properties: {\n confidence: {\n type: 'number',\n description: 'Confidence score of the tag.'\n },\n name: {\n type: 'string',\n description: 'Name of the tag.'\n },\n source: {\n type: 'string',\n description: 'Source of the tag. Possible values are `google-auto-tagging` and `aws-auto-tagging`.'\n }\n }\n }\n },\n createdAt: {\n type: 'string',\n description: 'Date and time when the file was uploaded. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n },\n customCoordinates: {\n type: 'string',\n description: 'An string with custom coordinates of the file.\\n'\n },\n customMetadata: {\n type: 'object',\n description: 'An object with custom metadata for the file.\\n',\n additionalProperties: true\n },\n description: {\n type: 'string',\n description: 'Optional text to describe the contents of the file. Can be set by the user or the ai-auto-description extension.\\n'\n },\n fileId: {\n type: 'string',\n description: 'Unique identifier of the asset.'\n },\n filePath: {\n type: 'string',\n description: 'Path of the file. This is the path you would use in the URL to access the file. For example, if the file is at the root of the media library, the path will be `/file.jpg`. If the file is inside a folder named `images`, the path will be `/images/file.jpg`.\\n'\n },\n fileType: {\n type: 'string',\n description: 'Type of the file. Possible values are `image`, `non-image`.\\n'\n },\n hasAlpha: {\n type: 'boolean',\n description: 'Specifies if the image has an alpha channel.\\n'\n },\n height: {\n type: 'number',\n description: 'Height of the file.\\n'\n },\n isPrivateFile: {\n type: 'boolean',\n description: 'Specifies if the file is private or not.\\n'\n },\n isPublished: {\n type: 'boolean',\n description: 'Specifies if the file is published or not.\\n'\n },\n mime: {\n type: 'string',\n description: 'MIME type of the file.\\n'\n },\n name: {\n type: 'string',\n description: 'Name of the asset.'\n },\n selectedFieldsSchema: {\n type: 'object',\n description: 'This field is included in the response only if the Path policy feature is available in the plan.\\nIt contains schema definitions for the custom metadata fields selected for the specified file path.\\nField selection can only be done when the Path policy feature is enabled.\\n\\nKeys are the names of the custom metadata fields; the value object has details about the custom metadata schema.\\n',\n additionalProperties: true\n },\n size: {\n type: 'number',\n description: 'Size of the file in bytes.\\n'\n },\n tags: {\n type: 'array',\n description: 'An array of tags assigned to the file. Tags are used to search files in the media library.\\n',\n items: {\n type: 'string'\n }\n },\n thumbnail: {\n type: 'string',\n description: 'URL of the thumbnail image. This URL is used to access the thumbnail image of the file in the media library.\\n'\n },\n type: {\n type: 'string',\n description: 'Type of the asset.',\n enum: [ 'file',\n 'file-version'\n ]\n },\n updatedAt: {\n type: 'string',\n description: 'Date and time when the file was last updated. The date and time is in ISO8601 format.\\n',\n format: 'date-time'\n },\n url: {\n type: 'string',\n description: 'URL of the file.\\n'\n },\n versionInfo: {\n type: 'object',\n description: 'An object with details of the file version.\\n',\n properties: {\n id: {\n type: 'string',\n description: 'Unique identifier of the file version.'\n },\n name: {\n type: 'string',\n description: 'Name of the file version.'\n }\n }\n },\n width: {\n type: 'number',\n description: 'Width of the file.\\n'\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/folders/copy-folders.ts b/packages/mcp-server/src/tools/folders/copy-folders.ts
index b1efd5fe..8dd9e326 100644
--- a/packages/mcp-server/src/tools/folders/copy-folders.ts
+++ b/packages/mcp-server/src/tools/folders/copy-folders.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'copy_folders',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will copy one folder into another. The selected folder, its nested folders, files, and their versions (in `includeVersions` is set to true) are copied in this operation. Note: If any file at the destination has the same name as the source file, then the source file and its versions will be appended to the destination file version history.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n title: 'Async Bulk Job Response',\n description: 'Job submitted successfully. A `jobId` will be returned.',\n properties: {\n jobId: {\n type: 'string',\n description: 'Unique identifier of the bulk job. This can be used to check the status of the bulk job.\\n'\n }\n },\n required: [ 'jobId'\n ]\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will copy one folder into another. The selected folder, its nested folders, files, and their versions (in `includeVersions` is set to true) are copied in this operation. Note: If any file at the destination has the same name as the source file, then the source file and its versions will be appended to the destination file version history.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/folder_copy_response',\n $defs: {\n folder_copy_response: {\n type: 'object',\n title: 'Async Bulk Job Response',\n description: 'Job submitted successfully. A `jobId` will be returned.',\n properties: {\n jobId: {\n type: 'string',\n description: 'Unique identifier of the bulk job. This can be used to check the status of the bulk job.\\n'\n }\n },\n required: [ 'jobId'\n ]\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/folders/create-folders.ts b/packages/mcp-server/src/tools/folders/create-folders.ts
index 365f3b02..70d49c57 100644
--- a/packages/mcp-server/src/tools/folders/create-folders.ts
+++ b/packages/mcp-server/src/tools/folders/create-folders.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'create_folders',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will create a new folder. You can specify the folder name and location of the parent folder where this new folder should be created.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {}\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will create a new folder. You can specify the folder name and location of the parent folder where this new folder should be created.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/folder_create_response',\n $defs: {\n folder_create_response: {\n type: 'object',\n properties: {}\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/folders/delete-folders.ts b/packages/mcp-server/src/tools/folders/delete-folders.ts
index b58d0819..b8e4f32b 100644
--- a/packages/mcp-server/src/tools/folders/delete-folders.ts
+++ b/packages/mcp-server/src/tools/folders/delete-folders.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'delete_folders',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will delete a folder and all its contents permanently. The API returns an empty response.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {}\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will delete a folder and all its contents permanently. The API returns an empty response.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/folder_delete_response',\n $defs: {\n folder_delete_response: {\n type: 'object',\n properties: {}\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/folders/job/get-folders-job.ts b/packages/mcp-server/src/tools/folders/job/get-folders-job.ts
index 19ca4ef2..a2704f98 100644
--- a/packages/mcp-server/src/tools/folders/job/get-folders-job.ts
+++ b/packages/mcp-server/src/tools/folders/job/get-folders-job.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'get_folders_job',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API returns the status of a bulk job like copy and move folder operations.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n jobId: {\n type: 'string',\n description: 'Unique identifier of the bulk job.\\n'\n },\n purgeRequestId: {\n type: 'string',\n description: 'Unique identifier of the purge request. This will be present only if `purgeCache` is set to `true` in the rename folder API request.\\n'\n },\n status: {\n type: 'string',\n description: 'Status of the bulk job.',\n enum: [ 'Pending',\n 'Completed'\n ]\n },\n type: {\n type: 'string',\n description: 'Type of the bulk job.',\n enum: [ 'COPY_FOLDER',\n 'MOVE_FOLDER',\n 'RENAME_FOLDER'\n ]\n }\n }\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API returns the status of a bulk job like copy and move folder operations.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/job_get_response',\n $defs: {\n job_get_response: {\n type: 'object',\n properties: {\n jobId: {\n type: 'string',\n description: 'Unique identifier of the bulk job.\\n'\n },\n purgeRequestId: {\n type: 'string',\n description: 'Unique identifier of the purge request. This will be present only if `purgeCache` is set to `true` in the rename folder API request.\\n'\n },\n status: {\n type: 'string',\n description: 'Status of the bulk job.',\n enum: [ 'Pending',\n 'Completed'\n ]\n },\n type: {\n type: 'string',\n description: 'Type of the bulk job.',\n enum: [ 'COPY_FOLDER',\n 'MOVE_FOLDER',\n 'RENAME_FOLDER'\n ]\n }\n }\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/folders/move-folders.ts b/packages/mcp-server/src/tools/folders/move-folders.ts
index 9131e342..e315003a 100644
--- a/packages/mcp-server/src/tools/folders/move-folders.ts
+++ b/packages/mcp-server/src/tools/folders/move-folders.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'move_folders',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will move one folder into another. The selected folder, its nested folders, files, and their versions are moved in this operation. Note: If any file at the destination has the same name as the source file, then the source file and its versions will be appended to the destination file version history.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n title: 'Async Bulk Job Response',\n description: 'Job submitted successfully. A `jobId` will be returned.',\n properties: {\n jobId: {\n type: 'string',\n description: 'Unique identifier of the bulk job. This can be used to check the status of the bulk job.\\n'\n }\n },\n required: [ 'jobId'\n ]\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis will move one folder into another. The selected folder, its nested folders, files, and their versions are moved in this operation. Note: If any file at the destination has the same name as the source file, then the source file and its versions will be appended to the destination file version history.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/folder_move_response',\n $defs: {\n folder_move_response: {\n type: 'object',\n title: 'Async Bulk Job Response',\n description: 'Job submitted successfully. A `jobId` will be returned.',\n properties: {\n jobId: {\n type: 'string',\n description: 'Unique identifier of the bulk job. This can be used to check the status of the bulk job.\\n'\n }\n },\n required: [ 'jobId'\n ]\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/src/tools/folders/rename-folders.ts b/packages/mcp-server/src/tools/folders/rename-folders.ts
index 83c54224..2822faac 100644
--- a/packages/mcp-server/src/tools/folders/rename-folders.ts
+++ b/packages/mcp-server/src/tools/folders/rename-folders.ts
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
export const tool: Tool = {
name: 'rename_folders',
description:
- "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API allows you to rename an existing folder. The folder and all its nested assets and sub-folders will remain unchanged, but their paths will be updated to reflect the new folder name.\n\n\n# Response Schema\n```json\n{\n type: 'object',\n title: 'Async Bulk Job Response',\n description: 'Job submitted successfully. A `jobId` will be returned.',\n properties: {\n jobId: {\n type: 'string',\n description: 'Unique identifier of the bulk job. This can be used to check the status of the bulk job.\\n'\n }\n },\n required: [ 'jobId'\n ]\n}\n```",
+ "When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nThis API allows you to rename an existing folder. The folder and all its nested assets and sub-folders will remain unchanged, but their paths will be updated to reflect the new folder name.\n\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/folder_rename_response',\n $defs: {\n folder_rename_response: {\n type: 'object',\n title: 'Async Bulk Job Response',\n description: 'Job submitted successfully. A `jobId` will be returned.',\n properties: {\n jobId: {\n type: 'string',\n description: 'Unique identifier of the bulk job. This can be used to check the status of the bulk job.\\n'\n }\n },\n required: [ 'jobId'\n ]\n }\n }\n}\n```",
inputSchema: {
type: 'object',
properties: {
diff --git a/packages/mcp-server/tests/options.test.ts b/packages/mcp-server/tests/options.test.ts
index a8a5b81a..4d9b60ca 100644
--- a/packages/mcp-server/tests/options.test.ts
+++ b/packages/mcp-server/tests/options.test.ts
@@ -171,6 +171,7 @@ describe('parseQueryOptions', () => {
const defaultOptions = {
client: undefined,
includeDynamicTools: undefined,
+ includeCodeTools: undefined,
includeAllTools: undefined,
filters: [],
capabilities: {
@@ -383,6 +384,27 @@ describe('parseQueryOptions', () => {
{ type: 'tool', op: 'exclude', value: 'exclude-tool' },
]);
});
+
+ it('code tools are enabled on http servers with default option set', () => {
+ const query = 'tools=code';
+ const result = parseQueryOptions({ ...defaultOptions, includeCodeTools: true }, query);
+
+ expect(result.includeCodeTools).toBe(true);
+ });
+
+ it('code tools are prevented on http servers when no default option set', () => {
+ const query = 'tools=code';
+ const result = parseQueryOptions(defaultOptions, query);
+
+ expect(result.includeCodeTools).toBe(undefined);
+ });
+
+ it('code tools are prevented on http servers when default option is explicitly false', () => {
+ const query = 'tools=code';
+ const result = parseQueryOptions({ ...defaultOptions, includeCodeTools: false }, query);
+
+ expect(result.includeCodeTools).toBe(false);
+ });
});
describe('parseEmbeddedJSON', () => {
diff --git a/scripts/utils/upload-artifact.sh b/scripts/utils/upload-artifact.sh
index 0870aebc..e169cf10 100755
--- a/scripts/utils/upload-artifact.sh
+++ b/scripts/utils/upload-artifact.sh
@@ -12,9 +12,11 @@ if [[ "$SIGNED_URL" == "null" ]]; then
exit 1
fi
-UPLOAD_RESPONSE=$(tar "${BASE_PATH:+-C$BASE_PATH}" -cz "${ARTIFACT_PATH:-dist}" | curl -v -X PUT \
+TARBALL=$(cd dist && npm pack --silent)
+
+UPLOAD_RESPONSE=$(curl -v -X PUT \
-H "Content-Type: application/gzip" \
- --data-binary @- "$SIGNED_URL" 2>&1)
+ --data-binary "@dist/$TARBALL" "$SIGNED_URL" 2>&1)
if echo "$UPLOAD_RESPONSE" | grep -q "HTTP/[0-9.]* 200"; then
echo -e "\033[32mUploaded build to Stainless storage.\033[0m"
diff --git a/src/client.ts b/src/client.ts
index 1560e2bc..55424b8f 100644
--- a/src/client.ts
+++ b/src/client.ts
@@ -911,10 +911,12 @@ export declare namespace ImageKit {
export type BaseOverlay = API.BaseOverlay;
export type Extensions = API.Extensions;
+ export type GetImageAttributesOptions = API.GetImageAttributesOptions;
export type ImageOverlay = API.ImageOverlay;
export type Overlay = API.Overlay;
export type OverlayPosition = API.OverlayPosition;
export type OverlayTiming = API.OverlayTiming;
+ export type ResponsiveImageAttributes = API.ResponsiveImageAttributes;
export type SolidColorOverlay = API.SolidColorOverlay;
export type SolidColorOverlayTransformation = API.SolidColorOverlayTransformation;
export type SrcOptions = API.SrcOptions;
diff --git a/src/resources/shared.ts b/src/resources/shared.ts
index 6d73d695..9ecb5fcf 100644
--- a/src/resources/shared.ts
+++ b/src/resources/shared.ts
@@ -78,6 +78,54 @@ export namespace Extensions {
}
}
+/**
+ * Options for generating responsive image attributes including `src`, `srcSet`,
+ * and `sizes` for HTML `
` elements. This schema extends `SrcOptions` to add
+ * support for responsive image generation with breakpoints.
+ */
+export interface GetImageAttributesOptions extends SrcOptions {
+ /**
+ * Custom list of **device-width breakpoints** in pixels. These define common
+ * screen widths for responsive image generation.
+ *
+ * Defaults to `[640, 750, 828, 1080, 1200, 1920, 2048, 3840]`. Sorted
+ * automatically.
+ */
+ deviceBreakpoints?: Array;
+
+ /**
+ * Custom list of **image-specific breakpoints** in pixels. Useful for generating
+ * small variants (e.g., placeholders or thumbnails).
+ *
+ * Merged with `deviceBreakpoints` before calculating `srcSet`. Defaults to
+ * `[16, 32, 48, 64, 96, 128, 256, 384]`. Sorted automatically.
+ */
+ imageBreakpoints?: Array;
+
+ /**
+ * The value for the HTML `sizes` attribute (e.g., `"100vw"` or
+ * `"(min-width:768px) 50vw, 100vw"`).
+ *
+ * - If it includes one or more `vw` units, breakpoints smaller than the
+ * corresponding percentage of the smallest device width are excluded.
+ * - If it contains no `vw` units, the full breakpoint list is used.
+ *
+ * Enables a width-based strategy and generates `w` descriptors in `srcSet`.
+ */
+ sizes?: string;
+
+ /**
+ * The intended display width of the image in pixels, used **only when the `sizes`
+ * attribute is not provided**.
+ *
+ * Triggers a DPR-based strategy (1x and 2x variants) and generates `x` descriptors
+ * in `srcSet`.
+ *
+ * Ignored if `sizes` is present.
+ */
+ width?: number;
+}
+
export interface ImageOverlay extends BaseOverlay {
/**
* Specifies the relative path to the image used as an overlay.
@@ -175,6 +223,34 @@ export interface OverlayTiming {
start?: number | string;
}
+/**
+ * Resulting set of attributes suitable for an HTML `
` element. Useful for
+ * enabling responsive image loading with `srcSet` and `sizes`.
+ */
+export interface ResponsiveImageAttributes {
+ /**
+ * URL for the _largest_ candidate (assigned to plain `src`).
+ */
+ src: string;
+
+ /**
+ * `sizes` returned (or synthesised as `100vw`). The value for the HTML `sizes`
+ * attribute.
+ */
+ sizes?: string;
+
+ /**
+ * Candidate set with `w` or `x` descriptors. Multiple image URLs separated by
+ * commas, each with a descriptor.
+ */
+ srcSet?: string;
+
+ /**
+ * Width as a number (if `width` was provided in the input options).
+ */
+ width?: number;
+}
+
export interface SolidColorOverlay extends BaseOverlay {
/**
* Specifies the color of the block using an RGB hex code (e.g., `FF0000`), an RGBA
diff --git a/src/version.ts b/src/version.ts
index 60c81603..915a686a 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1 +1 @@
-export const VERSION = '7.1.1'; // x-release-please-version
+export const VERSION = '7.2.0'; // x-release-please-version