bookworm-boot/拓展/mcp-config-wizard/detect.js
bookworm 83c1e613a1 feat: 纳入拓展工具 + guide.html badges 对齐
- 拓展/: MCP配置向导、PowerShell工具、mcp-auto-loader 纳入版本管理
- guide.html: badges 从模糊 "90+" 改为精确 "92 Skills | 18 Agents | 34 Hooks"
2026-04-06 00:26:45 +08:00

143 lines
5.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const os = require('os');
const { execSync } = require('child_process');
console.log('╔════════════════════════════════════════════════════════╗');
console.log('║ MCP Configuration Wizard - System Detection ║');
console.log('╚════════════════════════════════════════════════════════╝\n');
// 检测系统信息
const detection = {
timestamp: new Date().toISOString(),
system: {
platform: os.platform(),
username: os.userInfo().username,
homedir: os.homedir(),
nodeVersion: process.version
},
claude: {
configDir: null,
configFile: null,
hasExistingConfig: false,
existingMcpServers: []
},
environment: {
variables: {},
mcpRelated: []
},
npm: {
globalPackages: [],
mcpPackages: []
}
};
// 1. 检测 Claude Code 配置目录
console.log('🔍 Detecting Claude Code configuration...');
const possibleConfigDirs = [
path.join(os.homedir(), '.claude'),
path.join(os.homedir(), 'AppData', 'Roaming', 'Claude'),
path.join(os.homedir(), 'Library', 'Application Support', 'Claude')
];
for (const dir of possibleConfigDirs) {
if (fs.existsSync(dir)) {
detection.claude.configDir = dir;
console.log(` ✓ Found: ${dir}`);
break;
}
}
if (!detection.claude.configDir) {
console.log(' ⚠ Claude config directory not found, will create on apply');
}
// 检测现有配置文件
const configFile = path.join(os.homedir(), '.claude.json');
if (fs.existsSync(configFile)) {
detection.claude.configFile = configFile;
detection.claude.hasExistingConfig = true;
try {
const config = JSON.parse(fs.readFileSync(configFile, 'utf-8'));
if (config.mcpServers) {
detection.claude.existingMcpServers = Object.keys(config.mcpServers);
console.log(` ✓ Existing config found with ${detection.claude.existingMcpServers.length} MCP servers`);
}
} catch (e) {
console.log(' ⚠ Config file exists but cannot be parsed');
}
} else {
console.log(' No existing .claude.json found');
}
// 2. 检测环境变量
console.log('\n🔍 Detecting environment variables...');
const mcpEnvVars = [
'GITHUB_PERSONAL_ACCESS_TOKEN',
'SLACK_BOT_TOKEN', 'SLACK_TEAM_ID',
'LINEAR_API_KEY',
'BROWSERBASE_PROJECT_ID', 'BROWSERBASE_API_KEY',
'CLOUDFLARE_API_TOKEN',
'FIRECRAWL_API_KEY',
'SUPABASE_URL', 'SUPABASE_SERVICE_ROLE_KEY',
'SENTRY_AUTH_TOKEN',
'NOTION_API_KEY',
'VERCEL_TOKEN',
'FIREBASE_PROJECT_ID', 'FIREBASE_PRIVATE_KEY', 'FIREBASE_CLIENT_EMAIL'
];
mcpEnvVars.forEach(varName => {
const value = process.env[varName];
if (value) {
detection.environment.mcpRelated.push(varName);
detection.environment.variables[varName] = value.substring(0, 10) + '...'; // 只保存前缀用于检测
}
});
console.log(` ✓ Found ${detection.environment.mcpRelated.length} MCP-related environment variables`);
detection.environment.mcpRelated.forEach(v => console.log(` - ${v}`));
// 3. 检测已安装的 npm 包
console.log('\n🔍 Detecting installed npm packages...');
try {
const globalList = execSync('npm list -g --depth=0 --json', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] });
const packages = JSON.parse(globalList);
if (packages.dependencies) {
detection.npm.globalPackages = Object.keys(packages.dependencies);
// 筛选 MCP 相关包
const mcpKeywords = ['mcp', 'modelcontextprotocol', 'claude'];
detection.npm.mcpPackages = detection.npm.globalPackages.filter(pkg =>
mcpKeywords.some(kw => pkg.toLowerCase().includes(kw))
);
if (detection.npm.mcpPackages.length > 0) {
console.log(` ✓ Found ${detection.npm.mcpPackages.length} MCP packages installed globally`);
detection.npm.mcpPackages.forEach(p => console.log(` - ${p}`));
} else {
console.log(' No MCP packages found (will use npx)');
}
}
} catch (e) {
console.log(' ⚠ Cannot detect npm packages (npm may not be installed)');
}
// 4. 保存检测结果
const outputFile = path.join(__dirname, 'detection-result.json');
fs.writeFileSync(outputFile, JSON.stringify(detection, null, 2));
console.log('\n╔════════════════════════════════════════════════════════╗');
console.log('║ Detection Complete ║');
console.log('╚════════════════════════════════════════════════════════╝');
console.log(`\n📄 Results saved to: ${outputFile}`);
console.log('\n📊 Summary:');
console.log(` Platform: ${detection.system.platform}`);
console.log(` User: ${detection.system.username}`);
console.log(` Claude Config: ${detection.claude.configDir || 'Not found'}`);
console.log(` Existing MCP Servers: ${detection.claude.existingMcpServers.length}`);
console.log(` Environment Variables: ${detection.environment.mcpRelated.length}`);
console.log(` MCP Packages: ${detection.npm.mcpPackages.length}`);
console.log('\n💡 Next step: Run "node wizard.js" to configure MCP services');