mcp-politico
Version:
MCP Tool especializado en el análisis político colombiano para asesores del gobierno. Compatible con n8n (MCP Client - STDIO).
70 lines (56 loc) • 2.04 kB
JavaScript
require('dotenv').config();
const axios = require('axios');
const argv = require('yargs/yargs')(process.argv.slice(2)).argv;
const endpoint = process.env.MCP_ENDPOINT || 'https://mcp.allconex.com';
const getInput = async () => {
const chunks = [];
return new Promise((resolve) => {
process.stdin.on('data', (chunk) => chunks.push(chunk));
process.stdin.on('end', () => {
try {
const input = Buffer.concat(chunks).toString();
resolve(JSON.parse(input));
} catch (err) {
process.stdout.write(JSON.stringify({ error: '❌ Entrada JSON inválida.' }) + '\n');
process.stdout.end?.();
process.exit(1);
}
});
});
};
const sendOutput = (data) => {
process.stdout.write(JSON.stringify(data, null, 2) + '\n');
process.stdout.end?.(); // Forzar cierre de stdout en entornos como n8n
process.exit(0);
};
const sendError = (message) => {
process.stdout.write(JSON.stringify({ error: `❌ Error: ${message}` }) + '\n');
process.stdout.end?.();
process.exit(1);
};
const main = async () => {
try {
const request = await getInput();
const token = process.env.MCP_TOKEN || request.token || argv.token;
if (!token) return sendError('🔒 Token no definido. Usa MCP_TOKEN, "--token=" o inclúyelo en el JSON.');
if (request.type === 'list-tools') {
const res = await axios.get(`${endpoint}/list-tools`, {
headers: { Authorization: `Bearer ${token}` }
});
return sendOutput(res.data);
}
if (request.type === 'execute-tool') {
const { tool, input } = request;
const res = await axios.post(`${endpoint}/execute-tool`, { tool, input }, {
headers: { Authorization: `Bearer ${token}` }
});
return sendOutput(res.data);
}
return sendError('❌ Tipo de operación no soportado. Usa "list-tools" o "execute-tool".');
} catch (err) {
const errorMessage = err?.response?.data?.error || err.message;
return sendError(errorMessage);
}
};
main();