@awesomate/hosting-mcp 0.20.2 → 0.20.4

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
@@ -40190,9 +40190,10 @@ async function knowledgeSources(config3, args) {
40190
40190
  if (args.action === "summary") {
40191
40191
  try {
40192
40192
  const s = await hubGet(config3, "/api/knowledge/sources/summary");
40193
+ const failedJobs = Number(s.failed_jobs_7d ?? 0);
40193
40194
  return {
40194
40195
  ...s,
40195
- note: "Exact whole-library counts. by_kind is what the knowledge base answers from; the paged list is only for browsing individual sources."
40196
+ note: failedJobs > 0 ? `Exact whole-library counts \u2014 BUT ${failedJobs} ingest job(s) FAILED in the last 7 days (last: ${String(s.last_failed_job_at ?? "unknown")}). Those uploads are NOT in the library even though every count here looks clean. Read awesomate_knowledge_sources {action:'jobs', status:'failed'} and tell the user which ingests failed before summarising the library.` : "Exact whole-library counts. by_kind is what the knowledge base answers from; the paged list is only for browsing individual sources."
40196
40197
  };
40197
40198
  } catch (err) {
40198
40199
  if (err instanceof HubApiError && err.status === 404) {
@@ -41535,7 +41536,7 @@ server.registerTool(
41535
41536
  server.registerTool(
41536
41537
  "awesomate_knowledge_sources",
41537
41538
  {
41538
- description: "The knowledge base's content sources. action 'list' \u2014 ONE page of sources, most recently ingested first (default 50, max 200 via limit): read `page.has_more`/`next_cursor` and pass cursor to continue \u2014 a page is never the whole library. 'summary' \u2014 exact whole-library counts {total, by_kind, chunks, indexed_chunks, failed_sources}: use THIS to say what the knowledge base contains. 'jobs' \u2014 ingest job statuses (optional status filter: queued|running|succeeded|failed). 'add' \u2014 ingest a public page {url} or a whole site {sitemap, since?}; ALWAYS get explicit approval first (ingest costs money and counts against quota), for a local FILE on the user's machine use awesomate_knowledge_upload instead (it streams the file from disk; this tool takes URLs only). A pack_required response means the allowance is exhausted: NOTHING was purchased \u2014 present the pack price (1 credit = $100) and let the user buy from the hub if they want it. 'remove' {sourceId} \u2014 deletes the source AND its indexed content; explicit approval required.",
41539
+ description: "The knowledge base's content sources. action 'list' \u2014 ONE page of sources, most recently ingested first (default 50, max 200 via limit): read `page.has_more`/`next_cursor` and pass cursor to continue \u2014 a page is never the whole library. 'summary' \u2014 exact whole-library counts {total, by_kind, chunks, indexed_chunks, failed_sources, failed_jobs_7d}: use THIS to say what the knowledge base contains, and if failed_jobs_7d > 0 say so \u2014 those ingests are missing from every other count. 'jobs' \u2014 ingest job statuses (optional status filter: queued|running|succeeded|failed). 'add' \u2014 ingest a public page {url} or a whole site {sitemap, since?}; ALWAYS get explicit approval first (ingest costs money and counts against quota), for a local FILE on the user's machine use awesomate_knowledge_upload instead (it streams the file from disk; this tool takes URLs only). A pack_required response means the allowance is exhausted: NOTHING was purchased \u2014 present the pack price (1 credit = $100) and let the user buy from the hub if they want it. 'remove' {sourceId} \u2014 deletes the source AND its indexed content; explicit approval required.",
41539
41540
  inputSchema: {
41540
41541
  action: external_exports.enum(["list", "summary", "add", "remove", "jobs"]),
41541
41542
  url: external_exports.string().url().optional().describe("add: one public page / blog post / YouTube link"),
@@ -41943,7 +41944,7 @@ var KB_UNPARSEABLE = /* @__PURE__ */ new Set([".doc", ".docx", ".ppt", ".pptx",
41943
41944
  server.registerTool(
41944
41945
  "awesomate_knowledge_upload",
41945
41946
  {
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.",
41947
+ 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 with its live status; poll awesomate_knowledge_sources {action:'jobs'} until it succeeds (a duplicate upload replays the earlier job \u2014 a response already reading succeeded needs no polling), 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.",
41947
41948
  inputSchema: {
41948
41949
  path: external_exports.string().min(1).max(4096).describe("Path to the file on the user's machine (~ is expanded)"),
41949
41950
  title: external_exports.string().max(300).optional().describe("Display title; defaults to the filename")
@@ -41994,10 +41995,14 @@ server.registerTool(
41994
41995
  filename,
41995
41996
  contentType
41996
41997
  });
41998
+ const body = result;
41999
+ const jobStatus = typeof body.status === "string" ? body.status : "queued";
42000
+ const replayNote = body.replayed === true ? "This file matched an earlier upload, so the platform replayed that job instead of ingesting it twice. " : "";
42001
+ const note = jobStatus === "succeeded" ? `${replayNote}Already ingested \u2014 the job has SUCCEEDED, do not poll for it. Verify with awesomate_knowledge_ask before building on it.` : jobStatus === "failed" || jobStatus === "cancelled" ? `${replayNote}The job reports ${jobStatus} \u2014 read its error via awesomate_knowledge_sources {action:"jobs"}. A job that fails during processing creates no source row, so summary counts stay clean (only failed_jobs_7d shows it).` : `${replayNote}${jobStatus === "running" ? "Ingesting now" : "Queued"} \u2014 NOT yet ingested. Poll awesomate_knowledge_sources {action:"jobs"} and read the job's status AND error: a job that fails during processing creates no source row, so summary counts stay clean (only its failed_jobs_7d field shows it). Big media is transcribed and can take a while. Only after the job reports succeeded, verify with awesomate_knowledge_ask before building on it.`;
41997
42002
  return knowledgeResult({
41998
- ...result,
42003
+ ...body,
41999
42004
  uploaded: { path: abs, filename, sizeBytes: st.size, contentType },
42000
- note: `Queued \u2014 NOT yet ingested. Poll awesomate_knowledge_sources {action:"jobs"} and read the job's status AND error: a job that fails during processing creates no source row, so summary/failed_sources still look clean and the failure is invisible there. Big media is transcribed and can take a while. Only after the job reports succeeded, verify with awesomate_knowledge_ask before building on it.`
42005
+ note
42001
42006
  });
42002
42007
  } catch (err) {
42003
42008
  return knowledgeError(err);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awesomate/hosting-mcp",
3
- "version": "0.20.2",
3
+ "version": "0.20.4",
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,11 @@
1
1
  {
2
2
  "versions": [
3
+ {
4
+ "version": "0.20.3",
5
+ "highlights": [
6
+ "The Knowledge Base summary now warns when recent uploads failed to ingest - failures used to be invisible unless you checked the jobs list"
7
+ ]
8
+ },
3
9
  {
4
10
  "version": "0.20.2",
5
11
  "highlights": [
@@ -51,8 +51,10 @@ contents never pass through the conversation and a 100 MB PDF costs no context.
51
51
  processing never creates a source row, so `{action:'summary'}` still reports
52
52
  `failed_sources: 0` and the library total is unchanged. Measured live on
53
53
  2026-09-01: an upload failed with a platform error while summary read
54
- `total: 75, failed_sources: 0`. If you check the summary instead of the job,
55
- a failed ingest looks exactly like one that was never attempted.
54
+ `total: 75, failed_sources: 0`. On current platforms the summary now carries
55
+ `failed_jobs_7d` + `last_failed_job_at` for exactly this reason a nonzero
56
+ value means uploads failed that no other count shows; the field is absent on
57
+ older platforms, so its absence proves nothing.
56
58
 
57
59
  So: read the job's `status` AND its `error`, and relay the error text to the
58
60
  user. Real ones seen in the wild, all platform-side rather than anything wrong