Skip to content

Commit d1949db

Browse files
fix(mcp): return tool execution error on jq failure
1 parent 00789ac commit d1949db

34 files changed

+346
-104
lines changed

packages/mcp-server/src/filtering.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,7 @@ export async function maybeFilter(jqFilter: unknown | undefined, response: any):
1212
async function jq(json: any, jqFilter: string) {
1313
return (await initJq).json(json, jqFilter);
1414
}
15+
16+
export function isJqError(error: any): error is Error {
17+
return error instanceof Error && 'stderr' in error;
18+
}

packages/mcp-server/src/tools/accounts/url-endpoints/create-accounts-url-endpoints.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
import { maybeFilter } from '@imagekit/api-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@imagekit/api-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@imagekit/api-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@imagekit/api-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import ImageKit from '@imagekit/nodejs';
@@ -97,7 +97,14 @@ export const tool: Tool = {
9797

9898
export const handler = async (client: ImageKit, args: Record<string, unknown> | undefined) => {
9999
const { jq_filter, ...body } = args as any;
100-
return asTextContentResult(await maybeFilter(jq_filter, await client.accounts.urlEndpoints.create(body)));
100+
try {
101+
return asTextContentResult(await maybeFilter(jq_filter, await client.accounts.urlEndpoints.create(body)));
102+
} catch (error) {
103+
if (isJqError(error)) {
104+
return asErrorResult(error.message);
105+
}
106+
throw error;
107+
}
101108
};
102109

103110
export default { metadata, tool, handler };

packages/mcp-server/src/tools/accounts/url-endpoints/get-accounts-url-endpoints.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
import { maybeFilter } from '@imagekit/api-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@imagekit/api-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@imagekit/api-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@imagekit/api-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import ImageKit from '@imagekit/nodejs';
@@ -43,7 +43,14 @@ export const tool: Tool = {
4343

4444
export const handler = async (client: ImageKit, args: Record<string, unknown> | undefined) => {
4545
const { id, jq_filter, ...body } = args as any;
46-
return asTextContentResult(await maybeFilter(jq_filter, await client.accounts.urlEndpoints.get(id)));
46+
try {
47+
return asTextContentResult(await maybeFilter(jq_filter, await client.accounts.urlEndpoints.get(id)));
48+
} catch (error) {
49+
if (isJqError(error)) {
50+
return asErrorResult(error.message);
51+
}
52+
throw error;
53+
}
4754
};
4855

4956
export default { metadata, tool, handler };

packages/mcp-server/src/tools/accounts/url-endpoints/list-accounts-url-endpoints.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
import { maybeFilter } from '@imagekit/api-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@imagekit/api-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@imagekit/api-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@imagekit/api-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import ImageKit from '@imagekit/nodejs';
@@ -38,7 +38,14 @@ export const tool: Tool = {
3838

3939
export const handler = async (client: ImageKit, args: Record<string, unknown> | undefined) => {
4040
const { jq_filter } = args as any;
41-
return asTextContentResult(await maybeFilter(jq_filter, await client.accounts.urlEndpoints.list()));
41+
try {
42+
return asTextContentResult(await maybeFilter(jq_filter, await client.accounts.urlEndpoints.list()));
43+
} catch (error) {
44+
if (isJqError(error)) {
45+
return asErrorResult(error.message);
46+
}
47+
throw error;
48+
}
4249
};
4350

4451
export default { metadata, tool, handler };

packages/mcp-server/src/tools/accounts/url-endpoints/update-accounts-url-endpoints.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
import { maybeFilter } from '@imagekit/api-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@imagekit/api-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@imagekit/api-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@imagekit/api-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import ImageKit from '@imagekit/nodejs';
@@ -104,9 +104,16 @@ export const tool: Tool = {
104104

105105
export const handler = async (client: ImageKit, args: Record<string, unknown> | undefined) => {
106106
const { id, jq_filter, ...body } = args as any;
107-
return asTextContentResult(
108-
await maybeFilter(jq_filter, await client.accounts.urlEndpoints.update(id, body)),
109-
);
107+
try {
108+
return asTextContentResult(
109+
await maybeFilter(jq_filter, await client.accounts.urlEndpoints.update(id, body)),
110+
);
111+
} catch (error) {
112+
if (isJqError(error)) {
113+
return asErrorResult(error.message);
114+
}
115+
throw error;
116+
}
110117
};
111118

112119
export default { metadata, tool, handler };

packages/mcp-server/src/tools/accounts/usage/get-accounts-usage.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
import { maybeFilter } from '@imagekit/api-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@imagekit/api-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@imagekit/api-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@imagekit/api-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import ImageKit from '@imagekit/nodejs';
@@ -50,7 +50,14 @@ export const tool: Tool = {
5050

5151
export const handler = async (client: ImageKit, args: Record<string, unknown> | undefined) => {
5252
const { jq_filter, ...body } = args as any;
53-
return asTextContentResult(await maybeFilter(jq_filter, await client.accounts.usage.get(body)));
53+
try {
54+
return asTextContentResult(await maybeFilter(jq_filter, await client.accounts.usage.get(body)));
55+
} catch (error) {
56+
if (isJqError(error)) {
57+
return asErrorResult(error.message);
58+
}
59+
throw error;
60+
}
5461
};
5562

5663
export default { metadata, tool, handler };

packages/mcp-server/src/tools/assets/list-assets.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
import { maybeFilter } from '@imagekit/api-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@imagekit/api-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@imagekit/api-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@imagekit/api-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import ImageKit from '@imagekit/nodejs';
@@ -88,7 +88,14 @@ export const tool: Tool = {
8888

8989
export const handler = async (client: ImageKit, args: Record<string, unknown> | undefined) => {
9090
const { jq_filter, ...body } = args as any;
91-
return asTextContentResult(await maybeFilter(jq_filter, await client.assets.list(body)));
91+
try {
92+
return asTextContentResult(await maybeFilter(jq_filter, await client.assets.list(body)));
93+
} catch (error) {
94+
if (isJqError(error)) {
95+
return asErrorResult(error.message);
96+
}
97+
throw error;
98+
}
9299
};
93100

94101
export default { metadata, tool, handler };

packages/mcp-server/src/tools/cache/invalidation/create-cache-invalidation.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
import { maybeFilter } from '@imagekit/api-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@imagekit/api-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@imagekit/api-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@imagekit/api-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import ImageKit from '@imagekit/nodejs';
@@ -40,7 +40,14 @@ export const tool: Tool = {
4040

4141
export const handler = async (client: ImageKit, args: Record<string, unknown> | undefined) => {
4242
const { jq_filter, ...body } = args as any;
43-
return asTextContentResult(await maybeFilter(jq_filter, await client.cache.invalidation.create(body)));
43+
try {
44+
return asTextContentResult(await maybeFilter(jq_filter, await client.cache.invalidation.create(body)));
45+
} catch (error) {
46+
if (isJqError(error)) {
47+
return asErrorResult(error.message);
48+
}
49+
throw error;
50+
}
4451
};
4552

4653
export default { metadata, tool, handler };

packages/mcp-server/src/tools/cache/invalidation/get-cache-invalidation.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
import { maybeFilter } from '@imagekit/api-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@imagekit/api-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@imagekit/api-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@imagekit/api-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import ImageKit from '@imagekit/nodejs';
@@ -41,7 +41,14 @@ export const tool: Tool = {
4141

4242
export const handler = async (client: ImageKit, args: Record<string, unknown> | undefined) => {
4343
const { requestId, jq_filter, ...body } = args as any;
44-
return asTextContentResult(await maybeFilter(jq_filter, await client.cache.invalidation.get(requestId)));
44+
try {
45+
return asTextContentResult(await maybeFilter(jq_filter, await client.cache.invalidation.get(requestId)));
46+
} catch (error) {
47+
if (isJqError(error)) {
48+
return asErrorResult(error.message);
49+
}
50+
throw error;
51+
}
4552
};
4653

4754
export default { metadata, tool, handler };

packages/mcp-server/src/tools/custom-metadata-fields/create-custom-metadata-fields.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
import { maybeFilter } from '@imagekit/api-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@imagekit/api-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@imagekit/api-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@imagekit/api-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import ImageKit from '@imagekit/nodejs';
@@ -148,7 +148,14 @@ export const tool: Tool = {
148148

149149
export const handler = async (client: ImageKit, args: Record<string, unknown> | undefined) => {
150150
const { jq_filter, ...body } = args as any;
151-
return asTextContentResult(await maybeFilter(jq_filter, await client.customMetadataFields.create(body)));
151+
try {
152+
return asTextContentResult(await maybeFilter(jq_filter, await client.customMetadataFields.create(body)));
153+
} catch (error) {
154+
if (isJqError(error)) {
155+
return asErrorResult(error.message);
156+
}
157+
throw error;
158+
}
152159
};
153160

154161
export default { metadata, tool, handler };

0 commit comments

Comments
 (0)