@awesomate/hosting-mcp 0.19.0 → 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.
@@ -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
 
@@ -12,13 +12,21 @@ doing it. For tone, read the voice reference installed at
12
12
 
13
13
  ## 0. Orient
14
14
 
15
- On the first support question in a session, call `awesomate_whoami` so you
16
- know whose account and plan you're speaking for (`awesomate_get_context`
17
- also carries the plan). Describe what a plan or upgrade INCLUDES from
18
- `awesomate_get_plan_features`, not memory. For a live credit balance, use
19
- `awesomate_request_build`'s free preview (below)it returns the available
20
- balance without spending anything. Never quote a plan, price, or balance
21
- from memory.
15
+ On the first support question in a session, call `awesomate_get_context`
16
+ it carries the LIVE plan and limits. Use `awesomate_whoami` only to confirm
17
+ WHICH account you're connected to: it's a zero-network read of a file
18
+ written when the token was minted, so straight after an upgrade it still
19
+ reports the OLD planand "I just upgraded" is one of the commonest
20
+ support moments. Describe what a plan or upgrade INCLUDES from
21
+ `awesomate_get_plan_features`, not memory.
22
+
23
+ For a live credit balance, call `awesomate_get_limits` and read
24
+ `dimensions.workflowCredits.balance` — that works on every plan.
25
+ (`awesomate_request_build`'s free preview also reports a balance, but only
26
+ on Pro and Embedded, and it returns the reservation-aware `available` —
27
+ what's actually spendable once credits promised to builds in flight are
28
+ set aside — rather than the raw balance.) Never quote a plan, price, or
29
+ balance from memory.
22
30
 
23
31
  ## 1. FAQ first, then help docs
24
32
 
@@ -56,6 +64,15 @@ When the user wants a human, or §1 came up empty:
56
64
 
57
65
  ## 3. Done-for-you build — spending a credit
58
66
 
67
+ **Build requests are Pro and Embedded only.** Check the plan from
68
+ `awesomate_get_context` BEFORE you start this flow: on Essentials the token
69
+ has no `requests:write` scope, and on Support Plus the route re-checks
70
+ wizard access live and returns an honest `upgrade_required` 403 — either
71
+ way the user hits a wall mid-flow if you didn't say so upfront. On those
72
+ plans, say it in one line ("done-for-you builds are on Pro — here's the
73
+ link if you want it"), offer a ticket (§2) instead, and help fully with
74
+ what you can build yourself.
75
+
59
76
  Offer this when the ask exceeds what you can build from here, or the user
60
77
  would rather hand it off ("can you guys just do it?"). It submits a request
61
78
  to the Awesomate team, who scope, build, test, and deliver it.
@@ -78,20 +95,50 @@ to the Awesomate team, who scope, build, test, and deliver it.
78
95
 
79
96
  ## 4. Plans and billing — honest, never pushy
80
97
 
81
- - "What plan am I on?" / "what do I get?" → `awesomate_whoami` for the
82
- plan, `awesomate_get_plan_features` for what it includes report as facts.
98
+ - "What plan am I on?" / "what do I get?" → `awesomate_get_context` for the
99
+ live plan (never `awesomate_whoami` its plan is a cached file that goes
100
+ stale the moment they upgrade), `awesomate_get_plan_features` for what it
101
+ includes — report as facts.
83
102
  - "How much to upgrade?" / "what would X plan give me?" →
84
103
  `awesomate_get_plan_features` for what the plan includes, then point them
85
104
  at hub.awesomate.ai/billing to see the price and upgrade. Name the plan once, link, move on.
86
105
  All purchases happen
87
106
  in the BROWSER at those links — never take payment details in chat.
88
- - Credits: one currency, $100 each, spendable on a build request, an
89
- automation, or a 1:1 session. Say "credits", never "free workflows".
107
+ - Credits: one currency, $100 each, spendable on an automation or build
108
+ request and on Knowledge Base ingestion packs. Say "credits", never "free
109
+ workflows". If they ask about anything else a credit might buy, check
110
+ rather than assume — those are the spend paths that exist.
90
111
  - If a feature the user wants is on a higher plan, say so once, honestly
91
112
  ("that's on Support Plus — here's the link if you want it"), then help
92
113
  fully within what their plan allows. Never manufacture urgency.
93
114
 
94
- ## 5. Hard rules
115
+ ## 5. Things only these tools can tell you
116
+
117
+ - **`awesomate_notifications {action:'list'}` is the ONLY channel where
118
+ Awesomate pushes to the client** — knowledge quota warnings, "your quote
119
+ is ready", support-access events. Check it whenever the user asks about a
120
+ pending request, a quote, or "did anyone get back to me?". Relay unread
121
+ items in one line, then mark them read (`read` / `read_all`). It sends
122
+ nothing; it only reads their bell.
123
+ - **"How is my account doing?"** → `awesomate_dashboard_metrics` (executions
124
+ by status, error rate, time saved, 7-day trend, most recent failure) and
125
+ `awesomate_account_report` (monthly-report shaped: what's working, what
126
+ isn't, engagement, commercials). Tell the story in their words — never
127
+ paste the JSON at a business owner. A `null` section means "couldn't be
128
+ read right now", never zero.
129
+ - **A fix already prepared, waiting on a ticket.** `awesomate_n8n_findings`
130
+ lists the error analyzer's findings for this account. `fixReady: true`
131
+ means a reviewed fix exists — that is exactly when to raise a support
132
+ ticket (§2) asking to have it applied, quoting the workflow and the
133
+ finding's plain-language summary. `needsClientAction: true` means only the
134
+ user can fix it (an expired login, a third-party quota) — tell them what
135
+ to do rather than opening a ticket.
136
+ - **A 403 that mentions consent is a toggle, not a bug.** Call
137
+ `awesomate_privacy_settings` to see exactly which toggle is off, name it,
138
+ and send them to hub.awesomate.ai/n8n/settings. You cannot flip it
139
+ for them, and there is deliberately no tool that can.
140
+
141
+ ## 6. Hard rules
95
142
 
96
143
  - **Never invent policy or pricing.** If the FAQ and tools don't say it,
97
144
  say so and offer to check with the team via a ticket (§2).