@wickedevolutions/abilities-mcp 1.6.0 → 1.6.1

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.
Files changed (3) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +144 -50
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  All notable changes to Abilities MCP are documented here.
4
4
 
5
+ ## [1.6.1] - 2026-05-08
6
+
7
+ Documentation update — README rewrite for OAuth-from-`.mcpb` recommended path + post-v1.5.0/v1.6.0 surface coverage. Code unchanged from v1.6.0.
8
+
9
+ ### Documentation
10
+
11
+ - README rewritten to lead operators into the alpha-recommended OAuth path (Path 1: `.mcpb` install + `npm install -g @wickedevolutions/abilities-mcp` + `upgrade-auth` + `add-site` + `reauth --add-scope=`). OAuth was invisible in the v1.6.0 README despite being available since v1.5.0.
12
+ - New CLI Reference section covering all subcommands: `add-site`, `reauth` (with the `--add-scope=` / `--remove-scope=` / `--scope=` triad), `revoke`, `list-sites`, `test`, `upgrade-auth`, `force-downgrade`, `self-check`. Plus global flags + exit-code table.
13
+ - Multisite `wp-sites.json` example rewritten: dropped the stale `main` slug (which v1.6.0's [#70](https://github.com/Wicked-Evolutions/abilities-mcp/issues/70) explicitly removed from `add-site` generation), replaced with the dot-suffix routing model documentation.
14
+ - macOS keychain note rewritten: `/usr/bin/security` is now the default backend on darwin under the `auto` setting per v1.6.0's [#61](https://github.com/Wicked-Evolutions/abilities-mcp/issues/61). Removed instruction to opt into `ABILITIES_MCP_KEYCHAIN_BACKEND=security-cli` (no longer needed).
15
+ - New Notes section (replaces Known Limitations) covering: four-layer permissions model with the runtime-error-as-teacher pattern, paired ability classes architecture (`content-list-structure` ↔ `content-list`; `content-get-text` ↔ `content-get`), multisite OAuth subsite execution path, and session lock contention as the only remaining concrete product constraint.
16
+ - Welcome section at top with verbatim *"Welcome, Wordpressnaut"* spaceship paragraph + 3 URL pointers (knowledge.wickedevolutions.com, wickedevolutions.com, abilitiesforai.io). Disclaimer block from J at the very top.
17
+ - Pointer to [PRINCIPLES.md](PRINCIPLES.md) as the *Official WordPress Compatibility Contract* binding all four suite repos.
18
+ - Architecture section updated to reflect both OAuth 2.1 + Application Password as transport options (was Application Password only).
19
+ - Existing bottom *Disclaimer* section retired (replaced by J's disclaimer at the top).
20
+
21
+ Closes [#74](https://github.com/Wicked-Evolutions/abilities-mcp/issues/74).
22
+
5
23
  ## [1.6.0] - 2026-05-07
6
24
 
7
25
  ### Fixed
package/README.md CHANGED
@@ -1,18 +1,33 @@
1
1
  # Abilities MCP
2
2
 
3
- > One MCP to Rule Your WordPress World.
3
+ > **A word from J, the director of this creation.**
4
+ >
5
+ > Everything you see here is built by a single human who does not read or write code and is written by AI. Everything is in constant motion and by observing that movement we create the illusion of being still. Change happens at any given moment. It is simply a law of evolution. Stillness is an act of conscious awareness, not a reality of life.
4
6
 
5
- Open-source MCP bridge that connects any AI client to your WordPress sites through the [WordPress Abilities API](https://developer.wordpress.org/reference/functions/wp_register_ability/). Single STDIO server, multi-site routing, zero dependencies.
7
+ ## Welcome, Wordpressnaut
8
+
9
+ Here is the spaceship, now you'll have to learn how to fly and please do remember, humans make mistakes, humans created AI so AI makes mistakes. Learning to fly is your job and to do that you'll need structure, systems, checklists, principles and understanding you stand before a magical leap of a steep and wonderful learning curve. Be patient and do backup things.
10
+
11
+ → Knowledge layer (deeper traversal): [https://knowledge.wickedevolutions.com](https://knowledge.wickedevolutions.com)
12
+ → [https://wickedevolutions.com](https://wickedevolutions.com)
13
+ → [https://abilitiesforai.io](https://abilitiesforai.io)
14
+
15
+ Our development aim is the *Official WordPress Compatibility Contract* — see [PRINCIPLES.md](PRINCIPLES.md) for the full binding principles across the four-repo suite.
16
+
17
+ ---
18
+
19
+ Open-source MCP bridge that connects any AI client to your WordPress sites through the [WordPress Abilities API](https://developer.wordpress.org/reference/functions/wp_register_ability/). Single STDIO server, multi-site routing, OAuth 2.1 or Application Password authentication, zero npm dependencies.
6
20
 
7
21
  ## Features
8
22
 
9
23
  - **Multi-site routing** — Single MCP server serves all your WordPress sites
24
+ - **OAuth 2.1** — Dynamic Client Registration, PKCE, browser-loopback consent, keychain-backed tokens, automatic refresh, scope expansion
25
+ - **Application Password** — Application Passwords with MCP session management (the legacy alpha-supported path; OAuth is recommended)
10
26
  - **Site parameter injection** — LLM sees a `site` enum on every tool, defaults to your primary site
11
27
  - **Lazy connections** — Sites connect on first use, not at startup
12
- - **HTTP transport** — Application Passwords with MCP session management
13
- - **WordPress multisite** — Subdomain/subdirectory multisites via dot notation (`site.blog`)
28
+ - **WordPress multisite** — Subdomain-style multisite with cross-site routing through the dot-suffix model
14
29
  - **Auto-reconnect** — Exponential backoff, healthcheck pings, session recovery
15
- - **Zero dependencies** — Node.js built-in modules only
30
+ - **Zero npm dependencies** — Node.js built-in modules only
16
31
 
17
32
  ## What You Can Do
18
33
 
@@ -23,17 +38,17 @@ The abilities available to your AI agent depend on which ability plugins you ins
23
38
  **Infrastructure** — filesystem, meta, REST discovery, knowledge layer
24
39
  **Third-party integrations** — auto-detected modules for supported plugins (Astra, Spectra, SureCart, Presto Player, and more)
25
40
 
26
- **[Abilities for Fluent Plugins](https://github.com/Wicked-Evolutions/abilities-for-fluent-plugins)** is our continuously-enhanced third-party translator — bringing AI control to FluentCRM, FluentCommunity, FluentForms, FluentBooking, FluentSupport, FluentBoards, FluentSMTP, FluentAuth, FluentSnippets, FluentMessaging, FluentCart, and FluentAffiliate. We build and maintain it because we use Fluent's plugins ourselves and wanted them AI-native.
41
+ **[Abilities for Fluent Plugins](https://github.com/Wicked-Evolutions/abilities-for-fluent-plugins)** is our continuously-enhanced first-party translator — bringing AI control to FluentCRM, FluentCommunity, FluentForms, FluentBooking, FluentSupport, FluentBoards, FluentSMTP, FluentAuth, FluentSnippets, FluentMessaging, FluentCart, and FluentAffiliate. We build and maintain it because we use Fluent's plugins ourselves and wanted them AI-native.
27
42
 
28
43
  Beyond Fluent, the bridge is plugin-agnostic by design. Any plugin that registers abilities through the WordPress Abilities API becomes available automatically — no configuration in this bridge required. We urge every WordPress plugin developer to prioritize native Abilities API support over anything else.
29
44
 
30
- Every ability enforces `current_user_can()` at execution time — your WordPress role is the security boundary.
45
+ Every ability enforces `current_user_can()` at execution time — your WordPress role is the security boundary, with OAuth scopes and the [Abilities for AI](https://community.wickedevolutions.com/item/abilities-for-ai/) per-module permission gate as additional layers above it (see [Notes — Four-layer permissions model](#four-layer-permissions-model)).
31
46
 
32
47
  > **Sign up for the Abilities for AI alpha release:** https://community.wickedevolutions.com/item/abilities-for-ai/
33
48
 
34
49
  ## Install
35
50
 
36
- There are three install paths. Pick the one that matches how you use AI clients.
51
+ There are three install paths. Pick the one that matches how you use AI clients. **Path 1 (`.mcpb` for Claude Desktop, with the OAuth upgrade) is the recommended operator entry for the alpha.**
37
52
 
38
53
  ### Set up WordPress (required for all paths)
39
54
 
@@ -55,42 +70,75 @@ Go to **Users → Edit (your mcp-agent user) → Application Passwords**, enter
55
70
  | Role | Access | Use case |
56
71
  |------|--------|----------|
57
72
  | **Administrator** | All modules — content, plugins, themes, settings, users, cache, cron, filesystem, and more | Full site management |
58
- | **Editor** | Content, Blocks, Taxonomies, Patterns, Meta, Media | Content publishing workflows — safe for teams where AI should write but not configure |
73
+ | **Editor** | Content, Blocks, Taxonomies, Patterns, Meta, Media | Content publishing workflows — safe for teams where AI writes but does not configure |
59
74
 
60
- > **Tip:** Start with Editor. Upgrade to Administrator when you need infrastructure abilities like plugin management, theme switching, or settings changes.
75
+ > **Tip:** Start with Editor. Move to Administrator when you need infrastructure abilities like plugin management, theme switching, or settings changes.
61
76
 
62
77
  #### Required plugins
63
78
 
64
79
  Install both on your WordPress site:
65
80
 
66
81
  1. **[Abilities for AI](https://community.wickedevolutions.com/item/abilities-for-ai/)** — registers WordPress abilities across content, site management, infrastructure, and third-party integration modules
67
- 2. **[Abilities MCP Adapter](https://community.wickedevolutions.com/item/abilities-mcp-adapter/)** — exposes abilities as MCP tools via REST API
82
+ 2. **[Abilities MCP Adapter](https://community.wickedevolutions.com/item/abilities-mcp-adapter/)** — exposes abilities as MCP tools via REST API and runs the OAuth 2.1 resource server + authorization server
68
83
 
69
84
  Both are available as free downloads from our store, or install from GitHub: [abilities-for-ai](https://github.com/Wicked-Evolutions/abilities-for-ai) and [abilities-mcp-adapter](https://github.com/Wicked-Evolutions/abilities-mcp-adapter).
70
85
 
71
86
  ---
72
87
 
73
- ### Path 1 — `.mcpb` bundle for Claude Desktop (recommended)
88
+ ### Path 1 — `.mcpb` bundle for Claude Desktop with OAuth upgrade (recommended)
74
89
 
75
- Single-click install for Claude Desktop on macOS and Windows. The Application Password is stored encrypted in your OS keychain (macOS Keychain / Windows Credential Manager).
90
+ The full alpha-recommended operator path: install the `.mcpb` for single-click Claude Desktop integration, then upgrade in place to OAuth so tokens live in your OS keychain (macOS Keychain / Windows Credential Manager) and refresh automatically.
91
+
92
+ #### Step 1 — install the `.mcpb` (Application Password baseline)
76
93
 
77
94
  1. Download `abilities-mcp.mcpb` from the [latest GitHub Release](https://github.com/Wicked-Evolutions/abilities-mcp/releases/latest).
78
95
  2. Double-click the file. Claude Desktop opens an "Install Extension" dialog.
79
96
  3. Type three things:
80
97
  - **WordPress Site URL** — `https://example.com`
81
98
  - **WordPress Username** — `mcp-agent`
82
- - **Application Password** — paste the password from the previous step
83
- 4. Click **Install**. The connection is live.
99
+ - **Application Password** — paste the password from the WordPress setup step
100
+ 4. Click **Install**. The connection is live with an Application Password.
101
+
102
+ The bundle covers the single-site case. To unlock OAuth, multi-site, and the `add-site` / `reauth` / `revoke` / `list-sites` / `test` operator flows, continue to Step 2.
103
+
104
+ #### Step 2 — install the CLI globally for OAuth and multi-site flows
105
+
106
+ ```bash
107
+ npm install -g @wickedevolutions/abilities-mcp
108
+ ```
109
+
110
+ This puts the `abilities-mcp` command on your PATH so you can run the OAuth subcommands from a terminal.
111
+
112
+ #### Step 3 — upgrade your Claude Desktop site to OAuth in place
84
113
 
85
- The bundle covers the single-site case. For multi-site (one bridge connected to several WordPress sites at once), use Path 3.
114
+ ```bash
115
+ abilities-mcp upgrade-auth <site>
116
+ ```
86
117
 
87
- **macOS + Claude Desktop keychain note.** Claude Desktop's `.mcpb` runtime may use Apple's `/usr/bin/security` keychain path when macOS rejects native keytar loading. If you set up OAuth from Terminal and then Claude Desktop repeatedly asks for Keychain access, rerun the terminal setup with the same backend Claude Desktop uses:
118
+ This runs the OAuth 2.1 authorization-code flow with PKCE in your default browser, mints fresh tokens, writes them to your OS keychain, and updates `~/.abilities-mcp/wp-sites.json` so the existing Claude Desktop "Abilities MCP" entry now uses OAuth. The Application Password fallback stays in place until you confirm with `--confirm` in a follow-up `upgrade-auth` run.
119
+
120
+ #### Step 4 — add additional sites (OAuth by default)
88
121
 
89
122
  ```bash
90
- ABILITIES_MCP_KEYCHAIN_BACKEND=security-cli abilities-mcp add-site --force https://example.com
123
+ abilities-mcp add-site https://second-site.com
124
+ abilities-mcp add-site https://third-site.com --label="My Staging Site"
91
125
  ```
92
126
 
93
- This is macOS-only and opt-in. It does not loosen Keychain permissions; it just writes tokens through the same Keychain doorway Claude Desktop reads through.
127
+ Each added site provisions OAuth via Dynamic Client Registration, runs the consent flow in your browser, and persists tokens to the keychain. New sites surface through the same Claude Desktop "Abilities MCP" entry — no Claude Desktop config edit needed.
128
+
129
+ For App Password sites instead of OAuth (legacy path), pass `--apppassword --username=<user> --password=<pw>`.
130
+
131
+ #### Step 5 — expand scopes when broader powers are needed
132
+
133
+ Default OAuth grants are baseline-scoped — they cover the common read/write categories (`abilities:read`, `abilities:write`, `abilities:multisite:read`, `abilities:multisite:write`). For delete-tier operations, sensitive WordPress core categories (`users`, `settings`, `filesystem`, `plugins`, `cron`, `themes`, `rewrite`), suite scopes (`astra`, `spectra`, `surecart`, `surecart-ecommerce`, `presto-player`), or Fluent suite scopes, extend explicitly:
134
+
135
+ ```bash
136
+ abilities-mcp reauth <site> --add-scope="abilities:users:delete abilities:settings:write"
137
+ ```
138
+
139
+ The `--add-scope=` flag merges the new scopes into the existing set (deduped, order-preserved). Use `--remove-scope=` to drop scopes by exact match, or `--scope=` to replace the entire set (warns if dropping any). The three flags are mutually exclusive.
140
+
141
+ **macOS keychain note (since v1.6.0).** On macOS, the bridge uses `/usr/bin/security` as its keychain backend by default under the `auto` backend setting. Every bridge spawn — Claude Desktop, Claude Code, Codex, terminal CLI — issues keychain syscalls through the same caller binary, so macOS's per-binary ACL trusted-application list contains exactly one entry. After your first "Always Allow" the entry reads silently from every runtime. If you upgraded from v1.5.x and Claude Desktop repeatedly asks for keychain access, click **Always Allow** once at the prompt OR run `abilities-mcp add-site --force <site>` / `abilities-mcp reauth <site>` to write a fresh entry under the unified backend.
94
142
 
95
143
  ---
96
144
 
@@ -119,7 +167,7 @@ In your client's MCP config:
119
167
  }
120
168
  ```
121
169
 
122
- The endpoint is auto-derived as `<URL>/wp-json/mcp/mcp-adapter-default-server`. Single-site only — for multi-site, use Path 3.
170
+ The endpoint is auto-derived as `<URL>/wp-json/mcp/mcp-adapter-default-server`. Single-site, Application Password only — for OAuth or multi-site, use Path 1 or Path 3.
123
171
 
124
172
  For `claude mcp add` users:
125
173
 
@@ -135,7 +183,7 @@ claude mcp add wordpress \
135
183
 
136
184
  ### Path 3 — `wp-sites.json` (multi-site, power users)
137
185
 
138
- Use this when you connect one bridge to multiple WordPress sites, when you want passwords sourced from a keychain or shell command, or when you're targeting WordPress multisite networks via dot-notation routing.
186
+ Use this when you want passwords sourced from a keychain or shell command without going through the OAuth provisioning flow, when you're connecting one bridge to multiple WordPress sites with hand-curated config, or when you're targeting WordPress multisite networks with explicit per-subsite entries.
139
187
 
140
188
  ```bash
141
189
  cp wp-sites.example.json wp-sites.json
@@ -169,6 +217,37 @@ For Claude Desktop, you can also auto-register:
169
217
  node abilities-mcp.js --register
170
218
  ```
171
219
 
220
+ ## CLI Reference
221
+
222
+ Once `@wickedevolutions/abilities-mcp` is installed globally (or you run `node abilities-mcp.js <subcommand>` from a clone), the following subcommands are available:
223
+
224
+ | Subcommand | What it does | Common flags |
225
+ |------------|--------------|--------------|
226
+ | `add-site <url>` | Register a new site (OAuth by default) | `--apppassword` `--username=` `--password=` `--scope=` `--site-id=` `--label=` `--force` |
227
+ | `reauth <site_id>` | Re-run the OAuth flow for an existing site | `--add-scope=` (recommended) · `--remove-scope=` · `--scope=` (mutually exclusive) |
228
+ | `revoke <site_id>` | Revoke OAuth tokens (local + remote) | — |
229
+ | `list-sites` | Show configured sites + auth status | — |
230
+ | `test <site_id>` | Ping the adapter and report scopes | — |
231
+ | `upgrade-auth <site_id>` | Migrate an existing Application Password site to OAuth in place | `--confirm` (Step 4: drop the App Password fallback after OAuth is verified) |
232
+ | `force-downgrade <site_id>` | Override OAuth pinning (escape hatch for capability-pin failure) | `--i-understand-the-risk` (required) · `--reason="<text>"` |
233
+ | `self-check <site_id>` | Probe Authorization-header survival end-to-end | — |
234
+
235
+ Bare `abilities-mcp` (no subcommand) starts the MCP STDIO server — the mode every MCP client config invokes.
236
+
237
+ ### Global flags
238
+
239
+ | Flag | Description |
240
+ |------|-------------|
241
+ | `--config=<path>` | Path to `wp-sites.json` |
242
+ | `--debug` | Include cause stack on errors; debug logging to `/tmp/abilities-mcp.log` |
243
+ | `--allow-insecure` | Allow plain HTTP (localhost dev only) |
244
+ | `--register` | Register in Claude Desktop config |
245
+ | `--name=<name>` | Server name for `--register` (default: `wordpress`) |
246
+
247
+ ### Exit codes
248
+
249
+ `0` success · `1` unexpected error · `2` usage error · `3` config error · `4` auth failure · `5` capability-pinning violation
250
+
172
251
  ## Configuration
173
252
 
174
253
  ### `wp-sites.json`
@@ -191,6 +270,8 @@ node abilities-mcp.js --register
191
270
  }
192
271
  ```
193
272
 
273
+ OAuth-managed sites added through `abilities-mcp add-site` are written to `~/.abilities-mcp/wp-sites.json` automatically — they carry an `auth.method: "oauth"` block with keychain references rather than inline secrets.
274
+
194
275
  ### Config search order
195
276
 
196
277
  1. `--config=/path/to/wp-sites.json` (explicit)
@@ -203,7 +284,9 @@ The first one found wins. If a `wp-sites.json` exists, env vars are ignored.
203
284
 
204
285
  ### WordPress Multisite
205
286
 
206
- For WordPress multisites, add a `multisite` object mapping subsite keys to their URLs:
287
+ For WordPress multisite networks, OAuth multi-site is provisioned through `abilities-mcp add-site --site-id=<subsite-id> https://<subsite-host>` for each subsite you want to operate on. Each subsite provisions its own OAuth token bound to that subsite's resource. Use the explicit subsite IDs in your MCP client.
288
+
289
+ For App Password multisite (Path 3 hand-curated config), add a `multisite` object mapping subsite slugs to their URLs:
207
290
 
208
291
  ```json
209
292
  {
@@ -216,15 +299,15 @@ For WordPress multisites, add a `multisite` object mapping subsite keys to their
216
299
  "passwordCommand": "security find-generic-password -a mcp-agent -s example.com -w"
217
300
  },
218
301
  "multisite": {
219
- "main": "https://example.com/",
220
302
  "blog": "https://blog.example.com/",
221
- "shop": "https://shop.example.com/"
303
+ "shop": "https://shop.example.com/",
304
+ "example": "https://example.com/"
222
305
  }
223
306
  }
224
307
  }
225
308
  ```
226
309
 
227
- Use dot notation to target subsites: `"site": "network.blog"`
310
+ Use the dot-suffix routing pattern to target subsites: `"site": "network.blog"`. The bare bridge name (`"site": "network"`) routes to the bridge's own root; the dot suffix routes cross-site through the same adapter. The recommended cross-site context naming uses the network root's domain label (e.g., `wickedevolutions` for `wickedevolutions.com`) — `abilities-mcp add-site` against a Multisite Network root populates this automatically per the dot-suffix model.
228
311
 
229
312
  ### Secure password storage
230
313
 
@@ -294,7 +377,7 @@ export WP_MCP_PASSWORD="xxxx xxxx xxxx xxxx xxxx xxxx"
294
377
  WP_MCP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx
295
378
  ```
296
379
 
297
- The bridge reads `process.env.WP_MCP_PASSWORD` at connection time. If the variable is not set, it throws an error immediately.
380
+ The bridge reads `process.env.WP_MCP_PASSWORD` at connection time. If the variable is not set, it surfaces an error immediately.
298
381
 
299
382
  #### `password` (not recommended)
300
383
 
@@ -338,25 +421,15 @@ When multiple sites are configured, every tool gets an optional `site` parameter
338
421
  }
339
422
  ```
340
423
 
341
- Omit `site` to use the default site.
342
-
343
- ## CLI Options
344
-
345
- | Flag | Description |
346
- |------|-------------|
347
- | `--config=<path>` | Path to wp-sites.json |
348
- | `--server=<name>` | MCP adapter server name |
349
- | `--debug` | Enable debug logging to `/tmp/abilities-mcp.log` |
350
- | `--register` | Register in Claude Desktop config |
351
- | `--name=<name>` | Server name for `--register` (default: `wordpress`) |
424
+ Omit `site` to use the default site. For multisite networks, the `site` enum surfaces both the bare bridge name and the dot-suffix cross-site contexts (e.g., `network`, `network.blog`, `network.shop`).
352
425
 
353
426
  ## Architecture
354
427
 
355
428
  ```mermaid
356
429
  graph TD
357
430
  Client[AI Client<br/>Claude Code · Gemini CLI · Cursor · any MCP client] -->|STDIO| Bridge[Abilities MCP]
358
- Bridge -->|HTTP POST| SiteA[Site A]
359
- Bridge -->|HTTP POST| SiteB[Site B]
431
+ Bridge -->|OAuth 2.1 / HTTP POST| SiteA[Site A]
432
+ Bridge -->|App Password / HTTP POST| SiteB[Site B]
360
433
  Bridge -->|SSH + WP-CLI| SiteC[Site C]
361
434
 
362
435
  subgraph "Each WordPress Site"
@@ -366,35 +439,56 @@ graph TD
366
439
  ```
367
440
 
368
441
  - One STDIO process handles all sites through a unified connection pool
369
- - **HTTP transport** — Application Passwords with MCP session management, batch coalescing, auto-reconnect
442
+ - **OAuth 2.1 transport** — Bearer tokens with automatic refresh, keychain-backed persistence, scope expansion via `reauth --add-scope=`
443
+ - **Application Password transport** — HTTP Basic with MCP session management, batch coalescing, auto-reconnect
370
444
  - **SSH transport** — WP-CLI over SSH tunnel, healthcheck pings, handshake replay
371
445
  - Lazy connections — non-default sites connect on first tool call
372
446
  - Tool list comes from the default site with `site` enum injected
373
447
  - Permission metadata (`permission`, `enabled`) flows through annotations to the LLM
374
448
  - Error responses include `input_schema` for AI self-correction
375
449
 
376
- See [docs/architecture.md](docs/architecture.md) for the full technical deep dive — transport comparison tables, session management, multi-site routing internals, and security model.
450
+ See [docs/architecture.md](docs/architecture.md) for the full technical deep dive — transport comparison tables, session management, multi-site routing internals, OAuth state machine, and security model.
451
+
452
+ ## Notes
453
+
454
+ ### Four-layer permissions model
455
+
456
+ When an ability is denied, the rejection comes from one of four independent layers. The runtime error names the layer:
457
+
458
+ 1. **Abilities for AI module permission** — per-blog read/write/delete toggle in *WP Admin → Abilities for AI → Permissions*. The runtime returns `[ability_disabled]` with the module name and where to fix it. (Fix in *Abilities for AI → Permissions*.)
459
+ 2. **WordPress capability** — the WordPress user the bridge authenticates as lacks the relevant capability. WordPress core REST returns `rest_forbidden` / `rest_cannot_*` codes. (Fix by granting the cap to the user, or use a higher-privilege user.)
460
+ 3. **OAuth scope** — the bridge's OAuth token does not include the scope the ability requires. The adapter returns an `insufficient_scope` rejection. (Fix with `abilities-mcp reauth <site> --add-scope="<scope>"`.)
461
+ 4. **Unclear** — generic 500, timeout, or malformed response. Check server logs.
462
+
463
+ The four gates apply together by design (see [PRINCIPLES.md](PRINCIPLES.md), Principle 5 — *Permissions Stay Layered*). The runtime error tells you which gate fired so you can act at the right layer.
464
+
465
+ ### Paired ability classes
466
+
467
+ The product ships compact-vs-full pairs across the API by design. Pick the pair member that matches the traversal you intend:
377
468
 
378
- ## Known Limitations
469
+ - `content-list-structure` (id/title/slug/status/date/link, ~0.5KB/post) ↔ `content-list` (full block markup, ~50–200KB/post). Use `content-list-structure` for bulk discovery; use `content-list` for targeted full inspection.
470
+ - `content-get-text` (plain text stripped, ~2–20KB) ↔ `content-get` (full block markup, ~50–200KB). Use `content-get-text` when you want the readable content; use `content-get` when you need the block structure.
379
471
 
380
- - **Session lock contention** ([#4](https://github.com/Wicked-Evolutions/abilities-mcp/issues/4)) Concurrent bridge instances targeting the same site can cause session loss. Use a single bridge process per site.
472
+ Each ability description names its payload tradeoff. The pattern recurs across other categories — read the description before reaching for the heavy member when a compact member is available.
473
+
474
+ ### Multisite OAuth subsite execution
475
+
476
+ For WordPress multisite networks under OAuth, add each subsite you want to operate on as a separate site entry: `abilities-mcp add-site --site-id=<subsite-id> https://<subsite-host>`. Each subsite provisions its own OAuth token bound to that subsite's resource by the adapter's `mcp_resource` check. Use the explicit subsite IDs in your MCP client. Tracked on [#60](https://github.com/Wicked-Evolutions/abilities-mcp/issues/60) for further iteration.
477
+
478
+ ### Session lock contention ([#4](https://github.com/Wicked-Evolutions/abilities-mcp/issues/4))
479
+
480
+ Concurrent bridge instances targeting the same site can cause session loss. Use a single bridge process per site.
381
481
 
382
482
  ## Requirements
383
483
 
384
484
  - Node.js >= 18
385
485
  - WordPress 6.9+ with [Abilities for AI](https://community.wickedevolutions.com/item/abilities-for-ai/) and [Abilities MCP Adapter](https://github.com/Wicked-Evolutions/abilities-mcp-adapter) installed
386
- - Application Passwords enabled (default in WordPress 5.6+)
486
+ - Application Passwords enabled (default in WordPress 5.6+) for the App Password path; OAuth path needs no additional setup beyond the adapter
387
487
 
388
488
  ## Evolving Knowledge
389
489
 
390
490
  We continuously add knowledge docs, skills, and agent patterns to [knowledge.wickedevolutions.com](https://knowledge.wickedevolutions.com).
391
491
 
392
- ## Disclaimer
393
-
394
- Humans make mistakes — as we know from the present day and history. Humans trained AI. AI acts accordingly. AI predicts probability based on the context window it holds. It is trained to sound certain, as if everything is truth, and to "fix" everything so the human becomes satisfied.
395
-
396
- Learn how to communicate with AI. You are fully responsible for using AI in your life, business, and projects. Using these products is your personal responsibility to learn and own.
397
-
398
492
  ## License
399
493
 
400
494
  GPL-2.0-or-later
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wickedevolutions/abilities-mcp",
3
- "version": "1.6.0",
3
+ "version": "1.6.1",
4
4
  "description": "Open-source MCP bridge connecting AI clients to WordPress through the Abilities API — multi-site routing, zero dependencies",
5
5
  "main": "abilities-mcp.js",
6
6
  "bin": {