#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function question(prompt) {
return new Promise((resolve) => {
rl.question(prompt, resolve);
});
}
async function setup() {
console.log('π Jira MCP Server μ€μ μ μμν©λλ€.\n');
const jiraUrl = await question('Jira URL (μ: https://your-domain.atlassian.net): ');
const jiraUsername = await question('Jira μ¬μ©μ μ΄λ©μΌ: ');
const jiraApiToken = await question('Jira API ν ν°: ');
const defaultProject = await question('κΈ°λ³Έ νλ‘μ νΈ ν€ (μ νμ¬ν): ');
// config ν΄λκ° μμΌλ©΄ μμ±
const configDir = path.join(process.cwd(), 'config');
if (!fs.existsSync(configDir)) {
fs.mkdirSync(configDir, { recursive: true });
console.log('π config ν΄λκ° μμ±λμμ΅λλ€.');
}
// .env νμΌμ config ν΄λμ μμ±
const envContent = `# Jira Configuration
JIRA_URL=${jiraUrl}
JIRA_USERNAME=${jiraUsername}
JIRA_API_TOKEN=${jiraApiToken}
${defaultProject ? `DEFAULT_PROJECT_KEY=${defaultProject}` : '# DEFAULT_PROJECT_KEY=PROJ'}
`;
const envPath = path.join(configDir, '.env');
fs.writeFileSync(envPath, envContent);
console.log('β
config/.env νμΌμ΄ μμ±λμμ΅λλ€.');
// Claude Desktop μ€μ νμΌμ config ν΄λμ μμ±
const isWindows = process.platform === 'win32';
const currentDir = process.cwd();
const indexPath = path.join(currentDir, 'server', 'index.js');
const claudeConfig = {
mcpServers: {
jira: {
command: 'node',
args: [indexPath],
env: {
JIRA_URL: jiraUrl,
JIRA_USERNAME: jiraUsername,
JIRA_API_TOKEN: jiraApiToken,
...(defaultProject && { DEFAULT_PROJECT_KEY: defaultProject })
}
}
}
};
const configFileName = 'claude_desktop_config.json';
const claudeConfigPath = path.join(configDir, configFileName);
fs.writeFileSync(claudeConfigPath, JSON.stringify(claudeConfig, null, 2));
console.log(`β
config/${configFileName} νμΌμ΄ μμ±λμμ΅λλ€.`);
if (isWindows) {
console.log('\nπ Windowsμμ Claude Desktop μ€μ :');
console.log(`1. %APPDATA%\\Claude\\claude_desktop_config.json νμΌμ μ΄μ΄μ£ΌμΈμ.`);
console.log(`2. μμ±λ config/${configFileName} νμΌμ λ΄μ©μ 볡μ¬νμ¬ λΆμ¬λ£μ΄μ£ΌμΈμ.`);
} else {
console.log('\nπ macOSμμ Claude Desktop μ€μ :');
console.log(`1. ~/Library/Application Support/Claude/claude_desktop_config.json νμΌμ μ΄μ΄μ£ΌμΈμ.`);
console.log(`2. μμ±λ config/${configFileName} νμΌμ λ΄μ©μ 볡μ¬νμ¬ λΆμ¬λ£μ΄μ£ΌμΈμ.`);
}
console.log('\nπ§ μ€μ μλ£ ν Claude Desktopμ μ¬μμν΄μ£ΌμΈμ.');
console.log('\nπ μ€μ μ΄ μλ£λμμ΅λλ€! μ΄μ Claudeμμ Jiraλ₯Ό μ¬μ©ν μ μμ΅λλ€.');
rl.close();
}
setup().catch(console.error);