mcp-styledbook
Version:
Model Context Protocol para criação de ebooks estilizados com pesquisa profunda e formatação visual impactante
164 lines (143 loc) • 6.23 kB
JavaScript
const path = require('path');
const fs = require('fs-extra');
const { spawn } = require('child_process');
// Caminho para o index.js principal
const serverPath = path.join(__dirname, '..', 'index.js');
// Banner
console.log('\n');
console.log('███████╗████████╗██╗ ██╗██╗ ███████╗██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗');
console.log('██╔════╝╚══██╔══╝╚██╗ ██╔╝██║ ██╔════╝██╔══██╗██╔══██╗██╔═══██╗██╔═══██╗██║ ██╔╝');
console.log('███████╗ ██║ ╚████╔╝ ██║ █████╗ ██║ ██║██████╔╝██║ ██║██║ ██║█████╔╝ ');
console.log('╚════██║ ██║ ╚██╔╝ ██║ ██╔══╝ ██║ ██║██╔══██╗██║ ██║██║ ██║██╔═██╗ ');
console.log('███████║ ██║ ██║ ███████╗███████╗██████╔╝██████╔╝╚██████╔╝╚██████╔╝██║ ██╗');
console.log('╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝');
console.log('\n🚀 MCP para criação de ebooks estilizados e revolucionários - v1.0.3\n');
// Verifica os argumentos da linha de comando
const args = process.argv.slice(2);
const helpArg = args.find(arg => arg === '--help' || arg === '-h');
const versionArg = args.find(arg => arg === '--version' || arg === '-v');
const portArg = args.find(arg => arg.startsWith('--port='));
const transportArg = args.find(arg => arg.startsWith('--transport='));
const jsonOutput = args.find(arg => arg === '--json');
// Verifica se é modo de ajuda
if (helpArg) {
console.log('Uso: mcp-styledbook [opções]');
console.log('\nOpções:');
console.log(' --port=NÚMERO Porta para o servidor (padrão: 3001)');
console.log(' --transport=TIPO Tipo de transporte (http, stdio) (padrão: http)');
console.log(' --version, -v Mostra a versão do MCP StyledBook');
console.log(' --help, -h Mostra esta ajuda');
console.log(' --json Saída em formato JSON (para integração com ferramentas)');
process.exit(0);
}
// Verifica se é pedido de versão
if (versionArg) {
console.log('MCP StyledBook v1.0.3');
process.exit(0);
}
// Verifica se a pasta "ebook" existe, se não, cria
const ebookDir = path.join(process.cwd(), 'ebook');
if (!fs.existsSync(ebookDir)) {
console.log('📁 Criando diretório de ebooks...');
fs.mkdirSync(ebookDir);
}
// Pega argumento de porta
let port = 3001;
if (portArg) {
port = parseInt(portArg.split('=')[1]);
}
// Tipo de transporte
let transport = 'http';
if (transportArg) {
transport = transportArg.split('=')[1].toLowerCase();
if (transport !== 'http' && transport !== 'stdio') {
console.error('❌ Tipo de transporte inválido. Use http ou stdio.');
process.exit(1);
}
}
// Define porta como variável de ambiente
process.env.PORT = port;
process.env.TRANSPORT = transport;
if (!jsonOutput) {
console.log(`🌐 Iniciando MCP StyledBook na porta ${port}...`);
console.log(`💡 Tipo de transporte: ${transport}`);
console.log('\n📚 Configuração para uso com ferramentas de IA:');
if (transport === 'http') {
console.log('\n==== CURSOR ====');
console.log('1. Cursor → Configurações → Features → MCP Servers');
console.log('2. Adicione um novo servidor: http');
console.log(`3. URL: http://localhost:${port}/mcp`);
console.log('\n==== TRAE ====');
console.log('1. Trae → Configurações → MCP');
console.log(`2. Adicione: http://localhost:${port}/mcp`);
console.log('\n==== WINDSURF ====');
console.log('1. Windsurf → Configurações → MCP');
console.log(`2. Adicione: http://localhost:${port}/mcp`);
console.log('\n==== CONFIGURAÇÃO JSON (.cursor/mcp.json) ====');
console.log(`{
"mcpServers": {
"styledbook": {
"url": "http://localhost:${port}/mcp"
}
}
}\n`);
} else {
console.log('\n==== CONFIGURAÇÃO JSON (.cursor/mcp.json) ====');
console.log(`{
"mcpServers": {
"styledbook": {
"command": "npx",
"args": ["-y", "mcp-styledbook", "--transport=stdio"]
}
}
}\n`);
}
console.log('💡 DICA: Digite Ctrl+C para parar o servidor');
console.log('');
} else {
// Saída JSON para ferramentas
console.log(JSON.stringify({
name: "MCP StyledBook",
version: "1.0.3",
port: port,
transport: transport,
status: "starting",
config: {
http: `http://localhost:${port}/mcp`,
stdio: "npx -y mcp-styledbook --transport=stdio"
}
}));
}
// Executa o servidor
const serverProcess = spawn('node', [serverPath], {
stdio: transport === 'stdio' ? 'inherit' : 'pipe',
env: process.env
});
if (transport !== 'stdio') {
serverProcess.stdout.on('data', (data) => {
if (!jsonOutput) {
process.stdout.write(data);
}
});
serverProcess.stderr.on('data', (data) => {
if (!jsonOutput) {
process.stderr.write(data);
}
});
}
serverProcess.on('close', (code) => {
if (code !== 0 && !jsonOutput) {
console.error(`\n❌ Servidor encerrado com código ${code}`);
} else if (!jsonOutput) {
console.log('\n👋 Servidor encerrado.');
}
process.exit(code);
});
// Captura CTRL+C para fechar o servidor graciosamente
process.on('SIGINT', () => {
if (!jsonOutput) {
console.log('\n🛑 Recebido sinal de interrupção, encerrando servidor...');
}
serverProcess.kill('SIGINT');
});