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
JavaScript
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
};