mcp-scraper 0.66.0 → 0.66.1

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.
Files changed (88) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +2 -2
  3. package/dist/{analytics-repository-IKE53S3E.js → analytics-repository-RUXBFSFX.js} +1 -2
  4. package/dist/bin/api-server.cjs +1648 -17
  5. package/dist/bin/api-server.js +4 -5
  6. package/dist/bin/mcp-scraper-cli.cjs +1 -2
  7. package/dist/bin/mcp-scraper-cli.js +6 -7
  8. package/dist/bin/mcp-scraper-install.cjs +7 -3
  9. package/dist/bin/mcp-scraper-install.js +2 -3
  10. package/dist/bin/mcp-stdio-server.cjs +1618 -14
  11. package/dist/bin/mcp-stdio-server.js +11 -12
  12. package/dist/bin/paa-harvest.cjs +0 -1
  13. package/dist/bin/paa-harvest.js +4 -5
  14. package/dist/{chunk-5PIO7QBG.js → chunk-3PIXKLGZ.js} +3 -4
  15. package/dist/{chunk-VIWT35S6.js → chunk-4OT7BAIE.js} +1 -2
  16. package/dist/{chunk-AJ4YGHG2.js → chunk-4P3PHFPQ.js} +3 -4
  17. package/dist/{chunk-P7YFUNKR.js → chunk-75VW7CWE.js} +3 -4
  18. package/dist/{chunk-FG6LJGJ7.js → chunk-77LQV73B.js} +0 -1
  19. package/dist/{chunk-DKIG2TEE.js → chunk-AQKJOSIB.js} +2 -3
  20. package/dist/{chunk-2XUXVKT4.js → chunk-AYJHI2FK.js} +0 -1
  21. package/dist/{chunk-5BEPOFKG.js → chunk-CNLLTD5B.js} +0 -1
  22. package/dist/{chunk-EKJ65E3Z.js → chunk-DNM65UCK.js} +0 -1
  23. package/dist/{chunk-SRRI2HJL.js → chunk-E4LMY5OJ.js} +1617 -19
  24. package/dist/{chunk-3YSEJTMC.js → chunk-GGZEC22A.js} +0 -1
  25. package/dist/{chunk-4VG3NUUY.js → chunk-GTGSD4YS.js} +2 -2
  26. package/dist/{chunk-XPFRP5QT.js → chunk-KBTUPRTF.js} +3 -4
  27. package/dist/{chunk-AAGVOPP5.js → chunk-NS754CRS.js} +2 -3
  28. package/dist/{chunk-BIUQ6O2Y.js → chunk-OZJMVCDK.js} +0 -1
  29. package/dist/{chunk-X7UG2JCF.js → chunk-PGJQDMC2.js} +1 -2
  30. package/dist/{chunk-G3P3ZDB4.js → chunk-RJ7JVYKU.js} +0 -1
  31. package/dist/{chunk-N54JS5WP.js → chunk-TNJIPV74.js} +1 -2
  32. package/dist/{chunk-4LINSJNI.js → chunk-TNLGHNLX.js} +1 -2
  33. package/dist/chunk-VRJ7CO6L.js +6 -0
  34. package/dist/{chunk-WD73OFL3.js → chunk-VXLU74YZ.js} +1 -2
  35. package/dist/{chunk-DCWXVAQT.js → chunk-WID3MFRS.js} +6 -2
  36. package/dist/{db-BRI465XQ.js → db-PO7N7ZP3.js} +1 -2
  37. package/dist/{extract-bundle-QAI7JYV2.js → extract-bundle-SIBFUA6I.js} +8 -9
  38. package/dist/index.cjs +0 -1
  39. package/dist/index.js +4 -5
  40. package/dist/{lead-list-enrichment-repository-ODWGRVCQ.js → lead-list-enrichment-repository-OTAUQONJ.js} +2 -3
  41. package/dist/{location-data-repository-67MMEVZQ.js → location-data-repository-RM2KJ3H5.js} +3 -4
  42. package/dist/{server-MTKWBSAR.js → server-ELEJNRRE.js} +57 -35
  43. package/dist/{site-extract-repository-J3RH3MOS.js → site-extract-repository-ASYEJO7Z.js} +4 -5
  44. package/dist/{worker-K7MPPQ7I.js → worker-MAVYYWM7.js} +8 -9
  45. package/package.json +3 -1
  46. package/dist/analytics-repository-IKE53S3E.js.map +0 -1
  47. package/dist/bin/api-server.cjs.map +0 -1
  48. package/dist/bin/api-server.js.map +0 -1
  49. package/dist/bin/mcp-scraper-cli.cjs.map +0 -1
  50. package/dist/bin/mcp-scraper-cli.js.map +0 -1
  51. package/dist/bin/mcp-scraper-install.cjs.map +0 -1
  52. package/dist/bin/mcp-scraper-install.js.map +0 -1
  53. package/dist/bin/mcp-stdio-server.cjs.map +0 -1
  54. package/dist/bin/mcp-stdio-server.js.map +0 -1
  55. package/dist/bin/paa-harvest.cjs.map +0 -1
  56. package/dist/bin/paa-harvest.js.map +0 -1
  57. package/dist/chunk-2XUXVKT4.js.map +0 -1
  58. package/dist/chunk-3YSEJTMC.js.map +0 -1
  59. package/dist/chunk-4LINSJNI.js.map +0 -1
  60. package/dist/chunk-4VG3NUUY.js.map +0 -1
  61. package/dist/chunk-5BEPOFKG.js.map +0 -1
  62. package/dist/chunk-5PIO7QBG.js.map +0 -1
  63. package/dist/chunk-AAGVOPP5.js.map +0 -1
  64. package/dist/chunk-AJ4YGHG2.js.map +0 -1
  65. package/dist/chunk-BIUQ6O2Y.js.map +0 -1
  66. package/dist/chunk-DCWXVAQT.js.map +0 -1
  67. package/dist/chunk-DKIG2TEE.js.map +0 -1
  68. package/dist/chunk-EKJ65E3Z.js.map +0 -1
  69. package/dist/chunk-FG6LJGJ7.js.map +0 -1
  70. package/dist/chunk-G3P3ZDB4.js.map +0 -1
  71. package/dist/chunk-HDYOVGC6.js +0 -7
  72. package/dist/chunk-HDYOVGC6.js.map +0 -1
  73. package/dist/chunk-N54JS5WP.js.map +0 -1
  74. package/dist/chunk-P7YFUNKR.js.map +0 -1
  75. package/dist/chunk-SRRI2HJL.js.map +0 -1
  76. package/dist/chunk-VIWT35S6.js.map +0 -1
  77. package/dist/chunk-WD73OFL3.js.map +0 -1
  78. package/dist/chunk-X7UG2JCF.js.map +0 -1
  79. package/dist/chunk-XPFRP5QT.js.map +0 -1
  80. package/dist/db-BRI465XQ.js.map +0 -1
  81. package/dist/extract-bundle-QAI7JYV2.js.map +0 -1
  82. package/dist/index.cjs.map +0 -1
  83. package/dist/index.js.map +0 -1
  84. package/dist/lead-list-enrichment-repository-ODWGRVCQ.js.map +0 -1
  85. package/dist/location-data-repository-67MMEVZQ.js.map +0 -1
  86. package/dist/server-MTKWBSAR.js.map +0 -1
  87. package/dist/site-extract-repository-J3RH3MOS.js.map +0 -1
  88. package/dist/worker-K7MPPQ7I.js.map +0 -1
@@ -35,7 +35,7 @@ var import_node_crypto = require("crypto");
35
35
 
36
36
  // src/harvest-timeout.ts
37
37
  var SCRAPE_FUNCTION_MAX_MS = 8e5;
38
- var DEFAULT_TOOL_CLIENT_TIMEOUT_MS = 3e5;
38
+ var DEFAULT_TOOL_CLIENT_TIMEOUT_MS = 59e4;
39
39
  var CLIENT_OVER_SERVER_MARGIN_MS = 15e3;
40
40
  function harvestTimeoutBudget(maxQuestions, serpOnly = false) {
41
41
  const requested = Number.isFinite(maxQuestions) && maxQuestions > 0 ? Math.trunc(maxQuestions) : 30;
@@ -213,8 +213,9 @@ function publicErrorMessage(code) {
213
213
  case "proxy_unavailable":
214
214
  return "The web request could not establish a working connection. Please retry later.";
215
215
  case "harvest_timeout":
216
- case "mcp_request_timeout":
217
216
  return "The request timed out before it completed. Please retry with a smaller request.";
217
+ case "mcp_request_timeout":
218
+ return "The MCP caller stopped waiting before a final response arrived. Durable work may still be running; continue with the returned Task or job handle instead of restarting it.";
218
219
  case "concurrency_limit_exceeded":
219
220
  return "The service is available, but this account has reached its parallel-operation limit. Wait for an active operation to finish or add capacity.";
220
221
  case "unauthorized":
@@ -515,7 +516,7 @@ var HttpMcpToolExecutor = class {
515
516
  retryable: true,
516
517
  path,
517
518
  timeoutMs,
518
- message: `MCP Scraper request exceeded ${Math.round(timeoutMs / 1e3)}s and was cancelled client-side. The operation may still be running or may have already completed and been billed on our side. Retry with fewer results or use the async API for deep harvests. ${timeoutGuidance}`
519
+ message: `MCP Scraper stopped waiting after ${Math.round(timeoutMs / 1e3)}s. This does not prove server-side work stopped: the operation may still be running or may have already completed and been billed. Prefer the returned Task or job handle for long work. ${timeoutGuidance}`
519
520
  })
520
521
  }],
521
522
  isError: true
@@ -601,6 +602,13 @@ var HttpMcpToolExecutor = class {
601
602
  const headers = input.idempotencyKey ? { "Idempotency-Key": input.idempotencyKey } : {};
602
603
  return this.call("/harvest/sync", input, timeoutMs, "POST", headers, true);
603
604
  }
605
+ startHarvestPaa(input) {
606
+ const headers = input.idempotencyKey ? { "Idempotency-Key": input.idempotencyKey } : {};
607
+ return this.call("/harvest", input, this.timeoutMs, "POST", headers, true);
608
+ }
609
+ harvestPaaStatus(input) {
610
+ return this.getJson(`/jobs/${encodeURIComponent(input.jobId)}`);
611
+ }
604
612
  searchSerp(input) {
605
613
  const timeoutMs = this.httpTimeoutOverrideMs ?? harvestTimeoutBudget(0, true).clientMs;
606
614
  const headers = input.idempotencyKey ? { "Idempotency-Key": input.idempotencyKey } : {};
@@ -1222,7 +1230,7 @@ render();
1222
1230
  }
1223
1231
 
1224
1232
  // src/version.ts
1225
- var PACKAGE_VERSION = "0.66.0";
1233
+ var PACKAGE_VERSION = "0.66.1";
1226
1234
 
1227
1235
  // src/mcp/input-field-descriptions.ts
1228
1236
  var import_zod = require("zod");
@@ -13043,7 +13051,7 @@ function decodeTaskHandle(taskId, secret, ownerId) {
13043
13051
  decipher.update(ciphertext),
13044
13052
  decipher.final()
13045
13053
  ]).toString("utf8"));
13046
- if (parsed.v !== 1 || parsed.ownerId !== ownerId || !["site_export", "directory_workflow", "video_frame_analysis", "lead_list_enrichment"].includes(String(parsed.kind)) || typeof parsed.operationId !== "string" || !parsed.operationId || typeof parsed.createdAtMs !== "number" || typeof parsed.expiresAtMs !== "number") throw new Error("invalid payload");
13054
+ if (parsed.v !== 1 || parsed.ownerId !== ownerId || !["paa_harvest", "site_export", "directory_workflow", "video_frame_analysis", "lead_list_enrichment"].includes(String(parsed.kind)) || typeof parsed.operationId !== "string" || !parsed.operationId || typeof parsed.createdAtMs !== "number" || typeof parsed.expiresAtMs !== "number") throw new Error("invalid payload");
13047
13055
  if (Date.now() > parsed.expiresAtMs) {
13048
13056
  throw new import_server2.ProtocolError(TASK_INVALID_PARAMS, "Failed to retrieve task: Task has expired");
13049
13057
  }
@@ -13056,9 +13064,25 @@ function decodeTaskHandle(taskId, secret, ownerId) {
13056
13064
  function objectValue(value) {
13057
13065
  return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
13058
13066
  }
13059
- function taskSeed(kind, result) {
13067
+ function resultValue(result) {
13060
13068
  const structured = objectValue(result.structuredContent);
13069
+ if (structured) return structured;
13070
+ const block = result.content.find((item) => item.type === "text");
13071
+ if (!block || block.type !== "text") return void 0;
13072
+ try {
13073
+ return objectValue(JSON.parse(block.text));
13074
+ } catch {
13075
+ return void 0;
13076
+ }
13077
+ }
13078
+ function taskSeed(kind, result) {
13079
+ const structured = resultValue(result);
13061
13080
  if (!structured || result.isError === true) return void 0;
13081
+ if (kind === "paa_harvest") {
13082
+ const operationId2 = structured.job_id ?? structured.jobId;
13083
+ if (typeof operationId2 !== "string" || !["pending", "running"].includes(String(structured.status))) return void 0;
13084
+ return { kind, operationId: operationId2, statusMessage: "PAA harvest started. Progress will be preserved while the client polls this Task." };
13085
+ }
13062
13086
  if (kind === "site_export") {
13063
13087
  const operationId2 = structured.jobId;
13064
13088
  if (typeof operationId2 !== "string" || structured.status !== "pending") return void 0;
@@ -13089,10 +13113,13 @@ function taskBase(payload, taskId) {
13089
13113
  };
13090
13114
  }
13091
13115
  function statusFrom(result) {
13092
- const status = objectValue(result.structuredContent)?.status;
13116
+ const status = resultValue(result)?.status;
13093
13117
  return typeof status === "string" ? status : void 0;
13094
13118
  }
13095
13119
  async function pollTask(executor, payload) {
13120
+ if (payload.kind === "paa_harvest") {
13121
+ return executor.harvestPaaStatus({ jobId: payload.operationId });
13122
+ }
13096
13123
  if (payload.kind === "site_export") {
13097
13124
  return executor.checkSiteExport({ jobId: payload.operationId });
13098
13125
  }
@@ -13104,6 +13131,30 @@ async function pollTask(executor, payload) {
13104
13131
  }
13105
13132
  return executor.videoFrameAnalysisStatus({ runId: payload.operationId });
13106
13133
  }
13134
+ function taskProgressMessage(kind, result, status) {
13135
+ const value = resultValue(result) ?? {};
13136
+ if (kind === "paa_harvest") {
13137
+ const resultRecord = objectValue(value.result) ?? {};
13138
+ const progress = objectValue(resultRecord.progress) ?? {};
13139
+ const records = Array.isArray(progress.records) ? progress.records.length : 0;
13140
+ const attempts = Array.isArray(value.attempts) ? value.attempts.length : 0;
13141
+ const pieces = [records > 0 ? `${records} questions preserved` : null, attempts > 0 ? `${attempts} attempts recorded` : null].filter(Boolean);
13142
+ return pieces.length > 0 ? `PAA harvest is ${status ?? "running"}: ${pieces.join(", ")}.` : `PAA harvest is ${status ?? "running"}; no question checkpoint has been persisted yet.`;
13143
+ }
13144
+ if (kind === "lead_list_enrichment") {
13145
+ const progress = objectValue(value.progress) ?? {};
13146
+ const completed = typeof progress.completedRows === "number" ? progress.completedRows : null;
13147
+ const total = typeof progress.totalRows === "number" ? progress.totalRows : null;
13148
+ if (completed !== null && total !== null) return `Lead list enrichment is ${status ?? "running"}: ${completed}/${total} rows completed.`;
13149
+ }
13150
+ if (kind === "directory_workflow") {
13151
+ const progress = objectValue(value.progress) ?? {};
13152
+ const completed = typeof progress.completedCities === "number" ? progress.completedCities : null;
13153
+ const total = typeof progress.totalCities === "number" ? progress.totalCities : null;
13154
+ if (completed !== null && total !== null) return `Directory workflow is ${status ?? "running"}: ${completed}/${total} markets completed.`;
13155
+ }
13156
+ return status ? `Underlying operation status: ${status}.` : "Underlying operation is running.";
13157
+ }
13107
13158
  async function cancelTask(executor, payload) {
13108
13159
  if (payload.kind !== "lead_list_enrichment") return;
13109
13160
  const result = await executor.leadListEnrichCancel({ jobId: payload.operationId });
@@ -13120,7 +13171,7 @@ async function detailedTask(executor, taskId, options) {
13120
13171
  return {
13121
13172
  ...base,
13122
13173
  status: "working",
13123
- statusMessage: status ? `Underlying operation status: ${status}.` : "Underlying operation is running."
13174
+ statusMessage: taskProgressMessage(payload.kind, result, status)
13124
13175
  };
13125
13176
  }
13126
13177
  if (payload.kind === "lead_list_enrichment" && status === "failed") {
@@ -13131,6 +13182,22 @@ async function detailedTask(executor, taskId, options) {
13131
13182
  result
13132
13183
  };
13133
13184
  }
13185
+ if (payload.kind === "paa_harvest" && status === "failed") {
13186
+ return {
13187
+ ...base,
13188
+ status: "failed",
13189
+ statusMessage: "PAA harvest failed; persisted attempts and billing state are included in the result.",
13190
+ result
13191
+ };
13192
+ }
13193
+ if (payload.kind === "paa_harvest" && status === "cancelled") {
13194
+ return {
13195
+ ...base,
13196
+ status: "cancelled",
13197
+ statusMessage: "PAA harvest was cancelled.",
13198
+ result
13199
+ };
13200
+ }
13134
13201
  if (payload.kind === "lead_list_enrichment" && status === "cancelled") {
13135
13202
  return {
13136
13203
  ...base,
@@ -13147,6 +13214,7 @@ async function detailedTask(executor, taskId, options) {
13147
13214
  };
13148
13215
  }
13149
13216
  function isWorking(kind, status) {
13217
+ if (kind === "paa_harvest") return status === "pending" || status === "running";
13150
13218
  if (kind === "site_export") return status === "pending" || status === "running";
13151
13219
  if (kind === "directory_workflow") return status === "queued" || status === "running";
13152
13220
  if (kind === "lead_list_enrichment") return status === "queued" || status === "running";
@@ -13178,6 +13246,9 @@ function registerMcpTasksExtension(server, executor, options) {
13178
13246
  return {};
13179
13247
  });
13180
13248
  return {
13249
+ supportsTasks() {
13250
+ return hasTasksCapability(server.server.getClientCapabilities());
13251
+ },
13181
13252
  taskify(kind, result) {
13182
13253
  if (!hasTasksCapability(server.server.getClientCapabilities())) return result;
13183
13254
  const seed = taskSeed(kind, result);
@@ -13635,7 +13706,12 @@ function registerPaaExtractorMcpTools(server, executor, options = {}) {
13635
13706
  inputSchema: harvestPaaInputSchema,
13636
13707
  outputSchema: recordOutputSchema("harvest_paa", HarvestPaaOutputSchema),
13637
13708
  annotations: liveWebToolAnnotations("Google PAA + SERP Harvest")
13638
- }, async (input) => formatHarvestPaa(await executor.harvestPaa(input), input));
13709
+ }, async (input, requestContext) => {
13710
+ if (tasks.supportsTasks()) {
13711
+ return tasks.taskify("paa_harvest", await executor.startHarvestPaa(input), requestContext);
13712
+ }
13713
+ return formatHarvestPaa(await executor.harvestPaa(input), input);
13714
+ });
13639
13715
  server.registerTool("search_serp", {
13640
13716
  title: "Google SERP Lookup",
13641
13717
  description: `Google SERP lookup without PAA expansion. Defaults to organic rankings and Google entity IDs; request local pack, forums, videos, AI surfaces, and What People Are Saying with individual include flags or includeAllSerpFeatures at the same product price. Use gl for country and location only when city or regional context matters. Costs ${SERP_SEARCH_CREDITS} Credits per search. Call credits_info for current pricing and balance.`,
@@ -14453,8 +14529,1532 @@ function registerPaaExtractorMcpTools(server, executor, options = {}) {
14453
14529
  // src/mcp/memory-mcp-server.ts
14454
14530
  var import_server4 = require("@modelcontextprotocol/server");
14455
14531
 
14456
- // src/mcp/memory-tool-registry.ts
14457
- var import_image_assets = require("mcpscraper-memory-tools/tools/assets/image-assets");
14532
+ // src/mcp/memory-image-tool-schemas.generated.ts
14533
+ var MEMORY_IMAGE_TOOL_SCHEMAS = [
14534
+ {
14535
+ "id": "image_project_create",
14536
+ "upstreamName": "image_project_create",
14537
+ "description": "Create a stable image project inside a writable hosted Memory vault. Projects organize governed private image assets; they do not create local folders or change object keys.",
14538
+ "inputJsonSchema": {
14539
+ "type": "object",
14540
+ "properties": {
14541
+ "vault": {
14542
+ "type": "string",
14543
+ "description": "Writable logical Memory vault. Defaults to the active vault."
14544
+ },
14545
+ "name": {
14546
+ "type": "string",
14547
+ "minLength": 1,
14548
+ "maxLength": 120
14549
+ },
14550
+ "description": {
14551
+ "type": "string",
14552
+ "maxLength": 2e3
14553
+ }
14554
+ },
14555
+ "required": [
14556
+ "name"
14557
+ ],
14558
+ "additionalProperties": false,
14559
+ "$schema": "http://json-schema.org/draft-07/schema#"
14560
+ },
14561
+ "outputJsonSchema": {
14562
+ "type": "object",
14563
+ "properties": {
14564
+ "ok": {
14565
+ "type": "boolean",
14566
+ "enum": [
14567
+ true,
14568
+ false
14569
+ ]
14570
+ },
14571
+ "project": {
14572
+ "type": "object",
14573
+ "properties": {
14574
+ "id": {
14575
+ "type": "string"
14576
+ },
14577
+ "name": {
14578
+ "type": "string"
14579
+ },
14580
+ "description": {
14581
+ "type": [
14582
+ "string",
14583
+ "null"
14584
+ ]
14585
+ },
14586
+ "createdAt": {
14587
+ "type": "string"
14588
+ }
14589
+ },
14590
+ "required": [
14591
+ "id",
14592
+ "name",
14593
+ "description",
14594
+ "createdAt"
14595
+ ],
14596
+ "additionalProperties": false
14597
+ },
14598
+ "code": {
14599
+ "type": "string"
14600
+ },
14601
+ "error": {
14602
+ "type": "string"
14603
+ }
14604
+ },
14605
+ "required": [
14606
+ "ok"
14607
+ ],
14608
+ "additionalProperties": false,
14609
+ "$schema": "http://json-schema.org/draft-07/schema#"
14610
+ },
14611
+ "annotations": {
14612
+ "title": "Create Image Project",
14613
+ "readOnlyHint": false,
14614
+ "destructiveHint": false,
14615
+ "idempotentHint": false,
14616
+ "openWorldHint": false
14617
+ }
14618
+ },
14619
+ {
14620
+ "id": "image_project_list",
14621
+ "upstreamName": "image_project_list",
14622
+ "description": "List image projects in an accessible hosted Memory vault. Returns organization metadata only, never object-store keys.",
14623
+ "inputJsonSchema": {
14624
+ "type": "object",
14625
+ "properties": {
14626
+ "vault": {
14627
+ "type": "string"
14628
+ }
14629
+ },
14630
+ "additionalProperties": false,
14631
+ "$schema": "http://json-schema.org/draft-07/schema#"
14632
+ },
14633
+ "outputJsonSchema": {
14634
+ "type": "object",
14635
+ "properties": {
14636
+ "ok": {
14637
+ "type": "boolean",
14638
+ "enum": [
14639
+ true,
14640
+ false
14641
+ ]
14642
+ },
14643
+ "projects": {
14644
+ "type": "array",
14645
+ "items": {
14646
+ "type": "object",
14647
+ "properties": {
14648
+ "id": {
14649
+ "type": "string"
14650
+ },
14651
+ "name": {
14652
+ "type": "string"
14653
+ },
14654
+ "description": {
14655
+ "type": [
14656
+ "string",
14657
+ "null"
14658
+ ]
14659
+ },
14660
+ "status": {
14661
+ "type": "string"
14662
+ },
14663
+ "createdAt": {
14664
+ "type": "string"
14665
+ },
14666
+ "updatedAt": {
14667
+ "type": "string"
14668
+ }
14669
+ },
14670
+ "required": [
14671
+ "id",
14672
+ "name",
14673
+ "description",
14674
+ "status",
14675
+ "createdAt",
14676
+ "updatedAt"
14677
+ ],
14678
+ "additionalProperties": false
14679
+ }
14680
+ },
14681
+ "code": {
14682
+ "type": "string"
14683
+ },
14684
+ "error": {
14685
+ "type": "string"
14686
+ }
14687
+ },
14688
+ "required": [
14689
+ "ok"
14690
+ ],
14691
+ "additionalProperties": false,
14692
+ "$schema": "http://json-schema.org/draft-07/schema#"
14693
+ },
14694
+ "annotations": {
14695
+ "title": "List Image Projects",
14696
+ "readOnlyHint": true,
14697
+ "destructiveHint": false,
14698
+ "idempotentHint": true,
14699
+ "openWorldHint": false
14700
+ }
14701
+ },
14702
+ {
14703
+ "id": "image_folder_create",
14704
+ "upstreamName": "image_folder_create",
14705
+ "description": "Create a nested image folder inside one writable Memory image project. Maximum nesting depth is eight; this changes logical organization only.",
14706
+ "inputJsonSchema": {
14707
+ "type": "object",
14708
+ "properties": {
14709
+ "vault": {
14710
+ "type": "string"
14711
+ },
14712
+ "projectId": {
14713
+ "type": "string",
14714
+ "minLength": 1
14715
+ },
14716
+ "parentId": {
14717
+ "type": "string",
14718
+ "minLength": 1
14719
+ },
14720
+ "name": {
14721
+ "type": "string",
14722
+ "minLength": 1,
14723
+ "maxLength": 120
14724
+ }
14725
+ },
14726
+ "required": [
14727
+ "projectId",
14728
+ "name"
14729
+ ],
14730
+ "additionalProperties": false,
14731
+ "$schema": "http://json-schema.org/draft-07/schema#"
14732
+ },
14733
+ "outputJsonSchema": {
14734
+ "type": "object",
14735
+ "properties": {
14736
+ "ok": {
14737
+ "type": "boolean",
14738
+ "enum": [
14739
+ true,
14740
+ false
14741
+ ]
14742
+ },
14743
+ "folder": {
14744
+ "type": "object",
14745
+ "properties": {
14746
+ "id": {
14747
+ "type": "string"
14748
+ },
14749
+ "projectId": {
14750
+ "type": "string"
14751
+ },
14752
+ "parentId": {
14753
+ "type": [
14754
+ "string",
14755
+ "null"
14756
+ ]
14757
+ },
14758
+ "name": {
14759
+ "type": "string"
14760
+ },
14761
+ "depth": {
14762
+ "type": "number"
14763
+ },
14764
+ "createdAt": {
14765
+ "type": "string"
14766
+ }
14767
+ },
14768
+ "required": [
14769
+ "id",
14770
+ "projectId",
14771
+ "parentId",
14772
+ "name",
14773
+ "depth",
14774
+ "createdAt"
14775
+ ],
14776
+ "additionalProperties": false
14777
+ },
14778
+ "code": {
14779
+ "type": "string"
14780
+ },
14781
+ "error": {
14782
+ "type": "string"
14783
+ }
14784
+ },
14785
+ "required": [
14786
+ "ok"
14787
+ ],
14788
+ "additionalProperties": false,
14789
+ "$schema": "http://json-schema.org/draft-07/schema#"
14790
+ },
14791
+ "annotations": {
14792
+ "title": "Create Image Folder",
14793
+ "readOnlyHint": false,
14794
+ "destructiveHint": false,
14795
+ "idempotentHint": false,
14796
+ "openWorldHint": false
14797
+ }
14798
+ },
14799
+ {
14800
+ "id": "image_folder_list",
14801
+ "upstreamName": "image_folder_list",
14802
+ "description": "List the bounded folder tree for one accessible Memory image project.",
14803
+ "inputJsonSchema": {
14804
+ "type": "object",
14805
+ "properties": {
14806
+ "vault": {
14807
+ "type": "string"
14808
+ },
14809
+ "projectId": {
14810
+ "type": "string",
14811
+ "minLength": 1
14812
+ }
14813
+ },
14814
+ "required": [
14815
+ "projectId"
14816
+ ],
14817
+ "additionalProperties": false,
14818
+ "$schema": "http://json-schema.org/draft-07/schema#"
14819
+ },
14820
+ "outputJsonSchema": {
14821
+ "type": "object",
14822
+ "properties": {
14823
+ "ok": {
14824
+ "type": "boolean",
14825
+ "enum": [
14826
+ true,
14827
+ false
14828
+ ]
14829
+ },
14830
+ "folders": {
14831
+ "type": "array",
14832
+ "items": {
14833
+ "type": "object",
14834
+ "properties": {
14835
+ "id": {
14836
+ "type": "string"
14837
+ },
14838
+ "projectId": {
14839
+ "type": "string"
14840
+ },
14841
+ "parentId": {
14842
+ "type": [
14843
+ "string",
14844
+ "null"
14845
+ ]
14846
+ },
14847
+ "name": {
14848
+ "type": "string"
14849
+ },
14850
+ "depth": {
14851
+ "type": "number"
14852
+ },
14853
+ "createdAt": {
14854
+ "type": "string"
14855
+ },
14856
+ "updatedAt": {
14857
+ "type": "string"
14858
+ }
14859
+ },
14860
+ "required": [
14861
+ "id",
14862
+ "projectId",
14863
+ "parentId",
14864
+ "name",
14865
+ "depth",
14866
+ "createdAt",
14867
+ "updatedAt"
14868
+ ],
14869
+ "additionalProperties": false
14870
+ }
14871
+ },
14872
+ "code": {
14873
+ "type": "string"
14874
+ },
14875
+ "error": {
14876
+ "type": "string"
14877
+ }
14878
+ },
14879
+ "required": [
14880
+ "ok"
14881
+ ],
14882
+ "additionalProperties": false,
14883
+ "$schema": "http://json-schema.org/draft-07/schema#"
14884
+ },
14885
+ "annotations": {
14886
+ "title": "List Image Folders",
14887
+ "readOnlyHint": true,
14888
+ "destructiveHint": false,
14889
+ "idempotentHint": true,
14890
+ "openWorldHint": false
14891
+ }
14892
+ },
14893
+ {
14894
+ "id": "image_asset_save",
14895
+ "upstreamName": "image_asset_save",
14896
+ "description": "Opt in to preserving one image in hosted Memory. Saves immutable private bytes, creates a sanitized preview, consumes storage/embedding quota, and queues visual plus useful fused embeddings. Use for durable image recall; do not use merely to view a transient scrape result.",
14897
+ "inputJsonSchema": {
14898
+ "type": "object",
14899
+ "properties": {
14900
+ "vault": {
14901
+ "type": "string"
14902
+ },
14903
+ "projectId": {
14904
+ "type": "string",
14905
+ "minLength": 1
14906
+ },
14907
+ "folderId": {
14908
+ "type": "string",
14909
+ "minLength": 1
14910
+ },
14911
+ "sourceUrl": {
14912
+ "type": "string",
14913
+ "format": "uri",
14914
+ "description": "Public HTTPS image URL. Private-network and redirect targets are rejected."
14915
+ },
14916
+ "artifactId": {
14917
+ "type": "string",
14918
+ "minLength": 1,
14919
+ "description": "Owned MCP Scraper artifact ID. Available through the aggregate MCP handoff."
14920
+ },
14921
+ "imageBase64": {
14922
+ "type": "string",
14923
+ "minLength": 1,
14924
+ "description": "Bounded base64 image for clients without an upload transport; maximum decoded size is 20 MiB."
14925
+ },
14926
+ "title": {
14927
+ "type": "string",
14928
+ "minLength": 1,
14929
+ "maxLength": 240
14930
+ },
14931
+ "description": {
14932
+ "type": "string",
14933
+ "maxLength": 4e3
14934
+ },
14935
+ "altText": {
14936
+ "type": "string",
14937
+ "maxLength": 2e3
14938
+ },
14939
+ "tags": {
14940
+ "type": "array",
14941
+ "items": {
14942
+ "type": "string",
14943
+ "minLength": 1,
14944
+ "maxLength": 80
14945
+ },
14946
+ "maxItems": 20
14947
+ },
14948
+ "sourceRef": {
14949
+ "type": "object",
14950
+ "additionalProperties": {
14951
+ "anyOf": [
14952
+ {
14953
+ "type": "string",
14954
+ "maxLength": 1e3
14955
+ },
14956
+ {
14957
+ "type": "number"
14958
+ },
14959
+ {
14960
+ "type": "boolean"
14961
+ },
14962
+ {
14963
+ "type": "null"
14964
+ }
14965
+ ]
14966
+ }
14967
+ },
14968
+ "idempotencyKey": {
14969
+ "type": "string",
14970
+ "minLength": 8,
14971
+ "maxLength": 200,
14972
+ "description": "Stable key for this logical save. Retrying the same request returns the same asset without another write."
14973
+ }
14974
+ },
14975
+ "required": [
14976
+ "title",
14977
+ "idempotencyKey"
14978
+ ],
14979
+ "additionalProperties": false,
14980
+ "$schema": "http://json-schema.org/draft-07/schema#"
14981
+ },
14982
+ "outputJsonSchema": {
14983
+ "type": "object",
14984
+ "properties": {
14985
+ "ok": {
14986
+ "type": "boolean",
14987
+ "enum": [
14988
+ true,
14989
+ false
14990
+ ]
14991
+ },
14992
+ "asset": {
14993
+ "type": "object",
14994
+ "properties": {
14995
+ "assetId": {
14996
+ "type": "string"
14997
+ },
14998
+ "title": {
14999
+ "type": "string"
15000
+ },
15001
+ "description": {
15002
+ "type": [
15003
+ "string",
15004
+ "null"
15005
+ ]
15006
+ },
15007
+ "altText": {
15008
+ "type": [
15009
+ "string",
15010
+ "null"
15011
+ ]
15012
+ },
15013
+ "sourceUrl": {
15014
+ "type": [
15015
+ "string",
15016
+ "null"
15017
+ ]
15018
+ },
15019
+ "sourceKind": {
15020
+ "type": "string"
15021
+ },
15022
+ "mimeType": {
15023
+ "type": "string"
15024
+ },
15025
+ "bytes": {
15026
+ "type": "number"
15027
+ },
15028
+ "width": {
15029
+ "type": "number"
15030
+ },
15031
+ "height": {
15032
+ "type": "number"
15033
+ },
15034
+ "projectId": {
15035
+ "type": [
15036
+ "string",
15037
+ "null"
15038
+ ]
15039
+ },
15040
+ "folderId": {
15041
+ "type": [
15042
+ "string",
15043
+ "null"
15044
+ ]
15045
+ },
15046
+ "tags": {
15047
+ "type": "array",
15048
+ "items": {
15049
+ "type": "string"
15050
+ }
15051
+ },
15052
+ "status": {
15053
+ "type": "string"
15054
+ },
15055
+ "embeddingStatus": {
15056
+ "type": "string"
15057
+ },
15058
+ "createdAt": {
15059
+ "type": "string"
15060
+ },
15061
+ "updatedAt": {
15062
+ "type": "string"
15063
+ },
15064
+ "preview": {
15065
+ "type": "object",
15066
+ "properties": {
15067
+ "url": {
15068
+ "type": "string",
15069
+ "format": "uri"
15070
+ },
15071
+ "expiresAt": {
15072
+ "type": "string",
15073
+ "format": "date-time"
15074
+ },
15075
+ "mimeType": {
15076
+ "type": "string",
15077
+ "const": "image/webp"
15078
+ }
15079
+ },
15080
+ "required": [
15081
+ "url",
15082
+ "expiresAt",
15083
+ "mimeType"
15084
+ ],
15085
+ "additionalProperties": false
15086
+ }
15087
+ },
15088
+ "required": [
15089
+ "assetId",
15090
+ "title",
15091
+ "description",
15092
+ "altText",
15093
+ "sourceUrl",
15094
+ "sourceKind",
15095
+ "mimeType",
15096
+ "bytes",
15097
+ "width",
15098
+ "height",
15099
+ "projectId",
15100
+ "folderId",
15101
+ "tags",
15102
+ "status",
15103
+ "embeddingStatus",
15104
+ "createdAt",
15105
+ "updatedAt"
15106
+ ],
15107
+ "additionalProperties": false
15108
+ },
15109
+ "reusedObject": {
15110
+ "type": "boolean"
15111
+ },
15112
+ "nextAction": {
15113
+ "type": "string"
15114
+ },
15115
+ "code": {
15116
+ "type": "string"
15117
+ },
15118
+ "error": {
15119
+ "type": "string"
15120
+ }
15121
+ },
15122
+ "required": [
15123
+ "ok"
15124
+ ],
15125
+ "additionalProperties": false,
15126
+ "$schema": "http://json-schema.org/draft-07/schema#"
15127
+ },
15128
+ "annotations": {
15129
+ "title": "Save Image Asset",
15130
+ "readOnlyHint": false,
15131
+ "destructiveHint": false,
15132
+ "idempotentHint": true,
15133
+ "openWorldHint": true
15134
+ }
15135
+ },
15136
+ {
15137
+ "id": "image_asset_get",
15138
+ "upstreamName": "image_asset_get",
15139
+ "description": "Read one authorized private image asset and optionally mint a five-minute preview URL. The URL is never persisted; call again after expiry.",
15140
+ "inputJsonSchema": {
15141
+ "type": "object",
15142
+ "properties": {
15143
+ "vault": {
15144
+ "type": "string"
15145
+ },
15146
+ "assetId": {
15147
+ "type": "string",
15148
+ "minLength": 1
15149
+ },
15150
+ "includePreview": {
15151
+ "type": "boolean",
15152
+ "default": true
15153
+ }
15154
+ },
15155
+ "required": [
15156
+ "assetId"
15157
+ ],
15158
+ "additionalProperties": false,
15159
+ "$schema": "http://json-schema.org/draft-07/schema#"
15160
+ },
15161
+ "outputJsonSchema": {
15162
+ "type": "object",
15163
+ "properties": {
15164
+ "ok": {
15165
+ "type": "boolean",
15166
+ "enum": [
15167
+ true,
15168
+ false
15169
+ ]
15170
+ },
15171
+ "asset": {
15172
+ "type": "object",
15173
+ "properties": {
15174
+ "assetId": {
15175
+ "type": "string"
15176
+ },
15177
+ "title": {
15178
+ "type": "string"
15179
+ },
15180
+ "description": {
15181
+ "type": [
15182
+ "string",
15183
+ "null"
15184
+ ]
15185
+ },
15186
+ "altText": {
15187
+ "type": [
15188
+ "string",
15189
+ "null"
15190
+ ]
15191
+ },
15192
+ "sourceUrl": {
15193
+ "type": [
15194
+ "string",
15195
+ "null"
15196
+ ]
15197
+ },
15198
+ "sourceKind": {
15199
+ "type": "string"
15200
+ },
15201
+ "mimeType": {
15202
+ "type": "string"
15203
+ },
15204
+ "bytes": {
15205
+ "type": "number"
15206
+ },
15207
+ "width": {
15208
+ "type": "number"
15209
+ },
15210
+ "height": {
15211
+ "type": "number"
15212
+ },
15213
+ "projectId": {
15214
+ "type": [
15215
+ "string",
15216
+ "null"
15217
+ ]
15218
+ },
15219
+ "folderId": {
15220
+ "type": [
15221
+ "string",
15222
+ "null"
15223
+ ]
15224
+ },
15225
+ "tags": {
15226
+ "type": "array",
15227
+ "items": {
15228
+ "type": "string"
15229
+ }
15230
+ },
15231
+ "status": {
15232
+ "type": "string"
15233
+ },
15234
+ "embeddingStatus": {
15235
+ "type": "string"
15236
+ },
15237
+ "createdAt": {
15238
+ "type": "string"
15239
+ },
15240
+ "updatedAt": {
15241
+ "type": "string"
15242
+ },
15243
+ "preview": {
15244
+ "type": "object",
15245
+ "properties": {
15246
+ "url": {
15247
+ "type": "string",
15248
+ "format": "uri"
15249
+ },
15250
+ "expiresAt": {
15251
+ "type": "string",
15252
+ "format": "date-time"
15253
+ },
15254
+ "mimeType": {
15255
+ "type": "string",
15256
+ "const": "image/webp"
15257
+ }
15258
+ },
15259
+ "required": [
15260
+ "url",
15261
+ "expiresAt",
15262
+ "mimeType"
15263
+ ],
15264
+ "additionalProperties": false
15265
+ }
15266
+ },
15267
+ "required": [
15268
+ "assetId",
15269
+ "title",
15270
+ "description",
15271
+ "altText",
15272
+ "sourceUrl",
15273
+ "sourceKind",
15274
+ "mimeType",
15275
+ "bytes",
15276
+ "width",
15277
+ "height",
15278
+ "projectId",
15279
+ "folderId",
15280
+ "tags",
15281
+ "status",
15282
+ "embeddingStatus",
15283
+ "createdAt",
15284
+ "updatedAt"
15285
+ ],
15286
+ "additionalProperties": false
15287
+ },
15288
+ "code": {
15289
+ "type": "string"
15290
+ },
15291
+ "error": {
15292
+ "type": "string"
15293
+ }
15294
+ },
15295
+ "required": [
15296
+ "ok"
15297
+ ],
15298
+ "additionalProperties": false,
15299
+ "$schema": "http://json-schema.org/draft-07/schema#"
15300
+ },
15301
+ "annotations": {
15302
+ "title": "Get Image Asset",
15303
+ "readOnlyHint": true,
15304
+ "destructiveHint": false,
15305
+ "idempotentHint": true,
15306
+ "openWorldHint": false
15307
+ }
15308
+ },
15309
+ {
15310
+ "id": "image_asset_list",
15311
+ "upstreamName": "image_asset_list",
15312
+ "description": "List authorized private image metadata with exact location, provenance, media, tag, and creation-time filters. Use image_asset_search for semantic retrieval.",
15313
+ "inputJsonSchema": {
15314
+ "type": "object",
15315
+ "properties": {
15316
+ "vault": {
15317
+ "type": "string"
15318
+ },
15319
+ "projectId": {
15320
+ "type": "string"
15321
+ },
15322
+ "folderId": {
15323
+ "type": "string"
15324
+ },
15325
+ "sourceKind": {
15326
+ "type": "string",
15327
+ "enum": [
15328
+ "upload",
15329
+ "scrape",
15330
+ "screenshot",
15331
+ "instagram",
15332
+ "external_url",
15333
+ "import"
15334
+ ]
15335
+ },
15336
+ "sourceHost": {
15337
+ "type": "string",
15338
+ "minLength": 1,
15339
+ "maxLength": 253
15340
+ },
15341
+ "mimeType": {
15342
+ "type": "string",
15343
+ "enum": [
15344
+ "image/jpeg",
15345
+ "image/png",
15346
+ "image/webp",
15347
+ "image/gif"
15348
+ ]
15349
+ },
15350
+ "tags": {
15351
+ "type": "array",
15352
+ "items": {
15353
+ "type": "string",
15354
+ "minLength": 1,
15355
+ "maxLength": 80
15356
+ },
15357
+ "maxItems": 20
15358
+ },
15359
+ "createdAfter": {
15360
+ "type": "string",
15361
+ "format": "date-time"
15362
+ },
15363
+ "createdBefore": {
15364
+ "type": "string",
15365
+ "format": "date-time"
15366
+ },
15367
+ "limit": {
15368
+ "type": "integer",
15369
+ "minimum": 1,
15370
+ "maximum": 100,
15371
+ "default": 30
15372
+ }
15373
+ },
15374
+ "additionalProperties": false,
15375
+ "$schema": "http://json-schema.org/draft-07/schema#"
15376
+ },
15377
+ "outputJsonSchema": {
15378
+ "type": "object",
15379
+ "properties": {
15380
+ "ok": {
15381
+ "type": "boolean",
15382
+ "enum": [
15383
+ true,
15384
+ false
15385
+ ]
15386
+ },
15387
+ "assets": {
15388
+ "type": "array",
15389
+ "items": {
15390
+ "type": "object",
15391
+ "properties": {
15392
+ "assetId": {
15393
+ "type": "string"
15394
+ },
15395
+ "title": {
15396
+ "type": "string"
15397
+ },
15398
+ "description": {
15399
+ "type": [
15400
+ "string",
15401
+ "null"
15402
+ ]
15403
+ },
15404
+ "altText": {
15405
+ "type": [
15406
+ "string",
15407
+ "null"
15408
+ ]
15409
+ },
15410
+ "sourceUrl": {
15411
+ "type": [
15412
+ "string",
15413
+ "null"
15414
+ ]
15415
+ },
15416
+ "sourceKind": {
15417
+ "type": "string"
15418
+ },
15419
+ "mimeType": {
15420
+ "type": "string"
15421
+ },
15422
+ "bytes": {
15423
+ "type": "number"
15424
+ },
15425
+ "width": {
15426
+ "type": "number"
15427
+ },
15428
+ "height": {
15429
+ "type": "number"
15430
+ },
15431
+ "projectId": {
15432
+ "type": [
15433
+ "string",
15434
+ "null"
15435
+ ]
15436
+ },
15437
+ "folderId": {
15438
+ "type": [
15439
+ "string",
15440
+ "null"
15441
+ ]
15442
+ },
15443
+ "tags": {
15444
+ "type": "array",
15445
+ "items": {
15446
+ "type": "string"
15447
+ }
15448
+ },
15449
+ "status": {
15450
+ "type": "string"
15451
+ },
15452
+ "embeddingStatus": {
15453
+ "type": "string"
15454
+ },
15455
+ "createdAt": {
15456
+ "type": "string"
15457
+ },
15458
+ "updatedAt": {
15459
+ "type": "string"
15460
+ },
15461
+ "preview": {
15462
+ "type": "object",
15463
+ "properties": {
15464
+ "url": {
15465
+ "type": "string",
15466
+ "format": "uri"
15467
+ },
15468
+ "expiresAt": {
15469
+ "type": "string",
15470
+ "format": "date-time"
15471
+ },
15472
+ "mimeType": {
15473
+ "type": "string",
15474
+ "const": "image/webp"
15475
+ }
15476
+ },
15477
+ "required": [
15478
+ "url",
15479
+ "expiresAt",
15480
+ "mimeType"
15481
+ ],
15482
+ "additionalProperties": false
15483
+ }
15484
+ },
15485
+ "required": [
15486
+ "assetId",
15487
+ "title",
15488
+ "description",
15489
+ "altText",
15490
+ "sourceUrl",
15491
+ "sourceKind",
15492
+ "mimeType",
15493
+ "bytes",
15494
+ "width",
15495
+ "height",
15496
+ "projectId",
15497
+ "folderId",
15498
+ "tags",
15499
+ "status",
15500
+ "embeddingStatus",
15501
+ "createdAt",
15502
+ "updatedAt"
15503
+ ],
15504
+ "additionalProperties": false
15505
+ }
15506
+ },
15507
+ "count": {
15508
+ "type": "number"
15509
+ },
15510
+ "code": {
15511
+ "type": "string"
15512
+ },
15513
+ "error": {
15514
+ "type": "string"
15515
+ }
15516
+ },
15517
+ "required": [
15518
+ "ok"
15519
+ ],
15520
+ "additionalProperties": false,
15521
+ "$schema": "http://json-schema.org/draft-07/schema#"
15522
+ },
15523
+ "annotations": {
15524
+ "title": "List Image Assets",
15525
+ "readOnlyHint": true,
15526
+ "destructiveHint": false,
15527
+ "idempotentHint": true,
15528
+ "openWorldHint": false
15529
+ }
15530
+ },
15531
+ {
15532
+ "id": "image_asset_search",
15533
+ "upstreamName": "image_asset_search",
15534
+ "description": "Semantically search authorized private image Memory using text, a stored asset, a public HTTPS image, or bounded base64. Text plus one image performs a fused query. This consumes query-embedding usage.",
15535
+ "inputJsonSchema": {
15536
+ "type": "object",
15537
+ "properties": {
15538
+ "vault": {
15539
+ "type": "string"
15540
+ },
15541
+ "queryText": {
15542
+ "type": "string",
15543
+ "minLength": 1,
15544
+ "maxLength": 4e3
15545
+ },
15546
+ "queryAssetId": {
15547
+ "type": "string",
15548
+ "minLength": 1
15549
+ },
15550
+ "queryUrl": {
15551
+ "type": "string",
15552
+ "format": "uri"
15553
+ },
15554
+ "queryImageBase64": {
15555
+ "type": "string",
15556
+ "minLength": 1
15557
+ },
15558
+ "projectId": {
15559
+ "type": "string"
15560
+ },
15561
+ "folderId": {
15562
+ "type": "string"
15563
+ },
15564
+ "sourceKind": {
15565
+ "type": "string",
15566
+ "enum": [
15567
+ "upload",
15568
+ "scrape",
15569
+ "screenshot",
15570
+ "instagram",
15571
+ "external_url",
15572
+ "import"
15573
+ ]
15574
+ },
15575
+ "sourceHost": {
15576
+ "type": "string",
15577
+ "minLength": 1,
15578
+ "maxLength": 253
15579
+ },
15580
+ "mimeType": {
15581
+ "type": "string",
15582
+ "enum": [
15583
+ "image/jpeg",
15584
+ "image/png",
15585
+ "image/webp",
15586
+ "image/gif"
15587
+ ]
15588
+ },
15589
+ "tags": {
15590
+ "type": "array",
15591
+ "items": {
15592
+ "type": "string",
15593
+ "minLength": 1,
15594
+ "maxLength": 80
15595
+ },
15596
+ "maxItems": 20
15597
+ },
15598
+ "createdAfter": {
15599
+ "type": "string",
15600
+ "format": "date-time"
15601
+ },
15602
+ "createdBefore": {
15603
+ "type": "string",
15604
+ "format": "date-time"
15605
+ },
15606
+ "limit": {
15607
+ "type": "integer",
15608
+ "minimum": 1,
15609
+ "maximum": 30,
15610
+ "default": 10
15611
+ },
15612
+ "includePreview": {
15613
+ "type": "boolean",
15614
+ "default": false
15615
+ }
15616
+ },
15617
+ "additionalProperties": false,
15618
+ "$schema": "http://json-schema.org/draft-07/schema#"
15619
+ },
15620
+ "outputJsonSchema": {
15621
+ "type": "object",
15622
+ "properties": {
15623
+ "ok": {
15624
+ "type": "boolean",
15625
+ "enum": [
15626
+ true,
15627
+ false
15628
+ ]
15629
+ },
15630
+ "results": {
15631
+ "type": "array",
15632
+ "items": {
15633
+ "type": "object",
15634
+ "properties": {
15635
+ "asset": {
15636
+ "type": "object",
15637
+ "properties": {
15638
+ "assetId": {
15639
+ "type": "string"
15640
+ },
15641
+ "title": {
15642
+ "type": "string"
15643
+ },
15644
+ "description": {
15645
+ "type": [
15646
+ "string",
15647
+ "null"
15648
+ ]
15649
+ },
15650
+ "altText": {
15651
+ "type": [
15652
+ "string",
15653
+ "null"
15654
+ ]
15655
+ },
15656
+ "sourceUrl": {
15657
+ "type": [
15658
+ "string",
15659
+ "null"
15660
+ ]
15661
+ },
15662
+ "sourceKind": {
15663
+ "type": "string"
15664
+ },
15665
+ "mimeType": {
15666
+ "type": "string"
15667
+ },
15668
+ "bytes": {
15669
+ "type": "number"
15670
+ },
15671
+ "width": {
15672
+ "type": "number"
15673
+ },
15674
+ "height": {
15675
+ "type": "number"
15676
+ },
15677
+ "projectId": {
15678
+ "type": [
15679
+ "string",
15680
+ "null"
15681
+ ]
15682
+ },
15683
+ "folderId": {
15684
+ "type": [
15685
+ "string",
15686
+ "null"
15687
+ ]
15688
+ },
15689
+ "tags": {
15690
+ "type": "array",
15691
+ "items": {
15692
+ "type": "string"
15693
+ }
15694
+ },
15695
+ "status": {
15696
+ "type": "string"
15697
+ },
15698
+ "embeddingStatus": {
15699
+ "type": "string"
15700
+ },
15701
+ "createdAt": {
15702
+ "type": "string"
15703
+ },
15704
+ "updatedAt": {
15705
+ "type": "string"
15706
+ },
15707
+ "preview": {
15708
+ "type": "object",
15709
+ "properties": {
15710
+ "url": {
15711
+ "type": "string",
15712
+ "format": "uri"
15713
+ },
15714
+ "expiresAt": {
15715
+ "type": "string",
15716
+ "format": "date-time"
15717
+ },
15718
+ "mimeType": {
15719
+ "type": "string",
15720
+ "const": "image/webp"
15721
+ }
15722
+ },
15723
+ "required": [
15724
+ "url",
15725
+ "expiresAt",
15726
+ "mimeType"
15727
+ ],
15728
+ "additionalProperties": false
15729
+ }
15730
+ },
15731
+ "required": [
15732
+ "assetId",
15733
+ "title",
15734
+ "description",
15735
+ "altText",
15736
+ "sourceUrl",
15737
+ "sourceKind",
15738
+ "mimeType",
15739
+ "bytes",
15740
+ "width",
15741
+ "height",
15742
+ "projectId",
15743
+ "folderId",
15744
+ "tags",
15745
+ "status",
15746
+ "embeddingStatus",
15747
+ "createdAt",
15748
+ "updatedAt"
15749
+ ],
15750
+ "additionalProperties": false
15751
+ },
15752
+ "score": {
15753
+ "type": "number"
15754
+ },
15755
+ "matchRepresentations": {
15756
+ "type": "array",
15757
+ "items": {
15758
+ "type": "string",
15759
+ "enum": [
15760
+ "visual",
15761
+ "fused"
15762
+ ]
15763
+ }
15764
+ },
15765
+ "embeddingModel": {
15766
+ "type": "string"
15767
+ }
15768
+ },
15769
+ "required": [
15770
+ "asset",
15771
+ "score",
15772
+ "matchRepresentations",
15773
+ "embeddingModel"
15774
+ ],
15775
+ "additionalProperties": false
15776
+ }
15777
+ },
15778
+ "count": {
15779
+ "type": "number"
15780
+ },
15781
+ "code": {
15782
+ "type": "string"
15783
+ },
15784
+ "error": {
15785
+ "type": "string"
15786
+ }
15787
+ },
15788
+ "required": [
15789
+ "ok"
15790
+ ],
15791
+ "additionalProperties": false,
15792
+ "$schema": "http://json-schema.org/draft-07/schema#"
15793
+ },
15794
+ "annotations": {
15795
+ "title": "Search Image Assets",
15796
+ "readOnlyHint": true,
15797
+ "destructiveHint": false,
15798
+ "idempotentHint": true,
15799
+ "openWorldHint": true
15800
+ }
15801
+ },
15802
+ {
15803
+ "id": "image_asset_move",
15804
+ "upstreamName": "image_asset_move",
15805
+ "description": "Move an image asset between project/folder locations in the same writable Memory vault. This updates metadata only and never copies private image bytes.",
15806
+ "inputJsonSchema": {
15807
+ "type": "object",
15808
+ "properties": {
15809
+ "vault": {
15810
+ "type": "string"
15811
+ },
15812
+ "assetId": {
15813
+ "type": "string",
15814
+ "minLength": 1
15815
+ },
15816
+ "projectId": {
15817
+ "anyOf": [
15818
+ {
15819
+ "type": "string",
15820
+ "minLength": 1
15821
+ },
15822
+ {
15823
+ "type": "null"
15824
+ }
15825
+ ]
15826
+ },
15827
+ "folderId": {
15828
+ "anyOf": [
15829
+ {
15830
+ "type": "string",
15831
+ "minLength": 1
15832
+ },
15833
+ {
15834
+ "type": "null"
15835
+ }
15836
+ ]
15837
+ }
15838
+ },
15839
+ "required": [
15840
+ "assetId"
15841
+ ],
15842
+ "additionalProperties": false,
15843
+ "$schema": "http://json-schema.org/draft-07/schema#"
15844
+ },
15845
+ "outputJsonSchema": {
15846
+ "type": "object",
15847
+ "properties": {
15848
+ "ok": {
15849
+ "type": "boolean",
15850
+ "enum": [
15851
+ true,
15852
+ false
15853
+ ]
15854
+ },
15855
+ "asset": {
15856
+ "type": "object",
15857
+ "properties": {
15858
+ "assetId": {
15859
+ "type": "string"
15860
+ },
15861
+ "title": {
15862
+ "type": "string"
15863
+ },
15864
+ "description": {
15865
+ "type": [
15866
+ "string",
15867
+ "null"
15868
+ ]
15869
+ },
15870
+ "altText": {
15871
+ "type": [
15872
+ "string",
15873
+ "null"
15874
+ ]
15875
+ },
15876
+ "sourceUrl": {
15877
+ "type": [
15878
+ "string",
15879
+ "null"
15880
+ ]
15881
+ },
15882
+ "sourceKind": {
15883
+ "type": "string"
15884
+ },
15885
+ "mimeType": {
15886
+ "type": "string"
15887
+ },
15888
+ "bytes": {
15889
+ "type": "number"
15890
+ },
15891
+ "width": {
15892
+ "type": "number"
15893
+ },
15894
+ "height": {
15895
+ "type": "number"
15896
+ },
15897
+ "projectId": {
15898
+ "type": [
15899
+ "string",
15900
+ "null"
15901
+ ]
15902
+ },
15903
+ "folderId": {
15904
+ "type": [
15905
+ "string",
15906
+ "null"
15907
+ ]
15908
+ },
15909
+ "tags": {
15910
+ "type": "array",
15911
+ "items": {
15912
+ "type": "string"
15913
+ }
15914
+ },
15915
+ "status": {
15916
+ "type": "string"
15917
+ },
15918
+ "embeddingStatus": {
15919
+ "type": "string"
15920
+ },
15921
+ "createdAt": {
15922
+ "type": "string"
15923
+ },
15924
+ "updatedAt": {
15925
+ "type": "string"
15926
+ },
15927
+ "preview": {
15928
+ "type": "object",
15929
+ "properties": {
15930
+ "url": {
15931
+ "type": "string",
15932
+ "format": "uri"
15933
+ },
15934
+ "expiresAt": {
15935
+ "type": "string",
15936
+ "format": "date-time"
15937
+ },
15938
+ "mimeType": {
15939
+ "type": "string",
15940
+ "const": "image/webp"
15941
+ }
15942
+ },
15943
+ "required": [
15944
+ "url",
15945
+ "expiresAt",
15946
+ "mimeType"
15947
+ ],
15948
+ "additionalProperties": false
15949
+ }
15950
+ },
15951
+ "required": [
15952
+ "assetId",
15953
+ "title",
15954
+ "description",
15955
+ "altText",
15956
+ "sourceUrl",
15957
+ "sourceKind",
15958
+ "mimeType",
15959
+ "bytes",
15960
+ "width",
15961
+ "height",
15962
+ "projectId",
15963
+ "folderId",
15964
+ "tags",
15965
+ "status",
15966
+ "embeddingStatus",
15967
+ "createdAt",
15968
+ "updatedAt"
15969
+ ],
15970
+ "additionalProperties": false
15971
+ },
15972
+ "code": {
15973
+ "type": "string"
15974
+ },
15975
+ "error": {
15976
+ "type": "string"
15977
+ }
15978
+ },
15979
+ "required": [
15980
+ "ok"
15981
+ ],
15982
+ "additionalProperties": false,
15983
+ "$schema": "http://json-schema.org/draft-07/schema#"
15984
+ },
15985
+ "annotations": {
15986
+ "title": "Move Image Asset",
15987
+ "readOnlyHint": false,
15988
+ "destructiveHint": false,
15989
+ "idempotentHint": true,
15990
+ "openWorldHint": false
15991
+ }
15992
+ },
15993
+ {
15994
+ "id": "image_asset_delete",
15995
+ "upstreamName": "image_asset_delete",
15996
+ "description": "DESTRUCTIVE: delete one governed image asset, remove its semantic vectors, and purge private bytes when no other logical asset uses them. Retry with the same assetId if an earlier response was lost.",
15997
+ "inputJsonSchema": {
15998
+ "type": "object",
15999
+ "properties": {
16000
+ "vault": {
16001
+ "type": "string"
16002
+ },
16003
+ "assetId": {
16004
+ "type": "string",
16005
+ "minLength": 1
16006
+ },
16007
+ "confirmDelete": {
16008
+ "type": "boolean",
16009
+ "const": true,
16010
+ "description": "Must be true after the caller has confirmed deletion."
16011
+ }
16012
+ },
16013
+ "required": [
16014
+ "assetId",
16015
+ "confirmDelete"
16016
+ ],
16017
+ "additionalProperties": false,
16018
+ "$schema": "http://json-schema.org/draft-07/schema#"
16019
+ },
16020
+ "outputJsonSchema": {
16021
+ "type": "object",
16022
+ "properties": {
16023
+ "ok": {
16024
+ "type": "boolean",
16025
+ "enum": [
16026
+ true,
16027
+ false
16028
+ ]
16029
+ },
16030
+ "deleted": {
16031
+ "type": "boolean"
16032
+ },
16033
+ "assetId": {
16034
+ "type": "string"
16035
+ },
16036
+ "code": {
16037
+ "type": "string"
16038
+ },
16039
+ "error": {
16040
+ "type": "string"
16041
+ }
16042
+ },
16043
+ "required": [
16044
+ "ok"
16045
+ ],
16046
+ "additionalProperties": false,
16047
+ "$schema": "http://json-schema.org/draft-07/schema#"
16048
+ },
16049
+ "annotations": {
16050
+ "title": "Delete Image Asset",
16051
+ "readOnlyHint": false,
16052
+ "destructiveHint": true,
16053
+ "idempotentHint": true,
16054
+ "openWorldHint": false
16055
+ }
16056
+ }
16057
+ ];
14458
16058
 
14459
16059
  // src/mcp/memory-tool-schemas.ts
14460
16060
  var import_zod12 = require("zod");
@@ -16987,7 +18587,7 @@ var MEMORY_TOOL_REGISTRY = [
16987
18587
  ...schema,
16988
18588
  description: MEMORY_TOOL_DESCRIPTION_OVERRIDES[schema.id] ?? schema.description
16989
18589
  })),
16990
- ...import_image_assets.IMAGE_ASSET_MCP_DEFINITIONS
18590
+ ...MEMORY_IMAGE_TOOL_SCHEMAS
16991
18591
  ];
16992
18592
 
16993
18593
  // src/mcp/memory-mcp-server.ts
@@ -17069,6 +18669,11 @@ var HostedMemoryMcpToolExecutor = class {
17069
18669
  }
17070
18670
  };
17071
18671
 
18672
+ // release-message.json
18673
+ var release_message_default = {
18674
+ message: "Long PAA research now continues as a durable MCP Task with preserved progress, while transient browser interruptions return specific retry guidance instead of a generic outage."
18675
+ };
18676
+
17072
18677
  // src/install-terminal.ts
17073
18678
  var CODES = {
17074
18679
  reset: "\x1B[0m",
@@ -17119,7 +18724,7 @@ function renderInstallTerminal(options) {
17119
18724
  colorize(ascii, "amber", color),
17120
18725
  `${colorize("MCP Scraper Agent", "cyan", color)} . v${options.version} . mcpscraper.dev`,
17121
18726
  "1/1 install surfaces ready",
17122
- colorize("Newest: any approved connection read can become an indexed Memory snapshot in one call. OAuth stays tenant-isolated and provider content is redacted and marked untrusted.", "lime", color),
18727
+ colorize(`Newest in v${options.version}: ${release_message_default.message}`, "lime", color),
17123
18728
  "",
17124
18729
  `${colorize("Tools", "cyan", color)} ${colorize("(259 MCP tools)", "muted", color)}`,
17125
18730
  toolRow("search", ["harvest_paa", "search_serp", "maps_search", "maps_place_intel"], color),
@@ -17905,4 +19510,3 @@ function buildStdioServer() {
17905
19510
  `);
17906
19511
  }
17907
19512
  });
17908
- //# sourceMappingURL=mcp-stdio-server.cjs.map