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
@@ -46,7 +46,7 @@ var init_harvest_timeout = __esm({
46
46
  "src/harvest-timeout.ts"() {
47
47
  "use strict";
48
48
  SCRAPE_FUNCTION_MAX_MS = 8e5;
49
- DEFAULT_TOOL_CLIENT_TIMEOUT_MS = 3e5;
49
+ DEFAULT_TOOL_CLIENT_TIMEOUT_MS = 59e4;
50
50
  CLIENT_OVER_SERVER_MARGIN_MS = 15e3;
51
51
  }
52
52
  });
@@ -186,8 +186,9 @@ function publicErrorMessage(code) {
186
186
  case "proxy_unavailable":
187
187
  return "The web request could not establish a working connection. Please retry later.";
188
188
  case "harvest_timeout":
189
- case "mcp_request_timeout":
190
189
  return "The request timed out before it completed. Please retry with a smaller request.";
190
+ case "mcp_request_timeout":
191
+ 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.";
191
192
  case "concurrency_limit_exceeded":
192
193
  return "The service is available, but this account has reached its parallel-operation limit. Wait for an active operation to finish or add capacity.";
193
194
  case "unauthorized":
@@ -50536,7 +50537,7 @@ var PACKAGE_VERSION;
50536
50537
  var init_version = __esm({
50537
50538
  "src/version.ts"() {
50538
50539
  "use strict";
50539
- PACKAGE_VERSION = "0.66.0";
50540
+ PACKAGE_VERSION = "0.66.1";
50540
50541
  }
50541
50542
  });
50542
50543
 
@@ -55717,7 +55718,7 @@ function decodeTaskHandle(taskId, secret2, ownerId2) {
55717
55718
  decipher.update(ciphertext),
55718
55719
  decipher.final()
55719
55720
  ]).toString("utf8"));
55720
- if (parsed.v !== 1 || parsed.ownerId !== ownerId2 || !["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");
55721
+ if (parsed.v !== 1 || parsed.ownerId !== ownerId2 || !["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");
55721
55722
  if (Date.now() > parsed.expiresAtMs) {
55722
55723
  throw new import_server.ProtocolError(TASK_INVALID_PARAMS, "Failed to retrieve task: Task has expired");
55723
55724
  }
@@ -55730,9 +55731,25 @@ function decodeTaskHandle(taskId, secret2, ownerId2) {
55730
55731
  function objectValue(value) {
55731
55732
  return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
55732
55733
  }
55733
- function taskSeed(kind, result) {
55734
+ function resultValue(result) {
55734
55735
  const structured = objectValue(result.structuredContent);
55736
+ if (structured) return structured;
55737
+ const block = result.content.find((item) => item.type === "text");
55738
+ if (!block || block.type !== "text") return void 0;
55739
+ try {
55740
+ return objectValue(JSON.parse(block.text));
55741
+ } catch {
55742
+ return void 0;
55743
+ }
55744
+ }
55745
+ function taskSeed(kind, result) {
55746
+ const structured = resultValue(result);
55735
55747
  if (!structured || result.isError === true) return void 0;
55748
+ if (kind === "paa_harvest") {
55749
+ const operationId2 = structured.job_id ?? structured.jobId;
55750
+ if (typeof operationId2 !== "string" || !["pending", "running"].includes(String(structured.status))) return void 0;
55751
+ return { kind, operationId: operationId2, statusMessage: "PAA harvest started. Progress will be preserved while the client polls this Task." };
55752
+ }
55736
55753
  if (kind === "site_export") {
55737
55754
  const operationId2 = structured.jobId;
55738
55755
  if (typeof operationId2 !== "string" || structured.status !== "pending") return void 0;
@@ -55763,10 +55780,13 @@ function taskBase(payload, taskId) {
55763
55780
  };
55764
55781
  }
55765
55782
  function statusFrom(result) {
55766
- const status = objectValue(result.structuredContent)?.status;
55783
+ const status = resultValue(result)?.status;
55767
55784
  return typeof status === "string" ? status : void 0;
55768
55785
  }
55769
55786
  async function pollTask(executor, payload) {
55787
+ if (payload.kind === "paa_harvest") {
55788
+ return executor.harvestPaaStatus({ jobId: payload.operationId });
55789
+ }
55770
55790
  if (payload.kind === "site_export") {
55771
55791
  return executor.checkSiteExport({ jobId: payload.operationId });
55772
55792
  }
@@ -55778,6 +55798,30 @@ async function pollTask(executor, payload) {
55778
55798
  }
55779
55799
  return executor.videoFrameAnalysisStatus({ runId: payload.operationId });
55780
55800
  }
55801
+ function taskProgressMessage(kind, result, status) {
55802
+ const value = resultValue(result) ?? {};
55803
+ if (kind === "paa_harvest") {
55804
+ const resultRecord = objectValue(value.result) ?? {};
55805
+ const progress = objectValue(resultRecord.progress) ?? {};
55806
+ const records = Array.isArray(progress.records) ? progress.records.length : 0;
55807
+ const attempts = Array.isArray(value.attempts) ? value.attempts.length : 0;
55808
+ const pieces = [records > 0 ? `${records} questions preserved` : null, attempts > 0 ? `${attempts} attempts recorded` : null].filter(Boolean);
55809
+ return pieces.length > 0 ? `PAA harvest is ${status ?? "running"}: ${pieces.join(", ")}.` : `PAA harvest is ${status ?? "running"}; no question checkpoint has been persisted yet.`;
55810
+ }
55811
+ if (kind === "lead_list_enrichment") {
55812
+ const progress = objectValue(value.progress) ?? {};
55813
+ const completed = typeof progress.completedRows === "number" ? progress.completedRows : null;
55814
+ const total = typeof progress.totalRows === "number" ? progress.totalRows : null;
55815
+ if (completed !== null && total !== null) return `Lead list enrichment is ${status ?? "running"}: ${completed}/${total} rows completed.`;
55816
+ }
55817
+ if (kind === "directory_workflow") {
55818
+ const progress = objectValue(value.progress) ?? {};
55819
+ const completed = typeof progress.completedCities === "number" ? progress.completedCities : null;
55820
+ const total = typeof progress.totalCities === "number" ? progress.totalCities : null;
55821
+ if (completed !== null && total !== null) return `Directory workflow is ${status ?? "running"}: ${completed}/${total} markets completed.`;
55822
+ }
55823
+ return status ? `Underlying operation status: ${status}.` : "Underlying operation is running.";
55824
+ }
55781
55825
  async function cancelTask(executor, payload) {
55782
55826
  if (payload.kind !== "lead_list_enrichment") return;
55783
55827
  const result = await executor.leadListEnrichCancel({ jobId: payload.operationId });
@@ -55794,7 +55838,7 @@ async function detailedTask(executor, taskId, options) {
55794
55838
  return {
55795
55839
  ...base,
55796
55840
  status: "working",
55797
- statusMessage: status ? `Underlying operation status: ${status}.` : "Underlying operation is running."
55841
+ statusMessage: taskProgressMessage(payload.kind, result, status)
55798
55842
  };
55799
55843
  }
55800
55844
  if (payload.kind === "lead_list_enrichment" && status === "failed") {
@@ -55805,6 +55849,22 @@ async function detailedTask(executor, taskId, options) {
55805
55849
  result
55806
55850
  };
55807
55851
  }
55852
+ if (payload.kind === "paa_harvest" && status === "failed") {
55853
+ return {
55854
+ ...base,
55855
+ status: "failed",
55856
+ statusMessage: "PAA harvest failed; persisted attempts and billing state are included in the result.",
55857
+ result
55858
+ };
55859
+ }
55860
+ if (payload.kind === "paa_harvest" && status === "cancelled") {
55861
+ return {
55862
+ ...base,
55863
+ status: "cancelled",
55864
+ statusMessage: "PAA harvest was cancelled.",
55865
+ result
55866
+ };
55867
+ }
55808
55868
  if (payload.kind === "lead_list_enrichment" && status === "cancelled") {
55809
55869
  return {
55810
55870
  ...base,
@@ -55821,6 +55881,7 @@ async function detailedTask(executor, taskId, options) {
55821
55881
  };
55822
55882
  }
55823
55883
  function isWorking(kind, status) {
55884
+ if (kind === "paa_harvest") return status === "pending" || status === "running";
55824
55885
  if (kind === "site_export") return status === "pending" || status === "running";
55825
55886
  if (kind === "directory_workflow") return status === "queued" || status === "running";
55826
55887
  if (kind === "lead_list_enrichment") return status === "queued" || status === "running";
@@ -55852,6 +55913,9 @@ function registerMcpTasksExtension(server, executor, options) {
55852
55913
  return {};
55853
55914
  });
55854
55915
  return {
55916
+ supportsTasks() {
55917
+ return hasTasksCapability(server.server.getClientCapabilities());
55918
+ },
55855
55919
  taskify(kind, result) {
55856
55920
  if (!hasTasksCapability(server.server.getClientCapabilities())) return result;
55857
55921
  const seed = taskSeed(kind, result);
@@ -56408,7 +56472,12 @@ function registerPaaExtractorMcpTools(server, executor, options = {}) {
56408
56472
  inputSchema: harvestPaaInputSchema,
56409
56473
  outputSchema: recordOutputSchema("harvest_paa", HarvestPaaOutputSchema),
56410
56474
  annotations: liveWebToolAnnotations("Google PAA + SERP Harvest")
56411
- }, async (input) => formatHarvestPaa(await executor.harvestPaa(input), input));
56475
+ }, async (input, requestContext) => {
56476
+ if (tasks.supportsTasks()) {
56477
+ return tasks.taskify("paa_harvest", await executor.startHarvestPaa(input), requestContext);
56478
+ }
56479
+ return formatHarvestPaa(await executor.harvestPaa(input), input);
56480
+ });
56412
56481
  server.registerTool("search_serp", {
56413
56482
  title: "Google SERP Lookup",
56414
56483
  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.`,
@@ -57409,7 +57478,7 @@ var init_http_mcp_tool_executor = __esm({
57409
57478
  retryable: true,
57410
57479
  path: path6,
57411
57480
  timeoutMs,
57412
- 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}`
57481
+ 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}`
57413
57482
  })
57414
57483
  }],
57415
57484
  isError: true
@@ -57495,6 +57564,13 @@ var init_http_mcp_tool_executor = __esm({
57495
57564
  const headers = input.idempotencyKey ? { "Idempotency-Key": input.idempotencyKey } : {};
57496
57565
  return this.call("/harvest/sync", input, timeoutMs, "POST", headers, true);
57497
57566
  }
57567
+ startHarvestPaa(input) {
57568
+ const headers = input.idempotencyKey ? { "Idempotency-Key": input.idempotencyKey } : {};
57569
+ return this.call("/harvest", input, this.timeoutMs, "POST", headers, true);
57570
+ }
57571
+ harvestPaaStatus(input) {
57572
+ return this.getJson(`/jobs/${encodeURIComponent(input.jobId)}`);
57573
+ }
57498
57574
  searchSerp(input) {
57499
57575
  const timeoutMs = this.httpTimeoutOverrideMs ?? harvestTimeoutBudget(0, true).clientMs;
57500
57576
  const headers = input.idempotencyKey ? { "Idempotency-Key": input.idempotencyKey } : {};
@@ -59727,6 +59803,1539 @@ var init_browser_agent_mcp_server = __esm({
59727
59803
  }
59728
59804
  });
59729
59805
 
59806
+ // src/mcp/memory-image-tool-schemas.generated.ts
59807
+ var MEMORY_IMAGE_TOOL_SCHEMAS;
59808
+ var init_memory_image_tool_schemas_generated = __esm({
59809
+ "src/mcp/memory-image-tool-schemas.generated.ts"() {
59810
+ "use strict";
59811
+ MEMORY_IMAGE_TOOL_SCHEMAS = [
59812
+ {
59813
+ "id": "image_project_create",
59814
+ "upstreamName": "image_project_create",
59815
+ "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.",
59816
+ "inputJsonSchema": {
59817
+ "type": "object",
59818
+ "properties": {
59819
+ "vault": {
59820
+ "type": "string",
59821
+ "description": "Writable logical Memory vault. Defaults to the active vault."
59822
+ },
59823
+ "name": {
59824
+ "type": "string",
59825
+ "minLength": 1,
59826
+ "maxLength": 120
59827
+ },
59828
+ "description": {
59829
+ "type": "string",
59830
+ "maxLength": 2e3
59831
+ }
59832
+ },
59833
+ "required": [
59834
+ "name"
59835
+ ],
59836
+ "additionalProperties": false,
59837
+ "$schema": "http://json-schema.org/draft-07/schema#"
59838
+ },
59839
+ "outputJsonSchema": {
59840
+ "type": "object",
59841
+ "properties": {
59842
+ "ok": {
59843
+ "type": "boolean",
59844
+ "enum": [
59845
+ true,
59846
+ false
59847
+ ]
59848
+ },
59849
+ "project": {
59850
+ "type": "object",
59851
+ "properties": {
59852
+ "id": {
59853
+ "type": "string"
59854
+ },
59855
+ "name": {
59856
+ "type": "string"
59857
+ },
59858
+ "description": {
59859
+ "type": [
59860
+ "string",
59861
+ "null"
59862
+ ]
59863
+ },
59864
+ "createdAt": {
59865
+ "type": "string"
59866
+ }
59867
+ },
59868
+ "required": [
59869
+ "id",
59870
+ "name",
59871
+ "description",
59872
+ "createdAt"
59873
+ ],
59874
+ "additionalProperties": false
59875
+ },
59876
+ "code": {
59877
+ "type": "string"
59878
+ },
59879
+ "error": {
59880
+ "type": "string"
59881
+ }
59882
+ },
59883
+ "required": [
59884
+ "ok"
59885
+ ],
59886
+ "additionalProperties": false,
59887
+ "$schema": "http://json-schema.org/draft-07/schema#"
59888
+ },
59889
+ "annotations": {
59890
+ "title": "Create Image Project",
59891
+ "readOnlyHint": false,
59892
+ "destructiveHint": false,
59893
+ "idempotentHint": false,
59894
+ "openWorldHint": false
59895
+ }
59896
+ },
59897
+ {
59898
+ "id": "image_project_list",
59899
+ "upstreamName": "image_project_list",
59900
+ "description": "List image projects in an accessible hosted Memory vault. Returns organization metadata only, never object-store keys.",
59901
+ "inputJsonSchema": {
59902
+ "type": "object",
59903
+ "properties": {
59904
+ "vault": {
59905
+ "type": "string"
59906
+ }
59907
+ },
59908
+ "additionalProperties": false,
59909
+ "$schema": "http://json-schema.org/draft-07/schema#"
59910
+ },
59911
+ "outputJsonSchema": {
59912
+ "type": "object",
59913
+ "properties": {
59914
+ "ok": {
59915
+ "type": "boolean",
59916
+ "enum": [
59917
+ true,
59918
+ false
59919
+ ]
59920
+ },
59921
+ "projects": {
59922
+ "type": "array",
59923
+ "items": {
59924
+ "type": "object",
59925
+ "properties": {
59926
+ "id": {
59927
+ "type": "string"
59928
+ },
59929
+ "name": {
59930
+ "type": "string"
59931
+ },
59932
+ "description": {
59933
+ "type": [
59934
+ "string",
59935
+ "null"
59936
+ ]
59937
+ },
59938
+ "status": {
59939
+ "type": "string"
59940
+ },
59941
+ "createdAt": {
59942
+ "type": "string"
59943
+ },
59944
+ "updatedAt": {
59945
+ "type": "string"
59946
+ }
59947
+ },
59948
+ "required": [
59949
+ "id",
59950
+ "name",
59951
+ "description",
59952
+ "status",
59953
+ "createdAt",
59954
+ "updatedAt"
59955
+ ],
59956
+ "additionalProperties": false
59957
+ }
59958
+ },
59959
+ "code": {
59960
+ "type": "string"
59961
+ },
59962
+ "error": {
59963
+ "type": "string"
59964
+ }
59965
+ },
59966
+ "required": [
59967
+ "ok"
59968
+ ],
59969
+ "additionalProperties": false,
59970
+ "$schema": "http://json-schema.org/draft-07/schema#"
59971
+ },
59972
+ "annotations": {
59973
+ "title": "List Image Projects",
59974
+ "readOnlyHint": true,
59975
+ "destructiveHint": false,
59976
+ "idempotentHint": true,
59977
+ "openWorldHint": false
59978
+ }
59979
+ },
59980
+ {
59981
+ "id": "image_folder_create",
59982
+ "upstreamName": "image_folder_create",
59983
+ "description": "Create a nested image folder inside one writable Memory image project. Maximum nesting depth is eight; this changes logical organization only.",
59984
+ "inputJsonSchema": {
59985
+ "type": "object",
59986
+ "properties": {
59987
+ "vault": {
59988
+ "type": "string"
59989
+ },
59990
+ "projectId": {
59991
+ "type": "string",
59992
+ "minLength": 1
59993
+ },
59994
+ "parentId": {
59995
+ "type": "string",
59996
+ "minLength": 1
59997
+ },
59998
+ "name": {
59999
+ "type": "string",
60000
+ "minLength": 1,
60001
+ "maxLength": 120
60002
+ }
60003
+ },
60004
+ "required": [
60005
+ "projectId",
60006
+ "name"
60007
+ ],
60008
+ "additionalProperties": false,
60009
+ "$schema": "http://json-schema.org/draft-07/schema#"
60010
+ },
60011
+ "outputJsonSchema": {
60012
+ "type": "object",
60013
+ "properties": {
60014
+ "ok": {
60015
+ "type": "boolean",
60016
+ "enum": [
60017
+ true,
60018
+ false
60019
+ ]
60020
+ },
60021
+ "folder": {
60022
+ "type": "object",
60023
+ "properties": {
60024
+ "id": {
60025
+ "type": "string"
60026
+ },
60027
+ "projectId": {
60028
+ "type": "string"
60029
+ },
60030
+ "parentId": {
60031
+ "type": [
60032
+ "string",
60033
+ "null"
60034
+ ]
60035
+ },
60036
+ "name": {
60037
+ "type": "string"
60038
+ },
60039
+ "depth": {
60040
+ "type": "number"
60041
+ },
60042
+ "createdAt": {
60043
+ "type": "string"
60044
+ }
60045
+ },
60046
+ "required": [
60047
+ "id",
60048
+ "projectId",
60049
+ "parentId",
60050
+ "name",
60051
+ "depth",
60052
+ "createdAt"
60053
+ ],
60054
+ "additionalProperties": false
60055
+ },
60056
+ "code": {
60057
+ "type": "string"
60058
+ },
60059
+ "error": {
60060
+ "type": "string"
60061
+ }
60062
+ },
60063
+ "required": [
60064
+ "ok"
60065
+ ],
60066
+ "additionalProperties": false,
60067
+ "$schema": "http://json-schema.org/draft-07/schema#"
60068
+ },
60069
+ "annotations": {
60070
+ "title": "Create Image Folder",
60071
+ "readOnlyHint": false,
60072
+ "destructiveHint": false,
60073
+ "idempotentHint": false,
60074
+ "openWorldHint": false
60075
+ }
60076
+ },
60077
+ {
60078
+ "id": "image_folder_list",
60079
+ "upstreamName": "image_folder_list",
60080
+ "description": "List the bounded folder tree for one accessible Memory image project.",
60081
+ "inputJsonSchema": {
60082
+ "type": "object",
60083
+ "properties": {
60084
+ "vault": {
60085
+ "type": "string"
60086
+ },
60087
+ "projectId": {
60088
+ "type": "string",
60089
+ "minLength": 1
60090
+ }
60091
+ },
60092
+ "required": [
60093
+ "projectId"
60094
+ ],
60095
+ "additionalProperties": false,
60096
+ "$schema": "http://json-schema.org/draft-07/schema#"
60097
+ },
60098
+ "outputJsonSchema": {
60099
+ "type": "object",
60100
+ "properties": {
60101
+ "ok": {
60102
+ "type": "boolean",
60103
+ "enum": [
60104
+ true,
60105
+ false
60106
+ ]
60107
+ },
60108
+ "folders": {
60109
+ "type": "array",
60110
+ "items": {
60111
+ "type": "object",
60112
+ "properties": {
60113
+ "id": {
60114
+ "type": "string"
60115
+ },
60116
+ "projectId": {
60117
+ "type": "string"
60118
+ },
60119
+ "parentId": {
60120
+ "type": [
60121
+ "string",
60122
+ "null"
60123
+ ]
60124
+ },
60125
+ "name": {
60126
+ "type": "string"
60127
+ },
60128
+ "depth": {
60129
+ "type": "number"
60130
+ },
60131
+ "createdAt": {
60132
+ "type": "string"
60133
+ },
60134
+ "updatedAt": {
60135
+ "type": "string"
60136
+ }
60137
+ },
60138
+ "required": [
60139
+ "id",
60140
+ "projectId",
60141
+ "parentId",
60142
+ "name",
60143
+ "depth",
60144
+ "createdAt",
60145
+ "updatedAt"
60146
+ ],
60147
+ "additionalProperties": false
60148
+ }
60149
+ },
60150
+ "code": {
60151
+ "type": "string"
60152
+ },
60153
+ "error": {
60154
+ "type": "string"
60155
+ }
60156
+ },
60157
+ "required": [
60158
+ "ok"
60159
+ ],
60160
+ "additionalProperties": false,
60161
+ "$schema": "http://json-schema.org/draft-07/schema#"
60162
+ },
60163
+ "annotations": {
60164
+ "title": "List Image Folders",
60165
+ "readOnlyHint": true,
60166
+ "destructiveHint": false,
60167
+ "idempotentHint": true,
60168
+ "openWorldHint": false
60169
+ }
60170
+ },
60171
+ {
60172
+ "id": "image_asset_save",
60173
+ "upstreamName": "image_asset_save",
60174
+ "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.",
60175
+ "inputJsonSchema": {
60176
+ "type": "object",
60177
+ "properties": {
60178
+ "vault": {
60179
+ "type": "string"
60180
+ },
60181
+ "projectId": {
60182
+ "type": "string",
60183
+ "minLength": 1
60184
+ },
60185
+ "folderId": {
60186
+ "type": "string",
60187
+ "minLength": 1
60188
+ },
60189
+ "sourceUrl": {
60190
+ "type": "string",
60191
+ "format": "uri",
60192
+ "description": "Public HTTPS image URL. Private-network and redirect targets are rejected."
60193
+ },
60194
+ "artifactId": {
60195
+ "type": "string",
60196
+ "minLength": 1,
60197
+ "description": "Owned MCP Scraper artifact ID. Available through the aggregate MCP handoff."
60198
+ },
60199
+ "imageBase64": {
60200
+ "type": "string",
60201
+ "minLength": 1,
60202
+ "description": "Bounded base64 image for clients without an upload transport; maximum decoded size is 20 MiB."
60203
+ },
60204
+ "title": {
60205
+ "type": "string",
60206
+ "minLength": 1,
60207
+ "maxLength": 240
60208
+ },
60209
+ "description": {
60210
+ "type": "string",
60211
+ "maxLength": 4e3
60212
+ },
60213
+ "altText": {
60214
+ "type": "string",
60215
+ "maxLength": 2e3
60216
+ },
60217
+ "tags": {
60218
+ "type": "array",
60219
+ "items": {
60220
+ "type": "string",
60221
+ "minLength": 1,
60222
+ "maxLength": 80
60223
+ },
60224
+ "maxItems": 20
60225
+ },
60226
+ "sourceRef": {
60227
+ "type": "object",
60228
+ "additionalProperties": {
60229
+ "anyOf": [
60230
+ {
60231
+ "type": "string",
60232
+ "maxLength": 1e3
60233
+ },
60234
+ {
60235
+ "type": "number"
60236
+ },
60237
+ {
60238
+ "type": "boolean"
60239
+ },
60240
+ {
60241
+ "type": "null"
60242
+ }
60243
+ ]
60244
+ }
60245
+ },
60246
+ "idempotencyKey": {
60247
+ "type": "string",
60248
+ "minLength": 8,
60249
+ "maxLength": 200,
60250
+ "description": "Stable key for this logical save. Retrying the same request returns the same asset without another write."
60251
+ }
60252
+ },
60253
+ "required": [
60254
+ "title",
60255
+ "idempotencyKey"
60256
+ ],
60257
+ "additionalProperties": false,
60258
+ "$schema": "http://json-schema.org/draft-07/schema#"
60259
+ },
60260
+ "outputJsonSchema": {
60261
+ "type": "object",
60262
+ "properties": {
60263
+ "ok": {
60264
+ "type": "boolean",
60265
+ "enum": [
60266
+ true,
60267
+ false
60268
+ ]
60269
+ },
60270
+ "asset": {
60271
+ "type": "object",
60272
+ "properties": {
60273
+ "assetId": {
60274
+ "type": "string"
60275
+ },
60276
+ "title": {
60277
+ "type": "string"
60278
+ },
60279
+ "description": {
60280
+ "type": [
60281
+ "string",
60282
+ "null"
60283
+ ]
60284
+ },
60285
+ "altText": {
60286
+ "type": [
60287
+ "string",
60288
+ "null"
60289
+ ]
60290
+ },
60291
+ "sourceUrl": {
60292
+ "type": [
60293
+ "string",
60294
+ "null"
60295
+ ]
60296
+ },
60297
+ "sourceKind": {
60298
+ "type": "string"
60299
+ },
60300
+ "mimeType": {
60301
+ "type": "string"
60302
+ },
60303
+ "bytes": {
60304
+ "type": "number"
60305
+ },
60306
+ "width": {
60307
+ "type": "number"
60308
+ },
60309
+ "height": {
60310
+ "type": "number"
60311
+ },
60312
+ "projectId": {
60313
+ "type": [
60314
+ "string",
60315
+ "null"
60316
+ ]
60317
+ },
60318
+ "folderId": {
60319
+ "type": [
60320
+ "string",
60321
+ "null"
60322
+ ]
60323
+ },
60324
+ "tags": {
60325
+ "type": "array",
60326
+ "items": {
60327
+ "type": "string"
60328
+ }
60329
+ },
60330
+ "status": {
60331
+ "type": "string"
60332
+ },
60333
+ "embeddingStatus": {
60334
+ "type": "string"
60335
+ },
60336
+ "createdAt": {
60337
+ "type": "string"
60338
+ },
60339
+ "updatedAt": {
60340
+ "type": "string"
60341
+ },
60342
+ "preview": {
60343
+ "type": "object",
60344
+ "properties": {
60345
+ "url": {
60346
+ "type": "string",
60347
+ "format": "uri"
60348
+ },
60349
+ "expiresAt": {
60350
+ "type": "string",
60351
+ "format": "date-time"
60352
+ },
60353
+ "mimeType": {
60354
+ "type": "string",
60355
+ "const": "image/webp"
60356
+ }
60357
+ },
60358
+ "required": [
60359
+ "url",
60360
+ "expiresAt",
60361
+ "mimeType"
60362
+ ],
60363
+ "additionalProperties": false
60364
+ }
60365
+ },
60366
+ "required": [
60367
+ "assetId",
60368
+ "title",
60369
+ "description",
60370
+ "altText",
60371
+ "sourceUrl",
60372
+ "sourceKind",
60373
+ "mimeType",
60374
+ "bytes",
60375
+ "width",
60376
+ "height",
60377
+ "projectId",
60378
+ "folderId",
60379
+ "tags",
60380
+ "status",
60381
+ "embeddingStatus",
60382
+ "createdAt",
60383
+ "updatedAt"
60384
+ ],
60385
+ "additionalProperties": false
60386
+ },
60387
+ "reusedObject": {
60388
+ "type": "boolean"
60389
+ },
60390
+ "nextAction": {
60391
+ "type": "string"
60392
+ },
60393
+ "code": {
60394
+ "type": "string"
60395
+ },
60396
+ "error": {
60397
+ "type": "string"
60398
+ }
60399
+ },
60400
+ "required": [
60401
+ "ok"
60402
+ ],
60403
+ "additionalProperties": false,
60404
+ "$schema": "http://json-schema.org/draft-07/schema#"
60405
+ },
60406
+ "annotations": {
60407
+ "title": "Save Image Asset",
60408
+ "readOnlyHint": false,
60409
+ "destructiveHint": false,
60410
+ "idempotentHint": true,
60411
+ "openWorldHint": true
60412
+ }
60413
+ },
60414
+ {
60415
+ "id": "image_asset_get",
60416
+ "upstreamName": "image_asset_get",
60417
+ "description": "Read one authorized private image asset and optionally mint a five-minute preview URL. The URL is never persisted; call again after expiry.",
60418
+ "inputJsonSchema": {
60419
+ "type": "object",
60420
+ "properties": {
60421
+ "vault": {
60422
+ "type": "string"
60423
+ },
60424
+ "assetId": {
60425
+ "type": "string",
60426
+ "minLength": 1
60427
+ },
60428
+ "includePreview": {
60429
+ "type": "boolean",
60430
+ "default": true
60431
+ }
60432
+ },
60433
+ "required": [
60434
+ "assetId"
60435
+ ],
60436
+ "additionalProperties": false,
60437
+ "$schema": "http://json-schema.org/draft-07/schema#"
60438
+ },
60439
+ "outputJsonSchema": {
60440
+ "type": "object",
60441
+ "properties": {
60442
+ "ok": {
60443
+ "type": "boolean",
60444
+ "enum": [
60445
+ true,
60446
+ false
60447
+ ]
60448
+ },
60449
+ "asset": {
60450
+ "type": "object",
60451
+ "properties": {
60452
+ "assetId": {
60453
+ "type": "string"
60454
+ },
60455
+ "title": {
60456
+ "type": "string"
60457
+ },
60458
+ "description": {
60459
+ "type": [
60460
+ "string",
60461
+ "null"
60462
+ ]
60463
+ },
60464
+ "altText": {
60465
+ "type": [
60466
+ "string",
60467
+ "null"
60468
+ ]
60469
+ },
60470
+ "sourceUrl": {
60471
+ "type": [
60472
+ "string",
60473
+ "null"
60474
+ ]
60475
+ },
60476
+ "sourceKind": {
60477
+ "type": "string"
60478
+ },
60479
+ "mimeType": {
60480
+ "type": "string"
60481
+ },
60482
+ "bytes": {
60483
+ "type": "number"
60484
+ },
60485
+ "width": {
60486
+ "type": "number"
60487
+ },
60488
+ "height": {
60489
+ "type": "number"
60490
+ },
60491
+ "projectId": {
60492
+ "type": [
60493
+ "string",
60494
+ "null"
60495
+ ]
60496
+ },
60497
+ "folderId": {
60498
+ "type": [
60499
+ "string",
60500
+ "null"
60501
+ ]
60502
+ },
60503
+ "tags": {
60504
+ "type": "array",
60505
+ "items": {
60506
+ "type": "string"
60507
+ }
60508
+ },
60509
+ "status": {
60510
+ "type": "string"
60511
+ },
60512
+ "embeddingStatus": {
60513
+ "type": "string"
60514
+ },
60515
+ "createdAt": {
60516
+ "type": "string"
60517
+ },
60518
+ "updatedAt": {
60519
+ "type": "string"
60520
+ },
60521
+ "preview": {
60522
+ "type": "object",
60523
+ "properties": {
60524
+ "url": {
60525
+ "type": "string",
60526
+ "format": "uri"
60527
+ },
60528
+ "expiresAt": {
60529
+ "type": "string",
60530
+ "format": "date-time"
60531
+ },
60532
+ "mimeType": {
60533
+ "type": "string",
60534
+ "const": "image/webp"
60535
+ }
60536
+ },
60537
+ "required": [
60538
+ "url",
60539
+ "expiresAt",
60540
+ "mimeType"
60541
+ ],
60542
+ "additionalProperties": false
60543
+ }
60544
+ },
60545
+ "required": [
60546
+ "assetId",
60547
+ "title",
60548
+ "description",
60549
+ "altText",
60550
+ "sourceUrl",
60551
+ "sourceKind",
60552
+ "mimeType",
60553
+ "bytes",
60554
+ "width",
60555
+ "height",
60556
+ "projectId",
60557
+ "folderId",
60558
+ "tags",
60559
+ "status",
60560
+ "embeddingStatus",
60561
+ "createdAt",
60562
+ "updatedAt"
60563
+ ],
60564
+ "additionalProperties": false
60565
+ },
60566
+ "code": {
60567
+ "type": "string"
60568
+ },
60569
+ "error": {
60570
+ "type": "string"
60571
+ }
60572
+ },
60573
+ "required": [
60574
+ "ok"
60575
+ ],
60576
+ "additionalProperties": false,
60577
+ "$schema": "http://json-schema.org/draft-07/schema#"
60578
+ },
60579
+ "annotations": {
60580
+ "title": "Get Image Asset",
60581
+ "readOnlyHint": true,
60582
+ "destructiveHint": false,
60583
+ "idempotentHint": true,
60584
+ "openWorldHint": false
60585
+ }
60586
+ },
60587
+ {
60588
+ "id": "image_asset_list",
60589
+ "upstreamName": "image_asset_list",
60590
+ "description": "List authorized private image metadata with exact location, provenance, media, tag, and creation-time filters. Use image_asset_search for semantic retrieval.",
60591
+ "inputJsonSchema": {
60592
+ "type": "object",
60593
+ "properties": {
60594
+ "vault": {
60595
+ "type": "string"
60596
+ },
60597
+ "projectId": {
60598
+ "type": "string"
60599
+ },
60600
+ "folderId": {
60601
+ "type": "string"
60602
+ },
60603
+ "sourceKind": {
60604
+ "type": "string",
60605
+ "enum": [
60606
+ "upload",
60607
+ "scrape",
60608
+ "screenshot",
60609
+ "instagram",
60610
+ "external_url",
60611
+ "import"
60612
+ ]
60613
+ },
60614
+ "sourceHost": {
60615
+ "type": "string",
60616
+ "minLength": 1,
60617
+ "maxLength": 253
60618
+ },
60619
+ "mimeType": {
60620
+ "type": "string",
60621
+ "enum": [
60622
+ "image/jpeg",
60623
+ "image/png",
60624
+ "image/webp",
60625
+ "image/gif"
60626
+ ]
60627
+ },
60628
+ "tags": {
60629
+ "type": "array",
60630
+ "items": {
60631
+ "type": "string",
60632
+ "minLength": 1,
60633
+ "maxLength": 80
60634
+ },
60635
+ "maxItems": 20
60636
+ },
60637
+ "createdAfter": {
60638
+ "type": "string",
60639
+ "format": "date-time"
60640
+ },
60641
+ "createdBefore": {
60642
+ "type": "string",
60643
+ "format": "date-time"
60644
+ },
60645
+ "limit": {
60646
+ "type": "integer",
60647
+ "minimum": 1,
60648
+ "maximum": 100,
60649
+ "default": 30
60650
+ }
60651
+ },
60652
+ "additionalProperties": false,
60653
+ "$schema": "http://json-schema.org/draft-07/schema#"
60654
+ },
60655
+ "outputJsonSchema": {
60656
+ "type": "object",
60657
+ "properties": {
60658
+ "ok": {
60659
+ "type": "boolean",
60660
+ "enum": [
60661
+ true,
60662
+ false
60663
+ ]
60664
+ },
60665
+ "assets": {
60666
+ "type": "array",
60667
+ "items": {
60668
+ "type": "object",
60669
+ "properties": {
60670
+ "assetId": {
60671
+ "type": "string"
60672
+ },
60673
+ "title": {
60674
+ "type": "string"
60675
+ },
60676
+ "description": {
60677
+ "type": [
60678
+ "string",
60679
+ "null"
60680
+ ]
60681
+ },
60682
+ "altText": {
60683
+ "type": [
60684
+ "string",
60685
+ "null"
60686
+ ]
60687
+ },
60688
+ "sourceUrl": {
60689
+ "type": [
60690
+ "string",
60691
+ "null"
60692
+ ]
60693
+ },
60694
+ "sourceKind": {
60695
+ "type": "string"
60696
+ },
60697
+ "mimeType": {
60698
+ "type": "string"
60699
+ },
60700
+ "bytes": {
60701
+ "type": "number"
60702
+ },
60703
+ "width": {
60704
+ "type": "number"
60705
+ },
60706
+ "height": {
60707
+ "type": "number"
60708
+ },
60709
+ "projectId": {
60710
+ "type": [
60711
+ "string",
60712
+ "null"
60713
+ ]
60714
+ },
60715
+ "folderId": {
60716
+ "type": [
60717
+ "string",
60718
+ "null"
60719
+ ]
60720
+ },
60721
+ "tags": {
60722
+ "type": "array",
60723
+ "items": {
60724
+ "type": "string"
60725
+ }
60726
+ },
60727
+ "status": {
60728
+ "type": "string"
60729
+ },
60730
+ "embeddingStatus": {
60731
+ "type": "string"
60732
+ },
60733
+ "createdAt": {
60734
+ "type": "string"
60735
+ },
60736
+ "updatedAt": {
60737
+ "type": "string"
60738
+ },
60739
+ "preview": {
60740
+ "type": "object",
60741
+ "properties": {
60742
+ "url": {
60743
+ "type": "string",
60744
+ "format": "uri"
60745
+ },
60746
+ "expiresAt": {
60747
+ "type": "string",
60748
+ "format": "date-time"
60749
+ },
60750
+ "mimeType": {
60751
+ "type": "string",
60752
+ "const": "image/webp"
60753
+ }
60754
+ },
60755
+ "required": [
60756
+ "url",
60757
+ "expiresAt",
60758
+ "mimeType"
60759
+ ],
60760
+ "additionalProperties": false
60761
+ }
60762
+ },
60763
+ "required": [
60764
+ "assetId",
60765
+ "title",
60766
+ "description",
60767
+ "altText",
60768
+ "sourceUrl",
60769
+ "sourceKind",
60770
+ "mimeType",
60771
+ "bytes",
60772
+ "width",
60773
+ "height",
60774
+ "projectId",
60775
+ "folderId",
60776
+ "tags",
60777
+ "status",
60778
+ "embeddingStatus",
60779
+ "createdAt",
60780
+ "updatedAt"
60781
+ ],
60782
+ "additionalProperties": false
60783
+ }
60784
+ },
60785
+ "count": {
60786
+ "type": "number"
60787
+ },
60788
+ "code": {
60789
+ "type": "string"
60790
+ },
60791
+ "error": {
60792
+ "type": "string"
60793
+ }
60794
+ },
60795
+ "required": [
60796
+ "ok"
60797
+ ],
60798
+ "additionalProperties": false,
60799
+ "$schema": "http://json-schema.org/draft-07/schema#"
60800
+ },
60801
+ "annotations": {
60802
+ "title": "List Image Assets",
60803
+ "readOnlyHint": true,
60804
+ "destructiveHint": false,
60805
+ "idempotentHint": true,
60806
+ "openWorldHint": false
60807
+ }
60808
+ },
60809
+ {
60810
+ "id": "image_asset_search",
60811
+ "upstreamName": "image_asset_search",
60812
+ "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.",
60813
+ "inputJsonSchema": {
60814
+ "type": "object",
60815
+ "properties": {
60816
+ "vault": {
60817
+ "type": "string"
60818
+ },
60819
+ "queryText": {
60820
+ "type": "string",
60821
+ "minLength": 1,
60822
+ "maxLength": 4e3
60823
+ },
60824
+ "queryAssetId": {
60825
+ "type": "string",
60826
+ "minLength": 1
60827
+ },
60828
+ "queryUrl": {
60829
+ "type": "string",
60830
+ "format": "uri"
60831
+ },
60832
+ "queryImageBase64": {
60833
+ "type": "string",
60834
+ "minLength": 1
60835
+ },
60836
+ "projectId": {
60837
+ "type": "string"
60838
+ },
60839
+ "folderId": {
60840
+ "type": "string"
60841
+ },
60842
+ "sourceKind": {
60843
+ "type": "string",
60844
+ "enum": [
60845
+ "upload",
60846
+ "scrape",
60847
+ "screenshot",
60848
+ "instagram",
60849
+ "external_url",
60850
+ "import"
60851
+ ]
60852
+ },
60853
+ "sourceHost": {
60854
+ "type": "string",
60855
+ "minLength": 1,
60856
+ "maxLength": 253
60857
+ },
60858
+ "mimeType": {
60859
+ "type": "string",
60860
+ "enum": [
60861
+ "image/jpeg",
60862
+ "image/png",
60863
+ "image/webp",
60864
+ "image/gif"
60865
+ ]
60866
+ },
60867
+ "tags": {
60868
+ "type": "array",
60869
+ "items": {
60870
+ "type": "string",
60871
+ "minLength": 1,
60872
+ "maxLength": 80
60873
+ },
60874
+ "maxItems": 20
60875
+ },
60876
+ "createdAfter": {
60877
+ "type": "string",
60878
+ "format": "date-time"
60879
+ },
60880
+ "createdBefore": {
60881
+ "type": "string",
60882
+ "format": "date-time"
60883
+ },
60884
+ "limit": {
60885
+ "type": "integer",
60886
+ "minimum": 1,
60887
+ "maximum": 30,
60888
+ "default": 10
60889
+ },
60890
+ "includePreview": {
60891
+ "type": "boolean",
60892
+ "default": false
60893
+ }
60894
+ },
60895
+ "additionalProperties": false,
60896
+ "$schema": "http://json-schema.org/draft-07/schema#"
60897
+ },
60898
+ "outputJsonSchema": {
60899
+ "type": "object",
60900
+ "properties": {
60901
+ "ok": {
60902
+ "type": "boolean",
60903
+ "enum": [
60904
+ true,
60905
+ false
60906
+ ]
60907
+ },
60908
+ "results": {
60909
+ "type": "array",
60910
+ "items": {
60911
+ "type": "object",
60912
+ "properties": {
60913
+ "asset": {
60914
+ "type": "object",
60915
+ "properties": {
60916
+ "assetId": {
60917
+ "type": "string"
60918
+ },
60919
+ "title": {
60920
+ "type": "string"
60921
+ },
60922
+ "description": {
60923
+ "type": [
60924
+ "string",
60925
+ "null"
60926
+ ]
60927
+ },
60928
+ "altText": {
60929
+ "type": [
60930
+ "string",
60931
+ "null"
60932
+ ]
60933
+ },
60934
+ "sourceUrl": {
60935
+ "type": [
60936
+ "string",
60937
+ "null"
60938
+ ]
60939
+ },
60940
+ "sourceKind": {
60941
+ "type": "string"
60942
+ },
60943
+ "mimeType": {
60944
+ "type": "string"
60945
+ },
60946
+ "bytes": {
60947
+ "type": "number"
60948
+ },
60949
+ "width": {
60950
+ "type": "number"
60951
+ },
60952
+ "height": {
60953
+ "type": "number"
60954
+ },
60955
+ "projectId": {
60956
+ "type": [
60957
+ "string",
60958
+ "null"
60959
+ ]
60960
+ },
60961
+ "folderId": {
60962
+ "type": [
60963
+ "string",
60964
+ "null"
60965
+ ]
60966
+ },
60967
+ "tags": {
60968
+ "type": "array",
60969
+ "items": {
60970
+ "type": "string"
60971
+ }
60972
+ },
60973
+ "status": {
60974
+ "type": "string"
60975
+ },
60976
+ "embeddingStatus": {
60977
+ "type": "string"
60978
+ },
60979
+ "createdAt": {
60980
+ "type": "string"
60981
+ },
60982
+ "updatedAt": {
60983
+ "type": "string"
60984
+ },
60985
+ "preview": {
60986
+ "type": "object",
60987
+ "properties": {
60988
+ "url": {
60989
+ "type": "string",
60990
+ "format": "uri"
60991
+ },
60992
+ "expiresAt": {
60993
+ "type": "string",
60994
+ "format": "date-time"
60995
+ },
60996
+ "mimeType": {
60997
+ "type": "string",
60998
+ "const": "image/webp"
60999
+ }
61000
+ },
61001
+ "required": [
61002
+ "url",
61003
+ "expiresAt",
61004
+ "mimeType"
61005
+ ],
61006
+ "additionalProperties": false
61007
+ }
61008
+ },
61009
+ "required": [
61010
+ "assetId",
61011
+ "title",
61012
+ "description",
61013
+ "altText",
61014
+ "sourceUrl",
61015
+ "sourceKind",
61016
+ "mimeType",
61017
+ "bytes",
61018
+ "width",
61019
+ "height",
61020
+ "projectId",
61021
+ "folderId",
61022
+ "tags",
61023
+ "status",
61024
+ "embeddingStatus",
61025
+ "createdAt",
61026
+ "updatedAt"
61027
+ ],
61028
+ "additionalProperties": false
61029
+ },
61030
+ "score": {
61031
+ "type": "number"
61032
+ },
61033
+ "matchRepresentations": {
61034
+ "type": "array",
61035
+ "items": {
61036
+ "type": "string",
61037
+ "enum": [
61038
+ "visual",
61039
+ "fused"
61040
+ ]
61041
+ }
61042
+ },
61043
+ "embeddingModel": {
61044
+ "type": "string"
61045
+ }
61046
+ },
61047
+ "required": [
61048
+ "asset",
61049
+ "score",
61050
+ "matchRepresentations",
61051
+ "embeddingModel"
61052
+ ],
61053
+ "additionalProperties": false
61054
+ }
61055
+ },
61056
+ "count": {
61057
+ "type": "number"
61058
+ },
61059
+ "code": {
61060
+ "type": "string"
61061
+ },
61062
+ "error": {
61063
+ "type": "string"
61064
+ }
61065
+ },
61066
+ "required": [
61067
+ "ok"
61068
+ ],
61069
+ "additionalProperties": false,
61070
+ "$schema": "http://json-schema.org/draft-07/schema#"
61071
+ },
61072
+ "annotations": {
61073
+ "title": "Search Image Assets",
61074
+ "readOnlyHint": true,
61075
+ "destructiveHint": false,
61076
+ "idempotentHint": true,
61077
+ "openWorldHint": true
61078
+ }
61079
+ },
61080
+ {
61081
+ "id": "image_asset_move",
61082
+ "upstreamName": "image_asset_move",
61083
+ "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.",
61084
+ "inputJsonSchema": {
61085
+ "type": "object",
61086
+ "properties": {
61087
+ "vault": {
61088
+ "type": "string"
61089
+ },
61090
+ "assetId": {
61091
+ "type": "string",
61092
+ "minLength": 1
61093
+ },
61094
+ "projectId": {
61095
+ "anyOf": [
61096
+ {
61097
+ "type": "string",
61098
+ "minLength": 1
61099
+ },
61100
+ {
61101
+ "type": "null"
61102
+ }
61103
+ ]
61104
+ },
61105
+ "folderId": {
61106
+ "anyOf": [
61107
+ {
61108
+ "type": "string",
61109
+ "minLength": 1
61110
+ },
61111
+ {
61112
+ "type": "null"
61113
+ }
61114
+ ]
61115
+ }
61116
+ },
61117
+ "required": [
61118
+ "assetId"
61119
+ ],
61120
+ "additionalProperties": false,
61121
+ "$schema": "http://json-schema.org/draft-07/schema#"
61122
+ },
61123
+ "outputJsonSchema": {
61124
+ "type": "object",
61125
+ "properties": {
61126
+ "ok": {
61127
+ "type": "boolean",
61128
+ "enum": [
61129
+ true,
61130
+ false
61131
+ ]
61132
+ },
61133
+ "asset": {
61134
+ "type": "object",
61135
+ "properties": {
61136
+ "assetId": {
61137
+ "type": "string"
61138
+ },
61139
+ "title": {
61140
+ "type": "string"
61141
+ },
61142
+ "description": {
61143
+ "type": [
61144
+ "string",
61145
+ "null"
61146
+ ]
61147
+ },
61148
+ "altText": {
61149
+ "type": [
61150
+ "string",
61151
+ "null"
61152
+ ]
61153
+ },
61154
+ "sourceUrl": {
61155
+ "type": [
61156
+ "string",
61157
+ "null"
61158
+ ]
61159
+ },
61160
+ "sourceKind": {
61161
+ "type": "string"
61162
+ },
61163
+ "mimeType": {
61164
+ "type": "string"
61165
+ },
61166
+ "bytes": {
61167
+ "type": "number"
61168
+ },
61169
+ "width": {
61170
+ "type": "number"
61171
+ },
61172
+ "height": {
61173
+ "type": "number"
61174
+ },
61175
+ "projectId": {
61176
+ "type": [
61177
+ "string",
61178
+ "null"
61179
+ ]
61180
+ },
61181
+ "folderId": {
61182
+ "type": [
61183
+ "string",
61184
+ "null"
61185
+ ]
61186
+ },
61187
+ "tags": {
61188
+ "type": "array",
61189
+ "items": {
61190
+ "type": "string"
61191
+ }
61192
+ },
61193
+ "status": {
61194
+ "type": "string"
61195
+ },
61196
+ "embeddingStatus": {
61197
+ "type": "string"
61198
+ },
61199
+ "createdAt": {
61200
+ "type": "string"
61201
+ },
61202
+ "updatedAt": {
61203
+ "type": "string"
61204
+ },
61205
+ "preview": {
61206
+ "type": "object",
61207
+ "properties": {
61208
+ "url": {
61209
+ "type": "string",
61210
+ "format": "uri"
61211
+ },
61212
+ "expiresAt": {
61213
+ "type": "string",
61214
+ "format": "date-time"
61215
+ },
61216
+ "mimeType": {
61217
+ "type": "string",
61218
+ "const": "image/webp"
61219
+ }
61220
+ },
61221
+ "required": [
61222
+ "url",
61223
+ "expiresAt",
61224
+ "mimeType"
61225
+ ],
61226
+ "additionalProperties": false
61227
+ }
61228
+ },
61229
+ "required": [
61230
+ "assetId",
61231
+ "title",
61232
+ "description",
61233
+ "altText",
61234
+ "sourceUrl",
61235
+ "sourceKind",
61236
+ "mimeType",
61237
+ "bytes",
61238
+ "width",
61239
+ "height",
61240
+ "projectId",
61241
+ "folderId",
61242
+ "tags",
61243
+ "status",
61244
+ "embeddingStatus",
61245
+ "createdAt",
61246
+ "updatedAt"
61247
+ ],
61248
+ "additionalProperties": false
61249
+ },
61250
+ "code": {
61251
+ "type": "string"
61252
+ },
61253
+ "error": {
61254
+ "type": "string"
61255
+ }
61256
+ },
61257
+ "required": [
61258
+ "ok"
61259
+ ],
61260
+ "additionalProperties": false,
61261
+ "$schema": "http://json-schema.org/draft-07/schema#"
61262
+ },
61263
+ "annotations": {
61264
+ "title": "Move Image Asset",
61265
+ "readOnlyHint": false,
61266
+ "destructiveHint": false,
61267
+ "idempotentHint": true,
61268
+ "openWorldHint": false
61269
+ }
61270
+ },
61271
+ {
61272
+ "id": "image_asset_delete",
61273
+ "upstreamName": "image_asset_delete",
61274
+ "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.",
61275
+ "inputJsonSchema": {
61276
+ "type": "object",
61277
+ "properties": {
61278
+ "vault": {
61279
+ "type": "string"
61280
+ },
61281
+ "assetId": {
61282
+ "type": "string",
61283
+ "minLength": 1
61284
+ },
61285
+ "confirmDelete": {
61286
+ "type": "boolean",
61287
+ "const": true,
61288
+ "description": "Must be true after the caller has confirmed deletion."
61289
+ }
61290
+ },
61291
+ "required": [
61292
+ "assetId",
61293
+ "confirmDelete"
61294
+ ],
61295
+ "additionalProperties": false,
61296
+ "$schema": "http://json-schema.org/draft-07/schema#"
61297
+ },
61298
+ "outputJsonSchema": {
61299
+ "type": "object",
61300
+ "properties": {
61301
+ "ok": {
61302
+ "type": "boolean",
61303
+ "enum": [
61304
+ true,
61305
+ false
61306
+ ]
61307
+ },
61308
+ "deleted": {
61309
+ "type": "boolean"
61310
+ },
61311
+ "assetId": {
61312
+ "type": "string"
61313
+ },
61314
+ "code": {
61315
+ "type": "string"
61316
+ },
61317
+ "error": {
61318
+ "type": "string"
61319
+ }
61320
+ },
61321
+ "required": [
61322
+ "ok"
61323
+ ],
61324
+ "additionalProperties": false,
61325
+ "$schema": "http://json-schema.org/draft-07/schema#"
61326
+ },
61327
+ "annotations": {
61328
+ "title": "Delete Image Asset",
61329
+ "readOnlyHint": false,
61330
+ "destructiveHint": true,
61331
+ "idempotentHint": true,
61332
+ "openWorldHint": false
61333
+ }
61334
+ }
61335
+ ];
61336
+ }
61337
+ });
61338
+
59730
61339
  // src/mcp/memory-tool-schemas.ts
59731
61340
  var import_zod50, AcceptShareSchema, ApproveSenderSchema, DeclineShareSchema, GetChatLinkSchema, GetVaultAppLinkSchema, InboxSettingsSchema, InviteAccountSchema, issueKeyTool_scopeShape, IssueKeySchema, ListApprovedSendersSchema, ListKeysSchema, NoteInboxSchema, RemoveApprovedSenderSchema, RevokeChatLinkSchema, RevokeKeySchema, RevokeShareSchema, RevokeVaultAppLinkSchema, SetAgentIdentitySchema, SetScopeSchema, ShareNoteSchema, ShareVaultSchema, SwapVaultSchema, SwitchAccountSchema, UnlinkShareSchema, memoryCaptureTool_notePropsSchema, MemoryCaptureSchema, MemoryQuestionsSchema, PrepareMemoryWriteSchema, validateMemoryWriteTool_notePropsSchema, ValidateMemoryWriteSchema, CreateChannelSchema, GetMessageNoteSchema, ListChannelMembersSchema, ListChannelMessagesSchema, MyMentionsSchema, PollChannelSchema, PostMessageSchema, ReactMessageSchema, RemoveChannelMemberSchema, ReplyMessageSchema, factHistoryTool_entryShape, FactHistorySchema, recordFactTool_factShape, RecordFactSchema, NoteBacklinksSchema, GraphPathSchema, GraphUniverseSchema, LibraryIngestSchema, bulkDeleteNotesTool_FilterSchema, BulkDeleteNotesSchema, DeleteNoteSchema, ExportSchema, getTool_notePropsSchema, GetSchema, listNoteSchema, ListSchema, putTool_notePropsSchema, PutSchema, searchTool_primitiveValue, SearchSchema, SuggestSchema, UploadSchema, TemporalRecallSchema, ScheduledArtifactSelectionSchema2, CreateScheduledActionSchema, UpdateScheduledActionSchema, DeleteScheduledActionSchema, GetScheduleLinkSchema, GetScheduleStatusSchema, ListScheduledActionsSchema, PauseScheduledActionSchema, ProposeScheduledActionSchema, ResumeScheduledActionSchema, RevokeScheduleLinkSchema, SetScheduleDefaultsSchema, SetScheduleEntitlementSchema, CostUsageSchema, StorageUsageSchema, CreateTableSchema, deleteTableRowsTool_FilterSchema, DeleteTableRowsSchema, DescribeTableSchema, DropTableSchema, InsertTableRowsSchema, ListTablesSchema, queryTableTool_FilterSchema, QueryTableSchema, ListTagsSchema, MergeTagsSchema, ResolveTagsSchema, UpsertTagSchema, AddVaultSchema, CreateSecureVaultSchema, DeleteVaultSchema, GetVaultContractSchema, ListSharedWithMeSchema, ListVaultsSchema, ProvisionDefaultsSchema, RouteMemorySchema, VideoAnalyzeStartSchema, VideoAnalyzeStatusSchema, CreateWebhookSchema, ListWebhooksSchema, RevokeWebhookSchema, MEMORY_TOOL_SCHEMAS;
59732
61341
  var init_memory_tool_schemas = __esm({
@@ -62256,11 +63865,11 @@ var init_memory_tool_schemas = __esm({
62256
63865
  });
62257
63866
 
62258
63867
  // src/mcp/memory-tool-registry.ts
62259
- var import_image_assets, MEMORY_TOOL_DESCRIPTION_OVERRIDES, MEMORY_TOOL_REGISTRY;
63868
+ var MEMORY_TOOL_DESCRIPTION_OVERRIDES, MEMORY_TOOL_REGISTRY;
62260
63869
  var init_memory_tool_registry = __esm({
62261
63870
  "src/mcp/memory-tool-registry.ts"() {
62262
63871
  "use strict";
62263
- import_image_assets = require("mcpscraper-memory-tools/tools/assets/image-assets");
63872
+ init_memory_image_tool_schemas_generated();
62264
63873
  init_memory_tool_schemas();
62265
63874
  MEMORY_TOOL_DESCRIPTION_OVERRIDES = {
62266
63875
  "access-swap-vault": "Set the account's persisted active vault so later memory calls may omit vault and use it by default across stateless requests. The vault must be entitled to the key and the key must hold 'swap' scope."
@@ -62270,7 +63879,7 @@ var init_memory_tool_registry = __esm({
62270
63879
  ...schema,
62271
63880
  description: MEMORY_TOOL_DESCRIPTION_OVERRIDES[schema.id] ?? schema.description
62272
63881
  })),
62273
- ...import_image_assets.IMAGE_ASSET_MCP_DEFINITIONS
63882
+ ...MEMORY_IMAGE_TOOL_SCHEMAS
62274
63883
  ];
62275
63884
  }
62276
63885
  });
@@ -87558,8 +89167,6 @@ var init_server = __esm({
87558
89167
  if (checked.error) return c.json({ error: checked.error }, 400);
87559
89168
  body.callback_url = checked.parsed?.href;
87560
89169
  }
87561
- const limitErr = await checkHarvestLimits(user, c.req.header("x-mcp-scraper-concurrency-lock"));
87562
- if (limitErr) return c.json(limitErr, 429, { "Retry-After": "30" });
87563
89170
  const options = {
87564
89171
  query: body.query.trim(),
87565
89172
  location: body.location,
@@ -87581,6 +89188,26 @@ var init_server = __esm({
87581
89188
  includeAiOverview: body.includeAiOverview ?? false,
87582
89189
  includeWhatPeopleSaying: body.includeWhatPeopleSaying ?? false
87583
89190
  };
89191
+ const suppliedIdempotencyKey = c.req.header("idempotency-key") ?? c.req.header("x-idempotency-key");
89192
+ let derivedJobId = null;
89193
+ let requestFingerprint3 = null;
89194
+ if (!options.serpOnly && suppliedIdempotencyKey != null) {
89195
+ const trimmedKey = suppliedIdempotencyKey.trim();
89196
+ if (!trimmedKey || trimmedKey.length > 200) {
89197
+ return c.json({ error: "Idempotency-Key must contain 1-200 characters.", errorCode: "invalid_idempotency_key", retryable: false }, 400);
89198
+ }
89199
+ derivedJobId = `paa-${sha256Hex(`${user.id}\0${trimmedKey}`).slice(0, 24)}`;
89200
+ requestFingerprint3 = sha256Hex(JSON.stringify({ options, callbackUrl: body.callback_url ?? null }));
89201
+ const existing = await getJob(derivedJobId, user.id);
89202
+ if (existing) {
89203
+ if (existing.options.requestFingerprint !== requestFingerprint3) {
89204
+ return c.json({ error: "Idempotency-Key was already used for a different asynchronous harvest_paa call.", errorCode: "idempotency_conflict", retryable: false }, 409);
89205
+ }
89206
+ return c.json({ job_id: existing.id, status: existing.status, replayed: true }, ["done", "failed", "cancelled"].includes(existing.status) ? 200 : 202);
89207
+ }
89208
+ }
89209
+ const limitErr = await checkHarvestLimits(user, c.req.header("x-mcp-scraper-concurrency-lock"));
89210
+ if (limitErr) return c.json(limitErr, 429, { "Retry-After": "30" });
87584
89211
  const harvestCost = options.serpOnly ? MC_COSTS.serp_headful : paaCostForQuestionCount2(options.maxQuestions);
87585
89212
  let jobId2;
87586
89213
  if (options.serpOnly) {
@@ -87593,7 +89220,7 @@ var init_server = __esm({
87593
89220
  if (!harvestOk) return c.json(insufficientBalanceResponse(harvestBal, harvestCost), 402);
87594
89221
  jobId2 = await createJob(user.id, options.query, { ...options, billingHoldMc: harvestCost }, body.callback_url);
87595
89222
  } else {
87596
- jobId2 = (0, import_node_crypto72.randomUUID)();
89223
+ jobId2 = derivedJobId ?? (0, import_node_crypto72.randomUUID)();
87597
89224
  const billingDebitKey = `paa-harvest:${jobId2}:hold`;
87598
89225
  const description = `PAA harvest: ${options.query}`.slice(0, 500);
87599
89226
  const hold = await debitMcIdempotent(
@@ -87609,9 +89236,14 @@ var init_server = __esm({
87609
89236
  ...options,
87610
89237
  executionOwner: "inngest",
87611
89238
  billingHoldMc: harvestCost,
87612
- billingDebitKey
89239
+ billingDebitKey,
89240
+ ...requestFingerprint3 ? { requestFingerprint: requestFingerprint3 } : {}
87613
89241
  }, body.callback_url);
87614
89242
  } catch (error) {
89243
+ const existing = derivedJobId ? await getJob(derivedJobId, user.id).catch(() => null) : null;
89244
+ if (existing && existing.options.requestFingerprint === requestFingerprint3) {
89245
+ return c.json({ job_id: existing.id, status: existing.status, replayed: true }, 202);
89246
+ }
87615
89247
  await settleDebitMcIdempotent(
87616
89248
  user.id,
87617
89249
  billingDebitKey,
@@ -89424,4 +91056,3 @@ async function main() {
89424
91056
  }
89425
91057
  }
89426
91058
  void main();
89427
- //# sourceMappingURL=api-server.cjs.map