Skip to content

Commit 9e8d18a

Browse files
fix(mcp): return tool execution error on jq failure
1 parent f5c0a4d commit 9e8d18a

File tree

14 files changed

+138
-36
lines changed

14 files changed

+138
-36
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/builds/diagnostics/list-builds-diagnostics.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 '@stainless-api/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@stainless-api/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Stainless from '@stainless-api/sdk';
@@ -80,7 +80,14 @@ export const tool: Tool = {
8080
export const handler = async (client: Stainless, args: Record<string, unknown> | undefined) => {
8181
const { buildId, jq_filter, ...body } = args as any;
8282
const response = await client.builds.diagnostics.list(buildId, body).asResponse();
83-
return asTextContentResult(await maybeFilter(jq_filter, await response.json()));
83+
try {
84+
return asTextContentResult(await maybeFilter(jq_filter, await response.json()));
85+
} catch (error) {
86+
if (isJqError(error)) {
87+
return asErrorResult(error.message);
88+
}
89+
throw error;
90+
}
8491
};
8592

8693
export default { metadata, tool, handler };

packages/mcp-server/src/tools/builds/retrieve-builds.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 '@stainless-api/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@stainless-api/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
55

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

4242
export const handler = async (client: Stainless, args: Record<string, unknown> | undefined) => {
4343
const { buildId, jq_filter, ...body } = args as any;
44-
return asTextContentResult(await maybeFilter(jq_filter, await client.builds.retrieve(buildId)));
44+
try {
45+
return asTextContentResult(await maybeFilter(jq_filter, await client.builds.retrieve(buildId)));
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/builds/target-outputs/retrieve-builds-target-outputs.ts

Lines changed: 12 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 '@stainless-api/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@stainless-api/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Stainless from '@stainless-api/sdk';
@@ -67,7 +67,16 @@ export const tool: Tool = {
6767

6868
export const handler = async (client: Stainless, args: Record<string, unknown> | undefined) => {
6969
const { jq_filter, ...body } = args as any;
70-
return asTextContentResult(await maybeFilter(jq_filter, await client.builds.targetOutputs.retrieve(body)));
70+
try {
71+
return asTextContentResult(
72+
await maybeFilter(jq_filter, await client.builds.targetOutputs.retrieve(body)),
73+
);
74+
} catch (error) {
75+
if (isJqError(error)) {
76+
return asErrorResult(error.message);
77+
}
78+
throw error;
79+
}
7180
};
7281

7382
export default { metadata, tool, handler };

packages/mcp-server/src/tools/orgs/list-orgs.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 '@stainless-api/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@stainless-api/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Stainless from '@stainless-api/sdk';
@@ -37,7 +37,14 @@ export const tool: Tool = {
3737

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

4350
export default { metadata, tool, handler };

packages/mcp-server/src/tools/orgs/retrieve-orgs.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 '@stainless-api/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@stainless-api/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
55

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

4141
export const handler = async (client: Stainless, args: Record<string, unknown> | undefined) => {
4242
const { org, jq_filter, ...body } = args as any;
43-
return asTextContentResult(await maybeFilter(jq_filter, await client.orgs.retrieve(org)));
43+
try {
44+
return asTextContentResult(await maybeFilter(jq_filter, await client.orgs.retrieve(org)));
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/projects/branches/list-projects-branches.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 '@stainless-api/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@stainless-api/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Stainless from '@stainless-api/sdk';
@@ -49,7 +49,14 @@ export const tool: Tool = {
4949
export const handler = async (client: Stainless, args: Record<string, unknown> | undefined) => {
5050
const { jq_filter, ...body } = args as any;
5151
const response = await client.projects.branches.list(body).asResponse();
52-
return asTextContentResult(await maybeFilter(jq_filter, await response.json()));
52+
try {
53+
return asTextContentResult(await maybeFilter(jq_filter, await response.json()));
54+
} catch (error) {
55+
if (isJqError(error)) {
56+
return asErrorResult(error.message);
57+
}
58+
throw error;
59+
}
5360
};
5461

5562
export default { metadata, tool, handler };

packages/mcp-server/src/tools/projects/configs/guess-projects-configs.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 '@stainless-api/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@stainless-api/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Stainless from '@stainless-api/sdk';
@@ -46,7 +46,14 @@ export const tool: Tool = {
4646

4747
export const handler = async (client: Stainless, args: Record<string, unknown> | undefined) => {
4848
const { jq_filter, ...body } = args as any;
49-
return asTextContentResult(await maybeFilter(jq_filter, await client.projects.configs.guess(body)));
49+
try {
50+
return asTextContentResult(await maybeFilter(jq_filter, await client.projects.configs.guess(body)));
51+
} catch (error) {
52+
if (isJqError(error)) {
53+
return asErrorResult(error.message);
54+
}
55+
throw error;
56+
}
5057
};
5158

5259
export default { metadata, tool, handler };

packages/mcp-server/src/tools/projects/configs/retrieve-projects-configs.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 '@stainless-api/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@stainless-api/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Stainless from '@stainless-api/sdk';
@@ -47,7 +47,14 @@ export const tool: Tool = {
4747

4848
export const handler = async (client: Stainless, args: Record<string, unknown> | undefined) => {
4949
const { jq_filter, ...body } = args as any;
50-
return asTextContentResult(await maybeFilter(jq_filter, await client.projects.configs.retrieve(body)));
50+
try {
51+
return asTextContentResult(await maybeFilter(jq_filter, await client.projects.configs.retrieve(body)));
52+
} catch (error) {
53+
if (isJqError(error)) {
54+
return asErrorResult(error.message);
55+
}
56+
throw error;
57+
}
5158
};
5259

5360
export default { metadata, tool, handler };

packages/mcp-server/src/tools/projects/create-projects.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 '@stainless-api/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@stainless-api/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@stainless-api/sdk-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Stainless from '@stainless-api/sdk';
@@ -77,7 +77,14 @@ export const tool: Tool = {
7777

7878
export const handler = async (client: Stainless, args: Record<string, unknown> | undefined) => {
7979
const { jq_filter, ...body } = args as any;
80-
return asTextContentResult(await maybeFilter(jq_filter, await client.projects.create(body)));
80+
try {
81+
return asTextContentResult(await maybeFilter(jq_filter, await client.projects.create(body)));
82+
} catch (error) {
83+
if (isJqError(error)) {
84+
return asErrorResult(error.message);
85+
}
86+
throw error;
87+
}
8188
};
8289

8390
export default { metadata, tool, handler };

0 commit comments

Comments
 (0)