@respira/wordpress-mcp-server 8.0.2 → 8.0.3

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
@@ -768,6 +768,8 @@ npm cache clean --force
768
768
 
769
769
  API key validation happens server-side in the WordPress plugin. The MCP server passes credentials but does not store or validate them.
770
770
 
771
+ `wordpress_run_security_audit` performs bounded read-only evidence collection for reviewed advisories. `wordpress_update_core_security` installs only an exact, catalog-approved security patch after backup confirmation and explicit two-step approval, and returns post-update verification evidence.
772
+
771
773
  Report vulnerabilities to security@respira.press.
772
774
 
773
775
  ---
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: **169 core tools**, **105 WooCommerce tools**, **274 total**.
5
+ Generated catalog: **171 core tools**, **105 WooCommerce tools**, **276 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
 
@@ -144,6 +144,7 @@ The runtime applies site context and per-site governance, so an individual conne
144
144
  - `wordpress_restore_session` — write; hosted/stdio
145
145
  - `wordpress_restore_snapshot` — write; native + hosted
146
146
  - `wordpress_run_pagespeed_audit` — read; hosted/stdio
147
+ - `wordpress_run_security_audit` — read; native + hosted
147
148
  - `wordpress_scan_page_accessibility` — read; hosted/stdio
148
149
  - `wordpress_search_abilities` — read; native + hosted
149
150
  - `wordpress_search_docs` — read; hosted/stdio
@@ -152,6 +153,7 @@ The runtime applies site context and per-site governance, so an individual conne
152
153
  - `wordpress_switch_site` — write; native + hosted
153
154
  - `wordpress_update_acf_field_group` — write; hosted/stdio
154
155
  - `wordpress_update_comment` — write; native + hosted
156
+ - `wordpress_update_core_security` — write; native + hosted
155
157
  - `wordpress_update_custom_post` — write; native + hosted
156
158
  - `wordpress_update_design_token` — write; native + hosted
157
159
  - `wordpress_update_element` — write; native + hosted
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqBH,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;IAiVvE,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;IAyIhC;;;;;;;;;;;;;;;;;;;;;;;;;;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;IAusGtB;;;;;;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;IA2yC9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8YzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6UxB,GAAG;CAyCV"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqBH,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;IAiVvE,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;IAyIhC;;;;;;;;;;;;;;;;;;;;;;;;;;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;IAuvGtB;;;;;;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;IAo0C9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8YzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6UxB,GAAG;CAyCV"}
package/dist/server.js CHANGED
@@ -3302,6 +3302,54 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
3302
3302
  },
3303
3303
  readOnlyHint: true,
3304
3304
  },
3305
+ // Safety & Security center
3306
+ {
3307
+ name: 'wordpress_run_security_audit',
3308
+ description: 'Run a bounded, read-only WordPress security evidence pass. Returns authoritative WordPress/WooCommerce versions, official core checksum mismatches, administrators, standard and must-use plugins, WordPress cron hooks, known advisory indicators, scan coverage and explicit host-level limitations. Set deep_scan=true to inspect uploads and must-use plugin paths for executable files. This tool never deletes or rewrites anything.',
3309
+ inputSchema: {
3310
+ type: 'object',
3311
+ properties: {
3312
+ advisory_ids: {
3313
+ type: 'array',
3314
+ items: { type: 'string' },
3315
+ description: 'Optional reviewed advisory IDs to record as the audit scope, for example wordpress-wp2shell-2026.',
3316
+ },
3317
+ deep_scan: {
3318
+ type: 'boolean',
3319
+ default: false,
3320
+ description: 'Inspect uploads and must-use plugin paths with strict file, time, symlink and result limits.',
3321
+ },
3322
+ },
3323
+ },
3324
+ readOnlyHint: true,
3325
+ },
3326
+ {
3327
+ name: 'wordpress_update_core_security',
3328
+ description: 'Update WordPress core to an exact, catalog-approved security release on the current release branch. Requires a recent recoverable backup, then explicit two-step approval. The first call returns respira_approval_required and an approval_token; repeat the same arguments with that token. The result verifies the running version, REST/frontend boot and official checksums. WordPress core has no automatic rollback, and the receipt says so.',
3329
+ inputSchema: {
3330
+ type: 'object',
3331
+ properties: {
3332
+ advisory_id: {
3333
+ type: 'string',
3334
+ description: 'Reviewed security advisory ID, currently wordpress-wp2shell-2026.',
3335
+ },
3336
+ target_version: {
3337
+ type: 'string',
3338
+ description: 'Exact approved patch version on the current branch: 6.8.6, 6.9.5 or 7.0.2 for wp2shell.',
3339
+ },
3340
+ backup_confirmed: {
3341
+ type: 'boolean',
3342
+ description: 'True only after the operator confirms a recent recoverable backup exists.',
3343
+ },
3344
+ approval_token: {
3345
+ type: 'string',
3346
+ description: 'Approval token returned by the first blocked call. Echo it unchanged on the second call.',
3347
+ },
3348
+ },
3349
+ required: ['advisory_id', 'target_version', 'backup_confirmed'],
3350
+ },
3351
+ idempotentHint: true,
3352
+ },
3305
3353
  // Accessibility tools
3306
3354
  {
3307
3355
  name: 'wordpress_list_accessibility_scans',
@@ -7014,6 +7062,15 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
7014
7062
  return await client.analyzeAEO(args.page_id);
7015
7063
  case 'wordpress_check_structured_data':
7016
7064
  return await client.checkStructuredData(args.page_id);
7065
+ case 'wordpress_run_security_audit':
7066
+ return await client.runSecurityAudit(args.advisory_ids || [], args.deep_scan === true);
7067
+ case 'wordpress_update_core_security':
7068
+ return await client.updateCoreSecurity({
7069
+ advisoryId: args.advisory_id,
7070
+ targetVersion: args.target_version,
7071
+ backupConfirmed: args.backup_confirmed === true,
7072
+ approvalToken: args.approval_token,
7073
+ });
7017
7074
  // Accessibility
7018
7075
  case 'wordpress_list_accessibility_scans':
7019
7076
  return await client.listAccessibilityScans({
@@ -7630,12 +7687,26 @@ Allowlist: css, scss, less, json. PHP / JS theme writes are intentionally out of
7630
7687
  // Widget shortcuts and Bricks tools — dynamic dispatch.
7631
7688
  default: {
7632
7689
  // Check if this is a Bricks deep tool.
7633
- const bricksResult = await dispatchBricksTool(name, args, (method, path, body) => this.currentSite.callRestV2(method, path, body));
7690
+ //
7691
+ // `client` (resolved above via resolveClient(args), the whole switch
7692
+ // statement's site_id-aware client) — NOT this.currentSite, which is
7693
+ // only the globally active site. Every case above this default: uses
7694
+ // `client.callRestV2`; this fallback used `this.currentSite!` instead,
7695
+ // so any respira_*_bricks_typography (and every other tool that only
7696
+ // resolves here, e.g. the rest of bricks-tools.ts / elementor-tools.ts)
7697
+ // silently ignored a supplied site_id and read/wrote the active site
7698
+ // instead — while still reporting the requested site_id back in the
7699
+ // response, since that came from `args`, not from which site actually
7700
+ // executed the call. Reported by E.M. (wellnessist) 2026-07-29: a
7701
+ // `respira_update_bricks_typography` call with site_id set to site B
7702
+ // (site A active) overwrote site A's global variables/theme styles,
7703
+ // a cross-site write with no rollback for either store.
7704
+ const bricksResult = await dispatchBricksTool(name, args, (method, path, body) => client.callRestV2(method, path, body));
7634
7705
  if (bricksResult !== null) {
7635
7706
  return bricksResult;
7636
7707
  }
7637
- // Check if this is an Elementor deep tool.
7638
- const elementorResult = await dispatchElementorTool(name, args, (method, path, body) => this.currentSite.callRestV2(method, path, body));
7708
+ // Check if this is an Elementor deep tool. Same site_id fix as above.
7709
+ const elementorResult = await dispatchElementorTool(name, args, (method, path, body) => client.callRestV2(method, path, body));
7639
7710
  if (elementorResult !== null) {
7640
7711
  return elementorResult;
7641
7712
  }