import { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from 'node:http';
import { createServer } from '../server.js';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
export async function startHttp(port: number): Promise<void> {
const transports = new Map<string, SSEServerTransport>();
const httpServer = createHttpServer(async (req: IncomingMessage, res: ServerResponse) => {
const url = new URL(req.url ?? '/', `http://localhost:${port}`);
// CORS headers
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
if (req.method === 'OPTIONS') {
res.writeHead(204);
res.end();
return;
}
// Health check
if (url.pathname === '/health' && req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ status: 'ok', name: 'social-research-mcp', version: '0.1.0' }));
return;
}
// SSE endpoint — establishes MCP session
if (url.pathname === '/sse' && req.method === 'GET') {
const server = createServer();
const transport = new SSEServerTransport('/messages', res);
transports.set(transport.sessionId, transport);
req.on('close', () => {
transports.delete(transport.sessionId);
});
await server.connect(transport);
return;
}
// Messages endpoint — receives MCP messages for an active session
if (url.pathname === '/messages' && req.method === 'POST') {
const sessionId = url.searchParams.get('sessionId');
if (!sessionId) {
res.writeHead(400, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'Missing sessionId' }));
return;
}
const transport = transports.get(sessionId);
if (!transport) {
res.writeHead(404, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'Unknown session' }));
return;
}
await transport.handlePostMessage(req, res);
return;
}
// Root
if (url.pathname === '/' && req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
name: 'social-research-mcp',
version: '0.1.0',
endpoints: {
health: '/health',
sse: '/sse',
messages: '/messages',
},
}));
return;
}
res.writeHead(404);
res.end('Not found');
});
console.error(`social-research-mcp: HTTP server starting on port ${port}`);
console.error(` Health: http://localhost:${port}/health`);
console.error(` MCP SSE: http://localhost:${port}/sse`);
httpServer.listen(port);
}