@respira/wordpress-mcp-server 8.1.6 → 8.2.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.
- package/README.md +7 -0
- package/TOOL_CATALOG.md +4 -1
- package/dist/__tests__/agent-signature-clientinfo.test.d.ts +2 -0
- package/dist/__tests__/agent-signature-clientinfo.test.d.ts.map +1 -0
- package/dist/__tests__/agent-signature-clientinfo.test.js +38 -0
- package/dist/__tests__/agent-signature-clientinfo.test.js.map +1 -0
- package/dist/agent-signature.d.ts +2 -1
- package/dist/agent-signature.d.ts.map +1 -1
- package/dist/agent-signature.js +64 -1
- package/dist/agent-signature.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +60 -0
- package/dist/server.js.map +1 -1
- package/dist/wordpress-client.d.ts.map +1 -1
- package/dist/wordpress-client.js +14 -0
- package/dist/wordpress-client.js.map +1 -1
- package/package.json +1 -1
- package/tool-capabilities.json +40 -4
package/README.md
CHANGED
|
@@ -35,6 +35,13 @@ Other WordPress MCP servers wrap the REST API. They can create posts and pages,
|
|
|
35
35
|
|
|
36
36
|
Respira includes a WordPress plugin that gives AI **native access** to 17 page builders, plus element-level precision, full page creation from structure, HTML-to-builder conversion, storefront design intelligence, stock image search, and bulk operations across hundreds of pages.
|
|
37
37
|
|
|
38
|
+
### New in 8.2: Resonance, a persistent memory for every site
|
|
39
|
+
|
|
40
|
+
- **Your AI forgets your site every session. Resonance remembers.** `wordpress_remember`, `wordpress_forget`, and `wordpress_list_memory` maintain a capped, per-site store of conventions, preferences, and lessons that rides into the site context of every future session, from any connected client.
|
|
41
|
+
- **Rules are enforced, not suggested.** A memory of type `rule` can protect content (post ids or slugs); the WordPress plugin refuses agent writes to protected content at the write path, server side. Agents can add protection in conversation; only the site owner can remove it, from the Respira dashboard.
|
|
42
|
+
- **Compatible with WordPress core's Knowledge direction.** On sites running the Gutenberg Knowledge experiment, published guideline scopes join the same memory block.
|
|
43
|
+
- Included on Builder and Studio plans with plugin 8.3+, at no extra cost.
|
|
44
|
+
|
|
38
45
|
### New in 8.1: MCP 2026-07-28, without breaking existing clients
|
|
39
46
|
|
|
40
47
|
- **Modern protocol negotiation.** Compatible clients can use `server/discover` and negotiate MCP `2026-07-28`, including stateless per-request metadata and typed result contracts.
|
package/TOOL_CATALOG.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- Generated by scripts/check-tool-registry-parity.mjs. Do not edit by hand. -->
|
|
4
4
|
|
|
5
|
-
Generated catalog: **
|
|
5
|
+
Generated catalog: **174 core tools**, **105 WooCommerce tools**, **279 total**.
|
|
6
6
|
|
|
7
7
|
The runtime applies site context and per-site governance, so an individual connection may expose a smaller relevant subset.
|
|
8
8
|
|
|
@@ -74,6 +74,7 @@ The runtime applies site context and per-site governance, so an individual conne
|
|
|
74
74
|
- `wordpress_extract_builder_content` — read; native + hosted
|
|
75
75
|
- `wordpress_find_builder_targets` — read; native + hosted
|
|
76
76
|
- `wordpress_find_element` — read; native + hosted
|
|
77
|
+
- `wordpress_forget` — read; native + hosted
|
|
77
78
|
- `wordpress_get_accessibility_scan` — read; hosted/stdio
|
|
78
79
|
- `wordpress_get_active_site` — read; hosted/stdio
|
|
79
80
|
- `wordpress_get_activity` — read; native + hosted
|
|
@@ -113,6 +114,7 @@ The runtime applies site context and per-site governance, so an individual conne
|
|
|
113
114
|
- `wordpress_list_custom_taxonomies` — read; hosted/stdio
|
|
114
115
|
- `wordpress_list_design_tokens` — read; native + hosted
|
|
115
116
|
- `wordpress_list_media` — read; native + hosted
|
|
117
|
+
- `wordpress_list_memory` — read; native + hosted
|
|
116
118
|
- `wordpress_list_menu_items` — read; native + hosted
|
|
117
119
|
- `wordpress_list_menu_locations` — read; native + hosted
|
|
118
120
|
- `wordpress_list_menus` — read; native + hosted
|
|
@@ -137,6 +139,7 @@ The runtime applies site context and per-site governance, so an individual conne
|
|
|
137
139
|
- `wordpress_read_post` — read; native + hosted
|
|
138
140
|
- `wordpress_read_theme_file` — read; hosted/stdio
|
|
139
141
|
- `wordpress_redeem_token` — write; hosted/stdio
|
|
142
|
+
- `wordpress_remember` — read; native + hosted
|
|
140
143
|
- `wordpress_remove_element` — write; native + hosted
|
|
141
144
|
- `wordpress_reorder_elements` — write; native + hosted
|
|
142
145
|
- `wordpress_report_issue` — read; hosted/stdio
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-signature-clientinfo.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agent-signature-clientinfo.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase A attribution: the MCP initialize handshake's clientInfo outranks
|
|
3
|
+
* process heuristics but never an explicit env pin, and raw client names
|
|
4
|
+
* normalize to canonical slugs (a bare "Claude ..." over local stdio is the
|
|
5
|
+
* Desktop app; only claude.ai/web connectors never spawn this process).
|
|
6
|
+
*/
|
|
7
|
+
import { test } from 'node:test';
|
|
8
|
+
import assert from 'node:assert';
|
|
9
|
+
import { detectRespiraAgentSignature, setMcpClientInfo } from '../agent-signature.js';
|
|
10
|
+
test('clientInfo outranks heuristics and normalizes names', () => {
|
|
11
|
+
delete process.env.RESPIRA_AGENT_CLIENT;
|
|
12
|
+
delete process.env.MCP_AGENT_CLIENT;
|
|
13
|
+
delete process.env.AI_AGENT_CLIENT;
|
|
14
|
+
setMcpClientInfo('Claude Desktop', '1.2.3');
|
|
15
|
+
const sig = detectRespiraAgentSignature();
|
|
16
|
+
assert.strictEqual(sig.client, 'claude-desktop');
|
|
17
|
+
assert.strictEqual(sig.source, 'client-info');
|
|
18
|
+
assert.strictEqual(sig.version, '1.2.3');
|
|
19
|
+
});
|
|
20
|
+
test('claude-code self-identification stays claude-code', () => {
|
|
21
|
+
setMcpClientInfo('claude-code', '2.0.0');
|
|
22
|
+
assert.strictEqual(detectRespiraAgentSignature().client, 'claude-code');
|
|
23
|
+
});
|
|
24
|
+
test('unknown but self-declared clients keep their sanitized name', () => {
|
|
25
|
+
setMcpClientInfo('SomeNew Agent!', null);
|
|
26
|
+
const sig = detectRespiraAgentSignature();
|
|
27
|
+
assert.strictEqual(sig.source, 'client-info');
|
|
28
|
+
assert.strictEqual(sig.client, 'somenewagent');
|
|
29
|
+
});
|
|
30
|
+
test('an explicit env pin still wins over clientInfo', () => {
|
|
31
|
+
setMcpClientInfo('Cursor', '9.9');
|
|
32
|
+
process.env.RESPIRA_AGENT_CLIENT = 'my-custom-rig';
|
|
33
|
+
const sig = detectRespiraAgentSignature();
|
|
34
|
+
assert.strictEqual(sig.client, 'my-custom-rig');
|
|
35
|
+
assert.strictEqual(sig.source, 'env');
|
|
36
|
+
delete process.env.RESPIRA_AGENT_CLIENT;
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=agent-signature-clientinfo.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-signature-clientinfo.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-signature-clientinfo.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEtF,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACxC,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAEnC,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,2BAA2B,EAAE,CAAC;IAC1C,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACjD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC7D,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,CAAC,WAAW,CAAC,2BAA2B,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAC1E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,gBAAgB,CAAC,gBAAgB,EAAE,IAAW,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,2BAA2B,EAAE,CAAC;IAC1C,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,eAAe,CAAC;IACnD,MAAM,GAAG,GAAG,2BAA2B,EAAE,CAAC;IAC1C,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAChD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAC1C,CAAC,CAAC,CAAC"}
|
|
@@ -8,8 +8,9 @@ export interface RespiraAgentSignature {
|
|
|
8
8
|
client: string;
|
|
9
9
|
version: string | null;
|
|
10
10
|
transport: string;
|
|
11
|
-
source: 'env' | 'heuristic' | 'default';
|
|
11
|
+
source: 'env' | 'client-info' | 'heuristic' | 'default';
|
|
12
12
|
}
|
|
13
|
+
export declare function setMcpClientInfo(name: unknown, version?: unknown): void;
|
|
13
14
|
export declare function detectRespiraAgentSignature(): RespiraAgentSignature;
|
|
14
15
|
export declare function getRespiraAgentHeaders(): Record<string, string>;
|
|
15
16
|
//# sourceMappingURL=agent-signature.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-signature.d.ts","sourceRoot":"","sources":["../src/agent-signature.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,GAAG,WAAW,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-signature.d.ts","sourceRoot":"","sources":["../src/agent-signature.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;CACzD;AAkCD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAQvE;AAwGD,wBAAgB,2BAA2B,IAAI,qBAAqB,CA4BnE;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAa/D"}
|
package/dist/agent-signature.js
CHANGED
|
@@ -6,6 +6,58 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { execSync } from 'node:child_process';
|
|
8
8
|
const MAX_HEADER_VALUE = 64;
|
|
9
|
+
/**
|
|
10
|
+
* The MCP initialize handshake carries the client's SELF-DECLARED identity
|
|
11
|
+
* (clientInfo.name/version). It is the highest-trust signal short of an
|
|
12
|
+
* explicit env override: the ps-parent heuristic below misfiles ambiguous
|
|
13
|
+
* cases (a bare `claude` parent buckets as claude-code, undercounting
|
|
14
|
+
* Claude Desktop), while clientInfo is what the app says it is. The server
|
|
15
|
+
* stores it here after initialization; every subsequent header/telemetry
|
|
16
|
+
* read picks it up. Phase A of the connection-mix attribution work.
|
|
17
|
+
*/
|
|
18
|
+
let mcpClientInfo = null;
|
|
19
|
+
/** Normalize a raw clientInfo.name to Respira's canonical client slugs. */
|
|
20
|
+
function normalizeClientInfoName(raw) {
|
|
21
|
+
const n = raw.trim().toLowerCase();
|
|
22
|
+
if (!n)
|
|
23
|
+
return null;
|
|
24
|
+
if (n.includes('cowork'))
|
|
25
|
+
return 'cowork';
|
|
26
|
+
if (n.includes('claude-code') || n.includes('claude code'))
|
|
27
|
+
return 'claude-code';
|
|
28
|
+
// Any other Claude identity arriving over local stdio is the Desktop app
|
|
29
|
+
// (claude.ai/web connectors never spawn this process).
|
|
30
|
+
if (n.includes('claude'))
|
|
31
|
+
return 'claude-desktop';
|
|
32
|
+
if (n.includes('cursor'))
|
|
33
|
+
return 'cursor';
|
|
34
|
+
if (n.includes('windsurf') || n.includes('codeium'))
|
|
35
|
+
return 'windsurf';
|
|
36
|
+
if (n.includes('codex'))
|
|
37
|
+
return 'codex';
|
|
38
|
+
if (n.includes('chatgpt') || n.includes('openai'))
|
|
39
|
+
return 'chatgpt';
|
|
40
|
+
if (n.includes('copilot'))
|
|
41
|
+
return 'copilot';
|
|
42
|
+
if (n.includes('gemini') || n.includes('antigravity'))
|
|
43
|
+
return n.includes('antigravity') ? 'antigravity' : 'gemini';
|
|
44
|
+
if (n.includes('opencode'))
|
|
45
|
+
return 'opencode';
|
|
46
|
+
// Unknown but self-declared: keep the sanitized raw name rather than
|
|
47
|
+
// guessing. It surfaces new clients in telemetry instead of hiding them.
|
|
48
|
+
return sanitizeHeaderToken(n);
|
|
49
|
+
}
|
|
50
|
+
export function setMcpClientInfo(name, version) {
|
|
51
|
+
if (typeof name !== 'string' || !name.trim())
|
|
52
|
+
return;
|
|
53
|
+
const client = normalizeClientInfoName(name);
|
|
54
|
+
if (!client)
|
|
55
|
+
return;
|
|
56
|
+
mcpClientInfo = {
|
|
57
|
+
client,
|
|
58
|
+
version: sanitizeHeaderToken(typeof version === 'string' ? version : null),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
9
61
|
function sanitizeHeaderToken(value, fallback = null) {
|
|
10
62
|
if (typeof value !== 'string') {
|
|
11
63
|
return fallback;
|
|
@@ -112,8 +164,19 @@ export function detectRespiraAgentSignature() {
|
|
|
112
164
|
const explicitClient = sanitizeHeaderToken(process.env.RESPIRA_AGENT_CLIENT) ||
|
|
113
165
|
sanitizeHeaderToken(process.env.MCP_AGENT_CLIENT) ||
|
|
114
166
|
sanitizeHeaderToken(process.env.AI_AGENT_CLIENT);
|
|
115
|
-
const client = explicitClient || detectClientFromHeuristics();
|
|
116
167
|
const transport = sanitizeHeaderToken(process.env.RESPIRA_AGENT_TRANSPORT, 'desktop-mcp') || 'desktop-mcp';
|
|
168
|
+
// Precedence: explicit env pin > the client's own initialize handshake >
|
|
169
|
+
// process heuristics. The env override stays on top deliberately: it is
|
|
170
|
+
// how a user corrects us when everything else is wrong.
|
|
171
|
+
if (!explicitClient && mcpClientInfo) {
|
|
172
|
+
return {
|
|
173
|
+
client: mcpClientInfo.client,
|
|
174
|
+
version: mcpClientInfo.version || detectVersion(mcpClientInfo.client),
|
|
175
|
+
transport,
|
|
176
|
+
source: 'client-info',
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const client = explicitClient || detectClientFromHeuristics();
|
|
117
180
|
return {
|
|
118
181
|
client,
|
|
119
182
|
version: detectVersion(client),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-signature.js","sourceRoot":"","sources":["../src/agent-signature.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-signature.js","sourceRoot":"","sources":["../src/agent-signature.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,OAAO,KAAK,EAAE,mBAAmB,EAAe,MAAM,kBAAkB,CAAC;AAsQzE,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,YAAY,CAA4B;IAChD,8EAA8E;IAC9E,OAAO,CAAC,YAAY,CAA4B;IAChD,8EAA8E;IAC9E,OAAO,CAAC,mBAAmB,CAAS;IACpC,iFAAiF;IACjF,OAAO,CAAC,iBAAiB,CAAK;IAC9B,iFAAiF;IACjF,OAAO,CAAC,mBAAmB,CAAgC;IAE3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAsB;IAEhE;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;gBA4Bb,WAAW,EAAE,mBAAmB,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE;IA6VvE,OAAO,CAAC,cAAc;IAItB;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,aAAa;IA4BrB,gEAAgE;IAChE,OAAO,CAAC,aAAa;IAUrB;;;;;;OAMG;YACW,UAAU;IA2CxB;;;;;;;;;;;;;;OAcG;YACW,WAAW;IAiJzB;;;;;;;;;OASG;YACW,kBAAkB;IA6KhC;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;YACW,qBAAqB;YAiBrB,kBAAkB;IA6FhC,yFAAyF;IACzF,OAAO,CAAC,gBAAgB;IASxB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,6BAA6B;IA0BrC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,yBAAyB;IA+BjC,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,aAAa;YAmQP,kBAAkB;YA6BlB,yBAAyB;IASvC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;YAyBd,QAAQ;IAq1GtB;;;;;;OAMG;IACH;;;;;;;;;;;;;oDAagD;IAChD,OAAO,CAAC,mBAAmB,CAAoD;IAC/E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAU;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAS;IAC1D;;mDAE+C;IAC/C,OAAO,CAAC,0BAA0B,CAAoC;IAEtE;;;;;;;;OAQG;YACW,0BAA0B;YAyC1B,oBAAoB;YA6CpB,2BAA2B;IAQzC;;;;OAIG;YACW,cAAc;IAQ5B,OAAO,CAAC,mBAAmB;IAo7C3B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAe3C;IAEF;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;YAmCpB,cAAc;IA4G5B,oEAAoE;IACpE,OAAO,CAAC,iBAAiB;IAoBzB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,eAAe;YAuCT,gBAAgB;IAy1C9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkZzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6UxB,GAAG;CA+CV"}
|
package/dist/server.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Provides tools for AI coding assistants to interact with WordPress sites
|
|
5
5
|
*/
|
|
6
6
|
import { Server } from '@modelcontextprotocol/server';
|
|
7
|
+
import { setMcpClientInfo } from './agent-signature.js';
|
|
7
8
|
import { serveStdio } from '@modelcontextprotocol/server/stdio';
|
|
8
9
|
import { execSync } from 'child_process';
|
|
9
10
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
@@ -347,6 +348,7 @@ Follow these on every site. They are what separates a great result from a frustr
|
|
|
347
348
|
5. Load schemas before writing. Use respira_get_builder_inline_schemas (or the per-builder schema tools) so attribute shapes are exact, not improvised.
|
|
348
349
|
6. Dropped styling is not a retry. If a write returns dropped_styling_hint or a STYLING DROPPED message, the builder did not recognize that setting. Do NOT re-send the same write. Pick a supported attribute or move that bit into a code block, then write again. (This is the single biggest source of wasted retries.)
|
|
349
350
|
7. Design-system first. When the builder exposes a design system, read it before building and reuse existing tokens instead of inventing styles: respira_bricks_design_system (Bricks global classes/colors/typography), respira_elementor_design_system (Elementor global colors/typography), and Divi 5 presets/color tokens. This keeps results on-brand and maintainable.
|
|
351
|
+
8. Honor and grow Site Memory. get_site_context / get_builder_info include a site_memory block: rules are hard constraints the plugin enforces (protected content refuses writes — never work around a refusal, tell the user), notes are the site's accumulated conventions. When the user states a durable preference or corrects a mistake worth not repeating, offer to save it with respira_remember so the next session starts warm.
|
|
350
352
|
|
|
351
353
|
## Tool naming
|
|
352
354
|
|
|
@@ -574,6 +576,18 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
|
|
|
574
576
|
|
|
575
577
|
21 tools for product management, categories, tags, orders, stock, and sales reports. All prefixed woocommerce_*.`,
|
|
576
578
|
});
|
|
579
|
+
// Capture the client's self-declared identity from the MCP initialize
|
|
580
|
+
// handshake (highest-trust attribution signal short of an env pin; the
|
|
581
|
+
// ps heuristic misfiles Claude Desktop as claude-code). Best-effort:
|
|
582
|
+
// attribution must never break a connection.
|
|
583
|
+
this.server.oninitialized = () => {
|
|
584
|
+
try {
|
|
585
|
+
const ci = this.server.getClientVersion?.();
|
|
586
|
+
if (ci?.name)
|
|
587
|
+
setMcpClientInfo(ci.name, ci.version);
|
|
588
|
+
}
|
|
589
|
+
catch { /* ignore */ }
|
|
590
|
+
};
|
|
577
591
|
this.versionChecker = new RespiraVersionChecker('@respira/wordpress-mcp-server', RespiraWordPressServer.MCP_SERVER_VERSION);
|
|
578
592
|
// RESPIRA_SITES env var: comma-separated hostnames to restrict visible sites.
|
|
579
593
|
// Used by MCP config packs and multisite configurations.
|
|
@@ -4259,6 +4273,45 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
|
|
|
4259
4273
|
},
|
|
4260
4274
|
destructiveHint: true,
|
|
4261
4275
|
},
|
|
4276
|
+
// Site Memory (v8.3, Resonance) — persistent per-site memory that lives IN the
|
|
4277
|
+
// WordPress site, so it travels across clients (Claude, ChatGPT, Cursor) and
|
|
4278
|
+
// sessions. Notes/preferences/lessons are advisory context; rules are ENFORCED
|
|
4279
|
+
// by the plugin (writes to protected content are refused server-side). The
|
|
4280
|
+
// current memory arrives automatically in get_site_context / get_builder_info
|
|
4281
|
+
// under the site_memory key.
|
|
4282
|
+
{
|
|
4283
|
+
name: 'wordpress_remember',
|
|
4284
|
+
description: "Save a durable memory about this site to its persistent Site Memory. Use when the user states a preference (\"always use native modules, never raw HTML\"), corrects a mistake worth not repeating, or you discover a convention or environment quirk the next session should know. The memory is injected into site context for every future agent session, across all AI clients. Ask the user before saving anything they did not state themselves. type=rule creates an ENFORCED constraint (with optional rule.protect post_ids/slugs the plugin will refuse to write to) that only the site owner can later remove. Re-using a key updates the entry. Included on Builder and Studio plans.",
|
|
4285
|
+
inputSchema: {
|
|
4286
|
+
type: 'object',
|
|
4287
|
+
properties: {
|
|
4288
|
+
key: { type: 'string', description: 'Short slug identifying the memory, e.g. "brand-voice" or "never-touch-checkout". Lowercase letters/digits/hyphens, max 64 chars. Re-using a key updates it.' },
|
|
4289
|
+
type: { type: 'string', enum: ['fact', 'preference', 'lesson', 'rule'], description: 'fact = observed setup; preference = user taste; lesson = learned from a mistake or correction; rule = enforced constraint (only the owner can remove it — use for "never touch X" instructions).' },
|
|
4290
|
+
content: { type: 'string', description: 'The memory itself, max 500 chars. Distill: one clear imperative sentence beats a paragraph.' },
|
|
4291
|
+
rule: { type: 'object', description: 'Rules only. {"protect":{"post_ids":[12],"slugs":["checkout"]}} makes the plugin refuse agent writes/deletes to that content, including its duplicates.' },
|
|
4292
|
+
builder: { type: 'string', description: 'Optional builder fingerprint (e.g. "bricks") when the memory is builder-specific, so staleness is detectable after a rebuild.' },
|
|
4293
|
+
builder_version: { type: 'string', description: 'Optional builder version for the fingerprint.' },
|
|
4294
|
+
},
|
|
4295
|
+
required: ['key', 'content'],
|
|
4296
|
+
},
|
|
4297
|
+
},
|
|
4298
|
+
{
|
|
4299
|
+
name: 'wordpress_forget',
|
|
4300
|
+
description: 'Remove a stale entry from this site\'s persistent Site Memory by key. Enforced rules cannot be removed from a conversation — only by the site owner in the Respira dashboard (Site Memory) — so a refusal here is expected behavior, not an error to work around.',
|
|
4301
|
+
inputSchema: {
|
|
4302
|
+
type: 'object',
|
|
4303
|
+
properties: {
|
|
4304
|
+
key: { type: 'string', description: 'Memory key to forget (from wordpress_list_memory).' },
|
|
4305
|
+
},
|
|
4306
|
+
required: ['key'],
|
|
4307
|
+
},
|
|
4308
|
+
},
|
|
4309
|
+
{
|
|
4310
|
+
name: 'wordpress_list_memory',
|
|
4311
|
+
description: 'List everything stored in this site\'s persistent Site Memory: facts, preferences, lessons, and enforced rules, with source and last-updated metadata. The same content arrives automatically in get_site_context; use this when you need keys for updating or forgetting entries.',
|
|
4312
|
+
inputSchema: { type: 'object', properties: {} },
|
|
4313
|
+
readOnlyHint: true,
|
|
4314
|
+
},
|
|
4262
4315
|
{
|
|
4263
4316
|
name: 'wordpress_list_custom_posts',
|
|
4264
4317
|
description: 'List posts of a custom post type. Each row includes author ({id, login, display_name}), taxonomies map, and featured_media alongside id/title/slug/status/date/url.',
|
|
@@ -7273,6 +7326,13 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
|
|
|
7273
7326
|
}
|
|
7274
7327
|
case 'wordpress_delete_playbook':
|
|
7275
7328
|
return await client.callRestV1('DELETE', `/playbooks/${args.id}`);
|
|
7329
|
+
// Site Memory (v8.3, Resonance)
|
|
7330
|
+
case 'wordpress_remember':
|
|
7331
|
+
return await client.callRestV1('POST', '/memory', { ...args, source: 'agent' });
|
|
7332
|
+
case 'wordpress_forget':
|
|
7333
|
+
return await client.callRestV1('DELETE', `/memory/${args.key}`);
|
|
7334
|
+
case 'wordpress_list_memory':
|
|
7335
|
+
return await client.callRestV1('GET', '/memory');
|
|
7276
7336
|
case 'wordpress_list_custom_posts':
|
|
7277
7337
|
return await client.listCustomPosts(args.type, args);
|
|
7278
7338
|
case 'wordpress_get_custom_post':
|