@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.
- package/dist/index.js +78 -13
- package/package.json +1 -1
- package/skill/CHANGELOG.json +13 -0
- package/skill/awesomate-app-builder/SKILL.md +53 -3
- package/skill/awesomate-app-builder/references/stack-decision.md +36 -9
- package/skill/awesomate-app-builder/references/wp-migrate.md +4 -2
- package/skill/awesomate-credentials/SKILL.md +41 -4
- package/skill/awesomate-database/SKILL.md +60 -15
- package/skill/awesomate-github/SKILL.md +49 -8
- package/skill/awesomate-github/scripts/github-setup.mjs +4 -1
- package/skill/awesomate-hosting/SKILL.md +131 -20
- package/skill/awesomate-hosting/references/voice.md +1 -1
- package/skill/awesomate-knowledge/SKILL.md +14 -4
- package/skill/awesomate-n8n/SKILL.md +37 -11
- package/skill/awesomate-n8n/references/error-handling.md +3 -1
- package/skill/awesomate-n8n/references/platform-notes.md +3 -1
- package/skill/awesomate-n8n/references/recurring-reports.md +13 -6
- package/skill/awesomate-n8n/references/rest-fallback.md +7 -2
- package/skill/awesomate-n8n/references/troubleshooting.md +31 -1
- package/skill/awesomate-seo/SKILL.md +109 -20
- package/skill/awesomate-support/SKILL.md +59 -12
|
@@ -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
|
|
21
|
-
|
|
22
|
-
|
|
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)
|
|
26
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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,
|
|
94
|
-
|
|
95
|
-
|
|
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']
|
|
103
|
-
0, fix with
|
|
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 `
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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 plan — and "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?" → `
|
|
82
|
-
plan
|
|
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
|
|
89
|
-
|
|
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.
|
|
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).
|