UNPKG

@labforadvanced.study/lotto-mcp-server

Version:

MCP Server for automated lotto purchase and checking with npx support

153 lines β€’ 6.58 kB
#!/usr/bin/env node import { createInterface } from 'readline'; import { encryptCredentials, encodeCredentialsSimple } from './crypto-utils.js'; const rl = createInterface({ input: process.stdin, output: process.stdout }); function question(prompt) { return new Promise((resolve) => { rl.question(prompt, resolve); }); } function questionHidden(prompt) { return new Promise((resolve) => { process.stdout.write(prompt); process.stdin.setRawMode(true); process.stdin.resume(); let input = ''; const handler = (data) => { const char = data.toString(); switch (char) { case '\n': case '\r': case '\u0004': // Ctrl+D process.stdin.setRawMode(false); process.stdin.pause(); process.stdin.removeListener('data', handler); process.stdout.write('\n'); resolve(input); break; case '\u0003': // Ctrl+C process.exit(); break; case '\u007f': // Backspace if (input.length > 0) { input = input.slice(0, -1); process.stdout.write('\b \b'); } break; default: input += char; process.stdout.write('*'); } }; process.stdin.on('data', handler); }); } async function getCredentials() { console.log('πŸ” 둜또 계정 정보 인코딩 도ꡬ'); console.log('================================\n'); const id = await question('λ™ν–‰λ³΅κΆŒ ID: '); const password = await questionHidden('λ™ν–‰λ³΅κΆŒ νŒ¨μŠ€μ›Œλ“œ: '); console.log('\nπŸ“Œ 인코딩 방식을 μ„ νƒν•˜μ„Έμš”:'); console.log('1. 간단 λͺ¨λ“œ (Base64) - μΆ”μ²œ'); console.log('2. κ³ κΈ‰ λͺ¨λ“œ (AES μ•”ν˜Έν™”)'); const modeAnswer = await question('\n선택 (1/2): '); const useSimpleMode = modeAnswer === '1' || modeAnswer === ''; let useCustomSecret = false; let customSecret; if (!useSimpleMode) { const useCustomSecretAnswer = await question('μ‚¬μš©μž μ •μ˜ μ•”ν˜Έν™” ν‚€λ₯Ό μ‚¬μš©ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? (y/N): '); useCustomSecret = useCustomSecretAnswer.toLowerCase() === 'y' || useCustomSecretAnswer.toLowerCase() === 'yes'; if (useCustomSecret) { customSecret = await questionHidden('μ•”ν˜Έν™” ν‚€ μž…λ ₯ (32자 이상 ꢌμž₯): '); if (customSecret.length < 8) { console.log('\n⚠️ κ²½κ³ : μ•”ν˜Έν™” ν‚€κ°€ λ„ˆλ¬΄ μ§§μŠ΅λ‹ˆλ‹€. λ³΄μ•ˆμ„ μœ„ν•΄ μ΅œμ†Œ 8자 이상 μž…λ ₯ν•΄μ£Όμ„Έμš”.'); customSecret = await questionHidden('μ•”ν˜Έν™” ν‚€ μž¬μž…λ ₯: '); } } } return { id, password, useSimpleMode, useCustomSecret, customSecret }; } function generateSimpleMCPConfig(encodedCredentials) { const config = { mcpServers: { lotto: { command: "node", args: ["path/to/lotto-mcp-server/dist/index.js"], env: { LOTTO_CREDENTIALS: encodedCredentials } } } }; return JSON.stringify(config, null, 2); } function generateAdvancedMCPConfig(encryptedId, encryptedPassword, secretKey) { const config = { mcpServers: { lotto: { command: "node", args: ["path/to/lotto-mcp-server/dist/index.js"], env: { LOTTO_ENCRYPTED_ID: encryptedId, LOTTO_ENCRYPTED_PASSWORD: encryptedPassword, ...(secretKey && { LOTTO_SECRET_KEY: secretKey }) } } } }; return JSON.stringify(config, null, 2); } async function main() { try { const credentials = await getCredentials(); console.log('\nβœ… 인코딩 μ™„λ£Œ!\n'); if (credentials.useSimpleMode) { // 간단 λͺ¨λ“œ (Base64) const encoded = encodeCredentialsSimple(credentials.id, credentials.password); console.log('πŸ”‘ Base64 μΈμ½”λ”©λœ 계정 정보:'); console.log('================================'); console.log(`μΈμ½”λ”©λœ 계정: ${encoded}`); console.log('\nπŸ’‘ ν„°λ―Έλ„μ—μ„œ 직접 μƒμ„±ν•˜λŠ” 방법:'); console.log('================================'); console.log(`echo "${credentials.id},${credentials.password}" | base64`); console.log('\nπŸ“‹ Claude Desktop μ„€μ • 파일 (claude_desktop_config.json):'); console.log('================================'); console.log(generateSimpleMCPConfig(encoded)); } else { // κ³ κΈ‰ λͺ¨λ“œ (AES μ•”ν˜Έν™”) let secretKey; if (credentials.useCustomSecret) { secretKey = credentials.customSecret; } const encrypted = encryptCredentials(credentials.id, credentials.password, secretKey); console.log('πŸ”‘ AES μ•”ν˜Έν™”λœ 계정 정보:'); console.log('================================'); console.log(`μ•”ν˜Έν™”λœ ID: ${encrypted.encryptedId}`); console.log(`μ•”ν˜Έν™”λœ νŒ¨μŠ€μ›Œλ“œ: ${encrypted.encryptedPassword}`); if (credentials.useCustomSecret && credentials.customSecret) { console.log(`μ‚¬μš©μž μ •μ˜ ν‚€: ${credentials.customSecret}`); } console.log('\nπŸ“‹ Claude Desktop μ„€μ • 파일 (claude_desktop_config.json):'); console.log('================================'); console.log(generateAdvancedMCPConfig(encrypted.encryptedId, encrypted.encryptedPassword, credentials.customSecret)); } console.log('\nπŸ“ μ‚¬μš©λ²•:'); console.log('1. μœ„μ˜ 섀정을 claude_desktop_config.json에 λ³΅μ‚¬ν•˜μ„Έμš”'); console.log('2. "path/to/lotto-mcp-server/dist/index.js"λ₯Ό μ‹€μ œ 경둜둜 λ³€κ²½ν•˜μ„Έμš”'); console.log('3. Claude Desktop을 μž¬μ‹œμž‘ν•˜μ„Έμš”'); console.log('4. 이제 ID/νŒ¨μŠ€μ›Œλ“œ 없이 "둜또 3κ²Œμž„ κ΅¬λ§€ν•΄μ€˜"라고 λ§ν•˜λ©΄ λ©λ‹ˆλ‹€!'); } catch (error) { console.error('\n❌ 였λ₯˜ λ°œμƒ:', error instanceof Error ? error.message : 'μ•Œ 수 μ—†λŠ” 였λ₯˜'); process.exit(1); } finally { rl.close(); } } main(); //# sourceMappingURL=encrypt-credentials.js.map