mcp-scraper 0.51.1 → 0.51.2

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
@@ -90,7 +90,7 @@ Build the branded one-click bundle:
90
90
  npm run build:mcpb
91
91
  ```
92
92
 
93
- 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.51.1`, SHA-256 `c460ad09a5fbe65088078feeede7c7f49a3af83b3ed6b5228be4f618e0479425`). 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.
93
+ 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.51.2`, SHA-256 `7fe018b71b68a98ad84451e2bf007c08a74a284545feaa2f1876be65b8b51ca6`). 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.
94
94
 
95
95
  The MCPB install exposes every tool — web-intelligence plus all `browser_*` tools — through the one `mcp-scraper` server.
96
96
 
@@ -210,7 +210,7 @@ Google Search Console exposes eight bounded reads and eight gated property and s
210
210
 
211
211
  - Start unknown-location recall with `memory-search`. It uses Hybrid Smart RAG and returns ranked excerpts, not complete notes.
212
212
  - Read strong candidates with `memory-get` before relying on, summarizing, linking, or editing them.
213
- - Use `memory-list` for an exhaustive vault inventory. It returns every note's metadata plus a sorted list of every represented folder and nested folder.
213
+ - Use `memory-list` for an exhaustive inventory. Pass `allVaults:true` for every note and folder across the whole entitled Memory account; omit it for one logical vault. Account-wide results include aggregate totals and complete per-vault note/folder groups, so a default-vault count is never mistaken for the account total.
214
214
  - Use `list-memory-tags` for the complete account-wide canonical tag vocabulary, aliases, usage counts, and per-vault distribution.
215
215
  - `memory-put` replaces the complete note body. For edits, read the note, merge the requested change into the full body, write with `baseRevision`, then read back and verify it.
216
216
 
@@ -41595,7 +41595,7 @@ var PACKAGE_VERSION;
41595
41595
  var init_version = __esm({
41596
41596
  "src/version.ts"() {
41597
41597
  "use strict";
41598
- PACKAGE_VERSION = "0.51.1";
41598
+ PACKAGE_VERSION = "0.51.2";
41599
41599
  }
41600
41600
  });
41601
41601
 
@@ -41892,12 +41892,15 @@ note, registers canonical tags, writes it, and verifies readback. Reserve low-le
41892
41892
  deliberate edits and migrations. Use
41893
41893
  **table-create**/**table-insert-rows**/**table-query** instead when the caller wants row-shaped data
41894
41894
  they'll filter/sort by exact value. **memory-search** is meaning-based over full content (embeds, slower);
41895
- **memory-list** filters one vault by kind/tags (fast, exact).
41895
+ **memory-list** filters one vault by kind/tags (fast, exact), or lists the whole entitled account when
41896
+ \`allVaults:true\`.
41896
41897
 
41897
- Choose the read surface by completeness, not convenience. **list-vaults** is the account inventory and
41898
- reports each vault's note count. **memory-list** returns the complete metadata inventory for one vault but
41899
- no note bodies, plus a sorted complete folder inventory derived from those paths; use it to identify every
41900
- stable \`vault + path\` address. **list-memory-tags** returns the
41898
+ Choose the read surface by completeness, not convenience. **list-vaults** is the compact account inventory and
41899
+ reports each vault's note count. **memory-list** returns the complete metadata inventory for one vault by
41900
+ default, with no note bodies and a sorted complete folder inventory derived from those paths. When the user
41901
+ asks for every note or folder they have across Memory, call **memory-list** once with \`allVaults:true\`; use
41902
+ its account totals and per-vault groups, and never present the default single-vault count as the account
41903
+ total. Use the result to identify every stable \`vault + path\` address. **list-memory-tags** returns the
41901
41904
  complete account-wide canonical tag inventory, including aliases, usage counts, and per-vault distribution.
41902
41905
  **memory-search** returns ranked
41903
41906
  content chunks, not an exhaustive inventory or complete documents: deduplicate hits by vault/path and call
@@ -49347,7 +49350,7 @@ var init_browser_agent_mcp_server = __esm({
49347
49350
  });
49348
49351
 
49349
49352
  // src/mcp/memory-tool-schemas.ts
49350
- var import_zod47, AcceptShareSchema, ApproveSenderSchema, DeclineShareSchema, GetChatLinkSchema, GetVaultAppLinkSchema, InboxSettingsSchema, InviteAccountSchema, issueKeyTool_scopeShape, IssueKeySchema, ListApprovedSendersSchema, ListKeysSchema, NoteInboxSchema, RemoveApprovedSenderSchema, RevokeChatLinkSchema, RevokeKeySchema, RevokeShareSchema, RevokeVaultAppLinkSchema, 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, ScheduledArtifactSelectionSchema2, CreateScheduledActionSchema, UpdateScheduledActionSchema, DeleteScheduledActionSchema, GetScheduleLinkSchema, GetScheduleStatusSchema, ListScheduledActionsSchema, PauseScheduledActionSchema, ProposeScheduledActionSchema, ResumeScheduledActionSchema, RevokeScheduleLinkSchema, SetScheduleDefaultsSchema, SetScheduleEntitlementSchema, CostUsageSchema, StorageUsageSchema, CreateTableSchema, deleteTableRowsTool_FilterSchema, DeleteTableRowsSchema, DescribeTableSchema, DropTableSchema, InsertTableRowsSchema, ListTablesSchema, queryTableTool_FilterSchema, QueryTableSchema, ListTagsSchema, MergeTagsSchema, ResolveTagsSchema, UpsertTagSchema, AddVaultSchema, CreateSecureVaultSchema, DeleteVaultSchema, GetVaultContractSchema, ListSharedWithMeSchema, ListVaultsSchema, ProvisionDefaultsSchema, RouteMemorySchema, VideoAnalyzeStartSchema, VideoAnalyzeStatusSchema, CreateWebhookSchema, ListWebhooksSchema, RevokeWebhookSchema, MEMORY_TOOL_SCHEMAS;
49353
+ var import_zod47, AcceptShareSchema, ApproveSenderSchema, DeclineShareSchema, GetChatLinkSchema, GetVaultAppLinkSchema, InboxSettingsSchema, InviteAccountSchema, issueKeyTool_scopeShape, IssueKeySchema, ListApprovedSendersSchema, ListKeysSchema, NoteInboxSchema, RemoveApprovedSenderSchema, RevokeChatLinkSchema, RevokeKeySchema, RevokeShareSchema, RevokeVaultAppLinkSchema, 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, listNoteSchema, ListSchema, putTool_notePropsSchema, PutSchema, searchTool_primitiveValue, SearchSchema, SuggestSchema, UploadSchema, TemporalRecallSchema, ScheduledArtifactSelectionSchema2, CreateScheduledActionSchema, UpdateScheduledActionSchema, DeleteScheduledActionSchema, GetScheduleLinkSchema, GetScheduleStatusSchema, ListScheduledActionsSchema, PauseScheduledActionSchema, ProposeScheduledActionSchema, ResumeScheduledActionSchema, RevokeScheduleLinkSchema, SetScheduleDefaultsSchema, SetScheduleEntitlementSchema, CostUsageSchema, StorageUsageSchema, CreateTableSchema, deleteTableRowsTool_FilterSchema, DeleteTableRowsSchema, DescribeTableSchema, DropTableSchema, InsertTableRowsSchema, ListTablesSchema, queryTableTool_FilterSchema, QueryTableSchema, ListTagsSchema, MergeTagsSchema, ResolveTagsSchema, UpsertTagSchema, AddVaultSchema, CreateSecureVaultSchema, DeleteVaultSchema, GetVaultContractSchema, ListSharedWithMeSchema, ListVaultsSchema, ProvisionDefaultsSchema, RouteMemorySchema, VideoAnalyzeStartSchema, VideoAnalyzeStatusSchema, CreateWebhookSchema, ListWebhooksSchema, RevokeWebhookSchema, MEMORY_TOOL_SCHEMAS;
49351
49354
  var init_memory_tool_schemas = __esm({
49352
49355
  "src/mcp/memory-tool-schemas.ts"() {
49353
49356
  "use strict";
@@ -50629,31 +50632,42 @@ var init_memory_tool_schemas = __esm({
50629
50632
  openWorldHint: false
50630
50633
  }
50631
50634
  };
50635
+ listNoteSchema = import_zod47.z.object({
50636
+ path: import_zod47.z.string().describe("Vault-relative note path, e.g. projects/q3-plan."),
50637
+ title: import_zod47.z.string().describe("Human-readable note title."),
50638
+ kind: import_zod47.z.string().describe("Note kind: note, library, capture, or decision."),
50639
+ tags: import_zod47.z.array(import_zod47.z.string()).describe("The note's tags, if any."),
50640
+ updatedAt: import_zod47.z.string().describe("ISO-8601 timestamp of the note last update.")
50641
+ });
50632
50642
  ListSchema = {
50633
50643
  id: "memory-list",
50634
50644
  upstreamName: "listTool",
50635
- description: "Return every note in one vault as a complete metadata inventory \u2014 stable path, title, kind, tags, and last-updated \u2014 plus a sorted list of every unique folder and nested folder represented by those paths. It contains no bodies. Use memory-get for exact full content, memory-search for ranked semantic recall, or memory-export only when explicitly asked for every full note. Defaults to the active or first entitled vault; also returns entitled vaults. Requires read scope.",
50645
+ description: "Return a complete note-and-folder metadata inventory without note bodies. Set allVaults:true when the user asks for every note or folder they have across their whole Memory account; the result is grouped by vault and includes aggregate totals. Otherwise list one exact vault, defaulting to the active or first entitled vault. Never report a single-vault count as the account total. Use memory-get for exact full content, memory-search for ranked semantic recall, or memory-export only when explicitly asked for every full note. Requires read scope.",
50636
50646
  input: {
50637
50647
  vault: import_zod47.z.string().optional().describe(
50638
50648
  "Vault to list. Optional; defaults to the session active vault, then the first vault the caller is entitled to."
50639
50649
  ),
50650
+ allVaults: import_zod47.z.boolean().optional().describe("Set true for one complete account-wide inventory across every entitled vault. Omit or set false for one vault. When true, vault is ignored and reads run sequentially to avoid backend contention."),
50640
50651
  kind: import_zod47.z.enum(["note", "library", "capture", "decision"]).optional().describe("Filter to a single note kind. Optional; omit to list every kind in the vault."),
50641
50652
  tags: import_zod47.z.array(import_zod47.z.string()).optional().describe("Filter to notes tagged with any of these tags (matches the note's tags primitive). Optional; omit to not filter by tag.")
50642
50653
  },
50643
50654
  output: {
50644
50655
  ok: import_zod47.z.boolean().describe("True when the listing succeeded; false on an auth/scope/lookup error."),
50656
+ scope: import_zod47.z.enum(["vault", "account"]).optional().describe("Whether the result covers one logical vault or the whole entitled account."),
50657
+ partial: import_zod47.z.boolean().optional().describe("Account-wide mode only: true if one vault failed and vaultInventories contains only the completed prefix."),
50645
50658
  vault: import_zod47.z.string().optional().describe("The vault that was actually listed (after defaulting)."),
50646
- notes: import_zod47.z.array(
50647
- import_zod47.z.object({
50648
- path: import_zod47.z.string().describe("Vault-relative note path, e.g. projects/q3-plan."),
50649
- title: import_zod47.z.string().describe("Human-readable note title."),
50650
- kind: import_zod47.z.string().describe("Note kind: note, library, capture, or decision."),
50651
- tags: import_zod47.z.array(import_zod47.z.string()).describe("The note's tags, if any."),
50652
- updatedAt: import_zod47.z.string().describe("ISO-8601 timestamp of the note last update.")
50653
- })
50654
- ).optional().describe("The notes in the vault (metadata only, no content). Present when ok is true."),
50659
+ notes: import_zod47.z.array(listNoteSchema).optional().describe("The notes in the vault (metadata only, no content). Present when ok is true."),
50655
50660
  folders: import_zod47.z.array(import_zod47.z.string()).optional().describe("Sorted complete folder inventory derived from note paths, including represented nested parent folders. Present when ok is true."),
50656
50661
  vaults: import_zod47.z.array(import_zod47.z.string()).optional().describe("All vaults the caller is entitled to, for choosing a different vault to list."),
50662
+ totalNotes: import_zod47.z.number().int().nonnegative().optional().describe("Account-wide mode only: total notes across every completed vault inventory."),
50663
+ totalFolders: import_zod47.z.number().int().nonnegative().optional().describe("Account-wide mode only: total represented folder instances across vaults."),
50664
+ vaultInventories: import_zod47.z.array(import_zod47.z.object({
50665
+ vault: import_zod47.z.string().describe("Exact vault handle for every note and folder in this group."),
50666
+ noteCount: import_zod47.z.number().int().nonnegative(),
50667
+ folderCount: import_zod47.z.number().int().nonnegative(),
50668
+ notes: import_zod47.z.array(listNoteSchema).describe("Every note metadata record in this vault."),
50669
+ folders: import_zod47.z.array(import_zod47.z.string()).describe("Every represented folder and nested parent folder in this vault.")
50670
+ })).optional().describe("Account-wide mode only: complete note and folder inventories grouped by vault so paths remain unambiguous."),
50657
50671
  error: import_zod47.z.string().optional().describe("Human-readable failure reason when ok is false.")
50658
50672
  },
50659
50673
  annotations: {
@@ -51924,7 +51938,50 @@ function folderInventory(result) {
51924
51938
  }
51925
51939
  function enrichMemoryResult(toolName, result) {
51926
51940
  if (toolName !== "listTool" || result.ok !== true) return result;
51927
- return { ...result, folders: folderInventory(result) };
51941
+ if (result.scope === "account") return result;
51942
+ return { ...result, scope: "vault", folders: folderInventory(result) };
51943
+ }
51944
+ async function buildAccountMemoryInventory(args, listOne) {
51945
+ const filters = { ...args };
51946
+ delete filters.allVaults;
51947
+ delete filters.vault;
51948
+ const initial = enrichMemoryResult("listTool", await listOne(filters));
51949
+ if (initial.ok !== true) return initial;
51950
+ const vaults = Array.isArray(initial.vaults) ? initial.vaults.filter((vault) => typeof vault === "string") : [];
51951
+ const initialVault = typeof initial.vault === "string" ? initial.vault : null;
51952
+ if (!vaults.length && initialVault) vaults.push(initialVault);
51953
+ const vaultInventories = [];
51954
+ for (const vault of vaults) {
51955
+ const listed = vault === initialVault ? initial : enrichMemoryResult("listTool", await listOne({ ...filters, vault }));
51956
+ if (listed.ok !== true) {
51957
+ return {
51958
+ ok: false,
51959
+ scope: "account",
51960
+ partial: true,
51961
+ vaults,
51962
+ vaultInventories,
51963
+ error: typeof listed.error === "string" ? `Could not list vault ${vault}: ${listed.error}` : `Could not list vault ${vault}`
51964
+ };
51965
+ }
51966
+ const notes = Array.isArray(listed.notes) ? listed.notes : [];
51967
+ const folders = Array.isArray(listed.folders) ? listed.folders : [];
51968
+ vaultInventories.push({
51969
+ vault,
51970
+ noteCount: notes.length,
51971
+ folderCount: folders.length,
51972
+ notes,
51973
+ folders
51974
+ });
51975
+ }
51976
+ return {
51977
+ ok: true,
51978
+ scope: "account",
51979
+ partial: false,
51980
+ vaults,
51981
+ totalNotes: vaultInventories.reduce((sum, inventory) => sum + Number(inventory.noteCount), 0),
51982
+ totalFolders: vaultInventories.reduce((sum, inventory) => sum + Number(inventory.folderCount), 0),
51983
+ vaultInventories
51984
+ };
51928
51985
  }
51929
51986
  var MemoryMcpToolExecutor;
51930
51987
  var init_memory_mcp_tool_executor = __esm({
@@ -51939,22 +51996,25 @@ var init_memory_mcp_tool_executor = __esm({
51939
51996
  }
51940
51997
  async callMemoryTool(toolName, args) {
51941
51998
  try {
51942
- const res = await fetch(`${this.baseUrl}/memory/mcp-call`, {
51943
- method: "POST",
51944
- headers: {
51945
- "content-type": "application/json",
51946
- "x-api-key": this.apiKey
51947
- },
51948
- body: JSON.stringify({ toolName, args })
51949
- });
51950
- const data = await res.json().catch(() => null);
51951
- if (!res.ok) {
51952
- const message = data?.error ?? `memory ${toolName} failed (HTTP ${res.status})`;
51953
- return { content: [{ type: "text", text: message }], isError: true };
51954
- }
51999
+ const callOne = async (input) => {
52000
+ const res = await fetch(`${this.baseUrl}/memory/mcp-call`, {
52001
+ method: "POST",
52002
+ headers: {
52003
+ "content-type": "application/json",
52004
+ "x-api-key": this.apiKey
52005
+ },
52006
+ body: JSON.stringify({ toolName, args: input })
52007
+ });
52008
+ const data2 = await res.json().catch(() => null);
52009
+ if (!res.ok) {
52010
+ throw new Error(data2?.error ?? `memory ${toolName} failed (HTTP ${res.status})`);
52011
+ }
52012
+ return data2 ?? { ok: false, error: `memory ${toolName} returned no result` };
52013
+ };
52014
+ const data = toolName === "listTool" && args.allVaults === true ? await buildAccountMemoryInventory(args, callOne) : await callOne(args);
51955
52015
  const result = enrichMemoryResult(
51956
52016
  toolName,
51957
- data ?? { ok: false, error: `memory ${toolName} returned no result` }
52017
+ data
51958
52018
  );
51959
52019
  return {
51960
52020
  content: [{ type: "text", text: JSON.stringify(result) }],
@@ -52157,10 +52217,8 @@ function registerReadCutovers() {
52157
52217
  return { content: [{ type: "text", text: JSON.stringify(result ?? {}) }], structuredContent: result ?? {}, isError: false };
52158
52218
  });
52159
52219
  registerCutover("listTool", async (input, apiKey) => {
52160
- const result = enrichMemoryResult(
52161
- "listTool",
52162
- await import_list.listTool.execute({ ...input, apiKey }, {}) ?? {}
52163
- );
52220
+ const listOne = async (args) => await import_list.listTool.execute({ ...args, apiKey }, {}) ?? {};
52221
+ const result = input.allVaults === true ? await buildAccountMemoryInventory(input, listOne) : enrichMemoryResult("listTool", await listOne(input));
52164
52222
  return { content: [{ type: "text", text: JSON.stringify(result) }], structuredContent: result, isError: false };
52165
52223
  });
52166
52224
  registerCutover("searchTool", async (input, apiKey) => {