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
@@ -5,16 +5,16 @@ import {
5
5
  renderImageSection,
6
6
  renderIssueReport,
7
7
  renderLinkReport
8
- } from "./chunk-X7UG2JCF.js";
8
+ } from "./chunk-PGJQDMC2.js";
9
9
  import {
10
10
  sanitizeOutboundDiagnostics
11
- } from "./chunk-VIWT35S6.js";
11
+ } from "./chunk-4OT7BAIE.js";
12
12
  import {
13
13
  browserServiceProfileName,
14
14
  browserServiceProfileSaveChanges,
15
15
  recordVendorUsage,
16
16
  vendorCostUsd
17
- } from "./chunk-4LINSJNI.js";
17
+ } from "./chunk-TNLGHNLX.js";
18
18
  import {
19
19
  buildSerpEmailQuery,
20
20
  classifyEmailScope,
@@ -22,34 +22,34 @@ import {
22
22
  extractContactEvidence,
23
23
  extractSerpEmailEvidence,
24
24
  selectPrimaryEmail
25
- } from "./chunk-WD73OFL3.js";
25
+ } from "./chunk-VXLU74YZ.js";
26
26
  import {
27
27
  PACKAGE_VERSION
28
- } from "./chunk-HDYOVGC6.js";
28
+ } from "./chunk-VRJ7CO6L.js";
29
29
  import {
30
30
  createPrivateArtifact,
31
31
  privateArtifactOwnerId,
32
32
  readPrivateArtifactWindow,
33
33
  renewPrivateArtifactDownload
34
- } from "./chunk-EKJ65E3Z.js";
34
+ } from "./chunk-DNM65UCK.js";
35
35
  import {
36
36
  MC_PER_CREDIT,
37
37
  PAA_BASE_CREDITS,
38
38
  PAA_QUESTION_CREDITS,
39
39
  PAGE_SCRAPE_CREDITS,
40
40
  SERP_SEARCH_CREDITS
41
- } from "./chunk-2XUXVKT4.js";
41
+ } from "./chunk-AYJHI2FK.js";
42
42
  import {
43
43
  PUBLIC_ERROR_CODES,
44
44
  buildPublicErrorEnvelope,
45
45
  normalizePublicErrorCode,
46
46
  publicErrorMessage,
47
47
  sanitizeVendorName
48
- } from "./chunk-4VG3NUUY.js";
48
+ } from "./chunk-GTGSD4YS.js";
49
49
 
50
50
  // src/harvest-timeout.ts
51
51
  var SCRAPE_FUNCTION_MAX_MS = 8e5;
52
- var DEFAULT_TOOL_CLIENT_TIMEOUT_MS = 3e5;
52
+ var DEFAULT_TOOL_CLIENT_TIMEOUT_MS = 59e4;
53
53
  var CLIENT_OVER_SERVER_MARGIN_MS = 15e3;
54
54
  function harvestTimeoutBudget(maxQuestions, serpOnly = false) {
55
55
  const requested = Number.isFinite(maxQuestions) && maxQuestions > 0 ? Math.trunc(maxQuestions) : 30;
@@ -10419,7 +10419,7 @@ function decodeTaskHandle(taskId, secret, ownerId) {
10419
10419
  decipher.update(ciphertext),
10420
10420
  decipher.final()
10421
10421
  ]).toString("utf8"));
10422
- 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");
10422
+ 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");
10423
10423
  if (Date.now() > parsed.expiresAtMs) {
10424
10424
  throw new ProtocolError(TASK_INVALID_PARAMS, "Failed to retrieve task: Task has expired");
10425
10425
  }
@@ -10432,9 +10432,25 @@ function decodeTaskHandle(taskId, secret, ownerId) {
10432
10432
  function objectValue(value) {
10433
10433
  return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
10434
10434
  }
10435
- function taskSeed(kind, result) {
10435
+ function resultValue(result) {
10436
10436
  const structured = objectValue(result.structuredContent);
10437
+ if (structured) return structured;
10438
+ const block = result.content.find((item) => item.type === "text");
10439
+ if (!block || block.type !== "text") return void 0;
10440
+ try {
10441
+ return objectValue(JSON.parse(block.text));
10442
+ } catch {
10443
+ return void 0;
10444
+ }
10445
+ }
10446
+ function taskSeed(kind, result) {
10447
+ const structured = resultValue(result);
10437
10448
  if (!structured || result.isError === true) return void 0;
10449
+ if (kind === "paa_harvest") {
10450
+ const operationId2 = structured.job_id ?? structured.jobId;
10451
+ if (typeof operationId2 !== "string" || !["pending", "running"].includes(String(structured.status))) return void 0;
10452
+ return { kind, operationId: operationId2, statusMessage: "PAA harvest started. Progress will be preserved while the client polls this Task." };
10453
+ }
10438
10454
  if (kind === "site_export") {
10439
10455
  const operationId2 = structured.jobId;
10440
10456
  if (typeof operationId2 !== "string" || structured.status !== "pending") return void 0;
@@ -10465,10 +10481,13 @@ function taskBase(payload, taskId) {
10465
10481
  };
10466
10482
  }
10467
10483
  function statusFrom(result) {
10468
- const status = objectValue(result.structuredContent)?.status;
10484
+ const status = resultValue(result)?.status;
10469
10485
  return typeof status === "string" ? status : void 0;
10470
10486
  }
10471
10487
  async function pollTask(executor, payload) {
10488
+ if (payload.kind === "paa_harvest") {
10489
+ return executor.harvestPaaStatus({ jobId: payload.operationId });
10490
+ }
10472
10491
  if (payload.kind === "site_export") {
10473
10492
  return executor.checkSiteExport({ jobId: payload.operationId });
10474
10493
  }
@@ -10480,6 +10499,30 @@ async function pollTask(executor, payload) {
10480
10499
  }
10481
10500
  return executor.videoFrameAnalysisStatus({ runId: payload.operationId });
10482
10501
  }
10502
+ function taskProgressMessage(kind, result, status) {
10503
+ const value = resultValue(result) ?? {};
10504
+ if (kind === "paa_harvest") {
10505
+ const resultRecord = objectValue(value.result) ?? {};
10506
+ const progress = objectValue(resultRecord.progress) ?? {};
10507
+ const records = Array.isArray(progress.records) ? progress.records.length : 0;
10508
+ const attempts = Array.isArray(value.attempts) ? value.attempts.length : 0;
10509
+ const pieces = [records > 0 ? `${records} questions preserved` : null, attempts > 0 ? `${attempts} attempts recorded` : null].filter(Boolean);
10510
+ return pieces.length > 0 ? `PAA harvest is ${status ?? "running"}: ${pieces.join(", ")}.` : `PAA harvest is ${status ?? "running"}; no question checkpoint has been persisted yet.`;
10511
+ }
10512
+ if (kind === "lead_list_enrichment") {
10513
+ const progress = objectValue(value.progress) ?? {};
10514
+ const completed = typeof progress.completedRows === "number" ? progress.completedRows : null;
10515
+ const total = typeof progress.totalRows === "number" ? progress.totalRows : null;
10516
+ if (completed !== null && total !== null) return `Lead list enrichment is ${status ?? "running"}: ${completed}/${total} rows completed.`;
10517
+ }
10518
+ if (kind === "directory_workflow") {
10519
+ const progress = objectValue(value.progress) ?? {};
10520
+ const completed = typeof progress.completedCities === "number" ? progress.completedCities : null;
10521
+ const total = typeof progress.totalCities === "number" ? progress.totalCities : null;
10522
+ if (completed !== null && total !== null) return `Directory workflow is ${status ?? "running"}: ${completed}/${total} markets completed.`;
10523
+ }
10524
+ return status ? `Underlying operation status: ${status}.` : "Underlying operation is running.";
10525
+ }
10483
10526
  async function cancelTask(executor, payload) {
10484
10527
  if (payload.kind !== "lead_list_enrichment") return;
10485
10528
  const result = await executor.leadListEnrichCancel({ jobId: payload.operationId });
@@ -10496,7 +10539,7 @@ async function detailedTask(executor, taskId, options) {
10496
10539
  return {
10497
10540
  ...base,
10498
10541
  status: "working",
10499
- statusMessage: status ? `Underlying operation status: ${status}.` : "Underlying operation is running."
10542
+ statusMessage: taskProgressMessage(payload.kind, result, status)
10500
10543
  };
10501
10544
  }
10502
10545
  if (payload.kind === "lead_list_enrichment" && status === "failed") {
@@ -10507,6 +10550,22 @@ async function detailedTask(executor, taskId, options) {
10507
10550
  result
10508
10551
  };
10509
10552
  }
10553
+ if (payload.kind === "paa_harvest" && status === "failed") {
10554
+ return {
10555
+ ...base,
10556
+ status: "failed",
10557
+ statusMessage: "PAA harvest failed; persisted attempts and billing state are included in the result.",
10558
+ result
10559
+ };
10560
+ }
10561
+ if (payload.kind === "paa_harvest" && status === "cancelled") {
10562
+ return {
10563
+ ...base,
10564
+ status: "cancelled",
10565
+ statusMessage: "PAA harvest was cancelled.",
10566
+ result
10567
+ };
10568
+ }
10510
10569
  if (payload.kind === "lead_list_enrichment" && status === "cancelled") {
10511
10570
  return {
10512
10571
  ...base,
@@ -10523,6 +10582,7 @@ async function detailedTask(executor, taskId, options) {
10523
10582
  };
10524
10583
  }
10525
10584
  function isWorking(kind, status) {
10585
+ if (kind === "paa_harvest") return status === "pending" || status === "running";
10526
10586
  if (kind === "site_export") return status === "pending" || status === "running";
10527
10587
  if (kind === "directory_workflow") return status === "queued" || status === "running";
10528
10588
  if (kind === "lead_list_enrichment") return status === "queued" || status === "running";
@@ -10554,6 +10614,9 @@ function registerMcpTasksExtension(server, executor, options) {
10554
10614
  return {};
10555
10615
  });
10556
10616
  return {
10617
+ supportsTasks() {
10618
+ return hasTasksCapability(server.server.getClientCapabilities());
10619
+ },
10557
10620
  taskify(kind, result) {
10558
10621
  if (!hasTasksCapability(server.server.getClientCapabilities())) return result;
10559
10622
  const seed = taskSeed(kind, result);
@@ -11082,7 +11145,12 @@ function registerPaaExtractorMcpTools(server, executor, options = {}) {
11082
11145
  inputSchema: harvestPaaInputSchema,
11083
11146
  outputSchema: recordOutputSchema("harvest_paa", HarvestPaaOutputSchema),
11084
11147
  annotations: liveWebToolAnnotations("Google PAA + SERP Harvest")
11085
- }, async (input) => formatHarvestPaa(await executor.harvestPaa(input), input));
11148
+ }, async (input, requestContext) => {
11149
+ if (tasks.supportsTasks()) {
11150
+ return tasks.taskify("paa_harvest", await executor.startHarvestPaa(input), requestContext);
11151
+ }
11152
+ return formatHarvestPaa(await executor.harvestPaa(input), input);
11153
+ });
11086
11154
  server.registerTool("search_serp", {
11087
11155
  title: "Google SERP Lookup",
11088
11156
  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.`,
@@ -12047,7 +12115,7 @@ var HttpMcpToolExecutor = class {
12047
12115
  retryable: true,
12048
12116
  path,
12049
12117
  timeoutMs,
12050
- 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}`
12118
+ 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}`
12051
12119
  })
12052
12120
  }],
12053
12121
  isError: true
@@ -12133,6 +12201,13 @@ var HttpMcpToolExecutor = class {
12133
12201
  const headers = input.idempotencyKey ? { "Idempotency-Key": input.idempotencyKey } : {};
12134
12202
  return this.call("/harvest/sync", input, timeoutMs, "POST", headers, true);
12135
12203
  }
12204
+ startHarvestPaa(input) {
12205
+ const headers = input.idempotencyKey ? { "Idempotency-Key": input.idempotencyKey } : {};
12206
+ return this.call("/harvest", input, this.timeoutMs, "POST", headers, true);
12207
+ }
12208
+ harvestPaaStatus(input) {
12209
+ return this.getJson(`/jobs/${encodeURIComponent(input.jobId)}`);
12210
+ }
12136
12211
  searchSerp(input) {
12137
12212
  const timeoutMs = this.httpTimeoutOverrideMs ?? harvestTimeoutBudget(0, true).clientMs;
12138
12213
  const headers = input.idempotencyKey ? { "Idempotency-Key": input.idempotencyKey } : {};
@@ -14335,8 +14410,1532 @@ function registerBrowserAgentMcpTools(server, opts) {
14335
14410
  // src/mcp/memory-mcp-server.ts
14336
14411
  import { fromJsonSchema } from "@modelcontextprotocol/server";
14337
14412
 
14338
- // src/mcp/memory-tool-registry.ts
14339
- import { IMAGE_ASSET_MCP_DEFINITIONS } from "mcpscraper-memory-tools/tools/assets/image-assets";
14413
+ // src/mcp/memory-image-tool-schemas.generated.ts
14414
+ var MEMORY_IMAGE_TOOL_SCHEMAS = [
14415
+ {
14416
+ "id": "image_project_create",
14417
+ "upstreamName": "image_project_create",
14418
+ "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.",
14419
+ "inputJsonSchema": {
14420
+ "type": "object",
14421
+ "properties": {
14422
+ "vault": {
14423
+ "type": "string",
14424
+ "description": "Writable logical Memory vault. Defaults to the active vault."
14425
+ },
14426
+ "name": {
14427
+ "type": "string",
14428
+ "minLength": 1,
14429
+ "maxLength": 120
14430
+ },
14431
+ "description": {
14432
+ "type": "string",
14433
+ "maxLength": 2e3
14434
+ }
14435
+ },
14436
+ "required": [
14437
+ "name"
14438
+ ],
14439
+ "additionalProperties": false,
14440
+ "$schema": "http://json-schema.org/draft-07/schema#"
14441
+ },
14442
+ "outputJsonSchema": {
14443
+ "type": "object",
14444
+ "properties": {
14445
+ "ok": {
14446
+ "type": "boolean",
14447
+ "enum": [
14448
+ true,
14449
+ false
14450
+ ]
14451
+ },
14452
+ "project": {
14453
+ "type": "object",
14454
+ "properties": {
14455
+ "id": {
14456
+ "type": "string"
14457
+ },
14458
+ "name": {
14459
+ "type": "string"
14460
+ },
14461
+ "description": {
14462
+ "type": [
14463
+ "string",
14464
+ "null"
14465
+ ]
14466
+ },
14467
+ "createdAt": {
14468
+ "type": "string"
14469
+ }
14470
+ },
14471
+ "required": [
14472
+ "id",
14473
+ "name",
14474
+ "description",
14475
+ "createdAt"
14476
+ ],
14477
+ "additionalProperties": false
14478
+ },
14479
+ "code": {
14480
+ "type": "string"
14481
+ },
14482
+ "error": {
14483
+ "type": "string"
14484
+ }
14485
+ },
14486
+ "required": [
14487
+ "ok"
14488
+ ],
14489
+ "additionalProperties": false,
14490
+ "$schema": "http://json-schema.org/draft-07/schema#"
14491
+ },
14492
+ "annotations": {
14493
+ "title": "Create Image Project",
14494
+ "readOnlyHint": false,
14495
+ "destructiveHint": false,
14496
+ "idempotentHint": false,
14497
+ "openWorldHint": false
14498
+ }
14499
+ },
14500
+ {
14501
+ "id": "image_project_list",
14502
+ "upstreamName": "image_project_list",
14503
+ "description": "List image projects in an accessible hosted Memory vault. Returns organization metadata only, never object-store keys.",
14504
+ "inputJsonSchema": {
14505
+ "type": "object",
14506
+ "properties": {
14507
+ "vault": {
14508
+ "type": "string"
14509
+ }
14510
+ },
14511
+ "additionalProperties": false,
14512
+ "$schema": "http://json-schema.org/draft-07/schema#"
14513
+ },
14514
+ "outputJsonSchema": {
14515
+ "type": "object",
14516
+ "properties": {
14517
+ "ok": {
14518
+ "type": "boolean",
14519
+ "enum": [
14520
+ true,
14521
+ false
14522
+ ]
14523
+ },
14524
+ "projects": {
14525
+ "type": "array",
14526
+ "items": {
14527
+ "type": "object",
14528
+ "properties": {
14529
+ "id": {
14530
+ "type": "string"
14531
+ },
14532
+ "name": {
14533
+ "type": "string"
14534
+ },
14535
+ "description": {
14536
+ "type": [
14537
+ "string",
14538
+ "null"
14539
+ ]
14540
+ },
14541
+ "status": {
14542
+ "type": "string"
14543
+ },
14544
+ "createdAt": {
14545
+ "type": "string"
14546
+ },
14547
+ "updatedAt": {
14548
+ "type": "string"
14549
+ }
14550
+ },
14551
+ "required": [
14552
+ "id",
14553
+ "name",
14554
+ "description",
14555
+ "status",
14556
+ "createdAt",
14557
+ "updatedAt"
14558
+ ],
14559
+ "additionalProperties": false
14560
+ }
14561
+ },
14562
+ "code": {
14563
+ "type": "string"
14564
+ },
14565
+ "error": {
14566
+ "type": "string"
14567
+ }
14568
+ },
14569
+ "required": [
14570
+ "ok"
14571
+ ],
14572
+ "additionalProperties": false,
14573
+ "$schema": "http://json-schema.org/draft-07/schema#"
14574
+ },
14575
+ "annotations": {
14576
+ "title": "List Image Projects",
14577
+ "readOnlyHint": true,
14578
+ "destructiveHint": false,
14579
+ "idempotentHint": true,
14580
+ "openWorldHint": false
14581
+ }
14582
+ },
14583
+ {
14584
+ "id": "image_folder_create",
14585
+ "upstreamName": "image_folder_create",
14586
+ "description": "Create a nested image folder inside one writable Memory image project. Maximum nesting depth is eight; this changes logical organization only.",
14587
+ "inputJsonSchema": {
14588
+ "type": "object",
14589
+ "properties": {
14590
+ "vault": {
14591
+ "type": "string"
14592
+ },
14593
+ "projectId": {
14594
+ "type": "string",
14595
+ "minLength": 1
14596
+ },
14597
+ "parentId": {
14598
+ "type": "string",
14599
+ "minLength": 1
14600
+ },
14601
+ "name": {
14602
+ "type": "string",
14603
+ "minLength": 1,
14604
+ "maxLength": 120
14605
+ }
14606
+ },
14607
+ "required": [
14608
+ "projectId",
14609
+ "name"
14610
+ ],
14611
+ "additionalProperties": false,
14612
+ "$schema": "http://json-schema.org/draft-07/schema#"
14613
+ },
14614
+ "outputJsonSchema": {
14615
+ "type": "object",
14616
+ "properties": {
14617
+ "ok": {
14618
+ "type": "boolean",
14619
+ "enum": [
14620
+ true,
14621
+ false
14622
+ ]
14623
+ },
14624
+ "folder": {
14625
+ "type": "object",
14626
+ "properties": {
14627
+ "id": {
14628
+ "type": "string"
14629
+ },
14630
+ "projectId": {
14631
+ "type": "string"
14632
+ },
14633
+ "parentId": {
14634
+ "type": [
14635
+ "string",
14636
+ "null"
14637
+ ]
14638
+ },
14639
+ "name": {
14640
+ "type": "string"
14641
+ },
14642
+ "depth": {
14643
+ "type": "number"
14644
+ },
14645
+ "createdAt": {
14646
+ "type": "string"
14647
+ }
14648
+ },
14649
+ "required": [
14650
+ "id",
14651
+ "projectId",
14652
+ "parentId",
14653
+ "name",
14654
+ "depth",
14655
+ "createdAt"
14656
+ ],
14657
+ "additionalProperties": false
14658
+ },
14659
+ "code": {
14660
+ "type": "string"
14661
+ },
14662
+ "error": {
14663
+ "type": "string"
14664
+ }
14665
+ },
14666
+ "required": [
14667
+ "ok"
14668
+ ],
14669
+ "additionalProperties": false,
14670
+ "$schema": "http://json-schema.org/draft-07/schema#"
14671
+ },
14672
+ "annotations": {
14673
+ "title": "Create Image Folder",
14674
+ "readOnlyHint": false,
14675
+ "destructiveHint": false,
14676
+ "idempotentHint": false,
14677
+ "openWorldHint": false
14678
+ }
14679
+ },
14680
+ {
14681
+ "id": "image_folder_list",
14682
+ "upstreamName": "image_folder_list",
14683
+ "description": "List the bounded folder tree for one accessible Memory image project.",
14684
+ "inputJsonSchema": {
14685
+ "type": "object",
14686
+ "properties": {
14687
+ "vault": {
14688
+ "type": "string"
14689
+ },
14690
+ "projectId": {
14691
+ "type": "string",
14692
+ "minLength": 1
14693
+ }
14694
+ },
14695
+ "required": [
14696
+ "projectId"
14697
+ ],
14698
+ "additionalProperties": false,
14699
+ "$schema": "http://json-schema.org/draft-07/schema#"
14700
+ },
14701
+ "outputJsonSchema": {
14702
+ "type": "object",
14703
+ "properties": {
14704
+ "ok": {
14705
+ "type": "boolean",
14706
+ "enum": [
14707
+ true,
14708
+ false
14709
+ ]
14710
+ },
14711
+ "folders": {
14712
+ "type": "array",
14713
+ "items": {
14714
+ "type": "object",
14715
+ "properties": {
14716
+ "id": {
14717
+ "type": "string"
14718
+ },
14719
+ "projectId": {
14720
+ "type": "string"
14721
+ },
14722
+ "parentId": {
14723
+ "type": [
14724
+ "string",
14725
+ "null"
14726
+ ]
14727
+ },
14728
+ "name": {
14729
+ "type": "string"
14730
+ },
14731
+ "depth": {
14732
+ "type": "number"
14733
+ },
14734
+ "createdAt": {
14735
+ "type": "string"
14736
+ },
14737
+ "updatedAt": {
14738
+ "type": "string"
14739
+ }
14740
+ },
14741
+ "required": [
14742
+ "id",
14743
+ "projectId",
14744
+ "parentId",
14745
+ "name",
14746
+ "depth",
14747
+ "createdAt",
14748
+ "updatedAt"
14749
+ ],
14750
+ "additionalProperties": false
14751
+ }
14752
+ },
14753
+ "code": {
14754
+ "type": "string"
14755
+ },
14756
+ "error": {
14757
+ "type": "string"
14758
+ }
14759
+ },
14760
+ "required": [
14761
+ "ok"
14762
+ ],
14763
+ "additionalProperties": false,
14764
+ "$schema": "http://json-schema.org/draft-07/schema#"
14765
+ },
14766
+ "annotations": {
14767
+ "title": "List Image Folders",
14768
+ "readOnlyHint": true,
14769
+ "destructiveHint": false,
14770
+ "idempotentHint": true,
14771
+ "openWorldHint": false
14772
+ }
14773
+ },
14774
+ {
14775
+ "id": "image_asset_save",
14776
+ "upstreamName": "image_asset_save",
14777
+ "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.",
14778
+ "inputJsonSchema": {
14779
+ "type": "object",
14780
+ "properties": {
14781
+ "vault": {
14782
+ "type": "string"
14783
+ },
14784
+ "projectId": {
14785
+ "type": "string",
14786
+ "minLength": 1
14787
+ },
14788
+ "folderId": {
14789
+ "type": "string",
14790
+ "minLength": 1
14791
+ },
14792
+ "sourceUrl": {
14793
+ "type": "string",
14794
+ "format": "uri",
14795
+ "description": "Public HTTPS image URL. Private-network and redirect targets are rejected."
14796
+ },
14797
+ "artifactId": {
14798
+ "type": "string",
14799
+ "minLength": 1,
14800
+ "description": "Owned MCP Scraper artifact ID. Available through the aggregate MCP handoff."
14801
+ },
14802
+ "imageBase64": {
14803
+ "type": "string",
14804
+ "minLength": 1,
14805
+ "description": "Bounded base64 image for clients without an upload transport; maximum decoded size is 20 MiB."
14806
+ },
14807
+ "title": {
14808
+ "type": "string",
14809
+ "minLength": 1,
14810
+ "maxLength": 240
14811
+ },
14812
+ "description": {
14813
+ "type": "string",
14814
+ "maxLength": 4e3
14815
+ },
14816
+ "altText": {
14817
+ "type": "string",
14818
+ "maxLength": 2e3
14819
+ },
14820
+ "tags": {
14821
+ "type": "array",
14822
+ "items": {
14823
+ "type": "string",
14824
+ "minLength": 1,
14825
+ "maxLength": 80
14826
+ },
14827
+ "maxItems": 20
14828
+ },
14829
+ "sourceRef": {
14830
+ "type": "object",
14831
+ "additionalProperties": {
14832
+ "anyOf": [
14833
+ {
14834
+ "type": "string",
14835
+ "maxLength": 1e3
14836
+ },
14837
+ {
14838
+ "type": "number"
14839
+ },
14840
+ {
14841
+ "type": "boolean"
14842
+ },
14843
+ {
14844
+ "type": "null"
14845
+ }
14846
+ ]
14847
+ }
14848
+ },
14849
+ "idempotencyKey": {
14850
+ "type": "string",
14851
+ "minLength": 8,
14852
+ "maxLength": 200,
14853
+ "description": "Stable key for this logical save. Retrying the same request returns the same asset without another write."
14854
+ }
14855
+ },
14856
+ "required": [
14857
+ "title",
14858
+ "idempotencyKey"
14859
+ ],
14860
+ "additionalProperties": false,
14861
+ "$schema": "http://json-schema.org/draft-07/schema#"
14862
+ },
14863
+ "outputJsonSchema": {
14864
+ "type": "object",
14865
+ "properties": {
14866
+ "ok": {
14867
+ "type": "boolean",
14868
+ "enum": [
14869
+ true,
14870
+ false
14871
+ ]
14872
+ },
14873
+ "asset": {
14874
+ "type": "object",
14875
+ "properties": {
14876
+ "assetId": {
14877
+ "type": "string"
14878
+ },
14879
+ "title": {
14880
+ "type": "string"
14881
+ },
14882
+ "description": {
14883
+ "type": [
14884
+ "string",
14885
+ "null"
14886
+ ]
14887
+ },
14888
+ "altText": {
14889
+ "type": [
14890
+ "string",
14891
+ "null"
14892
+ ]
14893
+ },
14894
+ "sourceUrl": {
14895
+ "type": [
14896
+ "string",
14897
+ "null"
14898
+ ]
14899
+ },
14900
+ "sourceKind": {
14901
+ "type": "string"
14902
+ },
14903
+ "mimeType": {
14904
+ "type": "string"
14905
+ },
14906
+ "bytes": {
14907
+ "type": "number"
14908
+ },
14909
+ "width": {
14910
+ "type": "number"
14911
+ },
14912
+ "height": {
14913
+ "type": "number"
14914
+ },
14915
+ "projectId": {
14916
+ "type": [
14917
+ "string",
14918
+ "null"
14919
+ ]
14920
+ },
14921
+ "folderId": {
14922
+ "type": [
14923
+ "string",
14924
+ "null"
14925
+ ]
14926
+ },
14927
+ "tags": {
14928
+ "type": "array",
14929
+ "items": {
14930
+ "type": "string"
14931
+ }
14932
+ },
14933
+ "status": {
14934
+ "type": "string"
14935
+ },
14936
+ "embeddingStatus": {
14937
+ "type": "string"
14938
+ },
14939
+ "createdAt": {
14940
+ "type": "string"
14941
+ },
14942
+ "updatedAt": {
14943
+ "type": "string"
14944
+ },
14945
+ "preview": {
14946
+ "type": "object",
14947
+ "properties": {
14948
+ "url": {
14949
+ "type": "string",
14950
+ "format": "uri"
14951
+ },
14952
+ "expiresAt": {
14953
+ "type": "string",
14954
+ "format": "date-time"
14955
+ },
14956
+ "mimeType": {
14957
+ "type": "string",
14958
+ "const": "image/webp"
14959
+ }
14960
+ },
14961
+ "required": [
14962
+ "url",
14963
+ "expiresAt",
14964
+ "mimeType"
14965
+ ],
14966
+ "additionalProperties": false
14967
+ }
14968
+ },
14969
+ "required": [
14970
+ "assetId",
14971
+ "title",
14972
+ "description",
14973
+ "altText",
14974
+ "sourceUrl",
14975
+ "sourceKind",
14976
+ "mimeType",
14977
+ "bytes",
14978
+ "width",
14979
+ "height",
14980
+ "projectId",
14981
+ "folderId",
14982
+ "tags",
14983
+ "status",
14984
+ "embeddingStatus",
14985
+ "createdAt",
14986
+ "updatedAt"
14987
+ ],
14988
+ "additionalProperties": false
14989
+ },
14990
+ "reusedObject": {
14991
+ "type": "boolean"
14992
+ },
14993
+ "nextAction": {
14994
+ "type": "string"
14995
+ },
14996
+ "code": {
14997
+ "type": "string"
14998
+ },
14999
+ "error": {
15000
+ "type": "string"
15001
+ }
15002
+ },
15003
+ "required": [
15004
+ "ok"
15005
+ ],
15006
+ "additionalProperties": false,
15007
+ "$schema": "http://json-schema.org/draft-07/schema#"
15008
+ },
15009
+ "annotations": {
15010
+ "title": "Save Image Asset",
15011
+ "readOnlyHint": false,
15012
+ "destructiveHint": false,
15013
+ "idempotentHint": true,
15014
+ "openWorldHint": true
15015
+ }
15016
+ },
15017
+ {
15018
+ "id": "image_asset_get",
15019
+ "upstreamName": "image_asset_get",
15020
+ "description": "Read one authorized private image asset and optionally mint a five-minute preview URL. The URL is never persisted; call again after expiry.",
15021
+ "inputJsonSchema": {
15022
+ "type": "object",
15023
+ "properties": {
15024
+ "vault": {
15025
+ "type": "string"
15026
+ },
15027
+ "assetId": {
15028
+ "type": "string",
15029
+ "minLength": 1
15030
+ },
15031
+ "includePreview": {
15032
+ "type": "boolean",
15033
+ "default": true
15034
+ }
15035
+ },
15036
+ "required": [
15037
+ "assetId"
15038
+ ],
15039
+ "additionalProperties": false,
15040
+ "$schema": "http://json-schema.org/draft-07/schema#"
15041
+ },
15042
+ "outputJsonSchema": {
15043
+ "type": "object",
15044
+ "properties": {
15045
+ "ok": {
15046
+ "type": "boolean",
15047
+ "enum": [
15048
+ true,
15049
+ false
15050
+ ]
15051
+ },
15052
+ "asset": {
15053
+ "type": "object",
15054
+ "properties": {
15055
+ "assetId": {
15056
+ "type": "string"
15057
+ },
15058
+ "title": {
15059
+ "type": "string"
15060
+ },
15061
+ "description": {
15062
+ "type": [
15063
+ "string",
15064
+ "null"
15065
+ ]
15066
+ },
15067
+ "altText": {
15068
+ "type": [
15069
+ "string",
15070
+ "null"
15071
+ ]
15072
+ },
15073
+ "sourceUrl": {
15074
+ "type": [
15075
+ "string",
15076
+ "null"
15077
+ ]
15078
+ },
15079
+ "sourceKind": {
15080
+ "type": "string"
15081
+ },
15082
+ "mimeType": {
15083
+ "type": "string"
15084
+ },
15085
+ "bytes": {
15086
+ "type": "number"
15087
+ },
15088
+ "width": {
15089
+ "type": "number"
15090
+ },
15091
+ "height": {
15092
+ "type": "number"
15093
+ },
15094
+ "projectId": {
15095
+ "type": [
15096
+ "string",
15097
+ "null"
15098
+ ]
15099
+ },
15100
+ "folderId": {
15101
+ "type": [
15102
+ "string",
15103
+ "null"
15104
+ ]
15105
+ },
15106
+ "tags": {
15107
+ "type": "array",
15108
+ "items": {
15109
+ "type": "string"
15110
+ }
15111
+ },
15112
+ "status": {
15113
+ "type": "string"
15114
+ },
15115
+ "embeddingStatus": {
15116
+ "type": "string"
15117
+ },
15118
+ "createdAt": {
15119
+ "type": "string"
15120
+ },
15121
+ "updatedAt": {
15122
+ "type": "string"
15123
+ },
15124
+ "preview": {
15125
+ "type": "object",
15126
+ "properties": {
15127
+ "url": {
15128
+ "type": "string",
15129
+ "format": "uri"
15130
+ },
15131
+ "expiresAt": {
15132
+ "type": "string",
15133
+ "format": "date-time"
15134
+ },
15135
+ "mimeType": {
15136
+ "type": "string",
15137
+ "const": "image/webp"
15138
+ }
15139
+ },
15140
+ "required": [
15141
+ "url",
15142
+ "expiresAt",
15143
+ "mimeType"
15144
+ ],
15145
+ "additionalProperties": false
15146
+ }
15147
+ },
15148
+ "required": [
15149
+ "assetId",
15150
+ "title",
15151
+ "description",
15152
+ "altText",
15153
+ "sourceUrl",
15154
+ "sourceKind",
15155
+ "mimeType",
15156
+ "bytes",
15157
+ "width",
15158
+ "height",
15159
+ "projectId",
15160
+ "folderId",
15161
+ "tags",
15162
+ "status",
15163
+ "embeddingStatus",
15164
+ "createdAt",
15165
+ "updatedAt"
15166
+ ],
15167
+ "additionalProperties": false
15168
+ },
15169
+ "code": {
15170
+ "type": "string"
15171
+ },
15172
+ "error": {
15173
+ "type": "string"
15174
+ }
15175
+ },
15176
+ "required": [
15177
+ "ok"
15178
+ ],
15179
+ "additionalProperties": false,
15180
+ "$schema": "http://json-schema.org/draft-07/schema#"
15181
+ },
15182
+ "annotations": {
15183
+ "title": "Get Image Asset",
15184
+ "readOnlyHint": true,
15185
+ "destructiveHint": false,
15186
+ "idempotentHint": true,
15187
+ "openWorldHint": false
15188
+ }
15189
+ },
15190
+ {
15191
+ "id": "image_asset_list",
15192
+ "upstreamName": "image_asset_list",
15193
+ "description": "List authorized private image metadata with exact location, provenance, media, tag, and creation-time filters. Use image_asset_search for semantic retrieval.",
15194
+ "inputJsonSchema": {
15195
+ "type": "object",
15196
+ "properties": {
15197
+ "vault": {
15198
+ "type": "string"
15199
+ },
15200
+ "projectId": {
15201
+ "type": "string"
15202
+ },
15203
+ "folderId": {
15204
+ "type": "string"
15205
+ },
15206
+ "sourceKind": {
15207
+ "type": "string",
15208
+ "enum": [
15209
+ "upload",
15210
+ "scrape",
15211
+ "screenshot",
15212
+ "instagram",
15213
+ "external_url",
15214
+ "import"
15215
+ ]
15216
+ },
15217
+ "sourceHost": {
15218
+ "type": "string",
15219
+ "minLength": 1,
15220
+ "maxLength": 253
15221
+ },
15222
+ "mimeType": {
15223
+ "type": "string",
15224
+ "enum": [
15225
+ "image/jpeg",
15226
+ "image/png",
15227
+ "image/webp",
15228
+ "image/gif"
15229
+ ]
15230
+ },
15231
+ "tags": {
15232
+ "type": "array",
15233
+ "items": {
15234
+ "type": "string",
15235
+ "minLength": 1,
15236
+ "maxLength": 80
15237
+ },
15238
+ "maxItems": 20
15239
+ },
15240
+ "createdAfter": {
15241
+ "type": "string",
15242
+ "format": "date-time"
15243
+ },
15244
+ "createdBefore": {
15245
+ "type": "string",
15246
+ "format": "date-time"
15247
+ },
15248
+ "limit": {
15249
+ "type": "integer",
15250
+ "minimum": 1,
15251
+ "maximum": 100,
15252
+ "default": 30
15253
+ }
15254
+ },
15255
+ "additionalProperties": false,
15256
+ "$schema": "http://json-schema.org/draft-07/schema#"
15257
+ },
15258
+ "outputJsonSchema": {
15259
+ "type": "object",
15260
+ "properties": {
15261
+ "ok": {
15262
+ "type": "boolean",
15263
+ "enum": [
15264
+ true,
15265
+ false
15266
+ ]
15267
+ },
15268
+ "assets": {
15269
+ "type": "array",
15270
+ "items": {
15271
+ "type": "object",
15272
+ "properties": {
15273
+ "assetId": {
15274
+ "type": "string"
15275
+ },
15276
+ "title": {
15277
+ "type": "string"
15278
+ },
15279
+ "description": {
15280
+ "type": [
15281
+ "string",
15282
+ "null"
15283
+ ]
15284
+ },
15285
+ "altText": {
15286
+ "type": [
15287
+ "string",
15288
+ "null"
15289
+ ]
15290
+ },
15291
+ "sourceUrl": {
15292
+ "type": [
15293
+ "string",
15294
+ "null"
15295
+ ]
15296
+ },
15297
+ "sourceKind": {
15298
+ "type": "string"
15299
+ },
15300
+ "mimeType": {
15301
+ "type": "string"
15302
+ },
15303
+ "bytes": {
15304
+ "type": "number"
15305
+ },
15306
+ "width": {
15307
+ "type": "number"
15308
+ },
15309
+ "height": {
15310
+ "type": "number"
15311
+ },
15312
+ "projectId": {
15313
+ "type": [
15314
+ "string",
15315
+ "null"
15316
+ ]
15317
+ },
15318
+ "folderId": {
15319
+ "type": [
15320
+ "string",
15321
+ "null"
15322
+ ]
15323
+ },
15324
+ "tags": {
15325
+ "type": "array",
15326
+ "items": {
15327
+ "type": "string"
15328
+ }
15329
+ },
15330
+ "status": {
15331
+ "type": "string"
15332
+ },
15333
+ "embeddingStatus": {
15334
+ "type": "string"
15335
+ },
15336
+ "createdAt": {
15337
+ "type": "string"
15338
+ },
15339
+ "updatedAt": {
15340
+ "type": "string"
15341
+ },
15342
+ "preview": {
15343
+ "type": "object",
15344
+ "properties": {
15345
+ "url": {
15346
+ "type": "string",
15347
+ "format": "uri"
15348
+ },
15349
+ "expiresAt": {
15350
+ "type": "string",
15351
+ "format": "date-time"
15352
+ },
15353
+ "mimeType": {
15354
+ "type": "string",
15355
+ "const": "image/webp"
15356
+ }
15357
+ },
15358
+ "required": [
15359
+ "url",
15360
+ "expiresAt",
15361
+ "mimeType"
15362
+ ],
15363
+ "additionalProperties": false
15364
+ }
15365
+ },
15366
+ "required": [
15367
+ "assetId",
15368
+ "title",
15369
+ "description",
15370
+ "altText",
15371
+ "sourceUrl",
15372
+ "sourceKind",
15373
+ "mimeType",
15374
+ "bytes",
15375
+ "width",
15376
+ "height",
15377
+ "projectId",
15378
+ "folderId",
15379
+ "tags",
15380
+ "status",
15381
+ "embeddingStatus",
15382
+ "createdAt",
15383
+ "updatedAt"
15384
+ ],
15385
+ "additionalProperties": false
15386
+ }
15387
+ },
15388
+ "count": {
15389
+ "type": "number"
15390
+ },
15391
+ "code": {
15392
+ "type": "string"
15393
+ },
15394
+ "error": {
15395
+ "type": "string"
15396
+ }
15397
+ },
15398
+ "required": [
15399
+ "ok"
15400
+ ],
15401
+ "additionalProperties": false,
15402
+ "$schema": "http://json-schema.org/draft-07/schema#"
15403
+ },
15404
+ "annotations": {
15405
+ "title": "List Image Assets",
15406
+ "readOnlyHint": true,
15407
+ "destructiveHint": false,
15408
+ "idempotentHint": true,
15409
+ "openWorldHint": false
15410
+ }
15411
+ },
15412
+ {
15413
+ "id": "image_asset_search",
15414
+ "upstreamName": "image_asset_search",
15415
+ "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.",
15416
+ "inputJsonSchema": {
15417
+ "type": "object",
15418
+ "properties": {
15419
+ "vault": {
15420
+ "type": "string"
15421
+ },
15422
+ "queryText": {
15423
+ "type": "string",
15424
+ "minLength": 1,
15425
+ "maxLength": 4e3
15426
+ },
15427
+ "queryAssetId": {
15428
+ "type": "string",
15429
+ "minLength": 1
15430
+ },
15431
+ "queryUrl": {
15432
+ "type": "string",
15433
+ "format": "uri"
15434
+ },
15435
+ "queryImageBase64": {
15436
+ "type": "string",
15437
+ "minLength": 1
15438
+ },
15439
+ "projectId": {
15440
+ "type": "string"
15441
+ },
15442
+ "folderId": {
15443
+ "type": "string"
15444
+ },
15445
+ "sourceKind": {
15446
+ "type": "string",
15447
+ "enum": [
15448
+ "upload",
15449
+ "scrape",
15450
+ "screenshot",
15451
+ "instagram",
15452
+ "external_url",
15453
+ "import"
15454
+ ]
15455
+ },
15456
+ "sourceHost": {
15457
+ "type": "string",
15458
+ "minLength": 1,
15459
+ "maxLength": 253
15460
+ },
15461
+ "mimeType": {
15462
+ "type": "string",
15463
+ "enum": [
15464
+ "image/jpeg",
15465
+ "image/png",
15466
+ "image/webp",
15467
+ "image/gif"
15468
+ ]
15469
+ },
15470
+ "tags": {
15471
+ "type": "array",
15472
+ "items": {
15473
+ "type": "string",
15474
+ "minLength": 1,
15475
+ "maxLength": 80
15476
+ },
15477
+ "maxItems": 20
15478
+ },
15479
+ "createdAfter": {
15480
+ "type": "string",
15481
+ "format": "date-time"
15482
+ },
15483
+ "createdBefore": {
15484
+ "type": "string",
15485
+ "format": "date-time"
15486
+ },
15487
+ "limit": {
15488
+ "type": "integer",
15489
+ "minimum": 1,
15490
+ "maximum": 30,
15491
+ "default": 10
15492
+ },
15493
+ "includePreview": {
15494
+ "type": "boolean",
15495
+ "default": false
15496
+ }
15497
+ },
15498
+ "additionalProperties": false,
15499
+ "$schema": "http://json-schema.org/draft-07/schema#"
15500
+ },
15501
+ "outputJsonSchema": {
15502
+ "type": "object",
15503
+ "properties": {
15504
+ "ok": {
15505
+ "type": "boolean",
15506
+ "enum": [
15507
+ true,
15508
+ false
15509
+ ]
15510
+ },
15511
+ "results": {
15512
+ "type": "array",
15513
+ "items": {
15514
+ "type": "object",
15515
+ "properties": {
15516
+ "asset": {
15517
+ "type": "object",
15518
+ "properties": {
15519
+ "assetId": {
15520
+ "type": "string"
15521
+ },
15522
+ "title": {
15523
+ "type": "string"
15524
+ },
15525
+ "description": {
15526
+ "type": [
15527
+ "string",
15528
+ "null"
15529
+ ]
15530
+ },
15531
+ "altText": {
15532
+ "type": [
15533
+ "string",
15534
+ "null"
15535
+ ]
15536
+ },
15537
+ "sourceUrl": {
15538
+ "type": [
15539
+ "string",
15540
+ "null"
15541
+ ]
15542
+ },
15543
+ "sourceKind": {
15544
+ "type": "string"
15545
+ },
15546
+ "mimeType": {
15547
+ "type": "string"
15548
+ },
15549
+ "bytes": {
15550
+ "type": "number"
15551
+ },
15552
+ "width": {
15553
+ "type": "number"
15554
+ },
15555
+ "height": {
15556
+ "type": "number"
15557
+ },
15558
+ "projectId": {
15559
+ "type": [
15560
+ "string",
15561
+ "null"
15562
+ ]
15563
+ },
15564
+ "folderId": {
15565
+ "type": [
15566
+ "string",
15567
+ "null"
15568
+ ]
15569
+ },
15570
+ "tags": {
15571
+ "type": "array",
15572
+ "items": {
15573
+ "type": "string"
15574
+ }
15575
+ },
15576
+ "status": {
15577
+ "type": "string"
15578
+ },
15579
+ "embeddingStatus": {
15580
+ "type": "string"
15581
+ },
15582
+ "createdAt": {
15583
+ "type": "string"
15584
+ },
15585
+ "updatedAt": {
15586
+ "type": "string"
15587
+ },
15588
+ "preview": {
15589
+ "type": "object",
15590
+ "properties": {
15591
+ "url": {
15592
+ "type": "string",
15593
+ "format": "uri"
15594
+ },
15595
+ "expiresAt": {
15596
+ "type": "string",
15597
+ "format": "date-time"
15598
+ },
15599
+ "mimeType": {
15600
+ "type": "string",
15601
+ "const": "image/webp"
15602
+ }
15603
+ },
15604
+ "required": [
15605
+ "url",
15606
+ "expiresAt",
15607
+ "mimeType"
15608
+ ],
15609
+ "additionalProperties": false
15610
+ }
15611
+ },
15612
+ "required": [
15613
+ "assetId",
15614
+ "title",
15615
+ "description",
15616
+ "altText",
15617
+ "sourceUrl",
15618
+ "sourceKind",
15619
+ "mimeType",
15620
+ "bytes",
15621
+ "width",
15622
+ "height",
15623
+ "projectId",
15624
+ "folderId",
15625
+ "tags",
15626
+ "status",
15627
+ "embeddingStatus",
15628
+ "createdAt",
15629
+ "updatedAt"
15630
+ ],
15631
+ "additionalProperties": false
15632
+ },
15633
+ "score": {
15634
+ "type": "number"
15635
+ },
15636
+ "matchRepresentations": {
15637
+ "type": "array",
15638
+ "items": {
15639
+ "type": "string",
15640
+ "enum": [
15641
+ "visual",
15642
+ "fused"
15643
+ ]
15644
+ }
15645
+ },
15646
+ "embeddingModel": {
15647
+ "type": "string"
15648
+ }
15649
+ },
15650
+ "required": [
15651
+ "asset",
15652
+ "score",
15653
+ "matchRepresentations",
15654
+ "embeddingModel"
15655
+ ],
15656
+ "additionalProperties": false
15657
+ }
15658
+ },
15659
+ "count": {
15660
+ "type": "number"
15661
+ },
15662
+ "code": {
15663
+ "type": "string"
15664
+ },
15665
+ "error": {
15666
+ "type": "string"
15667
+ }
15668
+ },
15669
+ "required": [
15670
+ "ok"
15671
+ ],
15672
+ "additionalProperties": false,
15673
+ "$schema": "http://json-schema.org/draft-07/schema#"
15674
+ },
15675
+ "annotations": {
15676
+ "title": "Search Image Assets",
15677
+ "readOnlyHint": true,
15678
+ "destructiveHint": false,
15679
+ "idempotentHint": true,
15680
+ "openWorldHint": true
15681
+ }
15682
+ },
15683
+ {
15684
+ "id": "image_asset_move",
15685
+ "upstreamName": "image_asset_move",
15686
+ "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.",
15687
+ "inputJsonSchema": {
15688
+ "type": "object",
15689
+ "properties": {
15690
+ "vault": {
15691
+ "type": "string"
15692
+ },
15693
+ "assetId": {
15694
+ "type": "string",
15695
+ "minLength": 1
15696
+ },
15697
+ "projectId": {
15698
+ "anyOf": [
15699
+ {
15700
+ "type": "string",
15701
+ "minLength": 1
15702
+ },
15703
+ {
15704
+ "type": "null"
15705
+ }
15706
+ ]
15707
+ },
15708
+ "folderId": {
15709
+ "anyOf": [
15710
+ {
15711
+ "type": "string",
15712
+ "minLength": 1
15713
+ },
15714
+ {
15715
+ "type": "null"
15716
+ }
15717
+ ]
15718
+ }
15719
+ },
15720
+ "required": [
15721
+ "assetId"
15722
+ ],
15723
+ "additionalProperties": false,
15724
+ "$schema": "http://json-schema.org/draft-07/schema#"
15725
+ },
15726
+ "outputJsonSchema": {
15727
+ "type": "object",
15728
+ "properties": {
15729
+ "ok": {
15730
+ "type": "boolean",
15731
+ "enum": [
15732
+ true,
15733
+ false
15734
+ ]
15735
+ },
15736
+ "asset": {
15737
+ "type": "object",
15738
+ "properties": {
15739
+ "assetId": {
15740
+ "type": "string"
15741
+ },
15742
+ "title": {
15743
+ "type": "string"
15744
+ },
15745
+ "description": {
15746
+ "type": [
15747
+ "string",
15748
+ "null"
15749
+ ]
15750
+ },
15751
+ "altText": {
15752
+ "type": [
15753
+ "string",
15754
+ "null"
15755
+ ]
15756
+ },
15757
+ "sourceUrl": {
15758
+ "type": [
15759
+ "string",
15760
+ "null"
15761
+ ]
15762
+ },
15763
+ "sourceKind": {
15764
+ "type": "string"
15765
+ },
15766
+ "mimeType": {
15767
+ "type": "string"
15768
+ },
15769
+ "bytes": {
15770
+ "type": "number"
15771
+ },
15772
+ "width": {
15773
+ "type": "number"
15774
+ },
15775
+ "height": {
15776
+ "type": "number"
15777
+ },
15778
+ "projectId": {
15779
+ "type": [
15780
+ "string",
15781
+ "null"
15782
+ ]
15783
+ },
15784
+ "folderId": {
15785
+ "type": [
15786
+ "string",
15787
+ "null"
15788
+ ]
15789
+ },
15790
+ "tags": {
15791
+ "type": "array",
15792
+ "items": {
15793
+ "type": "string"
15794
+ }
15795
+ },
15796
+ "status": {
15797
+ "type": "string"
15798
+ },
15799
+ "embeddingStatus": {
15800
+ "type": "string"
15801
+ },
15802
+ "createdAt": {
15803
+ "type": "string"
15804
+ },
15805
+ "updatedAt": {
15806
+ "type": "string"
15807
+ },
15808
+ "preview": {
15809
+ "type": "object",
15810
+ "properties": {
15811
+ "url": {
15812
+ "type": "string",
15813
+ "format": "uri"
15814
+ },
15815
+ "expiresAt": {
15816
+ "type": "string",
15817
+ "format": "date-time"
15818
+ },
15819
+ "mimeType": {
15820
+ "type": "string",
15821
+ "const": "image/webp"
15822
+ }
15823
+ },
15824
+ "required": [
15825
+ "url",
15826
+ "expiresAt",
15827
+ "mimeType"
15828
+ ],
15829
+ "additionalProperties": false
15830
+ }
15831
+ },
15832
+ "required": [
15833
+ "assetId",
15834
+ "title",
15835
+ "description",
15836
+ "altText",
15837
+ "sourceUrl",
15838
+ "sourceKind",
15839
+ "mimeType",
15840
+ "bytes",
15841
+ "width",
15842
+ "height",
15843
+ "projectId",
15844
+ "folderId",
15845
+ "tags",
15846
+ "status",
15847
+ "embeddingStatus",
15848
+ "createdAt",
15849
+ "updatedAt"
15850
+ ],
15851
+ "additionalProperties": false
15852
+ },
15853
+ "code": {
15854
+ "type": "string"
15855
+ },
15856
+ "error": {
15857
+ "type": "string"
15858
+ }
15859
+ },
15860
+ "required": [
15861
+ "ok"
15862
+ ],
15863
+ "additionalProperties": false,
15864
+ "$schema": "http://json-schema.org/draft-07/schema#"
15865
+ },
15866
+ "annotations": {
15867
+ "title": "Move Image Asset",
15868
+ "readOnlyHint": false,
15869
+ "destructiveHint": false,
15870
+ "idempotentHint": true,
15871
+ "openWorldHint": false
15872
+ }
15873
+ },
15874
+ {
15875
+ "id": "image_asset_delete",
15876
+ "upstreamName": "image_asset_delete",
15877
+ "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.",
15878
+ "inputJsonSchema": {
15879
+ "type": "object",
15880
+ "properties": {
15881
+ "vault": {
15882
+ "type": "string"
15883
+ },
15884
+ "assetId": {
15885
+ "type": "string",
15886
+ "minLength": 1
15887
+ },
15888
+ "confirmDelete": {
15889
+ "type": "boolean",
15890
+ "const": true,
15891
+ "description": "Must be true after the caller has confirmed deletion."
15892
+ }
15893
+ },
15894
+ "required": [
15895
+ "assetId",
15896
+ "confirmDelete"
15897
+ ],
15898
+ "additionalProperties": false,
15899
+ "$schema": "http://json-schema.org/draft-07/schema#"
15900
+ },
15901
+ "outputJsonSchema": {
15902
+ "type": "object",
15903
+ "properties": {
15904
+ "ok": {
15905
+ "type": "boolean",
15906
+ "enum": [
15907
+ true,
15908
+ false
15909
+ ]
15910
+ },
15911
+ "deleted": {
15912
+ "type": "boolean"
15913
+ },
15914
+ "assetId": {
15915
+ "type": "string"
15916
+ },
15917
+ "code": {
15918
+ "type": "string"
15919
+ },
15920
+ "error": {
15921
+ "type": "string"
15922
+ }
15923
+ },
15924
+ "required": [
15925
+ "ok"
15926
+ ],
15927
+ "additionalProperties": false,
15928
+ "$schema": "http://json-schema.org/draft-07/schema#"
15929
+ },
15930
+ "annotations": {
15931
+ "title": "Delete Image Asset",
15932
+ "readOnlyHint": false,
15933
+ "destructiveHint": true,
15934
+ "idempotentHint": true,
15935
+ "openWorldHint": false
15936
+ }
15937
+ }
15938
+ ];
14340
15939
 
14341
15940
  // src/mcp/memory-tool-schemas.ts
14342
15941
  import { z as z11 } from "zod";
@@ -16869,7 +18468,7 @@ var MEMORY_TOOL_REGISTRY = [
16869
18468
  ...schema,
16870
18469
  description: MEMORY_TOOL_DESCRIPTION_OVERRIDES[schema.id] ?? schema.description
16871
18470
  })),
16872
- ...IMAGE_ASSET_MCP_DEFINITIONS
18471
+ ...MEMORY_IMAGE_TOOL_SCHEMAS
16873
18472
  ];
16874
18473
 
16875
18474
  // src/mcp/memory-mcp-server.ts
@@ -17626,4 +19225,3 @@ export {
17626
19225
  ScheduledResultsMcpExecutor,
17627
19226
  registerScheduledResultsMcpTools
17628
19227
  };
17629
- //# sourceMappingURL=chunk-SRRI2HJL.js.map