UNPKG

mcp-styledbook

Version:

Model Context Protocol para criação de ebooks estilizados com pesquisa profunda e formatação visual impactante

302 lines (258 loc) 12.9 kB
#!/usr/bin/env node /** * Script para verificar se o MCP StyledBook está funcionando corretamente * Este script tenta usar o npx para executar o MCP e verificar se está acessível */ const { spawn } = require('child_process'); const http = require('http'); const fs = require('fs'); const path = require('path'); const os = require('os'); // Banner console.log('\n'); console.log('███████╗████████╗██╗ ██╗██╗ ███████╗██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗'); console.log('██╔════╝╚══██╔══╝╚██╗ ██╔╝██║ ██╔════╝██╔══██╗██╔══██╗██╔═══██╗██╔═══██╗██║ ██╔╝'); console.log('███████╗ ██║ ╚████╔╝ ██║ █████╗ ██║ ██║██████╔╝██║ ██║██║ ██║█████╔╝ '); console.log('╚════██║ ██║ ╚██╔╝ ██║ ██╔══╝ ██║ ██║██╔══██╗██║ ██║██║ ██║██╔═██╗ '); console.log('███████║ ██║ ██║ ███████╗███████╗██████╔╝██████╔╝╚██████╔╝╚██████╔╝██║ ██╗'); console.log('╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝'); console.log('\n🔍 VERIFICADOR MCP STYLEDBOOK\n'); // Cores para o console const colors = { reset: '\x1b[0m', green: '\x1b[32m', red: '\x1b[31m', yellow: '\x1b[33m', blue: '\x1b[34m', magenta: '\x1b[35m' }; // Função para verificar se o Node.js está instalado async function verificarNodeJS() { console.log(`${colors.blue}[1/5]${colors.reset} Verificando instalação do Node.js...`); try { const { execSync } = require('child_process'); const nodeVersion = execSync('node --version').toString().trim(); const npmVersion = execSync('npm --version').toString().trim(); console.log(`${colors.green}✓ Node.js ${nodeVersion} e npm ${npmVersion} estão instalados.${colors.reset}`); return true; } catch (error) { console.log(`${colors.red}✗ Node.js não está instalado ou não está no PATH.${colors.reset}`); console.log(`${colors.yellow}→ Instale o Node.js em: https://nodejs.org/${colors.reset}`); return false; } } // Função para verificar se o npx está disponível async function verificarNpx() { console.log(`${colors.blue}[2/5]${colors.reset} Verificando disponibilidade do npx...`); try { const { execSync } = require('child_process'); const npxVersion = execSync('npx --version').toString().trim(); console.log(`${colors.green}✓ npx ${npxVersion} está disponível.${colors.reset}`); return true; } catch (error) { console.log(`${colors.red}✗ npx não está instalado ou não está no PATH.${colors.reset}`); console.log(`${colors.yellow}→ npx geralmente vem com o npm. Tente atualizar o npm: npm install -g npm${colors.reset}`); return false; } } // Função para verificar se o pacote está publicado no npm async function verificarDisponibilidadeNpm() { console.log(`${colors.blue}[3/5]${colors.reset} Verificando disponibilidade do pacote no npm...`); return new Promise((resolve) => { const req = http.get('http://registry.npmjs.org/mcp-styledbook', (res) => { if (res.statusCode === 200) { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { try { const npmInfo = JSON.parse(data); const latestVersion = npmInfo['dist-tags'].latest; console.log(`${colors.green}✓ mcp-styledbook está disponível no npm (versão ${latestVersion}).${colors.reset}`); resolve(true); } catch (e) { console.log(`${colors.red}✗ Erro ao processar informações do npm.${colors.reset}`); resolve(false); } }); } else if (res.statusCode === 404) { console.log(`${colors.red}✗ O pacote mcp-styledbook não foi encontrado no npm.${colors.reset}`); console.log(`${colors.yellow}→ Você precisa publicar o pacote: npm publish${colors.reset}`); resolve(false); } else { console.log(`${colors.red}✗ Erro ao verificar o npm: status ${res.statusCode}.${colors.reset}`); resolve(false); } }); req.on('error', (e) => { console.log(`${colors.red}✗ Erro de conexão com o npm registry: ${e.message}.${colors.reset}`); console.log(`${colors.yellow}→ Verifique sua conexão com a internet.${colors.reset}`); resolve(false); }); req.end(); }); } // Função para verificar o arquivo de configuração do MCP async function verificarArquivoConfiguracao() { console.log(`${colors.blue}[4/5]${colors.reset} Verificando arquivo de configuração do MCP...`); // Verifica configuração global const homedir = os.homedir(); const configDirGlobal = path.join(homedir, '.cursor'); const configFileGlobal = path.join(configDirGlobal, 'mcp.json'); // Verifica configuração local const configDirLocal = path.join(process.cwd(), '.cursor'); const configFileLocal = path.join(configDirLocal, 'mcp.json'); let configEncontrada = false; if (fs.existsSync(configFileGlobal)) { console.log(`${colors.green}✓ Arquivo de configuração global encontrado em:${colors.reset} ${configFileGlobal}`); try { const config = JSON.parse(fs.readFileSync(configFileGlobal, 'utf8')); if (config.mcpServers && config.mcpServers.styledbook) { console.log(`${colors.green}✓ Configuração para styledbook encontrada no arquivo global.${colors.reset}`); configEncontrada = true; } } catch (error) { console.log(`${colors.red}✗ Erro ao analisar o arquivo de configuração global: ${error.message}.${colors.reset}`); } } if (fs.existsSync(configFileLocal)) { console.log(`${colors.green}✓ Arquivo de configuração local encontrado em:${colors.reset} ${configFileLocal}`); try { const config = JSON.parse(fs.readFileSync(configFileLocal, 'utf8')); if (config.mcpServers && config.mcpServers.styledbook) { console.log(`${colors.green}✓ Configuração para styledbook encontrada no arquivo local.${colors.reset}`); configEncontrada = true; } } catch (error) { console.log(`${colors.red}✗ Erro ao analisar o arquivo de configuração local: ${error.message}.${colors.reset}`); } } if (!configEncontrada) { console.log(`${colors.yellow}⚠ Nenhuma configuração para MCP StyledBook encontrada.${colors.reset}`); console.log(`${colors.yellow}→ Execute um dos scripts de instalação:${colors.reset}`); console.log(` - Windows: mcp-install-windows.bat`); console.log(` - macOS/Linux: ./mcp-install-unix.sh`); return false; } return true; } // Função para testar o MCP com HTTP async function testarMcpHttp() { console.log(`${colors.blue}[5/5]${colors.reset} Testando MCP StyledBook via HTTP...`); return new Promise((resolve) => { // Porta para o teste const testPort = 3456; // Inicia o servidor MCP const serverProcess = spawn('npx', ['-y', 'mcp-styledbook', '--port=' + testPort, '--transport=http', '--json'], { stdio: ['ignore', 'pipe', 'pipe'], shell: true }); let serverOutput = ''; let serverError = ''; let serverStarted = false; // Timeout para aguardar o servidor iniciar const timeout = setTimeout(() => { if (!serverStarted) { console.log(`${colors.red}✗ Timeout ao aguardar o servidor iniciar.${colors.reset}`); if (serverError) { console.log(`${colors.red}Erro: ${serverError}${colors.reset}`); } if (serverProcess) serverProcess.kill(); resolve(false); } }, 15000); serverProcess.stdout.on('data', (data) => { serverOutput += data.toString(); if (!serverStarted && serverOutput.includes('"status":"starting"')) { serverStarted = true; clearTimeout(timeout); // Aguarda um pouco para o servidor estar completamente pronto setTimeout(() => { // Faz uma requisição de teste para o servidor const req = http.request({ hostname: 'localhost', port: testPort, path: '/mcp', method: 'POST', headers: { 'Content-Type': 'application/json' } }, (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { serverProcess.kill(); if (res.statusCode === 200) { console.log(`${colors.green}✓ MCP StyledBook respondeu com sucesso!${colors.reset}`); resolve(true); } else { console.log(`${colors.red}✗ MCP StyledBook respondeu com status ${res.statusCode}.${colors.reset}`); console.log(`${colors.yellow}→ Resposta: ${data}${colors.reset}`); resolve(false); } }); }); req.on('error', (error) => { serverProcess.kill(); console.log(`${colors.red}✗ Erro ao conectar com o MCP: ${error.message}.${colors.reset}`); resolve(false); }); // Envia uma requisição para o método info req.write(JSON.stringify({ jsonrpc: "2.0", id: "test", method: "info" })); req.end(); }, 2000); } }); serverProcess.stderr.on('data', (data) => { serverError += data.toString(); }); serverProcess.on('error', (error) => { clearTimeout(timeout); console.log(`${colors.red}✗ Erro ao iniciar o MCP: ${error.message}.${colors.reset}`); resolve(false); }); }); } // Função principal async function verificarTudo() { console.log(`${colors.magenta}🔎 Iniciando verificação do MCP StyledBook...${colors.reset}\n`); const nodeOK = await verificarNodeJS(); if (!nodeOK) return false; const npxOK = await verificarNpx(); if (!npxOK) return false; const npmOK = await verificarDisponibilidadeNpm(); if (!npmOK) return false; const configOK = await verificarArquivoConfiguracao(); const testOK = await testarMcpHttp(); console.log(`\n${colors.magenta}📊 RESULTADO DA VERIFICAÇÃO:${colors.reset}`); console.log(`${colors.blue}------------------------${colors.reset}`); console.log(`Node.js: ${nodeOK ? colors.green + '✓ OK' : colors.red + '✗ FALHA'}`); console.log(`npx: ${npxOK ? colors.green + '✓ OK' : colors.red + '✗ FALHA'}`); console.log(`npm: ${npmOK ? colors.green + '✓ OK' : colors.red + '✗ FALHA'}`); console.log(`Configuração: ${configOK ? colors.green + '✓ OK' : colors.yellow + '⚠ AVISO'}`); console.log(`Teste HTTP: ${testOK ? colors.green + '✓ OK' : colors.red + '✗ FALHA'}`); console.log(`${colors.blue}------------------------${colors.reset}`); if (nodeOK && npxOK && npmOK && testOK) { console.log(`\n${colors.green}✅ MCP StyledBook está pronto para uso!${colors.reset}`); if (!configOK) { console.log(`${colors.yellow}⚠ Mas a configuração do arquivo mcp.json não foi encontrada.${colors.reset}`); console.log(`${colors.yellow} Execute um dos scripts de instalação para configurar automáticamente.${colors.reset}`); } return true; } else { console.log(`\n${colors.red}❌ Foram encontrados problemas com o MCP StyledBook.${colors.reset}`); console.log(`${colors.yellow} Consulte o guia de resolução de problemas em SOLUCAO_PROBLEMAS.md${colors.reset}`); return false; } } // Executa a verificação verificarTudo().then((resultado) => { process.exit(resultado ? 0 : 1); });