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.
package/README.md CHANGED
@@ -88,7 +88,7 @@ Build the branded one-click bundle:
88
88
  npm run build:mcpb
89
89
  ```
90
90
 
91
- The generated bundle is written to `build/mcpb/mcp-scraper-<version>.mcpb` and copied to `public/downloads/` for the hosted download. The current public bundle is `https://mcpscraper.dev/downloads/mcp-scraper.mcpb` (`0.24.0`, SHA-256 `02f3b2a8ae2b264551fce9a2068eecd9cca22feed5946f077c32e84776138d1a`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, and API-key configuration field from the bundle manifest.
91
+ The generated bundle is written to `build/mcpb/mcp-scraper-<version>.mcpb` and copied to `public/downloads/` for the hosted download. The current public bundle is `https://mcpscraper.dev/downloads/mcp-scraper.mcpb` (`0.25.0`, SHA-256 `357400ee624421d96671d7eef9fe050c35af691d1b42b160b86f5b86470679f1`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, and API-key configuration field from the bundle manifest.
92
92
 
93
93
  The MCPB install exposes every tool — web-intelligence plus all `browser_*` tools — through the one `mcp-scraper` server.
94
94
 
@@ -227,7 +227,7 @@ The `mcp-scraper` server (and the MCPB bundle, which runs it) exposes both secti
227
227
 
228
228
  All MCP tools expose output schemas and return `structuredContent` with the IDs, URLs, CSV paths, transcripts, browser session handles, replay paths, artifacts, recipe fields, or blueprint fields needed by the next step. Browser Agent tools keep a JSON text block for older clients, but structured data is the primary contract. All tools carry MCP annotations; file-writing tools such as replay downloads and annotations state their filesystem side effects.
229
229
 
230
- The canonical tool inventory is generated at `docs/mcp-tool-manifest.generated.json`. Both the `mcp-scraper` stdio server and the hosted endpoint at `https://mcpscraper.dev/mcp` expose the same 160 tools: 73 scraper, browser, workflow, billing, and connected-service tools plus 87 durable-memory tools. Release verification compares the exact local and remote tool-name sets, not only the count.
230
+ The canonical tool inventory is generated at `docs/mcp-tool-manifest.generated.json`. Both the `mcp-scraper` stdio server and the hosted endpoint at `https://mcpscraper.dev/mcp` expose the same 162 tools: 75 scraper, browser, workflow, billing, and connected-service tools plus 87 durable-memory tools. Release verification compares the exact local and remote tool-name sets, not only the count.
231
231
 
232
232
  ## Resources
233
233
 
@@ -29200,7 +29200,7 @@ var PACKAGE_VERSION;
29200
29200
  var init_version = __esm({
29201
29201
  "src/version.ts"() {
29202
29202
  "use strict";
29203
- PACKAGE_VERSION = "0.24.0";
29203
+ PACKAGE_VERSION = "0.25.0";
29204
29204
  }
29205
29205
  });
29206
29206
 
@@ -29315,7 +29315,7 @@ Multi-step orchestrations \u2014 prefer these over hand-chaining primitives when
29315
29315
 
29316
29316
  ## Memory
29317
29317
  mcp-scraper also exposes persistent per-user memory tools (notes, facts, vaults,
29318
- scheduled actions, tables, channels) backed by memory.mcpscraper.dev. Every account starts with 13
29318
+ scheduled actions, tables, channels) backed by memory.mcpscraper.dev. Every account starts with 14
29319
29319
  vaults \u2014 call **list-vaults** to see what exists before creating anything new. Pick the vault whose job
29320
29320
  matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled lessons/how-tos),
29321
29321
  **Library** (raw source material \u2014 articles, transcripts), **People** (one durable note per person/org),
@@ -29323,7 +29323,8 @@ matches the content: **Ideas** (unvalidated concepts), **Knowledge** (distilled
29323
29323
  (action items with a status), **Projects** (durable named initiatives), **Issues** (something broken),
29324
29324
  **Improvement Log** (receipts of changes made and whether they worked), **Experiments** (hypothesis +
29325
29325
  measured result), **Sprint** (current cycle's scope), **Inspiration** (other people's work worth
29326
- studying).
29326
+ studying), **Skills** (reusable skill packages; each requires \`scripts/\` and at least one of
29327
+ \`references/\` or \`templates/\`, and may use both).
29327
29328
  For a normal new narrative note, call **prepare-memory-write** first. It queries the live vault contract,
29328
29329
  tag vocabulary, and natural neighbor vaults, and returns interlink candidates that must be read before
29329
29330
  acceptance. Compose every returned template section, then call **memory-capture**, which validates the
@@ -29353,6 +29354,12 @@ Tags are live vocabulary, not improvised labels: **list-memory-tags** shows what
29353
29354
  reusable, and has no exact, alias, or near-equivalent. Use **memory-backlinks**,
29354
29355
  **memory-graph-universe**, and **memory-graph-path** to trace the linked universe across vaults.
29355
29356
 
29357
+ **Always inspect the complete tag inventory and related notes first.** Use hybrid Smart RAG by default:
29358
+ form 3 focused queries (2\u20134 when useful), fuse exact tag/metadata/vault/date and semantic matches into 50
29359
+ candidates, expand the top 8 seeds by one link/backlink hop with at most 5 neighbors each, then Jina-rerank
29360
+ the combined pool to the best 30. Graph neighbors are candidates, never automatic links; add only links
29361
+ supported by the note contents.
29362
+
29356
29363
  Scrape deposits are raw evidence and therefore go to **Library** through **library-ingest**, with the full
29357
29364
  Library template and source metadata. If the source contains durable applicable guidance, create a separate
29358
29365
  Knowledge companion through prepare-memory-write + memory-capture and link it to the Library source with
@@ -33794,7 +33801,7 @@ var init_browser_agent_mcp_server = __esm({
33794
33801
  });
33795
33802
 
33796
33803
  // src/mcp/memory-tool-schemas.ts
33797
- var import_zod36, AcceptShareSchema, ApproveSenderSchema, DeclineShareSchema, GetChatLinkSchema, InboxSettingsSchema, InviteAccountSchema, issueKeyTool_scopeShape, IssueKeySchema, ListApprovedSendersSchema, ListKeysSchema, NoteInboxSchema, RemoveApprovedSenderSchema, RevokeChatLinkSchema, RevokeKeySchema, RevokeShareSchema, SetAgentIdentitySchema, SetScopeSchema, ShareNoteSchema, ShareVaultSchema, SwapVaultSchema, SwitchAccountSchema, UnlinkShareSchema, memoryCaptureTool_notePropsSchema, MemoryCaptureSchema, MemoryQuestionsSchema, PrepareMemoryWriteSchema, validateMemoryWriteTool_notePropsSchema, ValidateMemoryWriteSchema, CreateChannelSchema, GetMessageNoteSchema, ListChannelMembersSchema, ListChannelMessagesSchema, MyMentionsSchema, PollChannelSchema, PostMessageSchema, ReactMessageSchema, RemoveChannelMemberSchema, ReplyMessageSchema, factHistoryTool_entryShape, FactHistorySchema, recordFactTool_factShape, RecordFactSchema, NoteBacklinksSchema, GraphPathSchema, GraphUniverseSchema, LibraryIngestSchema, DeleteNoteSchema, ExportSchema, getTool_notePropsSchema, GetSchema, ListSchema, putTool_notePropsSchema, PutSchema, SearchSchema, SuggestSchema, UploadSchema, TemporalRecallSchema, CreateScheduledActionSchema, DeleteScheduledActionSchema, GetScheduleLinkSchema, GetScheduleStatusSchema, ListScheduledActionsSchema, PauseScheduledActionSchema, ProposeScheduledActionSchema, ResumeScheduledActionSchema, RevokeScheduleLinkSchema, SetScheduleEntitlementSchema, CostUsageSchema, StorageUsageSchema, CreateTableSchema, deleteTableRowsTool_FilterSchema, DeleteTableRowsSchema, DescribeTableSchema, DropTableSchema, InsertTableRowsSchema, ListTablesSchema, queryTableTool_FilterSchema, QueryTableSchema, ListTagsSchema, ResolveTagsSchema, UpsertTagSchema, AddVaultSchema, CreateSecureVaultSchema, DeleteVaultSchema, GetVaultContractSchema, ListSharedWithMeSchema, ListVaultsSchema, ProvisionDefaultsSchema, RouteMemorySchema, VideoAnalyzeStartSchema, VideoAnalyzeStatusSchema, CreateWebhookSchema, ListWebhooksSchema, RevokeWebhookSchema, MEMORY_TOOL_SCHEMAS;
33804
+ var import_zod36, AcceptShareSchema, ApproveSenderSchema, DeclineShareSchema, GetChatLinkSchema, InboxSettingsSchema, InviteAccountSchema, issueKeyTool_scopeShape, IssueKeySchema, ListApprovedSendersSchema, ListKeysSchema, NoteInboxSchema, RemoveApprovedSenderSchema, RevokeChatLinkSchema, RevokeKeySchema, RevokeShareSchema, SetAgentIdentitySchema, SetScopeSchema, ShareNoteSchema, ShareVaultSchema, SwapVaultSchema, SwitchAccountSchema, UnlinkShareSchema, memoryCaptureTool_notePropsSchema, MemoryCaptureSchema, MemoryQuestionsSchema, PrepareMemoryWriteSchema, validateMemoryWriteTool_notePropsSchema, ValidateMemoryWriteSchema, CreateChannelSchema, GetMessageNoteSchema, ListChannelMembersSchema, ListChannelMessagesSchema, MyMentionsSchema, PollChannelSchema, PostMessageSchema, ReactMessageSchema, RemoveChannelMemberSchema, ReplyMessageSchema, factHistoryTool_entryShape, FactHistorySchema, recordFactTool_factShape, RecordFactSchema, NoteBacklinksSchema, GraphPathSchema, GraphUniverseSchema, LibraryIngestSchema, bulkDeleteNotesTool_FilterSchema, BulkDeleteNotesSchema, DeleteNoteSchema, ExportSchema, getTool_notePropsSchema, GetSchema, ListSchema, putTool_notePropsSchema, PutSchema, searchTool_primitiveValue, SearchSchema, SuggestSchema, UploadSchema, TemporalRecallSchema, CreateScheduledActionSchema, DeleteScheduledActionSchema, GetScheduleLinkSchema, GetScheduleStatusSchema, ListScheduledActionsSchema, PauseScheduledActionSchema, ProposeScheduledActionSchema, ResumeScheduledActionSchema, RevokeScheduleLinkSchema, SetScheduleDefaultsSchema, SetScheduleEntitlementSchema, CostUsageSchema, StorageUsageSchema, CreateTableSchema, deleteTableRowsTool_FilterSchema, DeleteTableRowsSchema, DescribeTableSchema, DropTableSchema, InsertTableRowsSchema, ListTablesSchema, queryTableTool_FilterSchema, QueryTableSchema, ListTagsSchema, ResolveTagsSchema, UpsertTagSchema, AddVaultSchema, CreateSecureVaultSchema, DeleteVaultSchema, GetVaultContractSchema, ListSharedWithMeSchema, ListVaultsSchema, ProvisionDefaultsSchema, RouteMemorySchema, VideoAnalyzeStartSchema, VideoAnalyzeStatusSchema, CreateWebhookSchema, ListWebhooksSchema, RevokeWebhookSchema, MEMORY_TOOL_SCHEMAS;
33798
33805
  var init_memory_tool_schemas = __esm({
33799
33806
  "src/mcp/memory-tool-schemas.ts"() {
33800
33807
  "use strict";
@@ -34318,12 +34325,15 @@ var init_memory_tool_schemas = __esm({
34318
34325
  type: import_zod36.z.string().describe("Note type from the target vault contract (also used to route the note)."),
34319
34326
  domain: import_zod36.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
34320
34327
  folder: import_zod36.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
34328
+ script_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
34329
+ reference_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
34330
+ template_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
34321
34331
  parentMessageId: import_zod36.z.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
34322
34332
  }).partial().passthrough();
34323
34333
  MemoryCaptureSchema = {
34324
34334
  id: "memory-capture",
34325
34335
  upstreamName: "memoryCaptureTool",
34326
- 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.",
34336
+ 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.",
34327
34337
  input: {
34328
34338
  vault: import_zod36.z.string(),
34329
34339
  folder: import_zod36.z.string().optional(),
@@ -34381,7 +34391,7 @@ var init_memory_tool_schemas = __esm({
34381
34391
  PrepareMemoryWriteSchema = {
34382
34392
  id: "prepare-memory-write",
34383
34393
  upstreamName: "prepareMemoryWriteTool",
34384
- 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.",
34394
+ 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.",
34385
34395
  input: {
34386
34396
  title: import_zod36.z.string().min(1),
34387
34397
  content: import_zod36.z.string().min(1),
@@ -34417,6 +34427,9 @@ var init_memory_tool_schemas = __esm({
34417
34427
  type: import_zod36.z.string().describe("Note type from the target vault contract (also used to route the note)."),
34418
34428
  domain: import_zod36.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
34419
34429
  folder: import_zod36.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
34430
+ script_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
34431
+ reference_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
34432
+ template_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
34420
34433
  parentMessageId: import_zod36.z.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
34421
34434
  }).partial().passthrough();
34422
34435
  ValidateMemoryWriteSchema = {
@@ -34872,6 +34885,39 @@ var init_memory_tool_schemas = __esm({
34872
34885
  openWorldHint: true
34873
34886
  }
34874
34887
  };
34888
+ bulkDeleteNotesTool_FilterSchema = import_zod36.z.object({
34889
+ column: import_zod36.z.enum(["path", "title", "kind", "source", "captured_at", "created_at", "updated_at", "revision"]).describe("Note column to filter on."),
34890
+ op: import_zod36.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.'),
34891
+ value: import_zod36.z.unknown().describe('Value to compare against. For "in", pass an array.')
34892
+ });
34893
+ BulkDeleteNotesSchema = {
34894
+ id: "bulk-delete-notes",
34895
+ upstreamName: "bulkDeleteNotesTool",
34896
+ 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).",
34897
+ input: {
34898
+ vault: import_zod36.z.string().optional().describe("Vault to delete from. Optional; defaults to the session active vault, then the first vault the caller is entitled to."),
34899
+ filters: import_zod36.z.array(bulkDeleteNotesTool_FilterSchema).default([]).describe("Filters to AND together. At least one of filters/tags is required."),
34900
+ tags: import_zod36.z.array(import_zod36.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."),
34901
+ dryRun: import_zod36.z.boolean().default(true).describe("When true (default), previews matches without deleting anything. Pass false to actually delete.")
34902
+ },
34903
+ output: {
34904
+ ok: import_zod36.z.boolean().describe("True on success; false on auth/scope/validation error."),
34905
+ vault: import_zod36.z.string().optional().describe("The vault operated on (after defaulting). Present when ok is true."),
34906
+ dryRun: import_zod36.z.boolean().optional().describe("Echoes whether this call was a preview or a real delete."),
34907
+ matchCount: import_zod36.z.number().optional().describe("Number of notes matching the filters. Present on a dry run."),
34908
+ sample: import_zod36.z.array(import_zod36.z.object({ path: import_zod36.z.string(), title: import_zod36.z.string(), updatedAt: import_zod36.z.string() })).optional().describe("Up to 20 matching notes, most-recently-updated first. Present on a dry run."),
34909
+ deleted: import_zod36.z.number().optional().describe("Number of notes actually deleted. Present when dryRun is false."),
34910
+ deletedPaths: import_zod36.z.array(import_zod36.z.string()).optional().describe("Paths of the deleted notes. Present when dryRun is false."),
34911
+ error: import_zod36.z.string().optional().describe("Human-readable failure reason when ok is false.")
34912
+ },
34913
+ annotations: {
34914
+ title: "Bulk Delete Notes",
34915
+ readOnlyHint: false,
34916
+ destructiveHint: true,
34917
+ idempotentHint: false,
34918
+ openWorldHint: false
34919
+ }
34920
+ };
34875
34921
  DeleteNoteSchema = {
34876
34922
  id: "delete-note",
34877
34923
  upstreamName: "deleteNoteTool",
@@ -34953,6 +34999,9 @@ var init_memory_tool_schemas = __esm({
34953
34999
  type: import_zod36.z.string().describe("Note type from the target vault contract (also used to route the note)."),
34954
35000
  domain: import_zod36.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
34955
35001
  folder: import_zod36.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
35002
+ script_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
35003
+ reference_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
35004
+ template_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
34956
35005
  parentMessageId: import_zod36.z.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
34957
35006
  }).partial().passthrough();
34958
35007
  GetSchema = {
@@ -35041,6 +35090,9 @@ var init_memory_tool_schemas = __esm({
35041
35090
  type: import_zod36.z.string().describe("Note type from the target vault contract (also used to route the note)."),
35042
35091
  domain: import_zod36.z.string().describe("Domain folder for Library/Knowledge (AI, SEO, Copywriting & Ads, Business, Spirituality)."),
35043
35092
  folder: import_zod36.z.string().describe("Explicit sub-folder within the vault; overrides routing-derived folder."),
35093
+ script_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: one or more Obsidian/internal paths under scripts/."),
35094
+ reference_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: optional Obsidian/internal paths under references/."),
35095
+ template_links: import_zod36.z.array(import_zod36.z.string()).describe("Skills only: optional Obsidian/internal paths under templates/."),
35044
35096
  parentMessageId: import_zod36.z.string().describe("Channel messages only: the path of the top-level message this is a reply to. Absent on top-level messages.")
35045
35097
  }).partial().passthrough();
35046
35098
  PutSchema = {
@@ -35085,44 +35137,64 @@ var init_memory_tool_schemas = __esm({
35085
35137
  openWorldHint: true
35086
35138
  }
35087
35139
  };
35140
+ searchTool_primitiveValue = import_zod36.z.union([import_zod36.z.string(), import_zod36.z.number(), import_zod36.z.boolean()]);
35088
35141
  SearchSchema = {
35089
35142
  id: "memory-search",
35090
35143
  upstreamName: "searchTool",
35091
- 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).",
35144
+ 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.",
35092
35145
  input: {
35093
- vault: import_zod36.z.string().optional().describe(
35094
- "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."
35095
- ),
35096
- query: import_zod36.z.string().min(1).describe(
35097
- "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."
35098
- ),
35099
- userMessage: import_zod36.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."),
35100
- topK: import_zod36.z.number().int().min(1).max(50).optional().describe("Maximum number of chunks to return. Optional; default 8, range 1-50."),
35101
- includeShared: import_zod36.z.boolean().optional().describe("Whether to also search notes individually shared with you and accepted. Default true.")
35146
+ vault: import_zod36.z.string().optional().describe("Exact logical vault handle to search. Omit to search every entitled vault."),
35147
+ query: import_zod36.z.string().min(1).describe("A focused semantic reformulation of the request."),
35148
+ userMessage: import_zod36.z.string().optional().describe("Original human wording. Used as a distinct query variant when useful and logged for quality review."),
35149
+ queries: import_zod36.z.array(import_zod36.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."),
35150
+ entities: import_zod36.z.array(import_zod36.z.string().min(1)).max(20).optional().describe("Named entities or exact terms used to form a focused query variant."),
35151
+ tags: import_zod36.z.array(import_zod36.z.string().min(1)).max(20).optional().describe("Exact canonical tags used for tag-channel retrieval and filtering."),
35152
+ tagMode: import_zod36.z.enum(["any", "all"]).optional().describe("Whether a note must match any or all supplied tags. Default any."),
35153
+ kind: import_zod36.z.enum(["note", "library", "capture", "decision", "message"]).optional().describe("Exact persisted note-kind filter."),
35154
+ type: import_zod36.z.string().min(1).optional().describe("Exact props.type filter."),
35155
+ dateFrom: import_zod36.z.string().datetime().optional().describe("Inclusive lower bound for note updatedAt."),
35156
+ dateTo: import_zod36.z.string().datetime().optional().describe("Inclusive upper bound for note updatedAt."),
35157
+ metadata: import_zod36.z.record(searchTool_primitiveValue).optional().describe("Exact equality filters for primitive note props."),
35158
+ queryVariantCount: import_zod36.z.number().int().min(2).max(4).optional().describe("Number of variants. Default 3."),
35159
+ candidatePool: import_zod36.z.number().int().min(10).max(100).optional().describe("Total fused candidates before final reranking. Default 50."),
35160
+ graphSeedCount: import_zod36.z.number().int().min(0).max(20).optional().describe("Strong preliminary notes whose graph neighborhoods are considered. Default 8."),
35161
+ graphDepth: import_zod36.z.literal(1).optional().describe("Graph expansion depth. Bounded to exactly one hop."),
35162
+ graphNeighborsPerSeed: import_zod36.z.number().int().min(1).max(10).optional().describe("Maximum outgoing-link plus backlink neighbors per seed. Default 5."),
35163
+ rerankTopN: import_zod36.z.number().int().min(1).max(50).optional().describe("Final results retained after Jina reranking. Default 30."),
35164
+ topK: import_zod36.z.number().int().min(1).max(50).optional().describe("Deprecated compatibility alias for rerankTopN. Prefer rerankTopN; default remains 30."),
35165
+ includeShared: import_zod36.z.boolean().optional().describe("Also search individually accepted shares. Default true. Exact note metadata filters exclude shares without accessible metadata.")
35102
35166
  },
35103
35167
  output: {
35104
- ok: import_zod36.z.boolean().describe("True when the search ran; false on auth/scope or backend error."),
35105
- vault: import_zod36.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.`),
35106
- vaultsSearched: import_zod36.z.array(import_zod36.z.string()).optional().describe("Every vault handle included in this search."),
35107
- results: import_zod36.z.array(
35108
- import_zod36.z.object({
35109
- text: import_zod36.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."),
35110
- source: import_zod36.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."),
35111
- score: import_zod36.z.number().describe("Similarity score; higher means more relevant to the query."),
35112
- vault: import_zod36.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)."),
35113
- sharedBy: import_zod36.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."),
35114
- shareId: import_zod36.z.string().optional().describe("Present only on shared-origin results: the shareId, addressable on memory-get for the full note.")
35115
- })
35116
- ).optional().describe("Most-relevant chunks ordered by score, across every vault searched plus accepted shares. Present when ok is true; may be empty."),
35117
- error: import_zod36.z.string().optional().describe("Human-readable failure reason when ok is false.")
35168
+ ok: import_zod36.z.boolean(),
35169
+ vault: import_zod36.z.string().optional(),
35170
+ vaultsSearched: import_zod36.z.array(import_zod36.z.string()).optional(),
35171
+ planner: import_zod36.z.object({
35172
+ queryVariants: import_zod36.z.array(import_zod36.z.string()),
35173
+ candidatePool: import_zod36.z.number(),
35174
+ graphSeedCount: import_zod36.z.number(),
35175
+ graphDepth: import_zod36.z.number(),
35176
+ graphNeighborsPerSeed: import_zod36.z.number(),
35177
+ rerankTopN: import_zod36.z.number(),
35178
+ seeds: import_zod36.z.array(import_zod36.z.string()),
35179
+ graphCandidatesAdded: import_zod36.z.number()
35180
+ }).optional(),
35181
+ rerank: import_zod36.z.object({ applied: import_zod36.z.boolean(), provider: import_zod36.z.string(), fallbackReason: import_zod36.z.string().optional() }).optional(),
35182
+ results: import_zod36.z.array(import_zod36.z.object({
35183
+ text: import_zod36.z.string(),
35184
+ source: import_zod36.z.string(),
35185
+ score: import_zod36.z.number(),
35186
+ originalScore: import_zod36.z.number(),
35187
+ rerankScore: import_zod36.z.number().optional(),
35188
+ vault: import_zod36.z.string().optional(),
35189
+ sharedBy: import_zod36.z.string().optional(),
35190
+ shareId: import_zod36.z.string().optional(),
35191
+ matchChannels: import_zod36.z.array(import_zod36.z.enum(["semantic", "tag", "metadata", "graph"])),
35192
+ matchedQueries: import_zod36.z.array(import_zod36.z.string()),
35193
+ graphFrom: import_zod36.z.array(import_zod36.z.string())
35194
+ })).optional(),
35195
+ error: import_zod36.z.string().optional()
35118
35196
  },
35119
- annotations: {
35120
- title: "Semantic Memory Search",
35121
- readOnlyHint: true,
35122
- destructiveHint: false,
35123
- idempotentHint: true,
35124
- openWorldHint: true
35125
- }
35197
+ annotations: { title: "Hybrid Smart RAG Memory Search", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }
35126
35198
  };
35127
35199
  SuggestSchema = {
35128
35200
  id: "memory-suggest",
@@ -35226,14 +35298,14 @@ var init_memory_tool_schemas = __esm({
35226
35298
  CreateScheduledActionSchema = {
35227
35299
  id: "create-scheduled-action",
35228
35300
  upstreamName: "createScheduledActionTool",
35229
- 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.",
35301
+ 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.",
35230
35302
  input: {
35231
35303
  description: import_zod36.z.string().min(1).describe("Free-text description of what this action should do each time it runs."),
35232
35304
  vault: import_zod36.z.string().min(1).describe("The vault this action writes its results into. You must already have write access to it."),
35233
35305
  cadence: import_zod36.z.enum(["once", "daily", "weekly", "monthly"]).describe('How often this action runs. "once" fires a single time and then completes.'),
35234
35306
  executionMode: import_zod36.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.`),
35235
35307
  timeOfDay: import_zod36.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)."),
35236
- timezone: import_zod36.z.string().optional().describe('IANA timezone name, e.g. "America/Denver". Only meaningful together with timeOfDay. Defaults to UTC.'),
35308
+ timezone: import_zod36.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.`),
35237
35309
  deployDate: import_zod36.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.')
35238
35310
  },
35239
35311
  output: {
@@ -35295,7 +35367,7 @@ var init_memory_tool_schemas = __esm({
35295
35367
  GetScheduleStatusSchema = {
35296
35368
  id: "get-schedule-status",
35297
35369
  upstreamName: "getScheduleStatusTool",
35298
- 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.",
35370
+ 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.",
35299
35371
  input: {},
35300
35372
  output: {
35301
35373
  ok: import_zod36.z.boolean(),
@@ -35371,7 +35443,7 @@ var init_memory_tool_schemas = __esm({
35371
35443
  ProposeScheduledActionSchema = {
35372
35444
  id: "propose-scheduled-action",
35373
35445
  upstreamName: "proposeScheduledActionTool",
35374
- 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.",
35446
+ 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.",
35375
35447
  input: {
35376
35448
  request: import_zod36.z.string().min(1).describe("Freeform text describing what you want scheduled.")
35377
35449
  },
@@ -35380,6 +35452,8 @@ var init_memory_tool_schemas = __esm({
35380
35452
  description: import_zod36.z.string().optional().describe("Proposed description \u2014 edit freely before confirming."),
35381
35453
  vault: import_zod36.z.string().optional().describe("Proposed target vault."),
35382
35454
  cadence: import_zod36.z.string().optional().describe("Proposed cadence: once, daily, weekly, or monthly."),
35455
+ timeOfDay: import_zod36.z.string().optional().describe("Proposed 24-hour HH:MM run time, when the request named one."),
35456
+ timezone: import_zod36.z.string().optional().describe("Proposed IANA timezone \u2014 from the request, or the account default when the request named a time without a zone."),
35383
35457
  rationale: import_zod36.z.string().optional().describe("Why these choices were made \u2014 read this before confirming."),
35384
35458
  error: import_zod36.z.string().optional()
35385
35459
  },
@@ -35394,7 +35468,7 @@ var init_memory_tool_schemas = __esm({
35394
35468
  ResumeScheduledActionSchema = {
35395
35469
  id: "resume-scheduled-action",
35396
35470
  upstreamName: "resumeScheduledActionTool",
35397
- description: "Resume a paused scheduled action. Its next run is computed fresh from now, not backfilled for time spent paused.",
35471
+ 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.",
35398
35472
  input: {
35399
35473
  id: import_zod36.z.string().min(1).describe("The scheduled action id.")
35400
35474
  },
@@ -35430,14 +35504,34 @@ var init_memory_tool_schemas = __esm({
35430
35504
  openWorldHint: false
35431
35505
  }
35432
35506
  };
35507
+ SetScheduleDefaultsSchema = {
35508
+ id: "set-schedule-defaults",
35509
+ upstreamName: "setScheduleDefaultsTool",
35510
+ 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.",
35511
+ input: {
35512
+ defaultTimezone: import_zod36.z.string().nullable().describe('IANA timezone name, e.g. "America/Denver". null clears the default (new schedules fall back to UTC).')
35513
+ },
35514
+ output: {
35515
+ ok: import_zod36.z.boolean(),
35516
+ defaultTimezone: import_zod36.z.string().nullable().optional().describe("The default timezone now in effect; null means UTC."),
35517
+ error: import_zod36.z.string().optional()
35518
+ },
35519
+ annotations: {
35520
+ title: "Set Schedule Defaults",
35521
+ readOnlyHint: false,
35522
+ destructiveHint: false,
35523
+ idempotentHint: true,
35524
+ openWorldHint: false
35525
+ }
35526
+ };
35433
35527
  SetScheduleEntitlementSchema = {
35434
35528
  id: "set-schedule-entitlement",
35435
35529
  upstreamName: "setScheduleEntitlementTool",
35436
- 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.",
35530
+ 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.",
35437
35531
  input: {
35438
35532
  granteeIdentity: import_zod36.z.string().min(1).describe("Identity whose scheduling entitlement is being set (e.g. an email)."),
35439
35533
  enabled: import_zod36.z.boolean().optional().describe("Historical entitlement value for migration/recovery only. Omit to preserve the stored value."),
35440
- quotaPerPeriod: import_zod36.z.number().optional().describe("Historical monthly execution quota retained only for migration compatibility. Omit to preserve the stored value."),
35534
+ quotaPerPeriod: import_zod36.z.number().optional().describe("Historical monthly quota for migration/recovery only. Omit to preserve the stored value."),
35441
35535
  mcpScraperApiKey: import_zod36.z.string().optional().describe("The identity's mcp-scraper API key, stored encrypted, used to reach mcp-scraper tools during scheduled-action execution.")
35442
35536
  },
35443
35537
  output: {
@@ -35682,9 +35776,9 @@ var init_memory_tool_schemas = __esm({
35682
35776
  ListTagsSchema = {
35683
35777
  id: "list-memory-tags",
35684
35778
  upstreamName: "listTagsTool",
35685
- 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.",
35779
+ 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.",
35686
35780
  input: {
35687
- includeDeprecated: import_zod36.z.boolean().optional()
35781
+ includeDeprecated: import_zod36.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.")
35688
35782
  },
35689
35783
  output: {
35690
35784
  ok: import_zod36.z.boolean(),
@@ -35696,7 +35790,7 @@ var init_memory_tool_schemas = __esm({
35696
35790
  ResolveTagsSchema = {
35697
35791
  id: "resolve-memory-tags",
35698
35792
  upstreamName: "resolveTagsTool",
35699
- 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.",
35793
+ 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.",
35700
35794
  input: {
35701
35795
  candidates: import_zod36.z.array(import_zod36.z.object({ tag: import_zod36.z.string().min(1), central: import_zod36.z.boolean().optional(), reusable: import_zod36.z.boolean().optional(), description: import_zod36.z.string().optional() })).min(1).max(20)
35702
35796
  },
@@ -35710,7 +35804,7 @@ var init_memory_tool_schemas = __esm({
35710
35804
  UpsertTagSchema = {
35711
35805
  id: "upsert-memory-tag",
35712
35806
  upstreamName: "upsertTagTool",
35713
- 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.",
35807
+ 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.",
35714
35808
  input: {
35715
35809
  tag: import_zod36.z.string().min(1),
35716
35810
  description: import_zod36.z.string().optional(),
@@ -35866,17 +35960,17 @@ var init_memory_tool_schemas = __esm({
35866
35960
  ProvisionDefaultsSchema = {
35867
35961
  id: "provision-defaults",
35868
35962
  upstreamName: "provisionDefaultsTool",
35869
- 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.",
35963
+ 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.",
35870
35964
  input: {
35871
- granteeIdentity: import_zod36.z.string().min(1).describe("Identity that should OWN the 13 default vaults (e.g. an email or user id)."),
35872
- issueKey: import_zod36.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."),
35965
+ granteeIdentity: import_zod36.z.string().min(1).describe("Identity that should OWN the 14 default vaults (e.g. an email or user id)."),
35966
+ issueKey: import_zod36.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."),
35873
35967
  plan: import_zod36.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.")
35874
35968
  },
35875
35969
  output: {
35876
35970
  ok: import_zod36.z.boolean().describe("True when provisioning succeeded; false on auth/scope error."),
35877
35971
  identity: import_zod36.z.string().optional().describe("Identity the vaults were provisioned for."),
35878
- created: import_zod36.z.array(import_zod36.z.string()).optional().describe("Vault names newly created on this call (empty when all 13 already existed)."),
35879
- vaults: import_zod36.z.array(import_zod36.z.string()).optional().describe("All 13 default vault names the identity now owns."),
35972
+ created: import_zod36.z.array(import_zod36.z.string()).optional().describe("Vault names newly created on this call (empty when all 14 already existed)."),
35973
+ vaults: import_zod36.z.array(import_zod36.z.string()).optional().describe("All 14 default vault names the identity now owns."),
35880
35974
  keyId: import_zod36.z.string().optional().describe("Stable id of the issued key. Present only when issueKey was true."),
35881
35975
  secret: import_zod36.z.string().optional().describe("The issued key secret \u2014 RETURNED ONCE. Present only when issueKey was true."),
35882
35976
  plan: import_zod36.z.string().optional().describe("Plan assigned to the issued key. Present only when issueKey was true."),
@@ -35913,9 +36007,9 @@ var init_memory_tool_schemas = __esm({
35913
36007
  VideoAnalyzeStartSchema = {
35914
36008
  id: "video-analyze-start",
35915
36009
  upstreamName: "videoAnalyzeStartTool",
35916
- 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.",
36010
+ 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.",
35917
36011
  input: {
35918
- sourceUrl: import_zod36.z.string().url().describe("Direct URL to the video file (.mp4/.webm/.mov/.gif)."),
36012
+ sourceUrl: import_zod36.z.string().url().describe("A YouTube, Facebook, Instagram, TikTok, or Vimeo URL (downloaded automatically), or a direct video file URL (.mp4/.webm/.mov/.gif)."),
35919
36013
  intervalS: import_zod36.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."),
35920
36014
  maxFrames: import_zod36.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."),
35921
36015
  detail: import_zod36.z.enum(["fast", "standard", "deep"]).optional().describe("Analysis depth. Default standard."),
@@ -36052,6 +36146,7 @@ var init_memory_tool_schemas = __esm({
36052
36146
  GraphPathSchema,
36053
36147
  GraphUniverseSchema,
36054
36148
  LibraryIngestSchema,
36149
+ BulkDeleteNotesSchema,
36055
36150
  DeleteNoteSchema,
36056
36151
  ExportSchema,
36057
36152
  GetSchema,
@@ -36070,6 +36165,7 @@ var init_memory_tool_schemas = __esm({
36070
36165
  ProposeScheduledActionSchema,
36071
36166
  ResumeScheduledActionSchema,
36072
36167
  RevokeScheduleLinkSchema,
36168
+ SetScheduleDefaultsSchema,
36073
36169
  SetScheduleEntitlementSchema,
36074
36170
  CostUsageSchema,
36075
36171
  StorageUsageSchema,