mcp-hub/src/routes/mcp-proxy.js

51 lines
1.5 KiB
JavaScript

const { Router } = require('express');
const { v4: uuidv4 } = require('uuid');
const registry = require('../backend-registry');
const relay = require('../relay');
const router = Router();
const sessions = new Map();
router.get('/:serviceId/sse', (req, res) => {
const { serviceId } = req.params;
if (!registry.get(serviceId)) {
return res.status(502).json({ error: 'backend not connected' });
}
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
res.flushHeaders();
const clientSessionId = uuidv4();
sessions.set(clientSessionId, { res, serviceId });
res.write('event: endpoint\ndata: /' + serviceId + '/message?sessionId=' + clientSessionId + '\n\n');
req.on('close', () => {
sessions.delete(clientSessionId);
console.log('[sse] client disconnected: ' + clientSessionId + ' (' + serviceId + ')');
});
});
router.post('/:serviceId/message', (req, res) => {
const { serviceId } = req.params;
const { sessionId } = req.query;
const session = sessions.get(sessionId);
if (!session) {
return res.status(404).json({ error: 'session not found' });
}
if (!registry.get(serviceId)) {
return res.status(502).json({ error: 'backend not connected' });
}
relay.sendToBackend(serviceId, req.body, sessionId, sessions);
return res.status(202).json({ status: 'accepted' });
});
module.exports = router;
module.exports.sessions = sessions;