@awesomate/hosting-mcp 0.91.1 → 0.92.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 +17 -5
- package/package.json +1 -1
- package/skill/CHANGELOG.json +19 -0
- package/skill/awesomate-hosting/SKILL.md +6 -2
- package/skill/awesomate-hosting/references/connect-troubleshooting.md +8 -0
- package/skill/awesomate-hosting/scripts/bootstrap.mjs +21 -1
- package/skill/awesomate-onebrain/SKILL.md +2 -2
package/dist/index.js
CHANGED
|
@@ -40082,11 +40082,23 @@ ${JSON.stringify(details, null, 2)}`;
|
|
|
40082
40082
|
}
|
|
40083
40083
|
function keyHolder(ctx) {
|
|
40084
40084
|
const c = ctx && typeof ctx === "object" ? ctx : {};
|
|
40085
|
-
const
|
|
40085
|
+
const k = c.key && typeof c.key === "object" ? c.key : {};
|
|
40086
|
+
const email2 = typeof k.email === "string" ? k.email : typeof c.email === "string" ? c.email : null;
|
|
40087
|
+
if (k.holder === "person") {
|
|
40088
|
+
const name = typeof k.name === "string" && k.name ? k.name : email2 ?? "a team member";
|
|
40089
|
+
const level = k.level === "full" ? "full" : "view";
|
|
40090
|
+
return {
|
|
40091
|
+
holder: "person",
|
|
40092
|
+
email: email2,
|
|
40093
|
+
name,
|
|
40094
|
+
level,
|
|
40095
|
+
note: `This key belongs to ${name}${email2 && name !== email2 ? ` (${email2})` : ""}, a team member${level === "view" ? " with view-only access" : ""}: Claude does only what they can do in the hub, never more, and never with a shell on the hosting account. Do not offer anything their access does not include; if they ask, say the account owner can do it.`
|
|
40096
|
+
};
|
|
40097
|
+
}
|
|
40086
40098
|
return {
|
|
40087
40099
|
holder: "account_owner",
|
|
40088
40100
|
email: email2,
|
|
40089
|
-
note: `This key belongs to the account owner${email2 ? ` (${email2})` : ""}: everything Claude does with it is done as the owner. Team members
|
|
40101
|
+
note: `This key belongs to the account owner${email2 ? ` (${email2})` : ""}: everything Claude does with it is done as the owner. Team members connect their own Claude Code, at their own access, once the owner turns it on for them.`
|
|
40090
40102
|
};
|
|
40091
40103
|
}
|
|
40092
40104
|
|
|
@@ -42388,7 +42400,7 @@ server.registerTool(
|
|
|
42388
42400
|
"awesomate_get_context",
|
|
42389
42401
|
{
|
|
42390
42402
|
annotations: annotate("awesomate_get_context", READ_ONLY),
|
|
42391
|
-
description: "THE session entry point: call it FIRST, before any domain context. Returns the connected account: plan, capabilities, limits, scopes, token expiry, cPanel routing, PLUS `key` (whose key this is:
|
|
42403
|
+
description: "THE session entry point: call it FIRST, before any domain context. Returns the connected account: plan, capabilities, limits, scopes, token expiry, cPanel routing, PLUS `key` (whose key this is: the account owner's, so everything is done as the owner, or a team member's own (`holder: 'person'`), which does only what that person can do in the hub and never has a shell: say whose it is, and never offer work outside a person's access; a tool the key's scopes do not cover answers at once with the hub's own refusal), PLUS `attention` ({unreadNotifications, erroringWorkflows7d, patExpiresInDays}: null means unknown, never zero; when something is non-zero, mention it to the user in one line before starting the asked task), `features` ({key: {available, reason, message}}: what this account has; never offer one whose available is false, say its message instead), `latestMcpVersion` (if serverVersion still lags it after a restart, the npx cache is stale; remedy: rm -rf ~/.npm/_npx, then restart), and `skill` ({updateAvailable, staleSkills, whatsNew}: if updateAvailable, mention ONCE with a whatsNew line, offer awesomate_skill_update, never mid-task). If the token is near expiry (patExpiresInDays < 7), re-running Connect Claude Code from hub.awesomate.ai/claude refreshes skills AND renews the token in one go.",
|
|
42392
42404
|
inputSchema: {}
|
|
42393
42405
|
},
|
|
42394
42406
|
async () => {
|
|
@@ -43079,7 +43091,7 @@ server.registerTool(
|
|
|
43079
43091
|
"awesomate_site_staging_promote",
|
|
43080
43092
|
{
|
|
43081
43093
|
annotations: annotate("awesomate_site_staging_promote", DESTRUCTIVE),
|
|
43082
|
-
description: "Publish the staging copy to the LIVE site (overwrites live files + database with staging). The live site is auto-snapshotted first
|
|
43094
|
+
description: "Publish the staging copy to the LIVE site (overwrites live files + database with staging). The live site is auto-snapshotted first: the result includes preSnapshotId, which awesomate_rollback_site can restore if anything looks wrong. The live site keeps its own search engine visibility (staging is always hidden from search engines; that setting is not copied to live); if searchEngineVisibility.warning is present, live may now be hidden from search engines, so relay it to the user. **Confirm with the user before promoting: it replaces the live site.** Requires shell access (Support Plus+).",
|
|
43083
43095
|
inputSchema: {
|
|
43084
43096
|
domain: external_exports.string().describe("The LIVE site domain whose staging copy should go live")
|
|
43085
43097
|
}
|
|
@@ -43452,7 +43464,7 @@ server.registerTool(
|
|
|
43452
43464
|
"awesomate_knowledge_provision",
|
|
43453
43465
|
{
|
|
43454
43466
|
annotations: annotate("awesomate_knowledge_provision", MUTATING),
|
|
43455
|
-
description: `Enable the Knowledge Base for this account (creates their isolated tenant on the Awesomate knowledge platform and wires the n8n credential). Idempotent
|
|
43467
|
+
description: `Enable the Knowledge Base for this account (creates their isolated tenant on the Awesomate knowledge platform and wires the n8n credential). Idempotent: safe to re-call, and the account owner re-calling on an active account puts back a missing "Awesomate Knowledge Base" n8n credential. The response's credential is {status, verified?, reason?}: created / exists are fine; adopted with verified:false means an existing credential was kept and its key may be stale (tell the user to rotate the Knowledge key); skipped or failed carries the reason (for example no n8n API key stored, so the user connects n8n first); a pending:true response means provisioning continues in the background: poll awesomate_knowledge_status. consent_required \u2192 send the user to Settings \u2192 Features (hub.awesomate.ai/settings?tab=features): under the Knowledge row, the second line "Use your content for Knowledge". Switching on Knowledge itself is NOT the consent. They must switch it themselves; re-check, then retry. upgrade_required \u2192 relay the upsell, don't retry. Get the user's explicit go-ahead before enabling.`,
|
|
43456
43468
|
inputSchema: {}
|
|
43457
43469
|
},
|
|
43458
43470
|
async () => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awesomate/hosting-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.92.2",
|
|
4
4
|
"description": "Awesomate MCP server — lets Claude manage your Awesomate WordPress hosting, plan, limits, n8n automations, and build Node/static apps + databases",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
package/skill/CHANGELOG.json
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"versions": [
|
|
3
|
+
{
|
|
4
|
+
"version": "0.92.2",
|
|
5
|
+
"highlights": [
|
|
6
|
+
"Publishing a staging copy keeps the live site's search engine setting, instead of hiding the live site from Google like the staging copy, and says so if it could not"
|
|
7
|
+
]
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"version": "0.92.1",
|
|
11
|
+
"highlights": [
|
|
12
|
+
"Turning on Knowledge again now puts back a missing n8n credential for it, and says why when it cannot (for example, n8n is not connected yet)"
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"version": "0.92.0",
|
|
17
|
+
"highlights": [
|
|
18
|
+
"Claude says whose key it is: the account owner's, or a team member's own, which does only what that person can do",
|
|
19
|
+
"Connecting on a computer already connected to the same account as someone else stops and asks, instead of replacing their key"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
3
22
|
{
|
|
4
23
|
"version": "0.91.1",
|
|
5
24
|
"highlights": [
|
|
@@ -40,6 +40,7 @@ before any work** — every tool response is stamped `account: <slug> (source:
|
|
|
40
40
|
once (plus `awesomate_get_limits` before any create/change) and cache:
|
|
41
41
|
|
|
42
42
|
- **`plan`** and **`capabilities.shell`** — decides which branch below you're on.
|
|
43
|
+
- **`key`**: whose key this is. When `key.holder` is `person`, say so first ("This is Mia's own Claude Code, with view-only access") and never offer work their access does not include; if they ask for it, say the account owner can do it. A person's key never has a shell.
|
|
43
44
|
- **`attention`** — `{unreadNotifications, erroringWorkflows7d, patExpiresInDays}`.
|
|
44
45
|
If it shows erroring workflows or unread notifications, say so in ONE line
|
|
45
46
|
("two of your automations failed this week — want me to look?") before the
|
|
@@ -230,7 +231,7 @@ MCP, so say that rather than stopping.
|
|
|
230
231
|
| Tool | Reach for it when |
|
|
231
232
|
|---|---|
|
|
232
233
|
| `awesomate_whoami` | First call of every session — which account this folder acts on (zero network) |
|
|
233
|
-
| `awesomate_get_context` | Session start: plan, capabilities, PAT expiry, `attention`, skill updates, and `key`: whose key this is (
|
|
234
|
+
| `awesomate_get_context` | Session start: plan, capabilities, PAT expiry, `attention`, skill updates, and `key`: whose key this is (the account owner's, so everything is done as the owner, or a team member's own, `holder: 'person'`, which does only what they can do in the hub). A tool the key's scopes do not cover is refused at once in the hub's words: relay it, never retry |
|
|
234
235
|
| `awesomate_get_limits` | Before any create/change — live plan limits + workflow/AI-editor credit balances |
|
|
235
236
|
| `awesomate_get_plan_features` | The live plan ladder, so upgrade talk is accurate |
|
|
236
237
|
| `awesomate_business` | Before writing anything in the business's name: its own name, services, voice, colours, contact details. `read:'documents'` / `read:'document'` for the brand guide, voice guide and business summary; `read:'suggestions'` for details awaiting the owner's yes |
|
|
@@ -462,7 +463,10 @@ AI crawlers — anyone with the link can view, perfect for client review).
|
|
|
462
463
|
`--domain <staging domain>`), send the user the staging URL to review.
|
|
463
464
|
- `awesomate_site_staging_promote <live domain>` — publishes staging over live.
|
|
464
465
|
Live is auto-snapshotted first; report the returned `preSnapshotId` as the
|
|
465
|
-
undo handle (`awesomate_rollback_site`).
|
|
466
|
+
undo handle (`awesomate_rollback_site`). Live keeps its own search engine
|
|
467
|
+
setting; if the result carries `searchEngineVisibility.warning`, tell the
|
|
468
|
+
user live may now be hidden from search engines and how to check.
|
|
469
|
+
**Confirm before promoting.**
|
|
466
470
|
- `awesomate_site_staging_discard <live domain>` — deletes the staging copy;
|
|
467
471
|
live untouched. **Confirm — unpublished staging changes are lost.**
|
|
468
472
|
|
|
@@ -25,6 +25,14 @@ The bootstrap prints a final `AWESOMATE CONNECT: SUCCESS account=<slug>` (or
|
|
|
25
25
|
silence. `PARTIAL` means the token/pin are stored but a step (listed in
|
|
26
26
|
`issues=`) needs the printed manual fix.
|
|
27
27
|
|
|
28
|
+
`FAILED reason=profile-belongs-to-someone-else` means this computer is already
|
|
29
|
+
connected to the same account as a different person (an owner and a team member
|
|
30
|
+
sharing a computer). Nothing was saved. Ask the person at the computer which key
|
|
31
|
+
should stay; re-run with `--replace` only on their clear yes, never on your own.
|
|
32
|
+
Otherwise they connect from their own user account on the computer. The key made
|
|
33
|
+
by the refused run is unused: they can remove it in the hub at Settings,
|
|
34
|
+
Account, Your Claude Code.
|
|
35
|
+
|
|
28
36
|
## Sandboxed / ephemeral environments (cloud agent containers)
|
|
29
37
|
|
|
30
38
|
- **Egress proxy**: if `HTTPS_PROXY`/`HTTP_PROXY` is set, the environment
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* access token itself is never printed.
|
|
12
12
|
*
|
|
13
13
|
* Usage (Claude runs this — the user doesn't touch a terminal):
|
|
14
|
-
* node bootstrap.mjs --code amt_bs_XXXX [--account <slug>] [--pin-dir <dir>]
|
|
14
|
+
* node bootstrap.mjs --code amt_bs_XXXX [--account <slug>] [--pin-dir <dir>] [--replace]
|
|
15
15
|
* node bootstrap.mjs --pat amt_pat_XXXX [--account <slug>] # resume: skip redeem
|
|
16
16
|
*
|
|
17
17
|
* --account asserts WHICH account this connect is for — mismatch aborts before
|
|
@@ -472,6 +472,7 @@ async function main() {
|
|
|
472
472
|
shellAccess: Boolean(ctx.capabilities?.shell),
|
|
473
473
|
cpanel: ctx.cpanel ?? null,
|
|
474
474
|
expiresAt: ctx.patExpiresAt ?? null,
|
|
475
|
+
...(ctx.key?.holder === 'person' ? { keyKind: 'person_device' } : {}),
|
|
475
476
|
};
|
|
476
477
|
} else {
|
|
477
478
|
console.log(`Redeeming setup code against ${apiBase} …`);
|
|
@@ -514,6 +515,21 @@ async function main() {
|
|
|
514
515
|
redeemed.email = redeemed.email ?? context?.email ?? null;
|
|
515
516
|
}
|
|
516
517
|
|
|
518
|
+
// One computer, two people (per-person keys design §6.1): never silently swap whose key this
|
|
519
|
+
// account uses here. An owner and a team member on a shared computer each keep their own.
|
|
520
|
+
const saved = readJsonFile(credPath) ?? {};
|
|
521
|
+
const before = (saved.profiles ?? {})[slug] ?? (saved.slug === slug ? saved : null);
|
|
522
|
+
const beforeEmail = typeof before?.email === 'string' ? before.email.trim().toLowerCase() : null;
|
|
523
|
+
const newEmail = typeof redeemed.email === 'string' ? redeemed.email.trim().toLowerCase() : null;
|
|
524
|
+
const replacing = Boolean(beforeEmail && newEmail && beforeEmail !== newEmail);
|
|
525
|
+
if (replacing && !process.argv.includes('--replace')) {
|
|
526
|
+
console.error(`This computer is already connected to "${slug}" as ${beforeEmail}. Connecting as ${newEmail} would replace that key here.`);
|
|
527
|
+
console.error('Ask the person at this computer which key should stay. Only on their clear yes, run the same command again with --replace; otherwise connect from your own user account on this computer.');
|
|
528
|
+
console.error(`The new key for ${newEmail} was made but not saved here. If it will not be used, remove it in the hub: Settings, Account, Your Claude Code.`);
|
|
529
|
+
console.error('AWESOMATE CONNECT: FAILED reason=profile-belongs-to-someone-else');
|
|
530
|
+
process.exit(1);
|
|
531
|
+
}
|
|
532
|
+
|
|
517
533
|
const profile = {
|
|
518
534
|
apiBase,
|
|
519
535
|
pat: redeemed.pat,
|
|
@@ -523,6 +539,8 @@ async function main() {
|
|
|
523
539
|
plan: redeemed.plan,
|
|
524
540
|
cpanel: redeemed.cpanel ?? null,
|
|
525
541
|
expiresAt: redeemed.expiresAt ?? null,
|
|
542
|
+
// Someone else's SSH key never carries over to this person's profile.
|
|
543
|
+
...(replacing ? { ssh: undefined } : {}),
|
|
526
544
|
};
|
|
527
545
|
mergeProfile(profile);
|
|
528
546
|
console.log(`✓ Access token stored as profile "${slug}" in ${credPath} (chmod 600). Plan: ${redeemed.plan}.`);
|
|
@@ -571,6 +589,8 @@ async function main() {
|
|
|
571
589
|
console.log(' Everything else is set up. This usually means hosting isn\'t fully provisioned — contact Awesomate support, then ask me to "retry SSH setup".');
|
|
572
590
|
}
|
|
573
591
|
}
|
|
592
|
+
} else if (redeemed.keyKind === 'person_device') {
|
|
593
|
+
console.log('• This is your own key: it does what you can do in the hub. SSH and deploys stay with the account owner.');
|
|
574
594
|
} else {
|
|
575
595
|
console.log('• Plan has no shell access — read/status mode. Upgrade to Support Plus for SSH + deploy.');
|
|
576
596
|
}
|
|
@@ -260,8 +260,8 @@ while 1Brain is on.
|
|
|
260
260
|
person's Task goes too), or move one on an older course to the role's
|
|
261
261
|
current course (progress is read again from the new course). Each only on
|
|
262
262
|
the owner's yes.
|
|
263
|
-
- **`my_onboarding`**: the plans of the person this key belongs to
|
|
264
|
-
|
|
263
|
+
- **`my_onboarding`**: the plans of the person this key belongs to: the
|
|
264
|
+
account owner, or a team member on their own key.
|
|
265
265
|
- Writing quizzes and acknowledgements, and sharing a course with a learner,
|
|
266
266
|
are 1Brain's own connector's work (2d), owners and admins only.
|
|
267
267
|
|