mcp-scraper 0.32.2 → 0.33.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 +1 -1
- package/dist/bin/api-server.cjs +432 -260
- package/dist/bin/api-server.cjs.map +1 -1
- package/dist/bin/api-server.js +2 -2
- package/dist/bin/mcp-scraper-cli.cjs +5 -5
- package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
- package/dist/bin/mcp-scraper-cli.js +2 -2
- package/dist/bin/mcp-scraper-install.cjs +1 -1
- package/dist/bin/mcp-scraper-install.cjs.map +1 -1
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.cjs +47 -6
- package/dist/bin/mcp-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-stdio-server.js +2 -2
- package/dist/bin/paa-harvest.js +1 -1
- package/dist/{chunk-MKZIL4EA.js → chunk-AT2PFWHW.js} +5 -5
- package/dist/chunk-AT2PFWHW.js.map +1 -0
- package/dist/{chunk-AEMABLEL.js → chunk-ERORC7AP.js} +1 -3
- package/dist/chunk-IASKABFL.js +7 -0
- package/dist/chunk-IASKABFL.js.map +1 -0
- package/dist/{chunk-XEED325T.js → chunk-JURXY3DP.js} +48 -7
- package/dist/chunk-JURXY3DP.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/{server-LTZDJHFG.js → server-RKAKXRAR.js} +378 -247
- package/dist/server-RKAKXRAR.js.map +1 -0
- package/dist/{worker-ZZCZNY3R.js → worker-JU5FX3NE.js} +2 -2
- package/docs/adr/0003-waive-unrecoverable-scheduled-model-cost.md +22 -0
- package/docs/adr/README.md +1 -0
- package/docs/mcp-tool-manifest.generated.json +170 -13
- package/package.json +1 -1
- package/dist/chunk-MKZIL4EA.js.map +0 -1
- package/dist/chunk-XEED325T.js.map +0 -1
- package/dist/chunk-XLO5CZ6T.js +0 -7
- package/dist/chunk-XLO5CZ6T.js.map +0 -1
- package/dist/server-LTZDJHFG.js.map +0 -1
- /package/dist/{chunk-AEMABLEL.js.map → chunk-ERORC7AP.js.map} +0 -0
- /package/dist/{worker-ZZCZNY3R.js.map → worker-JU5FX3NE.js.map} +0 -0
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-SDHPQTFM.js";
|
|
7
7
|
import {
|
|
8
8
|
harvest
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-ERORC7AP.js";
|
|
10
10
|
import {
|
|
11
11
|
browserServiceApiKey,
|
|
12
12
|
runWithCostContext
|
|
@@ -139,4 +139,4 @@ export {
|
|
|
139
139
|
startWorker,
|
|
140
140
|
tickOnce
|
|
141
141
|
};
|
|
142
|
-
//# sourceMappingURL=worker-
|
|
142
|
+
//# sourceMappingURL=worker-JU5FX3NE.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# ADR-0003: Waive unrecoverable scheduled model cost during repair
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted
|
|
4
|
+
|
|
5
|
+
**Date:** 2026-07-22
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
An agent-mode scheduled run completed provider/model work on 2026-07-14, but OpenRouter did not return a model-cost value. The 75-Credit base charge was already captured. Its settlement remained `cost_pending`, which correctly prevented an unverified model delta from being guessed but also blocked every later scheduled run for the account. The original authorization token and exact vendor cost are not recoverable.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
For this historical repair, preserve the captured base charge, waive the unknown model-cost delta, and close the settlement and authorization as settled with an explicit `model_cost_unavailable_waived` audit reason. Do not invent or estimate a vendor cost.
|
|
14
|
+
|
|
15
|
+
Future runs continue to require exact reported OpenRouter cost under the existing billing contract. A new missing-cost occurrence must retain enough durable provider evidence for reconciliation or be explicitly waived by an audited operator repair; it must never be silently estimated.
|
|
16
|
+
|
|
17
|
+
## Consequences
|
|
18
|
+
|
|
19
|
+
- The account is no longer permanently blocked by an unrecoverable historical delta.
|
|
20
|
+
- MCP Scraper absorbs the unknown model expense for this run.
|
|
21
|
+
- The repair remains visible in billing-event metadata and preserves the original base-charge receipt.
|
|
22
|
+
- A productized recovery path is still needed if missing provider cost recurs.
|
package/docs/adr/README.md
CHANGED
|
@@ -10,3 +10,4 @@ Write one when a decision is hard to reverse, surprising, or encodes a constrain
|
|
|
10
10
|
## Index
|
|
11
11
|
- [0001 — In-page API interception for anti-bot scraping (Facebook Ad Library)](./0001-in-page-graphql-interception-for-anti-bot-scraping.md)
|
|
12
12
|
- [0002 — Hybrid Smart RAG retrieval for memory vaults](./0002-hybrid-smart-rag-vault-retrieval.md)
|
|
13
|
+
- [0003 — Waive unrecoverable scheduled model cost during repair](./0003-waive-unrecoverable-scheduled-model-cost.md)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-07-
|
|
2
|
+
"generatedAt": "2026-07-22T17:24:08.984Z",
|
|
3
3
|
"generatedFrom": "dist/bin/mcp-stdio-server.js",
|
|
4
4
|
"serverInfo": {
|
|
5
5
|
"name": "mcp-scraper",
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.33.0"
|
|
7
7
|
},
|
|
8
8
|
"counts": {
|
|
9
|
-
"unified_stdio":
|
|
9
|
+
"unified_stdio": 166
|
|
10
10
|
},
|
|
11
11
|
"surfaces": {
|
|
12
12
|
"unified_stdio": [
|
|
@@ -85,6 +85,7 @@
|
|
|
85
85
|
"get-schedule-status",
|
|
86
86
|
"get-vault-app-link",
|
|
87
87
|
"get-vault-contract",
|
|
88
|
+
"gmail_search_contacts",
|
|
88
89
|
"gmail_send_message",
|
|
89
90
|
"google_ads_page_intel",
|
|
90
91
|
"google_ads_search",
|
|
@@ -4621,12 +4622,11 @@
|
|
|
4621
4622
|
"proxyMode": {
|
|
4622
4623
|
"type": "string",
|
|
4623
4624
|
"enum": [
|
|
4624
|
-
"location",
|
|
4625
4625
|
"configured",
|
|
4626
4626
|
"none"
|
|
4627
4627
|
],
|
|
4628
4628
|
"default": "none",
|
|
4629
|
-
"description": "Leave unset
|
|
4629
|
+
"description": "Leave unset for clean egress (the default). Country/region localization comes from gl/hl plus the city or region in the query — not from a proxy."
|
|
4630
4630
|
},
|
|
4631
4631
|
"proxyZip": {
|
|
4632
4632
|
"type": "string",
|
|
@@ -6293,12 +6293,11 @@
|
|
|
6293
6293
|
"proxyMode": {
|
|
6294
6294
|
"type": "string",
|
|
6295
6295
|
"enum": [
|
|
6296
|
-
"location",
|
|
6297
6296
|
"configured",
|
|
6298
6297
|
"none"
|
|
6299
6298
|
],
|
|
6300
6299
|
"default": "none",
|
|
6301
|
-
"description": "Proxy behavior per city search. Leave unset for the default route (stealth browser on the managed ISP proxy, retried fresh on a Google block).
|
|
6300
|
+
"description": "Proxy behavior per city search. Leave unset for the default route (stealth browser on the managed ISP proxy, retried fresh on a Google block). Country/region localization comes from the city or region in the query plus gl/hl — not from a proxy."
|
|
6302
6301
|
},
|
|
6303
6302
|
"proxyZip": {
|
|
6304
6303
|
"type": "string",
|
|
@@ -9027,6 +9026,167 @@
|
|
|
9027
9026
|
"taskSupport": "forbidden"
|
|
9028
9027
|
}
|
|
9029
9028
|
},
|
|
9029
|
+
{
|
|
9030
|
+
"name": "gmail_search_contacts",
|
|
9031
|
+
"title": "Search Gmail Contacts",
|
|
9032
|
+
"description": "Search Gmail with standard Gmail query syntax (e.g. \"from:acme.com after:2026/03/22\") and get back deduplicated sender contacts (email, name, domain, message count, first/last seen, sample subjects) instead of raw messages. Read-only — works on any connected Gmail connection from list_service_connections, no actionsEnabled required. Use this instead of looping list-messages/get-message yourself: those return bare message IDs and full raw MIME per message, which does not scale past a handful of messages. Reports totalMatches and truncated so incomplete coverage from a large result set is never silent — pass the returned nextPageToken to continue.",
|
|
9033
|
+
"inputSchema": {
|
|
9034
|
+
"type": "object",
|
|
9035
|
+
"properties": {
|
|
9036
|
+
"connectionId": {
|
|
9037
|
+
"type": "string",
|
|
9038
|
+
"minLength": 1,
|
|
9039
|
+
"description": "A Gmail connectionId from list_service_connections. Read-only — does not require actionsEnabled."
|
|
9040
|
+
},
|
|
9041
|
+
"query": {
|
|
9042
|
+
"type": "string",
|
|
9043
|
+
"minLength": 1,
|
|
9044
|
+
"maxLength": 500,
|
|
9045
|
+
"description": "Gmail search syntax, e.g. \"from:brandnorth.com after:2026/03/22\" or \"brandnorth.com\"."
|
|
9046
|
+
},
|
|
9047
|
+
"maxMessages": {
|
|
9048
|
+
"type": "integer",
|
|
9049
|
+
"minimum": 1,
|
|
9050
|
+
"maximum": 150,
|
|
9051
|
+
"default": 50,
|
|
9052
|
+
"description": "Max messages to fetch and aggregate in this call. Paginate with pageToken for more; the response reports totalMatches and truncated so undercoverage is never silent."
|
|
9053
|
+
},
|
|
9054
|
+
"pageToken": {
|
|
9055
|
+
"type": "string",
|
|
9056
|
+
"description": "Continuation token from a prior response to fetch the next page."
|
|
9057
|
+
}
|
|
9058
|
+
},
|
|
9059
|
+
"required": [
|
|
9060
|
+
"connectionId",
|
|
9061
|
+
"query"
|
|
9062
|
+
],
|
|
9063
|
+
"additionalProperties": false,
|
|
9064
|
+
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
9065
|
+
},
|
|
9066
|
+
"outputSchema": {
|
|
9067
|
+
"type": "object",
|
|
9068
|
+
"properties": {
|
|
9069
|
+
"ok": {
|
|
9070
|
+
"type": "boolean"
|
|
9071
|
+
},
|
|
9072
|
+
"totalMatches": {
|
|
9073
|
+
"type": "number",
|
|
9074
|
+
"description": "Gmail's estimated total matches for the query, independent of how many were fetched this call."
|
|
9075
|
+
},
|
|
9076
|
+
"messagesFetched": {
|
|
9077
|
+
"type": "number"
|
|
9078
|
+
},
|
|
9079
|
+
"truncated": {
|
|
9080
|
+
"type": "boolean",
|
|
9081
|
+
"description": "True when totalMatches exceeds messagesFetched — more results exist, use nextPageToken."
|
|
9082
|
+
},
|
|
9083
|
+
"nextPageToken": {
|
|
9084
|
+
"type": [
|
|
9085
|
+
"string",
|
|
9086
|
+
"null"
|
|
9087
|
+
]
|
|
9088
|
+
},
|
|
9089
|
+
"messages": {
|
|
9090
|
+
"type": "array",
|
|
9091
|
+
"items": {
|
|
9092
|
+
"type": "object",
|
|
9093
|
+
"properties": {
|
|
9094
|
+
"id": {
|
|
9095
|
+
"type": "string"
|
|
9096
|
+
},
|
|
9097
|
+
"date": {
|
|
9098
|
+
"$ref": "#/properties/nextPageToken"
|
|
9099
|
+
},
|
|
9100
|
+
"from": {
|
|
9101
|
+
"$ref": "#/properties/nextPageToken"
|
|
9102
|
+
},
|
|
9103
|
+
"to": {
|
|
9104
|
+
"$ref": "#/properties/nextPageToken"
|
|
9105
|
+
},
|
|
9106
|
+
"subject": {
|
|
9107
|
+
"$ref": "#/properties/nextPageToken"
|
|
9108
|
+
},
|
|
9109
|
+
"snippet": {
|
|
9110
|
+
"$ref": "#/properties/nextPageToken"
|
|
9111
|
+
}
|
|
9112
|
+
},
|
|
9113
|
+
"required": [
|
|
9114
|
+
"id",
|
|
9115
|
+
"date",
|
|
9116
|
+
"from",
|
|
9117
|
+
"to",
|
|
9118
|
+
"subject",
|
|
9119
|
+
"snippet"
|
|
9120
|
+
],
|
|
9121
|
+
"additionalProperties": false
|
|
9122
|
+
}
|
|
9123
|
+
},
|
|
9124
|
+
"contacts": {
|
|
9125
|
+
"type": "array",
|
|
9126
|
+
"items": {
|
|
9127
|
+
"type": "object",
|
|
9128
|
+
"properties": {
|
|
9129
|
+
"email": {
|
|
9130
|
+
"type": "string"
|
|
9131
|
+
},
|
|
9132
|
+
"name": {
|
|
9133
|
+
"$ref": "#/properties/nextPageToken"
|
|
9134
|
+
},
|
|
9135
|
+
"domain": {
|
|
9136
|
+
"$ref": "#/properties/nextPageToken"
|
|
9137
|
+
},
|
|
9138
|
+
"messageCount": {
|
|
9139
|
+
"type": "number"
|
|
9140
|
+
},
|
|
9141
|
+
"firstSeen": {
|
|
9142
|
+
"$ref": "#/properties/nextPageToken"
|
|
9143
|
+
},
|
|
9144
|
+
"lastSeen": {
|
|
9145
|
+
"$ref": "#/properties/nextPageToken"
|
|
9146
|
+
},
|
|
9147
|
+
"sampleSubjects": {
|
|
9148
|
+
"type": "array",
|
|
9149
|
+
"items": {
|
|
9150
|
+
"type": "string"
|
|
9151
|
+
}
|
|
9152
|
+
}
|
|
9153
|
+
},
|
|
9154
|
+
"required": [
|
|
9155
|
+
"email",
|
|
9156
|
+
"name",
|
|
9157
|
+
"domain",
|
|
9158
|
+
"messageCount",
|
|
9159
|
+
"firstSeen",
|
|
9160
|
+
"lastSeen",
|
|
9161
|
+
"sampleSubjects"
|
|
9162
|
+
],
|
|
9163
|
+
"additionalProperties": false
|
|
9164
|
+
},
|
|
9165
|
+
"description": "Messages deduped by sender email address, newest-to-oldest within this fetch only — not the full query result set when truncated."
|
|
9166
|
+
},
|
|
9167
|
+
"error": {
|
|
9168
|
+
"$ref": "#/properties/nextPageToken"
|
|
9169
|
+
}
|
|
9170
|
+
},
|
|
9171
|
+
"required": [
|
|
9172
|
+
"ok",
|
|
9173
|
+
"nextPageToken",
|
|
9174
|
+
"error"
|
|
9175
|
+
],
|
|
9176
|
+
"additionalProperties": false,
|
|
9177
|
+
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
9178
|
+
},
|
|
9179
|
+
"annotations": {
|
|
9180
|
+
"title": "Search Gmail Contacts",
|
|
9181
|
+
"readOnlyHint": true,
|
|
9182
|
+
"destructiveHint": false,
|
|
9183
|
+
"idempotentHint": true,
|
|
9184
|
+
"openWorldHint": true
|
|
9185
|
+
},
|
|
9186
|
+
"execution": {
|
|
9187
|
+
"taskSupport": "forbidden"
|
|
9188
|
+
}
|
|
9189
|
+
},
|
|
9030
9190
|
{
|
|
9031
9191
|
"name": "gmail_send_message",
|
|
9032
9192
|
"title": "Send Gmail Message",
|
|
@@ -9629,12 +9789,11 @@
|
|
|
9629
9789
|
"proxyMode": {
|
|
9630
9790
|
"type": "string",
|
|
9631
9791
|
"enum": [
|
|
9632
|
-
"location",
|
|
9633
9792
|
"configured",
|
|
9634
9793
|
"none"
|
|
9635
9794
|
],
|
|
9636
9795
|
"default": "none",
|
|
9637
|
-
"description": "Leave unset
|
|
9796
|
+
"description": "Leave unset for clean egress (the default). Country/region localization comes from gl/hl plus the city or region in the query — not from a proxy."
|
|
9638
9797
|
},
|
|
9639
9798
|
"proxyZip": {
|
|
9640
9799
|
"type": "string",
|
|
@@ -12350,12 +12509,11 @@
|
|
|
12350
12509
|
"proxyMode": {
|
|
12351
12510
|
"type": "string",
|
|
12352
12511
|
"enum": [
|
|
12353
|
-
"location",
|
|
12354
12512
|
"configured",
|
|
12355
12513
|
"none"
|
|
12356
12514
|
],
|
|
12357
12515
|
"default": "none",
|
|
12358
|
-
"description": "Leave unset for the default route (stealth browser on the managed ISP proxy, retried on a fresh session when Google blocks).
|
|
12516
|
+
"description": "Leave unset for the default route (stealth browser on the managed ISP proxy, retried on a fresh session when Google blocks). Country/region localization comes from the city or region in the query plus gl/hl — not from a proxy."
|
|
12359
12517
|
},
|
|
12360
12518
|
"proxyZip": {
|
|
12361
12519
|
"type": "string",
|
|
@@ -17317,12 +17475,11 @@
|
|
|
17317
17475
|
"proxyMode": {
|
|
17318
17476
|
"type": "string",
|
|
17319
17477
|
"enum": [
|
|
17320
|
-
"location",
|
|
17321
17478
|
"configured",
|
|
17322
17479
|
"none"
|
|
17323
17480
|
],
|
|
17324
17481
|
"default": "none",
|
|
17325
|
-
"description": "Leave unset
|
|
17482
|
+
"description": "Leave unset for clean egress (the default). Country/region localization comes from gl/hl plus the city or region in the query — not from a proxy."
|
|
17326
17483
|
},
|
|
17327
17484
|
"proxyZip": {
|
|
17328
17485
|
"type": "string",
|