mcp-scraper 0.80.0 → 0.83.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 (31) hide show
  1. package/CHANGELOG.md +59 -1
  2. package/README.md +4 -2
  3. package/dist/{analytics-repository-YOY5KMOD.js → analytics-repository-GA6P5S5J.js} +1 -1
  4. package/dist/bin/api-server.js +3 -3
  5. package/dist/bin/mcp-scraper-cli.js +61 -46
  6. package/dist/bin/mcp-scraper-core.js +7 -7
  7. package/dist/bin/mcp-scraper-install.js +2 -2
  8. package/dist/bin/mcp-stdio-server.js +7 -7
  9. package/dist/bin/paa-harvest.js +2 -2
  10. package/dist/{chunk-PMONKQGJ.js → chunk-4NZ6JFK5.js} +2 -2
  11. package/dist/{chunk-VEQPA65D.js → chunk-ACDNW7TG.js} +1 -1
  12. package/dist/{chunk-ID7J23WP.js → chunk-AIVNZZO3.js} +4 -3
  13. package/dist/{chunk-VXLU74YZ.js → chunk-BGD7U3AE.js} +207 -1
  14. package/dist/{chunk-HEUMDX4I.js → chunk-CNAJWRJT.js} +131 -1
  15. package/dist/{chunk-YPOOARYN.js → chunk-FUG2IRKP.js} +1 -1
  16. package/dist/{chunk-XBEUZJHS.js → chunk-HGJJQY24.js} +49 -5
  17. package/dist/{chunk-KNGTQD6U.js → chunk-NH4QAH3X.js} +3 -1
  18. package/dist/{chunk-5UAFBKJR.js → chunk-OPQIGAFB.js} +24 -5
  19. package/dist/{chunk-OY25W46Q.js → chunk-QSZXAA5F.js} +3121 -2222
  20. package/dist/{chunk-P4447RNF.js → chunk-UXVT7FWW.js} +2 -2
  21. package/dist/{chunk-62W6UER7.js → chunk-ZHPGPVJJ.js} +2 -2
  22. package/dist/{extract-bundle-232SA7MI.js → extract-bundle-HTWWJD6N.js} +2 -2
  23. package/dist/{gmail-service-IMUHMRH4.js → gmail-service-VXE7OYNA.js} +3 -3
  24. package/dist/index.cjs +23 -5
  25. package/dist/index.js +2 -2
  26. package/dist/{server-XBRLYGTR.js → server-ICMRDYI4.js} +4789 -2842
  27. package/dist/{site-extract-repository-VDONDDMR.js → site-extract-repository-Y5WQFSQW.js} +6 -2
  28. package/dist/{worker-ICCZR443.js → worker-FM3ZRDY4.js} +3 -3
  29. package/package.json +6 -2
  30. package/public/.well-known/xray-install.json +178 -0
  31. package/public/agent-install.md +194 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,61 @@ All notable changes to MCP Scraper are documented here. The format is based on [
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.83.0] - 2026-09-01
8
+
9
+ ### Added
10
+
11
+ - Added a digest-bound X-Ray runtime manifest that remotely publishes versioned event rules through the globally installed Pixel, reports bounded selector health, observes SPA and dynamic DOM changes, and preserves consent and privacy boundaries without requiring site-source access.
12
+ - Added pre-registered X-Ray experiments with deterministic assignment, separate exact-revision approval, canary and production states, five allowlisted presentation operations, exposure evidence, fixed-horizon evaluation, sample-ratio checks, and pause/kill rollback controls.
13
+ - Added `analytics_create_experiment`, `analytics_set_experiment_state`, and `analytics_get_experiment`, expanding the governed unified MCP catalog to 363 tools.
14
+
15
+ ### Changed
16
+
17
+ - Replaced X-Ray's repository, branch, writer, patch, and draft-PR setup model with one-time global tag verification followed by X-Ray-owned measurement-manifest publication. GitHub remains an optional general integration and is no longer part of X-Ray setup.
18
+ - Advanced the canonical X-Ray install protocol to 2.0.0 and aligned its MCP Resource, Prompt, npm CLI, public Markdown, well-known JSON, REST contract, and dashboard projections around the tag-only control plane.
19
+
20
+ ### Migration
21
+
22
+ - Advance the analytics schema to `2026-09-01.1` before enabling runtime manifests or experiments. Existing active event definitions remain compatible and measurement publication does not activate a visitor experiment.
23
+
24
+ ## [0.82.0] - 2026-08-31
25
+
26
+ ### Added
27
+
28
+ - Added `analytics_setup_site` with explicit prepare, apply, and verify operations, durable owner-bound revisions and receipts, whole-site Pixel and CTA discovery, eight-dimensional readiness, and truthful first-customer answers at zero MCP Scraper Credit charge under an active X-Ray entitlement.
29
+ - Added a versioned agent-install protocol across public Markdown/JSON, npm CLI output, an MCP Resource, an owner-isolated setup ResourceTemplate, and the `setup_xray_site` Prompt for Codex, Claude, Cursor, Windsurf, and Cline.
30
+ - Added a trusted internal `xray_entitlement` extraction billing class that persists zero-charge jobs without wallet holds, debit keys, or ledger settlement.
31
+
32
+ ### Changed
33
+
34
+ - Expanded the unified MCP catalog from 356 to 360 tools with operation-specific setup contracts, generated REST parity, private discovery caching where supported, and a measured reviewed catalog budget.
35
+ - Added privacy-safe semantic CTA metadata for placement, component, action, destination, and plan while excluding labels, form values, URLs and query strings, email addresses, phone-like values, and arbitrary datasets.
36
+
37
+ ### Fixed
38
+
39
+ - Installed exactly one first-party Pixel across both the Next.js marketing application and all eight static/API blog documents, and added reusable semantic CTA tagging to shared marketing components.
40
+ - Removed the duplicate initial PageView caused by pre-granted consent while retaining one PageView for each actual SPA navigation or blocked-to-granted consent transition.
41
+
42
+ ## [0.81.0] - 2026-08-31
43
+
44
+ ### Added
45
+
46
+ - Added a Kernel-only Reddit workflow that searches DuckDuckGo with a `site:reddit.com` query, switches the same browser to a residential proxy before clicking the selected result, and reads modern Reddit posts plus bounded rendered-comment expansion through dedicated search, thread, and combined REST endpoints.
47
+ - Added a bounded managed-browser backup for Reddit thread hydration after the primary Kernel attempt fails or returns fewer than the semantic target, capped at 25 comments with measured bandwidth, duration, CAPTCHA, closure, and provider-cost telemetry.
48
+
49
+ ### Changed
50
+
51
+ - Routed the production `reddit_thread` and `reddit_trending` MCP tools through modern Reddit on Kernel residential sessions, with DuckDuckGo site search for trend discovery; removed Google and old Reddit from their active execution path while preserving tool names, billing rates, bounded partial results, and refunds.
52
+ - Cost probes now include Reddit Kernel sessions and any managed-browser fallback bytes and cost in the same request receipt, and identify when the backup contributed to total cost.
53
+
54
+ ### Fixed
55
+
56
+ - Reconciled delayed managed-browser fallback telemetry back into its linked cost probe, correcting stored vendor totals and both margin estimates after provider finalization; cost probes now label unresolved provider cost as pending instead of reporting a false zero.
57
+ - Measured the package-entrypoint size guard against files selected by the package publish allowlist while continuing to reject source maps anywhere in the built distribution.
58
+ - Account publishing lists accept hosted routing metadata while retaining strict pagination, filtering, and account isolation.
59
+ - Added a private, paginated publishing inventory for each account’s wiki contributions, publication subdomains and editions, and Local Sourcebook listings, with canonical links and current publication status.
60
+ - Validated Twilio and HubSpot X-Ray webhook signatures against the exact public callback URL instead of an internal deployment origin or Vercel rewrite query, allowing genuine provider events to become live evidence after reverse-proxy delivery.
61
+
7
62
  ## [0.80.0] - 2026-08-29
8
63
 
9
64
  ### Added
@@ -1524,7 +1579,10 @@ All notable changes to MCP Scraper are documented here. The format is based on [
1524
1579
  - Write actions remain unavailable until the account owner explicitly enables them.
1525
1580
  - Provider-specific connection data is normalized into one agent-facing contract.
1526
1581
 
1527
- [Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.80.0...HEAD
1582
+ [Unreleased]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.81.0...HEAD
1583
+ [0.83.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.82.0...v0.83.0
1584
+ [0.82.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.81.0...v0.82.0
1585
+ [0.81.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.80.0...v0.81.0
1528
1586
  [0.80.0]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.79.4...v0.80.0
1529
1587
  [0.79.4]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.79.3...v0.79.4
1530
1588
  [0.79.3]: https://github.com/VilovietaSEO/mcp-scraper/compare/v0.79.2...v0.79.3
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  MCP Scraper is an MCP server for live web intelligence tools backed by `https://mcpscraper.dev`.
4
4
 
5
+ The authenticated [Kernel Reddit API](docs/kernel-reddit.md) provides an ordered DuckDuckGo search, runtime residential-proxy handoff, real result click, and modern Reddit reader at `/kernel-reddit`.
6
+
5
7
  ## Product repository
6
8
 
7
9
  This repository owns the complete private product runtime while preserving independent service and
@@ -173,7 +175,7 @@ Build the branded one-click bundle:
173
175
  npm run build:mcpb
174
176
  ```
175
177
 
176
- 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.80.0`, SHA-256 `5511ae3c549f79fad7c026d15c39e9f4e80c61597a792c8e70786ceab1266a85`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, API-key configuration field, and manually curated current-release message from the bundle manifest.
178
+ 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.83.0`, SHA-256 `5f4fb86ff0dd4b7ae2b757037334b815e491cff6bd678e2d57b9240a3d9dde36`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, API-key configuration field, and manually curated current-release message from the bundle manifest.
177
179
 
178
180
  The MCPB install exposes every tool — web-intelligence plus all `browser_*` tools — through the one `mcp-scraper` server.
179
181
 
@@ -335,7 +337,7 @@ The `mcp-scraper` server (and the MCPB bundle, which runs it) exposes both secti
335
337
 
336
338
  All MCP tools 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, plus readable text content for compatibility. Runtime `tools/list` omits output schemas so strict clients can register the complete catalog; the generated developer manifest retains every canonical output schema for validation and typed SDK generation. All tools carry MCP annotations; file-writing tools such as replay downloads and annotations state their filesystem side effects.
337
339
 
338
- The canonical tool inventory is generated at `docs/mcp-tool-manifest.generated.json`. The unified server exposes 356 tools: 255 scraper, browser, workflow, billing, connected-service, and personal-assistant tools plus 101 durable-memory tools. The scraper-side inventory includes complete Gmail selection, message, attachment, export, bulk-action, and Memory-import workflows; governed personal-assistant commands, messaging, approvals, grants, number setup, and execution readback; durable PAA starts and status; rendered site-content similarity; governed Local Sourcebook and Transparent Commons workflows; direct site-export reads; Editorial Reading Room and News Publisher templates; and production X-Ray analytics, attribution, CRM policy and receipt, campaign, export, and scheduled-report tools. Successful evidence-compiled Local Sourcebook revisions publish automatically to their canonical `localsourcebook.com` category profile and review URLs; administrator controls handle exceptional rejection or unpublishing. Release verification compares the exact local and hosted tool-name sets, not only the count.
340
+ The canonical tool inventory is generated at `docs/mcp-tool-manifest.generated.json`. The unified server exposes 363 tools: 262 scraper, browser, workflow, billing, connected-service, and personal-assistant tools plus 101 durable-memory tools. The scraper-side inventory includes complete Gmail selection, message, attachment, export, bulk-action, and Memory-import workflows; governed personal-assistant commands, messaging, approvals, grants, number setup, and execution readback; durable PAA starts and status; rendered site-content similarity; governed Local Sourcebook and Transparent Commons workflows; direct site-export reads; Editorial Reading Room and News Publisher templates; and production X-Ray setup, analytics, attribution, CRM policy and receipt, campaign, export, and scheduled-report tools. Successful evidence-compiled Local Sourcebook revisions publish automatically to their canonical `localsourcebook.com` category profile and review URLs; administrator controls handle exceptional rejection or unpublishing. Release verification compares the exact local and hosted tool-name sets, not only the count.
339
341
 
340
342
  For contract parity, stdio and MCPB memory calls invoke the matching public tool on the hosted MCP Scraper `/mcp` endpoint. The hosted aggregate runtime owns MCP Scraper-specific billing, scheduling, credential, and in-process cutover policy; its internal `/memory/mcp-call` bridge is a fallback to the standalone memory service, not the public stdio execution path. Direct `mcp-memory` OAuth and stdio clients continue to use `memory.mcpscraper.dev` and must be verified as a separate dependent release surface.
341
343
 
@@ -85,7 +85,7 @@ import {
85
85
  updateAnalyticsPixel,
86
86
  upsertAnalyticsAdSpend,
87
87
  upsertAnalyticsHostGroup
88
- } from "./chunk-HEUMDX4I.js";
88
+ } from "./chunk-CNAJWRJT.js";
89
89
  import "./chunk-C5Z4OFKW.js";
90
90
  import "./chunk-YXNDOQXN.js";
91
91
  export {
@@ -17,8 +17,8 @@ loadDotEnv();
17
17
  async function main() {
18
18
  const [{ serve }, { app, personalAssistantProductionStartup }, { startWorker }, { migrate }] = await Promise.all([
19
19
  import("@hono/node-server"),
20
- import("../server-XBRLYGTR.js"),
21
- import("../worker-ICCZR443.js"),
20
+ import("../server-ICMRDYI4.js"),
21
+ import("../worker-FM3ZRDY4.js"),
22
22
  import("../db-Z34LPZNR.js")
23
23
  ]);
24
24
  const PORT = parseInt(process.env.PORT ?? "3001");
@@ -26,7 +26,7 @@ async function main() {
26
26
  await personalAssistantProductionStartup;
27
27
  await migrate();
28
28
  if (process.env.ANALYTICS_DATABASE_URL) {
29
- const { migrateAnalytics } = await import("../analytics-repository-YOY5KMOD.js");
29
+ const { migrateAnalytics } = await import("../analytics-repository-GA6P5S5J.js");
30
30
  await migrateAnalytics();
31
31
  }
32
32
  startWorker();
@@ -6,14 +6,20 @@ import {
6
6
  openWorkflowReport,
7
7
  runWorkflow,
8
8
  workflowOutputBaseDir
9
- } from "../chunk-VEQPA65D.js";
9
+ } from "../chunk-ACDNW7TG.js";
10
10
  import "../chunk-RJ7JVYKU.js";
11
11
  import "../chunk-OWF2JJKN.js";
12
- import "../chunk-VXLU74YZ.js";
12
+ import {
13
+ XRAY_INSTALL_CONTRACT,
14
+ XRAY_INSTALL_PROTOCOL_DIGEST,
15
+ XRAY_INSTALL_PROTOCOL_VERSION,
16
+ renderXraySetupPrompt,
17
+ xrayHostRecipe
18
+ } from "../chunk-BGD7U3AE.js";
13
19
  import "../chunk-GGZEC22A.js";
14
20
  import {
15
21
  PACKAGE_VERSION
16
- } from "../chunk-YPOOARYN.js";
22
+ } from "../chunk-FUG2IRKP.js";
17
23
 
18
24
  // src/cli/human-cli.ts
19
25
  import { Command } from "commander";
@@ -38,26 +44,6 @@ function envConfig(options) {
38
44
  if (options.browserProfileSaveChanges === true) env.BROWSER_AGENT_PROFILE_SAVE_CHANGES = "true";
39
45
  return env;
40
46
  }
41
- function tomlInlineTable(value) {
42
- const entries = Object.entries(value).map(([key, item]) => `${key} = ${JSON.stringify(item)}`);
43
- return `{ ${entries.join(", ")} }`;
44
- }
45
- function renderCodexConfig(options = {}) {
46
- return [
47
- "[mcp_servers.mcp-scraper]",
48
- 'command = "npx"',
49
- `args = ${JSON.stringify(combinedNpxArgs(options))}`,
50
- `env = ${tomlInlineTable(envConfig(options))}`
51
- ].join("\n");
52
- }
53
- function renderClaudeCommand(options = {}) {
54
- const env = Object.entries(envConfig(options)).map(([key, value]) => ` --env ${key}=${value}`);
55
- return [
56
- "claude mcp add mcp-scraper --scope user",
57
- ...env,
58
- ` -- npx ${combinedNpxArgs(options).join(" ")}`
59
- ].join(" \\\n");
60
- }
61
47
  function claudeMcpRemoveArgs() {
62
48
  return ["mcp", "remove", "mcp-scraper", "-s", "user"];
63
49
  }
@@ -101,28 +87,26 @@ function claudeMcpAddArgs(options = {}) {
101
87
  }
102
88
  function normalizeAgentHost(host) {
103
89
  if (host === "claude-code") return "claude";
104
- if (host === "claude" || host === "codex" || host === "claude-desktop") return host;
105
- throw new Error('Unknown host "' + host + '". Use: codex, claude, claude-code, or claude-desktop');
90
+ if (host === "claude" || XRAY_INSTALL_CONTRACT.hosts.some((candidate) => candidate.id === host)) return host;
91
+ throw new Error('Unknown host "' + host + '". Use: codex, claude, claude-code, claude-desktop, cursor, windsurf, cline, or user-action-only');
106
92
  }
107
- function renderClaudeDesktopConfig(options = {}) {
108
- return JSON.stringify({
109
- mcpServers: {
110
- "mcp-scraper": {
111
- command: "npx",
112
- args: combinedNpxArgs(options),
113
- env: envConfig(options)
114
- }
115
- }
116
- }, null, 2);
93
+ function agentHostCapability(host) {
94
+ return xrayHostRecipe(host === "claude" ? "claude-code" : host);
117
95
  }
118
- function renderAgentInstall(host, options = {}) {
96
+ function renderAgentInstall(host, _options = {}) {
119
97
  const normalizedHost = normalizeAgentHost(host);
98
+ const recipe = agentHostCapability(normalizedHost);
120
99
  const restart = "Restart the MCP client so it starts a fresh npx process.";
121
- const applyCommand = `MCP_SCRAPER_API_KEY=${apiKeyValue(options)} npx -y -p mcp-scraper@latest mcp-scraper-cli agent install claude --apply`;
100
+ const applyCommand = 'MCP_SCRAPER_API_KEY="$MCP_SCRAPER_API_KEY" npx -y -p mcp-scraper@latest mcp-scraper-cli agent install claude --apply';
101
+ const protocol = `X-Ray install protocol: ${XRAY_INSTALL_PROTOCOL_VERSION} (${XRAY_INSTALL_PROTOCOL_DIGEST})`;
122
102
  if (normalizedHost === "codex") {
123
103
  return [
124
104
  "# Codex MCP config",
125
- renderCodexConfig(options),
105
+ protocol,
106
+ recipe.exactConfig,
107
+ "",
108
+ `Continuation: ${recipe.continuation}`,
109
+ `Rollback: ${recipe.rollback}`,
126
110
  "",
127
111
  restart
128
112
  ].join("\n");
@@ -130,20 +114,38 @@ function renderAgentInstall(host, options = {}) {
130
114
  if (normalizedHost === "claude") {
131
115
  return [
132
116
  "# Claude Code command",
133
- renderClaudeCommand(options),
117
+ protocol,
118
+ recipe.exactConfig,
134
119
  "",
135
120
  "# One-command Claude Code setup",
136
121
  applyCommand,
137
122
  "",
123
+ `Continuation: ${recipe.continuation}`,
124
+ `Rollback: ${recipe.rollback}`,
125
+ "",
126
+ restart
127
+ ].join("\n");
128
+ }
129
+ if (normalizedHost === "claude-desktop") {
130
+ return [
131
+ "# Claude Desktop config",
132
+ protocol,
133
+ recipe.exactConfig,
134
+ "",
135
+ "Desktop Extension: https://mcpscraper.dev/downloads/mcp-scraper.mcpb",
136
+ `Continuation: ${recipe.continuation}`,
137
+ `Rollback: ${recipe.rollback}`,
138
138
  restart
139
139
  ].join("\n");
140
140
  }
141
141
  return [
142
- "# Claude Desktop config",
143
- renderClaudeDesktopConfig(options),
142
+ `# ${recipe.label} MCP config`,
143
+ protocol,
144
+ recipe.exactConfig,
144
145
  "",
145
- "Desktop Extension: https://mcpscraper.dev/downloads/mcp-scraper.mcpb",
146
- restart
146
+ `Continuation: ${recipe.continuation}`,
147
+ `Rollback: ${recipe.rollback}`,
148
+ ...recipe.restartRequired ? ["", restart] : []
147
149
  ].join("\n");
148
150
  }
149
151
 
@@ -288,6 +290,7 @@ function renderDoctor(output) {
288
290
 
289
291
  // src/cli/prompts.ts
290
292
  var AGENT_PROMPTS = {
293
+ "xray-setup": renderXraySetupPrompt(),
291
294
  "agent-packet": [
292
295
  "# MCP Scraper Agent Packet Prompt",
293
296
  "",
@@ -561,7 +564,7 @@ function buildHumanCli() {
561
564
  ].join("\n"), false);
562
565
  });
563
566
  const agent = program.command("agent").description("Generate AI-agent install configs and workflow prompts.");
564
- agent.command("install <host>").description("Print or apply install/config instructions for codex, claude/claude-code, or claude-desktop.").option("--api-key <key>", "API key to place in generated config").option("--package <spec>", "npm package spec", "mcp-scraper@latest").option("--browser-profile <name>", "Default saved browser profile for browser_open sessions.").option("--save-browser-profile-changes", "Persist cookies and browser storage back to the named browser profile when sessions close").option("--apply", "Apply the config to this client when supported. For Claude Code, this upserts the user-scope mcp-scraper server.").option("--json", "Print machine-readable JSON").action(async (hostInput, opts) => {
567
+ agent.command("install <host>").description("Print or apply install/config instructions for Codex, Claude, Cursor, Windsurf, Cline, or a handoff-only MCP host.").option("--api-key <key>", "API key to place in generated config").option("--package <spec>", "npm package spec", "mcp-scraper@latest").option("--browser-profile <name>", "Default saved browser profile for browser_open sessions.").option("--save-browser-profile-changes", "Persist cookies and browser storage back to the named browser profile when sessions close").option("--apply", "Apply the config to this client when supported. For Claude Code, this upserts the user-scope mcp-scraper server.").option("--json", "Print machine-readable JSON").action(async (hostInput, opts) => {
565
568
  const host = normalizeAgentHost(hostInput);
566
569
  const apiKey = opts.apiKey ?? process.env.MCP_SCRAPER_API_KEY;
567
570
  if (opts.apply) {
@@ -631,7 +634,12 @@ ${result.list}` : ""
631
634
  browserProfileName: opts.browserProfile,
632
635
  browserProfileSaveChanges: opts.saveBrowserProfileChanges
633
636
  });
634
- writeOutput(opts.json ? { host, text } : text, opts.json);
637
+ writeOutput(opts.json ? {
638
+ host,
639
+ protocolVersion: XRAY_INSTALL_PROTOCOL_VERSION,
640
+ protocolDigest: XRAY_INSTALL_PROTOCOL_DIGEST,
641
+ text
642
+ } : text, opts.json);
635
643
  });
636
644
  agent.command("prompt [name]").description("Print an agent prompt template.").option("--json", "Print machine-readable JSON").action((name, opts) => {
637
645
  if (!name) {
@@ -639,7 +647,14 @@ ${result.list}` : ""
639
647
  return;
640
648
  }
641
649
  const text = renderPrompt(name);
642
- writeOutput(opts.json ? { name, text } : text, opts.json);
650
+ writeOutput(opts.json ? {
651
+ name,
652
+ ...name === "xray-setup" ? {
653
+ protocolVersion: XRAY_INSTALL_PROTOCOL_VERSION,
654
+ protocolDigest: XRAY_INSTALL_PROTOCOL_DIGEST
655
+ } : {},
656
+ text
657
+ } : text, opts.json);
643
658
  });
644
659
  const workflow = program.command("workflow").description("Run named SEO workflows.");
645
660
  workflow.command("list").description("List available workflows.").option("--json", "Print machine-readable JSON").action((opts) => {
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runMcpScraperStdio
4
- } from "../chunk-ID7J23WP.js";
5
- import "../chunk-OY25W46Q.js";
4
+ } from "../chunk-AIVNZZO3.js";
5
+ import "../chunk-QSZXAA5F.js";
6
6
  import "../chunk-PGJQDMC2.js";
7
7
  import "../chunk-DNM65UCK.js";
8
8
  import "../chunk-T3MZISOF.js";
9
9
  import "../chunk-6HAV7LCE.js";
10
- import "../chunk-PMONKQGJ.js";
10
+ import "../chunk-4NZ6JFK5.js";
11
11
  import "../chunk-OM7HVEJ3.js";
12
- import "../chunk-5UAFBKJR.js";
13
- import "../chunk-P4447RNF.js";
14
- import "../chunk-VXLU74YZ.js";
12
+ import "../chunk-OPQIGAFB.js";
13
+ import "../chunk-UXVT7FWW.js";
14
+ import "../chunk-BGD7U3AE.js";
15
15
  import "../chunk-GGZEC22A.js";
16
- import "../chunk-YPOOARYN.js";
16
+ import "../chunk-FUG2IRKP.js";
17
17
  import "../chunk-YXNDOQXN.js";
18
18
 
19
19
  // src/mcp/thorbit-restricted-tool-surface.ts
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  renderInstallTerminal
4
- } from "../chunk-P4447RNF.js";
4
+ } from "../chunk-UXVT7FWW.js";
5
5
  import {
6
6
  PACKAGE_VERSION
7
- } from "../chunk-YPOOARYN.js";
7
+ } from "../chunk-FUG2IRKP.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;
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runMcpScraperStdio
4
- } from "../chunk-ID7J23WP.js";
5
- import "../chunk-OY25W46Q.js";
4
+ } from "../chunk-AIVNZZO3.js";
5
+ import "../chunk-QSZXAA5F.js";
6
6
  import "../chunk-PGJQDMC2.js";
7
7
  import "../chunk-DNM65UCK.js";
8
8
  import "../chunk-T3MZISOF.js";
9
9
  import "../chunk-6HAV7LCE.js";
10
- import "../chunk-PMONKQGJ.js";
10
+ import "../chunk-4NZ6JFK5.js";
11
11
  import "../chunk-OM7HVEJ3.js";
12
- import "../chunk-5UAFBKJR.js";
13
- import "../chunk-P4447RNF.js";
14
- import "../chunk-VXLU74YZ.js";
12
+ import "../chunk-OPQIGAFB.js";
13
+ import "../chunk-UXVT7FWW.js";
14
+ import "../chunk-BGD7U3AE.js";
15
15
  import "../chunk-GGZEC22A.js";
16
- import "../chunk-YPOOARYN.js";
16
+ import "../chunk-FUG2IRKP.js";
17
17
  import "../chunk-YXNDOQXN.js";
18
18
 
19
19
  // bin/mcp-stdio-server.ts
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  harvest
4
- } from "../chunk-KNGTQD6U.js";
4
+ } from "../chunk-NH4QAH3X.js";
5
5
  import {
6
6
  browserServiceApiKey
7
7
  } from "../chunk-OM7HVEJ3.js";
8
- import "../chunk-5UAFBKJR.js";
8
+ import "../chunk-OPQIGAFB.js";
9
9
  import "../chunk-OWF2JJKN.js";
10
10
  import "../chunk-YXNDOQXN.js";
11
11
 
@@ -213,8 +213,8 @@ var PUBLIC_PRODUCT_CONTRACT = {
213
213
  "freeSignupCredits": 0
214
214
  },
215
215
  "inventory": {
216
- "totalTools": 356,
217
- "scraperTools": 255,
216
+ "totalTools": 363,
217
+ "scraperTools": 262,
218
218
  "memoryTools": 101
219
219
  },
220
220
  "concurrencyPack": {
@@ -11,7 +11,7 @@ import {
11
11
  extractContactEvidence,
12
12
  extractSerpEmailEvidence,
13
13
  selectPrimaryEmail
14
- } from "./chunk-VXLU74YZ.js";
14
+ } from "./chunk-BGD7U3AE.js";
15
15
 
16
16
  // src/lib/slugify.ts
17
17
  function slugify(s) {
@@ -12,13 +12,13 @@ import {
12
12
  registerScheduledResultsMcpTools,
13
13
  registerSerpIntelligenceCaptureTools,
14
14
  resolveDeploymentProfile
15
- } from "./chunk-OY25W46Q.js";
15
+ } from "./chunk-QSZXAA5F.js";
16
16
  import {
17
17
  renderInstallTerminal
18
- } from "./chunk-P4447RNF.js";
18
+ } from "./chunk-UXVT7FWW.js";
19
19
  import {
20
20
  PACKAGE_VERSION
21
- } from "./chunk-YPOOARYN.js";
21
+ } from "./chunk-FUG2IRKP.js";
22
22
 
23
23
  // src/mcp/stdio-runtime.ts
24
24
  import { readFileSync } from "fs";
@@ -156,6 +156,7 @@ function buildStdioServer(requiredApiKey, options = {}) {
156
156
  cacheHints: {
157
157
  "server/discover": { ttlMs: 3e5, cacheScope: "private" },
158
158
  "tools/list": { ttlMs: 3e5, cacheScope: "private" },
159
+ "prompts/list": { ttlMs: 3e5, cacheScope: "private" },
159
160
  "resources/list": { ttlMs: 3e5, cacheScope: "private" },
160
161
  "resources/templates/list": { ttlMs: 3e5, cacheScope: "private" },
161
162
  "resources/read": { ttlMs: 6e4, cacheScope: "private" }