import { Router, Request, Response } from 'express';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import { registerAllPrompts } from '../prompts/register';
import { registerAllResources } from '../resources/register';
import { registerAllTools } from '../tools/register';
import { VERSION } from '../config/version';
const router = Router();
const MCP_SERVER_NAME = '@contentful/mcp-server';
async function initializeServer() {
const server = new McpServer({
name: MCP_SERVER_NAME,
version: VERSION,
});
registerAllTools(server);
registerAllPrompts(server);
registerAllResources(server);
return server;
}
router.post('/mcp', async (req: Request, res: Response) => {
try {
const server = await initializeServer();
const transport: StreamableHTTPServerTransport = new StreamableHTTPServerTransport({
sessionIdGenerator: undefined,
});
res.on('close', () => {
console.log('Request closed');
transport.close();
server.close();
});
await server.connect(transport);
await transport.handleRequest(req, res, req.body);
} catch (error) {
console.error('Error handling MCP request:', error);
if (!res.headersSent) {
res.status(500).json({
jsonrpc: '2.0',
error: {
code: -32603,
message: 'Internal server error',
},
id: null,
});
}
}
});
export default router;