@geekmai/anteey-mcp-client
Version:
Anteey MCP 客户端 - 连接外部 AI 工具与 Anteey 笔记应用
313 lines (273 loc) • 8.14 kB
JavaScript
/**
* @file test.js
* @description 测试 Anteey MCP 服务器连接
*/
const http = require("http");
const chalk = require("chalk");
const ora = require("ora");
const { loadConfig } = require("./config");
/**
* 测试 API 连接
*/
async function testApiConnection(config) {
const spinner = ora("正在测试 API 连接...").start();
return new Promise((resolve) => {
const startTime = Date.now();
const req = http.get(
`${config.serverUrl}/notes/search?query=test&limit=1`,
{
headers: config.apiKey
? { Authorization: `Bearer ${config.apiKey}` }
: {},
timeout: config.timeout,
},
(res) => {
let data = "";
res.on("data", (chunk) => {
data += chunk;
});
res.on("end", () => {
const responseTime = Date.now() - startTime;
spinner.stop();
try {
const response = JSON.parse(data);
resolve({
success: res.statusCode === 200,
status: res.statusCode,
responseTime,
response: response,
error: null,
});
} catch (error) {
resolve({
success: false,
status: res.statusCode,
responseTime,
response: null,
error: "无法解析响应 JSON",
});
}
});
}
);
req.on("error", (error) => {
spinner.stop();
resolve({
success: false,
status: null,
responseTime: Date.now() - startTime,
response: null,
error: error.message,
});
});
req.on("timeout", () => {
spinner.stop();
req.destroy();
resolve({
success: false,
status: null,
responseTime: Date.now() - startTime,
response: null,
error: "连接超时",
});
});
req.end();
});
}
/**
* 测试搜索功能
*/
async function testSearchFunction(config) {
const spinner = ora("正在测试搜索功能...").start();
return new Promise((resolve) => {
const startTime = Date.now();
const req = http.get(
`${config.serverUrl}/notes/search?query=test&limit=1`,
{
headers: config.apiKey
? { Authorization: `Bearer ${config.apiKey}` }
: {},
timeout: config.timeout,
},
(res) => {
let data = "";
res.on("data", (chunk) => {
data += chunk;
});
res.on("end", () => {
const responseTime = Date.now() - startTime;
spinner.stop();
try {
const response = JSON.parse(data);
resolve({
success: res.statusCode === 200,
status: res.statusCode,
responseTime,
response: response,
error: null,
});
} catch (error) {
resolve({
success: false,
status: res.statusCode,
responseTime,
response: null,
error: "无法解析响应 JSON",
});
}
});
}
);
req.on("error", (error) => {
spinner.stop();
resolve({
success: false,
status: null,
responseTime: Date.now() - startTime,
response: null,
error: error.message,
});
});
req.on("timeout", () => {
spinner.stop();
req.destroy();
resolve({
success: false,
status: null,
responseTime: Date.now() - startTime,
response: null,
error: "连接超时",
});
});
req.end();
});
}
/**
* 显示测试结果
*/
function displayTestResult(testName, result) {
console.log(chalk.cyan(`\n📋 ${testName}:`));
if (result.success) {
console.log(chalk.green(" ✅ 成功"));
console.log(chalk.gray(` 响应时间: ${result.responseTime}ms`));
console.log(chalk.gray(` 状态码: ${result.status}`));
if (result.response) {
if (result.response.data) {
console.log(
chalk.gray(
` 数据: ${JSON.stringify(result.response.data).substring(
0,
100
)}...`
)
);
}
}
} else {
console.log(chalk.red(" ❌ 失败"));
console.log(chalk.gray(` 响应时间: ${result.responseTime}ms`));
if (result.status) {
console.log(chalk.gray(` 状态码: ${result.status}`));
}
if (result.error) {
console.log(chalk.red(` 错误: ${result.error}`));
}
}
}
/**
* 显示建议
*/
function displaySuggestions(results) {
const allPassed = results.every((result) => result.success);
if (allPassed) {
console.log(chalk.green("\n🎉 所有测试通过!"));
console.log(chalk.cyan("\n🚀 你可以开始使用 MCP 客户端了:"));
console.log(chalk.gray(" anteey-mcp raycast # 启动 Raycast 适配器"));
console.log(chalk.gray(" anteey-mcp cursor # 启动 Cursor 适配器"));
console.log(
chalk.gray(" anteey-mcp claude # 启动 Claude Desktop 适配器")
);
} else {
console.log(chalk.yellow("\n⚠️ 部分测试失败,请检查以下问题:"));
const statusTest = results.find((r) => r.testName === "status");
const searchTest = results.find((r) => r.testName === "search");
if (statusTest && !statusTest.success) {
if (statusTest.error && statusTest.error.includes("ECONNREFUSED")) {
console.log(chalk.red(" • Anteey 服务器未运行"));
console.log(chalk.gray(" 解决方案: 启动 Anteey 应用"));
} else if (statusTest.status === 401) {
console.log(chalk.red(" • API 密钥无效"));
console.log(
chalk.gray(
' 解决方案: 使用 "anteey-mcp config" 设置正确的 API 密钥'
)
);
} else if (statusTest.error && statusTest.error.includes("timeout")) {
console.log(chalk.red(" • 连接超时"));
console.log(chalk.gray(" 解决方案: 检查服务器地址和网络连接"));
}
}
if (searchTest && !searchTest.success && statusTest && statusTest.success) {
console.log(chalk.red(" • 搜索功能异常"));
console.log(
chalk.gray(" 解决方案: 检查 Anteey 应用中的 MCP 服务配置")
);
}
}
}
/**
* 主测试函数
*/
async function testConnection() {
try {
console.log(chalk.cyan("🔍 正在测试 Anteey MCP 连接...\n"));
// 加载配置
const config = await loadConfig();
// 显示配置信息
console.log(chalk.yellow("🔧 当前配置:"));
console.log(chalk.gray(` 服务器: ${config.serverUrl}`));
console.log(
chalk.gray(
` API 密钥: ${
config.apiKey ? config.apiKey.substring(0, 10) + "..." : "(未设置)"
}`
)
);
console.log(chalk.gray(` 超时时间: ${config.timeout}ms`));
if (!config.apiKey) {
console.log(chalk.yellow("\n⚠️ 未设置 API 密钥"));
console.log(chalk.gray('使用 "anteey-mcp config" 设置 API 密钥'));
console.log("");
}
// 执行测试
const results = [];
// 测试 API 连接
const statusResult = await testApiConnection(config);
statusResult.testName = "status";
results.push(statusResult);
displayTestResult("API 连接测试", statusResult);
// 如果基本连接成功,测试搜索功能
if (statusResult.success) {
const searchResult = await testSearchFunction(config);
searchResult.testName = "search";
results.push(searchResult);
displayTestResult("搜索功能测试", searchResult);
}
// 显示建议
displaySuggestions(results);
console.log("");
} catch (error) {
console.error(chalk.red("测试时出错:"), error.message);
process.exit(1);
}
}
// 如果直接运行此文件
if (require.main === module) {
testConnection();
}
module.exports = {
testConnection,
testApiConnection,
testSearchFunction,
};