Skip to content

Commit c717c94

Browse files
fix(mcp): return tool execution error on jq failure
1 parent b8623e9 commit c717c94

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+522
-155
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/agents/create-agents.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 '@julep/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@julep/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@julep/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@julep/sdk-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Julep from '@julep/sdk';
@@ -84,7 +84,14 @@ export const tool: Tool = {
8484

8585
export const handler = async (client: Julep, args: Record<string, unknown> | undefined) => {
8686
const { jq_filter, ...body } = args as any;
87-
return asTextContentResult(await maybeFilter(jq_filter, await client.agents.create(body)));
87+
try {
88+
return asTextContentResult(await maybeFilter(jq_filter, await client.agents.create(body)));
89+
} catch (error) {
90+
if (isJqError(error)) {
91+
return asErrorResult(error.message);
92+
}
93+
throw error;
94+
}
8895
};
8996

9097
export default { metadata, tool, handler };

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

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Julep from '@julep/sdk';
@@ -88,9 +88,16 @@ export const tool: Tool = {
8888

8989
export const handler = async (client: Julep, args: Record<string, unknown> | undefined) => {
9090
const { agent_id, jq_filter, ...body } = args as any;
91-
return asTextContentResult(
92-
await maybeFilter(jq_filter, await client.agents.createOrUpdate(agent_id, body)),
93-
);
91+
try {
92+
return asTextContentResult(
93+
await maybeFilter(jq_filter, await client.agents.createOrUpdate(agent_id, body)),
94+
);
95+
} catch (error) {
96+
if (isJqError(error)) {
97+
return asErrorResult(error.message);
98+
}
99+
throw error;
100+
}
94101
};
95102

96103
export default { metadata, tool, handler };

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

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

4343
export const handler = async (client: Julep, args: Record<string, unknown> | undefined) => {
4444
const { agent_id, jq_filter, ...body } = args as any;
45-
return asTextContentResult(await maybeFilter(jq_filter, await client.agents.delete(agent_id)));
45+
try {
46+
return asTextContentResult(await maybeFilter(jq_filter, await client.agents.delete(agent_id)));
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/agents/docs/bulk-delete-agents-docs.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 '@julep/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@julep/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@julep/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@julep/sdk-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Julep from '@julep/sdk';
@@ -51,9 +51,16 @@ export const tool: Tool = {
5151

5252
export const handler = async (client: Julep, args: Record<string, unknown> | undefined) => {
5353
const { agent_id, jq_filter, ...body } = args as any;
54-
return asTextContentResult(
55-
await maybeFilter(jq_filter, await client.agents.docs.bulkDelete(agent_id, body)),
56-
);
54+
try {
55+
return asTextContentResult(
56+
await maybeFilter(jq_filter, await client.agents.docs.bulkDelete(agent_id, body)),
57+
);
58+
} catch (error) {
59+
if (isJqError(error)) {
60+
return asErrorResult(error.message);
61+
}
62+
throw error;
63+
}
5764
};
5865

5966
export default { metadata, tool, handler };

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

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Julep from '@julep/sdk';
@@ -74,7 +74,14 @@ export const tool: Tool = {
7474

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

8087
export default { metadata, tool, handler };

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

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Julep from '@julep/sdk';
@@ -46,7 +46,16 @@ export const tool: Tool = {
4646

4747
export const handler = async (client: Julep, args: Record<string, unknown> | undefined) => {
4848
const { agent_id, doc_id, jq_filter, ...body } = args as any;
49-
return asTextContentResult(await maybeFilter(jq_filter, await client.agents.docs.delete(agent_id, doc_id)));
49+
try {
50+
return asTextContentResult(
51+
await maybeFilter(jq_filter, await client.agents.docs.delete(agent_id, doc_id)),
52+
);
53+
} catch (error) {
54+
if (isJqError(error)) {
55+
return asErrorResult(error.message);
56+
}
57+
throw error;
58+
}
5059
};
5160

5261
export default { metadata, tool, handler };

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

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Julep from '@julep/sdk';
@@ -70,7 +70,14 @@ export const tool: Tool = {
7070
export const handler = async (client: Julep, args: Record<string, unknown> | undefined) => {
7171
const { agent_id, jq_filter, ...body } = args as any;
7272
const response = await client.agents.docs.list(agent_id, body).asResponse();
73-
return asTextContentResult(await maybeFilter(jq_filter, await response.json()));
73+
try {
74+
return asTextContentResult(await maybeFilter(jq_filter, await response.json()));
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/agents/docs/search-agents-docs.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 '@julep/sdk-mcp/filtering';
4-
import { Metadata, asTextContentResult } from '@julep/sdk-mcp/tools/types';
3+
import { isJqError, maybeFilter } from '@julep/sdk-mcp/filtering';
4+
import { Metadata, asErrorResult, asTextContentResult } from '@julep/sdk-mcp/tools/types';
55

66
import { Tool } from '@modelcontextprotocol/sdk/types.js';
77
import Julep from '@julep/sdk';
@@ -183,7 +183,14 @@ export const tool: Tool = {
183183

184184
export const handler = async (client: Julep, args: Record<string, unknown> | undefined) => {
185185
const { agent_id, jq_filter, ...body } = args as any;
186-
return asTextContentResult(await maybeFilter(jq_filter, await client.agents.docs.search(agent_id, body)));
186+
try {
187+
return asTextContentResult(await maybeFilter(jq_filter, await client.agents.docs.search(agent_id, body)));
188+
} catch (error) {
189+
if (isJqError(error)) {
190+
return asErrorResult(error.message);
191+
}
192+
throw error;
193+
}
187194
};
188195

189196
export default { metadata, tool, handler };

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

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

4343
export const handler = async (client: Julep, args: Record<string, unknown> | undefined) => {
4444
const { agent_id, jq_filter, ...body } = args as any;
45-
return asTextContentResult(await maybeFilter(jq_filter, await client.agents.get(agent_id)));
45+
try {
46+
return asTextContentResult(await maybeFilter(jq_filter, await client.agents.get(agent_id)));
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 };

0 commit comments

Comments
 (0)