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
@@ -351,7 +351,12 @@ var HttpMcpToolExecutor = class {
351
351
  return this.call("/billing/credits", input);
352
352
  }
353
353
  listServiceConnections(input) {
354
- return this.getJson("/schedule-connections");
354
+ return this.getJson("/integrations");
355
+ }
356
+ testServiceConnection(input) {
357
+ return this.call(`/integrations/${encodeURIComponent(input.connectionId)}/test`, {
358
+ ...input.providerConfigKey ? { providerConfigKey: input.providerConfigKey } : {}
359
+ });
355
360
  }
356
361
  slackSendMessage(input) {
357
362
  return this.call("/schedule-connections/actions/slack/send-message", input);
@@ -366,13 +371,13 @@ var HttpMcpToolExecutor = class {
366
371
  return this.call("/schedule-connections/actions/zoom/create-meeting", input);
367
372
  }
368
373
  readServiceConnection(input) {
369
- return this.call("/schedule-connections/actions/read", input);
374
+ return this.call("/integrations/actions/read", input);
370
375
  }
371
376
  importServiceConnectionToMemory(input) {
372
377
  return this.call("/schedule-connections/actions/import-memory", input);
373
378
  }
374
379
  describeServiceConnectionTool(input) {
375
- return this.call("/schedule-connections/actions/describe", input);
380
+ return this.call("/integrations/actions/describe", input);
376
381
  }
377
382
  exportConnectedServiceData(input) {
378
383
  const timeoutMs = this.httpTimeoutOverrideMs ?? 29e4;
@@ -386,7 +391,7 @@ var HttpMcpToolExecutor = class {
386
391
  return this.call("/schedule-connections/actions/export-download", input);
387
392
  }
388
393
  callServiceConnectionAction(input) {
389
- return this.call("/schedule-connections/actions/call", input);
394
+ return this.call("/integrations/actions/call", input);
390
395
  }
391
396
  setScheduledActionConnections(input) {
392
397
  return this.call(`/schedule-actions/${encodeURIComponent(input.scheduleActionId)}/connections`, {
@@ -556,7 +561,7 @@ render();
556
561
  }
557
562
 
558
563
  // src/version.ts
559
- var PACKAGE_VERSION = "0.24.0";
564
+ var PACKAGE_VERSION = "0.26.0";
560
565
 
561
566
  // src/mcp/browser-agent-tool-schemas.ts
562
567
  var import_zod = require("zod");
@@ -2871,6 +2876,12 @@ var SCHEDULED_RUN_BASE_CREDITS = 75;
2871
2876
  var SCHEDULED_RUN_BASE_MC = SCHEDULED_RUN_BASE_CREDITS * MC_PER_CREDIT;
2872
2877
  var SCHEDULED_AGENT_LLM_MARKUP_BPS = 15e3;
2873
2878
  var SCHEDULED_AGENT_LLM_MARKUP = SCHEDULED_AGENT_LLM_MARKUP_BPS / BILLING_BASIS_POINTS;
2879
+ var CONNECTED_FUNCTION_RUN_CREDITS = 2;
2880
+ var CONNECTED_PROXY_REQUEST_CREDITS = 2;
2881
+ var CONNECTED_COMPUTE_CREDITS_PER_SECOND = 5;
2882
+ var CONNECTED_FUNCTION_RUN_MC = CONNECTED_FUNCTION_RUN_CREDITS * MC_PER_CREDIT;
2883
+ var CONNECTED_PROXY_REQUEST_MC = CONNECTED_PROXY_REQUEST_CREDITS * MC_PER_CREDIT;
2884
+ var CONNECTED_COMPUTE_MC_PER_SECOND = CONNECTED_COMPUTE_CREDITS_PER_SECOND * MC_PER_CREDIT;
2874
2885
  var CREDIT_COST_CATALOG = [
2875
2886
  {
2876
2887
  key: "serp",
@@ -5673,6 +5684,9 @@ Multi-step orchestrations \u2014 prefer these over hand-chaining primitives when
5673
5684
  is \`done\`.
5674
5685
 
5675
5686
  ## Notes
5687
+ - Connected-service lifecycle and availability are separate. A connection can remain \`connected\` while
5688
+ \`operationalStatus\` is \`unavailable\`; call \`test_service_connection\` before recommending reconnect.
5689
+ Recommend reconnect only when \`reconnectRequired\` is true.
5676
5690
  - Bulk / full-site crawls: call \`extract_site\` with \`rotateProxies:true\` for blocked or rate-limited
5677
5691
  sites. It returns a saved folder/artifact plus a summary, not the full content inline.
5678
5692
  - Browser sessions and media transcription cost credits and take longer \u2014 prefer the cheapest tool that
@@ -5681,6 +5695,10 @@ Multi-step orchestrations \u2014 prefer these over hand-chaining primitives when
5681
5695
  when connected Graph media did not provide a playable source. It is not a bypass for URL/SSRF restrictions.
5682
5696
  - Large results are saved to disk or an artifact and returned as a summary plus a path or artifactId;
5683
5697
  read it back for full detail rather than expecting the whole payload inline.
5698
+ - Before using a connected account, call \`list_service_connections\` and match the intended provider-side
5699
+ identity from \`providerAccountEmail\` or \`providerAccountName\`, not the MCP Scraper login. If
5700
+ \`providerIdentityStatus\` is \`unavailable\`, ask the person to refresh that connection before assuming
5701
+ which external account it represents.
5684
5702
  - For Google Search Console, use \`export_connected_service_data\` with
5685
5703
  \`dataset:"search_console_performance"\` when the person asks for a fresh JSONL download. When they
5686
5704
  ask to schedule ingestion or repeatedly filter historical rows, create a \`connection_sync\` schedule,
@@ -5693,7 +5711,7 @@ Multi-step orchestrations \u2014 prefer these over hand-chaining primitives when
5693
5711
 
5694
5712
  ## Memory
5695
5713
  mcp-scraper also exposes persistent per-user memory tools (notes, facts, vaults,
5696
- scheduled actions, tables, channels) backed by memory.mcpscraper.dev. Every account starts with 13
5714
+ scheduled actions, tables, channels) backed by memory.mcpscraper.dev. Every account starts with 14
5697
5715
  vaults \u2014 call **list-vaults** to see what exists before creating anything new. Pick the vault whose job
5698
5716
  matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled lessons/how-tos),
5699
5717
  **Library** (raw source material \u2014 articles, transcripts), **People** (one durable note per person/org),
@@ -5701,7 +5719,8 @@ matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled
5701
5719
  (action items with a status), **Projects** (durable named initiatives), **Issues** (something broken),
5702
5720
  **Improvement Log** (receipts of changes made and whether they worked), **Experiments** (hypothesis +
5703
5721
  measured result), **Sprint** (current cycle's scope), **Inspiration** (other people's work worth
5704
- studying).
5722
+ studying), **Skills** (reusable skill packages; each requires \`scripts/\` and at least one of
5723
+ \`references/\` or \`templates/\`, and may use both).
5705
5724
  For a normal new narrative note, call **prepare-memory-write** first. It queries the live vault contract,
5706
5725
  tag vocabulary, and natural neighbor vaults, and returns interlink candidates that must be read before
5707
5726
  acceptance. Compose every returned template section, then call **memory-capture**, which validates the
@@ -5731,6 +5750,12 @@ Tags are live vocabulary, not improvised labels: **list-memory-tags** shows what
5731
5750
  reusable, and has no exact, alias, or near-equivalent. Use **memory-backlinks**,
5732
5751
  **memory-graph-universe**, and **memory-graph-path** to trace the linked universe across vaults.
5733
5752
 
5753
+ **Always inspect the complete tag inventory and related notes first.** Use hybrid Smart RAG by default:
5754
+ form 3 focused queries (2\u20134 when useful), fuse exact tag/metadata/vault/date and semantic matches into 50
5755
+ candidates, expand the top 8 seeds by one link/backlink hop with at most 5 neighbors each, then Jina-rerank
5756
+ the combined pool to the best 30. Graph neighbors are candidates, never automatic links; add only links
5757
+ supported by the note contents.
5758
+
5734
5759
  Scrape deposits are raw evidence and therefore go to **Library** through **library-ingest**, with the full
5735
5760
  Library template and source metadata. If the source contains durable applicable guidance, create a separate
5736
5761
  Knowledge companion through prepare-memory-write + memory-capture and link it to the Library source with
@@ -7129,8 +7154,14 @@ var ListServiceConnectionsOutputSchema = {
7129
7154
  connectionId: import_zod4.z.string(),
7130
7155
  providerConfigKey: import_zod4.z.string(),
7131
7156
  provider: import_zod4.z.string().nullable().optional(),
7132
- label: import_zod4.z.string(),
7157
+ label: import_zod4.z.string().describe("Best verified provider-side account label. This is never derived from the MCP Scraper login email."),
7158
+ providerAccountId: import_zod4.z.string().nullable().describe("Provider-side account or principal identifier when safely discoverable. This is not the MCP Scraper user id."),
7159
+ providerAccountEmail: import_zod4.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."),
7160
+ providerAccountName: import_zod4.z.string().nullable().describe("Actual provider-side person, workspace, channel, or organization name when available."),
7161
+ providerIdentityStatus: import_zod4.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."),
7133
7162
  status: import_zod4.z.string(),
7163
+ lifecycleStatus: import_zod4.z.enum(["pending", "connected", "needs_reauth", "disconnecting", "disconnected"]).optional().describe("Credential lifecycle. This is separate from current provider availability."),
7164
+ operationalStatus: import_zod4.z.enum(["unknown", "available", "degraded", "unavailable"]).optional().describe("Last observed provider transport availability. Unavailable does not imply reconnect is required."),
7134
7165
  reconnectRequired: import_zod4.z.boolean().optional(),
7135
7166
  transport: import_zod4.z.enum(["nango", "remote_mcp"]).describe("Credential transport behind this tenant-scoped connection. Tokens and API keys are never returned."),
7136
7167
  actionsEnabled: import_zod4.z.boolean(),
@@ -7153,10 +7184,27 @@ var ListServiceConnectionsOutputSchema = {
7153
7184
  mcpEndpoint: import_zod4.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."),
7154
7185
  schemaDiscovery: import_zod4.z.enum(["connection_tools_list", "compatibility_describe"]).describe("How clients discover this connection's exact live provider schemas."),
7155
7186
  toolRevision: import_zod4.z.string().nullable().describe("Opaque revision of the resolved live tool catalog, when available. It changes when provider tools or policy change."),
7187
+ lastCheckedAt: import_zod4.z.string().nullable().optional(),
7188
+ lastSuccessfulCallAt: import_zod4.z.string().nullable().optional(),
7189
+ lastFailureAt: import_zod4.z.string().nullable().optional(),
7190
+ lastFailureCode: import_zod4.z.string().nullable().optional(),
7191
+ lastFailureRetryable: import_zod4.z.boolean().nullable().optional(),
7156
7192
  vaultName: import_zod4.z.string().nullable().describe("Memory vault this connection's digest writes into, if it has run at least once. Search it with memory-search."),
7157
7193
  tableName: import_zod4.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.")
7158
7194
  }))
7159
7195
  };
7196
+ var TestServiceConnectionInputSchema = {
7197
+ connectionId: import_zod4.z.string().min(1).describe("A tenant-owned connectionId from list_service_connections."),
7198
+ providerConfigKey: import_zod4.z.string().min(1).optional().describe("Optional provider hint from list_service_connections.")
7199
+ };
7200
+ var TestServiceConnectionOutputSchema = {
7201
+ ok: import_zod4.z.boolean(),
7202
+ operationalStatus: import_zod4.z.enum(["available", "unavailable"]).optional(),
7203
+ checkedAt: import_zod4.z.string().optional(),
7204
+ toolCount: import_zod4.z.number().int().min(0).optional(),
7205
+ code: import_zod4.z.string().optional(),
7206
+ error: NullableString2
7207
+ };
7160
7208
  var ReadServiceConnectionInputSchema = {
7161
7209
  connectionId: import_zod4.z.string().min(1).describe("A connectionId from list_service_connections."),
7162
7210
  tool: import_zod4.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."),
@@ -8129,11 +8177,18 @@ function registerPaaExtractorMcpTools(server2, executor, options = {}) {
8129
8177
  }, async (input) => formatCreditsInfo(await executor.creditsInfo(input), input));
8130
8178
  server2.registerTool("list_service_connections", {
8131
8179
  title: "List Connected Services",
8132
- 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.",
8180
+ 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.",
8133
8181
  inputSchema: ListServiceConnectionsInputSchema,
8134
8182
  outputSchema: recordOutputSchema("list_service_connections", ListServiceConnectionsOutputSchema),
8135
8183
  annotations: { title: "List Connected Services", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
8136
8184
  }, async (input) => executor.listServiceConnections(input));
8185
+ server2.registerTool("test_service_connection", {
8186
+ title: "Test Connected Service",
8187
+ 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.",
8188
+ inputSchema: TestServiceConnectionInputSchema,
8189
+ outputSchema: recordOutputSchema("test_service_connection", TestServiceConnectionOutputSchema),
8190
+ annotations: { title: "Test Connected Service", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }
8191
+ }, async (input) => executor.testServiceConnection(input));
8137
8192
  server2.registerTool("slack_send_message", {
8138
8193
  title: "Send Slack Message",
8139
8194
  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.",
@@ -8748,12 +8803,15 @@ var memoryCaptureTool_notePropsSchema = import_zod5.z.object({
8748
8803
  type: import_zod5.z.string().describe("Note type from the target vault contract (also used to route the note)."),
8749
8804
  domain: import_zod5.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
8750
8805
  folder: import_zod5.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
8806
+ script_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
8807
+ reference_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
8808
+ template_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
8751
8809
  parentMessageId: import_zod5.z.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
8752
8810
  }).partial().passthrough();
8753
8811
  var MemoryCaptureSchema = {
8754
8812
  id: "memory-capture",
8755
8813
  upstreamName: "memoryCaptureTool",
8756
- 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.",
8814
+ 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.",
8757
8815
  input: {
8758
8816
  vault: import_zod5.z.string(),
8759
8817
  folder: import_zod5.z.string().optional(),
@@ -8811,7 +8869,7 @@ var MemoryQuestionsSchema = {
8811
8869
  var PrepareMemoryWriteSchema = {
8812
8870
  id: "prepare-memory-write",
8813
8871
  upstreamName: "prepareMemoryWriteTool",
8814
- 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.",
8872
+ 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.",
8815
8873
  input: {
8816
8874
  title: import_zod5.z.string().min(1),
8817
8875
  content: import_zod5.z.string().min(1),
@@ -8847,6 +8905,9 @@ var validateMemoryWriteTool_notePropsSchema = import_zod5.z.object({
8847
8905
  type: import_zod5.z.string().describe("Note type from the target vault contract (also used to route the note)."),
8848
8906
  domain: import_zod5.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
8849
8907
  folder: import_zod5.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
8908
+ script_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
8909
+ reference_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
8910
+ template_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
8850
8911
  parentMessageId: import_zod5.z.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
8851
8912
  }).partial().passthrough();
8852
8913
  var ValidateMemoryWriteSchema = {
@@ -9302,6 +9363,39 @@ var LibraryIngestSchema = {
9302
9363
  openWorldHint: true
9303
9364
  }
9304
9365
  };
9366
+ var bulkDeleteNotesTool_FilterSchema = import_zod5.z.object({
9367
+ column: import_zod5.z.enum(["path", "title", "kind", "source", "captured_at", "created_at", "updated_at", "revision"]).describe("Note column to filter on."),
9368
+ op: import_zod5.z.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.'),
9369
+ value: import_zod5.z.unknown().describe('Value to compare against. For "in", pass an array.')
9370
+ });
9371
+ var BulkDeleteNotesSchema = {
9372
+ id: "bulk-delete-notes",
9373
+ upstreamName: "bulkDeleteNotesTool",
9374
+ 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).",
9375
+ input: {
9376
+ vault: import_zod5.z.string().optional().describe("Vault to delete from. Optional; defaults to the session active vault, then the first vault the caller is entitled to."),
9377
+ filters: import_zod5.z.array(bulkDeleteNotesTool_FilterSchema).default([]).describe("Filters to AND together. At least one of filters/tags is required."),
9378
+ tags: import_zod5.z.array(import_zod5.z.string()).optional().describe("Match notes carrying ANY of these tags (ORed among themselves, ANDed with filters). At least one of filters/tags is required."),
9379
+ dryRun: import_zod5.z.boolean().default(true).describe("When true (default), previews matches without deleting anything. Pass false to actually delete.")
9380
+ },
9381
+ output: {
9382
+ ok: import_zod5.z.boolean().describe("True on success; false on auth/scope/validation error."),
9383
+ vault: import_zod5.z.string().optional().describe("The vault operated on (after defaulting). Present when ok is true."),
9384
+ dryRun: import_zod5.z.boolean().optional().describe("Echoes whether this call was a preview or a real delete."),
9385
+ matchCount: import_zod5.z.number().optional().describe("Number of notes matching the filters. Present on a dry run."),
9386
+ sample: import_zod5.z.array(import_zod5.z.object({ path: import_zod5.z.string(), title: import_zod5.z.string(), updatedAt: import_zod5.z.string() })).optional().describe("Up to 20 matching notes, most-recently-updated first. Present on a dry run."),
9387
+ deleted: import_zod5.z.number().optional().describe("Number of notes actually deleted. Present when dryRun is false."),
9388
+ deletedPaths: import_zod5.z.array(import_zod5.z.string()).optional().describe("Paths of the deleted notes. Present when dryRun is false."),
9389
+ error: import_zod5.z.string().optional().describe("Human-readable failure reason when ok is false.")
9390
+ },
9391
+ annotations: {
9392
+ title: "Bulk Delete Notes",
9393
+ readOnlyHint: false,
9394
+ destructiveHint: true,
9395
+ idempotentHint: false,
9396
+ openWorldHint: false
9397
+ }
9398
+ };
9305
9399
  var DeleteNoteSchema = {
9306
9400
  id: "delete-note",
9307
9401
  upstreamName: "deleteNoteTool",
@@ -9383,6 +9477,9 @@ var getTool_notePropsSchema = import_zod5.z.object({
9383
9477
  type: import_zod5.z.string().describe("Note type from the target vault contract (also used to route the note)."),
9384
9478
  domain: import_zod5.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
9385
9479
  folder: import_zod5.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
9480
+ script_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
9481
+ reference_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
9482
+ template_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
9386
9483
  parentMessageId: import_zod5.z.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
9387
9484
  }).partial().passthrough();
9388
9485
  var GetSchema = {
@@ -9471,6 +9568,9 @@ var putTool_notePropsSchema = import_zod5.z.object({
9471
9568
  type: import_zod5.z.string().describe("Note type from the target vault contract (also used to route the note)."),
9472
9569
  domain: import_zod5.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
9473
9570
  folder: import_zod5.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
9571
+ script_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
9572
+ reference_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
9573
+ template_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
9474
9574
  parentMessageId: import_zod5.z.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
9475
9575
  }).partial().passthrough();
9476
9576
  var PutSchema = {
@@ -9515,44 +9615,64 @@ var PutSchema = {
9515
9615
  openWorldHint: true
9516
9616
  }
9517
9617
  };
9618
+ var searchTool_primitiveValue = import_zod5.z.union([import_zod5.z.string(), import_zod5.z.number(), import_zod5.z.boolean()]);
9518
9619
  var SearchSchema = {
9519
9620
  id: "memory-search",
9520
9621
  upstreamName: "searchTool",
9521
- 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).",
9622
+ 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.",
9522
9623
  input: {
9523
- vault: import_zod5.z.string().optional().describe(
9524
- "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."
9525
- ),
9526
- query: import_zod5.z.string().min(1).describe(
9527
- "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."
9528
- ),
9529
- userMessage: import_zod5.z.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."),
9530
- topK: import_zod5.z.number().int().min(1).max(50).optional().describe("Maximum number of chunks to return. Optional; default 8, range 1-50."),
9531
- includeShared: import_zod5.z.boolean().optional().describe("Whether to also search notes individually shared with you and accepted. Default true.")
9624
+ vault: import_zod5.z.string().optional().describe("Exact logical vault handle to search. Omit to search every entitled vault."),
9625
+ query: import_zod5.z.string().min(1).describe("A focused semantic reformulation of the request."),
9626
+ userMessage: import_zod5.z.string().optional().describe("Original human wording. Used as a distinct query variant when useful and logged for quality review."),
9627
+ queries: import_zod5.z.array(import_zod5.z.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."),
9628
+ entities: import_zod5.z.array(import_zod5.z.string().min(1)).max(20).optional().describe("Named entities or exact terms used to form a focused query variant."),
9629
+ tags: import_zod5.z.array(import_zod5.z.string().min(1)).max(20).optional().describe("Exact canonical tags used for tag-channel retrieval and filtering."),
9630
+ tagMode: import_zod5.z.enum(["any", "all"]).optional().describe("Whether a note must match any or all supplied tags. Default any."),
9631
+ kind: import_zod5.z.enum(["note", "library", "capture", "decision", "message"]).optional().describe("Exact persisted note-kind filter."),
9632
+ type: import_zod5.z.string().min(1).optional().describe("Exact props.type filter."),
9633
+ dateFrom: import_zod5.z.string().datetime().optional().describe("Inclusive lower bound for note updatedAt."),
9634
+ dateTo: import_zod5.z.string().datetime().optional().describe("Inclusive upper bound for note updatedAt."),
9635
+ metadata: import_zod5.z.record(searchTool_primitiveValue).optional().describe("Exact equality filters for primitive note props."),
9636
+ queryVariantCount: import_zod5.z.number().int().min(2).max(4).optional().describe("Number of variants. Default 3."),
9637
+ candidatePool: import_zod5.z.number().int().min(10).max(100).optional().describe("Total fused candidates before final reranking. Default 50."),
9638
+ graphSeedCount: import_zod5.z.number().int().min(0).max(20).optional().describe("Strong preliminary notes whose graph neighborhoods are considered. Default 8."),
9639
+ graphDepth: import_zod5.z.literal(1).optional().describe("Graph expansion depth. Bounded to exactly one hop."),
9640
+ graphNeighborsPerSeed: import_zod5.z.number().int().min(1).max(10).optional().describe("Maximum outgoing-link plus backlink neighbors per seed. Default 5."),
9641
+ rerankTopN: import_zod5.z.number().int().min(1).max(50).optional().describe("Final results retained after Jina reranking. Default 30."),
9642
+ topK: import_zod5.z.number().int().min(1).max(50).optional().describe("Deprecated compatibility alias for rerankTopN. Prefer rerankTopN; default remains 30."),
9643
+ includeShared: import_zod5.z.boolean().optional().describe("Also search individually accepted shares. Default true. Exact note metadata filters exclude shares without accessible metadata.")
9532
9644
  },
9533
9645
  output: {
9534
- ok: import_zod5.z.boolean().describe("True when the search ran; false on auth/scope or backend error."),
9535
- vault: import_zod5.z.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.`),
9536
- vaultsSearched: import_zod5.z.array(import_zod5.z.string()).optional().describe("Every vault handle included in this search."),
9537
- results: import_zod5.z.array(
9538
- import_zod5.z.object({
9539
- text: import_zod5.z.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."),
9540
- source: import_zod5.z.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."),
9541
- score: import_zod5.z.number().describe("Similarity score; higher means more relevant to the query."),
9542
- vault: import_zod5.z.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)."),
9543
- sharedBy: import_zod5.z.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."),
9544
- shareId: import_zod5.z.string().optional().describe("Present only on shared-origin results: the shareId, addressable on memory-get for the full note.")
9545
- })
9546
- ).optional().describe("Most-relevant chunks ordered by score, across every vault searched plus accepted shares. Present when ok is true; may be empty."),
9547
- error: import_zod5.z.string().optional().describe("Human-readable failure reason when ok is false.")
9646
+ ok: import_zod5.z.boolean(),
9647
+ vault: import_zod5.z.string().optional(),
9648
+ vaultsSearched: import_zod5.z.array(import_zod5.z.string()).optional(),
9649
+ planner: import_zod5.z.object({
9650
+ queryVariants: import_zod5.z.array(import_zod5.z.string()),
9651
+ candidatePool: import_zod5.z.number(),
9652
+ graphSeedCount: import_zod5.z.number(),
9653
+ graphDepth: import_zod5.z.number(),
9654
+ graphNeighborsPerSeed: import_zod5.z.number(),
9655
+ rerankTopN: import_zod5.z.number(),
9656
+ seeds: import_zod5.z.array(import_zod5.z.string()),
9657
+ graphCandidatesAdded: import_zod5.z.number()
9658
+ }).optional(),
9659
+ rerank: import_zod5.z.object({ applied: import_zod5.z.boolean(), provider: import_zod5.z.string(), fallbackReason: import_zod5.z.string().optional() }).optional(),
9660
+ results: import_zod5.z.array(import_zod5.z.object({
9661
+ text: import_zod5.z.string(),
9662
+ source: import_zod5.z.string(),
9663
+ score: import_zod5.z.number(),
9664
+ originalScore: import_zod5.z.number(),
9665
+ rerankScore: import_zod5.z.number().optional(),
9666
+ vault: import_zod5.z.string().optional(),
9667
+ sharedBy: import_zod5.z.string().optional(),
9668
+ shareId: import_zod5.z.string().optional(),
9669
+ matchChannels: import_zod5.z.array(import_zod5.z.enum(["semantic", "tag", "metadata", "graph"])),
9670
+ matchedQueries: import_zod5.z.array(import_zod5.z.string()),
9671
+ graphFrom: import_zod5.z.array(import_zod5.z.string())
9672
+ })).optional(),
9673
+ error: import_zod5.z.string().optional()
9548
9674
  },
9549
- annotations: {
9550
- title: "Semantic Memory Search",
9551
- readOnlyHint: true,
9552
- destructiveHint: false,
9553
- idempotentHint: true,
9554
- openWorldHint: true
9555
- }
9675
+ annotations: { title: "Hybrid Smart RAG Memory Search", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }
9556
9676
  };
9557
9677
  var SuggestSchema = {
9558
9678
  id: "memory-suggest",
@@ -9656,14 +9776,14 @@ var TemporalRecallSchema = {
9656
9776
  var CreateScheduledActionSchema = {
9657
9777
  id: "create-scheduled-action",
9658
9778
  upstreamName: "createScheduledActionTool",
9659
- 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.",
9779
+ 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.",
9660
9780
  input: {
9661
9781
  description: import_zod5.z.string().min(1).describe("Free-text description of what this action should do each time it runs."),
9662
9782
  vault: import_zod5.z.string().min(1).describe("The vault this action writes its results into. You must already have write access to it."),
9663
9783
  cadence: import_zod5.z.enum(["once", "daily", "weekly", "monthly"]).describe('How often this action runs. "once" fires a single time and then completes.'),
9664
9784
  executionMode: import_zod5.z.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.`),
9665
9785
  timeOfDay: import_zod5.z.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)."),
9666
- timezone: import_zod5.z.string().optional().describe('IANA timezone name, e.g. "America/Denver". Only meaningful together with timeOfDay. Defaults to UTC.'),
9786
+ timezone: import_zod5.z.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.`),
9667
9787
  deployDate: import_zod5.z.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.')
9668
9788
  },
9669
9789
  output: {
@@ -9725,7 +9845,7 @@ var GetScheduleLinkSchema = {
9725
9845
  var GetScheduleStatusSchema = {
9726
9846
  id: "get-schedule-status",
9727
9847
  upstreamName: "getScheduleStatusTool",
9728
- 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.",
9848
+ 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.",
9729
9849
  input: {},
9730
9850
  output: {
9731
9851
  ok: import_zod5.z.boolean(),
@@ -9801,7 +9921,7 @@ var PauseScheduledActionSchema = {
9801
9921
  var ProposeScheduledActionSchema = {
9802
9922
  id: "propose-scheduled-action",
9803
9923
  upstreamName: "proposeScheduledActionTool",
9804
- 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.",
9924
+ 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.",
9805
9925
  input: {
9806
9926
  request: import_zod5.z.string().min(1).describe("Freeform text describing what you want scheduled.")
9807
9927
  },
@@ -9810,6 +9930,8 @@ var ProposeScheduledActionSchema = {
9810
9930
  description: import_zod5.z.string().optional().describe("Proposed description \u2014 edit freely before confirming."),
9811
9931
  vault: import_zod5.z.string().optional().describe("Proposed target vault."),
9812
9932
  cadence: import_zod5.z.string().optional().describe("Proposed cadence: once, daily, weekly, or monthly."),
9933
+ timeOfDay: import_zod5.z.string().optional().describe("Proposed 24-hour HH:MM run time, when the request named one."),
9934
+ timezone: import_zod5.z.string().optional().describe("Proposed IANA timezone \u2014 from the request, or the account default when the request named a time without a zone."),
9813
9935
  rationale: import_zod5.z.string().optional().describe("Why these choices were made \u2014 read this before confirming."),
9814
9936
  error: import_zod5.z.string().optional()
9815
9937
  },
@@ -9824,7 +9946,7 @@ var ProposeScheduledActionSchema = {
9824
9946
  var ResumeScheduledActionSchema = {
9825
9947
  id: "resume-scheduled-action",
9826
9948
  upstreamName: "resumeScheduledActionTool",
9827
- description: "Resume a paused scheduled action. Its next run is computed fresh from now, not backfilled for time spent paused.",
9949
+ 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.",
9828
9950
  input: {
9829
9951
  id: import_zod5.z.string().min(1).describe("The scheduled action id.")
9830
9952
  },
@@ -9860,14 +9982,34 @@ var RevokeScheduleLinkSchema = {
9860
9982
  openWorldHint: false
9861
9983
  }
9862
9984
  };
9985
+ var SetScheduleDefaultsSchema = {
9986
+ id: "set-schedule-defaults",
9987
+ upstreamName: "setScheduleDefaultsTool",
9988
+ 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.",
9989
+ input: {
9990
+ defaultTimezone: import_zod5.z.string().nullable().describe('IANA timezone name, e.g. "America/Denver". null clears the default (new schedules fall back to UTC).')
9991
+ },
9992
+ output: {
9993
+ ok: import_zod5.z.boolean(),
9994
+ defaultTimezone: import_zod5.z.string().nullable().optional().describe("The default timezone now in effect; null means UTC."),
9995
+ error: import_zod5.z.string().optional()
9996
+ },
9997
+ annotations: {
9998
+ title: "Set Schedule Defaults",
9999
+ readOnlyHint: false,
10000
+ destructiveHint: false,
10001
+ idempotentHint: true,
10002
+ openWorldHint: false
10003
+ }
10004
+ };
9863
10005
  var SetScheduleEntitlementSchema = {
9864
10006
  id: "set-schedule-entitlement",
9865
10007
  upstreamName: "setScheduleEntitlementTool",
9866
- 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.",
10008
+ 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.",
9867
10009
  input: {
9868
10010
  granteeIdentity: import_zod5.z.string().min(1).describe("Identity whose scheduling entitlement is being set (e.g. an email)."),
9869
10011
  enabled: import_zod5.z.boolean().optional().describe("Historical entitlement value for migration/recovery only. Omit to preserve the stored value."),
9870
- quotaPerPeriod: import_zod5.z.number().optional().describe("Historical monthly execution quota retained only for migration compatibility. Omit to preserve the stored value."),
10012
+ quotaPerPeriod: import_zod5.z.number().optional().describe("Historical monthly quota for migration/recovery only. Omit to preserve the stored value."),
9871
10013
  mcpScraperApiKey: import_zod5.z.string().optional().describe("The identity's mcp-scraper API key, stored encrypted, used to reach mcp-scraper tools during scheduled-action execution.")
9872
10014
  },
9873
10015
  output: {
@@ -10112,9 +10254,9 @@ var QueryTableSchema = {
10112
10254
  var ListTagsSchema = {
10113
10255
  id: "list-memory-tags",
10114
10256
  upstreamName: "listTagsTool",
10115
- 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.",
10257
+ 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.",
10116
10258
  input: {
10117
- includeDeprecated: import_zod5.z.boolean().optional()
10259
+ includeDeprecated: import_zod5.z.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.")
10118
10260
  },
10119
10261
  output: {
10120
10262
  ok: import_zod5.z.boolean(),
@@ -10126,7 +10268,7 @@ var ListTagsSchema = {
10126
10268
  var ResolveTagsSchema = {
10127
10269
  id: "resolve-memory-tags",
10128
10270
  upstreamName: "resolveTagsTool",
10129
- 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.",
10271
+ 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.",
10130
10272
  input: {
10131
10273
  candidates: import_zod5.z.array(import_zod5.z.object({ tag: import_zod5.z.string().min(1), central: import_zod5.z.boolean().optional(), reusable: import_zod5.z.boolean().optional(), description: import_zod5.z.string().optional() })).min(1).max(20)
10132
10274
  },
@@ -10140,7 +10282,7 @@ var ResolveTagsSchema = {
10140
10282
  var UpsertTagSchema = {
10141
10283
  id: "upsert-memory-tag",
10142
10284
  upstreamName: "upsertTagTool",
10143
- 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.",
10285
+ 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.",
10144
10286
  input: {
10145
10287
  tag: import_zod5.z.string().min(1),
10146
10288
  description: import_zod5.z.string().optional(),
@@ -10296,17 +10438,17 @@ var ListVaultsSchema = {
10296
10438
  var ProvisionDefaultsSchema = {
10297
10439
  id: "provision-defaults",
10298
10440
  upstreamName: "provisionDefaultsTool",
10299
- 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.",
10441
+ 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.",
10300
10442
  input: {
10301
- granteeIdentity: import_zod5.z.string().min(1).describe("Identity that should OWN the 13 default vaults (e.g. an email or user id)."),
10302
- issueKey: import_zod5.z.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."),
10443
+ granteeIdentity: import_zod5.z.string().min(1).describe("Identity that should OWN the 14 default vaults (e.g. an email or user id)."),
10444
+ issueKey: import_zod5.z.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."),
10303
10445
  plan: import_zod5.z.enum(["free", "pro", "team", "enterprise"]).optional().describe("Subscription plan carried by the issued key. Optional; defaults to free. Only used when issueKey is true.")
10304
10446
  },
10305
10447
  output: {
10306
10448
  ok: import_zod5.z.boolean().describe("True when provisioning succeeded; false on auth/scope error."),
10307
10449
  identity: import_zod5.z.string().optional().describe("Identity the vaults were provisioned for."),
10308
- created: import_zod5.z.array(import_zod5.z.string()).optional().describe("Vault names newly created on this call (empty when all 13 already existed)."),
10309
- vaults: import_zod5.z.array(import_zod5.z.string()).optional().describe("All 13 default vault names the identity now owns."),
10450
+ created: import_zod5.z.array(import_zod5.z.string()).optional().describe("Vault names newly created on this call (empty when all 14 already existed)."),
10451
+ vaults: import_zod5.z.array(import_zod5.z.string()).optional().describe("All 14 default vault names the identity now owns."),
10310
10452
  keyId: import_zod5.z.string().optional().describe("Stable id of the issued key. Present only when issueKey was true."),
10311
10453
  secret: import_zod5.z.string().optional().describe("The issued key secret \u2014 RETURNED ONCE. Present only when issueKey was true."),
10312
10454
  plan: import_zod5.z.string().optional().describe("Plan assigned to the issued key. Present only when issueKey was true."),
@@ -10343,9 +10485,9 @@ var RouteMemorySchema = {
10343
10485
  var VideoAnalyzeStartSchema = {
10344
10486
  id: "video-analyze-start",
10345
10487
  upstreamName: "videoAnalyzeStartTool",
10346
- 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.",
10488
+ 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.",
10347
10489
  input: {
10348
- sourceUrl: import_zod5.z.string().url().describe("Direct URL to the video file (.mp4/.webm/.mov/.gif)."),
10490
+ sourceUrl: import_zod5.z.string().url().describe("A YouTube, Facebook, Instagram, TikTok, or Vimeo URL (downloaded automatically), or a direct video file URL (.mp4/.webm/.mov/.gif)."),
10349
10491
  intervalS: import_zod5.z.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."),
10350
10492
  maxFrames: import_zod5.z.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."),
10351
10493
  detail: import_zod5.z.enum(["fast", "standard", "deep"]).optional().describe("Analysis depth. Default standard."),
@@ -10482,6 +10624,7 @@ var MEMORY_TOOL_SCHEMAS = [
10482
10624
  GraphPathSchema,
10483
10625
  GraphUniverseSchema,
10484
10626
  LibraryIngestSchema,
10627
+ BulkDeleteNotesSchema,
10485
10628
  DeleteNoteSchema,
10486
10629
  ExportSchema,
10487
10630
  GetSchema,
@@ -10500,6 +10643,7 @@ var MEMORY_TOOL_SCHEMAS = [
10500
10643
  ProposeScheduledActionSchema,
10501
10644
  ResumeScheduledActionSchema,
10502
10645
  RevokeScheduleLinkSchema,
10646
+ SetScheduleDefaultsSchema,
10503
10647
  SetScheduleEntitlementSchema,
10504
10648
  CostUsageSchema,
10505
10649
  StorageUsageSchema,
@@ -10634,7 +10778,7 @@ function renderInstallTerminal(options) {
10634
10778
  "1/1 install surfaces ready",
10635
10779
  colorize("Newest: any approved connection read can become an indexed Memory snapshot in one call. OAuth stays tenant-isolated and provider content is redacted and marked untrusted.", "lime", color),
10636
10780
  "",
10637
- `${colorize("Tools", "cyan", color)} ${colorize("(159 MCP tools)", "muted", color)}`,
10781
+ `${colorize("Tools", "cyan", color)} ${colorize("(163 MCP tools)", "muted", color)}`,
10638
10782
  toolRow("search", ["harvest_paa", "search_serp", "maps_search", "maps_place_intel"], color),
10639
10783
  toolRow("extract", ["extract_url", "map_site_urls", "extract_site", "audit_site", "directory_workflow"], color),
10640
10784
  toolRow("build", ["rank_tracker_workflow", "cron plan", "database prompt"], color),