mcp-scraper 0.30.0 → 0.32.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 (42) hide show
  1. package/README.md +1 -1
  2. package/dist/bin/api-server.cjs +93 -41
  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 +4 -1
  6. package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
  7. package/dist/bin/mcp-scraper-cli.js +3 -3
  8. package/dist/bin/mcp-scraper-install.cjs +1 -1
  9. package/dist/bin/mcp-scraper-install.cjs.map +1 -1
  10. package/dist/bin/mcp-scraper-install.js +1 -1
  11. package/dist/bin/mcp-stdio-server.cjs +38 -34
  12. package/dist/bin/mcp-stdio-server.cjs.map +1 -1
  13. package/dist/bin/mcp-stdio-server.js +3 -3
  14. package/dist/bin/paa-harvest.cjs +26 -4
  15. package/dist/bin/paa-harvest.cjs.map +1 -1
  16. package/dist/bin/paa-harvest.js +2 -2
  17. package/dist/{chunk-KAMKTSJQ.js → chunk-55M5CE5L.js} +2 -2
  18. package/dist/chunk-CPQF3PYW.js +7 -0
  19. package/dist/chunk-CPQF3PYW.js.map +1 -0
  20. package/dist/{chunk-ZQSHKWV4.js → chunk-PTHY7NYD.js} +4 -1
  21. package/dist/chunk-PTHY7NYD.js.map +1 -0
  22. package/dist/{chunk-YH5DRFWQ.js → chunk-RDCCU7CQ.js} +25 -6
  23. package/dist/chunk-RDCCU7CQ.js.map +1 -0
  24. package/dist/{chunk-T2CIPAOK.js → chunk-YOOEAXWP.js} +37 -36
  25. package/dist/chunk-YOOEAXWP.js.map +1 -0
  26. package/dist/index.cjs +26 -4
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +9 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.js +2 -2
  31. package/dist/{server-PBPXND5G.js → server-OBOTNFD6.js} +40 -10
  32. package/dist/{server-PBPXND5G.js.map → server-OBOTNFD6.js.map} +1 -1
  33. package/dist/{worker-RYP5EOV5.js → worker-7DJYUACV.js} +3 -3
  34. package/docs/mcp-tool-manifest.generated.json +29 -29
  35. package/package.json +2 -2
  36. package/dist/chunk-T2CIPAOK.js.map +0 -1
  37. package/dist/chunk-WQUF7AH7.js +0 -7
  38. package/dist/chunk-WQUF7AH7.js.map +0 -1
  39. package/dist/chunk-YH5DRFWQ.js.map +0 -1
  40. package/dist/chunk-ZQSHKWV4.js.map +0 -1
  41. /package/dist/{chunk-KAMKTSJQ.js.map → chunk-55M5CE5L.js.map} +0 -0
  42. /package/dist/{worker-RYP5EOV5.js.map → worker-7DJYUACV.js.map} +0 -0
@@ -6,12 +6,12 @@ import {
6
6
  openWorkflowReport,
7
7
  runWorkflow,
8
8
  workflowOutputBaseDir
9
- } from "../chunk-KAMKTSJQ.js";
9
+ } from "../chunk-55M5CE5L.js";
10
10
  import "../chunk-K443GQY5.js";
11
- import "../chunk-ZQSHKWV4.js";
11
+ import "../chunk-PTHY7NYD.js";
12
12
  import {
13
13
  PACKAGE_VERSION
14
- } from "../chunk-WQUF7AH7.js";
14
+ } from "../chunk-CPQF3PYW.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.30.0";
109
+ var PACKAGE_VERSION = "0.32.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('(165 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.30.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('(165 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.32.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":";;;;AAQA,IAAM,QAAwC;AAAA,EAC5C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AACR;AAEA,SAAS,SAAS,OAAe,MAAY,SAA0B;AACrE,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,GAAG,MAAM,IAAI,CAAC,GAAG,KAAK,GAAG,MAAM,KAAK;AAC7C;AAEA,SAAS,QAAQ,OAAe,OAAiB,SAA0B;AACzE,QAAM,SAAS,MAAM,OAAO,GAAG,GAAG;AAClC,SAAO,KAAK,SAAS,QAAQ,SAAS,OAAO,CAAC,IAAI,MAAM,KAAK,SAAS,SAAS,SAAS,OAAO,CAAC,CAAC;AACnG;AAEO,SAAS,sBAAsB,SAAyC;AAC7E,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,cAAc,QAAQ,mBAAmB,yBAAyB;AACxE,QAAM,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcrB,QAAM,gBAAgB;AAAA,IACpB,uBAAuB,WAAW;AAAA,IAClC;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,kCAAkC,WAAW;AAAA,EAC/C,EAAE,KAAK,IAAI;AAEX,SAAO;AAAA,IACL,SAAS,gBAAgB,QAAQ,OAAO,IAAI,QAAQ,KAAK;AAAA,IACzD,SAAS,yBAAyB,SAAS,KAAK;AAAA,IAChD,SAAS,OAAO,SAAS,KAAK;AAAA,IAC9B,GAAG,SAAS,qBAAqB,QAAQ,KAAK,CAAC,SAAS,QAAQ,OAAO;AAAA,IACvE;AAAA,IACA,SAAS,8KAA8K,QAAQ,KAAK;AAAA,IACpM;AAAA,IACA,GAAG,SAAS,SAAS,QAAQ,KAAK,CAAC,KAAK,SAAS,mBAAmB,SAAS,KAAK,CAAC;AAAA,IACnF,QAAQ,UAAU,CAAC,eAAe,eAAe,eAAe,kBAAkB,GAAG,KAAK;AAAA,IAC1F,QAAQ,WAAW,CAAC,eAAe,iBAAiB,gBAAgB,cAAc,oBAAoB,GAAG,KAAK;AAAA,IAC9G,QAAQ,SAAS,CAAC,yBAAyB,aAAa,iBAAiB,GAAG,KAAK;AAAA,IACjF,QAAQ,SAAS,CAAC,mBAAmB,sBAAsB,sBAAsB,uBAAuB,0BAA0B,6BAA6B,6BAA6B,4BAA4B,eAAe,GAAG,KAAK;AAAA,IAC/O,QAAQ,WAAW,CAAC,gBAAgB,2BAA2B,wBAAwB,iBAAiB,sBAAsB,gBAAgB,kBAAkB,uBAAuB,yBAAyB,GAAG,KAAK;AAAA,IACxN,QAAQ,WAAW,CAAC,4BAA4B,oCAAoC,uCAAuC,iCAAiC,iCAAiC,2BAA2B,gCAAgC,GAAG,KAAK;AAAA,IAChQ,QAAQ,WAAW,CAAC,gBAAgB,WAAW,eAAe,GAAG,KAAK;AAAA,IACtE,QAAQ,UAAU,CAAC,cAAc,cAAc,iBAAiB,eAAe,eAAe,wBAAwB,GAAG,KAAK;AAAA,IAC9H,GAAG,SAAS,aAAa,QAAQ,KAAK,CAAC,KAAK,SAAS,qBAAqB,SAAS,KAAK,CAAC;AAAA,IACzF,QAAQ,SAAS,CAAC,iBAAiB,oBAAoB,gBAAgB,iBAAiB,mBAAmB,wBAAwB,GAAG,KAAK;AAAA,IAC3I,QAAQ,OAAO,CAAC,aAAa,gBAAgB,qBAAqB,uBAAuB,kBAAkB,gBAAgB,GAAG,KAAK;AAAA,IACnI;AAAA,IACA,SAAS,eAAe,SAAS,KAAK;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,SAAS,UAAU,QAAQ,KAAK,CAAC;AAAA,IACpC;AAAA,IACA,SAAS,gBAAgB,SAAS,KAAK;AAAA,IACvC;AAAA,IACA;AAAA,IACA,SAAS,wBAAwB,SAAS,KAAK;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,iCAAiC,SAAS,KAAK;AAAA,IACxD;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,gBAAgB,SAAS,KAAK;AAAA,IACvC;AAAA,IACA;AAAA,IACA,SAAS,4BAA4B,SAAS,KAAK;AAAA,IACnD;AAAA,IACA;AAAA,IACA,SAAS,gBAAgB,SAAS,KAAK;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;ACnHO,IAAM,kBAAkB;;;ACI/B,IAAM,UACJ,QAAQ,KAAK,SAAS,YAAY,KAClC,QAAQ,IAAI,aAAa,UACzB,QAAQ,IAAI,gBAAgB,OAC5B,CAAC,QAAQ,OAAO;AAElB,IAAM,OAAO,QAAQ,KAAK,SAAS,QAAQ,KAAK,QAAQ,KAAK,SAAS,IAAI;AAC1E,IAAI,MAAM;AACR,UAAQ,OAAO,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI,CAAC;AACZ,UAAQ,KAAK,CAAC;AAChB;AAEA,QAAQ,OAAO,MAAM,sBAAsB;AAAA,EACzC,SAAS;AAAA,EACT,OAAO,CAAC;AAAA,EACR,kBAAkB,QAAQ,QAAQ,IAAI,qBAAqB,KAAK,CAAC;AACnE,CAAC,CAAC;","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "../chunk-DUS4ENOY.js";
5
5
  import {
6
6
  PACKAGE_VERSION
7
- } from "../chunk-WQUF7AH7.js";
7
+ } from "../chunk-CPQF3PYW.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;
@@ -561,7 +561,7 @@ render();
561
561
  }
562
562
 
563
563
  // src/version.ts
564
- var PACKAGE_VERSION = "0.30.0";
564
+ var PACKAGE_VERSION = "0.32.0";
565
565
 
566
566
  // src/mcp/browser-agent-tool-schemas.ts
567
567
  var import_zod = require("zod");
@@ -5719,18 +5719,19 @@ Multi-step orchestrations \u2014 prefer these over hand-chaining primitives when
5719
5719
 
5720
5720
  ## Memory
5721
5721
  mcp-scraper also exposes persistent per-user memory tools (notes, facts, vaults,
5722
- scheduled actions, tables, channels) backed by memory.mcpscraper.dev. Every account starts with 15
5722
+ scheduled actions, tables, channels) backed by memory.mcpscraper.dev. Every account starts with 16
5723
5723
  vaults \u2014 call **list-vaults** to see what exists before creating anything new. Pick the vault whose job
5724
5724
  matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled lessons/how-tos),
5725
- **Library** (raw source material \u2014 articles, transcripts), **People** (one durable note per person/org),
5726
- **Deals** (commercial opportunities tied to a known person or organization), **Communications** (individual
5725
+ **Library** (raw source material \u2014 articles, transcripts), **People** (one durable note per real person),
5726
+ **Organizations** (one durable hub per company or organization \u2014 never a person),
5727
+ **Deals** (commercial opportunities tied to a known organization or person), **Communication** (individual
5727
5728
  conversation records and drafts), **Calendar** (time-anchored entries), **Tasks** (independent Inbox action items
5728
5729
  that may link to a known Project), **Projects** (only codebases, known client projects, personal projects, or ongoing siloed
5729
5730
  workstreams), **Issues** (something broken),
5730
5731
  **Improvement Log** (receipts of changes made and whether they worked), **Experiments** (hypothesis +
5731
- measured result), **Sprint** (current cycle's scope), **Inspiration** (other people's work worth
5732
+ measured result), **Sprint** (current cycle's scope), **Examples and Inspirations** (other people's work worth
5732
5733
  studying), **Skills** (reusable skill packages; each requires \`scripts/\` and at least one of
5733
- \`references/\` or \`templates/\`, and may use both).
5734
+ \`references/\` or \`templates/\`, and may use both). The former names Inspiration and Communications still resolve.
5734
5735
  For a normal new narrative note, call **prepare-memory-write** first. It queries the live vault contract,
5735
5736
  tag vocabulary, and natural neighbor vaults, and returns interlink candidates that must be read before
5736
5737
  acceptance. Compose every returned template section, then call **memory-capture**, which validates the
@@ -5749,7 +5750,7 @@ compatibility value when the template asks for it); Tasks can be independent Inb
5749
5750
  project name; and email drafts awaiting human review need \`direction:"draft"\` with
5750
5751
  \`approval_state:"pending"\`. Link a known person, project, deal, or communication only when verified.
5751
5752
  When the user asks to add Gmail or Google Calendar evidence from a connected account, first resolve the
5752
- existing People hub. Persist Gmail as one linked **Communications** email and Calendar as one linked
5753
+ existing People hub. Persist Gmail as one linked **Communication** email and Calendar as one linked
5753
5754
  **Calendar** event, each with the provider's stable reference and \`person_refs\`; do not create a person
5754
5755
  from a subject line, infer attendees, or silently bulk-import a mailbox/calendar. If a relationship is requested but not clear, ask the user rather than inventing one. Overview is the review queue: editing leaves a draft pending, and
5755
5756
  approval or denial records a state only\u2014it does not send email.
@@ -6035,6 +6036,9 @@ var HarvestOptionsSchema = import_zod3.z.object({
6035
6036
  device: import_zod3.z.enum(["desktop", "mobile"]).default("desktop"),
6036
6037
  proxyMode: import_zod3.z.enum(["location", "configured", "none"]).default(DEFAULT_PROXY_MODE),
6037
6038
  proxyZip: import_zod3.z.string().regex(/^\d{5}$/).optional(),
6039
+ keepDefaultProxy: import_zod3.z.boolean().optional(),
6040
+ requireUsEgress: import_zod3.z.boolean().optional(),
6041
+ maxAttempts: import_zod3.z.number().int().min(1).max(12).optional(),
6038
6042
  debug: import_zod3.z.boolean().default(false),
6039
6043
  depth: import_zod3.z.number().int().min(1).max(30).default(3),
6040
6044
  maxQuestions: import_zod3.z.number().int().min(1).max(1e3).default(100),
@@ -6300,9 +6304,9 @@ var MapsSearchInputSchema = {
6300
6304
  gl: import_zod4.z.string().length(2).default("us").describe("Google country code inferred from location."),
6301
6305
  hl: import_zod4.z.string().length(2).default("en").describe("Language inferred from user request."),
6302
6306
  maxResults: import_zod4.z.number().int().min(1).max(50).default(10).describe("Number of candidates to return. Default 10, maximum 50."),
6303
- includeServices: import_zod4.z.boolean().default(false).describe("Open each returned Google Business Profile and include configured services and areas served when available. Does not collect review cards."),
6304
- proxyMode: import_zod4.z.enum(["location", "configured", "none"]).default(DEFAULT_MAPS_PROXY_MODE).describe("Leave unset for the default direct browser route. Google localization comes from the city in the query plus UULE, gl, and hl. location is an explicit residential-proxy override."),
6305
- proxyZip: import_zod4.z.string().regex(/^\d{5}$/).optional().describe("Optional US ZIP override when proxyMode is location."),
6307
+ includeServices: import_zod4.z.boolean().default(false).describe("Open each returned business profile to include its configured services and areas served when available. Adds a page visit per business; does not collect review cards."),
6308
+ proxyMode: import_zod4.z.enum(["location", "configured", "none"]).default(DEFAULT_MAPS_PROXY_MODE).describe("Leave unset for the default route (stealth browser on the managed ISP proxy, retried on a fresh session when Google blocks). Localization comes from the city in the query plus gl/hl. location forces an explicit residential proxy \u2014 not recommended for Google."),
6309
+ proxyZip: import_zod4.z.string().regex(/^\d{5}$/).optional().describe("Optional US ZIP override, only used when proxyMode is location."),
6306
6310
  debug: import_zod4.z.boolean().default(false).describe("Include sanitized browser/proxy diagnostics.")
6307
6311
  };
6308
6312
  var DirectoryWorkflowInputSchema = {
@@ -6316,7 +6320,7 @@ var DirectoryWorkflowInputSchema = {
6316
6320
  includeZipGroups: import_zod4.z.boolean().default(true).describe("Attach ZIP groups from a configured US ZIPS CSV when available (MCP_SCRAPER_USZIPS_CSV_PATH or usZipsCsvPath)."),
6317
6321
  usZipsCsvPath: import_zod4.z.string().optional().describe("Local/test-only path to a US ZIPS CSV (state_abbr, zipcode, county, city columns). Deployed APIs should use MCP_SCRAPER_USZIPS_CSV_PATH instead. For ZIP enrichment, set MCP_SCRAPER_USZIPS_CSV_PATH on the server, or pass this in local/test mode."),
6318
6322
  saveCsv: import_zod4.z.boolean().default(true).describe("Save a directory-ready CSV of results to the MCP Scraper output directory and return its path."),
6319
- proxyMode: import_zod4.z.enum(["location", "configured", "none"]).default(DEFAULT_MAPS_PROXY_MODE).describe("Proxy behavior per city search. Leave unset for the direct localized Google route; location is an explicit residential-proxy override."),
6323
+ proxyMode: import_zod4.z.enum(["location", "configured", "none"]).default(DEFAULT_MAPS_PROXY_MODE).describe("Proxy behavior per city search. Leave unset for the default route (stealth browser on the managed ISP proxy, retried fresh on a Google block). location forces an explicit residential proxy \u2014 not recommended for Google."),
6320
6324
  proxyZip: import_zod4.z.string().regex(/^\d{5}$/).optional().describe("Optional ZIP override for proxy targeting; normally omitted."),
6321
6325
  debug: import_zod4.z.boolean().default(false).describe("Include sanitized browser/proxy diagnostics.")
6322
6326
  };
@@ -8120,7 +8124,7 @@ function registerPaaExtractorMcpTools(server2, executor, options = {}) {
8120
8124
  }, async (input) => formatMapsPlaceIntel(await executor.mapsPlaceIntel(input), input));
8121
8125
  server2.registerTool("maps_search", {
8122
8126
  title: "Google Maps Business Search",
8123
- description: "Search Google local results for multiple businesses by category, niche, or local market \u2014 leads, prospects, competitors, or beyond the 3-pack. It paginates the rendered local-results list, opens each exact business card, then closes the profile dialog before continuing. Set includeServices for services and areas served; review cards are never collected by this tool.",
8127
+ description: "Search Google local results for multiple businesses by category, niche, or local market \u2014 leads, prospects, competitors, or beyond the 3-pack. Reaches the local-results list from the organic page and paginates it, returning up to 50 candidates (default 10) with names, place URLs, CIDs, and ratings. Leave proxyMode unset. Set includeServices to also open each business profile for its services and areas served; review cards are never collected by this tool.",
8124
8128
  inputSchema: MapsSearchInputSchema,
8125
8129
  outputSchema: recordOutputSchema("maps_search", MapsSearchOutputSchema),
8126
8130
  annotations: liveWebToolAnnotations("Google Maps Business Search")
@@ -8401,7 +8405,7 @@ var DeclineShareSchema = {
8401
8405
  var GetChatLinkSchema = {
8402
8406
  id: "get-chat-link",
8403
8407
  upstreamName: "getChatLinkTool",
8404
- description: "Get your durable, bookmarkable link to the hosted Omni-Chat page \u2014 a login-free chat UI for every channel you're in. The embedded secret is shown only once, on first call; it cannot be re-shown, only revoked and reissued via revoke-chat-link. Anyone holding the link can post as you.",
8408
+ description: "Get your durable, bookmarkable link to the hosted Inbox chat page \u2014 a login-free chat UI for every channel you're in. The embedded secret is shown only once, on first call; it cannot be re-shown, only revoked and reissued via revoke-chat-link. Anyone holding the link can post as you.",
8405
8409
  input: {},
8406
8410
  output: {
8407
8411
  ok: import_zod5.z.boolean().describe("True on success; false on auth error."),
@@ -8420,7 +8424,7 @@ var GetChatLinkSchema = {
8420
8424
  var GetVaultAppLinkSchema = {
8421
8425
  id: "get-vault-app-link",
8422
8426
  upstreamName: "getVaultAppLinkTool",
8423
- description: "Get the durable, bookmarkable link to the mobile-first Vault App for People, Projects, and Tasks. The embedded secret is shown only once; revoke-vault-app-link then call this tool again to replace a link that was shared or leaked. This link is independent from Omni-Chat. Anyone holding it can use the Vault App as this identity.",
8427
+ description: "Get the durable, bookmarkable link to the mobile-first Vault App for People, Projects, and Tasks. The embedded secret is shown only once; revoke-vault-app-link then call this tool again to replace a link that was shared or leaked. This link is independent from the Inbox chat link. Anyone holding it can use the Vault App as this identity.",
8424
8428
  input: {},
8425
8429
  output: {
8426
8430
  ok: import_zod5.z.boolean().describe("True when the request succeeded."),
@@ -8687,7 +8691,7 @@ var RevokeShareSchema = {
8687
8691
  var RevokeVaultAppLinkSchema = {
8688
8692
  id: "revoke-vault-app-link",
8689
8693
  upstreamName: "revokeVaultAppLinkTool",
8690
- description: "Immediately revoke the current Vault App link without touching the separate Omni-Chat link. Call get-vault-app-link afterward to mint a replacement.",
8694
+ description: "Immediately revoke the current Vault App link without touching the separate Inbox chat link. Call get-vault-app-link afterward to mint a replacement.",
8691
8695
  input: {},
8692
8696
  output: {
8693
8697
  ok: import_zod5.z.boolean().describe("True when the request succeeded."),
@@ -8901,7 +8905,7 @@ var memoryCaptureTool_notePropsSchema = import_zod5.z.object({
8901
8905
  var MemoryCaptureSchema = {
8902
8906
  id: "memory-capture",
8903
8907
  upstreamName: "memoryCaptureTool",
8904
- 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 and invalid relationship-domain writes: projects need a project kind, tasks can be independent Inbox todos or link a verified project, deals need a known party, and draft emails need a pending approval state. It writes through memory-put, registers canonical tags, and verifies persisted content and props. Reserve memory-put for low-level migrations or deliberate edits.",
8908
+ 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 and invalid relationship-domain writes: projects need a project kind, tasks may be independent Inbox todos but must use a matched project when linked, deals need a known party, and draft emails need a pending approval state. It writes through memory-put, registers canonical tags, and verifies persisted content and props. Reserve memory-put for low-level migrations or deliberate edits.",
8905
8909
  input: {
8906
8910
  vault: import_zod5.z.string(),
8907
8911
  folder: import_zod5.z.string().optional(),
@@ -8959,7 +8963,7 @@ var MemoryQuestionsSchema = {
8959
8963
  var PrepareMemoryWriteSchema = {
8960
8964
  id: "prepare-memory-write",
8961
8965
  upstreamName: "prepareMemoryWriteTool",
8962
- 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. For People, Deals, Projects, Tasks, and Communications, it also returns relationship and approval guidance: a Task may be an independent Inbox todo, so search existing records only before adding a requested project or party link and never invent one. 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.",
8966
+ 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. For People, Organizations, Deals, Projects, Tasks, and Communication, it also returns relationship and approval guidance: search existing records before linking, but do not invent a project or party. A Task can remain an independent Inbox todo. 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.",
8963
8967
  input: {
8964
8968
  title: import_zod5.z.string().min(1),
8965
8969
  content: import_zod5.z.string().min(1),
@@ -9023,7 +9027,7 @@ var ValidateMemoryWriteSchema = {
9023
9027
  var CreateChannelSchema = {
9024
9028
  id: "create-channel",
9025
9029
  upstreamName: "createChannelTool",
9026
- description: "Create an Omni-Chat channel \u2014 a vault for threaded messages, reactions, and mentions instead of ordinary notes. Starts private to you; optionally invite initial members in the same call, each still gated by the normal sender-approval trust check. Requires write scope.",
9030
+ description: "Create an Inbox channel \u2014 a vault for threaded messages, reactions, and mentions instead of ordinary notes. Starts private to you; optionally invite initial members in the same call, each still gated by the normal sender-approval trust check. Requires write scope.",
9027
9031
  input: {
9028
9032
  name: import_zod5.z.string().min(1).describe("Channel name. Must match ^[A-Za-z0-9 _-]{1,48}$."),
9029
9033
  inviteMembers: import_zod5.z.array(
@@ -9106,7 +9110,7 @@ var ListChannelMembersSchema = {
9106
9110
  var ListChannelMessagesSchema = {
9107
9111
  id: "list-channel-messages",
9108
9112
  upstreamName: "listChannelMessagesTool",
9109
- description: "Read an Omni-Chat channel: top-level messages by default, or one thread's replies when parentMessageId is given. Every message returned is marked read for you, visible to other members via readBy. Requires read access on the channel.",
9113
+ description: "Read an Inbox channel: top-level messages by default, or one thread's replies when parentMessageId is given. Every message returned is marked read for you, visible to other members via readBy. Requires read access on the channel.",
9110
9114
  input: {
9111
9115
  vault: import_zod5.z.string().min(1).describe("The channel (vault) to read."),
9112
9116
  parentMessageId: import_zod5.z.string().optional().describe("If given, list this thread's replies instead of top-level channel messages.")
@@ -9141,7 +9145,7 @@ var ListChannelMessagesSchema = {
9141
9145
  var MyMentionsSchema = {
9142
9146
  id: "my-mentions",
9143
9147
  upstreamName: "myMentionsTool",
9144
- description: "List every place you're @mentioned across all Omni-Chat channels you are CURRENTLY a member of, newest first \u2014 mentions in channels you've since left do not appear.",
9148
+ description: "List every place you're @mentioned across all Inbox channels you are CURRENTLY a member of, newest first \u2014 mentions in channels you've since left do not appear.",
9145
9149
  input: {
9146
9150
  limit: import_zod5.z.number().int().min(1).max(100).optional().describe("Max mentions to return. Optional; default 25.")
9147
9151
  },
@@ -9194,7 +9198,7 @@ var PollChannelSchema = {
9194
9198
  var PostMessageSchema = {
9195
9199
  id: "post-message",
9196
9200
  upstreamName: "postMessageTool",
9197
- description: "Post a top-level message to an Omni-Chat channel. @mentioning a member's email surfaces it in their my-mentions inbox; attachNote auto-shares one of your notes with every current channel member. Requires write access on the channel.",
9201
+ description: "Post a top-level message to an Inbox channel. @mentioning a member's email surfaces it in their my-mentions inbox; attachNote auto-shares one of your notes with every current channel member. Requires write access on the channel.",
9198
9202
  input: {
9199
9203
  vault: import_zod5.z.string().min(1).describe("The channel (vault) to post to."),
9200
9204
  content: import_zod5.z.string().min(1).describe("The message text."),
@@ -9267,7 +9271,7 @@ var RemoveChannelMemberSchema = {
9267
9271
  var ReplyMessageSchema = {
9268
9272
  id: "reply-message",
9269
9273
  upstreamName: "replyMessageTool",
9270
- description: "Reply inside a top-level message's thread in an Omni-Chat channel \u2014 one level of nesting only, so always reply on the top-level parentMessageId. @mentions and attachNote behave as in post-message. Requires write access on the channel.",
9274
+ description: "Reply inside a top-level message's thread in an Inbox channel \u2014 one level of nesting only, so always reply on the top-level parentMessageId. @mentions and attachNote behave as in post-message. Requires write access on the channel.",
9271
9275
  input: {
9272
9276
  vault: import_zod5.z.string().min(1).describe("The channel (vault) the parent message is in."),
9273
9277
  parentMessageId: import_zod5.z.string().min(1).describe("The top-level message to reply under (messageId from post-message or list-channel-messages)."),
@@ -9666,10 +9670,10 @@ var putTool_notePropsSchema = import_zod5.z.object({
9666
9670
  var PutSchema = {
9667
9671
  id: "memory-put",
9668
9672
  upstreamName: "putTool",
9669
- description: "Create or deliberately edit one note at a path in a memory vault; content is persisted and indexed for search. For normal new People, Deals, Projects, Tasks, or Communications records, use prepare-memory-write then memory-capture: People must be real people or organizations, Deals need a known party, Projects need a supported kind, Tasks may be independent Inbox todos or use a verified Project link when requested, and draft emails need pending approval. For row-shaped datasets you'll filter/sort by exact value, use table-create/table-insert-rows/table-query instead. Ordinary vaults are indexed and shareable \u2014 never store real secrets there; use a secure vault (create-secure-vault) instead, which is never indexed or shareable and is encrypted at rest. Requires write scope.",
9673
+ description: "Create or deliberately edit one note at a path in a memory vault; content is persisted and indexed for search. For normal new People, Organizations, Deals, Projects, Tasks, or Communication records, use prepare-memory-write then memory-capture: People must be real people, Organizations must be real organizations, Deals need a known party, Projects need a supported kind, Tasks can be independent Inbox todos or use a verified Project when linked, and draft emails need pending approval. For row-shaped datasets you'll filter/sort by exact value, use table-create/table-insert-rows/table-query instead. Ordinary vaults are indexed and shareable \u2014 never store real secrets there; use a secure vault (create-secure-vault) instead, which is never indexed or shareable and is encrypted at rest. Requires write scope.",
9670
9674
  input: {
9671
9675
  vault: import_zod5.z.string().optional().describe(
9672
- "Vault to write to. Optional; defaults to the session active vault, then the first vault the caller is entitled to. On a default-provisioned account, pick the vault whose job matches the content (see the server instructions for the full 15-vault guide) rather than defaulting blindly \u2014 e.g. a lesson learned goes in Knowledge, the raw source it came from goes in Library, a broken feature goes in Issues, a named real-world initiative goes in Projects. Do not use this low-level tool to create ordinary People, Deals, Projects, Tasks, or Communications records: first use prepare-memory-write then memory-capture so relationships and approval state are validated."
9676
+ "Vault to write to. Optional; defaults to the session active vault, then the first vault the caller is entitled to. On a default-provisioned account, pick the vault whose job matches the content (see the server instructions for the full 16-vault guide) rather than defaulting blindly \u2014 e.g. a lesson learned goes in Knowledge, the raw source it came from goes in Library, a broken feature goes in Issues, a named real-world initiative goes in Projects. Do not use this low-level tool to create ordinary People, Organizations, Deals, Projects, Tasks, or Communication records: first use prepare-memory-write then memory-capture so relationships and approval state are validated."
9673
9677
  ),
9674
9678
  path: import_zod5.z.string().optional().describe("Vault-relative note path to create or overwrite, e.g. projects/q3-plan. Writing an existing path replaces it. Required unless shareId is given."),
9675
9679
  shareId: import_zod5.z.string().optional().describe("Edit a note someone individually shared with you and you accepted (accept-share), by its shareId, instead of vault+path. Requires the share to grant edit permission, and baseRevision is mandatory (get the current revision first) since you are editing alongside the owner and possibly others."),
@@ -9866,12 +9870,12 @@ var TemporalRecallSchema = {
9866
9870
  var CreateScheduledActionSchema = {
9867
9871
  id: "create-scheduled-action",
9868
9872
  upstreamName: "createScheduledActionTool",
9869
- 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.",
9873
+ 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. Cadence 'once' runs a single time then completes permanently. Requires write access to the target vault.",
9870
9874
  input: {
9871
9875
  description: import_zod5.z.string().min(1).describe("Free-text description of what this action should do each time it runs."),
9872
9876
  vault: import_zod5.z.string().min(1).describe("The vault this action writes its results into. You must already have write access to it."),
9873
9877
  cadence: import_zod5.z.enum(["once", "daily", "weekly", "monthly"]).describe('How often this action runs. "once" fires a single time and then completes.'),
9874
- 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.`),
9878
+ 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.`),
9875
9879
  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)."),
9876
9880
  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.`),
9877
9881
  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.')
@@ -10456,9 +10460,9 @@ var DeleteVaultSchema = {
10456
10460
  var GetVaultContractSchema = {
10457
10461
  id: "get-vault-contract",
10458
10462
  upstreamName: "getVaultContractTool",
10459
- description: "Read the machine-enforced purpose, template, statuses, types, natural neighbor vaults, and typed relationship guidance for one of the 15 governed Obsidian-style vaults. Call before composing a note when the correct shape is uncertain.",
10463
+ description: "Read the machine-enforced purpose, template, statuses, types, required and recommended props, natural neighbor vaults, and typed relationship guidance for one of the 16 governed Obsidian-style vaults. Call before composing a note when the correct shape is uncertain.",
10460
10464
  input: {
10461
- vault: import_zod5.z.string().describe("One governed vault: Ideas, Inspiration, Knowledge, Library, People, Deals, Communications, Calendar, Tasks, Projects, Issues, Improvement Log, Experiments, Sprint, or Skills.")
10465
+ vault: import_zod5.z.string().describe("One governed vault: Ideas, Examples and Inspirations, Knowledge, Library, People, Organizations, Deals, Communication, Calendar, Tasks, Projects, Issues, Improvement Log, Experiments, Sprint, or Skills. Former names Inspiration and Communications still resolve.")
10462
10466
  },
10463
10467
  output: {
10464
10468
  ok: import_zod5.z.boolean(),
@@ -10512,7 +10516,7 @@ var ListVaultsSchema = {
10512
10516
  sharedBy: import_zod5.z.string().optional().describe('Identity that shared the vault with the caller. Present only when role is "shared".'),
10513
10517
  notes: import_zod5.z.number().describe("Number of notes currently stored in the vault."),
10514
10518
  bytes: import_zod5.z.number().describe("Total stored size of the vault content in bytes (octet_length sum)."),
10515
- kind: import_zod5.z.enum(["notes", "channel", "secure"]).describe('"channel" for an Omni-Chat channel (created via create-channel); "secure" for a private, encrypted, unshareable, unindexed vault (created via create-secure-vault) \u2014 safe to store credentials there; "notes" for an ordinary vault.')
10519
+ kind: import_zod5.z.enum(["notes", "channel", "secure"]).describe('"channel" for an Inbox channel (created via create-channel); "secure" for a private, encrypted, unshareable, unindexed vault (created via create-secure-vault) \u2014 safe to store credentials there; "notes" for an ordinary vault.')
10516
10520
  })
10517
10521
  ).optional().describe("Every vault visible in the active account, with role, addressable handle, and live storage usage. Present when ok is true."),
10518
10522
  error: import_zod5.z.string().optional().describe("Human-readable failure reason when ok is false.")
@@ -10528,17 +10532,17 @@ var ListVaultsSchema = {
10528
10532
  var ProvisionDefaultsSchema = {
10529
10533
  id: "provision-defaults",
10530
10534
  upstreamName: "provisionDefaultsTool",
10531
- description: "Provision the standard 15-vault memory structure (Ideas, Inspiration, Knowledge, Library, People, Deals, Communications, Calendar, Tasks, Projects, Issues, Improvement Log, Experiments, Sprint, Skills) for an identity. Idempotent \u2014 existing records are untouched and existing vault contracts are refreshed. Optionally issues a fresh API key entitled to all 15. Requires admin scope.",
10535
+ description: "Provision the standard 16-vault memory structure (Ideas, Examples and Inspirations, Knowledge, Library, People, Organizations, Deals, Communication, Calendar, Tasks, Projects, Issues, Improvement Log, Experiments, Sprint, Skills) for an identity. Idempotent \u2014 existing records are untouched and existing vault contracts are refreshed. Optionally issues a fresh API key entitled to all 16. Requires admin scope.",
10532
10536
  input: {
10533
- granteeIdentity: import_zod5.z.string().min(1).describe("Identity that should OWN the 15 default vaults (e.g. an email or user id)."),
10534
- issueKey: import_zod5.z.boolean().optional().describe("When true, also issue a new API key for the identity entitled to all 15 vaults and return its secret once. Default false."),
10537
+ granteeIdentity: import_zod5.z.string().min(1).describe("Identity that should OWN the 16 default vaults (e.g. an email or user id)."),
10538
+ issueKey: import_zod5.z.boolean().optional().describe("When true, also issue a new API key for the identity entitled to all 16 vaults and return its secret once. Default false."),
10535
10539
  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.")
10536
10540
  },
10537
10541
  output: {
10538
10542
  ok: import_zod5.z.boolean().describe("True when provisioning succeeded; false on auth/scope error."),
10539
10543
  identity: import_zod5.z.string().optional().describe("Identity the vaults were provisioned for."),
10540
- created: import_zod5.z.array(import_zod5.z.string()).optional().describe("Vault names newly created on this call (empty when all 15 already existed)."),
10541
- vaults: import_zod5.z.array(import_zod5.z.string()).optional().describe("All 15 default vault names the identity now owns."),
10544
+ created: import_zod5.z.array(import_zod5.z.string()).optional().describe("Vault names newly created on this call (empty when all 16 already existed)."),
10545
+ vaults: import_zod5.z.array(import_zod5.z.string()).optional().describe("All 16 default vault names the identity now owns."),
10542
10546
  keyId: import_zod5.z.string().optional().describe("Stable id of the issued key. Present only when issueKey was true."),
10543
10547
  secret: import_zod5.z.string().optional().describe("The issued key secret \u2014 RETURNED ONCE. Present only when issueKey was true."),
10544
10548
  plan: import_zod5.z.string().optional().describe("Plan assigned to the issued key. Present only when issueKey was true."),