mcp-scraper 0.24.0 → 0.25.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.
@@ -11,7 +11,7 @@ import "../chunk-K443GQY5.js";
11
11
  import "../chunk-XGIPATLV.js";
12
12
  import {
13
13
  PACKAGE_VERSION
14
- } from "../chunk-CDLHUCMT.js";
14
+ } from "../chunk-UELJZCUC.js";
15
15
 
16
16
  // src/cli/human-cli.ts
17
17
  import { Command } from "commander";
@@ -106,7 +106,7 @@ function renderInstallTerminal(options) {
106
106
  }
107
107
 
108
108
  // src/version.ts
109
- var PACKAGE_VERSION = "0.24.0";
109
+ var PACKAGE_VERSION = "0.25.0";
110
110
 
111
111
  // bin/mcp-scraper-install.ts
112
112
  var noColor = process.argv.includes("--no-color") || process.env.NO_COLOR !== void 0 || process.env.FORCE_COLOR === "0" || !process.stdout.isTTY;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/install-terminal.ts","../../src/version.ts","../../bin/mcp-scraper-install.ts"],"sourcesContent":["export interface InstallTerminalOptions {\n color?: boolean\n version: string\n apiKeyConfigured?: boolean\n}\n\ntype Tone = 'cyan' | 'lime' | 'amber' | 'red' | 'muted' | 'bold'\n\nconst CODES: Record<Tone | 'reset', string> = {\n reset: '\\x1b[0m',\n cyan: '\\x1b[36m',\n lime: '\\x1b[32m',\n amber: '\\x1b[33m',\n red: '\\x1b[31m',\n muted: '\\x1b[90m',\n bold: '\\x1b[1m',\n}\n\nfunction colorize(value: string, tone: Tone, enabled: boolean): string {\n if (!enabled) return value\n return `${CODES[tone]}${value}${CODES.reset}`\n}\n\nfunction toolRow(label: string, tools: string[], enabled: boolean): string {\n const padded = label.padEnd(9, ' ')\n return ` ${colorize(padded, 'muted', enabled)} ${tools.join(colorize(' . ', 'muted', enabled))}`\n}\n\nexport function renderInstallTerminal(options: InstallTerminalOptions): string {\n const color = options.color ?? true\n const apiKeyValue = options.apiKeyConfigured ? '$MCP_SCRAPER_API_KEY' : 'sk_live_your_key'\n const ascii = String.raw`\n __ __ ____ ____ \n| \\/ |/ ___| _ \\\n| |\\/| | | | |_) |\n| | | | |___| __/\n|_| |_|\\____|_|\n\n ____ ____ ____ _ ____ _____ ____\n/ ___| / ___| _ \\ / \\ | _ \\| ____| _ \\\n\\___ \\| | | |_) | / _ \\ | |_) | _| | |_) |\n ___) | |___| _ < / ___ \\| __/| |___| _ <\n|____/ \\____|_| \\_\\/_/ \\_\\_| |_____|_| \\_\\\n`\n\n const claudeCommand = [\n `MCP_SCRAPER_API_KEY=${apiKeyValue} npx -y -p mcp-scraper@latest \\\\`,\n ' mcp-scraper-cli agent install claude --apply',\n ].join('\\n')\n\n const codexConfig = [\n '[mcp_servers.mcp-scraper]',\n 'command = \"npx\"',\n 'args = [\"-y\", \"-p\", \"mcp-scraper@latest\", \"mcp-scraper\"]',\n `env = { MCP_SCRAPER_API_KEY = \"${apiKeyValue}\" }`,\n ].join('\\n')\n\n return [\n colorize(`mcp-scraper v${options.version}`, 'bold', color),\n colorize('> mcp-scraper-install', 'muted', color),\n colorize(ascii, 'amber', color),\n `${colorize('MCP Scraper Agent', 'cyan', color)} . v${options.version} . mcpscraper.dev`,\n '1/1 install surfaces ready',\n 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),\n '',\n `${colorize('Tools', 'cyan', color)} ${colorize('(159 MCP tools)', 'muted', color)}`,\n toolRow('search', ['harvest_paa', 'search_serp', 'maps_search', 'maps_place_intel'], color),\n toolRow('extract', ['extract_url', 'map_site_urls', 'extract_site', 'audit_site', 'directory_workflow'], color),\n toolRow('build', ['rank_tracker_workflow', 'cron plan', 'database prompt'], color),\n toolRow('media', ['youtube_harvest', 'youtube_transcribe', 'facebook_ad_search', 'facebook_page_intel', 'facebook_ad_transcribe', 'facebook_video_transcribe', 'instagram_profile_content', 'instagram_media_download', 'reddit_thread'], color),\n toolRow('browser', ['browser_open', 'browser_profile_connect', 'browser_profile_list', 'browser_close', 'browser_screenshot', 'browser_read', 'browser_locate', 'browser_replay_mark', 'browser_replay_annotate'], color),\n toolRow('connect', ['list_service_connections', 'describe_service_connection_tool', 'import_service_connection_to_memory', 'export_connected_service_data', 'renew_connected_data_download', 'read_service_connection', 'call_service_connection_action'], color),\n toolRow('account', ['credits_info', 'reports', 'MCP resources'], color),\n toolRow('memory', ['memory-put', 'memory-get', 'memory-search', 'list-vaults', 'record-fact', 'list-scheduled-actions'], color),\n `${colorize('Workflows', 'cyan', color)} ${colorize('(MCP + CLI + API)', 'muted', color)}`,\n toolRow('route', ['workflow_list', 'workflow_suggest', 'workflow_run', 'workflow_step', 'workflow_status', 'workflow_artifact_read'], color),\n toolRow('seo', ['directory', 'agent-packet', 'competitive audit', 'map/serp comparison', 'PAA/AIO briefs', 'scheduled runs'], color),\n '',\n colorize('Usage tips:', 'amber', color),\n 'Run mcp-scraper-install for this visible card. Run mcp-scraper-cli for setup utilities and subcommands.',\n 'Run mcp-scraper in a human terminal to print this card; MCP clients get the same command as a silent stdio server.',\n 'Explicit card command: npx -y -p mcp-scraper@latest mcp-scraper-install',\n 'Hosted browser sessions use direct/no-proxy egress by default.',\n 'Customer auth setup: run browser_profile_connect, send the watch_url, let the user sign in, then call browser_profile_list until AUTHENTICATED.',\n 'Connected account ranges: call export_connected_service_data once. It handles Gmail, Calendar, Zoom, and Resend pagination; do not loop read_service_connection over individual records.',\n 'Connected account RAG: call import_service_connection_to_memory for one bounded approved read. It writes a redacted, untrusted snapshot to a stable Memory path and embeds it for search.',\n 'Stack logins / reconnect: run browser_profile_connect again with the same profile name and another domain to add accounts or refresh a login.',\n 'Start with workflow_suggest for broad jobs like market analysis, ICP research, CRO audits, brand briefs, content gaps, and AI visibility.',\n 'For MCP clients, use mcp-scraper so one install can mix SERP, Maps, browser, reports, and saved MCP resources.',\n 'If you hit the concurrency limit, add an extra slot for $5/month with mcp-scraper-cli billing concurrency checkout.',\n '',\n `${colorize('Ready.', 'lime', color)} Install the combined MCP server with one command:`,\n '',\n colorize('Setup doctor', 'amber', color),\n 'npx -y -p mcp-scraper@latest mcp-scraper-cli doctor',\n '',\n colorize('Hosted profile setup', 'amber', color),\n 'In your MCP client, call browser_profile_connect with email=\"seo@example.com\" and domain=\"chatgpt.com\".',\n 'Give the returned watch_url to the user. After they sign in, call browser_profile_list, then browser_open with the returned profile. Add more logins by calling browser_profile_connect again with the same profile and a new domain.',\n '',\n colorize('Claude Code one-command setup', 'amber', color),\n claudeCommand,\n 'Then fully exit Claude Code and open a new Claude terminal. Check with: claude mcp list',\n '',\n colorize('Codex config', 'amber', color),\n codexConfig,\n '',\n colorize('Claude Desktop Extension', 'amber', color),\n 'Download: https://mcpscraper.dev/downloads/mcp-scraper.mcpb',\n '',\n colorize('Safety note:', 'muted', color),\n 'mcp-scraper prints this card only when stdin/stdout are an interactive TTY. In MCP clients it writes only JSON-RPC to stdout.',\n 'Use --stdio or MCP_SCRAPER_FORCE_STDIO=1 to force server mode from a terminal.',\n '',\n ].join('\\n')\n}\n","export const PACKAGE_VERSION = '0.24.0'\n","#!/usr/bin/env node\nimport { renderInstallTerminal } from '../src/install-terminal.js'\nimport { PACKAGE_VERSION } from '../src/version.js'\n\nconst noColor =\n process.argv.includes('--no-color') ||\n process.env.NO_COLOR !== undefined ||\n process.env.FORCE_COLOR === '0' ||\n !process.stdout.isTTY\n\nconst help = process.argv.includes('--help') || process.argv.includes('-h')\nif (help) {\n process.stdout.write([\n 'Usage: mcp-scraper-install [--no-color]',\n '',\n 'Prints the branded MCP Scraper terminal install card and copyable install commands.',\n 'mcp-scraper prints the same card in a human terminal and runs as the MCP stdio server in clients.',\n '',\n ].join('\\n'))\n process.exit(0)\n}\n\nprocess.stdout.write(renderInstallTerminal({\n version: PACKAGE_VERSION,\n color: !noColor,\n apiKeyConfigured: Boolean(process.env.MCP_SCRAPER_API_KEY?.trim()),\n}))\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/install-terminal.ts","../../src/version.ts","../../bin/mcp-scraper-install.ts"],"sourcesContent":["export interface InstallTerminalOptions {\n color?: boolean\n version: string\n apiKeyConfigured?: boolean\n}\n\ntype Tone = 'cyan' | 'lime' | 'amber' | 'red' | 'muted' | 'bold'\n\nconst CODES: Record<Tone | 'reset', string> = {\n reset: '\\x1b[0m',\n cyan: '\\x1b[36m',\n lime: '\\x1b[32m',\n amber: '\\x1b[33m',\n red: '\\x1b[31m',\n muted: '\\x1b[90m',\n bold: '\\x1b[1m',\n}\n\nfunction colorize(value: string, tone: Tone, enabled: boolean): string {\n if (!enabled) return value\n return `${CODES[tone]}${value}${CODES.reset}`\n}\n\nfunction toolRow(label: string, tools: string[], enabled: boolean): string {\n const padded = label.padEnd(9, ' ')\n return ` ${colorize(padded, 'muted', enabled)} ${tools.join(colorize(' . ', 'muted', enabled))}`\n}\n\nexport function renderInstallTerminal(options: InstallTerminalOptions): string {\n const color = options.color ?? true\n const apiKeyValue = options.apiKeyConfigured ? '$MCP_SCRAPER_API_KEY' : 'sk_live_your_key'\n const ascii = String.raw`\n __ __ ____ ____ \n| \\/ |/ ___| _ \\\n| |\\/| | | | |_) |\n| | | | |___| __/\n|_| |_|\\____|_|\n\n ____ ____ ____ _ ____ _____ ____\n/ ___| / ___| _ \\ / \\ | _ \\| ____| _ \\\n\\___ \\| | | |_) | / _ \\ | |_) | _| | |_) |\n ___) | |___| _ < / ___ \\| __/| |___| _ <\n|____/ \\____|_| \\_\\/_/ \\_\\_| |_____|_| \\_\\\n`\n\n const claudeCommand = [\n `MCP_SCRAPER_API_KEY=${apiKeyValue} npx -y -p mcp-scraper@latest \\\\`,\n ' mcp-scraper-cli agent install claude --apply',\n ].join('\\n')\n\n const codexConfig = [\n '[mcp_servers.mcp-scraper]',\n 'command = \"npx\"',\n 'args = [\"-y\", \"-p\", \"mcp-scraper@latest\", \"mcp-scraper\"]',\n `env = { MCP_SCRAPER_API_KEY = \"${apiKeyValue}\" }`,\n ].join('\\n')\n\n return [\n colorize(`mcp-scraper v${options.version}`, 'bold', color),\n colorize('> mcp-scraper-install', 'muted', color),\n colorize(ascii, 'amber', color),\n `${colorize('MCP Scraper Agent', 'cyan', color)} . v${options.version} . mcpscraper.dev`,\n '1/1 install surfaces ready',\n 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),\n '',\n `${colorize('Tools', 'cyan', color)} ${colorize('(159 MCP tools)', 'muted', color)}`,\n toolRow('search', ['harvest_paa', 'search_serp', 'maps_search', 'maps_place_intel'], color),\n toolRow('extract', ['extract_url', 'map_site_urls', 'extract_site', 'audit_site', 'directory_workflow'], color),\n toolRow('build', ['rank_tracker_workflow', 'cron plan', 'database prompt'], color),\n toolRow('media', ['youtube_harvest', 'youtube_transcribe', 'facebook_ad_search', 'facebook_page_intel', 'facebook_ad_transcribe', 'facebook_video_transcribe', 'instagram_profile_content', 'instagram_media_download', 'reddit_thread'], color),\n toolRow('browser', ['browser_open', 'browser_profile_connect', 'browser_profile_list', 'browser_close', 'browser_screenshot', 'browser_read', 'browser_locate', 'browser_replay_mark', 'browser_replay_annotate'], color),\n toolRow('connect', ['list_service_connections', 'describe_service_connection_tool', 'import_service_connection_to_memory', 'export_connected_service_data', 'renew_connected_data_download', 'read_service_connection', 'call_service_connection_action'], color),\n toolRow('account', ['credits_info', 'reports', 'MCP resources'], color),\n toolRow('memory', ['memory-put', 'memory-get', 'memory-search', 'list-vaults', 'record-fact', 'list-scheduled-actions'], color),\n `${colorize('Workflows', 'cyan', color)} ${colorize('(MCP + CLI + API)', 'muted', color)}`,\n toolRow('route', ['workflow_list', 'workflow_suggest', 'workflow_run', 'workflow_step', 'workflow_status', 'workflow_artifact_read'], color),\n toolRow('seo', ['directory', 'agent-packet', 'competitive audit', 'map/serp comparison', 'PAA/AIO briefs', 'scheduled runs'], color),\n '',\n colorize('Usage tips:', 'amber', color),\n 'Run mcp-scraper-install for this visible card. Run mcp-scraper-cli for setup utilities and subcommands.',\n 'Run mcp-scraper in a human terminal to print this card; MCP clients get the same command as a silent stdio server.',\n 'Explicit card command: npx -y -p mcp-scraper@latest mcp-scraper-install',\n 'Hosted browser sessions use direct/no-proxy egress by default.',\n 'Customer auth setup: run browser_profile_connect, send the watch_url, let the user sign in, then call browser_profile_list until AUTHENTICATED.',\n 'Connected account ranges: call export_connected_service_data once. It handles Gmail, Calendar, Zoom, and Resend pagination; do not loop read_service_connection over individual records.',\n 'Connected account RAG: call import_service_connection_to_memory for one bounded approved read. It writes a redacted, untrusted snapshot to a stable Memory path and embeds it for search.',\n 'Stack logins / reconnect: run browser_profile_connect again with the same profile name and another domain to add accounts or refresh a login.',\n 'Start with workflow_suggest for broad jobs like market analysis, ICP research, CRO audits, brand briefs, content gaps, and AI visibility.',\n 'For MCP clients, use mcp-scraper so one install can mix SERP, Maps, browser, reports, and saved MCP resources.',\n 'If you hit the concurrency limit, add an extra slot for $5/month with mcp-scraper-cli billing concurrency checkout.',\n '',\n `${colorize('Ready.', 'lime', color)} Install the combined MCP server with one command:`,\n '',\n colorize('Setup doctor', 'amber', color),\n 'npx -y -p mcp-scraper@latest mcp-scraper-cli doctor',\n '',\n colorize('Hosted profile setup', 'amber', color),\n 'In your MCP client, call browser_profile_connect with email=\"seo@example.com\" and domain=\"chatgpt.com\".',\n 'Give the returned watch_url to the user. After they sign in, call browser_profile_list, then browser_open with the returned profile. Add more logins by calling browser_profile_connect again with the same profile and a new domain.',\n '',\n colorize('Claude Code one-command setup', 'amber', color),\n claudeCommand,\n 'Then fully exit Claude Code and open a new Claude terminal. Check with: claude mcp list',\n '',\n colorize('Codex config', 'amber', color),\n codexConfig,\n '',\n colorize('Claude Desktop Extension', 'amber', color),\n 'Download: https://mcpscraper.dev/downloads/mcp-scraper.mcpb',\n '',\n colorize('Safety note:', 'muted', color),\n 'mcp-scraper prints this card only when stdin/stdout are an interactive TTY. In MCP clients it writes only JSON-RPC to stdout.',\n 'Use --stdio or MCP_SCRAPER_FORCE_STDIO=1 to force server mode from a terminal.',\n '',\n ].join('\\n')\n}\n","export const PACKAGE_VERSION = '0.25.0'\n","#!/usr/bin/env node\nimport { renderInstallTerminal } from '../src/install-terminal.js'\nimport { PACKAGE_VERSION } from '../src/version.js'\n\nconst noColor =\n process.argv.includes('--no-color') ||\n process.env.NO_COLOR !== undefined ||\n process.env.FORCE_COLOR === '0' ||\n !process.stdout.isTTY\n\nconst help = process.argv.includes('--help') || process.argv.includes('-h')\nif (help) {\n process.stdout.write([\n 'Usage: mcp-scraper-install [--no-color]',\n '',\n 'Prints the branded MCP Scraper terminal install card and copyable install commands.',\n 'mcp-scraper prints the same card in a human terminal and runs as the MCP stdio server in clients.',\n '',\n ].join('\\n'))\n process.exit(0)\n}\n\nprocess.stdout.write(renderInstallTerminal({\n version: PACKAGE_VERSION,\n color: !noColor,\n apiKeyConfigured: Boolean(process.env.MCP_SCRAPER_API_KEY?.trim()),\n}))\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "../chunk-YNHPZU6B.js";
5
5
  import {
6
6
  PACKAGE_VERSION
7
- } from "../chunk-CDLHUCMT.js";
7
+ } from "../chunk-UELJZCUC.js";
8
8
 
9
9
  // bin/mcp-scraper-install.ts
10
10
  var noColor = process.argv.includes("--no-color") || process.env.NO_COLOR !== void 0 || process.env.FORCE_COLOR === "0" || !process.stdout.isTTY;
@@ -556,7 +556,7 @@ render();
556
556
  }
557
557
 
558
558
  // src/version.ts
559
- var PACKAGE_VERSION = "0.24.0";
559
+ var PACKAGE_VERSION = "0.25.0";
560
560
 
561
561
  // src/mcp/browser-agent-tool-schemas.ts
562
562
  var import_zod = require("zod");
@@ -5693,7 +5693,7 @@ Multi-step orchestrations \u2014 prefer these over hand-chaining primitives when
5693
5693
 
5694
5694
  ## Memory
5695
5695
  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
5696
+ scheduled actions, tables, channels) backed by memory.mcpscraper.dev. Every account starts with 14
5697
5697
  vaults \u2014 call **list-vaults** to see what exists before creating anything new. Pick the vault whose job
5698
5698
  matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled lessons/how-tos),
5699
5699
  **Library** (raw source material \u2014 articles, transcripts), **People** (one durable note per person/org),
@@ -5701,7 +5701,8 @@ matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled
5701
5701
  (action items with a status), **Projects** (durable named initiatives), **Issues** (something broken),
5702
5702
  **Improvement Log** (receipts of changes made and whether they worked), **Experiments** (hypothesis +
5703
5703
  measured result), **Sprint** (current cycle's scope), **Inspiration** (other people's work worth
5704
- studying).
5704
+ studying), **Skills** (reusable skill packages; each requires \`scripts/\` and at least one of
5705
+ \`references/\` or \`templates/\`, and may use both).
5705
5706
  For a normal new narrative note, call **prepare-memory-write** first. It queries the live vault contract,
5706
5707
  tag vocabulary, and natural neighbor vaults, and returns interlink candidates that must be read before
5707
5708
  acceptance. Compose every returned template section, then call **memory-capture**, which validates the
@@ -5731,6 +5732,12 @@ Tags are live vocabulary, not improvised labels: **list-memory-tags** shows what
5731
5732
  reusable, and has no exact, alias, or near-equivalent. Use **memory-backlinks**,
5732
5733
  **memory-graph-universe**, and **memory-graph-path** to trace the linked universe across vaults.
5733
5734
 
5735
+ **Always inspect the complete tag inventory and related notes first.** Use hybrid Smart RAG by default:
5736
+ form 3 focused queries (2\u20134 when useful), fuse exact tag/metadata/vault/date and semantic matches into 50
5737
+ candidates, expand the top 8 seeds by one link/backlink hop with at most 5 neighbors each, then Jina-rerank
5738
+ the combined pool to the best 30. Graph neighbors are candidates, never automatic links; add only links
5739
+ supported by the note contents.
5740
+
5734
5741
  Scrape deposits are raw evidence and therefore go to **Library** through **library-ingest**, with the full
5735
5742
  Library template and source metadata. If the source contains durable applicable guidance, create a separate
5736
5743
  Knowledge companion through prepare-memory-write + memory-capture and link it to the Library source with
@@ -8748,12 +8755,15 @@ var memoryCaptureTool_notePropsSchema = import_zod5.z.object({
8748
8755
  type: import_zod5.z.string().describe("Note type from the target vault contract (also used to route the note)."),
8749
8756
  domain: import_zod5.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
8750
8757
  folder: import_zod5.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
8758
+ script_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
8759
+ reference_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
8760
+ template_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
8751
8761
  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
8762
  }).partial().passthrough();
8753
8763
  var MemoryCaptureSchema = {
8754
8764
  id: "memory-capture",
8755
8765
  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.",
8766
+ 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
8767
  input: {
8758
8768
  vault: import_zod5.z.string(),
8759
8769
  folder: import_zod5.z.string().optional(),
@@ -8811,7 +8821,7 @@ var MemoryQuestionsSchema = {
8811
8821
  var PrepareMemoryWriteSchema = {
8812
8822
  id: "prepare-memory-write",
8813
8823
  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.",
8824
+ 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
8825
  input: {
8816
8826
  title: import_zod5.z.string().min(1),
8817
8827
  content: import_zod5.z.string().min(1),
@@ -8847,6 +8857,9 @@ var validateMemoryWriteTool_notePropsSchema = import_zod5.z.object({
8847
8857
  type: import_zod5.z.string().describe("Note type from the target vault contract (also used to route the note)."),
8848
8858
  domain: import_zod5.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
8849
8859
  folder: import_zod5.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
8860
+ script_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
8861
+ reference_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
8862
+ template_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
8850
8863
  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
8864
  }).partial().passthrough();
8852
8865
  var ValidateMemoryWriteSchema = {
@@ -9302,6 +9315,39 @@ var LibraryIngestSchema = {
9302
9315
  openWorldHint: true
9303
9316
  }
9304
9317
  };
9318
+ var bulkDeleteNotesTool_FilterSchema = import_zod5.z.object({
9319
+ column: import_zod5.z.enum(["path", "title", "kind", "source", "captured_at", "created_at", "updated_at", "revision"]).describe("Note column to filter on."),
9320
+ 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.'),
9321
+ value: import_zod5.z.unknown().describe('Value to compare against. For "in", pass an array.')
9322
+ });
9323
+ var BulkDeleteNotesSchema = {
9324
+ id: "bulk-delete-notes",
9325
+ upstreamName: "bulkDeleteNotesTool",
9326
+ 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).",
9327
+ input: {
9328
+ 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."),
9329
+ filters: import_zod5.z.array(bulkDeleteNotesTool_FilterSchema).default([]).describe("Filters to AND together. At least one of filters/tags is required."),
9330
+ 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."),
9331
+ dryRun: import_zod5.z.boolean().default(true).describe("When true (default), previews matches without deleting anything. Pass false to actually delete.")
9332
+ },
9333
+ output: {
9334
+ ok: import_zod5.z.boolean().describe("True on success; false on auth/scope/validation error."),
9335
+ vault: import_zod5.z.string().optional().describe("The vault operated on (after defaulting). Present when ok is true."),
9336
+ dryRun: import_zod5.z.boolean().optional().describe("Echoes whether this call was a preview or a real delete."),
9337
+ matchCount: import_zod5.z.number().optional().describe("Number of notes matching the filters. Present on a dry run."),
9338
+ 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."),
9339
+ deleted: import_zod5.z.number().optional().describe("Number of notes actually deleted. Present when dryRun is false."),
9340
+ deletedPaths: import_zod5.z.array(import_zod5.z.string()).optional().describe("Paths of the deleted notes. Present when dryRun is false."),
9341
+ error: import_zod5.z.string().optional().describe("Human-readable failure reason when ok is false.")
9342
+ },
9343
+ annotations: {
9344
+ title: "Bulk Delete Notes",
9345
+ readOnlyHint: false,
9346
+ destructiveHint: true,
9347
+ idempotentHint: false,
9348
+ openWorldHint: false
9349
+ }
9350
+ };
9305
9351
  var DeleteNoteSchema = {
9306
9352
  id: "delete-note",
9307
9353
  upstreamName: "deleteNoteTool",
@@ -9383,6 +9429,9 @@ var getTool_notePropsSchema = import_zod5.z.object({
9383
9429
  type: import_zod5.z.string().describe("Note type from the target vault contract (also used to route the note)."),
9384
9430
  domain: import_zod5.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
9385
9431
  folder: import_zod5.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
9432
+ script_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
9433
+ reference_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
9434
+ template_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
9386
9435
  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
9436
  }).partial().passthrough();
9388
9437
  var GetSchema = {
@@ -9471,6 +9520,9 @@ var putTool_notePropsSchema = import_zod5.z.object({
9471
9520
  type: import_zod5.z.string().describe("Note type from the target vault contract (also used to route the note)."),
9472
9521
  domain: import_zod5.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
9473
9522
  folder: import_zod5.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
9523
+ script_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
9524
+ reference_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
9525
+ template_links: import_zod5.z.array(import_zod5.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
9474
9526
  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
9527
  }).partial().passthrough();
9476
9528
  var PutSchema = {
@@ -9515,44 +9567,64 @@ var PutSchema = {
9515
9567
  openWorldHint: true
9516
9568
  }
9517
9569
  };
9570
+ var searchTool_primitiveValue = import_zod5.z.union([import_zod5.z.string(), import_zod5.z.number(), import_zod5.z.boolean()]);
9518
9571
  var SearchSchema = {
9519
9572
  id: "memory-search",
9520
9573
  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).",
9574
+ 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
9575
  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.")
9576
+ vault: import_zod5.z.string().optional().describe("Exact logical vault handle to search. Omit to search every entitled vault."),
9577
+ query: import_zod5.z.string().min(1).describe("A focused semantic reformulation of the request."),
9578
+ userMessage: import_zod5.z.string().optional().describe("Original human wording. Used as a distinct query variant when useful and logged for quality review."),
9579
+ 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."),
9580
+ 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."),
9581
+ 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."),
9582
+ tagMode: import_zod5.z.enum(["any", "all"]).optional().describe("Whether a note must match any or all supplied tags. Default any."),
9583
+ kind: import_zod5.z.enum(["note", "library", "capture", "decision", "message"]).optional().describe("Exact persisted note-kind filter."),
9584
+ type: import_zod5.z.string().min(1).optional().describe("Exact props.type filter."),
9585
+ dateFrom: import_zod5.z.string().datetime().optional().describe("Inclusive lower bound for note updatedAt."),
9586
+ dateTo: import_zod5.z.string().datetime().optional().describe("Inclusive upper bound for note updatedAt."),
9587
+ metadata: import_zod5.z.record(searchTool_primitiveValue).optional().describe("Exact equality filters for primitive note props."),
9588
+ queryVariantCount: import_zod5.z.number().int().min(2).max(4).optional().describe("Number of variants. Default 3."),
9589
+ candidatePool: import_zod5.z.number().int().min(10).max(100).optional().describe("Total fused candidates before final reranking. Default 50."),
9590
+ graphSeedCount: import_zod5.z.number().int().min(0).max(20).optional().describe("Strong preliminary notes whose graph neighborhoods are considered. Default 8."),
9591
+ graphDepth: import_zod5.z.literal(1).optional().describe("Graph expansion depth. Bounded to exactly one hop."),
9592
+ graphNeighborsPerSeed: import_zod5.z.number().int().min(1).max(10).optional().describe("Maximum outgoing-link plus backlink neighbors per seed. Default 5."),
9593
+ rerankTopN: import_zod5.z.number().int().min(1).max(50).optional().describe("Final results retained after Jina reranking. Default 30."),
9594
+ topK: import_zod5.z.number().int().min(1).max(50).optional().describe("Deprecated compatibility alias for rerankTopN. Prefer rerankTopN; default remains 30."),
9595
+ includeShared: import_zod5.z.boolean().optional().describe("Also search individually accepted shares. Default true. Exact note metadata filters exclude shares without accessible metadata.")
9532
9596
  },
9533
9597
  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.")
9598
+ ok: import_zod5.z.boolean(),
9599
+ vault: import_zod5.z.string().optional(),
9600
+ vaultsSearched: import_zod5.z.array(import_zod5.z.string()).optional(),
9601
+ planner: import_zod5.z.object({
9602
+ queryVariants: import_zod5.z.array(import_zod5.z.string()),
9603
+ candidatePool: import_zod5.z.number(),
9604
+ graphSeedCount: import_zod5.z.number(),
9605
+ graphDepth: import_zod5.z.number(),
9606
+ graphNeighborsPerSeed: import_zod5.z.number(),
9607
+ rerankTopN: import_zod5.z.number(),
9608
+ seeds: import_zod5.z.array(import_zod5.z.string()),
9609
+ graphCandidatesAdded: import_zod5.z.number()
9610
+ }).optional(),
9611
+ rerank: import_zod5.z.object({ applied: import_zod5.z.boolean(), provider: import_zod5.z.string(), fallbackReason: import_zod5.z.string().optional() }).optional(),
9612
+ results: import_zod5.z.array(import_zod5.z.object({
9613
+ text: import_zod5.z.string(),
9614
+ source: import_zod5.z.string(),
9615
+ score: import_zod5.z.number(),
9616
+ originalScore: import_zod5.z.number(),
9617
+ rerankScore: import_zod5.z.number().optional(),
9618
+ vault: import_zod5.z.string().optional(),
9619
+ sharedBy: import_zod5.z.string().optional(),
9620
+ shareId: import_zod5.z.string().optional(),
9621
+ matchChannels: import_zod5.z.array(import_zod5.z.enum(["semantic", "tag", "metadata", "graph"])),
9622
+ matchedQueries: import_zod5.z.array(import_zod5.z.string()),
9623
+ graphFrom: import_zod5.z.array(import_zod5.z.string())
9624
+ })).optional(),
9625
+ error: import_zod5.z.string().optional()
9548
9626
  },
9549
- annotations: {
9550
- title: "Semantic Memory Search",
9551
- readOnlyHint: true,
9552
- destructiveHint: false,
9553
- idempotentHint: true,
9554
- openWorldHint: true
9555
- }
9627
+ annotations: { title: "Hybrid Smart RAG Memory Search", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }
9556
9628
  };
9557
9629
  var SuggestSchema = {
9558
9630
  id: "memory-suggest",
@@ -9656,14 +9728,14 @@ var TemporalRecallSchema = {
9656
9728
  var CreateScheduledActionSchema = {
9657
9729
  id: "create-scheduled-action",
9658
9730
  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.",
9731
+ 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
9732
  input: {
9661
9733
  description: import_zod5.z.string().min(1).describe("Free-text description of what this action should do each time it runs."),
9662
9734
  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
9735
  cadence: import_zod5.z.enum(["once", "daily", "weekly", "monthly"]).describe('How often this action runs. "once" fires a single time and then completes.'),
9664
9736
  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
9737
  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.'),
9738
+ 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
9739
  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
9740
  },
9669
9741
  output: {
@@ -9725,7 +9797,7 @@ var GetScheduleLinkSchema = {
9725
9797
  var GetScheduleStatusSchema = {
9726
9798
  id: "get-schedule-status",
9727
9799
  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.",
9800
+ 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
9801
  input: {},
9730
9802
  output: {
9731
9803
  ok: import_zod5.z.boolean(),
@@ -9801,7 +9873,7 @@ var PauseScheduledActionSchema = {
9801
9873
  var ProposeScheduledActionSchema = {
9802
9874
  id: "propose-scheduled-action",
9803
9875
  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.",
9876
+ 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
9877
  input: {
9806
9878
  request: import_zod5.z.string().min(1).describe("Freeform text describing what you want scheduled.")
9807
9879
  },
@@ -9810,6 +9882,8 @@ var ProposeScheduledActionSchema = {
9810
9882
  description: import_zod5.z.string().optional().describe("Proposed description \u2014 edit freely before confirming."),
9811
9883
  vault: import_zod5.z.string().optional().describe("Proposed target vault."),
9812
9884
  cadence: import_zod5.z.string().optional().describe("Proposed cadence: once, daily, weekly, or monthly."),
9885
+ timeOfDay: import_zod5.z.string().optional().describe("Proposed 24-hour HH:MM run time, when the request named one."),
9886
+ 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
9887
  rationale: import_zod5.z.string().optional().describe("Why these choices were made \u2014 read this before confirming."),
9814
9888
  error: import_zod5.z.string().optional()
9815
9889
  },
@@ -9824,7 +9898,7 @@ var ProposeScheduledActionSchema = {
9824
9898
  var ResumeScheduledActionSchema = {
9825
9899
  id: "resume-scheduled-action",
9826
9900
  upstreamName: "resumeScheduledActionTool",
9827
- description: "Resume a paused scheduled action. Its next run is computed fresh from now, not backfilled for time spent paused.",
9901
+ 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
9902
  input: {
9829
9903
  id: import_zod5.z.string().min(1).describe("The scheduled action id.")
9830
9904
  },
@@ -9860,14 +9934,34 @@ var RevokeScheduleLinkSchema = {
9860
9934
  openWorldHint: false
9861
9935
  }
9862
9936
  };
9937
+ var SetScheduleDefaultsSchema = {
9938
+ id: "set-schedule-defaults",
9939
+ upstreamName: "setScheduleDefaultsTool",
9940
+ 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.",
9941
+ input: {
9942
+ defaultTimezone: import_zod5.z.string().nullable().describe('IANA timezone name, e.g. "America/Denver". null clears the default (new schedules fall back to UTC).')
9943
+ },
9944
+ output: {
9945
+ ok: import_zod5.z.boolean(),
9946
+ defaultTimezone: import_zod5.z.string().nullable().optional().describe("The default timezone now in effect; null means UTC."),
9947
+ error: import_zod5.z.string().optional()
9948
+ },
9949
+ annotations: {
9950
+ title: "Set Schedule Defaults",
9951
+ readOnlyHint: false,
9952
+ destructiveHint: false,
9953
+ idempotentHint: true,
9954
+ openWorldHint: false
9955
+ }
9956
+ };
9863
9957
  var SetScheduleEntitlementSchema = {
9864
9958
  id: "set-schedule-entitlement",
9865
9959
  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.",
9960
+ 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
9961
  input: {
9868
9962
  granteeIdentity: import_zod5.z.string().min(1).describe("Identity whose scheduling entitlement is being set (e.g. an email)."),
9869
9963
  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."),
9964
+ quotaPerPeriod: import_zod5.z.number().optional().describe("Historical monthly quota for migration/recovery only. Omit to preserve the stored value."),
9871
9965
  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
9966
  },
9873
9967
  output: {
@@ -10112,9 +10206,9 @@ var QueryTableSchema = {
10112
10206
  var ListTagsSchema = {
10113
10207
  id: "list-memory-tags",
10114
10208
  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.",
10209
+ 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
10210
  input: {
10117
- includeDeprecated: import_zod5.z.boolean().optional()
10211
+ 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
10212
  },
10119
10213
  output: {
10120
10214
  ok: import_zod5.z.boolean(),
@@ -10126,7 +10220,7 @@ var ListTagsSchema = {
10126
10220
  var ResolveTagsSchema = {
10127
10221
  id: "resolve-memory-tags",
10128
10222
  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.",
10223
+ 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
10224
  input: {
10131
10225
  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
10226
  },
@@ -10140,7 +10234,7 @@ var ResolveTagsSchema = {
10140
10234
  var UpsertTagSchema = {
10141
10235
  id: "upsert-memory-tag",
10142
10236
  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.",
10237
+ 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
10238
  input: {
10145
10239
  tag: import_zod5.z.string().min(1),
10146
10240
  description: import_zod5.z.string().optional(),
@@ -10296,17 +10390,17 @@ var ListVaultsSchema = {
10296
10390
  var ProvisionDefaultsSchema = {
10297
10391
  id: "provision-defaults",
10298
10392
  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.",
10393
+ 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
10394
  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."),
10395
+ granteeIdentity: import_zod5.z.string().min(1).describe("Identity that should OWN the 14 default vaults (e.g. an email or user id)."),
10396
+ 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
10397
  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
10398
  },
10305
10399
  output: {
10306
10400
  ok: import_zod5.z.boolean().describe("True when provisioning succeeded; false on auth/scope error."),
10307
10401
  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."),
10402
+ created: import_zod5.z.array(import_zod5.z.string()).optional().describe("Vault names newly created on this call (empty when all 14 already existed)."),
10403
+ vaults: import_zod5.z.array(import_zod5.z.string()).optional().describe("All 14 default vault names the identity now owns."),
10310
10404
  keyId: import_zod5.z.string().optional().describe("Stable id of the issued key. Present only when issueKey was true."),
10311
10405
  secret: import_zod5.z.string().optional().describe("The issued key secret \u2014 RETURNED ONCE. Present only when issueKey was true."),
10312
10406
  plan: import_zod5.z.string().optional().describe("Plan assigned to the issued key. Present only when issueKey was true."),
@@ -10343,9 +10437,9 @@ var RouteMemorySchema = {
10343
10437
  var VideoAnalyzeStartSchema = {
10344
10438
  id: "video-analyze-start",
10345
10439
  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.",
10440
+ 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
10441
  input: {
10348
- sourceUrl: import_zod5.z.string().url().describe("Direct URL to the video file (.mp4/.webm/.mov/.gif)."),
10442
+ 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
10443
  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
10444
  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
10445
  detail: import_zod5.z.enum(["fast", "standard", "deep"]).optional().describe("Analysis depth. Default standard."),
@@ -10482,6 +10576,7 @@ var MEMORY_TOOL_SCHEMAS = [
10482
10576
  GraphPathSchema,
10483
10577
  GraphUniverseSchema,
10484
10578
  LibraryIngestSchema,
10579
+ BulkDeleteNotesSchema,
10485
10580
  DeleteNoteSchema,
10486
10581
  ExportSchema,
10487
10582
  GetSchema,
@@ -10500,6 +10595,7 @@ var MEMORY_TOOL_SCHEMAS = [
10500
10595
  ProposeScheduledActionSchema,
10501
10596
  ResumeScheduledActionSchema,
10502
10597
  RevokeScheduleLinkSchema,
10598
+ SetScheduleDefaultsSchema,
10503
10599
  SetScheduleEntitlementSchema,
10504
10600
  CostUsageSchema,
10505
10601
  StorageUsageSchema,