@awesomate/hosting-mcp 0.19.1 → 0.19.2

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.
@@ -20,11 +20,15 @@ description: >
20
20
 
21
21
  You are helping the user run their **Awesomate-hosted WordPress** through the
22
22
  **Awesomate Hosting MCP** (tools prefixed `awesomate_`). For WordPress work,
23
- use the tools you have: `awesomate_run_wp_cli` for plugins, themes, options,
24
- and maintenance; `awesomate_wp_post` for creating/updating posts and pages
25
- (drafts by default); `awesomate_wp_media_import` for pulling media in by URL.
26
- For anything beyond those visual page-builder edits, theme design work —
27
- point the user at their WP admin (1-click SSO link) rather than improvising.
23
+ use the tools you have: `awesomate_run_wp_cli` for the allowlisted verbs
24
+ (plugin/theme list, activate, install-by-slug, update, cache flush, `option
25
+ get`, the `list` reads §0a has the full gate and its gaps);
26
+ `awesomate_wp_settings` for title/tagline/timezone and other core settings;
27
+ `awesomate_wp_post` for creating/updating posts and pages (drafts by
28
+ default); `awesomate_wp_media_import` for pulling media in by URL. For
29
+ anything beyond those — visual page-builder edits, theme design work, core
30
+ updates, user management — point the user at their WP admin (1-click SSO
31
+ link) rather than improvising.
28
32
 
29
33
  ## 0. First run — orient before acting
30
34
 
@@ -45,21 +49,45 @@ once (plus `awesomate_get_limits` before any create/change) and cache:
45
49
  **hub.awesomate.ai/sites → Connect Claude Code** to refresh the token.
46
50
  - **`skill.updateAvailable`** — covers all nine skills; the local files are
47
51
  older than the MCP server. Mention it ONCE per session, with the what's-new
48
- line the context includes, and offer to run `awesomate_skill_update`. Give
49
- the exact restart step: in a terminal, type `exit` and run `claude` again;
50
- in VS Code, run "Reload Window". Never raise it mid-task, never nag twice
51
- in a session. If `serverVersion` is still older than `latestMcpVersion`
52
- after a restart, the npx cache is stale the remedy is
52
+ line the context includes, and offer to run `awesomate_skill_update`. Its
53
+ response carries `restart.instruction` the ONE step for THIS user's
54
+ surface, detected from the session itself (terminal / VS Code / desktop
55
+ app). Relay that line verbatim. Never read out a menu of surfaces: a
56
+ Windows desktop-app user told to "type `exit`" is being given a step that
57
+ does not exist for them. If the response includes `restart.note2` (the
58
+ surface could not be detected), ask the user how they run Claude Code
59
+ rather than guessing steps. Never raise the update mid-task, never nag
60
+ twice in a session. If `serverVersion` is still older than
61
+ `latestMcpVersion` after a restart, the npx cache is stale — the remedy is
53
62
  `rm -rf ~/.npm/_npx`, then restart again.
54
63
  - **`cpanel`** routing (host/user), present once hosting is provisioned.
55
64
 
56
65
  If `awesomate_get_context` fails with a connectivity error, it's the user's
57
66
  network or the API base — not an auth problem; say so.
58
67
 
68
+ ### Hosting not set up yet (the most likely day-one state)
69
+
70
+ If `awesomate_get_context` returns **`provisioned: false`**, or the hosting
71
+ tools 404 with `"No hosting account"`, this account has a connection but no
72
+ hosting yet. Nothing else in this skill works until that changes, and
73
+ **there is no MCP tool that provisions hosting** — don't hunt for one, and
74
+ don't retry the 404.
75
+
76
+ Say it plainly and send them to the one place it happens: *"Your Awesomate
77
+ account isn't hosting a site yet. Set that up at hub.awesomate.ai/sites —
78
+ takes a couple of minutes — then come back and I can work on it."* Then
79
+ stop; offer the n8n / app-builder / SEO work that doesn't need hosting
80
+ instead of stalling on it.
81
+
82
+ Read `references/voice.md` before writing to the user — most people here
83
+ are business owners, not developers, and that file is the tone this skill
84
+ is written in.
85
+
59
86
  References: `references/multi-account.md` (profiles, pins, resolution order,
60
87
  wrong account) · `references/connect-troubleshooting.md` (bootstrap, sandbox/
61
88
  proxy failures, resuming a connect, support report) ·
62
- `references/rest-fallback.md` (no `awesomate_*` tools — serve over REST).
89
+ `references/rest-fallback.md` (no `awesomate_*` tools — serve over REST) ·
90
+ `references/voice.md` (how to talk to a non-technical owner).
63
91
 
64
92
  ## 0a. Tool map — reach for it when
65
93
 
@@ -69,6 +97,8 @@ proxy failures, resuming a connect, support report) ·
69
97
  | `awesomate_get_context` | Session start — plan, capabilities, PAT expiry, `attention`, skill updates |
70
98
  | `awesomate_get_limits` | Before any create/change — live plan limits + workflow/AI-editor credit balances |
71
99
  | `awesomate_get_plan_features` | The live plan ladder, so upgrade talk is accurate |
100
+ | `awesomate_get_hosting_status` | Is hosting provisioned at all — eligible/provisioned flags, in-progress step, primary domain, DNS targets. Check before suggesting any site action |
101
+ | `awesomate_get_hosting_account` | cPanel account details: package, server, provisioned-at, masked username |
72
102
  | `awesomate_list_sites` | What WordPress sites exist on this account |
73
103
  | `awesomate_site_create` | Spin up a new WordPress site (check limits first) |
74
104
  | `awesomate_list_domains` | What domains are attached, and to which site |
@@ -79,11 +109,12 @@ proxy failures, resuming a connect, support report) ·
79
109
  | `awesomate_list_snapshots` | What restore points a site has |
80
110
  | `awesomate_rollback_site` | Restore a snapshot after something went wrong (confirm first) |
81
111
  | `awesomate_site_staging_create` / `_promote` / `_discard` | Private full copy on awesomate.dev to review changes; publish or throw away (§5a) |
82
- | `awesomate_run_wp_cli` | Any WP-CLI command against a live site plugins, options, users, maintenance |
112
+ | `awesomate_run_wp_cli` | The 10 allowlisted WP-CLI verbs only (see below)plugin/theme list, activate, install-by-slug, update; `cache flush`; `option get`; `post`/`media`/`menu`/`comment`/`user list` |
113
+ | `awesomate_wp_settings` | Site title, tagline, timezone, date/time format, posts-per-page, search-engine visibility — THE path for any multi-word value, and it flushes the cache (Support Plus+) |
83
114
  | `awesomate_wp_post` | Create/update/read a WP post or page — drafts by default (writes are Support Plus+) |
84
115
  | `awesomate_wp_media_import` | Pull an image/file into the WP media library from an https URL (Support Plus+) |
85
116
  | `awesomate_uninstall_site` | Remove a WordPress install (destructive — confirm explicitly) |
86
- | `awesomate_privacy_settings` | Read which privacy/consent toggles are on — explain a 403 `consent_required` precisely (the user flips toggles themselves at hub.awesomate.ai/settings?tab=privacy) |
117
+ | `awesomate_privacy_settings` | Read which privacy/consent toggles are on — explain a 403 `consent_required` precisely (the user flips toggles themselves under n8n → Settings → Privacy at hub.awesomate.ai/n8n/settings) |
87
118
  | `awesomate_notifications` | The hub notification bell — `list` unread (quota warnings, quote ready, support-access events), `read`/`read_all` to clear |
88
119
  | `awesomate_dashboard_metrics` | Account-wide numbers: executions by status, error rate, time saved, chat sessions, 7-day trend |
89
120
  | `awesomate_account_report` | A monthly-report-shaped read: working / not working / engagement / commercials |
@@ -91,6 +122,36 @@ proxy failures, resuming a connect, support report) ·
91
122
  | `awesomate_support` | Raise a support ticket / reach a human |
92
123
  | `awesomate_request_build` | Request a done-for-you build (spends a credit — confirm first) |
93
124
 
125
+ ### What WP-CLI CANNOT do from here
126
+
127
+ `awesomate_run_wp_cli` is not a WP-CLI passthrough. Ten verbs are allowed,
128
+ each with its own predicate; everything else returns **400
129
+ `wp_cli_not_allowed`**. Know the gaps before you promise anything:
130
+
131
+ - **`user` allows `list` only.** No password reset, no adding or removing
132
+ users, no changing the admin email, no role changes. A locked-out user
133
+ goes through the 1-click WP-admin SSO link or cPanel, not through you.
134
+ - **`core` allows `version` and `check-update` only.** **There is no way to
135
+ update WordPress core from Claude.** You can tell them an update is
136
+ waiting; they apply it in wp-admin. (Plugins and themes DO have `update`.)
137
+ - **No `search-replace`, no `db` anything, no `plugin delete` /
138
+ `theme delete`, no `option delete`.** Changing a site's URL, resetting or
139
+ dumping the database, and removing a plugin outright all happen in
140
+ wp-admin, over SSH (`scripts/ssh-connect.sh`, Support Plus+), or via the
141
+ hub — never as a tool call.
142
+ - **`option update` is a 10-option allowlist** (blogname, blogdescription,
143
+ timezone_string, date_format, time_format, start_of_week, posts_per_page,
144
+ blog_public, default_comment_status, default_ping_status) — and use
145
+ `awesomate_wp_settings` for those anyway.
146
+ - **Arguments cannot contain spaces** (letters, digits and `-_./=:@+,`
147
+ only). The remote shell re-parses them, so the gate refuses anything
148
+ quoted. Any multi-word value — a business name, a tagline, post content —
149
+ is impossible here: `awesomate_wp_settings` or `awesomate_wp_post`.
150
+ - **Installs take wp.org slugs only** — never a URL or a zip.
151
+
152
+ A 400 is a policy answer, not a transport hiccup: don't rephrase and retry.
153
+ (A 502 `wp_cli_unavailable` IS transient — that one you can retry.)
154
+
94
155
  ## 1. The plan model (so your nudges are accurate)
95
156
 
96
157
  | Plan | WP sites | Hosted apps | Custom domains | Shell / Claude Code | Notes |
@@ -121,6 +182,19 @@ Never attempt SSH, WP-CLI, snapshot/rollback, staging, deploy, multi-site —
121
182
  those tools will 403. Instead, surface the specific limit and what
122
183
  Support Plus/Pro unlocks (§4), and link the hub billing page.
123
184
 
185
+ **The plan table's "1 site / 1 custom domain" is not a Claude allowance.**
186
+ On Essentials, a PAT is read-and-advise: `awesomate_site_create`,
187
+ `awesomate_domain_add` and every WordPress write (`awesomate_wp_post`,
188
+ `awesomate_wp_media_import`, `awesomate_wp_settings`,
189
+ `awesomate_run_wp_cli`) return **403 `upgrade_required`** — the server
190
+ enforces it, so no phrasing gets past it. That site and that domain are
191
+ real; they are created and changed **in the hub UI at
192
+ hub.awesomate.ai/sites**, by the user, with deliberate clicks. Say exactly
193
+ that rather than letting them discover it as a failure: *"Your plan lets me
194
+ read and advise on your hosting. Creating the site itself is a couple of
195
+ clicks at hub.awesomate.ai/sites — I'll walk you through it — or Support
196
+ Plus lets me do it from here."*
197
+
124
198
  ### Support Plus and above (shell) — full workflow
125
199
 
126
200
  You additionally have: jailed SSH to the client's own cPanel account, WP-CLI
@@ -137,9 +211,13 @@ at it. Their dev copy is invisible to Google and AI crawlers by policy.
137
211
 
138
212
  ## 3. Safety rules (non-negotiable)
139
213
 
140
- - **Before ANY change to a live site** — plugin/theme/core update, `search-replace`,
141
- bulk edit, deploy — call **`awesomate_snapshot_site`** first and tell the user the
142
- `snapshotId`. If it goes wrong, `awesomate_rollback_site` restores files + DB.
214
+ - **Before ANY change to a live site** — a plugin/theme update, a settings
215
+ change, a content write, a deploy — call **`awesomate_snapshot_site`**
216
+ first and tell the user the `snapshotId`. If it goes wrong,
217
+ `awesomate_rollback_site` restores files + DB. Snapshot first too when the
218
+ USER is about to do something heavy themselves in wp-admin or over SSH (a
219
+ URL change / `search-replace`, a core update, a database import): you
220
+ can't run those, but you can hand them a restore point before they start.
143
221
  - **WP content writes are snapshot-first and drafts-first.** Before the FIRST
144
222
  content write of a session on a live site (an `awesomate_wp_post` write, a
145
223
  content-touching WP-CLI command), take one `awesomate_snapshot_site`.
@@ -148,12 +226,38 @@ at it. Their dev copy is invisible to Google and AI crawlers by policy.
148
226
  to publish.
149
227
  - **Confirm before destructive actions** — `awesomate_rollback_site`,
150
228
  `awesomate_site_staging_promote` (replaces live), `_site_staging_discard`
151
- (loses unpublished staging work), dropping tables, `wp db reset`, deleting
152
- content. State exactly what will be lost and wait for an explicit "yes".
229
+ (loses unpublished staging work), deleting content. State exactly what
230
+ will be lost and wait for an explicit "yes". The same care applies when
231
+ you're TALKING someone through a destructive step you cannot run for them
232
+ (dropping tables, `wp db reset`, deleting a plugin) — snapshot first, spell
233
+ out what it destroys, and let them run it.
153
234
  - **Site deletion has no MCP tool.** The user deletes sites themselves at
154
235
  **hub.awesomate.ai** — deep-link them there; never script around it.
155
236
  - Prefer building/testing in **WordPress Studio locally**, then deploy (§5).
156
- - Dry-run risky WP-CLI where the command supports it before the real run.
237
+ - Read before you write: `option get`, `plugin list`, `theme list` cost
238
+ nothing and tell you what the current state actually is.
239
+
240
+
241
+ ### Changing site title, tagline and other WordPress settings
242
+
243
+ Use **`awesomate_wp_settings`** (domain + any of: title, tagline, timezone,
244
+ dateFormat, timeFormat, postsPerPage, searchEngineVisible). It flushes the
245
+ object cache for you, so the change actually shows on the live site.
246
+
247
+ **Do not reach for `awesomate_run_wp_cli` for these.** Its arguments cannot
248
+ contain spaces — the transport re-parses them on the remote shell, so the
249
+ charset gate refuses anything with a space. `option update blogname "Care
250
+ Connect AI"` will always be rejected there, and a business name is multi-word
251
+ by definition. Same rule for post and page content: that is `awesomate_wp_post`.
252
+
253
+ `awesomate_run_wp_cli` remains right for space-free operations: plugin/theme
254
+ list, activate, install by slug, `option get`, `cache flush`, listing posts,
255
+ media, users and comments.
256
+
257
+ Snapshot before the session's first change to a live site
258
+ (`awesomate_snapshot_site`), and tell the user the snapshot id so they know
259
+ rollback exists. `searchEngineVisible: false` de-indexes the site — always
260
+ confirm that one explicitly before setting it.
157
261
 
158
262
  ## 4. Limits & upgrade etiquette
159
263
 
@@ -198,7 +302,14 @@ AI crawlers — anyone with the link can view, perfect for client review).
198
302
 
199
303
  - `awesomate_site_staging_create <live domain>` — clones files + DB, rewrites
200
304
  URLs. One staging copy per site (409 `staging_exists` → promote or discard
201
- first). Takes a few minutes on large sites.
305
+ first). Takes a few minutes on large sites. On an account whose primary
306
+ site this is, the copy lands at `staging.{slug}.awesomate.dev`; a second
307
+ site keeps its own first label.
308
+ - **A 409 `no_dev_domain` is not your mistake.** Some accounts have no
309
+ awesomate.dev address on file yet, and staging needs one. The message says
310
+ so: relay it and offer to raise it with support (`awesomate_support`) —
311
+ there is no tool that adds the dev address, so don't retry or improvise a
312
+ staging copy on a live domain.
202
313
  - Make the changes ON the staging domain (WP-CLI / wp-admin / deploy.sh with
203
314
  `--domain <staging domain>`), send the user the staging URL to review.
204
315
  - `awesomate_site_staging_promote <live domain>` — publishes staging over live.
@@ -45,7 +45,7 @@ doubt: outcome first, cost before spend, one question at a time.
45
45
  9. **Confirm names and anything hard to undo before acting.** App names
46
46
  become web addresses; deletes are forever.
47
47
  Bad: "Created app xk9-test-2."
48
- Good: "I'll call it 'bookings' — that becomes bookings.acme.awesomate.site.
48
+ Good: "I'll call it 'bookings' — that becomes bookings.acme.awesomate.app.
49
49
  OK?"
50
50
 
51
51
  10. **When something fails, say what you're doing about it.** Never paste a
@@ -30,10 +30,17 @@ platform's answer beats anything you remember.
30
30
  - `upgrade_required: true` → relay the included upsell copy + billing
31
31
  link once, honestly, then help within what reads allow. Never retry
32
32
  into the gate.
33
- - `consent.knowledge_platform_enabled: false` → the user must enable it
34
- under Settings Privacy ("Knowledge Platform") in the hub — you
35
- cannot flip it for them. Explain what it consents to (their selected
36
- content is indexed in Sydney, deletable any time), wait, re-check.
33
+ - `consent.knowledge_platform_enabled: false` → the user must turn it on
34
+ themselves: hub.awesomate.ai/n8n/settings, under the heading
35
+ **"Knowledge Base"**, the toggle **"Send My Content to the Knowledge
36
+ Platform"**. Name it exactly like that one heading and one switch, so
37
+ they can find it without hunting. You cannot flip it for them, and
38
+ there is no tool that can. If you're unsure which toggle is blocking
39
+ (or a knowledge call 403s), call `awesomate_privacy_settings` — it
40
+ reads which consents are on or off and names the one that's stopping
41
+ you. Explain what it consents to (their selected content is indexed in
42
+ Sydney, kept isolated to their account, deletable any time; turning it
43
+ off suspends the Knowledge Base immediately), wait, re-check.
37
44
  - `tenant: null` or `status: 'provisioning'` → not enabled yet /
38
45
  still building; `usage` → month-to-date vs `usage.included` quota.
39
46
  3. Only then design: what content exists, what's already ingested, what the
@@ -110,6 +117,9 @@ enough to route through explicit REST calls the user has just approved.
110
117
  | Action | Endpoint |
111
118
  |---|---|
112
119
  | Status / provision / sources / jobs / agent / ask | `GET\|POST /api/knowledge/{status,provision,sources,jobs,agent,chat}` (tool equivalents) |
120
+ | Faceted search (what `awesomate_knowledge_search` calls) | `GET /api/knowledge/explore?q=…` + the same facet params |
121
+ | Business-data warehouse (what `awesomate_knowledge_data` calls) | `GET /api/knowledge/data/{metrics,datasets,datasets/:id,imports,imports/:id}` · `PATCH /api/knowledge/data/datasets/:id` · `POST /api/knowledge/data/imports/:id/:action` · `POST /api/knowledge/data/query` (read-only SQL) |
122
+ | Agent builder (what `awesomate_knowledge_agents` calls) | `GET\|POST /api/knowledge/agents` · `GET\|PATCH\|DELETE /api/knowledge/agents/:agent_id` · `POST /api/knowledge/agents/:agent_id/{publish,suspend,resume}` |
113
123
  | Entity layer probe (`available` false = not enabled yet, stop) | `GET /api/knowledge/entities` |
114
124
  | People list / detail | `GET /api/knowledge/people?status=named\|unknown\|hidden\|all` · `GET /api/knowledge/people/:id` |
115
125
  | Name or hide/unhide a person (after approval) | `PATCH /api/knowledge/people/:id` `{display_name}` or `{status: "hidden"\|"unknown"}` |
@@ -28,8 +28,11 @@ as outcomes ("your form now emails you") with URLs.
28
28
  resolves to. Wrong slug → stop and fix the pin/connection first. Every
29
29
  tool response is stamped `account: <slug>` — watch it.
30
30
  2. `awesomate_n8n_context` — cache the result:
31
- - `consented: false` → give the user the `settingsUrl` (Settings
32
- Privacy "Allow Claude Code to Build n8n Workflows"), wait, re-check.
31
+ - `consented: false` → give the user the `settingsUrl` and tell them
32
+ where it lands: **n8n Settings Privacy** at
33
+ `hub.awesomate.ai/n8n/settings` → "Allow Claude Code to Build n8n
34
+ Workflows". Privacy moved there; the plain `/settings` page no longer
35
+ has it (old `?tab=privacy` links just redirect). Wait, then re-check.
33
36
  - `403 missingScopes` → token predates n8n support — reconnect from
34
37
  hub.awesomate.ai/sites (Connect Claude Code card).
35
38
  - `capabilities.builder: false` → reads only; building is Support Plus+.
@@ -52,12 +55,22 @@ conflicts with anything under `references/vendor/`, platform-notes wins.
52
55
  ## 0a. Health sweep — the guardian pattern
53
56
 
54
57
  At the START of any n8n session, alongside the context call: run
55
- `awesomate_n8n_errors` (last 7 days) and `awesomate_n8n_kpis` once. If
56
- something is failing, surface it in ONE line in the user's language "two of
57
- your automations failed overnight want me to look?" before proceeding
58
- with the asked task. If everything is green, say nothing and get on with it.
59
- Never let the sweep hijack the session; the user's ask comes first unless
60
- they say otherwise.
58
+ `awesomate_n8n_errors` **with `days: 7`** and `awesomate_n8n_kpis` once. The
59
+ `days` parameter is not optional in practice the tool defaults to **30**,
60
+ so omitting it sweeps a month and dresses old, already-fixed failures up as
61
+ this week's news. If something is failing, surface it in ONE line in the
62
+ user's language "two of your automations failed overnight want me to
63
+ look?" before proceeding with the asked task. If everything is green, say
64
+ nothing and get on with it. Never let the sweep hijack the session; the
65
+ user's ask comes first unless they say otherwise.
66
+
67
+ **Zeros on a new account are not a clean bill of health.** A brand-new
68
+ instance has no error history and no error-reporter workflow installed yet,
69
+ so the sweep returns empty for the same reason it would on a flawless one.
70
+ Check the inventory before you interpret it: no workflows, or workflows with
71
+ no executions, means *there is nothing here yet* — say that, plainly
72
+ ("nothing has run yet, so there's nothing to report — want to build the
73
+ first one?"). Never let "no errors found" imply "everything is working".
61
74
 
62
75
  When diagnosing, trust `errorSummary` only when `confident: true` (it then
63
76
  also carries `errorType`, `code`, `lastNodeExecuted`). When `confident:
@@ -74,7 +87,8 @@ the named node actually exists in the workflow before editing anything.
74
87
  | Instance KPIs: exec totals, error rate, avg/p95 duration, time saved, 7d-vs-prior deltas (per-workflow adds `last_error_at` + `clean_days`) | `awesomate_n8n_kpis` |
75
88
  | Instance-WIDE error events grouped by fingerprint (category, workflow, node, occurrences, first/last seen) — "what is broken across everything" | `awesomate_n8n_errors` |
76
89
  | Execution/table/DB byte sizes + 24h per-workflow offenders ("your executions weigh 4GB") | `awesomate_n8n_storage` |
77
- | AI error-analyzer findings: clientSummary, needsClientAction, fixReady (Pro/Embedded + the "AI error analysis" privacy toggle; read-only) | `awesomate_n8n_findings` |
90
+ | AI error-analyzer findings: clientSummary, needsClientAction, fixReady (Pro/Embedded + the **"Enable AI Error Diagnosis"** toggle under n8n → Settings → Privacy; read-only) | `awesomate_n8n_findings` |
91
+ | Account-wide numbers in one call: executions by status, error rate, time saved, workflows total/active, chat sessions, 7-day trend, most recent live failure — the single best source for a status update or weekly report | `awesomate_dashboard_metrics` |
78
92
  | Executions list / detail / node-by-node debug | `awesomate_n8n_executions` |
79
93
  | Node schemas, node search, community templates, node-level validation | `awesomate_n8n_node_docs` |
80
94
  | Validate / create draft / update draft / activate / promote / rollback / delete draft | `awesomate_n8n_deploy` |
@@ -117,8 +131,20 @@ criteria, error handling — in the user's words. Check the inventory FIRST:
117
131
  reuse existing credentials, $vars, tables, workflows. Email decision tree:
118
132
  existing Gmail/Google credential → reference its ID · none → offer an
119
133
  API-key credential (SMTP / Resend / SendGrid — instant) OR guided Gmail
120
- OAuth (user connects at `{instanceUrl}/home/credentials`, you re-check the
121
- inventory to verify). A credential existing ≠ working.
134
+ OAuth. A credential existing working.
135
+
136
+ **Say the credential catch before they pick, not after it fails.** No tool
137
+ creates a credential on their instance — the one exception is
138
+ `awesomate_n8n_provision_pg`, which makes a Postgres one. Everything else,
139
+ API-key credentials included, the user creates in n8n at
140
+ `{instanceUrl}/home/credentials`; you then re-check the inventory to verify
141
+ it exists. **Gmail and any other OAuth credential can only ever be finished
142
+ in the browser** — the consent screen is Google's, so that branch always
143
+ ends with them, no matter what you try. Flag it while they're choosing:
144
+ *"Either way you'll paste it in on your n8n — an SMTP or Resend key is one
145
+ box and a minute; Gmail means clicking through Google's permission screen.
146
+ Tell me which and I'll give you the exact steps, then pick it up from
147
+ there."*
122
148
 
123
149
  **Phase 2 — Design.** Resolve EVERY planned node and typeVersion via
124
150
  `awesomate_n8n_node_docs` (search similar community templates too — a
@@ -81,7 +81,9 @@ reconnecting a credential), and `fixReady` (a fix exists). It is read-only:
81
81
  use it to explain and prioritise, not as a substitute for your own diagnosis
82
82
  of the execution data. On a 403, the plan or the toggle is the reason —
83
83
  `awesomate_privacy_settings` (hosting skill) tells you which; the user flips
84
- toggles themselves at hub.awesomate.ai/settings?tab=privacy.
84
+ toggles themselves under **n8n → Settings → Privacy** at
85
+ hub.awesomate.ai/n8n/settings — the one for this tool is labelled
86
+ **"Enable AI Error Diagnosis"**.
85
87
 
86
88
  ## 5. What to do when you inherit a workflow with no plan
87
89
 
@@ -73,7 +73,9 @@ trust this file.
73
73
  debug: true}` decodes an execution into per-node input/output and the
74
74
  real error. Use it instead of guessing from the summary. It is gated on
75
75
  the client's `error_content_analysis` privacy toggle (default OFF) — on
76
- a consent refusal, ask the user to enable it on /settingsPrivacy;
76
+ a consent refusal, ask the user to enable it under **n8nSettings →
77
+ Privacy** at `hub.awesomate.ai/n8n/settings` (Privacy moved off the plain
78
+ `/settings` page; old `?tab=privacy` links redirect there);
77
79
  never work around the gate.
78
80
 
79
81
  ## Credentials
@@ -11,8 +11,8 @@ the boundary between them.
11
11
  ## The boundary (read this before promising anything)
12
12
 
13
13
  - **Hub metrics** — execution counts, error rates, time saved, site uptime,
14
- knowledge usage — come from YOUR tools (`awesomate_n8n_kpis`,
15
- `awesomate_n8n_errors`, `awesomate_site_uptime`,
14
+ knowledge usage — come from YOUR tools (`awesomate_dashboard_metrics`,
15
+ `awesomate_n8n_kpis`, `awesomate_n8n_errors`, `awesomate_site_uptime`,
16
16
  `awesomate_knowledge_status`). Those tools authenticate with the user's
17
17
  PAT on this machine. **A workflow inside their n8n cannot call them**, and
18
18
  it can't query n8n's own execution database either.
@@ -29,10 +29,17 @@ hub metrics.
29
29
  When the user asks "how's everything going?" or it's report time, assemble
30
30
  it live:
31
31
 
32
- 1. `awesomate_n8n_kpis` — executions, error rate, time saved, 7d-vs-prior.
33
- 2. `awesomate_n8n_errors` (last 7 days) anything broken, grouped.
34
- 3. `awesomate_site_uptime` per-domain availability and incidents.
35
- 4. `awesomate_knowledge_status` usage vs quota, if they have a knowledge base.
32
+ 1. `awesomate_dashboard_metrics` — **start here.** The account-wide aggregate
33
+ in one call: executions by status, error rate, time saved, workflows
34
+ total/active, chat sessions and unique users (30d), a 7-day daily trend,
35
+ and the most recent live-workflow failure. It is the single best source
36
+ for a status update or weekly report; the rest fill in around it.
37
+ 2. `awesomate_n8n_kpis` — per-workflow detail and 7d-vs-prior deltas.
38
+ 3. `awesomate_n8n_errors` with **`days: 7`** — anything broken, grouped. Pass
39
+ the days: the tool defaults to 30, which turns a weekly report into a
40
+ monthly one without saying so.
41
+ 4. `awesomate_site_uptime` — per-domain availability and incidents.
42
+ 5. `awesomate_knowledge_status` — usage vs quota, if they have a knowledge base.
36
43
 
37
44
  Present it as a short plain-language summary — five lines, not a dashboard:
38
45
  what ran, what it saved, what failed (and whether it's fixed), site status.
@@ -35,6 +35,10 @@ the conversation or logs.
35
35
  | Possibilities brief | `GET /api/my-n8n/machine/possibilities` |
36
36
  | Executions | `GET /api/my-n8n/workflows/:id/executions` · `GET /api/my-n8n/executions/:execId` |
37
37
  | Node-by-node execution debug | `GET /api/my-n8n/machine/executions/:execId/debug` |
38
+ | Instance KPIs (the health sweep) | `GET /api/my-n8n/kpis` · per-workflow: `GET /api/my-n8n/workflows/:id/kpis` |
39
+ | Instance-wide error events, grouped | `GET /api/my-n8n/errors?days=7&limit=` — **pass `days`**, it defaults to 30 |
40
+ | Execution/table/DB byte sizes + 24h offenders | `GET /api/my-n8n/machine/storage` |
41
+ | AI error-analyzer findings (Pro/Embedded) | `GET /api/my-n8n/machine/findings?limit=` |
38
42
  | Live node docs + community templates | `POST /api/my-n8n/machine/node-catalog/:tool` — tool ∈ search_nodes, get_node, search_templates, get_template, validate_node, tools_documentation; body = the tool's args (e.g. `{"query":"gmail"}`, `{"nodeType":"n8n-nodes-base.gmail"}`) |
39
43
 
40
44
  ## Writes (Support Plus+, consent + quotas + audit apply identically)
@@ -62,8 +66,9 @@ the conversation or logs.
62
66
  - `429 quota_exceeded` → the plan's daily cap; stop, don't retry-loop.
63
67
  - `503 node_catalog_unavailable` → use `references/vendor/` knowledge.
64
68
  - `404` on a path in this table → check the path against this file
65
- EXACTLY; do not probe variations anything not listed here does not
66
- exist, and everything listed here is the complete surface.
69
+ EXACTLY; do not probe variations. This table is the n8n surface the
70
+ `awesomate_n8n_*` tools wrap if something is missing from it, the fix is
71
+ to add the verified path here, not to guess at one.
67
72
 
68
73
  The skill's judgment (six-phase loop, approval gates, testing policy,
69
74
  never-activate-a-copy) applies unchanged — only the transport differs.
@@ -49,7 +49,9 @@ rebuilt (a rebuilt instance shows 0 workflows and invalidates every old key).
49
49
  5. `awesomate_n8n_executions {executionId, debug: true}` — node-level output
50
50
  data. Requires `error_content_analysis` consent:
51
51
  - `403 consent_required` → give the user the `settingsUrl` from the error
52
- response and stop; they enable it under Settings → Privacy.
52
+ response and stop; they enable it under **n8n → Settings → Privacy** at
53
+ `hub.awesomate.ai/n8n/settings` (the plain `/settings` page no longer
54
+ carries Privacy; old `?tab=privacy` links redirect there).
53
55
  - `tooLarge: true` → payload over 15MB. Use the summary in the response;
54
56
  do NOT retry hoping for the full payload.
55
57
  6. Node behaving strangely rather than erroring → check its schema with
@@ -17,13 +17,42 @@ Be honest about limits: these are the signals that *let* you rank and be cited
17
17
 
18
18
  - **Static site or Node app** (from awesomate-app-builder) → you write the files
19
19
  directly into the project (below), commit, and deploy.
20
- - **WordPress** → drive it through WP-CLI via the awesomate-hosting skill
21
- (`wp` passthrough). Install a free SEO plugin + let it generate the sitemap
22
- rather than hand-writing files (see §WordPress).
20
+ - **WordPress** → drive it through the hosting tools via the awesomate-hosting
21
+ skill. Install a free SEO plugin + let it generate the sitemap rather than
22
+ hand-writing files (see §WordPress). **Check the plan gate first.**
23
23
  - **A shop (WooCommerce)** → same WordPress path, plus `Product` JSON-LD on
24
24
  product pages and product-data quality (real titles, descriptions, images,
25
- prices) drive it through WP-CLI like any WordPress site. This skill
26
- covers the site-level SEO around the shop.
25
+ prices). This skill covers the site-level SEO around the shop.
26
+
27
+ ### Plan gate — check before promising any WordPress change
28
+
29
+ **Every PAT-authenticated hosting WRITE is Support Plus and above**:
30
+ `awesomate_run_wp_cli`, `awesomate_wp_post`, `awesomate_wp_media_import`,
31
+ `awesomate_wp_settings`, plus `awesomate_site_create` and
32
+ `awesomate_domain_add`. On **Essentials** they all return **403
33
+ `upgrade_required`** — the server enforces it, so no retry or rewording gets
34
+ through.
35
+
36
+ This matters more here than anywhere else: **Essentials is the plan that
37
+ gets exactly one WordPress site**, so it is the most likely plan for someone
38
+ asking about SEO. Get `plan` from `awesomate_get_context` at the start and
39
+ branch honestly.
40
+
41
+ **On Essentials, assume no tool touches their WordPress at all.** Note that
42
+ `awesomate_run_wp_cli` is gated even for its READS (`option get`,
43
+ `plugin list`) — the whole route is behind the write gate, so "just reading
44
+ the options" is not a way round it. The account-level reads do work
45
+ (`awesomate_get_context`, `awesomate_list_sites`, `awesomate_list_domains`,
46
+ `awesomate_dns_check`, `awesomate_site_uptime`).
47
+
48
+ **What Essentials CAN do — which is most of the value:** audit and advise
49
+ from the outside. `curl` the pages, the sitemap, robots.txt and the rendered
50
+ HTML; combine that with what they tell you; then produce the exact changes —
51
+ the titles and descriptions to paste, the JSON-LD block, the llms.txt
52
+ content, which plugin to install and where its settings live. They apply
53
+ them in wp-admin; you verify by fetching the live page again. Say that up
54
+ front — *"I can audit the site and write every change out for you to paste
55
+ in; me making them directly needs Support Plus"* — not after a 403.
27
56
 
28
57
  ## 1. Static / Node — write these
29
58
 
@@ -50,20 +79,69 @@ affected `<head>` tags, `sitemap.xml` `<lastmod>`, and `llms.txt`.
50
79
 
51
80
  ## 2. WordPress
52
81
 
53
- Through the awesomate-hosting skill's `wp` passthrough:
54
- - Install + activate a free SEO plugin (e.g. `wp plugin install wordpress-seo
55
- --activate` for Yoast, or the user's preference). It manages titles/meta,
56
- Open Graph, and the XML sitemap.
82
+ **Find the domain, don't ask for it.** `awesomate_list_sites` and
83
+ `awesomate_list_domains` tell you what sites exist and which domain is
84
+ attached to which. Ask only when the answer is genuinely ambiguous (more
85
+ than one site, and the user hasn't said which).
86
+
87
+ **Snapshot before you change a live site.** `awesomate_snapshot_site` first,
88
+ and tell the user the `snapshotId` — the hosting skill requires this and SEO
89
+ work is exactly the kind of change that touches the whole site at once (a
90
+ plugin, a theme option, an indexing flag). `awesomate_rollback_site` is the
91
+ undo.
92
+
93
+ Then, on Support Plus and above:
94
+
95
+ - **Install + activate an SEO plugin** — `awesomate_run_wp_cli` with args
96
+ `['plugin','install','wordpress-seo','--activate']` for Yoast, or the
97
+ user's preference. Slugs only, never a URL or zip. This part works.
98
+ - **Configuring it does NOT work from here.** The wp-cli gate allows
99
+ `option update` for exactly ten core options, and `wpseo_titles` and
100
+ friends are not among them; their values are JSON full of spaces, which
101
+ the argument charset gate refuses anyway. So: you install and activate,
102
+ then hand off — *"Yoast is installed. Open Settings → Yoast SEO in
103
+ wp-admin and I'll talk you through the title template and the social
104
+ image, or give me the values and I'll write out exactly what to paste."*
105
+ Don't burn attempts discovering this at runtime.
57
106
  - Confirm the sitemap is live (`/sitemap_index.xml` or `/sitemap.xml`) and
58
- `robots.txt` references it.
59
- - Add an `llms.txt` at the site root for AI discoverability (the plugin won't).
60
- - Posts and pages can be created/updated directly via `awesomate_wp_post`
61
- (drafts first the user approves publishing). Useful for adding the content
62
- pages that back up `llms.txt` — a services overview, an FAQ, an about page —
63
- when the site is thin on machine-readable substance.
107
+ `robots.txt` references it — `curl` the live URLs.
108
+ - **Posts and pages** via `awesomate_wp_post` (drafts first the user
109
+ approves publishing). Useful for the content pages that back up
110
+ `llms.txt`a services overview, an FAQ, an about page — when the site is
111
+ thin on machine-readable substance.
112
+ - **The og:image / logo** goes in via `awesomate_wp_media_import` — one https
113
+ URL per call, returns an `attachmentId` you can reference from a post or
114
+ hand to the SEO plugin's social settings. It cannot read a local file:
115
+ the image has to be reachable on the web first.
116
+ - **Site title, tagline, timezone, search visibility** → `awesomate_wp_settings`
117
+ (§4), never wp-cli — those values contain spaces.
64
118
  - WordPress is the recommended stack precisely when SEO/organic reach matters —
65
119
  lean into it here.
66
120
 
121
+ ### Files at the site root: say what's actually possible
122
+
123
+ §1's `robots.txt` / `sitemap.xml` / `llms.txt` advice is for **static sites
124
+ and Node apps**, where you write the file into the project and deploy it.
125
+ **On WordPress there is no tool that writes a file to the site.**
126
+ `awesomate_run_wp_cli` cannot (no file verbs are allowlisted), `wp_post`
127
+ writes posts and pages, and `wp_media_import` takes an https URL. Don't
128
+ promise the file and then discover this.
129
+
130
+ On WordPress those three come from:
131
+
132
+ - **`robots.txt` and `sitemap.xml`** — the SEO plugin generates both
133
+ (WordPress serves a virtual robots.txt; Yoast and friends add the sitemap
134
+ and the reference to it). That's why installing the plugin is step one.
135
+ - **`llms.txt`** — no plugin makes one. Either the user places the file over
136
+ SSH or cPanel's File Manager (`scripts/ssh-connect.sh` in the hosting
137
+ skill, Support Plus+), or you publish the same content as a normal page
138
+ with `awesomate_wp_post` and link it — a real page is crawlable and
139
+ editable, and gets most of the benefit.
140
+
141
+ **You can always generate the content.** Write the exact `llms.txt` body,
142
+ the robots rules, the JSON-LD block, and tell them precisely where each goes
143
+ — that is the useful half, and it works on every plan.
144
+
67
145
  ## 3. Verify
68
146
  - `robots.txt` and `sitemap.xml` (or the WP sitemap) return 200 at the root.
69
147
  - Each key page has a unique title + description and valid JSON-LD (no syntax
@@ -90,17 +168,28 @@ the user asks to "check SEO", and after any content change:
90
168
  2. **Sitemap** — `/sitemap.xml` (WP: `/sitemap_index.xml`) returns 200 and
91
169
  `<lastmod>` is fresh. A months-old lastmod on a site that changed last week
92
170
  means generation is broken, not that nothing changed.
93
- 3. **robots.txt + llms.txt** — both exist, and `llms.txt` still mentions the
94
- current offerings. A stale llms.txt misdescribes the business to every AI
95
- assistant that reads it.
171
+ 3. **robots.txt + llms.txt** — both exist (on WordPress, `llms.txt` may be
172
+ the page standing in for it check whichever they have), and the content
173
+ still mentions the current offerings. A stale llms.txt misdescribes the
174
+ business to every AI assistant that reads it.
96
175
  4. **AI crawlers not blocked at the edge** —
97
176
  `curl -A "GPTBot" -s -o /dev/null -w "%{http_code}" https://DOMAIN/`
98
177
  (repeat with `ClaudeBot`) returns 200, not 403 or a challenge page.
99
178
  Where to fix each case: [references/ai-discoverability.md](references/ai-discoverability.md).
100
179
  5. **WordPress only: `blog_public` must be 1** — one checkbox ("Discourage
101
180
  search engines") silently de-indexes the whole site. Read it via
102
- `awesomate_run_wp_cli` with args `['option','get','blog_public']`; if it's
103
- 0, fix with `['option','update','blog_public','1']` (allowlisted).
181
+ `awesomate_run_wp_cli` with args `['option','get','blog_public']`. If it's
182
+ 0, fix it with **`awesomate_wp_settings {domain, searchEngineVisible:
183
+ true}`** — that path also flushes the object cache, which the wp-cli
184
+ `option update` does not, so the change actually shows on the live site
185
+ instead of sitting behind a stale cache. (A page or CDN cache may still
186
+ need its own refresh.)
187
+ 6. **"My site vanished from Google" is often not SEO at all.** Before
188
+ auditing tags, check the two things that take a site off the internet:
189
+ `awesomate_dns_check` (is the domain still pointing at the hosting?) and
190
+ `awesomate_site_uptime` (30-day availability and incidents). A domain
191
+ that stopped resolving, or a site that was down for two days, explains a
192
+ ranking drop far better than a meta description does.
104
193
 
105
194
  Report pass/fail per check, with the fix for each failure.
106
195