@awesomate/hosting-mcp 0.57.0 → 0.58.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
@@ -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 / blog post / YouTube link"),
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.57.0",
3
+ "version": "0.58.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",
@@ -1,5 +1,12 @@
1
1
  {
2
2
  "versions": [
3
+ {
4
+ "version": "0.58.0",
5
+ "highlights": [
6
+ "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",
7
+ "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"
8
+ ]
9
+ },
3
10
  {
4
11
  "version": "0.57.0",
5
12
  "highlights": [