@yashwant.dharmdas/elementor-mcp 3.18.1 → 3.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +53 -14
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
6
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
7
7
  import { createServer } from "node:http";
8
+ import { randomUUID } from "node:crypto";
8
9
  import { z } from "zod";
9
10
  import axios from "axios";
10
11
  import fs from "fs";
@@ -4123,9 +4124,23 @@ else {
4123
4124
  else {
4124
4125
  // ── HTTP mode — for browser-based MCP testers (or --http flag) ───────
4125
4126
  const port = parseInt(process.env.PORT ?? "3001");
4126
- const mcpServer = createMcpServer(sites);
4127
- const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
4128
- await mcpServer.connect(transport);
4127
+ // Session map: sessionId → transport (one MCP server instance per browser session)
4128
+ const sessions = new Map();
4129
+ async function readBody(req) {
4130
+ return new Promise((resolve, reject) => {
4131
+ const chunks = [];
4132
+ req.on("data", (c) => chunks.push(c));
4133
+ req.on("end", () => {
4134
+ try {
4135
+ resolve(JSON.parse(Buffer.concat(chunks).toString()));
4136
+ }
4137
+ catch {
4138
+ resolve(undefined);
4139
+ }
4140
+ });
4141
+ req.on("error", reject);
4142
+ });
4143
+ }
4129
4144
  const httpServer = createServer(async (req, res) => {
4130
4145
  // CORS — allow browser clients and Chrome Private Network Access
4131
4146
  res.setHeader("Access-Control-Allow-Origin", "*");
@@ -4143,20 +4158,44 @@ else {
4143
4158
  return;
4144
4159
  }
4145
4160
  if (req.url === "/mcp") {
4146
- let body;
4147
- if (req.method === "POST") {
4148
- const chunks = [];
4149
- await new Promise((resolve, reject) => {
4150
- req.on("data", (c) => chunks.push(c));
4151
- req.on("end", resolve);
4152
- req.on("error", reject);
4161
+ const sessionId = req.headers["mcp-session-id"];
4162
+ let transport;
4163
+ if (sessionId && sessions.has(sessionId)) {
4164
+ // Resume existing session
4165
+ transport = sessions.get(sessionId);
4166
+ }
4167
+ else if (!sessionId) {
4168
+ // New session — create a fresh server + transport pair
4169
+ transport = new StreamableHTTPServerTransport({
4170
+ sessionIdGenerator: () => randomUUID(),
4153
4171
  });
4154
- try {
4155
- body = JSON.parse(Buffer.concat(chunks).toString());
4172
+ const mcpServer = createMcpServer(sites);
4173
+ await mcpServer.connect(transport);
4174
+ transport.onclose = () => {
4175
+ if (transport.sessionId)
4176
+ sessions.delete(transport.sessionId);
4177
+ };
4178
+ }
4179
+ else {
4180
+ // Unknown session ID
4181
+ res.writeHead(404, { "Content-Type": "application/json" });
4182
+ res.end(JSON.stringify({ error: "Session not found" }));
4183
+ return;
4184
+ }
4185
+ const body = req.method === "POST" ? await readBody(req) : undefined;
4186
+ try {
4187
+ await transport.handleRequest(req, res, body);
4188
+ }
4189
+ catch (err) {
4190
+ if (!res.headersSent) {
4191
+ res.writeHead(500, { "Content-Type": "application/json" });
4192
+ res.end(JSON.stringify({ error: String(err) }));
4156
4193
  }
4157
- catch { /* non-JSON body */ }
4158
4194
  }
4159
- await transport.handleRequest(req, res, body);
4195
+ // Store the session after initialize sets the ID
4196
+ if (!sessionId && transport.sessionId && !sessions.has(transport.sessionId)) {
4197
+ sessions.set(transport.sessionId, transport);
4198
+ }
4160
4199
  return;
4161
4200
  }
4162
4201
  res.writeHead(404);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yashwant.dharmdas/elementor-mcp",
3
- "version": "3.18.1",
3
+ "version": "3.18.2",
4
4
  "description": "MCP server for controlling Elementor via Claude — supports multiple WordPress sites",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",