102 lines
4.1 KiB
JavaScript
102 lines
4.1 KiB
JavaScript
/**
|
|
* 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");
|
|
});
|
|
});
|