@respira/wordpress-mcp-server 3.3.3 → 3.3.5

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 CHANGED
@@ -9,22 +9,22 @@
9
9
  <p align="center">
10
10
  <strong>The only WordPress MCP with page builder support.</strong><br>
11
11
  Edit Divi, Elementor, Bricks & 8 more builders with Cursor, Claude Code & Windsurf.<br>
12
- 88 total tools: 77 WordPress core + 11 conditional WooCommerce tools.
12
+ 103 total tools: 82 WordPress core + 21 conditional WooCommerce tools.
13
13
  </p>
14
14
 
15
15
  <p align="center">
16
16
  <a href="https://www.npmjs.com/package/@respira/wordpress-mcp-server"><img src="https://img.shields.io/npm/v/@respira/wordpress-mcp-server.svg?style=flat-square&color=blue" alt="npm version"></a>
17
17
  <a href="https://www.npmjs.com/package/@respira/wordpress-mcp-server"><img src="https://img.shields.io/npm/dm/@respira/wordpress-mcp-server.svg?style=flat-square" alt="npm downloads"></a>
18
18
  <img src="https://img.shields.io/badge/page%20builders-11-green?style=flat-square" alt="11 Page Builders">
19
- <img src="https://img.shields.io/badge/tools-88-purple?style=flat-square" alt="88 Tools">
20
- <img src="https://img.shields.io/badge/WooCommerce%20add--on-11%20conditional%20tools-7F54B3?style=flat-square" alt="WooCommerce conditional tools">
19
+ <img src="https://img.shields.io/badge/tools-103-purple?style=flat-square" alt="103 Tools">
20
+ <img src="https://img.shields.io/badge/WooCommerce%20add--on-21%20conditional%20tools-7F54B3?style=flat-square" alt="WooCommerce conditional tools">
21
21
  <img src="https://img.shields.io/badge/TypeScript-100%25-blue?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript">
22
22
  <a href="https://respira.press"><img src="https://img.shields.io/badge/website-respira.press-orange?style=flat-square" alt="Website"></a>
23
23
  </p>
24
24
 
25
25
  <p align="center">
26
26
  <a href="https://respira.press">Website</a> •
27
- <a href="https://respira.press/documentation">Documentation</a> •
27
+ <a href="https://respira.press/docs">Documentation</a> •
28
28
  <a href="https://respira.press/releases">Download Plugin</a> •
29
29
  <a href="https://respira.press/support">Support</a>
30
30
  </p>
@@ -60,13 +60,13 @@
60
60
  | Product management tools | Yes (add-on) | No |
61
61
  | Order status and operations | Yes (add-on) | No |
62
62
  | Inventory and stock tools | Yes (add-on) | No |
63
- | Sales reports and coupons | Yes (add-on) | No |
63
+ | Sales reports and inventory intelligence | Yes (add-on) | No |
64
64
 
65
65
  ### Tool Inventory (v3.3)
66
66
 
67
- - `77` always-on `wordpress_*` tools
68
- - `11` conditional `woocommerce_*` tools (only when WooCommerce add-on is installed and licensed)
69
- - `88` total MCP tools when WooCommerce add-on is active
67
+ - `82` always-on `wordpress_*` tools
68
+ - `21` conditional `woocommerce_*` tools (only when WooCommerce add-on is installed and licensed)
69
+ - `103` total MCP tools when WooCommerce add-on is active
70
70
  - Automatic `respira/v2` capability negotiation with `respira/v1` fallback for backward compatibility
71
71
 
72
72
  ### Supported Page Builders
@@ -94,10 +94,11 @@
94
94
 
95
95
  Respira MCP can expose WooCommerce tools when the WooCommerce add-on is installed and licensed:
96
96
 
97
- - Product operations: list/get/create/update/duplicate, variations, categories
97
+ - Product operations: list/get/create/update/duplicate plus category and tag taxonomy operations
98
98
  - Order operations: list/get/update status, safe order updates
99
99
  - Inventory operations: stock status overview, stock quantity updates
100
- - Commerce operations: coupons, customers, sales reports
100
+ - Taxonomy operations: product categories and tags (list/get/create/update/delete)
101
+ - Commerce reporting: sales reports
101
102
  - Add-on gating: tools auto-register only when add-on is active + licensed
102
103
 
103
104
  WooCommerce add-on details: [respira.press/addons/woocommerce](https://respira.press/addons/woocommerce)
@@ -230,17 +231,17 @@ Your live site is never at risk.
230
231
 
231
232
  Respira works alongside the official WordPress AI building blocks:
232
233
 
233
- - **WordPress Abilities API** (WP 6.9+): Respira plugin 3.3 registers all MCP tools as WordPress Abilities under `respira` and `respira-woocommerce` categories with rebased IDs (`respira/{tool-name}`)
234
- - **WordPress MCP Adapter**: Exposes Respira abilities alongside core WordPress tools automatically (dynamic 77/88 list)
234
+ - **WordPress Abilities API** (WP 6.9+): Respira plugin 4.0 registers all MCP tools as WordPress Abilities under `respira` and `respira-woocommerce` categories with rebased IDs (`respira/{tool-name}`)
235
+ - **WordPress MCP Adapter**: Exposes Respira abilities alongside core WordPress tools automatically (dynamic 82/103 list)
235
236
  - **Standalone MCP server** (this package): Quick start path — works without the Abilities API
236
- - **BrowserMCP/WebMCP**: Respira plugin 3.3 bundles the browser bridge directly, so Chrome can discover and run the same Respira abilities without a separate plugin install
237
+ - **BrowserMCP/WebMCP**: Respira plugin 4.0 bundles the browser bridge directly, so Chrome can discover and run the same Respira abilities without a separate plugin install
237
238
 
238
239
  ### Two Access Paths
239
240
 
240
241
  | Path | How it works | Requirements |
241
242
  |------|-------------|--------------|
242
243
  | **Standalone** (this npm package) | Install via npm, configure in your AI tool | Node 18+, Respira plugin |
243
- | **WordPress MCP Adapter** | Abilities auto-discovered via WP-CLI STDIO | WP 6.9+, MCP Adapter plugin, Respira plugin v3.3+ |
244
+ | **WordPress MCP Adapter** | Abilities auto-discovered via WP-CLI STDIO | WP 6.9+, MCP Adapter plugin, Respira plugin v4.0+ |
244
245
 
245
246
  Both paths are supported. Use whichever fits your setup.
246
247
 
@@ -257,7 +258,7 @@ wp mcp-adapter serve respira-press --user=admin
257
258
 
258
259
  ---
259
260
 
260
- ## 77 Core Tools + 11 Conditional WooCommerce Tools (88 Total)
261
+ ## 82 Core Tools + 21 Conditional WooCommerce Tools (103 Total)
261
262
 
262
263
  ### Page Builder Tools
263
264
  | Tool | What it does |
@@ -299,6 +300,10 @@ wp mcp-adapter serve respira-press --user=admin
299
300
  | `woocommerce_list_products` / `woocommerce_get_product` | Browse and inspect products |
300
301
  | `woocommerce_create_product` / `woocommerce_update_product` | Create and update products |
301
302
  | `woocommerce_duplicate_product` | Duplicate products safely before edits |
303
+ | `woocommerce_list_categories` / `woocommerce_get_category` | Browse and inspect product categories |
304
+ | `woocommerce_create_category` / `woocommerce_update_category` / `woocommerce_delete_category` | Create, update, and delete product categories |
305
+ | `woocommerce_list_tags` / `woocommerce_get_tag` | Browse and inspect product tags |
306
+ | `woocommerce_create_tag` / `woocommerce_update_tag` / `woocommerce_delete_tag` | Create, update, and delete product tags |
302
307
  | `woocommerce_list_orders` / `woocommerce_get_order` | List and inspect orders |
303
308
  | `woocommerce_update_order_status` | Update order status with WooCommerce flows |
304
309
  | `woocommerce_get_stock_status` / `woocommerce_update_stock` | Inventory and stock management |
@@ -308,7 +313,7 @@ wp mcp-adapter serve respira-press --user=admin
308
313
 
309
314
  Full CRUD operations for all WordPress content types.
310
315
 
311
- [Full Tool Reference](https://respira.press/documentation/tools)
316
+ [Full Tool Reference](https://respira.press/docs/tools)
312
317
 
313
318
  ---
314
319
 
@@ -459,7 +464,7 @@ See [CONTRIBUTING.md](.github/CONTRIBUTING.md) for how to add builder support, n
459
464
  ## Links
460
465
 
461
466
  - [Website](https://respira.press)
462
- - [Documentation](https://respira.press/documentation)
467
+ - [Documentation](https://respira.press/docs)
463
468
  - [Download Plugin](https://respira.press/releases)
464
469
  - [Support](https://respira.press/support)
465
470
 
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Respira agent signature helpers.
3
+ *
4
+ * Adds best-effort metadata so WordPress + telemetry can identify
5
+ * which coding assistant is driving MCP traffic.
6
+ */
7
+ export interface RespiraAgentSignature {
8
+ client: string;
9
+ version: string | null;
10
+ transport: string;
11
+ source: 'env' | 'heuristic' | 'default';
12
+ }
13
+ export declare function detectRespiraAgentSignature(): RespiraAgentSignature;
14
+ export declare function getRespiraAgentHeaders(): Record<string, string>;
15
+ //# sourceMappingURL=agent-signature.d.ts.map
@@ -0,0 +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;CACzC;AAmFD,wBAAgB,2BAA2B,IAAI,qBAAqB,CAgBnE;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAa/D"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Respira agent signature helpers.
3
+ *
4
+ * Adds best-effort metadata so WordPress + telemetry can identify
5
+ * which coding assistant is driving MCP traffic.
6
+ */
7
+ import { execSync } from 'node:child_process';
8
+ const MAX_HEADER_VALUE = 64;
9
+ function sanitizeHeaderToken(value, fallback = null) {
10
+ if (typeof value !== 'string') {
11
+ return fallback;
12
+ }
13
+ const cleaned = value
14
+ .trim()
15
+ .toLowerCase()
16
+ .replace(/[^a-z0-9._+\-/]/g, '')
17
+ .slice(0, MAX_HEADER_VALUE);
18
+ if (!cleaned) {
19
+ return fallback;
20
+ }
21
+ return cleaned;
22
+ }
23
+ function readParentCommand() {
24
+ try {
25
+ const output = execSync(`ps -o command= -p ${process.ppid}`, {
26
+ encoding: 'utf8',
27
+ stdio: ['ignore', 'pipe', 'ignore'],
28
+ });
29
+ return String(output || '').trim().toLowerCase();
30
+ }
31
+ catch {
32
+ return '';
33
+ }
34
+ }
35
+ function detectClientFromHeuristics() {
36
+ const parentCommand = readParentCommand();
37
+ const args = process.argv.join(' ').toLowerCase();
38
+ const envKeys = Object.keys(process.env).join(' ').toLowerCase();
39
+ const envVals = [
40
+ process.env.TERM_PROGRAM,
41
+ process.env.TERM_PROGRAM_VERSION,
42
+ process.env.VSCODE_GIT_IPC_HANDLE,
43
+ process.env.CURSOR_TRACE_ID,
44
+ process.env.CURSOR_AGENT,
45
+ process.env.CLAUDECODE,
46
+ process.env.CLAUDE_CODE_ENTRYPOINT,
47
+ process.env.CODEIUM_ENV,
48
+ ]
49
+ .filter(Boolean)
50
+ .join(' ')
51
+ .toLowerCase();
52
+ const fingerprint = `${parentCommand} ${args} ${envKeys} ${envVals}`;
53
+ if (fingerprint.includes('cursor'))
54
+ return 'cursor';
55
+ if (fingerprint.includes('claude'))
56
+ return 'claude-code';
57
+ if (fingerprint.includes('codex'))
58
+ return 'codex';
59
+ if (fingerprint.includes('windsurf') || fingerprint.includes('codeium'))
60
+ return 'windsurf';
61
+ if (fingerprint.includes('copilot'))
62
+ return 'copilot';
63
+ if (fingerprint.includes('gemini'))
64
+ return 'gemini';
65
+ return 'unknown';
66
+ }
67
+ function detectVersion(client) {
68
+ const explicit = sanitizeHeaderToken(process.env.RESPIRA_AGENT_VERSION) ||
69
+ sanitizeHeaderToken(process.env.MCP_AGENT_VERSION) ||
70
+ sanitizeHeaderToken(process.env.AI_AGENT_VERSION);
71
+ if (explicit) {
72
+ return explicit;
73
+ }
74
+ if (client === 'cursor') {
75
+ return sanitizeHeaderToken(process.env.CURSOR_VERSION);
76
+ }
77
+ if (client === 'claude-code') {
78
+ return sanitizeHeaderToken(process.env.CLAUDE_CODE_VERSION || process.env.CLAUDE_VERSION);
79
+ }
80
+ if (client === 'codex') {
81
+ return sanitizeHeaderToken(process.env.CODEX_VERSION);
82
+ }
83
+ if (client === 'windsurf') {
84
+ return sanitizeHeaderToken(process.env.WINDSURF_VERSION || process.env.CODEIUM_VERSION);
85
+ }
86
+ return null;
87
+ }
88
+ export function detectRespiraAgentSignature() {
89
+ const explicitClient = sanitizeHeaderToken(process.env.RESPIRA_AGENT_CLIENT) ||
90
+ sanitizeHeaderToken(process.env.MCP_AGENT_CLIENT) ||
91
+ sanitizeHeaderToken(process.env.AI_AGENT_CLIENT);
92
+ const client = explicitClient || detectClientFromHeuristics();
93
+ const transport = sanitizeHeaderToken(process.env.RESPIRA_AGENT_TRANSPORT, 'desktop-mcp') || 'desktop-mcp';
94
+ return {
95
+ client,
96
+ version: detectVersion(client),
97
+ transport,
98
+ source: explicitClient ? 'env' : client === 'unknown' ? 'default' : 'heuristic',
99
+ };
100
+ }
101
+ export function getRespiraAgentHeaders() {
102
+ const signature = detectRespiraAgentSignature();
103
+ const headers = {
104
+ 'X-Respira-Agent-Client': signature.client,
105
+ 'X-Respira-Agent-Transport': signature.transport,
106
+ 'X-Respira-Agent-Source': signature.source,
107
+ };
108
+ if (signature.version) {
109
+ headers['X-Respira-Agent-Version'] = signature.version;
110
+ }
111
+ return headers;
112
+ }
113
+ //# sourceMappingURL=agent-signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-signature.js","sourceRoot":"","sources":["../src/agent-signature.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAS5B,SAAS,mBAAmB,CAAC,KAAc,EAAE,WAA0B,IAAI;IACzE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK;SAClB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,qBAAqB,OAAO,CAAC,IAAI,EAAE,EAAE;YAC3D,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B;IACjC,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IACjE,MAAM,OAAO,GAAG;QACd,OAAO,CAAC,GAAG,CAAC,YAAY;QACxB,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAChC,OAAO,CAAC,GAAG,CAAC,qBAAqB;QACjC,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,OAAO,CAAC,GAAG,CAAC,YAAY;QACxB,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClC,OAAO,CAAC,GAAG,CAAC,WAAW;KACxB;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC;SACT,WAAW,EAAE,CAAC;IAEjB,MAAM,WAAW,GAAG,GAAG,aAAa,IAAI,IAAI,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;IAErE,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpD,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,aAAa,CAAC;IACzD,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAClD,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,UAAU,CAAC;IAC3F,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,QAAQ,GACZ,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACtD,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAClD,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACpD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC7B,OAAO,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,MAAM,cAAc,GAClB,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACrD,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACjD,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,cAAc,IAAI,0BAA0B,EAAE,CAAC;IAC9D,MAAM,SAAS,GACb,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,aAAa,CAAC,IAAI,aAAa,CAAC;IAE3F,OAAO;QACL,MAAM;QACN,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;QAC9B,SAAS;QACT,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,SAAS,GAAG,2BAA2B,EAAE,CAAC;IAChD,MAAM,OAAO,GAA2B;QACtC,wBAAwB,EAAE,SAAS,CAAC,MAAM;QAC1C,2BAA2B,EAAE,SAAS,CAAC,SAAS;QAChD,wBAAwB,EAAE,SAAS,CAAC,MAAM;KAC3C,CAAC;IAEF,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;IACzD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"abilities.d.ts","sourceRoot":"","sources":["../../src/discovery/abilities.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,wBAAwB;IACvC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,0BAA0B,EAAE,OAAO,CAAC;IACpC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC,CA8EnC"}
1
+ {"version":3,"file":"abilities.d.ts","sourceRoot":"","sources":["../../src/discovery/abilities.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,wBAAwB;IACvC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,0BAA0B,EAAE,OAAO,CAAC;IACpC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC,CAmFnC"}
@@ -5,6 +5,7 @@
5
5
  * MCP Adapter installed, and informs the user about available
6
6
  * integration paths.
7
7
  */
8
+ import { getRespiraAgentHeaders } from '../agent-signature.js';
8
9
  /**
9
10
  * Check if the WordPress site supports the Abilities API.
10
11
  *
@@ -24,10 +25,13 @@ export async function discoverAbilities(siteUrl, apiKey) {
24
25
  // Check for Abilities API
25
26
  try {
26
27
  const abilitiesUrl = `${baseUrl}/wp-json/wp-abilities/v1/abilities`;
28
+ const baseHeaders = {
29
+ 'X-Respira-Key': apiKey,
30
+ 'X-Respira-API-Key': apiKey,
31
+ ...getRespiraAgentHeaders(),
32
+ };
27
33
  const response = await fetch(abilitiesUrl, {
28
- headers: {
29
- 'X-Respira-Key': apiKey,
30
- },
34
+ headers: baseHeaders,
31
35
  signal: AbortSignal.timeout(10000),
32
36
  });
33
37
  if (response.ok) {
@@ -50,6 +54,8 @@ export async function discoverAbilities(siteUrl, apiKey) {
50
54
  const response = await fetch(mcpUrl, {
51
55
  headers: {
52
56
  'X-Respira-Key': apiKey,
57
+ 'X-Respira-API-Key': apiKey,
58
+ ...getRespiraAgentHeaders(),
53
59
  },
54
60
  signal: AbortSignal.timeout(10000),
55
61
  });
@@ -1 +1 @@
1
- {"version":3,"file":"abilities.js","sourceRoot":"","sources":["../../src/discovery/abilities.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,MAAc;IAEd,MAAM,MAAM,GAA6B;QACvC,qBAAqB,EAAE,KAAK;QAC5B,mBAAmB,EAAE,KAAK;QAC1B,0BAA0B,EAAE,KAAK;QACjC,iBAAiB,EAAE,IAAI;QACvB,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE5C,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,GAAG,OAAO,oCAAoC,CAAC;QACpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACzC,OAAO,EAAE;gBACP,eAAe,EAAE,MAAM;aACxB;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC;YACpC,MAAM,CAAC,iBAAiB,GAAG,YAAY,CAAC;YAExC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAExC,4CAA4C;YAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC,IAAI,CAChD,CAAC,OAAY,EAAE,EAAE,CACf,OAAO,OAAO,EAAE,IAAI,KAAK,QAAQ;oBACjC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CACtC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,OAAO,iCAAiC,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;YACnC,OAAO,EAAE;gBACP,eAAe,EAAE,MAAM;aACxB;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACpC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM,CAAC,0BAA0B,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACpE,MAAM,CAAC,OAAO;YACZ,uEAAuE;gBACvE,kFAAkF;gBAClF,kFAAkF,CAAC;IACvF,CAAC;SAAM,IAAI,MAAM,CAAC,qBAAqB,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC;QAC9E,MAAM,CAAC,OAAO;YACZ,sFAAsF;gBACtF,yEAAyE,CAAC;IAC9E,CAAC;SAAM,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACxC,MAAM,CAAC,OAAO;YACZ,6CAA6C;gBAC7C,uGAAuG,CAAC;IAC5G,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO;YACZ,iFAAiF;gBACjF,uDAAuD,CAAC;IAC5D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"abilities.js","sourceRoot":"","sources":["../../src/discovery/abilities.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAU/D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,MAAc;IAEd,MAAM,MAAM,GAA6B;QACvC,qBAAqB,EAAE,KAAK;QAC5B,mBAAmB,EAAE,KAAK;QAC1B,0BAA0B,EAAE,KAAK;QACjC,iBAAiB,EAAE,IAAI;QACvB,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE5C,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,GAAG,OAAO,oCAAoC,CAAC;QACpE,MAAM,WAAW,GAAG;YAClB,eAAe,EAAE,MAAM;YACvB,mBAAmB,EAAE,MAAM;YAC3B,GAAG,sBAAsB,EAAE;SAC5B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACzC,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC;YACpC,MAAM,CAAC,iBAAiB,GAAG,YAAY,CAAC;YAExC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAExC,4CAA4C;YAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC,IAAI,CAChD,CAAC,OAAY,EAAE,EAAE,CACf,OAAO,OAAO,EAAE,IAAI,KAAK,QAAQ;oBACjC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CACtC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,OAAO,iCAAiC,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;YACnC,OAAO,EAAE;gBACP,eAAe,EAAE,MAAM;gBACvB,mBAAmB,EAAE,MAAM;gBAC3B,GAAG,sBAAsB,EAAE;aAC5B;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACpC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM,CAAC,0BAA0B,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACpE,MAAM,CAAC,OAAO;YACZ,uEAAuE;gBACvE,kFAAkF;gBAClF,kFAAkF,CAAC;IACvF,CAAC;SAAM,IAAI,MAAM,CAAC,qBAAqB,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC;QAC9E,MAAM,CAAC,OAAO;YACZ,sFAAsF;gBACtF,yEAAyE,CAAC;IAC9E,CAAC;SAAM,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACxC,MAAM,CAAC,OAAO;YACZ,6CAA6C;gBAC7C,uGAAuG,CAAC;IAC5G,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO;YACZ,iFAAiF;gBACjF,uDAAuD,CAAC;IAC5D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,cAAc,CAAwB;IAE9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAW;gBAEzC,WAAW,EAAE,mBAAmB,EAAE;IA+B9C,OAAO,CAAC,aAAa;YAwGP,kBAAkB;YA6BlB,yBAAyB;YASzB,QAAQ;YAssDR,2BAA2B;IAazC,OAAO,CAAC,mBAAmB;YAmJb,cAAc;IAiYtB,GAAG;CAKV"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,cAAc,CAAwB;IAE9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAW;gBAEzC,WAAW,EAAE,mBAAmB,EAAE;IA+B9C,OAAO,CAAC,aAAa;YAwGP,kBAAkB;YA6BlB,yBAAyB;YASzB,QAAQ;YAssDR,2BAA2B;IAazC,OAAO,CAAC,mBAAmB;YAwTb,cAAc;IAmatB,GAAG;CAKV"}
package/dist/server.js CHANGED
@@ -13,7 +13,7 @@ export class RespiraWordPressServer {
13
13
  currentSite = null;
14
14
  sites = new Map();
15
15
  versionChecker;
16
- static MCP_SERVER_VERSION = '3.3.3';
16
+ static MCP_SERVER_VERSION = '3.3.4';
17
17
  constructor(siteConfigs) {
18
18
  this.server = new Server({
19
19
  name: 'respira-wordpress',
@@ -1951,6 +1951,16 @@ export class RespiraWordPressServer {
1951
1951
  type: { type: 'string', description: 'simple or variable' },
1952
1952
  regular_price: { type: 'string', description: 'Regular price' },
1953
1953
  status: { type: 'string', description: 'draft, pending, publish' },
1954
+ category_ids: {
1955
+ type: 'array',
1956
+ items: { type: 'number' },
1957
+ description: 'Optional category IDs to assign',
1958
+ },
1959
+ tag_ids: {
1960
+ type: 'array',
1961
+ items: { type: 'number' },
1962
+ description: 'Optional tag IDs to assign',
1963
+ },
1954
1964
  },
1955
1965
  required: ['name'],
1956
1966
  },
@@ -1967,6 +1977,26 @@ export class RespiraWordPressServer {
1967
1977
  sale_price: { type: 'string', description: 'Sale price' },
1968
1978
  stock_quantity: { type: 'number', description: 'Stock quantity' },
1969
1979
  stock_status: { type: 'string', description: 'instock, outofstock, onbackorder' },
1980
+ category_ids: {
1981
+ type: 'array',
1982
+ items: { type: 'number' },
1983
+ description: 'Category IDs to assign',
1984
+ },
1985
+ categories: {
1986
+ type: 'array',
1987
+ items: {},
1988
+ description: 'Alternative category payload (IDs, names, slugs, or objects with id/name/slug)',
1989
+ },
1990
+ tag_ids: {
1991
+ type: 'array',
1992
+ items: { type: 'number' },
1993
+ description: 'Tag IDs to assign',
1994
+ },
1995
+ tags: {
1996
+ type: 'array',
1997
+ items: {},
1998
+ description: 'Alternative tag payload (IDs, names, slugs, or objects with id/name/slug)',
1999
+ },
1970
2000
  },
1971
2001
  required: ['id'],
1972
2002
  },
@@ -1983,6 +2013,141 @@ export class RespiraWordPressServer {
1983
2013
  required: ['id'],
1984
2014
  },
1985
2015
  },
2016
+ {
2017
+ name: 'woocommerce_list_categories',
2018
+ description: 'List WooCommerce product categories.',
2019
+ inputSchema: {
2020
+ type: 'object',
2021
+ properties: {
2022
+ search: { type: 'string', description: 'Search categories by name' },
2023
+ parent: { type: 'number', description: 'Filter by parent category ID' },
2024
+ hide_empty: { type: 'boolean', description: 'Hide categories without products' },
2025
+ per_page: { type: 'number', description: 'Categories per page (1-100)' },
2026
+ page: { type: 'number', description: 'Page number' },
2027
+ },
2028
+ },
2029
+ readOnlyHint: true,
2030
+ },
2031
+ {
2032
+ name: 'woocommerce_get_category',
2033
+ description: 'Get detailed information for a single WooCommerce product category.',
2034
+ inputSchema: {
2035
+ type: 'object',
2036
+ properties: {
2037
+ id: { type: 'number', description: 'Category ID' },
2038
+ },
2039
+ required: ['id'],
2040
+ },
2041
+ readOnlyHint: true,
2042
+ },
2043
+ {
2044
+ name: 'woocommerce_create_category',
2045
+ description: 'Create a WooCommerce product category.',
2046
+ inputSchema: {
2047
+ type: 'object',
2048
+ properties: {
2049
+ name: { type: 'string', description: 'Category name' },
2050
+ slug: { type: 'string', description: 'Optional URL slug' },
2051
+ description: { type: 'string', description: 'Optional category description' },
2052
+ parent: { type: 'number', description: 'Optional parent category ID' },
2053
+ },
2054
+ required: ['name'],
2055
+ },
2056
+ },
2057
+ {
2058
+ name: 'woocommerce_update_category',
2059
+ description: 'Update a WooCommerce product category.',
2060
+ inputSchema: {
2061
+ type: 'object',
2062
+ properties: {
2063
+ id: { type: 'number', description: 'Category ID' },
2064
+ name: { type: 'string', description: 'Category name' },
2065
+ slug: { type: 'string', description: 'Optional URL slug' },
2066
+ description: { type: 'string', description: 'Category description' },
2067
+ parent: { type: 'number', description: 'Parent category ID (0 to move to root)' },
2068
+ },
2069
+ required: ['id'],
2070
+ },
2071
+ idempotentHint: true,
2072
+ },
2073
+ {
2074
+ name: 'woocommerce_delete_category',
2075
+ description: 'Delete a WooCommerce product category.',
2076
+ inputSchema: {
2077
+ type: 'object',
2078
+ properties: {
2079
+ id: { type: 'number', description: 'Category ID' },
2080
+ },
2081
+ required: ['id'],
2082
+ },
2083
+ destructiveHint: true,
2084
+ },
2085
+ {
2086
+ name: 'woocommerce_list_tags',
2087
+ description: 'List WooCommerce product tags.',
2088
+ inputSchema: {
2089
+ type: 'object',
2090
+ properties: {
2091
+ search: { type: 'string', description: 'Search tags by name' },
2092
+ hide_empty: { type: 'boolean', description: 'Hide tags without products' },
2093
+ per_page: { type: 'number', description: 'Tags per page (1-100)' },
2094
+ page: { type: 'number', description: 'Page number' },
2095
+ },
2096
+ },
2097
+ readOnlyHint: true,
2098
+ },
2099
+ {
2100
+ name: 'woocommerce_get_tag',
2101
+ description: 'Get detailed information for a single WooCommerce product tag.',
2102
+ inputSchema: {
2103
+ type: 'object',
2104
+ properties: {
2105
+ id: { type: 'number', description: 'Tag ID' },
2106
+ },
2107
+ required: ['id'],
2108
+ },
2109
+ readOnlyHint: true,
2110
+ },
2111
+ {
2112
+ name: 'woocommerce_create_tag',
2113
+ description: 'Create a WooCommerce product tag.',
2114
+ inputSchema: {
2115
+ type: 'object',
2116
+ properties: {
2117
+ name: { type: 'string', description: 'Tag name' },
2118
+ slug: { type: 'string', description: 'Optional URL slug' },
2119
+ description: { type: 'string', description: 'Optional tag description' },
2120
+ },
2121
+ required: ['name'],
2122
+ },
2123
+ },
2124
+ {
2125
+ name: 'woocommerce_update_tag',
2126
+ description: 'Update a WooCommerce product tag.',
2127
+ inputSchema: {
2128
+ type: 'object',
2129
+ properties: {
2130
+ id: { type: 'number', description: 'Tag ID' },
2131
+ name: { type: 'string', description: 'Tag name' },
2132
+ slug: { type: 'string', description: 'Optional URL slug' },
2133
+ description: { type: 'string', description: 'Tag description' },
2134
+ },
2135
+ required: ['id'],
2136
+ },
2137
+ idempotentHint: true,
2138
+ },
2139
+ {
2140
+ name: 'woocommerce_delete_tag',
2141
+ description: 'Delete a WooCommerce product tag.',
2142
+ inputSchema: {
2143
+ type: 'object',
2144
+ properties: {
2145
+ id: { type: 'number', description: 'Tag ID' },
2146
+ },
2147
+ required: ['id'],
2148
+ },
2149
+ destructiveHint: true,
2150
+ },
1986
2151
  {
1987
2152
  name: 'woocommerce_list_orders',
1988
2153
  description: 'List WooCommerce orders.',
@@ -2314,6 +2479,30 @@ export class RespiraWordPressServer {
2314
2479
  }
2315
2480
  case 'woocommerce_duplicate_product':
2316
2481
  return await this.currentSite.woocommerceDuplicateProduct(args.id);
2482
+ case 'woocommerce_list_categories':
2483
+ return await this.currentSite.woocommerceListCategories(args);
2484
+ case 'woocommerce_get_category':
2485
+ return await this.currentSite.woocommerceGetCategory(args.id);
2486
+ case 'woocommerce_create_category':
2487
+ return await this.currentSite.woocommerceCreateCategory(args);
2488
+ case 'woocommerce_update_category': {
2489
+ const { id, ...payload } = args;
2490
+ return await this.currentSite.woocommerceUpdateCategory(id, payload);
2491
+ }
2492
+ case 'woocommerce_delete_category':
2493
+ return await this.currentSite.woocommerceDeleteCategory(args.id);
2494
+ case 'woocommerce_list_tags':
2495
+ return await this.currentSite.woocommerceListTags(args);
2496
+ case 'woocommerce_get_tag':
2497
+ return await this.currentSite.woocommerceGetTag(args.id);
2498
+ case 'woocommerce_create_tag':
2499
+ return await this.currentSite.woocommerceCreateTag(args);
2500
+ case 'woocommerce_update_tag': {
2501
+ const { id, ...payload } = args;
2502
+ return await this.currentSite.woocommerceUpdateTag(id, payload);
2503
+ }
2504
+ case 'woocommerce_delete_tag':
2505
+ return await this.currentSite.woocommerceDeleteTag(args.id);
2317
2506
  case 'woocommerce_list_orders':
2318
2507
  return await this.currentSite.woocommerceListOrders(args);
2319
2508
  case 'woocommerce_get_order':