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
JavaScript
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}`);
});