UNPKG

mcp-politico

Version:

MCP Tool especializado en el análisis político colombiano para asesores del gobierno. Compatible con n8n (MCP Client - STDIO).

89 lines (71 loc) 2.38 kB
const express = require('express'); const fs = require('fs'); const path = require('path'); const dotenv = require('dotenv'); const cors = require('cors'); dotenv.config(); const app = express(); app.use(express.json()); app.use(cors()); const PORT = process.env.PORT || 3000; const VALID_TOKEN = process.env.MCP_TOKEN || 'allconex-2304'; // ✅ Cargar herramientas desde tools.json const toolsPath = path.join(__dirname, 'tools', 'tools.json'); let tools = []; try { const rawData = fs.readFileSync(toolsPath); tools = JSON.parse(rawData); } catch (err) { console.error('❌ Error al cargar tools.json:', err.message); tools = []; } // ✅ Endpoint raíz app.get('/', (req, res) => { res.json({ message: '🧠 MCP Tool Server activo', toolsCount: tools.length, status: 'ok', }); }); // ✅ Middleware de autenticación para endpoints sensibles function authMiddleware(req, res, next) { const authHeader = req.headers.authorization; const token = authHeader?.split(' ')[1]; if (!token || token !== VALID_TOKEN) { return res.status(401).json({ error: 'Token inválido o no autorizado' }); } next(); } // ✅ Listar herramientas (con token) app.get('/list-tools', authMiddleware, (req, res) => { res.setHeader('Content-Type', 'application/json'); res.json({ tools }); }); // ✅ Ejecutar herramienta (con token) app.post('/execute-tool', authMiddleware, async (req, res) => { const { tool, input } = req.body; if (!tool || typeof input !== 'object') { return res.status(400).json({ error: 'Missing or invalid "tool" or "input"' }); } const toolInfo = tools.find((t) => t.name === tool); if (!toolInfo) { return res.status(404).json({ error: `Tool "${tool}" not found` }); } const toolPath = path.join(__dirname, 'tools', `${tool}.js`); if (!fs.existsSync(toolPath)) { return res.status(500).json({ error: `Handler for "${tool}" not found` }); } try { const handler = require(toolPath); const result = await handler(input); res.setHeader('Content-Type', 'application/json'); res.json({ result }); } catch (err) { console.error(`❌ Error ejecutando ${tool}:`, err); res.status(500).json({ error: `Execution error: ${err.message}` }); } }); // ✅ Puerto app.listen(PORT, () => { console.log(`✅ MCP Tool Server escuchando en https://mcp.allconex.com:${PORT}`); });