#!/usr/bin/env node
/**
* 测试 MCP 服务器的 stdio 通道是否纯净
* 验证没有非 JSON-RPC 的输出污染 stdout
*/
import { spawn } from "child_process";
import { fileURLToPath } from "url";
import { dirname, join } from "path";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
console.log("=".repeat(80));
console.log("测试 MCP 服务器 stdio 通道纯净性");
console.log("=".repeat(80));
console.log();
// 启动 MCP 服务器 - 从项目根目录的 dist 文件夹
const serverPath = join(__dirname, "..", "..", "dist", "index.js");
console.log(`启动服务器: node ${serverPath}`);
console.log();
const server = spawn("node", [serverPath], {
stdio: ["pipe", "pipe", "pipe"],
env: {
...process.env,
MCP_DEBUG: "false", // 关闭调试模式
},
});
let stdoutData = "";
let stderrData = "";
let jsonRpcMessages = [];
let nonJsonLines = [];
// 监听 stdout(应该只有 JSON-RPC 消息)
server.stdout.on("data", (data) => {
const text = data.toString();
stdoutData += text;
// 尝试解析每一行
const lines = text.split("\n");
for (const line of lines) {
if (line.trim()) {
try {
const parsed = JSON.parse(line);
jsonRpcMessages.push(parsed);
console.log(
"✓ 收到有效的 JSON-RPC 消息:",
JSON.stringify(parsed).substring(0, 100) + "...",
);
} catch (e) {
nonJsonLines.push(line);
console.error("✗ 收到非 JSON 输出:", line);
}
}
}
});
// 监听 stderr(调试信息应该在这里)
server.stderr.on("data", (data) => {
const text = data.toString();
stderrData += text;
console.log("[STDERR]", text.trim());
});
// 发送初始化请求
setTimeout(() => {
console.log("\n发送初始化请求...");
const initRequest = {
jsonrpc: "2.0",
id: 1,
method: "initialize",
params: {
protocolVersion: "2024-11-05",
capabilities: {},
clientInfo: {
name: "test-client",
version: "1.0.0",
},
},
};
server.stdin.write(JSON.stringify(initRequest) + "\n");
}, 1000);
// 2秒后发送 list tools 请求
setTimeout(() => {
console.log("\n发送 tools/list 请求...");
const listToolsRequest = {
jsonrpc: "2.0",
id: 2,
method: "tools/list",
params: {},
};
server.stdin.write(JSON.stringify(listToolsRequest) + "\n");
}, 2000);
// 3秒后关闭服务器并检查结果
setTimeout(() => {
console.log("\n关闭服务器...");
server.kill("SIGTERM");
setTimeout(() => {
console.log("\n" + "=".repeat(80));
console.log("测试结果");
console.log("=".repeat(80));
console.log();
console.log(`收到的 JSON-RPC 消息数量: ${jsonRpcMessages.length}`);
console.log(`收到的非 JSON 行数: ${nonJsonLines.length}`);
console.log();
if (nonJsonLines.length > 0) {
console.error("❌ 测试失败!发现非 JSON 输出污染 stdout:");
nonJsonLines.forEach((line, i) => {
console.error(` ${i + 1}. ${line}`);
});
process.exit(1);
} else {
console.log("✅ 测试通过!stdout 通道纯净,只有 JSON-RPC 消息");
console.log();
console.log("stderr 输出(调试信息):");
console.log(stderrData || "(无)");
process.exit(0);
}
}, 500);
}, 3000);
// 处理服务器退出
server.on("exit", (code, signal) => {
console.log(`\n服务器已退出 (code: ${code}, signal: ${signal})`);
});
// 处理错误
server.on("error", (error) => {
console.error("服务器错误:", error);
process.exit(1);
});