@yashwant.dharmdas/elementor-mcp 3.17.0 → 3.18.0

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 +58 -3
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -3,6 +3,8 @@ import AjvModule from "ajv";
3
3
  const Ajv = AjvModule.default || AjvModule;
4
4
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
7
+ import { createServer } from "node:http";
6
8
  import { z } from "zod";
7
9
  import axios from "axios";
8
10
  import fs from "fs";
@@ -4105,7 +4107,60 @@ else {
4105
4107
  console.error("No sites configured. Run first: npx elementor-mcp setup");
4106
4108
  process.exit(1);
4107
4109
  }
4108
- const server = createMcpServer(sites);
4109
- const transport = new StdioServerTransport();
4110
- await server.connect(transport);
4110
+ const useStdio = process.argv.includes("--stdio");
4111
+ if (useStdio) {
4112
+ // ── Stdio mode — for Claude Desktop ──────────────────────────────────
4113
+ const server = createMcpServer(sites);
4114
+ const transport = new StdioServerTransport();
4115
+ await server.connect(transport);
4116
+ }
4117
+ else {
4118
+ // ── HTTP mode (default) — for browser-based MCP testers ──────────────
4119
+ const port = parseInt(process.env.PORT ?? "3001");
4120
+ const mcpServer = createMcpServer(sites);
4121
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
4122
+ await mcpServer.connect(transport);
4123
+ const httpServer = createServer(async (req, res) => {
4124
+ // CORS — allow browser clients and Chrome Private Network Access
4125
+ res.setHeader("Access-Control-Allow-Origin", "*");
4126
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
4127
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, mcp-session-id");
4128
+ res.setHeader("Access-Control-Allow-Private-Network", "true");
4129
+ if (req.method === "OPTIONS") {
4130
+ res.writeHead(204);
4131
+ res.end();
4132
+ return;
4133
+ }
4134
+ if (req.url === "/health") {
4135
+ res.writeHead(200, { "Content-Type": "application/json" });
4136
+ res.end(JSON.stringify({ status: "ok", sites: sites.map((s) => s.name) }));
4137
+ return;
4138
+ }
4139
+ if (req.url === "/mcp") {
4140
+ let body;
4141
+ if (req.method === "POST") {
4142
+ const chunks = [];
4143
+ await new Promise((resolve, reject) => {
4144
+ req.on("data", (c) => chunks.push(c));
4145
+ req.on("end", resolve);
4146
+ req.on("error", reject);
4147
+ });
4148
+ try {
4149
+ body = JSON.parse(Buffer.concat(chunks).toString());
4150
+ }
4151
+ catch { /* non-JSON body */ }
4152
+ }
4153
+ await transport.handleRequest(req, res, body);
4154
+ return;
4155
+ }
4156
+ res.writeHead(404);
4157
+ res.end("Not found");
4158
+ });
4159
+ httpServer.listen(port, () => {
4160
+ console.log(`Elementor MCP HTTP server listening on port ${port}`);
4161
+ console.log(`MCP endpoint: http://localhost:${port}/mcp`);
4162
+ console.log(`Health check: http://localhost:${port}/health`);
4163
+ console.log(`Sites loaded: ${sites.map((s) => s.name).join(", ")}`);
4164
+ });
4165
+ }
4111
4166
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yashwant.dharmdas/elementor-mcp",
3
- "version": "3.17.0",
3
+ "version": "3.18.0",
4
4
  "description": "MCP server for controlling Elementor via Claude — supports multiple WordPress sites",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",