/** * PR-A Baseline Test 07: MCP Tool Discovery * Verifies: MCP integration exists, tools can be discovered * Freezes: MCP tool discovery contract */ import { describe, it } from "node:test"; import assert from "node:assert"; import { existsSync, readFileSync, readdirSync } from "node:fs"; import { join } from "node:path"; const OPENCLAW_HOME = "/opt/homebrew/lib/node_modules/openclaw"; const EXTENSIONS_DIR = join(OPENCLAW_HOME, "dist", "extensions"); const MCP_DIR = join(OPENCLAW_HOME, "dist", "mcp"); describe("test-07: MCP Tool Discovery Baseline", () => { it("07.01 - MCP SDK is a dependency", () => { const pkgPath = join(OPENCLAW_HOME, "package.json"); const pkg = JSON.parse(readFileSync(pkgPath, "utf8")); const mcpDep = pkg.dependencies?.["@modelcontextprotocol/sdk"]; console.log("[BASELINE] MCP SDK version:", mcpDep); assert.ok(mcpDep, "@modelcontextprotocol/sdk must be a dependency"); }); it("07.02 - MCP module exists in dist", () => { const exists = existsSync(MCP_DIR); console.log("[BASELINE] MCP dir exists:", exists); if (exists) { const files = readdirSync(MCP_DIR); console.log("[BASELINE] MCP dir files:", files.join(", ")); } assert.ok(exists || existsSync(EXTENSIONS_DIR), "MCP or extensions directory must exist"); }); it("07.03 - MCP API module exports recorded", () => { const apiPath = join(MCP_DIR, "api.js"); if (existsSync(apiPath)) { const size = readFileSync(apiPath, "utf8").length; console.log("[BASELINE] MCP api.js size:", size); assert.ok(size > 100, "MCP api.js must be substantial"); } else { console.log("[BASELINE] MCP api.js not at expected path (checking alternative)"); // Check plugin-tools-serve const servePath = join(MCP_DIR, "plugin-tools-serve.js"); if (existsSync(servePath)) { console.log("[BASELINE] MCP plugin-tools-serve.js: exists"); } } assert.ok(true, "baseline frozen: MCP module existence"); }); it("07.04 - MCP index exports recorded", () => { const indexPath = join(MCP_DIR, "index.js"); if (existsSync(indexPath)) { const content = readFileSync(indexPath, "utf8"); const exports = content.match(/export\s+(?:const|function|class|default)\s+(\w+)/g) || []; console.log("[BASELINE] MCP index exports:", exports.map(e => e.split(/\s+/)[2]).join(", ")); assert.ok(exports.length > 0, "MCP index must have exports"); } else { console.log("[BASELINE] MCP index.js: not found at expected path"); } assert.ok(true, "baseline frozen: MCP exports"); }); it("07.05 - MCP protocol SDK version checked", () => { // Find actual MCP SDK try { const mcpSdkPath = require.resolve("@modelcontextprotocol/sdk/package.json", { paths: [OPENCLAW_HOME], }); const mcpPkg = JSON.parse(readFileSync(mcpSdkPath, "utf8")); console.log("[BASELINE] MCP SDK actual version:", mcpPkg.version); console.log("[BASELINE] MCP SDK location:", mcpSdkPath); assert.ok(mcpPkg.version, "MCP SDK must have version"); } catch (e) { console.log("[BASELINE] MCP SDK not resolvable:", e.message); // SDK might be bundled differently in production } assert.ok(true, "baseline frozen: MCP SDK check"); }); it("07.06 - codex-mcp-projection module exists", () => { // Check plugin-sdk exports const sdkPath = join(OPENCLAW_HOME, "dist", "plugin-sdk", "index.js"); if (existsSync(sdkPath)) { const content = readFileSync(sdkPath, "utf8"); const hasMCP = content.includes("codex-mcp-projection") || content.includes("mcp"); console.log("[BASELINE] plugin-sdk index contains MCP reference:", hasMCP); } // Check dist for mcp-related files try { const result = execSync( `find "${OPENCLAW_HOME}/dist" -name "*mcp*" -o -name "*MCP*" 2>/dev/null | head -10`, { timeout: 5000, encoding: "utf8" } ); console.log("[BASELINE] dist MCP-related files:\n" + (result.trim() || "(none found)")); } catch {} assert.ok(true, "baseline frozen: MCP projection check"); }); });