Skip to content

Commit 047276b

Browse files
fix(mcp): return tool execution error on jq failure
1 parent 8a6a2cb commit 047276b

29 files changed

+286
-81
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/customers/list-customers.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 '@flowglad/node-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@flowglad/node-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@flowglad/node-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@flowglad/node-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Flowglad from '@flowglad/node';
@@ -44,7 +44,14 @@ export const tool: Tool = {
4444

4545
export const handler = async (client: Flowglad, args: Record<string, unknown> | undefined) => {
4646
const { jq_filter, ...body } = args as any;
47-
return asTextContentResult(await maybeFilter(jq_filter, await client.customers.list(body)));
47+
try {
48+
return asTextContentResult(await maybeFilter(jq_filter, await client.customers.list(body)));
49+
} catch (error) {
50+
if (isJqError(error)) {
51+
return asErrorResult(error.message);
52+
}
53+
throw error;
54+
}
4855
};
4956

5057
export default { metadata, tool, handler };

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

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Flowglad from '@flowglad/node';
@@ -42,7 +42,14 @@ export const tool: Tool = {
4242

4343
export const handler = async (client: Flowglad, args: Record<string, unknown> | undefined) => {
4444
const { externalId, jq_filter, ...body } = args as any;
45-
return asTextContentResult(await maybeFilter(jq_filter, await client.customers.retrieve(externalId)));
45+
try {
46+
return asTextContentResult(await maybeFilter(jq_filter, await client.customers.retrieve(externalId)));
47+
} catch (error) {
48+
if (isJqError(error)) {
49+
return asErrorResult(error.message);
50+
}
51+
throw error;
52+
}
4653
};
4754

4855
export default { metadata, tool, handler };

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

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Flowglad from '@flowglad/node';
@@ -70,7 +70,14 @@ export const tool: Tool = {
7070

7171
export const handler = async (client: Flowglad, args: Record<string, unknown> | undefined) => {
7272
const { externalId, jq_filter, ...body } = args as any;
73-
return asTextContentResult(await maybeFilter(jq_filter, await client.customers.update(externalId, body)));
73+
try {
74+
return asTextContentResult(await maybeFilter(jq_filter, await client.customers.update(externalId, body)));
75+
} catch (error) {
76+
if (isJqError(error)) {
77+
return asErrorResult(error.message);
78+
}
79+
throw error;
80+
}
7481
};
7582

7683
export default { metadata, tool, handler };

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

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Flowglad from '@flowglad/node';
@@ -136,7 +136,14 @@ export const tool: Tool = {
136136

137137
export const handler = async (client: Flowglad, args: Record<string, unknown> | undefined) => {
138138
const { jq_filter, ...body } = args as any;
139-
return asTextContentResult(await maybeFilter(jq_filter, await client.discounts.create(body)));
139+
try {
140+
return asTextContentResult(await maybeFilter(jq_filter, await client.discounts.create(body)));
141+
} catch (error) {
142+
if (isJqError(error)) {
143+
return asErrorResult(error.message);
144+
}
145+
throw error;
146+
}
140147
};
141148

142149
export default { metadata, tool, handler };

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

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Flowglad from '@flowglad/node';
@@ -44,7 +44,14 @@ export const tool: Tool = {
4444

4545
export const handler = async (client: Flowglad, args: Record<string, unknown> | undefined) => {
4646
const { jq_filter, ...body } = args as any;
47-
return asTextContentResult(await maybeFilter(jq_filter, await client.discounts.list(body)));
47+
try {
48+
return asTextContentResult(await maybeFilter(jq_filter, await client.discounts.list(body)));
49+
} catch (error) {
50+
if (isJqError(error)) {
51+
return asErrorResult(error.message);
52+
}
53+
throw error;
54+
}
4855
};
4956

5057
export default { metadata, tool, handler };

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

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

4242
export const handler = async (client: Flowglad, args: Record<string, unknown> | undefined) => {
4343
const { id, jq_filter, ...body } = args as any;
44-
return asTextContentResult(await maybeFilter(jq_filter, await client.discounts.retrieve(id)));
44+
try {
45+
return asTextContentResult(await maybeFilter(jq_filter, await client.discounts.retrieve(id)));
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/discounts/update-discounts.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 '@flowglad/node-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@flowglad/node-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@flowglad/node-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@flowglad/node-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Flowglad from '@flowglad/node';
@@ -150,7 +150,14 @@ export const tool: Tool = {
150150

151151
export const handler = async (client: Flowglad, args: Record<string, unknown> | undefined) => {
152152
const { id, jq_filter, ...body } = args as any;
153-
return asTextContentResult(await maybeFilter(jq_filter, await client.discounts.update(id, body)));
153+
try {
154+
return asTextContentResult(await maybeFilter(jq_filter, await client.discounts.update(id, body)));
155+
} catch (error) {
156+
if (isJqError(error)) {
157+
return asErrorResult(error.message);
158+
}
159+
throw error;
160+
}
154161
};
155162

156163
export default { metadata, tool, handler };

packages/mcp-server/src/tools/invoice-line-items/list-invoice-line-items.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 '@flowglad/node-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@flowglad/node-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@flowglad/node-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@flowglad/node-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Flowglad from '@flowglad/node';
@@ -44,7 +44,14 @@ export const tool: Tool = {
4444

4545
export const handler = async (client: Flowglad, args: Record<string, unknown> | undefined) => {
4646
const { jq_filter, ...body } = args as any;
47-
return asTextContentResult(await maybeFilter(jq_filter, await client.invoiceLineItems.list(body)));
47+
try {
48+
return asTextContentResult(await maybeFilter(jq_filter, await client.invoiceLineItems.list(body)));
49+
} catch (error) {
50+
if (isJqError(error)) {
51+
return asErrorResult(error.message);
52+
}
53+
throw error;
54+
}
4855
};
4956

5057
export default { metadata, tool, handler };

packages/mcp-server/src/tools/invoice-line-items/retrieve-invoice-line-items.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 '@flowglad/node-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@flowglad/node-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@flowglad/node-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@flowglad/node-mcp/tools/types';
55

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

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

0 commit comments

Comments
 (0)