Files
ask262/src/test/manual/test-mcp-server.ts
T

140 lines
4.6 KiB
TypeScript

/**
* Test script for Ask262 MCP Server
* Tests all available tools
*/
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
import type {
EvaluateToolMCPOutput,
GetSectionContentMCPOutput,
SearchSpecMCPOutput,
} from "../../mcp-server-stdio.js";
async function testMCPServer() {
console.log("Starting MCP Server tests...\n");
// Create transport connecting to the server
const transport = new StdioClientTransport({
command: "bun",
args: ["run", "src/mcp-server-stdio.ts"],
});
// Create client
const client = new Client(
{
name: "test-client",
version: "1.0.0",
},
{
capabilities: {},
},
);
try {
// Connect to server
await client.connect(transport);
console.log("✓ Connected to MCP server\n");
// Test 1: List tools
console.log("Test 1: Listing available tools...");
const tools = await client.listTools();
console.log(`Found ${tools.tools.length} tools:`);
for (const tool of tools.tools) {
const desc = tool.description ?? "No description";
console.log(` - ${tool.name}: ${desc.substring(0, 60)}...`);
}
console.log("✓ Tools listed successfully\n");
// Test 2: Search spec sections
console.log("Test 2: Testing ask262_search_spec_sections...");
const searchResult = (await client.callTool({
name: "ask262_search_spec_sections",
arguments: {
query: "array map method",
},
})) as SearchSpecMCPOutput;
if (searchResult.isError) {
throw new Error(`Search failed: ${searchResult.content[0]?.text}`);
}
const searchData = searchResult.structuredContent;
console.log(`Found ${searchData.results?.length ?? 0} sections`);
if (searchData.results && searchData.results.length > 0) {
console.log(
` First result: ${searchData.results[0].sectionId} - ${searchData.results[0].sectionTitle}`,
);
}
console.log("✓ Search working (isError: false)\n");
// Test 3: Get section content
console.log("Test 3: Testing ask262_get_section_content...");
const contentResult = (await client.callTool({
name: "ask262_get_section_content",
arguments: {
sectionId: "sec-array.prototype.map",
recursive: false,
},
})) as GetSectionContentMCPOutput;
if (contentResult.isError) {
throw new Error(`Get section failed: ${contentResult.content[0]?.text}`);
}
const contentData = contentResult.structuredContent;
console.log(
`Content length: ${contentData.content?.length ?? 0} characters`,
);
console.log(`Sections visited: ${contentData.sectionCount ?? 0}`);
console.log("✓ Section content retrieved (isError: false)\n");
// Test 4: Evaluate in engine262 - success case
console.log("Test 4: Testing ask262_evaluate_in_engine262 (success)...");
const evalResult = (await client.callTool({
name: "ask262_evaluate_in_engine262",
arguments: {
code: "console.log('test'); let x = 1 + 2; console.log(x);",
},
})) as EvaluateToolMCPOutput;
if (evalResult.isError) {
throw new Error(`Evaluate failed: ${evalResult.content[0]?.text}`);
}
// Type guard: check for error in structuredContent
const evalData = evalResult.structuredContent;
if ("error" in evalData) {
throw new Error(`Unexpected error: ${evalData.error}`);
}
console.log(
`Important sections: ${evalData.importantSections?.length ?? 0}`,
);
console.log(`Other sections: ${evalData.otherSections?.length ?? 0}`);
console.log(`Console output: ${JSON.stringify(evalData.consoleOutput)}`);
console.log("✓ Code evaluation working (isError: false)\n");
// Test 5: Evaluate in engine262 - error case
console.log("Test 5: Testing ask262_evaluate_in_engine262 (error)...");
const evalErrorResult = (await client.callTool({
name: "ask262_evaluate_in_engine262",
arguments: {
code: "invalid syntax here @#$%",
},
})) as EvaluateToolMCPOutput;
if (!evalErrorResult.isError) {
throw new Error("Expected error but got success");
}
// Verify error is in structuredContent
const errorData = evalErrorResult.structuredContent;
if (!("error" in errorData)) {
throw new Error("Expected error in structuredContent");
}
console.log(`Got expected error: ${errorData.error}`);
console.log("✓ Error handling working (isError: true)\n");
console.log("All tests passed! ✓");
} catch (error) {
console.error("Test failed:", error);
process.exit(1);
} finally {
await client.close();
}
}
testMCPServer();