mcp-scraper 0.33.7 → 0.34.1
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 +4 -4
- package/dist/bin/api-server.cjs +7100 -7023
- package/dist/bin/api-server.cjs.map +1 -1
- package/dist/bin/api-server.js +2 -2
- package/dist/bin/mcp-scraper-cli.cjs +2 -1
- package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
- package/dist/bin/mcp-scraper-cli.js +3 -3
- package/dist/bin/mcp-scraper-install.cjs +2 -2
- package/dist/bin/mcp-scraper-install.cjs.map +1 -1
- package/dist/bin/mcp-scraper-install.js +2 -2
- package/dist/bin/mcp-stdio-server.cjs +43 -37
- package/dist/bin/mcp-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-stdio-server.js +6 -6
- package/dist/bin/paa-harvest.cjs +22 -0
- package/dist/bin/paa-harvest.cjs.map +1 -1
- package/dist/bin/paa-harvest.js +3 -3
- package/dist/{chunk-V36LS5YV.js → chunk-4ZB3X6BQ.js} +4 -3
- package/dist/chunk-4ZB3X6BQ.js.map +1 -0
- package/dist/{chunk-SUOHUXQS.js → chunk-5PZ6N2QM.js} +2 -2
- package/dist/{chunk-H6QECE2U.js → chunk-6OPHG76G.js} +30 -27
- package/dist/chunk-6OPHG76G.js.map +1 -0
- package/dist/{chunk-2EDFOQD7.js → chunk-7AYRWAEK.js} +2 -2
- package/dist/{chunk-2EDFOQD7.js.map → chunk-7AYRWAEK.js.map} +1 -1
- package/dist/chunk-7N2KYL4U.js +7 -0
- package/dist/chunk-7N2KYL4U.js.map +1 -0
- package/dist/{chunk-JBSGBSGT.js → chunk-BWXLTWF7.js} +21 -16
- package/dist/chunk-BWXLTWF7.js.map +1 -0
- package/dist/{chunk-V73MPRU6.js → chunk-CB5C3BPB.js} +17 -1
- package/dist/chunk-CB5C3BPB.js.map +1 -0
- package/dist/{chunk-XVCETVYY.js → chunk-XVVNKASZ.js} +12 -4
- package/dist/chunk-XVVNKASZ.js.map +1 -0
- package/dist/{chunk-AT2PFWHW.js → chunk-ZID3WQID.js} +2 -2
- package/dist/index.cjs +22 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -3
- package/dist/{server-B35CQJB3.js → server-IWDHTES2.js} +185 -139
- package/dist/server-IWDHTES2.js.map +1 -0
- package/dist/{site-extract-repository-JHMVHENZ.js → site-extract-repository-OLVWMOU2.js} +3 -3
- package/dist/{worker-3LYNVGLF.js → worker-645BZPEK.js} +5 -5
- package/docs/mcp-tool-craft-lint.generated.md +171 -49
- package/docs/mcp-tool-manifest.generated.json +46 -11
- package/docs/specs/query-fanout-transport-contract-fix.md +37 -0
- package/package.json +1 -1
- package/dist/chunk-H6QECE2U.js.map +0 -1
- package/dist/chunk-HAMN42SP.js +0 -7
- package/dist/chunk-HAMN42SP.js.map +0 -1
- package/dist/chunk-JBSGBSGT.js.map +0 -1
- package/dist/chunk-V36LS5YV.js.map +0 -1
- package/dist/chunk-V73MPRU6.js.map +0 -1
- package/dist/chunk-XVCETVYY.js.map +0 -1
- package/dist/server-B35CQJB3.js.map +0 -1
- /package/dist/{chunk-SUOHUXQS.js.map → chunk-5PZ6N2QM.js.map} +0 -0
- /package/dist/{chunk-AT2PFWHW.js.map → chunk-ZID3WQID.js.map} +0 -0
- /package/dist/{site-extract-repository-JHMVHENZ.js.map → site-extract-repository-OLVWMOU2.js.map} +0 -0
- /package/dist/{worker-3LYNVGLF.js.map → worker-645BZPEK.js.map} +0 -0
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
saveExtractPages,
|
|
11
11
|
setExtractJobTotal,
|
|
12
12
|
settleExtractJob
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-5PZ6N2QM.js";
|
|
14
|
+
import "./chunk-BWXLTWF7.js";
|
|
15
15
|
import "./chunk-M2S27J6Z.js";
|
|
16
16
|
import "./chunk-62DQAWPF.js";
|
|
17
17
|
export {
|
|
@@ -27,4 +27,4 @@ export {
|
|
|
27
27
|
setExtractJobTotal,
|
|
28
28
|
settleExtractJob
|
|
29
29
|
};
|
|
30
|
-
//# sourceMappingURL=site-extract-repository-
|
|
30
|
+
//# sourceMappingURL=site-extract-repository-OLVWMOU2.js.map
|
|
@@ -6,17 +6,17 @@ import {
|
|
|
6
6
|
} from "./chunk-3HBPKR5G.js";
|
|
7
7
|
import {
|
|
8
8
|
harvest
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-XVVNKASZ.js";
|
|
10
10
|
import {
|
|
11
11
|
browserServiceApiKey,
|
|
12
12
|
runWithCostContext
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-4ZB3X6BQ.js";
|
|
14
14
|
import "./chunk-K443GQY5.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-CB5C3BPB.js";
|
|
16
16
|
import {
|
|
17
17
|
MC_COSTS,
|
|
18
18
|
serpActualCostMc
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-BWXLTWF7.js";
|
|
20
20
|
import "./chunk-M2S27J6Z.js";
|
|
21
21
|
import {
|
|
22
22
|
claimPendingJob,
|
|
@@ -139,4 +139,4 @@ export {
|
|
|
139
139
|
startWorker,
|
|
140
140
|
tickOnce
|
|
141
141
|
};
|
|
142
|
-
//# sourceMappingURL=worker-
|
|
142
|
+
//# sourceMappingURL=worker-645BZPEK.js.map
|
|
@@ -1,56 +1,178 @@
|
|
|
1
1
|
# MCP Tool Craft Lint
|
|
2
2
|
|
|
3
|
-
Generated: 2026-
|
|
3
|
+
Generated: 2026-07-26T13:48:25.492Z
|
|
4
|
+
Manifest: `/Users/vilovieta/.codex/worktrees/mcp-scraper-query-fanout-transport-fix/docs/mcp-tool-manifest.generated.json`
|
|
4
5
|
|
|
5
|
-
Tools:
|
|
6
|
-
Checks per tool:
|
|
6
|
+
Tools: 167
|
|
7
|
+
Checks per tool: 7
|
|
7
8
|
Failing tools: 0
|
|
8
9
|
|
|
9
10
|
| Tool | Score | Missing |
|
|
10
11
|
|---|---:|---|
|
|
11
|
-
| `
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
| `
|
|
15
|
-
| `
|
|
16
|
-
| `
|
|
17
|
-
| `
|
|
18
|
-
| `
|
|
19
|
-
| `
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `
|
|
25
|
-
| `
|
|
26
|
-
| `
|
|
27
|
-
| `
|
|
28
|
-
| `
|
|
29
|
-
| `
|
|
30
|
-
| `
|
|
31
|
-
| `
|
|
32
|
-
| `
|
|
33
|
-
| `
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
38
|
-
| `
|
|
39
|
-
| `
|
|
40
|
-
| `
|
|
41
|
-
| `
|
|
42
|
-
| `
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
51
|
-
| `
|
|
52
|
-
| `
|
|
53
|
-
| `
|
|
54
|
-
| `
|
|
55
|
-
| `
|
|
56
|
-
| `
|
|
12
|
+
| `access-accept-share` | 7/7 | none |
|
|
13
|
+
| `access-approve-sender` | 7/7 | none |
|
|
14
|
+
| `access-decline-share` | 7/7 | none |
|
|
15
|
+
| `access-inbox-settings` | 7/7 | none |
|
|
16
|
+
| `access-invite-account` | 7/7 | none |
|
|
17
|
+
| `access-issue-key` | 7/7 | none |
|
|
18
|
+
| `access-list-approved-senders` | 7/7 | none |
|
|
19
|
+
| `access-list-keys` | 7/7 | none |
|
|
20
|
+
| `access-note-inbox` | 7/7 | none |
|
|
21
|
+
| `access-remove-approved-sender` | 7/7 | none |
|
|
22
|
+
| `access-revoke-key` | 7/7 | none |
|
|
23
|
+
| `access-revoke-share` | 7/7 | none |
|
|
24
|
+
| `access-set-scope` | 7/7 | none |
|
|
25
|
+
| `access-share-note` | 7/7 | none |
|
|
26
|
+
| `access-share-vault` | 7/7 | none |
|
|
27
|
+
| `access-swap-vault` | 7/7 | none |
|
|
28
|
+
| `access-switch-account` | 7/7 | none |
|
|
29
|
+
| `access-unlink-share` | 7/7 | none |
|
|
30
|
+
| `add-vault` | 7/7 | none |
|
|
31
|
+
| `audit_site` | 7/7 | none |
|
|
32
|
+
| `browser_click` | 7/7 | none |
|
|
33
|
+
| `browser_close` | 7/7 | none |
|
|
34
|
+
| `browser_extension_delete` | 7/7 | none |
|
|
35
|
+
| `browser_extension_import` | 7/7 | none |
|
|
36
|
+
| `browser_extension_list` | 7/7 | none |
|
|
37
|
+
| `browser_goto` | 7/7 | none |
|
|
38
|
+
| `browser_list_replays` | 7/7 | none |
|
|
39
|
+
| `browser_list_sessions` | 7/7 | none |
|
|
40
|
+
| `browser_locate` | 7/7 | none |
|
|
41
|
+
| `browser_open` | 7/7 | none |
|
|
42
|
+
| `browser_press` | 7/7 | none |
|
|
43
|
+
| `browser_profile_connect` | 7/7 | none |
|
|
44
|
+
| `browser_profile_list` | 7/7 | none |
|
|
45
|
+
| `browser_read` | 7/7 | none |
|
|
46
|
+
| `browser_replay_annotate` | 7/7 | none |
|
|
47
|
+
| `browser_replay_download` | 7/7 | none |
|
|
48
|
+
| `browser_replay_mark` | 7/7 | none |
|
|
49
|
+
| `browser_replay_start` | 7/7 | none |
|
|
50
|
+
| `browser_replay_stop` | 7/7 | none |
|
|
51
|
+
| `browser_screenshot` | 7/7 | none |
|
|
52
|
+
| `browser_scroll` | 7/7 | none |
|
|
53
|
+
| `browser_type` | 7/7 | none |
|
|
54
|
+
| `bulk-delete-notes` | 7/7 | none |
|
|
55
|
+
| `call_service_connection_action` | 7/7 | none |
|
|
56
|
+
| `capture_serp_page_snapshots` | 7/7 | none |
|
|
57
|
+
| `capture_serp_snapshot` | 7/7 | none |
|
|
58
|
+
| `check_site_export` | 7/7 | none |
|
|
59
|
+
| `cost-usage` | 7/7 | none |
|
|
60
|
+
| `create-channel` | 7/7 | none |
|
|
61
|
+
| `create-scheduled-action` | 7/7 | none |
|
|
62
|
+
| `create-secure-vault` | 7/7 | none |
|
|
63
|
+
| `create-webhook` | 7/7 | none |
|
|
64
|
+
| `credits_info` | 7/7 | none |
|
|
65
|
+
| `delete-note` | 7/7 | none |
|
|
66
|
+
| `delete-scheduled-action` | 7/7 | none |
|
|
67
|
+
| `delete-vault` | 7/7 | none |
|
|
68
|
+
| `describe_service_connection_tool` | 7/7 | none |
|
|
69
|
+
| `diff_page` | 7/7 | none |
|
|
70
|
+
| `directory_workflow` | 7/7 | none |
|
|
71
|
+
| `export_connected_service_data` | 7/7 | none |
|
|
72
|
+
| `export_search_console_table_data` | 7/7 | none |
|
|
73
|
+
| `extract_site` | 7/7 | none |
|
|
74
|
+
| `extract_url` | 7/7 | none |
|
|
75
|
+
| `facebook_ad_search` | 7/7 | none |
|
|
76
|
+
| `facebook_ad_transcribe` | 7/7 | none |
|
|
77
|
+
| `facebook_page_intel` | 7/7 | none |
|
|
78
|
+
| `facebook_video_transcribe` | 7/7 | none |
|
|
79
|
+
| `fact-history` | 7/7 | none |
|
|
80
|
+
| `g2_reviews` | 7/7 | none |
|
|
81
|
+
| `get-chat-link` | 7/7 | none |
|
|
82
|
+
| `get-message-note` | 7/7 | none |
|
|
83
|
+
| `get-schedule-link` | 7/7 | none |
|
|
84
|
+
| `get-schedule-status` | 7/7 | none |
|
|
85
|
+
| `get-vault-app-link` | 7/7 | none |
|
|
86
|
+
| `get-vault-contract` | 7/7 | none |
|
|
87
|
+
| `gmail_search_contacts` | 7/7 | none |
|
|
88
|
+
| `gmail_send_message` | 7/7 | none |
|
|
89
|
+
| `google_ads_page_intel` | 7/7 | none |
|
|
90
|
+
| `google_ads_search` | 7/7 | none |
|
|
91
|
+
| `google_ads_transcribe` | 7/7 | none |
|
|
92
|
+
| `google_calendar_create_event` | 7/7 | none |
|
|
93
|
+
| `harvest_paa` | 7/7 | none |
|
|
94
|
+
| `import_service_connection_to_memory` | 7/7 | none |
|
|
95
|
+
| `instagram_media_download` | 7/7 | none |
|
|
96
|
+
| `instagram_profile_content` | 7/7 | none |
|
|
97
|
+
| `library-ingest` | 7/7 | none |
|
|
98
|
+
| `list_service_connections` | 7/7 | none |
|
|
99
|
+
| `list-channel-members` | 7/7 | none |
|
|
100
|
+
| `list-channel-messages` | 7/7 | none |
|
|
101
|
+
| `list-memory-tags` | 7/7 | none |
|
|
102
|
+
| `list-scheduled-actions` | 7/7 | none |
|
|
103
|
+
| `list-shared-with-me` | 7/7 | none |
|
|
104
|
+
| `list-vaults` | 7/7 | none |
|
|
105
|
+
| `list-webhooks` | 7/7 | none |
|
|
106
|
+
| `map_site_urls` | 7/7 | none |
|
|
107
|
+
| `maps_place_intel` | 7/7 | none |
|
|
108
|
+
| `maps_search` | 7/7 | none |
|
|
109
|
+
| `memory-backlinks` | 7/7 | none |
|
|
110
|
+
| `memory-capture` | 7/7 | none |
|
|
111
|
+
| `memory-export` | 7/7 | none |
|
|
112
|
+
| `memory-get` | 7/7 | none |
|
|
113
|
+
| `memory-graph-path` | 7/7 | none |
|
|
114
|
+
| `memory-graph-universe` | 7/7 | none |
|
|
115
|
+
| `memory-list` | 7/7 | none |
|
|
116
|
+
| `memory-put` | 7/7 | none |
|
|
117
|
+
| `memory-questions` | 7/7 | none |
|
|
118
|
+
| `memory-search` | 7/7 | none |
|
|
119
|
+
| `memory-suggest` | 7/7 | none |
|
|
120
|
+
| `memory-upload` | 7/7 | none |
|
|
121
|
+
| `meta_ad_creative_media` | 7/7 | none |
|
|
122
|
+
| `my-mentions` | 7/7 | none |
|
|
123
|
+
| `pause-scheduled-action` | 7/7 | none |
|
|
124
|
+
| `poll-channel` | 7/7 | none |
|
|
125
|
+
| `post-message` | 7/7 | none |
|
|
126
|
+
| `prepare-memory-write` | 7/7 | none |
|
|
127
|
+
| `propose-scheduled-action` | 7/7 | none |
|
|
128
|
+
| `provision-defaults` | 7/7 | none |
|
|
129
|
+
| `query_fanout_workflow` | 7/7 | none |
|
|
130
|
+
| `rank_tracker_workflow` | 7/7 | none |
|
|
131
|
+
| `react-message` | 7/7 | none |
|
|
132
|
+
| `read_service_connection` | 7/7 | none |
|
|
133
|
+
| `record-fact` | 7/7 | none |
|
|
134
|
+
| `reddit_thread` | 7/7 | none |
|
|
135
|
+
| `reddit_trending` | 7/7 | none |
|
|
136
|
+
| `remove-channel-member` | 7/7 | none |
|
|
137
|
+
| `renew_connected_data_download` | 7/7 | none |
|
|
138
|
+
| `reply-message` | 7/7 | none |
|
|
139
|
+
| `report_artifact_read` | 7/7 | none |
|
|
140
|
+
| `resolve-memory-tags` | 7/7 | none |
|
|
141
|
+
| `resume-scheduled-action` | 7/7 | none |
|
|
142
|
+
| `revoke-chat-link` | 7/7 | none |
|
|
143
|
+
| `revoke-schedule-link` | 7/7 | none |
|
|
144
|
+
| `revoke-vault-app-link` | 7/7 | none |
|
|
145
|
+
| `revoke-webhook` | 7/7 | none |
|
|
146
|
+
| `route-memory` | 7/7 | none |
|
|
147
|
+
| `search_serp` | 7/7 | none |
|
|
148
|
+
| `set_scheduled_action_connections` | 7/7 | none |
|
|
149
|
+
| `set-agent-identity` | 7/7 | none |
|
|
150
|
+
| `set-schedule-defaults` | 7/7 | none |
|
|
151
|
+
| `set-schedule-entitlement` | 7/7 | none |
|
|
152
|
+
| `slack_send_message` | 7/7 | none |
|
|
153
|
+
| `storage-usage` | 7/7 | none |
|
|
154
|
+
| `table-create` | 7/7 | none |
|
|
155
|
+
| `table-delete-rows` | 7/7 | none |
|
|
156
|
+
| `table-describe` | 7/7 | none |
|
|
157
|
+
| `table-drop` | 7/7 | none |
|
|
158
|
+
| `table-insert-rows` | 7/7 | none |
|
|
159
|
+
| `table-list` | 7/7 | none |
|
|
160
|
+
| `table-query` | 7/7 | none |
|
|
161
|
+
| `temporal-recall` | 7/7 | none |
|
|
162
|
+
| `test_service_connection` | 7/7 | none |
|
|
163
|
+
| `trustpilot_reviews` | 7/7 | none |
|
|
164
|
+
| `upsert-memory-tag` | 7/7 | none |
|
|
165
|
+
| `validate-memory-write` | 7/7 | none |
|
|
166
|
+
| `video_frame_analysis` | 7/7 | none |
|
|
167
|
+
| `video_frame_analysis_status` | 7/7 | none |
|
|
168
|
+
| `video-analyze-start` | 7/7 | none |
|
|
169
|
+
| `video-analyze-status` | 7/7 | none |
|
|
170
|
+
| `workflow_artifact_read` | 7/7 | none |
|
|
171
|
+
| `workflow_list` | 7/7 | none |
|
|
172
|
+
| `workflow_run` | 7/7 | none |
|
|
173
|
+
| `workflow_status` | 7/7 | none |
|
|
174
|
+
| `workflow_step` | 7/7 | none |
|
|
175
|
+
| `workflow_suggest` | 7/7 | none |
|
|
176
|
+
| `youtube_harvest` | 7/7 | none |
|
|
177
|
+
| `youtube_transcribe` | 7/7 | none |
|
|
178
|
+
| `zoom_create_meeting` | 7/7 | none |
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-07-
|
|
2
|
+
"generatedAt": "2026-07-26T13:48:25.203Z",
|
|
3
3
|
"generatedFrom": "dist/bin/mcp-stdio-server.js",
|
|
4
4
|
"serverInfo": {
|
|
5
5
|
"name": "mcp-scraper",
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.34.1"
|
|
7
7
|
},
|
|
8
8
|
"counts": {
|
|
9
9
|
"unified_stdio": 167
|
|
@@ -15606,7 +15606,7 @@
|
|
|
15606
15606
|
{
|
|
15607
15607
|
"name": "query_fanout_workflow",
|
|
15608
15608
|
"title": "Capture AI Search Fan-Out",
|
|
15609
|
-
"description": "Capture the query fan-out behind a ChatGPT or Claude web-search answer for AEO: sub-queries issued, every researched URL split into cited vs browsed-only, and top sourced sites.
|
|
15609
|
+
"description": "Capture the query fan-out behind a ChatGPT or Claude web-search answer for AEO: sub-queries issued, every researched URL split into cited vs browsed-only, and top sourced sites. Complete structured data is always returned inline for analysis. export=true additionally writes JSON/CSV/TSV/HTML only from an installed local MCP server; hosted OAuth/HTTP clients receive exports=null and use the inline data. A local export failure does not discard a successful capture. WRITE NOTE: passing prompt submits a real message in the user's logged-in account — only send when the user wants that; omit it to capture a prompt the user just ran. The session must already be open on chatgpt.com or claude.ai (see browser_profile_connect) while the prompt streams. NOT for Google AI Overview — use harvest_paa for that.",
|
|
15610
15610
|
"inputSchema": {
|
|
15611
15611
|
"type": "object",
|
|
15612
15612
|
"properties": {
|
|
@@ -15636,7 +15636,7 @@
|
|
|
15636
15636
|
"export": {
|
|
15637
15637
|
"type": "boolean",
|
|
15638
15638
|
"default": false,
|
|
15639
|
-
"description": "
|
|
15639
|
+
"description": "When using the installed local MCP server, write JSON/CSV/TSV/HTML exports to MCP_SCRAPER_OUTPUT_DIR/fanout. Hosted clients such as ChatGPT always receive the complete structured result inline and leave exports null."
|
|
15640
15640
|
}
|
|
15641
15641
|
},
|
|
15642
15642
|
"required": [
|
|
@@ -15914,6 +15914,13 @@
|
|
|
15914
15914
|
"null"
|
|
15915
15915
|
]
|
|
15916
15916
|
},
|
|
15917
|
+
"export_error": {
|
|
15918
|
+
"type": [
|
|
15919
|
+
"string",
|
|
15920
|
+
"null"
|
|
15921
|
+
],
|
|
15922
|
+
"description": "Non-fatal local export failure. The inline capture remains complete when this is present."
|
|
15923
|
+
},
|
|
15917
15924
|
"exports": {
|
|
15918
15925
|
"anyOf": [
|
|
15919
15926
|
{
|
|
@@ -16727,7 +16734,7 @@
|
|
|
16727
16734
|
{
|
|
16728
16735
|
"name": "reddit_trending",
|
|
16729
16736
|
"title": "Reddit Trending",
|
|
16730
|
-
"description": "Discover the top Reddit conversations about a topic from the last
|
|
16737
|
+
"description": "Discover the top Reddit conversations about a topic from the last week or month: finds relevant recent threads via a Google site:reddit.com search (optionally scoped to one subreddit), scrapes them for real upvotes, comments, and the questions people asked, and ranks by engagement (upvotes + 2x comments). Scraping runs in parallel across the discovered threads; set includeComments:false for a fast, cheap discovery-only sweep (relevant thread list, no engagement stats, no per-thread billing) and then read the ones you want with reddit_thread. Not for reading one known thread URL — use reddit_thread for that.",
|
|
16731
16738
|
"inputSchema": {
|
|
16732
16739
|
"type": "object",
|
|
16733
16740
|
"properties": {
|
|
@@ -16741,17 +16748,26 @@
|
|
|
16741
16748
|
"minLength": 1,
|
|
16742
16749
|
"description": "Bare subreddit name to scope the scan to one community, e.g. \"SEO\" (no r/ prefix, no URL). Omit to scan all of Reddit."
|
|
16743
16750
|
},
|
|
16751
|
+
"window": {
|
|
16752
|
+
"type": "string",
|
|
16753
|
+
"enum": [
|
|
16754
|
+
"week",
|
|
16755
|
+
"month"
|
|
16756
|
+
],
|
|
16757
|
+
"default": "month",
|
|
16758
|
+
"description": "How recent the threads must be: \"week\" or \"month\" (default). Applied via a Google time filter over reddit.com, so it reflects genuine recency."
|
|
16759
|
+
},
|
|
16744
16760
|
"maxThreads": {
|
|
16745
16761
|
"type": "integer",
|
|
16746
16762
|
"minimum": 1,
|
|
16747
|
-
"maximum":
|
|
16748
|
-
"default":
|
|
16749
|
-
"description": "
|
|
16763
|
+
"maximum": 40,
|
|
16764
|
+
"default": 20,
|
|
16765
|
+
"description": "How many discovered threads to scrape and rank. Default 20 (scrape-all). Each scraped thread is billed like reddit_thread + its comments, so lower this to cap cost; raise toward 40 for a wider sweep. Scraping runs in parallel and stops early if it nears the request time limit (partial:true in the response)."
|
|
16750
16766
|
},
|
|
16751
16767
|
"includeComments": {
|
|
16752
16768
|
"type": "boolean",
|
|
16753
16769
|
"default": true,
|
|
16754
|
-
"description": "Scrape each
|
|
16770
|
+
"description": "Scrape each discovered thread for real upvotes, comments, and the questions people asked, then rank by engagement. Set false for a fast, cheap discovery-only sweep — returns the discovered threads (title + url) in relevance order with NO engagement stats and NO per-thread billing, so you can then call reddit_thread on the ones you want."
|
|
16755
16771
|
},
|
|
16756
16772
|
"maxCommentsPerThread": {
|
|
16757
16773
|
"type": "integer",
|
|
@@ -16877,7 +16893,14 @@
|
|
|
16877
16893
|
"type": "integer",
|
|
16878
16894
|
"minimum": 0
|
|
16879
16895
|
},
|
|
16880
|
-
"
|
|
16896
|
+
"candidatesFound": {
|
|
16897
|
+
"type": "integer",
|
|
16898
|
+
"minimum": 0
|
|
16899
|
+
},
|
|
16900
|
+
"partial": {
|
|
16901
|
+
"type": "boolean"
|
|
16902
|
+
},
|
|
16903
|
+
"searchQuery": {
|
|
16881
16904
|
"type": "string"
|
|
16882
16905
|
}
|
|
16883
16906
|
},
|
|
@@ -16889,7 +16912,9 @@
|
|
|
16889
16912
|
"rankedThreads",
|
|
16890
16913
|
"questions",
|
|
16891
16914
|
"threadsScraped",
|
|
16892
|
-
"
|
|
16915
|
+
"candidatesFound",
|
|
16916
|
+
"partial",
|
|
16917
|
+
"searchQuery"
|
|
16893
16918
|
],
|
|
16894
16919
|
"additionalProperties": false,
|
|
16895
16920
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
@@ -17679,6 +17704,16 @@
|
|
|
17679
17704
|
"maximum": 2,
|
|
17680
17705
|
"default": 1,
|
|
17681
17706
|
"description": "Number of result pages to fetch (1–2)."
|
|
17707
|
+
},
|
|
17708
|
+
"recency": {
|
|
17709
|
+
"type": "string",
|
|
17710
|
+
"enum": [
|
|
17711
|
+
"day",
|
|
17712
|
+
"week",
|
|
17713
|
+
"month",
|
|
17714
|
+
"year"
|
|
17715
|
+
],
|
|
17716
|
+
"description": "Restrict results to a recent time window (Google \"past day/week/month/year\" filter). Omit for all-time. Useful for \"what is being said this week\" style queries; pairs well with a site: operator in the query."
|
|
17682
17717
|
}
|
|
17683
17718
|
},
|
|
17684
17719
|
"required": [
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Query fan-out transport contract fix
|
|
2
|
+
|
|
3
|
+
- **Status:** Implemented; pending deployed live proof
|
|
4
|
+
- **Baseline:** `origin/main` at `e2c90f8db7c22fa2aa48fc62cef10e2e0c799e15` (2026-07-25)
|
|
5
|
+
- **Decision:** [Keep hosted fan-out results inline](../decisions/2026-07-25-hosted-fanout-results-stay-inline.md)
|
|
6
|
+
- **Owner:** MCP Scraper browser-agent surface
|
|
7
|
+
|
|
8
|
+
## Problem
|
|
9
|
+
|
|
10
|
+
`/mcp` correctly registers browser-agent tools with `savesReportsLocally: false`, but `query_fanout_workflow` previously forwarded `input.export` to the browser service and treated remote export paths as usable. An OAuth call with `export: true` could therefore fail while writing an inaccessible sandbox path.
|
|
11
|
+
|
|
12
|
+
## Contract
|
|
13
|
+
|
|
14
|
+
| Transport | Capture data | `export: true` behavior | Filesystem contract |
|
|
15
|
+
| --- | --- | --- | --- |
|
|
16
|
+
| Local stdio or MCPB | Always inline structured content | Client writes optional JSON/CSV/TSV/HTML after capture | Relative paths under local `MCP_SCRAPER_OUTPUT_DIR/fanout` |
|
|
17
|
+
| Hosted HTTP/OAuth `/mcp` | Always inline structured content | Accepted for compatibility but does not create files | `exports: null`; no remote or sandbox path is returned |
|
|
18
|
+
|
|
19
|
+
The inline result is canonical: queries, researched/cited URLs, snippets, counts, aggregates, and capture metadata must remain immediately usable by an AI.
|
|
20
|
+
|
|
21
|
+
## Implementation requirements
|
|
22
|
+
|
|
23
|
+
1. Send `export: false` to `/agent/sessions/:id/capture-fanout` for every transport.
|
|
24
|
+
2. Return `res.data.result ?? res.data` inline on success and never return `res.data.exports`.
|
|
25
|
+
3. Export only when `opts.savesReportsLocally !== false`, the caller asked for it, and the inline result is an enriched fan-out capture.
|
|
26
|
+
4. Keep `exports` nullable. A local write failure returns the successful inline capture, `exports: null`, and optional `export_error`.
|
|
27
|
+
5. Keep `export` accepted for compatibility and make docs/manifest distinguish local export from hosted inline delivery.
|
|
28
|
+
|
|
29
|
+
## Verification
|
|
30
|
+
|
|
31
|
+
Focused tests must prove hosted calls force upstream `export: false` and return `exports: null`; local calls force the same upstream value, then write relative local files; and a local write failure is non-fatal. Preserve the 180,000 ms capture timeout allowance (at least 210,000 ms upstream).
|
|
32
|
+
|
|
33
|
+
Live release acceptance requires an explicitly authorized new web-search prompt: hosted OAuth with `export: true` must return a populated inline result with `exports: null`; stdio with the same option must additionally produce readable local exports.
|
|
34
|
+
|
|
35
|
+
## Out of scope
|
|
36
|
+
|
|
37
|
+
Public/shared download URLs, capture-parser changes, profile authentication, billing, timeout changes, and recovery of fan-out from pre-capture prompts.
|