@awesomate/hosting-mcp 0.20.0 → 0.20.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
CHANGED
|
@@ -39891,7 +39891,11 @@ async function hubRequest(config3, method, path, jsonBody, opts = {}) {
|
|
|
39891
39891
|
body = text;
|
|
39892
39892
|
}
|
|
39893
39893
|
if (!res.ok) {
|
|
39894
|
-
const
|
|
39894
|
+
const asObj = body && typeof body === "object" ? body : null;
|
|
39895
|
+
const errField = typeof asObj?.error === "string" ? asObj.error : null;
|
|
39896
|
+
const msgField = typeof asObj?.message === "string" && asObj.message.trim() ? asObj.message.trim() : null;
|
|
39897
|
+
const looksLikeCode = errField !== null && /^[a-z0-9_]+$/.test(errField);
|
|
39898
|
+
const serverMsg = msgField ? looksLikeCode ? `${msgField} (${errField})` : msgField : errField ?? `Request failed (${res.status})`;
|
|
39895
39899
|
const code = body && typeof body === "object" && "code" in body && typeof body.code === "string" ? body.code : null;
|
|
39896
39900
|
let hint = "";
|
|
39897
39901
|
if (res.status === 401) {
|
|
@@ -41584,7 +41588,7 @@ server.registerTool(
|
|
|
41584
41588
|
server.registerTool(
|
|
41585
41589
|
"awesomate_knowledge_ask",
|
|
41586
41590
|
{
|
|
41587
|
-
description: `Ask the account's knowledge base a question and get the VERIFIED answer with numbered sources (title, locator, url) \u2014 the test surface for 'is my content in there and answering well'. Read status: ok \u2192 present answer
|
|
41591
|
+
description: `Ask the account's knowledge base a question and get the VERIFIED answer with numbered sources (title, locator, url) \u2014 the test surface for 'is my content in there and answering well'. Read BOTH status and grounded. grounded:true \u2192 present the answer with its numbered sources. grounded:false (status ok but ZERO sources) \u2192 the agent answered from MODEL MEMORY, not their content: say their content does not cover it, never present it as an answer from their knowledge base, never build on it. The default workspace agent is not strict-grounded, so this is common \u2014 anything customer-facing should use a purpose-built agent (awesomate_knowledge_agents) with strict grounding. no_results / failed_validation (not_in_verified_content:true) \u2192 the verified content has no answer: relay that honestly (use configured_fallback), never fill the gap from memory \u2014 an honest "it doesn't know" is the feature working. error (platform_error:true) \u2192 the platform itself failed (model/API/infra): NOT a content gap \u2014 never tell the user their content lacks the answer; retry once, then awesomate_support. Counts against the monthly answers quota.`,
|
|
41588
41592
|
inputSchema: {
|
|
41589
41593
|
question: external_exports.string().min(1).max(2e3),
|
|
41590
41594
|
session: external_exports.string().max(128).optional().describe("Stable id to keep follow-up questions in one conversation thread"),
|
|
@@ -41935,10 +41939,11 @@ var KB_UPLOAD_TYPES = {
|
|
|
41935
41939
|
".webp": "image/webp"
|
|
41936
41940
|
};
|
|
41937
41941
|
var KB_MAX_UPLOAD_BYTES = 100 * 1024 * 1024;
|
|
41942
|
+
var KB_UNPARSEABLE = /* @__PURE__ */ new Set([".doc", ".docx", ".ppt", ".pptx", ".rtf", ".epub", ".html", ".htm"]);
|
|
41938
41943
|
server.registerTool(
|
|
41939
41944
|
"awesomate_knowledge_upload",
|
|
41940
41945
|
{
|
|
41941
|
-
description: "Ingest ONE file from the user's own computer into their Knowledge Base (Pro+). Pass a LOCAL PATH \u2014 this server runs on their machine and streams the file to the hub itself, so the file contents never pass through the conversation. Handles documents (pdf,
|
|
41946
|
+
description: "Ingest ONE file from the user's own computer into their Knowledge Base (Pro+). Pass a LOCAL PATH \u2014 this server runs on their machine and streams the file to the hub itself, so the file contents never pass through the conversation. Handles documents (pdf, md, txt), business data (csv, tsv, xls, xlsx, json), audio and video (transcribed), and images. Word/PowerPoint/RTF/EPUB files are NOT parseable yet \u2014 the tool refuses them with the workaround (export to PDF, or save as .md/.txt). Max 100 MB per file; bigger media goes through the hub's Knowledge \u2192 Sources page. INGESTING COSTS MONEY and counts against the monthly allowance, so ALWAYS get explicit approval for the specific file(s) first and say what it will consume. For several files, call once per file and report progress \u2014 do not loop silently. Returns a job; poll awesomate_knowledge_sources {action:'jobs'} until it succeeds, then probe the content with awesomate_knowledge_ask before building anything on it. A pack_required response means the allowance is exhausted: nothing was ingested and nothing was purchased.",
|
|
41942
41947
|
inputSchema: {
|
|
41943
41948
|
path: external_exports.string().min(1).max(4096).describe("Path to the file on the user's machine (~ is expanded)"),
|
|
41944
41949
|
title: external_exports.string().max(300).optional().describe("Display title; defaults to the filename")
|
|
@@ -41975,6 +41980,13 @@ server.registerTool(
|
|
|
41975
41980
|
);
|
|
41976
41981
|
}
|
|
41977
41982
|
const ext = extname(abs).toLowerCase();
|
|
41983
|
+
if (KB_UNPARSEABLE.has(ext)) {
|
|
41984
|
+
return errorResult(
|
|
41985
|
+
new Error(
|
|
41986
|
+
`${basename(abs)} is a format the Knowledge Base cannot parse yet (${ext}). Export it to PDF, or save the text as .md or .txt, and upload that instead. For a web page, add its public URL with awesomate_knowledge_sources {action:'add'} rather than uploading the HTML file.`
|
|
41987
|
+
)
|
|
41988
|
+
);
|
|
41989
|
+
}
|
|
41978
41990
|
const contentType = KB_UPLOAD_TYPES[ext] ?? "application/octet-stream";
|
|
41979
41991
|
const filename = title?.trim() ? `${title.trim()}${ext}` : basename(abs);
|
|
41980
41992
|
const result = await hubUploadFile(requireConfig(), "/api/knowledge/sources", {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awesomate/hosting-mcp",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.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,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"versions": [
|
|
3
|
+
{
|
|
4
|
+
"version": "0.20.2",
|
|
5
|
+
"highlights": [
|
|
6
|
+
"Plain-text (.txt) and Markdown files now ingest into your Knowledge Base - a bug stopped both from working",
|
|
7
|
+
"Unsupported file types (Word, PowerPoint, EPUB) are refused up front with the fix - export to PDF - instead of failing later"
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"version": "0.20.1",
|
|
12
|
+
"highlights": [
|
|
13
|
+
"Claude now tells you clearly when an answer did NOT come from your content, instead of showing it like a verified one",
|
|
14
|
+
"Clearer error messages when something is not supported, instead of a generic failure"
|
|
15
|
+
]
|
|
16
|
+
},
|
|
3
17
|
{
|
|
4
18
|
"version": "0.20.0",
|
|
5
19
|
"highlights": [
|
|
@@ -34,13 +48,13 @@
|
|
|
34
48
|
"highlights": [
|
|
35
49
|
"Search your knowledge base with filters and ask questions within a slice of your content",
|
|
36
50
|
"People & entities: your knowledge base now recognises who appears in your content, and you can name and merge them",
|
|
37
|
-
"Build AI agents from your own content
|
|
51
|
+
"Build AI agents from your own content \u2014 drafted, tested privately, and published only when you approve"
|
|
38
52
|
]
|
|
39
53
|
},
|
|
40
54
|
{
|
|
41
55
|
"version": "0.14.0",
|
|
42
56
|
"highlights": [
|
|
43
|
-
"Tools built for business owners, not developers
|
|
57
|
+
"Tools built for business owners, not developers \u2014 plain-language answers about your account, plan and limits",
|
|
44
58
|
"New support skill: get help, understand credits, or request a done-for-you build without leaving Claude",
|
|
45
59
|
"New database skill: Claude picks the right place to keep your data and sets it up for you"
|
|
46
60
|
]
|
|
@@ -124,13 +124,16 @@ enough to route through explicit REST calls the user has just approved.
|
|
|
124
124
|
|
|
125
125
|
| Action | Endpoint |
|
|
126
126
|
|---|---|
|
|
127
|
-
| Status / provision / sources / jobs / agent
|
|
127
|
+
| Status / provision / sources / jobs / agent | `GET\|POST /api/knowledge/{status,provision,sources,jobs,agent}` (tool equivalents) |
|
|
128
|
+
| Ask the knowledge base | `POST /api/knowledge/chat` `{question, session?}` — **returns SSE (`text/event-stream`), NOT JSON.** `JSON.parse` of the body yields `null` and reading `.status` off it throws. Concatenate `event: answer` data lines; the single `event: meta` line carries the verdict `{status, sources, score}`. |
|
|
129
|
+
| Whole-library counts | `GET /api/knowledge/sources/summary` — a PATH. **`?action=summary` is NOT a thing:** it returns 200 with a plain source list, so `.total` is `undefined` and any count derived from it silently becomes 0 or NaN. |
|
|
128
130
|
| Faceted search (what `awesomate_knowledge_search` calls) | `GET /api/knowledge/explore?q=…` + the same facet params. **Add `&include=media` to get `url`/`poster_url` on image/video hits** — without it you get titles with nothing to display. |
|
|
129
131
|
| Business-data warehouse (what `awesomate_knowledge_data` calls) | `GET /api/knowledge/data/{metrics,datasets,datasets/:id,imports,imports/:id}` · `PATCH /api/knowledge/data/datasets/:id` · `POST /api/knowledge/data/imports/:id/:action` · `POST /api/knowledge/data/query` (read-only SQL) |
|
|
130
132
|
| Agent builder (what `awesomate_knowledge_agents` calls) | `GET\|POST /api/knowledge/agents` · `GET\|PATCH\|DELETE /api/knowledge/agents/:agent_id` · `POST /api/knowledge/agents/:agent_id/{publish,suspend,resume}` |
|
|
131
133
|
| **Test a DRAFT agent** (`action:'test'`) | `POST /api/knowledge/agents/:agent_id/chat` `{message, session_id?}`. There is **no** `/test` endpoint — guessing one returns 404. |
|
|
132
134
|
| Entity layer probe (`available` false = not enabled yet, stop) | `GET /api/knowledge/entities` |
|
|
133
|
-
| People list / detail | `GET /api/knowledge/people?status=named\|unknown\|hidden\|all` · `GET /api/knowledge/people/:id` |
|
|
135
|
+
| People list / detail | `GET /api/knowledge/people?status=named\|unknown\|hidden\|all` · `GET /api/knowledge/people/:id` — returns `{people, next_cursor}` and **no `counts` key**. |
|
|
136
|
+
| Entity COUNTS + availability | `GET /api/knowledge/entities` → `{available, counts: {...}}` — counts are nested under `counts`. Reading `people.counts?.x ?? 0` prints a confident row of zeros next to data that plainly exists. |
|
|
134
137
|
| Name or hide/unhide a person (after approval) | `PATCH /api/knowledge/people/:id` `{display_name}` or `{status: "hidden"\|"unknown"}` |
|
|
135
138
|
| Merge two people (after approval; source is hidden) | `POST /api/knowledge/people/:id/merge` `{into_person_id}` |
|
|
136
139
|
| Alias suggestions / decision (identity = kind + alias_norm) | `GET /api/knowledge/entities/aliases?status=pending` · `POST /api/knowledge/entities/aliases/decision` `{kind, alias_norm, decision, entity_id? \| create_person?}` |
|
|
@@ -151,7 +154,10 @@ Learning one shape and applying it to the other is a guaranteed `400`:
|
|
|
151
154
|
| `POST /api/knowledge/agents/:id/chat` — test a draft agent | `{message, session_id?, filters?}` |
|
|
152
155
|
|
|
153
156
|
`question` vs `message`, `session` vs `session_id`. Both are strict objects, so
|
|
154
|
-
sending both spellings to be safe fails too
|
|
157
|
+
sending both spellings to be safe fails too — as does **camelCase**: `{message,
|
|
158
|
+
sessionId}` is a 400, and so is an extra `{draft: true}`. Going direct, use
|
|
159
|
+
snake_case and send nothing the schema does not name. (The MCP tool parameters
|
|
160
|
+
are camelCase — `sessionId`, `agentId` — because the tool translates for you.) Measured on a real first-time
|
|
155
161
|
session (2026-09-01): fourteen `400`s and one `404` were spent rediscovering
|
|
156
162
|
exactly this.
|
|
157
163
|
|
|
@@ -37,6 +37,9 @@ contents never pass through the conversation and a 100 MB PDF costs no context.
|
|
|
37
37
|
- A folder path is rejected on purpose — list it, agree the files, then upload.
|
|
38
38
|
- Public URLs and whole sitemaps stay on `awesomate_knowledge_sources`
|
|
39
39
|
`{action:'add'}`. Use that for their website; use upload for their disk.
|
|
40
|
+
- **What parses:** pdf, md, txt (documents); csv, tsv, xls, xlsx, json (business data);
|
|
41
|
+
audio, video, images. Word/PowerPoint/RTF/EPUB/HTML files are refused with a
|
|
42
|
+
workaround — export to PDF or save as .md/.txt; a web page goes in by URL.
|
|
40
43
|
|
|
41
44
|
## 3. Wait for ingestion, and check it actually succeeded
|
|
42
45
|
|
|
@@ -52,17 +55,19 @@ processing never creates a source row, so `{action:'summary'}` still reports
|
|
|
52
55
|
a failed ingest looks exactly like one that was never attempted.
|
|
53
56
|
|
|
54
57
|
So: read the job's `status` AND its `error`, and relay the error text to the
|
|
55
|
-
user.
|
|
56
|
-
|
|
58
|
+
user. Real ones seen in the wild, all platform-side rather than anything wrong
|
|
59
|
+
with their file:
|
|
57
60
|
|
|
58
|
-
- `new row violates row-level security policy for table "documents"` —
|
|
59
|
-
|
|
61
|
+
- `new row violates row-level security policy for table "documents"` — a
|
|
62
|
+
platform bug in markdown/text ingestion, fixed 2026-09-02. A failed job wrote
|
|
63
|
+
nothing, so once support confirms the fix is deployed the same file can
|
|
64
|
+
simply be re-uploaded.
|
|
60
65
|
- `transcription_not_configured: DEEPGRAM_API_KEY is not set` — audio/video
|
|
61
66
|
cannot be transcribed on that deployment yet.
|
|
62
67
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
68
|
+
None of these are fixable by the user. Say plainly that the upload reached
|
|
69
|
+
Awesomate and failed on our side, and raise it with support (awesomate-support
|
|
70
|
+
skill) rather than blindly re-uploading and spending allowance again.
|
|
66
71
|
|
|
67
72
|
Then `{action:'summary'}` for the whole-library counts once the job has
|
|
68
73
|
actually succeeded.
|