Skip to main content
Glama
test-connection.js4.98 kB
#!/usr/bin/env node import axios from "axios"; import dotenv from "dotenv"; import { fileURLToPath } from "url"; import path from "path"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); dotenv.config(); const { CONF_BASE_URL, CONF_USERNAME, CONF_PASSWORD, CONF_SPACE } = process.env; console.log("🔍 正在测试 Confluence 连接配置...\n"); // 检查环境变量 const checks = [ { name: "CONF_BASE_URL", value: CONF_BASE_URL }, { name: "CONF_USERNAME", value: CONF_USERNAME }, { name: "CONF_PASSWORD", value: CONF_PASSWORD }, { name: "CONF_SPACE", value: CONF_SPACE }, ]; let configOk = true; checks.forEach((check) => { if (!check.value) { console.log(`❌ ${check.name} 未配置`); configOk = false; } else { // 部分隐藏敏感信息 const displayValue = check.name === "CONF_PASSWORD" ? check.value.substring(0, 4) + "****" : check.value; console.log(`✅ ${check.name}: ${displayValue}`); } }); if (!configOk) { console.log("\n❌ 请先配置 .env 文件"); console.log("参考 env-example.txt 文件"); process.exit(1); } console.log("\n📡 测试连接到 Confluence...\n"); const api = axios.create({ baseURL: `${CONF_BASE_URL}/rest/api`, auth: { username: CONF_USERNAME, password: CONF_PASSWORD, }, headers: { "Content-Type": "application/json", }, }); async function testConnection() { try { // 测试 1: 获取当前用户信息 console.log("1️⃣ 测试用户认证..."); const userRes = await api.get("/user/current"); console.log(` ✅ 认证成功: ${userRes.data.displayName} (${userRes.data.email})`); // 测试 2: 获取 Spaces console.log("\n2️⃣ 测试获取 Spaces..."); const spacesRes = await api.get("/space", { params: { type: "global", limit: 10 }, }); console.log(` ✅ 成功获取 ${spacesRes.data.results.length} 个 Spaces`); if (spacesRes.data.results.length > 0) { console.log("\n 📋 可用的 Spaces:"); spacesRes.data.results.forEach((s) => { const isCurrent = s.key === CONF_SPACE ? " 👈 当前配置" : ""; console.log(` - ${s.name} (${s.key})${isCurrent}`); }); } // 测试 3: 验证配置的 Space console.log(`\n3️⃣ 验证 Space: ${CONF_SPACE}...`); const spaceExists = spacesRes.data.results.find((s) => s.key === CONF_SPACE); if (spaceExists) { console.log(` ✅ Space 存在且可访问: ${spaceExists.name}`); // 测试 4: 获取该 Space 的页面 console.log("\n4️⃣ 测试读取页面列表..."); const pagesRes = await api.get("/content", { params: { spaceKey: CONF_SPACE, limit: 5 }, }); console.log(` ✅ 成功读取 ${pagesRes.data.results.length} 个页面`); if (pagesRes.data.results.length > 0) { console.log("\n 📄 最近的页面:"); pagesRes.data.results.forEach((p) => { console.log(` - ${p.title} (ID: ${p.id})`); }); } } else { console.log(` ⚠️ Space 不存在或无权限: ${CONF_SPACE}`); console.log(" 💡 请使用上面列出的 Space Key 之一"); } console.log("\n" + "=".repeat(60)); console.log("🎉 所有测试通过!MCP Server 配置正确"); console.log("=".repeat(60)); console.log("\n📝 下一步:"); console.log(" 1. 配置 Cursor MCP (参考 mcp-config-example.json)"); console.log(" 2. 重启 Cursor"); console.log(" 3. 在 Cursor 中开始使用 Confluence MCP\n"); } catch (error) { console.log("\n" + "=".repeat(60)); console.log("❌ 连接测试失败"); console.log("=".repeat(60)); if (error.response) { console.log(`\n状态码: ${error.response.status}`); console.log(`错误信息: ${error.response.statusText}`); if (error.response.status === 401) { console.log("\n💡 可能的原因:"); console.log(" 1. API Token 无效或已过期"); console.log(" 2. 用户名(邮箱)不正确"); console.log(" 3. 需要重新生成 API Token"); console.log("\n🔗 获取新的 API Token:"); console.log(" https://id.atlassian.com/manage-profile/security/api-tokens"); } else if (error.response.status === 404) { console.log("\n💡 可能的原因:"); console.log(" 1. CONF_BASE_URL 配置不正确"); console.log(" 2. Confluence 实例地址错误"); } } else if (error.code === "ENOTFOUND") { console.log("\n💡 可能的原因:"); console.log(" 1. CONF_BASE_URL 地址无法访问"); console.log(" 2. 网络连接问题"); console.log(` 3. 域名不存在: ${CONF_BASE_URL}`); } else { console.log(`\n错误: ${error.message}`); } console.log("\n"); process.exit(1); } } testConnection();

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/caijohnny/confluence-node'

If you have feedback or need assistance with the MCP directory API, please join our Discord server