Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/lib/mcp/tools/docs.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/// <reference types="bun-types" />

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
import { afterEach, beforeEach, expect, test } from "bun:test";

import { registerDocsTools } from "@/lib/mcp/tools/docs";

const configured = {
token: process.env.MINTLIFY_ASSISTANT_API_TOKEN,
domain: process.env.MINTLIFY_DOMAIN,
};

beforeEach(() => {
delete process.env.MINTLIFY_ASSISTANT_API_TOKEN;
delete process.env.MINTLIFY_DOMAIN;
});

afterEach(() => {
if (configured.token)
process.env.MINTLIFY_ASSISTANT_API_TOKEN = configured.token;
if (configured.domain) process.env.MINTLIFY_DOMAIN = configured.domain;
});

test("search_docs reports missing configuration as a failure", async () => {
const server = new McpServer({ name: "test", version: "0.0.0" });
registerDocsTools(server);

const client = new Client({ name: "test-client", version: "0.0.0" });
const [clientTransport, serverTransport] =
InMemoryTransport.createLinkedPair();
await Promise.all([
server.connect(serverTransport),
client.connect(clientTransport),
]);

const result = await client.callTool({
name: "search_docs",
arguments: { query: "how to deploy an app" },
});
await client.close();

expect(result.isError).toBe(true);
expect(result.content).toEqual([
{
type: "text",
text: "Error: Documentation search is not configured (missing MINTLIFY_ASSISTANT_API_TOKEN or MINTLIFY_DOMAIN).",
},
]);
});
23 changes: 7 additions & 16 deletions src/lib/mcp/tools/docs.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { errorResponse } from "@/lib/mcp/responses";

interface MintlifySearchResult {
content: string;
Expand Down Expand Up @@ -31,14 +32,9 @@ export function registerDocsTools(server: McpServer) {
!process.env.MINTLIFY_ASSISTANT_API_TOKEN ||
!process.env.MINTLIFY_DOMAIN
) {
return {
content: [
{
type: "text",
text: "Error: Documentation search is not configured (missing MINTLIFY_ASSISTANT_API_TOKEN or MINTLIFY_DOMAIN).",
},
],
};
return errorResponse(
"Error: Documentation search is not configured (missing MINTLIFY_ASSISTANT_API_TOKEN or MINTLIFY_DOMAIN).",
);
}

try {
Expand Down Expand Up @@ -74,14 +70,9 @@ export function registerDocsTools(server: McpServer) {

return { content: [{ type: "text", text: formatted }] };
} catch (error) {
return {
content: [
{
type: "text",
text: `Error searching documentation: ${error instanceof Error ? error.message : "Unknown error"}`,
},
],
};
return errorResponse(
`Error searching documentation: ${error instanceof Error ? error.message : "Unknown error"}`,
);
}
},
);
Expand Down
7 changes: 2 additions & 5 deletions src/lib/mcp/tools/shell.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { createKernelClient } from "@/lib/mcp/kernel-client";
import { throwToolError } from "@/lib/mcp/responses";

export function registerShellTool(server: McpServer) {
// exec_command -- Execute shell commands inside a browser VM
Expand Down Expand Up @@ -70,11 +71,7 @@ export function registerShellTool(server: McpServer) {
],
};
} catch (error) {
return {
content: [
{ type: "text", text: `Error executing command: ${error}` },
],
};
throwToolError("exec_command", "exec", error);
}
},
);
Expand Down
Loading