@respira/wordpress-mcp-server 8.3.26 → 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,32 @@ 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
+
24
+ ## [8.3.27] - 2026-09-18
25
+
26
+ ### Added
27
+
28
+ - **A write can name the page version it was based on.** update_page, update_post,
29
+ update_element, update_module, inject_builder_content and apply_builder_patch take
30
+ `expected_version`. With plugin 9.0.3 every read and write returns the page's
31
+ `content_version`; send it back and the write is refused with respira_version_conflict,
32
+ nothing written, if the page changed since. Leave it out and nothing changes.
33
+
8
34
  ## [8.3.26] - 2026-09-17
9
35
 
10
36
  ### 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -2636,6 +2636,10 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
2636
2636
  inputSchema: {
2637
2637
  type: 'object',
2638
2638
  properties: {
2639
+ expected_version: {
2640
+ type: 'string',
2641
+ description: "Optional. The content_version from your last read or write of this page. The write is refused with respira_version_conflict (409, nothing written) if the page changed since, e.g. another agent or an editor saved it. Read again, reapply your change, and retry with the new content_version.",
2642
+ },
2639
2643
  id: {
2640
2644
  type: 'number',
2641
2645
  description: 'Page ID',
@@ -3037,6 +3041,10 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
3037
3041
  inputSchema: {
3038
3042
  type: 'object',
3039
3043
  properties: {
3044
+ expected_version: {
3045
+ type: 'string',
3046
+ description: "Optional. The content_version from your last read or write of this page. The write is refused with respira_version_conflict (409, nothing written) if the page changed since, e.g. another agent or an editor saved it. Read again, reapply your change, and retry with the new content_version.",
3047
+ },
3040
3048
  id: {
3041
3049
  type: 'number',
3042
3050
  description: 'Post ID',
@@ -3361,6 +3369,10 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
3361
3369
  inputSchema: {
3362
3370
  type: 'object',
3363
3371
  properties: {
3372
+ expected_version: {
3373
+ type: 'string',
3374
+ description: "Optional. The content_version from your last read or write of this page. The write is refused with respira_version_conflict (409, nothing written) if the page changed since, e.g. another agent or an editor saved it. Read again, reapply your change, and retry with the new content_version.",
3375
+ },
3364
3376
  builder: {
3365
3377
  type: 'string',
3366
3378
  description: 'Builder identifier. Use exactly: gutenberg, divi, elementor, bricks, beaver, oxygen, breakdance, brizy, thrive, visual-composer, wpbakery, flatsome, spectra, kadence, generateblocks, greenshift.',
@@ -3440,6 +3452,10 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
3440
3452
  inputSchema: {
3441
3453
  type: 'object',
3442
3454
  properties: {
3455
+ expected_version: {
3456
+ type: 'string',
3457
+ description: "Optional. The content_version from your last read or write of this page. The write is refused with respira_version_conflict (409, nothing written) if the page changed since, e.g. another agent or an editor saved it. Read again, reapply your change, and retry with the new content_version.",
3458
+ },
3443
3459
  builder: {
3444
3460
  type: 'string',
3445
3461
  description: 'Builder name. Use exactly: gutenberg, divi, elementor, bricks, beaver, oxygen, breakdance, brizy, thrive, visual-composer, wpbakery, flatsome, spectra, kadence, generateblocks, greenshift.',
@@ -4570,6 +4586,10 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
4570
4586
  inputSchema: {
4571
4587
  type: 'object',
4572
4588
  properties: {
4589
+ expected_version: {
4590
+ type: 'string',
4591
+ description: "Optional. The content_version from your last read or write of this page. The write is refused with respira_version_conflict (409, nothing written) if the page changed since, e.g. another agent or an editor saved it. Read again, reapply your change, and retry with the new content_version.",
4592
+ },
4573
4593
  builder: {
4574
4594
  type: 'string',
4575
4595
  description: 'Builder slug',
@@ -4748,7 +4768,7 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
4748
4768
  },
4749
4769
  {
4750
4770
  name: 'wordpress_diagnose_connection',
4751
- 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".',
4752
4772
  inputSchema: {
4753
4773
  type: 'object',
4754
4774
  properties: {
@@ -10155,14 +10175,14 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
10155
10175
  return await client.getBuilderInlineSchemas(args.builder, args.types);
10156
10176
  case 'wordpress_inject_builder_content':
10157
10177
  return hoistDroppedStylingWarnings({
10158
- ...(await client.injectBuilderContent(args.builder, args.page_id, args.content, args.divi_version, args.edit_target, args.mode, args.confirm_replace)),
10178
+ ...(await client.injectBuilderContent(args.builder, args.page_id, args.content, args.divi_version, args.edit_target, args.mode, args.confirm_replace, args.expected_version)),
10159
10179
  respira_approvals_url: client.getApprovalsUrl(),
10160
10180
  });
10161
10181
  case 'wordpress_make_responsive':
10162
10182
  return await client.makeResponsive(args.page_id, args.dry_run || false);
10163
10183
  case 'wordpress_update_module':
10164
10184
  return hoistDroppedStylingWarnings({
10165
- ...(await client.updateModule(args.builder, args.page_id, args.module_identifier, args.updates, args.edit_target)),
10185
+ ...(await client.updateModule(args.builder, args.page_id, args.module_identifier, args.updates, args.edit_target, args.expected_version)),
10166
10186
  respira_approvals_url: client.getApprovalsUrl(),
10167
10187
  });
10168
10188
  case 'wordpress_validate_security':
@@ -10645,7 +10665,7 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
10645
10665
  case 'wordpress_get_design_apply_reports':
10646
10666
  return await client.callRestV2('GET', '/design-direction/apply-reports', args.direction_id !== undefined ? { direction_id: args.direction_id } : undefined);
10647
10667
  case 'wordpress_apply_builder_patch':
10648
- return await client.applyBuilderPatch(args.builder, args.post_id, args.operations, args.include, args.edit_target);
10668
+ return await client.applyBuilderPatch(args.builder, args.post_id, args.operations, args.include, args.edit_target, args.expected_version);
10649
10669
  case 'woocommerce_list_products':
10650
10670
  return await client.woocommerceListProducts(args);
10651
10671
  case 'woocommerce_get_product':
@@ -11178,6 +11198,10 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
11178
11198
  inputSchema: {
11179
11199
  type: 'object',
11180
11200
  properties: {
11201
+ expected_version: {
11202
+ type: 'string',
11203
+ description: "Optional. The content_version from your last read or write of this page. The write is refused with respira_version_conflict (409, nothing written) if the page changed since, e.g. another agent or an editor saved it. Read again, reapply your change, and retry with the new content_version.",
11204
+ },
11181
11205
  post_id: { type: 'number', description: 'Page/post ID' },
11182
11206
  identifier_type: {
11183
11207
  type: 'string',