@awesomate/hosting-mcp 0.55.0 → 0.57.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
@@ -41219,6 +41219,7 @@ var TITLES = {
41219
41219
  awesomate_crm_apps: "Set up sign-in for your own apps",
41220
41220
  awesomate_crm_app_users: "Manage the people who sign in to your apps",
41221
41221
  awesomate_crm_assistant: "Set up the AI in your app's conversations",
41222
+ awesomate_crm_notifications: "Email people when someone replies in your app",
41222
41223
  awesomate_crm_hooks: "Send record changes to your n8n",
41223
41224
  awesomate_crm_email: "Draft an email to a contact list"
41224
41225
  };
@@ -43042,6 +43043,37 @@ server.registerTool(
43042
43043
  }
43043
43044
  }
43044
43045
  );
43046
+ server.registerTool(
43047
+ "awesomate_crm_notifications",
43048
+ {
43049
+ annotations: annotate("awesomate_crm_notifications", MUTATING),
43050
+ description: "Reply emails for an app's conversations (a portal's messages on a job): when someone writes, the people on the other side who are not in the app at that moment get one email, at most once an hour per conversation. A customer writing emails the team (app people in staff_roles); the team, the assistant, the account or an n8n workflow writing emails that conversation's customer. Never the author, never someone switched off. Sent from the app's name, with the message quoted and a link to the app's first https address. They are system emails, like a ticket reply or a receipt, so they carry no unsubscribe link: the owner switches them on or off per app. Off until switched on; switching on starts from now, so nothing said earlier is emailed. Email only for now. Pro and above to change; reading is every plan. action 'get' {app_id}: the setting, how many have been sent, and the last error. action 'set' {app_id, notifications}: notifications is {enabled, thread_link (the message kind's link to the conversation, e.g. 'job'), message_kind? ('message'), body_attribute? ('body'), title_attribute? ('title', on the conversation record, used in the subject), customer_link? ('customer', the conversation record's link to the customer contact), staff_roles? (['owner', 'staff'])}. Turning it on is refused with every problem listed while the kinds don't fit. Confirm with the owner before switching it on: it emails their customers.",
43051
+ inputSchema: {
43052
+ action: external_exports.enum(["get", "set"]),
43053
+ app_id: external_exports.string().max(48).describe("the app, from awesomate_crm_apps list"),
43054
+ notifications: external_exports.object({
43055
+ enabled: external_exports.boolean(),
43056
+ thread_link: external_exports.string().max(41),
43057
+ message_kind: external_exports.string().max(41).optional(),
43058
+ body_attribute: external_exports.string().max(41).optional(),
43059
+ title_attribute: external_exports.string().max(41).optional(),
43060
+ customer_link: external_exports.string().max(41).optional(),
43061
+ staff_roles: external_exports.array(external_exports.string().max(31)).max(10).optional()
43062
+ }).optional().describe("set: the whole setting; fields left out take their defaults")
43063
+ }
43064
+ },
43065
+ async ({ action, app_id, notifications }) => {
43066
+ try {
43067
+ const cfg = requireConfig();
43068
+ const path = `/api/my-crm/v1/apps/${encodeURIComponent(app_id)}/notifications`;
43069
+ if (action === "get") return textResult(await hubGet(cfg, path));
43070
+ if (!notifications) return errorResult(new Error("set needs notifications: {enabled, thread_link, ...}."));
43071
+ return textResult(await hubPut(cfg, path, { notifications }));
43072
+ } catch (err) {
43073
+ return errorResult(err);
43074
+ }
43075
+ }
43076
+ );
43045
43077
  var crmParam = external_exports.object({
43046
43078
  name: external_exports.string().max(41).describe("lower_case"),
43047
43079
  type: external_exports.enum(["text", "number", "date", "datetime", "boolean", "uuid", "text_list", "number_list"]).optional().describe("default text"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awesomate/hosting-mcp",
3
- "version": "0.55.0",
3
+ "version": "0.57.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,20 @@
1
1
  {
2
2
  "versions": [
3
+ {
4
+ "version": "0.57.0",
5
+ "highlights": [
6
+ "Reply emails for your portal's conversations (awesomate_crm_notifications): when your team or Bree replies, the customer gets an email if they aren't in the portal, and when a customer writes, your team does. At most one an hour per conversation",
7
+ "Off until you switch them on, per app. They're system emails, like a ticket reply or a receipt, sent from your app's name with the message quoted and a link back"
8
+ ]
9
+ },
10
+ {
11
+ "version": "0.56.0",
12
+ "highlights": [
13
+ "Knowledge: audio and video are Pro and above whether you upload them or link to them, and each month's media hours are the line where transcription stops",
14
+ "A one-off media-hours pack is for the month you buy it. For more every month, the owner can add 40 media hours a month for $100 on Knowledge, Usage",
15
+ "Claude no longer says a YouTube or other video link will be transcribed: for now a link is read as a web page, and the recording itself is transcribed when you upload the file"
16
+ ]
17
+ },
3
18
  {
4
19
  "version": "0.55.0",
5
20
  "highlights": [
@@ -10,9 +10,9 @@ estimating BEFORE asking approval.
10
10
  |---|---|---|
11
11
  | Web page / blog post | `add {url}` | One page per URL; extraction skips pages under ~200 chars of real text |
12
12
  | Whole site / blog | `add {sitemap, since?}` | sitemap.xml; default cap 500 pages per job — a bigger sitemap FAILS the job loudly rather than truncating silently. `since` skips entries with older `<lastmod>` |
13
- | YouTube / hosted video, podcast audio | `add {url}` | Transcribed (Deepgram); language defaults to English |
13
+ | YouTube / hosted video, podcast audio | `add {url}` | **Not transcribed today**: a link to a recording is read as a web page (title and description). Pro and above only; below Pro, or in a trial, it is refused (403 `media_ingest`). To transcribe a recording, upload the file |
14
14
  | PDF / book / document / markdown | hub upload page | Text layer used; scanned pages OCR'd automatically (`auto` mode, capped at 300 OCR pages per job — over that the job fails BEFORE any vision spend) |
15
- | Video/audio FILES | hub upload page (≤ 100 MB) | Bigger media: host it and add by URL |
15
+ | Video/audio FILES | hub upload page (≤ 100 MB) | Transcribed (Deepgram, language defaults to English). Pro and above, within the month's media hours. A longer recording: split or compress it and upload each part |
16
16
  | Images | hub upload page | Vision-described, then indexed |
17
17
  | Facebook export | hub upload page | The platform's facebook-export lane |
18
18
  | FAQs | Markdown file via `awesomate_knowledge_upload` | One `##` per question, so each becomes its own citable section. **Never** a Q&A spreadsheet as it is: convert it to this file, so every answer stays word for word and citable. Full recipe: [faqs.md](faqs.md) |
@@ -33,8 +33,9 @@ Knowledge → Usage page. A full library on Support Plus and up answers 402
33
33
  `addon_required` with the add-on's details when the owner can buy it, or 402
34
34
  `storage_full` with a sentence when they can't (in a trial, at the cap, or
35
35
  not the owner). Relay either one as it is; never buy anything.
36
- An answers pack counts only for the calendar month (UTC) it is bought in, so
37
- buying one late in the month buys less; say so before they confirm.
36
+ An answers pack and a media-hours pack count only for the calendar month (UTC)
37
+ they are bought in, so buying one late in the month buys less; say so before
38
+ they confirm. A media-hours pack is Pro and above (audio and video are).
38
39
 
39
40
  - An ingest that would exceed included+packs returns `pack_required`. The
40
41
  tool response purchases NOTHING and queues NOTHING.
@@ -45,6 +46,20 @@ buying one late in the month buys less; say so before they confirm.
45
46
  - Insufficient credits → 402 `insufficient_credits`: top up from Billing
46
47
  first. Never loop on it.
47
48
 
49
+ ## Media hours
50
+
51
+ Audio and video are Pro and above. The month's media hours are where
52
+ transcription stops: the plan's hours, plus the one-off onboarding hours in the
53
+ workspace's first month, plus this month's media-hours packs, plus the monthly
54
+ media-hours add-on. Past them, a new recording is refused (`media_hours_exceeded`)
55
+ until the 1st of next month (UTC); a recording already transcribed once is never
56
+ charged again. The owner is told at 80% and 100%.
57
+
58
+ The ways past it: a media-hours pack (40 hours for the rest of this month,
59
+ 1 credit, via the pack flow above), the monthly media-hours add-on (40 more hours
60
+ in every month it runs, $100 a month on the card, added by the owner on Knowledge
61
+ → Usage; don't buy it from here), or a bigger plan.
62
+
48
63
  ## Answer limit
49
64
 
50
65
  Answers are a hard stop. The allowance is the plan's monthly answers plus
@@ -135,6 +135,15 @@ lists the two staff-only kinds it needs (`assistant_thread`, `assistant_draft`)
135
135
  agent (awesomate-knowledge skill) so she can answer questions about the business. Confirm the
136
136
  name and the default mode with the owner: switching it on lets an AI reply to their customers.
137
137
 
138
+ ## 6b. Optional: reply emails
139
+
140
+ `awesomate_crm_notifications {action:'set', app_id, notifications: {enabled: true, thread_link: 'job'}}`
141
+ emails the other side of a conversation when someone writes there and they are not in the app:
142
+ the customer when the team or the assistant replies, the team when a customer writes. At most one
143
+ an hour per conversation, from the app's name, with the message quoted and a link back. They are
144
+ system emails (no unsubscribe link); the owner switches them on or off per app. Ask the owner
145
+ first: it emails their customers.
146
+
138
147
  ## 7. Optional: automation
139
148
 
140
149
  - **Server key** (`awesomate_crm_apps {action:'create_key'}`): for the app's own server or an n8n