UNPKG

@geekmai/anteey-mcp-client

Version:

Anteey MCP 客户端 - 连接外部 AI 工具与 Anteey 笔记应用

313 lines (273 loc) 8.14 kB
#!/usr/bin/env node /** * @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, };