UNPKG

qeek-mcp-assistant

Version:

QEEK MCP Server - AI assistant for QEEK codebase questions. Connect to your Mastra service via Model Context Protocol.

165 lines (142 loc) • 5.31 kB
const fs = require('fs'); const path = require('path'); const os = require('os'); const inquirer = require('inquirer'); const { API_CONFIG, saveToken, saveConfig, getIDEConfigPaths, generateMCPConfig, detectIDEs } = require('./config'); // Setup MCP Assistant async function setup() { try { console.log('šŸš€ QEEK MCP Assistant Setup'); console.log('===============================\n'); // Create config directory const configDir = path.join(os.homedir(), '.qeek'); if (!fs.existsSync(configDir)) { fs.mkdirSync(configDir, { recursive: true }); } // Get token from environment or prompt user let token = process.env.QEEK_TOKEN; if (!token) { console.log('šŸ” Authentication Required'); console.log('You need a QEEK token to use the MCP assistant.\n'); console.log('To get your token:'); console.log('1. Visit: https://app.qeek.ai/auth/mcp-login'); console.log('2. Sign in with your QEEK account'); console.log('3. Copy the generated token\n'); const answers = await inquirer.prompt([ { type: 'input', name: 'token', message: 'Please enter your QEEK token:', validate: (input) => { if (!input || input.trim().length < 10) { return 'Please enter a valid QEEK token'; } return true; } } ]); token = answers.token.trim(); } // Save token saveToken(token); console.log('āœ… Token saved successfully'); // Save config const config = { token, apiUrl: API_CONFIG.PRODUCTION_URL }; saveConfig(config); console.log('āœ… Configuration saved'); // Configure IDEs automatically console.log('\nšŸ”§ Configuring Editors...'); const ides = detectIDEs(); const idePaths = getIDEConfigPaths(); const mcpConfig = { "mcpServers": generateMCPConfig('qeek-mcp-assistant', token) }; let configuredCount = 0; if (ides.cursor) { try { const cursorDir = path.dirname(idePaths.cursor); if (!fs.existsSync(cursorDir)) { fs.mkdirSync(cursorDir, { recursive: true }); } // Check if file exists and merge configs let existingConfig = {}; if (fs.existsSync(idePaths.cursor)) { try { existingConfig = JSON.parse(fs.readFileSync(idePaths.cursor, 'utf8')); } catch (e) { // File exists but is invalid JSON, backup and recreate fs.renameSync(idePaths.cursor, `${idePaths.cursor}.backup`); } } // Merge configurations const finalConfig = { mcpServers: { ...existingConfig.mcpServers, ...mcpConfig.mcpServers } }; fs.writeFileSync(idePaths.cursor, JSON.stringify(finalConfig, null, 2)); console.log('āœ… Cursor configured successfully'); configuredCount++; } catch (error) { console.log('āš ļø Failed to configure Cursor:', error.message); } } if (ides.windsurf) { try { const windsurfDir = path.dirname(idePaths.windsurf); if (!fs.existsSync(windsurfDir)) { fs.mkdirSync(windsurfDir, { recursive: true }); } // Check if file exists and merge configs let existingConfig = {}; if (fs.existsSync(idePaths.windsurf)) { try { existingConfig = JSON.parse(fs.readFileSync(idePaths.windsurf, 'utf8')); } catch (e) { // File exists but is invalid JSON, backup and recreate fs.renameSync(idePaths.windsurf, `${idePaths.windsurf}.backup`); } } // Merge configurations const finalConfig = { mcpServers: { ...existingConfig.mcpServers, ...mcpConfig.mcpServers } }; fs.writeFileSync(idePaths.windsurf, JSON.stringify(finalConfig, null, 2)); console.log('āœ… Windsurf configured successfully'); configuredCount++; } catch (error) { console.log('āš ļø Failed to configure Windsurf:', error.message); } } if (configuredCount === 0) { console.log('\nšŸ“ Manual Configuration Required'); console.log('No supported editors were found. You can manually configure your editor:'); console.log('\nFor Cursor, add to ~/.cursor/mcp.json:'); console.log(JSON.stringify(mcpConfig, null, 2)); console.log('\nFor Windsurf, add to ~/.codeium/windsurf/mcp_config.json:'); console.log(JSON.stringify(mcpConfig, null, 2)); } console.log('\nšŸŽ‰ Setup completed successfully!'); console.log('\nNext steps:'); console.log('1. Restart your editor (Cursor/Windsurf)'); console.log('2. Start asking questions with "qeek" prefix:'); console.log(' - "qeek tell me about the tickets functionality"'); console.log(' - "qeek how does authentication work?"'); console.log(' - "qeek explain the database schema"'); console.log('\nšŸ”§ Test your setup: npx qeek-mcp-assistant test'); } catch (error) { console.error('āŒ Error during setup:', error.message); process.exit(1); } } // Export functions module.exports = { setup };