http.ts•3.4 kB
/**
* HTTP transport implementation for MCP server
*/
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { createServer, IncomingMessage, ServerResponse } from 'http';
import { WebSocketServer, WebSocket } from 'ws';
import { Config } from '../config.js';
/**
* Start HTTP transport with WebSocket support for production deployment
*/
export function startHttpTransport(config: Config): void {
const server = createServer(handleHttpRequest);
const wss = new WebSocketServer({ server });
wss.on('connection', handleWebSocketConnection);
server.listen(config.port, () => {
console.error(`Forensics Connection MCP server running on HTTP port ${config.port}`);
});
// Health check endpoint
server.on('request', (req: IncomingMessage, res: ServerResponse) => {
if (req.url === '/health' && req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
status: 'healthy',
timestamp: new Date().toISOString(),
service: 'forensics-connections-mcp'
}));
return;
}
});
// Handle process termination
process.on('SIGINT', () => {
console.error('Shutting down HTTP transport...');
server.close(() => {
process.exit(0);
});
});
process.on('SIGTERM', () => {
console.error('Shutting down HTTP transport...');
server.close(() => {
process.exit(0);
});
});
}
/**
* Handle HTTP requests
*/
function handleHttpRequest(req: IncomingMessage, res: ServerResponse): void {
// Set 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(200);
res.end();
return;
}
if (req.url === '/') {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Forensics Connection MCP Server - Use WebSocket for MCP protocol');
return;
}
if (req.url === '/health') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
status: 'healthy',
timestamp: new Date().toISOString(),
service: 'forensics-connections-mcp'
}));
return;
}
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Not Found');
}
/**
* Handle WebSocket connections for MCP protocol
*/
function handleWebSocketConnection(ws: WebSocket): void {
console.error('WebSocket connection established');
ws.on('message', (data: Buffer) => {
try {
// Handle MCP protocol messages here
const message = JSON.parse(data.toString());
console.error('Received MCP message:', message.method || 'unknown');
// Echo back for now - actual MCP protocol handling would go here
ws.send(JSON.stringify({
jsonrpc: '2.0',
id: message.id,
result: { status: 'received' }
}));
} catch (error) {
console.error('Error handling WebSocket message:', error);
ws.send(JSON.stringify({
jsonrpc: '2.0',
error: {
code: -32700,
message: 'Parse error'
}
}));
}
});
ws.on('close', () => {
console.error('WebSocket connection closed');
});
ws.on('error', (error: Error) => {
console.error('WebSocket error:', error);
});
}