@awesomate/hosting-mcp 0.57.0 → 0.59.0
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
CHANGED
|
@@ -41286,7 +41286,7 @@ server.registerTool(
|
|
|
41286
41286
|
"awesomate_n8n_deploy",
|
|
41287
41287
|
{
|
|
41288
41288
|
annotations: annotate("awesomate_n8n_deploy", DESTRUCTIVE),
|
|
41289
|
-
description: "Workflow lifecycle writes on the client's n8n, all consent-gated and audited server-side. Actions: 'validate' (structural + n8n-mcp check of workflowJson
|
|
41289
|
+
description: "Workflow lifecycle writes on the client's n8n, all consent-gated and audited server-side. Actions: 'validate' (structural + n8n-mcp check of workflowJson; ALWAYS validate before create_draft), 'create_draft' (creates an INACTIVE '[CLI] ' workflow tagged awm:client-cli; returns its webhook URLs), 'activate'/'deactivate' (activation strips the [CLI] prefix; production webhooks respond only while active; one Awesomate built may be switched on or off, and the reply says built_by_us so you can tell the client what it does first, but every other write to it is refused with agency_managed; switching on a workflow installed from the library with an empty or missing credential answers 409 setup_incomplete with the list, so walk the client through filling it first), 'promote' (swaps a TESTED draft into the live workflow IN PLACE: live id + webhookIds preserved so external callers keep working; pass workflowId=the LIVE id and draftId=the tested draft; the draft is archived '[promoted <date>]'; response includes operationId for rollback), 'rollback' (restore a promote's pre-swap state; pass operationId), 'update_draft' (replace an INACTIVE self-built draft's full JSON in place; pass workflowId + workflowJson; live workflows are refused, use the promote path), 'delete_draft' (inactive self-built drafts only). Get explicit user approval before activate, promote, rollback, and delete_draft. 429 quota_exceeded = daily plan limit; 403 consent_required \u2192 send user to settingsUrl; 409 n8n_credential_invalid = the user's OWN n8n rejected the stored API key (NOT a hub outage: reads and validate keep working because they never touch their instance): tell them to create a new API key in their n8n under Settings \u2192 n8n API, paste it into their Awesomate account at hub.awesomate.ai/n8n/settings, then retry.",
|
|
41290
41290
|
inputSchema: {
|
|
41291
41291
|
action: external_exports.enum(["validate", "create_draft", "update_draft", "activate", "deactivate", "promote", "rollback", "delete_draft"]),
|
|
41292
41292
|
workflowJson: external_exports.record(external_exports.unknown()).optional().describe("For validate: the full workflow JSON. For create_draft: must contain name, nodes, connections (settings optional)."),
|
|
@@ -41413,7 +41413,7 @@ server.registerTool(
|
|
|
41413
41413
|
"awesomate_n8n_library",
|
|
41414
41414
|
{
|
|
41415
41415
|
annotations: annotate("awesomate_n8n_library", MUTATING),
|
|
41416
|
-
description: "The Awesomate template library for THIS account: ready-made n8n automations and AI agents that Awesomate curates, including bundles linked to the account's referrer (e.g. Business Blueprint members see Dale Beaumont's bundles). Actions: 'list' (every bundle the account may see, each with installed, plan_ok and credentials_missing; every plan), 'detail' (slug: the templates in the bundle, what each does, the credential types it needs and whether the account already has each; every plan), 'install_plan' (slug: runs the pre-install checks WITHOUT writing and returns ready | paused | blocked; paused carries a help card per missing credential with where to get it, the exact page on their n8n to create it and our help article; Support Plus+), 'install' (slug: installs; refused unless the plan is ready, or every missing OPTIONAL credential is named in proceed_without and every ambiguous one has a choice in credential_choices; Support Plus+), 'redeem' (token: installs what a redeem token unlocks; Support Plus+). Then: 'installs' (what is on the instance, grouped by bundle), 'activate' (slug; switches the bundle's workflows on behind the same credential gate the hub uses: a workflow with an empty or missing credential answers setup_incomplete with the exact list; pass active:false to switch off), 'test' (slug; runs each template's test recipe and returns passed | failed | untested with the execution id; real side effects DO run, warn the client), 'rollback' (slug; removes what YOUR most recent install of this bundle created, never anything reused). Workflows land INACTIVE on install; activate is a separate, confirmed step. A 403 whose missingScopes contains n8n:deploy means the plan is Essentials: show the catalog, say installing needs Support Plus, and stop. Never create a credential for the client; send them to create_url and re-run install_plan afterwards.",
|
|
41416
|
+
description: "The Awesomate template library for THIS account: ready-made n8n automations and AI agents that Awesomate curates, including bundles linked to the account's referrer (e.g. Business Blueprint members see Dale Beaumont's bundles). Actions: 'list' (every bundle the account may see, each with installed, plan_ok and credentials_missing; every plan), 'detail' (slug: the templates in the bundle, what each does, the credential types it needs and whether the account already has each; every plan), 'install_plan' (slug: runs the pre-install checks WITHOUT writing and returns ready | paused | blocked; paused carries a help card per missing credential with where to get it, the exact page on their n8n to create it and our help article; Support Plus+), 'install' (slug: installs; refused unless the plan is ready, or every missing OPTIONAL credential is named in proceed_without and every ambiguous one has a choice in credential_choices; Support Plus+), 'redeem' (token: installs what a redeem token unlocks; Support Plus+). Then: 'installs' (what is on the instance, grouped by bundle), 'activate' (slug; switches the bundle's workflows on behind the same credential gate the hub uses: a workflow with an empty or missing credential answers setup_incomplete with the exact list; pass active:false to switch off; this includes workflows Awesomate installed, marked built_by_us), 'test' (slug; runs each template's test recipe and returns passed | failed | untested with the execution id; real side effects DO run, warn the client), 'rollback' (slug; removes what YOUR most recent install of this bundle created, never anything reused). Workflows land INACTIVE on install; activate is a separate, confirmed step. A 403 whose missingScopes contains n8n:deploy means the plan is Essentials: show the catalog, say installing needs Support Plus, and stop. Never create a credential for the client; send them to create_url and re-run install_plan afterwards.",
|
|
41417
41417
|
inputSchema: {
|
|
41418
41418
|
action: external_exports.enum(["list", "detail", "install_plan", "install", "redeem", "installs", "activate", "test", "rollback"]),
|
|
41419
41419
|
slug: external_exports.string().optional().describe("Bundle slug from list (detail, install_plan, install)"),
|
|
@@ -42416,7 +42416,7 @@ server.registerTool(
|
|
|
42416
42416
|
removeCollectionIds: external_exports.array(external_exports.string().max(64)).max(16).optional().describe("move: remove from these collections"),
|
|
42417
42417
|
sourceIds: external_exports.array(external_exports.string().max(300)).max(200).optional().describe("set_visibility/move: several sources at once"),
|
|
42418
42418
|
confirm: external_exports.string().max(64).optional().describe("set_visibility to 'public' only: the account slug, after the user agreed in so many words"),
|
|
42419
|
-
url: external_exports.string().url().optional().describe("add: one public page
|
|
42419
|
+
url: external_exports.string().url().optional().describe("add: one public page or blog post. A YouTube or other video link is not transcribed: on Pro it is read as a page (title and description), below Pro it is refused. To transcribe a recording, upload the file"),
|
|
42420
42420
|
sitemap: external_exports.string().url().optional().describe("add: sitemap.xml URL \u2014 ingests every listed page"),
|
|
42421
42421
|
since: external_exports.string().optional().describe("add+sitemap only: skip entries with lastmod older than this ISO date"),
|
|
42422
42422
|
sourceId: external_exports.string().optional().describe("remove only"),
|
|
@@ -43123,21 +43123,26 @@ server.registerTool(
|
|
|
43123
43123
|
"awesomate_crm_recipes",
|
|
43124
43124
|
{
|
|
43125
43125
|
annotations: annotate("awesomate_crm_recipes", MUTATING),
|
|
43126
|
-
description: `Write recipes: an app's own named writes over its kinds, a few steps that always happen together (log a job and its first memo; close a job and archive its booking). Run one with awesomate_crm_write action 'call'. action 'list': the recipes with their params. action 'save' {key, label, description?, params?, steps}: Support Plus and above; saving a key again replaces it. steps (1 to 10) are {op: 'write_record', kind, data?, links?, id?, as?} or {op: 'archive_record', kind, id}, run in order inside one transaction. {"$param": "<name>"} takes a caller's value; {"$step": "<as>"} takes the id an earlier step wrote, so a memo can link to the job made one step before. An id (an update or an archive) must come from a required uuid param or an earlier step, never a literal. Every kind, attribute, link and reference is checked when it is saved and again when it runs. Contacts are not written by recipes. A recipe is data the hub interprets, never code: there is no SQL and no condition logic. Confirm the steps with the user before saving.`,
|
|
43126
|
+
description: `Write recipes: an app's own named writes over its kinds, a few steps that always happen together (log a job and its first memo; close a job and archive its booking). Run one with awesomate_crm_write action 'call'. action 'list': the recipes with their params. action 'save' {key, label, description?, params?, steps}: Support Plus and above; saving a key again replaces it. steps (1 to 10) are {op: 'write_record', kind, data?, links?, id?, as?} or {op: 'archive_record', kind, id}, run in order inside one transaction. {"$param": "<name>"} takes a caller's value; {"$step": "<as>"} takes the id an earlier step wrote, so a memo can link to the job made one step before. An id (an update or an archive) must come from a required uuid param or an earlier step, never a literal. Every kind, attribute, link and reference is checked when it is saved and again when it runs. Contacts are not written by recipes. A recipe is data the hub interprets, never code: there is no SQL and no condition logic. Confirm the steps with the user before saving. action 'run_by' {key, roles}: Pro and above. Lets the people who sign in to the account's apps, in those roles, run this recipe themselves with @awesomate/sdk app.call(key, args): something their write rule would not let them do by hand, such as accept their own quote ({op: 'write_record', kind: 'job', id: {$param: 'job'}, data: {status: 'accepted'}}). The database lets them do exactly the recipe's steps: only $param and $step positions take their values, every other value is fixed, and an existing record must be one they can already read. roles [] closes it again; archiving a recipe closes it too. Editing a recipe that customers can run changes what they can do: say so and confirm with the user before saving it.`,
|
|
43127
43127
|
inputSchema: {
|
|
43128
|
-
action: external_exports.enum(["list", "save", "archive"]),
|
|
43129
|
-
key: external_exports.string().max(61).optional().describe("save/archive: lower_case name, not write_record or archive_record"),
|
|
43128
|
+
action: external_exports.enum(["list", "save", "archive", "run_by"]),
|
|
43129
|
+
key: external_exports.string().max(61).optional().describe("save/archive/run_by: lower_case name, not write_record or archive_record"),
|
|
43130
|
+
roles: external_exports.array(external_exports.string().max(31)).max(10).optional().describe("run_by: the app roles (from awesomate_crm_app_users) that may run it; [] for the account only"),
|
|
43130
43131
|
label: external_exports.string().max(120).optional(),
|
|
43131
43132
|
description: external_exports.string().max(1e3).optional(),
|
|
43132
43133
|
params: external_exports.array(crmParam).max(20).optional(),
|
|
43133
43134
|
steps: external_exports.array(external_exports.record(external_exports.unknown())).min(1).max(10).optional()
|
|
43134
43135
|
}
|
|
43135
43136
|
},
|
|
43136
|
-
async ({ action, key, label, description, params, steps }) => {
|
|
43137
|
+
async ({ action, key, label, description, params, steps, roles }) => {
|
|
43137
43138
|
try {
|
|
43138
43139
|
const cfg = requireConfig();
|
|
43139
43140
|
if (action === "list") return textResult(await hubGet(cfg, "/api/my-crm/v1/recipes"));
|
|
43140
43141
|
if (!key) return errorResult(new Error(`${action} needs the key.`));
|
|
43142
|
+
if (action === "run_by") {
|
|
43143
|
+
if (!roles) return errorResult(new Error("run_by needs roles: a list of app roles, or [] to close it."));
|
|
43144
|
+
return textResult(await hubPut(cfg, `/api/my-crm/v1/recipes/${encodeURIComponent(key)}/run-by`, { roles }));
|
|
43145
|
+
}
|
|
43141
43146
|
if (action === "save") return textResult(await hubPost(cfg, "/api/my-crm/v1/recipes", { key, label, description, params: params ?? [], steps: steps ?? [] }));
|
|
43142
43147
|
return textResult(await hubDelete(cfg, `/api/my-crm/v1/recipes/${encodeURIComponent(key)}`));
|
|
43143
43148
|
} catch (err) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awesomate/hosting-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.59.0",
|
|
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,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"versions": [
|
|
3
|
+
{
|
|
4
|
+
"version": "0.59.0",
|
|
5
|
+
"highlights": [
|
|
6
|
+
"Claude can switch an automation Awesomate built for you off and on again when you ask, and says what it does first. Changing, deleting or rolling one back still goes through our support team"
|
|
7
|
+
]
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"version": "0.58.0",
|
|
11
|
+
"highlights": [
|
|
12
|
+
"Customers can do one exact thing their access would not let them do by hand, such as accept their own quote: Claude saves it as a recipe and, on your say-so, opens it to a role (awesomate_crm_recipes action 'run_by'). Pro and above",
|
|
13
|
+
"Your app runs it with @awesomate/sdk app.call(). The database lets them change only what the recipe says, and only on records they can already see; archiving the recipe closes it again"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
3
16
|
{
|
|
4
17
|
"version": "0.57.0",
|
|
5
18
|
"highlights": [
|
|
@@ -256,7 +256,8 @@ terms with the exact fix. Trust `errorSummary` only on `confident: true`
|
|
|
256
256
|
(§0a). While you're there, check whether the workflow has an error plan at
|
|
257
257
|
all — [error-handling.md](references/error-handling.md). Self-built workflows: fix via update_draft or the
|
|
258
258
|
upgrade loop. Agency-managed (`agency_managed` error): read and explain
|
|
259
|
-
freely
|
|
259
|
+
freely, and switch it off or on if the user asks (say what it does first);
|
|
260
|
+
any other change goes through Awesomate support.
|
|
260
261
|
|
|
261
262
|
## 6. "What could I automate?"
|
|
262
263
|
|
|
@@ -87,10 +87,12 @@ rebuilt (a rebuilt instance shows 0 workflows and invalidates every old key).
|
|
|
87
87
|
|
|
88
88
|
## When to STOP and hand off
|
|
89
89
|
|
|
90
|
-
- **`agency_managed` error
|
|
90
|
+
- **`agency_managed` error**: the workflow is managed by Awesomate. Reads
|
|
91
91
|
are fine: list it, read executions, run `debug`, and explain the failure to
|
|
92
|
-
the user freely.
|
|
93
|
-
|
|
92
|
+
the user freely. Switching it off or on is allowed when the user asks (the
|
|
93
|
+
reply carries `built_by_us`; tell them what stops while it's off). Do NOT
|
|
94
|
+
attempt any other change (`update_draft`, `promote`, `rollback`, `test`,
|
|
95
|
+
datatable writes): those go through Awesomate support.
|
|
94
96
|
Summarize your diagnosis so the user can paste it into their ticket.
|
|
95
97
|
- `403 consent_required` the user declines to enable — diagnose from the
|
|
96
98
|
execution summary only; say plainly what deeper access would show.
|
|
@@ -23,7 +23,7 @@ workflow, a draft mid-iteration, or a workflow the user built in the n8n UI.
|
|
|
23
23
|
| Iterating on an INACTIVE draft (not yet promoted/activated) | `update_draft` in place — no new workflow ids |
|
|
24
24
|
| Changing a LIVE self-built workflow | Duplicate → draft loop → promote (steps below) |
|
|
25
25
|
| Changing a workflow built in the n8n UI (no `awm:client-cli` tag) | Duplicate into a CLI draft; coordinated URL cutover |
|
|
26
|
-
| Agency-managed workflow (`agency_managed` 403) | Read/explain
|
|
26
|
+
| Agency-managed workflow (`agency_managed` 403) | Read/explain; may be switched off or on when the user asks; other changes go through Awesomate support |
|
|
27
27
|
|
|
28
28
|
## Iterating on a draft: `update_draft`
|
|
29
29
|
|
|
@@ -94,5 +94,5 @@ Promote refuses these. Instead:
|
|
|
94
94
|
|---|---|---|
|
|
95
95
|
| 409 `workflow_active` | `update_draft` on a live workflow | Promote path, never deactivate-to-edit |
|
|
96
96
|
| 403 `not_self_built` | No `awm:client-cli` tag | UI-built duplication path |
|
|
97
|
-
| 403 `agency_managed` | Awesomate-deployed workflow | Explain
|
|
97
|
+
| 403 `agency_managed` | Awesomate-deployed workflow | Explain; offer to switch it off or on if that is what they want; route changes to support |
|
|
98
98
|
| 429 `quota_exceeded` | Daily plan cap | Tell the user; never retry-loop |
|