Skip to content

Commit 719a2bc

Browse files
fix(mcp): return tool execution error on jq failure
1 parent 39fab03 commit 719a2bc

File tree

6 files changed

+58
-14
lines changed

6 files changed

+58
-14
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/classifications/universal/create-classifications-universal.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 'isaacus-mcp/filtering';
4-
import { Metadata, asTextContentResult } from 'isaacus-mcp/tools/types';
3+
import { isJqError, maybeFilter } from 'isaacus-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from 'isaacus-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Isaacus from 'isaacus';
@@ -89,9 +89,16 @@ export const tool: Tool = {
8989

9090
export const handler = async (client: Isaacus, args: Record<string, unknown> | undefined) => {
9191
const { jq_filter, ...body } = args as any;
92-
return asTextContentResult(
93-
await maybeFilter(jq_filter, await client.classifications.universal.create(body)),
94-
);
92+
try {
93+
return asTextContentResult(
94+
await maybeFilter(jq_filter, await client.classifications.universal.create(body)),
95+
);
96+
} catch (error) {
97+
if (isJqError(error)) {
98+
return asErrorResult(error.message);
99+
}
100+
throw error;
101+
}
95102
};
96103

97104
export default { metadata, tool, handler };

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

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Isaacus from 'isaacus';
@@ -75,7 +75,14 @@ export const tool: Tool = {
7575

7676
export const handler = async (client: Isaacus, args: Record<string, unknown> | undefined) => {
7777
const { jq_filter, ...body } = args as any;
78-
return asTextContentResult(await maybeFilter(jq_filter, await client.embeddings.create(body)));
78+
try {
79+
return asTextContentResult(await maybeFilter(jq_filter, await client.embeddings.create(body)));
80+
} catch (error) {
81+
if (isJqError(error)) {
82+
return asErrorResult(error.message);
83+
}
84+
throw error;
85+
}
7986
};
8087

8188
export default { metadata, tool, handler };

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

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

8989
export const handler = async (client: Isaacus, args: Record<string, unknown> | undefined) => {
9090
const { jq_filter, ...body } = args as any;
91-
return asTextContentResult(await maybeFilter(jq_filter, await client.extractions.qa.create(body)));
91+
try {
92+
return asTextContentResult(await maybeFilter(jq_filter, await client.extractions.qa.create(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/rerankings/create-rerankings.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 'isaacus-mcp/filtering';
4-
import { Metadata, asTextContentResult } from 'isaacus-mcp/tools/types';
3+
import { isJqError, maybeFilter } from 'isaacus-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from 'isaacus-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Isaacus from 'isaacus';
@@ -93,7 +93,14 @@ export const tool: Tool = {
9393

9494
export const handler = async (client: Isaacus, args: Record<string, unknown> | undefined) => {
9595
const { jq_filter, ...body } = args as any;
96-
return asTextContentResult(await maybeFilter(jq_filter, await client.rerankings.create(body)));
96+
try {
97+
return asTextContentResult(await maybeFilter(jq_filter, await client.rerankings.create(body)));
98+
} catch (error) {
99+
if (isJqError(error)) {
100+
return asErrorResult(error.message);
101+
}
102+
throw error;
103+
}
97104
};
98105

99106
export default { metadata, tool, handler };

packages/mcp-server/src/tools/types.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,18 @@ export async function asBinaryContentResult(response: Response): Promise<ToolCal
8787
}
8888
}
8989

90+
export function asErrorResult(message: string): ToolCallResult {
91+
return {
92+
content: [
93+
{
94+
type: 'text',
95+
text: message,
96+
},
97+
],
98+
isError: true,
99+
};
100+
}
101+
90102
export type Metadata = {
91103
resource: string;
92104
operation: 'read' | 'write';

0 commit comments

Comments
 (0)