@respira/wordpress-mcp-server 8.3.27 → 8.3.28

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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,22 @@ All notable changes to Respira WordPress MCP Server will be documented in this f
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [8.3.28] - 2026-09-19
9
+
10
+ ### Added
11
+
12
+ - **`diagnose_connection` says when a host blocks ChatGPT.** ChatGPT's connector reads a
13
+ site's sign-in details from OpenAI's servers with a Python user agent, and some hosts
14
+ refuse that before WordPress runs; WP Engine does by default. ChatGPT then says the
15
+ server "does not implement OAuth", although the plugin serves those details correctly.
16
+ Diagnose now asks for them the way ChatGPT does, reports `chatgpt_connector_blocked`,
17
+ names WP Engine when the site is on it, and says what to ask the host to allow.
18
+
19
+ ### Fixed
20
+
21
+ - The package description and README said 230 core tools. The server has 231; the
22
+ WooCommerce count was one too high.
23
+
8
24
  ## [8.3.27] - 2026-09-18
9
25
 
10
26
  ### Added
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  <h1 align="center">Respira WordPress MCP Server</h1>
8
8
 
9
9
  <p align="center">
10
- <strong>230 MCP tools, 335 with the WooCommerce add-on. 17 page builders and the native Site Editor. MCP 2026-07-28 with legacy-client support.</strong><br>
10
+ <strong>231 MCP tools, 335 with the WooCommerce add-on. 17 page builders and the native Site Editor. MCP 2026-07-28 with legacy-client support.</strong><br>
11
11
  Element-level editing, full page creation, HTML-to-builder conversion with rendering fidelity validation, per-site tool governance, storefront design intelligence, stock images, bulk operations — all through one MCP server.
12
12
  </p>
13
13
 
@@ -404,7 +404,7 @@ The server lists only what the connected site can use. Builder tools appear on t
404
404
 
405
405
  | Site | Tools listed |
406
406
  |---|---|
407
- | Core site (Gutenberg, no WooCommerce or ACF) | 230 |
407
+ | Core site (Gutenberg, no WooCommerce or ACF) | 231 |
408
408
  | Core site with ACF | 284 |
409
409
  | WooCommerce add-on | 334 |
410
410
  | WooCommerce and ACF on Elementor | 395 |
@@ -958,6 +958,6 @@ MIT © [Respira](https://respira.press)
958
958
  ---
959
959
 
960
960
  <p align="center">
961
- <strong>230 core tools, 335 with WooCommerce. 17 builders. The AI infrastructure layer for WordPress.</strong><br>
961
+ <strong>231 core tools, 335 with WooCommerce. 17 builders. The AI infrastructure layer for WordPress.</strong><br>
962
962
  <a href="https://respira.press">respira.press</a>
963
963
  </p>
@@ -0,0 +1,17 @@
1
+ /**
2
+ * WP Engine's edge answers 403 to Python HTTP client user agents on every
3
+ * path, including `Python/3.12 aiohttp/3.13.5`, which is what ChatGPT's MCP
4
+ * connector sends from OpenAI's servers. Browsers and a Node user agent get
5
+ * 200. Verified 2026-09-19 on www.thinkfreely.ai and
6
+ * thinkfreelystg.wpenginepowered.com: the 200 carries `x-powered-by: WP
7
+ * Engine`, the 403 carries nothing that names the host.
8
+ *
9
+ * ChatGPT then reports "Error fetching OAuth configuration ... does not
10
+ * implement OAuth" while the plugin serves correct metadata, and every probe
11
+ * diagnose_connection made with its own user agent came back green.
12
+ *
13
+ * These drive the real WordPressClient.diagnoseConnection against a local
14
+ * server that behaves like that edge.
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=chatgpt-connector-blocked-by-host.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatgpt-connector-blocked-by-host.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/chatgpt-connector-blocked-by-host.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * WP Engine's edge answers 403 to Python HTTP client user agents on every
3
+ * path, including `Python/3.12 aiohttp/3.13.5`, which is what ChatGPT's MCP
4
+ * connector sends from OpenAI's servers. Browsers and a Node user agent get
5
+ * 200. Verified 2026-09-19 on www.thinkfreely.ai and
6
+ * thinkfreelystg.wpenginepowered.com: the 200 carries `x-powered-by: WP
7
+ * Engine`, the 403 carries nothing that names the host.
8
+ *
9
+ * ChatGPT then reports "Error fetching OAuth configuration ... does not
10
+ * implement OAuth" while the plugin serves correct metadata, and every probe
11
+ * diagnose_connection made with its own user agent came back green.
12
+ *
13
+ * These drive the real WordPressClient.diagnoseConnection against a local
14
+ * server that behaves like that edge.
15
+ */
16
+ import { test, after } from 'node:test';
17
+ import assert from 'node:assert/strict';
18
+ import http from 'node:http';
19
+ import { WordPressClient } from '../wordpress-client.js';
20
+ // Pinned as a literal, not imported: this is the measured string, and the
21
+ // probe must keep sending exactly it.
22
+ const CHATGPT_UA = 'Python/3.12 aiohttp/3.13.5';
23
+ const servers = [];
24
+ after(() => {
25
+ for (const s of servers)
26
+ s.close();
27
+ });
28
+ async function startSite(mode, opts = {}) {
29
+ const userAgents = [];
30
+ const server = http.createServer((req, res) => {
31
+ req.resume();
32
+ req.on('end', () => {
33
+ const ua = String(req.headers['user-agent'] || '');
34
+ userAgents.push(ua);
35
+ const isPython = /^python/i.test(ua);
36
+ if (isPython && mode === 'block_python') {
37
+ // Like the WP Engine edge: an HTML 403, no x-powered-by.
38
+ res.writeHead(403, { 'Content-Type': 'text/html' });
39
+ res.end('<html><head><title>403 Forbidden</title></head><body>Forbidden</body></html>');
40
+ return;
41
+ }
42
+ if (isPython && mode === 'reset_python') {
43
+ req.socket.destroy();
44
+ return;
45
+ }
46
+ const url = new URL(req.url || '/', 'http://placeholder');
47
+ const route = url.searchParams.get('rest_route') || url.pathname.replace(/^\/wp-json/, '') || '/';
48
+ const headers = { 'Content-Type': 'application/json' };
49
+ if (opts.poweredBy)
50
+ headers['X-Powered-By'] = opts.poweredBy;
51
+ const json = (status, body) => {
52
+ res.writeHead(status, headers);
53
+ res.end(req.method === 'HEAD' ? undefined : JSON.stringify(body));
54
+ };
55
+ if (url.pathname === '/.well-known/oauth-protected-resource' || route === '/respira/v1/oauth-protected-resource') {
56
+ return json(200, { resource: `http://${req.headers.host}/wp-json/respira/v1/mcp`, authorization_servers: ['https://www.respira.press'] });
57
+ }
58
+ if (route === '/respira/v1/ping' && (req.method === 'GET' || req.method === 'HEAD'))
59
+ return json(200, { ok: true });
60
+ if (req.method === 'OPTIONS')
61
+ return json(200, {});
62
+ if (route === '/respira/v1/ping') {
63
+ return json(404, { code: 'rest_no_route', message: 'No route was found matching the URL and request method.', data: { status: 404 } });
64
+ }
65
+ return json(200, { ok: true, route });
66
+ });
67
+ });
68
+ servers.push(server);
69
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
70
+ const { port } = server.address();
71
+ const origin = `http://127.0.0.1:${port}`;
72
+ const client = new WordPressClient({ id: 'chatgpt-ua', name: 'chatgpt-ua', url: origin, apiKey: 'respira_test_key' });
73
+ return { client, origin, userAgents };
74
+ }
75
+ test('a host that 403s the ChatGPT user agent on the OAuth metadata is flagged, with the fix first', async () => {
76
+ const site = await startSite('block_python');
77
+ const report = await site.client.diagnoseConnection({ probe_timeout_ms: 5000 });
78
+ assert.equal(report.success, true);
79
+ assert.equal(report.chatgpt_connector_blocked, true);
80
+ assert.equal(report.chatgpt_connector_probe, 'ran');
81
+ assert.equal(report.chatgpt_connector.default_user_agent_status, 200);
82
+ assert.equal(report.chatgpt_connector.chatgpt_user_agent_status, 403);
83
+ assert.equal(report.chatgpt_connector.url, `${site.origin}/.well-known/oauth-protected-resource`);
84
+ assert.equal(report.chatgpt_connector.host_detected, null);
85
+ // Exactly one request went out with ChatGPT's user agent.
86
+ assert.equal(site.userAgents.filter((ua) => ua === CHATGPT_UA).length, 1);
87
+ const first = String(report.recommendations[0] || '');
88
+ assert.match(first, /blocks ChatGPT's connector before WordPress runs/);
89
+ assert.match(first, /does not implement OAuth/);
90
+ assert.match(first, /answered 200 to this server's user agent and 403 to ChatGPT's/);
91
+ assert.match(first, /allow the user agent Python\/3\.12 aiohttp on \/\.well-known\/oauth-protected-resource and \/wp-json\/respira\/v1\//);
92
+ assert.doesNotMatch(first, /WP Engine/, 'the host is only named when the headers show it');
93
+ });
94
+ test('WP Engine is named when the 2xx it serves says so, even though its 403 does not', async () => {
95
+ const site = await startSite('block_python', { poweredBy: 'WP Engine' });
96
+ const report = await site.client.diagnoseConnection({ probe_timeout_ms: 5000 });
97
+ assert.equal(report.chatgpt_connector_blocked, true);
98
+ assert.equal(report.chatgpt_connector.host_detected, 'wpengine');
99
+ assert.match(String(report.recommendations[0] || ''), /on WP Engine/);
100
+ assert.match(String(report.recommendations[0] || ''), /Ask WP Engine support to allow/);
101
+ });
102
+ test('a host that answers ChatGPT the same as everyone else is not flagged', async () => {
103
+ const site = await startSite('allow_all');
104
+ const report = await site.client.diagnoseConnection({ probe_timeout_ms: 5000 });
105
+ assert.equal(report.success, true);
106
+ assert.equal(report.chatgpt_connector_blocked, false);
107
+ assert.equal(report.chatgpt_connector_probe, 'ran');
108
+ assert.equal(report.chatgpt_connector.chatgpt_user_agent_status, 200);
109
+ assert.ok(!report.recommendations.some((r) => /ChatGPT's connector/.test(r)), 'no ChatGPT recommendation on a site that lets it through');
110
+ });
111
+ test('a ChatGPT probe that errors is reported and diagnose still succeeds', async () => {
112
+ const site = await startSite('reset_python');
113
+ const report = await site.client.diagnoseConnection({ probe_timeout_ms: 5000 });
114
+ assert.equal(report.success, true);
115
+ assert.equal(report.chatgpt_connector_probe, 'error');
116
+ assert.equal(report.chatgpt_connector_blocked, null, 'an error proves nothing either way');
117
+ assert.ok(report.chatgpt_connector.error, 'the error itself is in the evidence');
118
+ assert.ok(!report.recommendations.some((r) => /ChatGPT's connector/.test(r)));
119
+ // The rest of the report is intact.
120
+ assert.equal(report.well_known_discovery.verdict, 'wordpress_serves_it');
121
+ assert.equal(report.write_method_verdict, 'not_blocked');
122
+ });
123
+ //# sourceMappingURL=chatgpt-connector-blocked-by-host.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatgpt-connector-blocked-by-host.test.js","sourceRoot":"","sources":["../../src/__tests__/chatgpt-connector-blocked-by-host.test.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -4768,7 +4768,7 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
4768
4768
  },
4769
4769
  {
4770
4770
  name: 'wordpress_diagnose_connection',
4771
- description: 'Run a connection-fingerprint diagnostic for the active site. Combines the plugin\'s server-side report (route registration, php/wp/plugin versions, edge plugin presence) with outside-in probes from the MCP server (REST root reachability, content-type sanity check on Respira routes, edge-layer headers). Use when a tool returns "html instead of json", an opaque 5xx, or when a connection that worked yesterday silently breaks. ALSO use it when the user suspects the wrong site, a stale connection, or a setup step that "did nothing": the response carries transport_mode (which install is answering: mcpb_bundle, npx_cache, global_npm_install, project_local_install, source_checkout), transport.duplicate_entries (whether a second Respira server is running, which usually means the client config lists Respira twice), and client_config (which config source won and how many sites came out of it). Returns a structured object including detected edge layers (Cloudflare, Wordfence, Sucuri) and concrete remediation recommendations. It also reports well_known_discovery: whether the host answers /.well-known/oauth-protected-resource itself instead of letting WordPress answer it, which is what breaks a ChatGPT connection on a site whose plugin is working, since ChatGPT checks only that address.',
4771
+ description: 'Run a connection-fingerprint diagnostic for the active site. Combines the plugin\'s server-side report (route registration, php/wp/plugin versions, edge plugin presence) with outside-in probes from the MCP server (REST root reachability, content-type sanity check on Respira routes, edge-layer headers). Use when a tool returns "html instead of json", an opaque 5xx, or when a connection that worked yesterday silently breaks. ALSO use it when the user suspects the wrong site, a stale connection, or a setup step that "did nothing": the response carries transport_mode (which install is answering: mcpb_bundle, npx_cache, global_npm_install, project_local_install, source_checkout), transport.duplicate_entries (whether a second Respira server is running, which usually means the client config lists Respira twice), and client_config (which config source won and how many sites came out of it). Returns a structured object including detected edge layers (Cloudflare, Wordfence, Sucuri) and concrete remediation recommendations. It also reports well_known_discovery: whether the host answers /.well-known/oauth-protected-resource itself instead of letting WordPress answer it, which is what breaks a ChatGPT connection on a site whose plugin is working, since ChatGPT checks only that address. And chatgpt_connector_blocked: whether the host or CDN refuses ChatGPT\'s connector (user agent Python/3.12 aiohttp) on that metadata while it serves this server fine, which is what makes ChatGPT say the server "does not implement OAuth".',
4772
4772
  inputSchema: {
4773
4773
  type: 'object',
4774
4774
  properties: {