mcp-scraper 0.24.0 → 0.26.0

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 (39) hide show
  1. package/README.md +3 -3
  2. package/dist/bin/api-server.cjs +5044 -2895
  3. package/dist/bin/api-server.cjs.map +1 -1
  4. package/dist/bin/api-server.js +2 -2
  5. package/dist/bin/mcp-scraper-cli.cjs +1 -1
  6. package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
  7. package/dist/bin/mcp-scraper-cli.js +1 -1
  8. package/dist/bin/mcp-scraper-install.cjs +2 -2
  9. package/dist/bin/mcp-scraper-install.cjs.map +1 -1
  10. package/dist/bin/mcp-scraper-install.js +2 -2
  11. package/dist/bin/mcp-stdio-server.cjs +205 -61
  12. package/dist/bin/mcp-stdio-server.cjs.map +1 -1
  13. package/dist/bin/mcp-stdio-server.js +4 -4
  14. package/dist/{chunk-PNBYYAEK.js → chunk-3ZZOLQ6A.js} +2 -2
  15. package/dist/{chunk-JHI373VB.js → chunk-4767BA2O.js} +85 -3
  16. package/dist/chunk-4767BA2O.js.map +1 -0
  17. package/dist/chunk-7PYRJ7CB.js +7 -0
  18. package/dist/chunk-7PYRJ7CB.js.map +1 -0
  19. package/dist/{chunk-YNHPZU6B.js → chunk-TBRX7VOP.js} +2 -2
  20. package/dist/{chunk-YNHPZU6B.js.map → chunk-TBRX7VOP.js.map} +1 -1
  21. package/dist/{chunk-SUPUHPJS.js → chunk-UMTBCKHH.js} +200 -62
  22. package/dist/chunk-UMTBCKHH.js.map +1 -0
  23. package/dist/{server-I5U3OUZZ.js → server-H4PPYTOM.js} +2484 -580
  24. package/dist/server-H4PPYTOM.js.map +1 -0
  25. package/dist/{site-extract-repository-2QQSL2QC.js → site-extract-repository-O36SIFI2.js} +3 -3
  26. package/dist/{worker-RV2TYXE3.js → worker-E3KHQH2F.js} +2 -2
  27. package/docs/adr/0002-hybrid-smart-rag-vault-retrieval.md +62 -0
  28. package/docs/adr/README.md +1 -0
  29. package/docs/mcp-tool-manifest.generated.json +710 -55
  30. package/docs/specs/main-mcp-integration-ownership-spec.md +1164 -0
  31. package/package.json +6 -2
  32. package/dist/chunk-CDLHUCMT.js +0 -7
  33. package/dist/chunk-CDLHUCMT.js.map +0 -1
  34. package/dist/chunk-JHI373VB.js.map +0 -1
  35. package/dist/chunk-SUPUHPJS.js.map +0 -1
  36. package/dist/server-I5U3OUZZ.js.map +0 -1
  37. /package/dist/{chunk-PNBYYAEK.js.map → chunk-3ZZOLQ6A.js.map} +0 -0
  38. /package/dist/{site-extract-repository-2QQSL2QC.js.map → site-extract-repository-O36SIFI2.js.map} +0 -0
  39. /package/dist/{worker-RV2TYXE3.js.map → worker-E3KHQH2F.js.map} +0 -0
@@ -19,10 +19,10 @@ import {
19
19
  } from "./chunk-XGIPATLV.js";
20
20
  import {
21
21
  PACKAGE_VERSION
22
- } from "./chunk-CDLHUCMT.js";
22
+ } from "./chunk-7PYRJ7CB.js";
23
23
  import {
24
24
  MC_PER_CREDIT
25
- } from "./chunk-JHI373VB.js";
25
+ } from "./chunk-4767BA2O.js";
26
26
  import {
27
27
  sanitizeVendorName
28
28
  } from "./chunk-M2S27J6Z.js";
@@ -374,6 +374,9 @@ Multi-step orchestrations \u2014 prefer these over hand-chaining primitives when
374
374
  is \`done\`.
375
375
 
376
376
  ## Notes
377
+ - Connected-service lifecycle and availability are separate. A connection can remain \`connected\` while
378
+ \`operationalStatus\` is \`unavailable\`; call \`test_service_connection\` before recommending reconnect.
379
+ Recommend reconnect only when \`reconnectRequired\` is true.
377
380
  - Bulk / full-site crawls: call \`extract_site\` with \`rotateProxies:true\` for blocked or rate-limited
378
381
  sites. It returns a saved folder/artifact plus a summary, not the full content inline.
379
382
  - Browser sessions and media transcription cost credits and take longer \u2014 prefer the cheapest tool that
@@ -382,6 +385,10 @@ Multi-step orchestrations \u2014 prefer these over hand-chaining primitives when
382
385
  when connected Graph media did not provide a playable source. It is not a bypass for URL/SSRF restrictions.
383
386
  - Large results are saved to disk or an artifact and returned as a summary plus a path or artifactId;
384
387
  read it back for full detail rather than expecting the whole payload inline.
388
+ - Before using a connected account, call \`list_service_connections\` and match the intended provider-side
389
+ identity from \`providerAccountEmail\` or \`providerAccountName\`, not the MCP Scraper login. If
390
+ \`providerIdentityStatus\` is \`unavailable\`, ask the person to refresh that connection before assuming
391
+ which external account it represents.
385
392
  - For Google Search Console, use \`export_connected_service_data\` with
386
393
  \`dataset:"search_console_performance"\` when the person asks for a fresh JSONL download. When they
387
394
  ask to schedule ingestion or repeatedly filter historical rows, create a \`connection_sync\` schedule,
@@ -394,7 +401,7 @@ Multi-step orchestrations \u2014 prefer these over hand-chaining primitives when
394
401
 
395
402
  ## Memory
396
403
  mcp-scraper also exposes persistent per-user memory tools (notes, facts, vaults,
397
- scheduled actions, tables, channels) backed by memory.mcpscraper.dev. Every account starts with 13
404
+ scheduled actions, tables, channels) backed by memory.mcpscraper.dev. Every account starts with 14
398
405
  vaults \u2014 call **list-vaults** to see what exists before creating anything new. Pick the vault whose job
399
406
  matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled lessons/how-tos),
400
407
  **Library** (raw source material \u2014 articles, transcripts), **People** (one durable note per person/org),
@@ -402,7 +409,8 @@ matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled
402
409
  (action items with a status), **Projects** (durable named initiatives), **Issues** (something broken),
403
410
  **Improvement Log** (receipts of changes made and whether they worked), **Experiments** (hypothesis +
404
411
  measured result), **Sprint** (current cycle's scope), **Inspiration** (other people's work worth
405
- studying).
412
+ studying), **Skills** (reusable skill packages; each requires \`scripts/\` and at least one of
413
+ \`references/\` or \`templates/\`, and may use both).
406
414
  For a normal new narrative note, call **prepare-memory-write** first. It queries the live vault contract,
407
415
  tag vocabulary, and natural neighbor vaults, and returns interlink candidates that must be read before
408
416
  acceptance. Compose every returned template section, then call **memory-capture**, which validates the
@@ -432,6 +440,12 @@ Tags are live vocabulary, not improvised labels: **list-memory-tags** shows what
432
440
  reusable, and has no exact, alias, or near-equivalent. Use **memory-backlinks**,
433
441
  **memory-graph-universe**, and **memory-graph-path** to trace the linked universe across vaults.
434
442
 
443
+ **Always inspect the complete tag inventory and related notes first.** Use hybrid Smart RAG by default:
444
+ form 3 focused queries (2\u20134 when useful), fuse exact tag/metadata/vault/date and semantic matches into 50
445
+ candidates, expand the top 8 seeds by one link/backlink hop with at most 5 neighbors each, then Jina-rerank
446
+ the combined pool to the best 30. Graph neighbors are candidates, never automatic links; add only links
447
+ supported by the note contents.
448
+
435
449
  Scrape deposits are raw evidence and therefore go to **Library** through **library-ingest**, with the full
436
450
  Library template and source metadata. If the source contains durable applicable guidance, create a separate
437
451
  Knowledge companion through prepare-memory-write + memory-capture and link it to the Library source with
@@ -4489,8 +4503,14 @@ var ListServiceConnectionsOutputSchema = {
4489
4503
  connectionId: z.string(),
4490
4504
  providerConfigKey: z.string(),
4491
4505
  provider: z.string().nullable().optional(),
4492
- label: z.string(),
4506
+ label: z.string().describe("Best verified provider-side account label. This is never derived from the MCP Scraper login email."),
4507
+ providerAccountId: z.string().nullable().describe("Provider-side account or principal identifier when safely discoverable. This is not the MCP Scraper user id."),
4508
+ providerAccountEmail: z.string().nullable().describe("Actual provider-side email for the authorized account when the provider exposes and verifies it. Null for organization-only accounts or unavailable identity scopes."),
4509
+ providerAccountName: z.string().nullable().describe("Actual provider-side person, workspace, channel, or organization name when available."),
4510
+ providerIdentityStatus: z.enum(["pending", "verified", "unavailable"]).describe("Whether provider-side account identity discovery is pending, verified, or unavailable under the current OAuth grant. Reconnect when unavailable after identity scopes were added."),
4493
4511
  status: z.string(),
4512
+ lifecycleStatus: z.enum(["pending", "connected", "needs_reauth", "disconnecting", "disconnected"]).optional().describe("Credential lifecycle. This is separate from current provider availability."),
4513
+ operationalStatus: z.enum(["unknown", "available", "degraded", "unavailable"]).optional().describe("Last observed provider transport availability. Unavailable does not imply reconnect is required."),
4494
4514
  reconnectRequired: z.boolean().optional(),
4495
4515
  transport: z.enum(["nango", "remote_mcp"]).describe("Credential transport behind this tenant-scoped connection. Tokens and API keys are never returned."),
4496
4516
  actionsEnabled: z.boolean(),
@@ -4513,10 +4533,27 @@ var ListServiceConnectionsOutputSchema = {
4513
4533
  mcpEndpoint: z.string().url().nullable().describe("Authenticated connection-scoped MCP endpoint when native provider tools/list projection is available. Null means use describe_service_connection_tool on this root MCP."),
4514
4534
  schemaDiscovery: z.enum(["connection_tools_list", "compatibility_describe"]).describe("How clients discover this connection's exact live provider schemas."),
4515
4535
  toolRevision: z.string().nullable().describe("Opaque revision of the resolved live tool catalog, when available. It changes when provider tools or policy change."),
4536
+ lastCheckedAt: z.string().nullable().optional(),
4537
+ lastSuccessfulCallAt: z.string().nullable().optional(),
4538
+ lastFailureAt: z.string().nullable().optional(),
4539
+ lastFailureCode: z.string().nullable().optional(),
4540
+ lastFailureRetryable: z.boolean().nullable().optional(),
4516
4541
  vaultName: z.string().nullable().describe("Memory vault this connection's digest writes into, if it has run at least once. Search it with memory-search."),
4517
4542
  tableName: z.string().nullable().describe("Tenant-owned structured table populated by this connection, if available. For scheduled Google Search Console connection_sync runs, this is a typed performance table with site_url, date, query, page, country, device, clicks, impressions, ctr, and position. Call table-describe, then filter or sort it with table-query.")
4518
4543
  }))
4519
4544
  };
4545
+ var TestServiceConnectionInputSchema = {
4546
+ connectionId: z.string().min(1).describe("A tenant-owned connectionId from list_service_connections."),
4547
+ providerConfigKey: z.string().min(1).optional().describe("Optional provider hint from list_service_connections.")
4548
+ };
4549
+ var TestServiceConnectionOutputSchema = {
4550
+ ok: z.boolean(),
4551
+ operationalStatus: z.enum(["available", "unavailable"]).optional(),
4552
+ checkedAt: z.string().optional(),
4553
+ toolCount: z.number().int().min(0).optional(),
4554
+ code: z.string().optional(),
4555
+ error: NullableString
4556
+ };
4520
4557
  var ReadServiceConnectionInputSchema = {
4521
4558
  connectionId: z.string().min(1).describe("A connectionId from list_service_connections."),
4522
4559
  tool: z.string().min(1).describe("One of that connection's readTools (from list_service_connections). An unlisted tool name is rejected with the allowed list."),
@@ -5497,11 +5534,18 @@ function registerPaaExtractorMcpTools(server, executor, options = {}) {
5497
5534
  }, async (input) => formatCreditsInfo(await executor.creditsInfo(input), input));
5498
5535
  server.registerTool("list_service_connections", {
5499
5536
  title: "List Connected Services",
5500
- description: "List every third-party service connection this MCP Scraper account has authorized, including Resend, GitHub, Google Analytics, Google Search Console, YouTube, Facebook Pages, LinkedIn, X, Meta Marketing, Slack, Gmail, Calendar, Google Drive, Zoom, Xero, and others. Returns the tenant-scoped connectionId, credential transport, exact live readTools and gated actionTools, permission-aware toolCapabilities with missing OAuth-grant or provider-app-feature blockers, permanently blocked administrative tools, and schema-discovery metadata. Get a connectionId and exact tool name here before calling describe_service_connection_tool, read_service_connection, or call_service_connection_action. Nango OAuth and official remote MCP connections use the same provider-neutral bridges; mutations still require the account action switch and an exact allowed action. A scheduled Search Console connection_sync creates a typed tenant-owned performance table; after it runs, use the returned tableName with table-describe and table-query instead of repeatedly calling Google for historical filtering.",
5537
+ description: "List every third-party service connection this MCP Scraper account has authorized, including Resend, GitHub, Google Analytics, Google Search Console, YouTube, Facebook Pages, LinkedIn, X, Meta Marketing, Slack, Gmail, Calendar, Google Drive, Zoom, Xero, and others. Returns the tenant-scoped connectionId; verified providerAccountEmail/providerAccountName identity when the provider exposes it; credential transport; exact live readTools and gated actionTools; permission-aware toolCapabilities with missing OAuth-grant or provider-app-feature blockers; permanently blocked administrative tools; and schema-discovery metadata. The provider identity is distinct from the MCP Scraper login: use it to choose the intended account before any read, export, schedule binding, or gated action. Get a connectionId and exact tool name here before calling describe_service_connection_tool, read_service_connection, or call_service_connection_action. Nango OAuth and official remote MCP connections use the same provider-neutral bridges; mutations still require the account action switch and an exact allowed action. A scheduled Search Console connection_sync creates a typed tenant-owned performance table; after it runs, use the returned tableName with table-describe and table-query instead of repeatedly calling Google for historical filtering.",
5501
5538
  inputSchema: ListServiceConnectionsInputSchema,
5502
5539
  outputSchema: recordOutputSchema("list_service_connections", ListServiceConnectionsOutputSchema),
5503
5540
  annotations: { title: "List Connected Services", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
5504
5541
  }, async (input) => executor.listServiceConnections(input));
5542
+ server.registerTool("test_service_connection", {
5543
+ title: "Test Connected Service",
5544
+ description: "Test the current provider transport for one tenant-owned connection without changing its OAuth lifecycle. Call this when a connected account appears unavailable before recommending reconnect. Reconnect is appropriate only when reconnectRequired is true.",
5545
+ inputSchema: TestServiceConnectionInputSchema,
5546
+ outputSchema: recordOutputSchema("test_service_connection", TestServiceConnectionOutputSchema),
5547
+ annotations: { title: "Test Connected Service", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }
5548
+ }, async (input) => executor.testServiceConnection(input));
5505
5549
  server.registerTool("slack_send_message", {
5506
5550
  title: "Send Slack Message",
5507
5551
  description: "Send a message to a Slack channel through a connected, action-enabled Slack connection. Requires a connectionId from list_service_connections with actionsEnabled true; the person must have explicitly turned actions on for that connection.",
@@ -5887,7 +5931,12 @@ var HttpMcpToolExecutor = class {
5887
5931
  return this.call("/billing/credits", input);
5888
5932
  }
5889
5933
  listServiceConnections(input) {
5890
- return this.getJson("/schedule-connections");
5934
+ return this.getJson("/integrations");
5935
+ }
5936
+ testServiceConnection(input) {
5937
+ return this.call(`/integrations/${encodeURIComponent(input.connectionId)}/test`, {
5938
+ ...input.providerConfigKey ? { providerConfigKey: input.providerConfigKey } : {}
5939
+ });
5891
5940
  }
5892
5941
  slackSendMessage(input) {
5893
5942
  return this.call("/schedule-connections/actions/slack/send-message", input);
@@ -5902,13 +5951,13 @@ var HttpMcpToolExecutor = class {
5902
5951
  return this.call("/schedule-connections/actions/zoom/create-meeting", input);
5903
5952
  }
5904
5953
  readServiceConnection(input) {
5905
- return this.call("/schedule-connections/actions/read", input);
5954
+ return this.call("/integrations/actions/read", input);
5906
5955
  }
5907
5956
  importServiceConnectionToMemory(input) {
5908
5957
  return this.call("/schedule-connections/actions/import-memory", input);
5909
5958
  }
5910
5959
  describeServiceConnectionTool(input) {
5911
- return this.call("/schedule-connections/actions/describe", input);
5960
+ return this.call("/integrations/actions/describe", input);
5912
5961
  }
5913
5962
  exportConnectedServiceData(input) {
5914
5963
  const timeoutMs = this.httpTimeoutOverrideMs ?? 29e4;
@@ -5922,7 +5971,7 @@ var HttpMcpToolExecutor = class {
5922
5971
  return this.call("/schedule-connections/actions/export-download", input);
5923
5972
  }
5924
5973
  callServiceConnectionAction(input) {
5925
- return this.call("/schedule-connections/actions/call", input);
5974
+ return this.call("/integrations/actions/call", input);
5926
5975
  }
5927
5976
  setScheduledActionConnections(input) {
5928
5977
  return this.call(`/schedule-actions/${encodeURIComponent(input.scheduleActionId)}/connections`, {
@@ -8059,12 +8108,15 @@ var memoryCaptureTool_notePropsSchema = z3.object({
8059
8108
  type: z3.string().describe("Note type from the target vault contract (also used to route the note)."),
8060
8109
  domain: z3.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
8061
8110
  folder: z3.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
8111
+ script_links: z3.array(z3.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
8112
+ reference_links: z3.array(z3.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
8113
+ template_links: z3.array(z3.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
8062
8114
  parentMessageId: z3.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
8063
8115
  }).partial().passthrough();
8064
8116
  var MemoryCaptureSchema = {
8065
8117
  id: "memory-capture",
8066
8118
  upstreamName: "memoryCaptureTool",
8067
- description: "Strict normal-create path for durable memory. Refuses incomplete notes, writes through memory-put, registers canonical tags, and reads the note back to verify persisted content and props. Call prepare-memory-write first. Reserve memory-put for low-level migrations or deliberate edits.",
8119
+ description: "Strict normal-create path for durable memory. Before capture, list the complete tag vocabulary, call prepare-memory-write, run hybrid memory-search for related notes, and read the strongest link candidates. This tool refuses incomplete notes, writes through memory-put, registers canonical tags, and verifies persisted content and props. Reserve memory-put for low-level migrations or deliberate edits.",
8068
8120
  input: {
8069
8121
  vault: z3.string(),
8070
8122
  folder: z3.string().optional(),
@@ -8122,7 +8174,7 @@ var MemoryQuestionsSchema = {
8122
8174
  var PrepareMemoryWriteSchema = {
8123
8175
  id: "prepare-memory-write",
8124
8176
  upstreamName: "prepareMemoryWriteTool",
8125
- description: "Mandatory planning pass for a normal new memory. Routes the note, returns the live template and natural vault relationships, resolves proposed tags against the registry, and shortlists interlink opportunities that must be read/reviewed before capture.",
8177
+ description: "Mandatory planning pass for a normal new memory. First inspect the complete tag vocabulary with list-memory-tags; then this pass routes the note, returns the live template and natural vault relationships, resolves proposed tags, and shortlists interlinks. Use hybrid memory-search (3 focused queries, 50 fused candidates, bounded graph expansion, rerank to 30 by default) and read strong related notes before capture. This is an explicit AI workflow directive, not a claim of persisted call-order enforcement.",
8126
8178
  input: {
8127
8179
  title: z3.string().min(1),
8128
8180
  content: z3.string().min(1),
@@ -8158,6 +8210,9 @@ var validateMemoryWriteTool_notePropsSchema = z3.object({
8158
8210
  type: z3.string().describe("Note type from the target vault contract (also used to route the note)."),
8159
8211
  domain: z3.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
8160
8212
  folder: z3.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
8213
+ script_links: z3.array(z3.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
8214
+ reference_links: z3.array(z3.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
8215
+ template_links: z3.array(z3.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
8161
8216
  parentMessageId: z3.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
8162
8217
  }).partial().passthrough();
8163
8218
  var ValidateMemoryWriteSchema = {
@@ -8613,6 +8668,39 @@ var LibraryIngestSchema = {
8613
8668
  openWorldHint: true
8614
8669
  }
8615
8670
  };
8671
+ var bulkDeleteNotesTool_FilterSchema = z3.object({
8672
+ column: z3.enum(["path", "title", "kind", "source", "captured_at", "created_at", "updated_at", "revision"]).describe("Note column to filter on."),
8673
+ op: z3.enum(["eq", "neq", "gt", "gte", "lt", "lte", "like", "prefix", "in"]).describe('"prefix" anchors to the start of the value only (e.g. path prefix "Mastra/opt-"); "like" matches anywhere in the value; "in" requires an array value.'),
8674
+ value: z3.unknown().describe('Value to compare against. For "in", pass an array.')
8675
+ });
8676
+ var BulkDeleteNotesSchema = {
8677
+ id: "bulk-delete-notes",
8678
+ upstreamName: "bulkDeleteNotesTool",
8679
+ description: "Delete every note in one vault matching all given filters (ANDed) plus an optional tag match (ANY of the given tags) \u2014 at least one filter or tag is required; there is no unfiltered delete-all here (use delete-vault for that). Defaults to dryRun: true, previewing the match count and a sample of up to 20 matching notes without deleting anything. Pass dryRun: false to actually delete. DESTRUCTIVE and not recoverable when dryRun is false. Requires write scope. Refuses secure vaults (not indexed, filtering is meaningless there).",
8680
+ input: {
8681
+ vault: z3.string().optional().describe("Vault to delete from. Optional; defaults to the session active vault, then the first vault the caller is entitled to."),
8682
+ filters: z3.array(bulkDeleteNotesTool_FilterSchema).default([]).describe("Filters to AND together. At least one of filters/tags is required."),
8683
+ tags: z3.array(z3.string()).optional().describe("Match notes carrying ANY of these tags (ORed among themselves, ANDed with filters). At least one of filters/tags is required."),
8684
+ dryRun: z3.boolean().default(true).describe("When true (default), previews matches without deleting anything. Pass false to actually delete.")
8685
+ },
8686
+ output: {
8687
+ ok: z3.boolean().describe("True on success; false on auth/scope/validation error."),
8688
+ vault: z3.string().optional().describe("The vault operated on (after defaulting). Present when ok is true."),
8689
+ dryRun: z3.boolean().optional().describe("Echoes whether this call was a preview or a real delete."),
8690
+ matchCount: z3.number().optional().describe("Number of notes matching the filters. Present on a dry run."),
8691
+ sample: z3.array(z3.object({ path: z3.string(), title: z3.string(), updatedAt: z3.string() })).optional().describe("Up to 20 matching notes, most-recently-updated first. Present on a dry run."),
8692
+ deleted: z3.number().optional().describe("Number of notes actually deleted. Present when dryRun is false."),
8693
+ deletedPaths: z3.array(z3.string()).optional().describe("Paths of the deleted notes. Present when dryRun is false."),
8694
+ error: z3.string().optional().describe("Human-readable failure reason when ok is false.")
8695
+ },
8696
+ annotations: {
8697
+ title: "Bulk Delete Notes",
8698
+ readOnlyHint: false,
8699
+ destructiveHint: true,
8700
+ idempotentHint: false,
8701
+ openWorldHint: false
8702
+ }
8703
+ };
8616
8704
  var DeleteNoteSchema = {
8617
8705
  id: "delete-note",
8618
8706
  upstreamName: "deleteNoteTool",
@@ -8694,6 +8782,9 @@ var getTool_notePropsSchema = z3.object({
8694
8782
  type: z3.string().describe("Note type from the target vault contract (also used to route the note)."),
8695
8783
  domain: z3.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
8696
8784
  folder: z3.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
8785
+ script_links: z3.array(z3.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
8786
+ reference_links: z3.array(z3.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
8787
+ template_links: z3.array(z3.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
8697
8788
  parentMessageId: z3.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
8698
8789
  }).partial().passthrough();
8699
8790
  var GetSchema = {
@@ -8782,6 +8873,9 @@ var putTool_notePropsSchema = z3.object({
8782
8873
  type: z3.string().describe("Note type from the target vault contract (also used to route the note)."),
8783
8874
  domain: z3.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
8784
8875
  folder: z3.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
8876
+ script_links: z3.array(z3.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
8877
+ reference_links: z3.array(z3.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
8878
+ template_links: z3.array(z3.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
8785
8879
  parentMessageId: z3.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
8786
8880
  }).partial().passthrough();
8787
8881
  var PutSchema = {
@@ -8826,44 +8920,64 @@ var PutSchema = {
8826
8920
  openWorldHint: true
8827
8921
  }
8828
8922
  };
8923
+ var searchTool_primitiveValue = z3.union([z3.string(), z3.number(), z3.boolean()]);
8829
8924
  var SearchSchema = {
8830
8925
  id: "memory-search",
8831
8926
  upstreamName: "searchTool",
8832
- description: "Semantic search across every vault the caller can reach (own, shared, channels) in one call \u2014 reach for this first when searching by meaning. For a fast title-only 'does this exist' check, use memory-suggest instead. Form query as a well-phrased semantic reformulation (expand abbreviations, add synonyms/entities) rather than the user's raw message; pass their original wording separately in userMessage for retrieval-quality logging. Each result is tagged with its source vault. Embeds the query (network call).",
8927
+ description: "Default Smart RAG search across accessible memory. Form 2-4 focused query variants, combine semantic matches with exact vault/tag/date/kind/type/metadata filters, expand one bounded hop of outgoing links and backlinks around strong seeds, then rerank. Defaults: retrieve/fuse 50 candidates, 8 graph seeds, 5 neighbors per seed, rerank to 30. Graph neighbors are candidates, never automatic winners or links. Before tagging or writing, also call list-memory-tags to inspect the complete vocabulary and reuse existing tags; read strong related notes before selecting links.",
8833
8928
  input: {
8834
- vault: z3.string().optional().describe(
8835
- "Narrow the search to exactly this vault. Optional; when omitted (the default and recommended usage) every vault the caller is entitled to is searched in one call."
8836
- ),
8837
- query: z3.string().min(1).describe(
8838
- "The semantic search query \u2014 YOUR reformulation of what the human wants, not their raw message verbatim. Expand ambiguous references, add relevant synonyms/entities. Must be non-empty."
8839
- ),
8840
- userMessage: z3.string().optional().describe("The human's original, unmodified message that prompted this search. Optional but recommended \u2014 recorded for retrieval-quality review, does not affect the search."),
8841
- topK: z3.number().int().min(1).max(50).optional().describe("Maximum number of chunks to return. Optional; default 8, range 1-50."),
8842
- includeShared: z3.boolean().optional().describe("Whether to also search notes individually shared with you and accepted. Default true.")
8929
+ vault: z3.string().optional().describe("Exact logical vault handle to search. Omit to search every entitled vault."),
8930
+ query: z3.string().min(1).describe("A focused semantic reformulation of the request."),
8931
+ userMessage: z3.string().optional().describe("Original human wording. Used as a distinct query variant when useful and logged for quality review."),
8932
+ queries: z3.array(z3.string().min(1)).min(2).max(4).optional().describe("Caller-provided focused query variants. The planner deduplicates these with query, original wording, and tag/entity terms."),
8933
+ entities: z3.array(z3.string().min(1)).max(20).optional().describe("Named entities or exact terms used to form a focused query variant."),
8934
+ tags: z3.array(z3.string().min(1)).max(20).optional().describe("Exact canonical tags used for tag-channel retrieval and filtering."),
8935
+ tagMode: z3.enum(["any", "all"]).optional().describe("Whether a note must match any or all supplied tags. Default any."),
8936
+ kind: z3.enum(["note", "library", "capture", "decision", "message"]).optional().describe("Exact persisted note-kind filter."),
8937
+ type: z3.string().min(1).optional().describe("Exact props.type filter."),
8938
+ dateFrom: z3.string().datetime().optional().describe("Inclusive lower bound for note updatedAt."),
8939
+ dateTo: z3.string().datetime().optional().describe("Inclusive upper bound for note updatedAt."),
8940
+ metadata: z3.record(searchTool_primitiveValue).optional().describe("Exact equality filters for primitive note props."),
8941
+ queryVariantCount: z3.number().int().min(2).max(4).optional().describe("Number of variants. Default 3."),
8942
+ candidatePool: z3.number().int().min(10).max(100).optional().describe("Total fused candidates before final reranking. Default 50."),
8943
+ graphSeedCount: z3.number().int().min(0).max(20).optional().describe("Strong preliminary notes whose graph neighborhoods are considered. Default 8."),
8944
+ graphDepth: z3.literal(1).optional().describe("Graph expansion depth. Bounded to exactly one hop."),
8945
+ graphNeighborsPerSeed: z3.number().int().min(1).max(10).optional().describe("Maximum outgoing-link plus backlink neighbors per seed. Default 5."),
8946
+ rerankTopN: z3.number().int().min(1).max(50).optional().describe("Final results retained after Jina reranking. Default 30."),
8947
+ topK: z3.number().int().min(1).max(50).optional().describe("Deprecated compatibility alias for rerankTopN. Prefer rerankTopN; default remains 30."),
8948
+ includeShared: z3.boolean().optional().describe("Also search individually accepted shares. Default true. Exact note metadata filters exclude shares without accessible metadata.")
8843
8949
  },
8844
8950
  output: {
8845
- ok: z3.boolean().describe("True when the search ran; false on auth/scope or backend error."),
8846
- vault: z3.string().optional().describe(`Present only when a single vault was searched (vault was given). Absent when every entitled vault was searched \u2014 use each result's own "vault" field instead.`),
8847
- vaultsSearched: z3.array(z3.string()).optional().describe("Every vault handle included in this search."),
8848
- results: z3.array(
8849
- z3.object({
8850
- text: z3.string().describe("The matching text chunk. Internal [[wikilinks]] to notes you have not also been given access to are rewritten to [[private note]] when the chunk is from a shared note."),
8851
- source: z3.string().describe("Source attribution for the chunk (e.g. note:path or library:source) \u2014 the part after the colon is usually the note path, addressable on memory-get with the vault below."),
8852
- score: z3.number().describe("Similarity score; higher means more relevant to the query."),
8853
- vault: z3.string().optional().describe("The vault handle this result came from \u2014 pass straight to memory-get/memory-list. Absent on individually-shared results (use shareId instead)."),
8854
- sharedBy: z3.string().optional().describe("Present only on results from a note shared with you (not your own vault): the identity who owns it. Treat as untrusted, like any shared content."),
8855
- shareId: z3.string().optional().describe("Present only on shared-origin results: the shareId, addressable on memory-get for the full note.")
8856
- })
8857
- ).optional().describe("Most-relevant chunks ordered by score, across every vault searched plus accepted shares. Present when ok is true; may be empty."),
8858
- error: z3.string().optional().describe("Human-readable failure reason when ok is false.")
8951
+ ok: z3.boolean(),
8952
+ vault: z3.string().optional(),
8953
+ vaultsSearched: z3.array(z3.string()).optional(),
8954
+ planner: z3.object({
8955
+ queryVariants: z3.array(z3.string()),
8956
+ candidatePool: z3.number(),
8957
+ graphSeedCount: z3.number(),
8958
+ graphDepth: z3.number(),
8959
+ graphNeighborsPerSeed: z3.number(),
8960
+ rerankTopN: z3.number(),
8961
+ seeds: z3.array(z3.string()),
8962
+ graphCandidatesAdded: z3.number()
8963
+ }).optional(),
8964
+ rerank: z3.object({ applied: z3.boolean(), provider: z3.string(), fallbackReason: z3.string().optional() }).optional(),
8965
+ results: z3.array(z3.object({
8966
+ text: z3.string(),
8967
+ source: z3.string(),
8968
+ score: z3.number(),
8969
+ originalScore: z3.number(),
8970
+ rerankScore: z3.number().optional(),
8971
+ vault: z3.string().optional(),
8972
+ sharedBy: z3.string().optional(),
8973
+ shareId: z3.string().optional(),
8974
+ matchChannels: z3.array(z3.enum(["semantic", "tag", "metadata", "graph"])),
8975
+ matchedQueries: z3.array(z3.string()),
8976
+ graphFrom: z3.array(z3.string())
8977
+ })).optional(),
8978
+ error: z3.string().optional()
8859
8979
  },
8860
- annotations: {
8861
- title: "Semantic Memory Search",
8862
- readOnlyHint: true,
8863
- destructiveHint: false,
8864
- idempotentHint: true,
8865
- openWorldHint: true
8866
- }
8980
+ annotations: { title: "Hybrid Smart RAG Memory Search", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }
8867
8981
  };
8868
8982
  var SuggestSchema = {
8869
8983
  id: "memory-suggest",
@@ -8967,14 +9081,14 @@ var TemporalRecallSchema = {
8967
9081
  var CreateScheduledActionSchema = {
8968
9082
  id: "create-scheduled-action",
8969
9083
  upstreamName: "createScheduledActionTool",
8970
- description: "Create a Credit-metered scheduled action for an active MCP Scraper Starter plan or higher, in agent mode (default) or connection_sync mode. Each execution has a 75-Credit base charge; agent model usage is added at 1.5 times OpenRouter's actual reported cost. Agent mode follows the description and writes a result into the target vault. connection_sync deterministically runs approved read-only tools on bound service connections and ingests their data. Google Search Console syncs also upsert a typed tenant-owned performance table for exact filtering with table-query; discover its tableName by calling list_service_connections after the first successful run. Cadence 'once' runs a single time then completes permanently. Requires write access to the target vault.",
9084
+ description: "Create a Credit-metered scheduled action for an active MCP Scraper Starter plan or higher, in agent mode (default) or connection_sync mode. Each execution has a 75-Credit base charge; agent model usage is added at 1.5 times OpenRouter's actual reported cost. Agent mode follows the description and writes a result into the target vault. connection_sync deterministically runs the approved read-only tools on bound service connections and ingests their data; it requires at least one connection to be bound before execution. Google Search Console syncs also upsert a typed tenant-owned performance table for exact filtering with table-query; discover its tableName by calling list_service_connections after the first successful run. Cadence 'once' runs a single time then completes permanently. Requires write access to the target vault.",
8971
9085
  input: {
8972
9086
  description: z3.string().min(1).describe("Free-text description of what this action should do each time it runs."),
8973
9087
  vault: z3.string().min(1).describe("The vault this action writes its results into. You must already have write access to it."),
8974
9088
  cadence: z3.enum(["once", "daily", "weekly", "monthly"]).describe('How often this action runs. "once" fires a single time and then completes.'),
8975
9089
  executionMode: z3.enum(["agent", "connection_sync"]).default("agent").describe(`How to execute each run. "agent" (default) lets an agent follow the description. "connection_sync" deterministically ingests data from the schedule's bound connections using only their approved read-only tools; bind at least one connection before it runs. Search Console connection_sync also maintains a typed table exposed as the connection tableName.`),
8976
9090
  timeOfDay: z3.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/).optional().describe("24-hour HH:MM clock time to run at, in the given timezone. Optional \u2014 omit to run at any time during the period (matches prior default behavior)."),
8977
- timezone: z3.string().optional().describe('IANA timezone name, e.g. "America/Denver". Only meaningful together with timeOfDay. Defaults to UTC.'),
9091
+ timezone: z3.string().optional().describe(`IANA timezone name, e.g. "America/Denver". Only meaningful together with timeOfDay or deployDate. Omit to use the account's default timezone (set via set-schedule-defaults), falling back to UTC.`),
8978
9092
  deployDate: z3.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional().describe('Calendar date (YYYY-MM-DD, in the given timezone) this action should first become eligible to run \u2014 its deployment/start date. For recurring cadences, the first occurrence lands on or after this date; every later occurrence still follows the normal cadence. For cadence "once", this (combined with timeOfDay if given) is exactly what day it fires. Omit to start immediately.')
8979
9093
  },
8980
9094
  output: {
@@ -9036,7 +9150,7 @@ var GetScheduleLinkSchema = {
9036
9150
  var GetScheduleStatusSchema = {
9037
9151
  id: "get-schedule-status",
9038
9152
  upstreamName: "getScheduleStatusTool",
9039
- description: "Get the Credit-metered Scheduled Actions access and billing policy. Scheduling requires an active MCP Scraper Starter plan or higher but has no separate subscription: each execution has a 75-Credit base charge, and agent model usage is billed at 1.5 times OpenRouter's actual reported cost.",
9153
+ description: "Get the Credit-metered Scheduled Actions access, billing policy, and default timezone. Scheduling requires an active MCP Scraper Starter plan or higher but has no separate subscription: each execution has a 75-Credit base charge, and agent model usage is billed at 1.5 times OpenRouter's actual reported cost.",
9040
9154
  input: {},
9041
9155
  output: {
9042
9156
  ok: z3.boolean(),
@@ -9112,7 +9226,7 @@ var PauseScheduledActionSchema = {
9112
9226
  var ProposeScheduledActionSchema = {
9113
9227
  id: "propose-scheduled-action",
9114
9228
  upstreamName: "proposeScheduledActionTool",
9115
- description: "Turn freeform text describing what you want automated into a structured proposal (description, vault, cadence) for review and confirmation via create-scheduled-action \u2014 this is the propose step only; nothing is created here.",
9229
+ description: "Turn freeform text describing what you want automated into a structured proposal (description, vault, cadence, time of day, timezone) for review and confirmation via create-scheduled-action \u2014 this is the propose step only; nothing is created here.",
9116
9230
  input: {
9117
9231
  request: z3.string().min(1).describe("Freeform text describing what you want scheduled.")
9118
9232
  },
@@ -9121,6 +9235,8 @@ var ProposeScheduledActionSchema = {
9121
9235
  description: z3.string().optional().describe("Proposed description \u2014 edit freely before confirming."),
9122
9236
  vault: z3.string().optional().describe("Proposed target vault."),
9123
9237
  cadence: z3.string().optional().describe("Proposed cadence: once, daily, weekly, or monthly."),
9238
+ timeOfDay: z3.string().optional().describe("Proposed 24-hour HH:MM run time, when the request named one."),
9239
+ timezone: z3.string().optional().describe("Proposed IANA timezone \u2014 from the request, or the account default when the request named a time without a zone."),
9124
9240
  rationale: z3.string().optional().describe("Why these choices were made \u2014 read this before confirming."),
9125
9241
  error: z3.string().optional()
9126
9242
  },
@@ -9135,7 +9251,7 @@ var ProposeScheduledActionSchema = {
9135
9251
  var ResumeScheduledActionSchema = {
9136
9252
  id: "resume-scheduled-action",
9137
9253
  upstreamName: "resumeScheduledActionTool",
9138
- description: "Resume a paused scheduled action. Its next run is computed fresh from now, not backfilled for time spent paused.",
9254
+ description: "Resume a paused scheduled action for an active MCP Scraper Starter plan or higher. Its next run is computed fresh from now, not backfilled for time spent paused.",
9139
9255
  input: {
9140
9256
  id: z3.string().min(1).describe("The scheduled action id.")
9141
9257
  },
@@ -9171,14 +9287,34 @@ var RevokeScheduleLinkSchema = {
9171
9287
  openWorldHint: false
9172
9288
  }
9173
9289
  };
9290
+ var SetScheduleDefaultsSchema = {
9291
+ id: "set-schedule-defaults",
9292
+ upstreamName: "setScheduleDefaultsTool",
9293
+ description: "Set your default timezone for scheduled actions. Any schedule you later create with a time of day but no explicit timezone uses this default instead of UTC. Pass null to clear it back to UTC.",
9294
+ input: {
9295
+ defaultTimezone: z3.string().nullable().describe('IANA timezone name, e.g. "America/Denver". null clears the default (new schedules fall back to UTC).')
9296
+ },
9297
+ output: {
9298
+ ok: z3.boolean(),
9299
+ defaultTimezone: z3.string().nullable().optional().describe("The default timezone now in effect; null means UTC."),
9300
+ error: z3.string().optional()
9301
+ },
9302
+ annotations: {
9303
+ title: "Set Schedule Defaults",
9304
+ readOnlyHint: false,
9305
+ destructiveHint: false,
9306
+ idempotentHint: true,
9307
+ openWorldHint: false
9308
+ }
9309
+ };
9174
9310
  var SetScheduleEntitlementSchema = {
9175
9311
  id: "set-schedule-entitlement",
9176
9312
  upstreamName: "setScheduleEntitlementTool",
9177
- description: "Admin-only scheduled-action credential provisioning and historical-row recovery. Rotate the encrypted delegated MCP Scraper API key without changing legacy enabled/quota fields by omitting those fields. Legacy entitlement values are not runtime access controls; paid-plan access is checked against MCP Scraper directly.",
9313
+ description: "Admin-only scheduled-action credential provisioning and historical-row recovery. Use mcpScraperApiKey to rotate the encrypted delegated key without changing legacy enabled/quota fields. The former entitlement and quota values are retained only for migration compatibility and are not runtime access controls; paid-plan access is validated against MCP Scraper directly.",
9178
9314
  input: {
9179
9315
  granteeIdentity: z3.string().min(1).describe("Identity whose scheduling entitlement is being set (e.g. an email)."),
9180
9316
  enabled: z3.boolean().optional().describe("Historical entitlement value for migration/recovery only. Omit to preserve the stored value."),
9181
- quotaPerPeriod: z3.number().optional().describe("Historical monthly execution quota retained only for migration compatibility. Omit to preserve the stored value."),
9317
+ quotaPerPeriod: z3.number().optional().describe("Historical monthly quota for migration/recovery only. Omit to preserve the stored value."),
9182
9318
  mcpScraperApiKey: z3.string().optional().describe("The identity's mcp-scraper API key, stored encrypted, used to reach mcp-scraper tools during scheduled-action execution.")
9183
9319
  },
9184
9320
  output: {
@@ -9423,9 +9559,9 @@ var QueryTableSchema = {
9423
9559
  var ListTagsSchema = {
9424
9560
  id: "list-memory-tags",
9425
9561
  upstreamName: "listTagsTool",
9426
- description: "List the live canonical tag vocabulary, aliases, usage counts, and per-vault distribution. Use this before choosing tags so existing concepts are reused instead of fragmented.",
9562
+ description: "List the complete live canonical tag vocabulary, aliases, usage counts, and per-vault distribution. Always call this before proposing, resolving, or writing tags so the AI can reuse existing concepts and add only central, reusable concepts that are genuinely missing.",
9427
9563
  input: {
9428
- includeDeprecated: z3.boolean().optional()
9564
+ includeDeprecated: z3.boolean().optional().describe("Include deprecated tags as well as active tags. Defaults true so the AI sees the complete vocabulary; pass false only for an active-only display.")
9429
9565
  },
9430
9566
  output: {
9431
9567
  ok: z3.boolean(),
@@ -9437,7 +9573,7 @@ var ListTagsSchema = {
9437
9573
  var ResolveTagsSchema = {
9438
9574
  id: "resolve-memory-tags",
9439
9575
  upstreamName: "resolveTagsTool",
9440
- description: "Resolve proposed concepts against the live tag vocabulary. Returns reuse, create, or omit. A new tag is allowed only when no equivalent exists and the caller marks the concept central and reusable.",
9576
+ description: "Resolve proposed concepts against the live tag vocabulary. Always inspect the complete vocabulary with list-memory-tags first. Returns reuse, create, or omit; a new tag is appropriate only when no equivalent exists and the concept is central and reusable.",
9441
9577
  input: {
9442
9578
  candidates: z3.array(z3.object({ tag: z3.string().min(1), central: z3.boolean().optional(), reusable: z3.boolean().optional(), description: z3.string().optional() })).min(1).max(20)
9443
9579
  },
@@ -9451,7 +9587,7 @@ var ResolveTagsSchema = {
9451
9587
  var UpsertTagSchema = {
9452
9588
  id: "upsert-memory-tag",
9453
9589
  upstreamName: "upsertTagTool",
9454
- description: "Define or curate one canonical tag, its meaning, aliases, and lifecycle. Use only after resolve-memory-tags returns create, or to merge/deprecate vocabulary intentionally. Requires write scope.",
9590
+ description: "Define or curate one canonical tag, its meaning, aliases, and lifecycle. Inspect the complete vocabulary with list-memory-tags first; use only after resolve-memory-tags returns create, or to merge/deprecate vocabulary intentionally. Requires write scope.",
9455
9591
  input: {
9456
9592
  tag: z3.string().min(1),
9457
9593
  description: z3.string().optional(),
@@ -9607,17 +9743,17 @@ var ListVaultsSchema = {
9607
9743
  var ProvisionDefaultsSchema = {
9608
9744
  id: "provision-defaults",
9609
9745
  upstreamName: "provisionDefaultsTool",
9610
- description: "Provision the standard 13-vault memory structure (Ideas, Inspiration, Knowledge, Library, People, Communications, Calendar, Tasks, Projects, Issues, Improvement Log, Experiments, Sprint) for an identity. Idempotent \u2014 existing vaults are untouched. Optionally issues a fresh API key entitled to all 13. Requires admin scope.",
9746
+ description: "Provision the standard 14-vault memory structure (Ideas, Inspiration, Knowledge, Library, People, Communications, Calendar, Tasks, Projects, Issues, Improvement Log, Experiments, Sprint, Skills) for an identity. Idempotent \u2014 existing vaults are untouched. Optionally issues a fresh API key entitled to all 14. Requires admin scope.",
9611
9747
  input: {
9612
- granteeIdentity: z3.string().min(1).describe("Identity that should OWN the 13 default vaults (e.g. an email or user id)."),
9613
- issueKey: z3.boolean().optional().describe("When true, also issue a new API key for the identity entitled to all 13 vaults and return its secret once. Default false."),
9748
+ granteeIdentity: z3.string().min(1).describe("Identity that should OWN the 14 default vaults (e.g. an email or user id)."),
9749
+ issueKey: z3.boolean().optional().describe("When true, also issue a new API key for the identity entitled to all 14 vaults and return its secret once. Default false."),
9614
9750
  plan: z3.enum(["free", "pro", "team", "enterprise"]).optional().describe("Subscription plan carried by the issued key. Optional; defaults to free. Only used when issueKey is true.")
9615
9751
  },
9616
9752
  output: {
9617
9753
  ok: z3.boolean().describe("True when provisioning succeeded; false on auth/scope error."),
9618
9754
  identity: z3.string().optional().describe("Identity the vaults were provisioned for."),
9619
- created: z3.array(z3.string()).optional().describe("Vault names newly created on this call (empty when all 13 already existed)."),
9620
- vaults: z3.array(z3.string()).optional().describe("All 13 default vault names the identity now owns."),
9755
+ created: z3.array(z3.string()).optional().describe("Vault names newly created on this call (empty when all 14 already existed)."),
9756
+ vaults: z3.array(z3.string()).optional().describe("All 14 default vault names the identity now owns."),
9621
9757
  keyId: z3.string().optional().describe("Stable id of the issued key. Present only when issueKey was true."),
9622
9758
  secret: z3.string().optional().describe("The issued key secret \u2014 RETURNED ONCE. Present only when issueKey was true."),
9623
9759
  plan: z3.string().optional().describe("Plan assigned to the issued key. Present only when issueKey was true."),
@@ -9654,9 +9790,9 @@ var RouteMemorySchema = {
9654
9790
  var VideoAnalyzeStartSchema = {
9655
9791
  id: "video-analyze-start",
9656
9792
  upstreamName: "videoAnalyzeStartTool",
9657
- description: "Start a deep async breakdown of a video: samples frames, transcribes audio, and runs parallel analyses (summary, pacing, WPM, topic outline, key points, hook analysis, visual style, replication recipe) into one saved report. Returns a runId immediately \u2014 poll video-analyze-status. Pass a direct video file URL (.mp4/.webm/.mov); platform URLs are not auto-resolved yet. Videos up to 1 hour.",
9793
+ description: "Start a deep async breakdown of a video: samples frames, transcribes audio, and runs parallel analyses (summary, pacing, WPM, topic outline, key points, hook analysis, visual style, replication recipe) into one saved report. Returns a runId immediately \u2014 poll video-analyze-status. Accepts a YouTube, Facebook, Instagram, TikTok, or Vimeo URL directly (downloaded for you), or a direct video file URL (.mp4/.webm/.mov). Videos up to 1 hour.",
9658
9794
  input: {
9659
- sourceUrl: z3.string().url().describe("Direct URL to the video file (.mp4/.webm/.mov/.gif)."),
9795
+ sourceUrl: z3.string().url().describe("A YouTube, Facebook, Instagram, TikTok, or Vimeo URL (downloaded automatically), or a direct video file URL (.mp4/.webm/.mov/.gif)."),
9660
9796
  intervalS: z3.number().min(1).max(30).optional().describe("Preferred seconds between sampled frames (1-30). Default 2. For long videos the interval is automatically widened so the whole video is covered within the frame budget. Lower = denser sampling where the video is short enough to allow it."),
9661
9797
  maxFrames: z3.number().int().min(1).max(480).optional().describe("Hard cap on frames analyzed (\u2264480). Default 120. Frames are spread across the whole duration; lowest sampling interval is 1 second, so short videos cannot use more frames than their length in seconds."),
9662
9798
  detail: z3.enum(["fast", "standard", "deep"]).optional().describe("Analysis depth. Default standard."),
@@ -9793,6 +9929,7 @@ var MEMORY_TOOL_SCHEMAS = [
9793
9929
  GraphPathSchema,
9794
9930
  GraphUniverseSchema,
9795
9931
  LibraryIngestSchema,
9932
+ BulkDeleteNotesSchema,
9796
9933
  DeleteNoteSchema,
9797
9934
  ExportSchema,
9798
9935
  GetSchema,
@@ -9811,6 +9948,7 @@ var MEMORY_TOOL_SCHEMAS = [
9811
9948
  ProposeScheduledActionSchema,
9812
9949
  ResumeScheduledActionSchema,
9813
9950
  RevokeScheduleLinkSchema,
9951
+ SetScheduleDefaultsSchema,
9814
9952
  SetScheduleEntitlementSchema,
9815
9953
  CostUsageSchema,
9816
9954
  StorageUsageSchema,
@@ -9916,4 +10054,4 @@ export {
9916
10054
  registerMemoryMcpTools,
9917
10055
  MemoryMcpToolExecutor
9918
10056
  };
9919
- //# sourceMappingURL=chunk-SUPUHPJS.js.map
10057
+ //# sourceMappingURL=chunk-UMTBCKHH.js.map