import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { Command } from "commander"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { withTempHome } from "../config/home-env.test-harness.js"; import { createCliRuntimeCapture } from "./test-runtime-capture.js"; const { defaultRuntime, resetRuntimeCapture } = createCliRuntimeCapture(); const mockLog = defaultRuntime.log; const mockError = defaultRuntime.error; vi.mock("../runtime.js", () => ({ defaultRuntime, })); const tempDirs: string[] = []; async function createWorkspace(): Promise { const dir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-cli-mcp-")); tempDirs.push(dir); return dir; } let registerMcpCli: typeof import("./mcp-cli.js").registerMcpCli; let sharedProgram: Command; async function runMcpCommand(args: string[]) { await sharedProgram.parseAsync(args, { from: "user" }); } describe("mcp cli", () => { beforeAll(async () => { ({ registerMcpCli } = await import("./mcp-cli.js")); sharedProgram = new Command(); sharedProgram.exitOverride(); registerMcpCli(sharedProgram); }, 300_000); beforeEach(() => { vi.clearAllMocks(); resetRuntimeCapture(); }); afterEach(async () => { vi.restoreAllMocks(); await Promise.all( tempDirs.splice(0).map((dir) => fs.rm(dir, { recursive: true, force: true })), ); }); it("sets and shows a configured MCP server", async () => { await withTempHome("openclaw-cli-mcp-home-", async () => { const workspaceDir = await createWorkspace(); vi.spyOn(process, "cwd").mockReturnValue(workspaceDir); await runMcpCommand(["mcp", "set", "context7", '{"command":"uvx","args":["context7-mcp"]}']); expect(mockLog).toHaveBeenCalledWith(expect.stringContaining('Saved MCP server "context7"')); mockLog.mockClear(); await runMcpCommand(["mcp", "show", "context7", "--json"]); expect(mockLog).toHaveBeenCalledWith(expect.stringContaining('"command": "uvx"')); }); }); it("fails when removing an unknown MCP server", async () => { await withTempHome("openclaw-cli-mcp-home-", async () => { const workspaceDir = await createWorkspace(); vi.spyOn(process, "cwd").mockReturnValue(workspaceDir); await expect(runMcpCommand(["mcp", "unset", "missing"])).rejects.toThrow("__exit__:1"); expect(mockError).toHaveBeenCalledWith( expect.stringContaining('No MCP server named "missing"'), ); }); }); });