Skip to content

Commit af256a6

Browse files
authored
Merge pull request #137 from kernel/hypeship/report-tool-failures
Report exec_command and search_docs failures as failures
2 parents e1722c4 + 5b39e59 commit af256a6

3 files changed

Lines changed: 60 additions & 21 deletions

File tree

src/lib/mcp/tools/docs.test.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/// <reference types="bun-types" />
2+
3+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
5+
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
6+
import { afterEach, beforeEach, expect, test } from "bun:test";
7+
8+
import { registerDocsTools } from "@/lib/mcp/tools/docs";
9+
10+
const configured = {
11+
token: process.env.MINTLIFY_ASSISTANT_API_TOKEN,
12+
domain: process.env.MINTLIFY_DOMAIN,
13+
};
14+
15+
beforeEach(() => {
16+
delete process.env.MINTLIFY_ASSISTANT_API_TOKEN;
17+
delete process.env.MINTLIFY_DOMAIN;
18+
});
19+
20+
afterEach(() => {
21+
if (configured.token)
22+
process.env.MINTLIFY_ASSISTANT_API_TOKEN = configured.token;
23+
if (configured.domain) process.env.MINTLIFY_DOMAIN = configured.domain;
24+
});
25+
26+
test("search_docs reports missing configuration as a failure", async () => {
27+
const server = new McpServer({ name: "test", version: "0.0.0" });
28+
registerDocsTools(server);
29+
30+
const client = new Client({ name: "test-client", version: "0.0.0" });
31+
const [clientTransport, serverTransport] =
32+
InMemoryTransport.createLinkedPair();
33+
await Promise.all([
34+
server.connect(serverTransport),
35+
client.connect(clientTransport),
36+
]);
37+
38+
const result = await client.callTool({
39+
name: "search_docs",
40+
arguments: { query: "how to deploy an app" },
41+
});
42+
await client.close();
43+
44+
expect(result.isError).toBe(true);
45+
expect(result.content).toEqual([
46+
{
47+
type: "text",
48+
text: "Error: Documentation search is not configured (missing MINTLIFY_ASSISTANT_API_TOKEN or MINTLIFY_DOMAIN).",
49+
},
50+
]);
51+
});

src/lib/mcp/tools/docs.ts

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
22
import { z } from "zod";
3+
import { errorResponse } from "@/lib/mcp/responses";
34

45
interface MintlifySearchResult {
56
content: string;
@@ -31,14 +32,9 @@ export function registerDocsTools(server: McpServer) {
3132
!process.env.MINTLIFY_ASSISTANT_API_TOKEN ||
3233
!process.env.MINTLIFY_DOMAIN
3334
) {
34-
return {
35-
content: [
36-
{
37-
type: "text",
38-
text: "Error: Documentation search is not configured (missing MINTLIFY_ASSISTANT_API_TOKEN or MINTLIFY_DOMAIN).",
39-
},
40-
],
41-
};
35+
return errorResponse(
36+
"Error: Documentation search is not configured (missing MINTLIFY_ASSISTANT_API_TOKEN or MINTLIFY_DOMAIN).",
37+
);
4238
}
4339

4440
try {
@@ -74,14 +70,9 @@ export function registerDocsTools(server: McpServer) {
7470

7571
return { content: [{ type: "text", text: formatted }] };
7672
} catch (error) {
77-
return {
78-
content: [
79-
{
80-
type: "text",
81-
text: `Error searching documentation: ${error instanceof Error ? error.message : "Unknown error"}`,
82-
},
83-
],
84-
};
73+
return errorResponse(
74+
`Error searching documentation: ${error instanceof Error ? error.message : "Unknown error"}`,
75+
);
8576
}
8677
},
8778
);

src/lib/mcp/tools/shell.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
22
import { z } from "zod";
33
import { createKernelClient } from "@/lib/mcp/kernel-client";
4+
import { throwToolError } from "@/lib/mcp/responses";
45

56
export function registerShellTool(server: McpServer) {
67
// exec_command -- Execute shell commands inside a browser VM
@@ -70,11 +71,7 @@ export function registerShellTool(server: McpServer) {
7071
],
7172
};
7273
} catch (error) {
73-
return {
74-
content: [
75-
{ type: "text", text: `Error executing command: ${error}` },
76-
],
77-
};
74+
throwToolError("exec_command", "exec", error);
7875
}
7976
},
8077
);

0 commit comments

Comments
 (0)