aem-mcp-server
Version:
AEM MCP server. Chat with your AEM instance for content, component, and asset operations.
2 lines (1 loc) • 1.77 kB
JavaScript
;import{randomUUID as u}from"node:crypto";import{StreamableHTTPServerTransport as c}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as p}from"@modelcontextprotocol/sdk/types.js";import{transports as n}from"./mcp.transports.js";import{createMCPServer as f}from"./mcp.server.js";import{LOGGER as s}from"../utils/logger.js";export const handleRequest=async(o,i,a)=>{s.log("Received MCP request:",o.body);const{jsonrpc:l,id:d,method:m}=o.body;if(l!=="2.0"||!m){i.status(400).json({jsonrpc:"2.0",id:d||null,error:{code:-32600,message:"Invalid Request",data:"Must be valid JSON-RPC 2.0"}});return}try{const e=o.headers["mcp-session-id"];let t;if(e&&n[e])s.log(`Using existing session: ${e}`),t=n[e];else if(p(o.body)){e&&!n[e]?s.log(`Session ID ${e} not found - server was likely restarted. Re-initializing...`):s.log("New initialization request"),t=new c({sessionIdGenerator:()=>u(),enableJsonResponse:!0,onsessioninitialized:r=>{s.log(`Session initialized with ID: ${r}`),n[r]=t,e&&e!==r&&s.log(`Session ID changed from ${e} to ${r} (server restart detected)`)}}),t.onclose=()=>{const r=t.sessionId;r&&n[r]&&(s.log(`Transport closed for session ${r}, removing from transports map`),delete n[r])},s.log("Connecting to MCP server"),await f(a).connect(t),await t.handleRequest(o,i,o.body);return}else{s.log("Invalid request - no session ID or not initialization request"),i.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided. Please re-initialize the MCP server."},id:null});return}await t.handleRequest(o,i,o.body)}catch(e){s.error("Error handling MCP request:",e),i.headersSent||i.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}};