diff --git a/packages/mcp/package.json b/packages/mcp/package.json index ad87a01b6..f46b14998 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -16,6 +16,7 @@ "scripts": { "build": "tsc --noEmit false --declaration false --emitDeclarationOnly false --outDir dist", "clean": "git clean -xdf .cache .turbo dist node_modules", + "test": "vitest run", "typecheck": "tsc --noEmit" }, "dependencies": { @@ -24,6 +25,7 @@ }, "devDependencies": { "@kan/tsconfig": "workspace:*", - "typescript": "catalog:" + "typescript": "catalog:", + "vitest": "^3.0.0" } } diff --git a/packages/mcp/src/tools/board.test.ts b/packages/mcp/src/tools/board.test.ts new file mode 100644 index 000000000..a1ee02eeb --- /dev/null +++ b/packages/mcp/src/tools/board.test.ts @@ -0,0 +1,42 @@ +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { describe, expect, it, vi } from "vitest"; + +import { kanRequest } from "../client.js"; +import { registerBoardTools } from "./board.js"; + +vi.mock("../client.js", () => ({ + kanRequest: vi.fn(), +})); + +describe("create_board", () => { + it("forwards documented input with the backend-required empty arrays", async () => { + const tools = new Map unknown>(); + const server = { + tool: (name: string, ...args: unknown[]) => { + tools.set(name, args.at(-1) as (...args: unknown[]) => unknown); + }, + } as unknown as McpServer; + const request = vi.mocked(kanRequest); + request.mockResolvedValueOnce({ publicId: "board-123456" }); + + registerBoardTools(server); + + await tools.get("create_board")?.({ + workspacePublicId: "workspace-123456", + name: "Private board", + visibility: "private", + }); + + expect(request).toHaveBeenCalledWith( + "POST", + "/workspaces/workspace-123456/boards", + { + name: "Private board", + slug: undefined, + visibility: "private", + lists: [], + labels: [], + }, + ); + }); +}); diff --git a/packages/mcp/src/tools/board.ts b/packages/mcp/src/tools/board.ts index 615bb74cf..443783413 100644 --- a/packages/mcp/src/tools/board.ts +++ b/packages/mcp/src/tools/board.ts @@ -106,6 +106,8 @@ export function registerBoardTools(server: McpServer): void { name, slug, visibility, + lists: [], + labels: [], }); return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] }; }, diff --git a/packages/mcp/vitest.config.ts b/packages/mcp/vitest.config.ts new file mode 100644 index 000000000..ae847ff6d --- /dev/null +++ b/packages/mcp/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + include: ["src/**/*.test.ts"], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c4e18f91..9c4a3a396 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -548,6 +548,9 @@ importers: typescript: specifier: 'catalog:' version: 5.9.2 + vitest: + specifier: ^3.0.0 + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.0.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1) packages/shared: dependencies: