mcp-scraper 0.26.0 → 0.26.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 +1 -1
- package/dist/bin/api-server.cjs +61 -11
- package/dist/bin/api-server.cjs.map +1 -1
- package/dist/bin/api-server.js +1 -1
- package/dist/bin/mcp-scraper-cli.cjs +1 -1
- package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
- package/dist/bin/mcp-scraper-cli.js +1 -1
- 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 +6 -6
- package/dist/bin/mcp-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-stdio-server.js +2 -2
- package/dist/{chunk-UMTBCKHH.js → chunk-QO2TRJ3L.js} +7 -7
- package/dist/chunk-QO2TRJ3L.js.map +1 -0
- package/dist/chunk-V37MZON3.js +7 -0
- package/dist/chunk-V37MZON3.js.map +1 -0
- package/dist/{server-H4PPYTOM.js → server-K6ODZOZA.js} +58 -8
- package/dist/{server-H4PPYTOM.js.map → server-K6ODZOZA.js.map} +1 -1
- package/docs/mcp-tool-manifest.generated.json +2 -2
- package/package.json +1 -1
- package/dist/chunk-7PYRJ7CB.js +0 -7
- package/dist/chunk-7PYRJ7CB.js.map +0 -1
- package/dist/chunk-UMTBCKHH.js.map +0 -1
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.26.
|
|
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.26.2`, SHA-256 `1ced5e2e4f42ab50cd3e00d7d1cb9898cd60aad9842b735394e17f80b8a394e1`). 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
|
|
package/dist/bin/api-server.cjs
CHANGED
|
@@ -29688,7 +29688,7 @@ var PACKAGE_VERSION;
|
|
|
29688
29688
|
var init_version = __esm({
|
|
29689
29689
|
"src/version.ts"() {
|
|
29690
29690
|
"use strict";
|
|
29691
|
-
PACKAGE_VERSION = "0.26.
|
|
29691
|
+
PACKAGE_VERSION = "0.26.2";
|
|
29692
29692
|
}
|
|
29693
29693
|
});
|
|
29694
29694
|
|
|
@@ -32643,10 +32643,10 @@ var init_http_mcp_tool_executor = __esm({
|
|
|
32643
32643
|
return this.call("/billing/credits", input);
|
|
32644
32644
|
}
|
|
32645
32645
|
listServiceConnections(input) {
|
|
32646
|
-
return this.getJson("/
|
|
32646
|
+
return this.getJson("/schedule-connections");
|
|
32647
32647
|
}
|
|
32648
32648
|
testServiceConnection(input) {
|
|
32649
|
-
return this.call(`/
|
|
32649
|
+
return this.call(`/schedule-connections/${encodeURIComponent(input.connectionId)}/test`, {
|
|
32650
32650
|
...input.providerConfigKey ? { providerConfigKey: input.providerConfigKey } : {}
|
|
32651
32651
|
});
|
|
32652
32652
|
}
|
|
@@ -32663,13 +32663,13 @@ var init_http_mcp_tool_executor = __esm({
|
|
|
32663
32663
|
return this.call("/schedule-connections/actions/zoom/create-meeting", input);
|
|
32664
32664
|
}
|
|
32665
32665
|
readServiceConnection(input) {
|
|
32666
|
-
return this.call("/
|
|
32666
|
+
return this.call("/schedule-connections/actions/read", input);
|
|
32667
32667
|
}
|
|
32668
32668
|
importServiceConnectionToMemory(input) {
|
|
32669
32669
|
return this.call("/schedule-connections/actions/import-memory", input);
|
|
32670
32670
|
}
|
|
32671
32671
|
describeServiceConnectionTool(input) {
|
|
32672
|
-
return this.call("/
|
|
32672
|
+
return this.call("/schedule-connections/actions/describe", input);
|
|
32673
32673
|
}
|
|
32674
32674
|
exportConnectedServiceData(input) {
|
|
32675
32675
|
const timeoutMs = this.httpTimeoutOverrideMs ?? 29e4;
|
|
@@ -32683,7 +32683,7 @@ var init_http_mcp_tool_executor = __esm({
|
|
|
32683
32683
|
return this.call("/schedule-connections/actions/export-download", input);
|
|
32684
32684
|
}
|
|
32685
32685
|
callServiceConnectionAction(input) {
|
|
32686
|
-
return this.call("/
|
|
32686
|
+
return this.call("/schedule-connections/actions/call", input);
|
|
32687
32687
|
}
|
|
32688
32688
|
setScheduledActionConnections(input) {
|
|
32689
32689
|
return this.call(`/schedule-actions/${encodeURIComponent(input.scheduleActionId)}/connections`, {
|
|
@@ -43055,6 +43055,42 @@ var init_service_connections = __esm({
|
|
|
43055
43055
|
});
|
|
43056
43056
|
|
|
43057
43057
|
// src/api/main-nango-transport.ts
|
|
43058
|
+
function nangoClientErrorText(error) {
|
|
43059
|
+
if (error instanceof Error) return error.message;
|
|
43060
|
+
if (typeof error === "string") return error;
|
|
43061
|
+
try {
|
|
43062
|
+
return JSON.stringify(error);
|
|
43063
|
+
} catch {
|
|
43064
|
+
return "";
|
|
43065
|
+
}
|
|
43066
|
+
}
|
|
43067
|
+
function normalizeNangoClientError(error) {
|
|
43068
|
+
if (error instanceof MainNangoTransportError) return error;
|
|
43069
|
+
const detail = nangoClientErrorText(error);
|
|
43070
|
+
if (/SERVICE_DISABLED|accessNotConfigured/i.test(detail)) {
|
|
43071
|
+
return new MainNangoTransportError(
|
|
43072
|
+
"The provider API required by this connection is disabled. Enable it in the provider project, wait for propagation, then retry.",
|
|
43073
|
+
409,
|
|
43074
|
+
"provider_api_disabled",
|
|
43075
|
+
false
|
|
43076
|
+
);
|
|
43077
|
+
}
|
|
43078
|
+
if (/PERMISSION_DENIED|insufficientPermissions|insufficient permission/i.test(detail)) {
|
|
43079
|
+
return new MainNangoTransportError(
|
|
43080
|
+
"The connected account does not have permission to run this provider operation.",
|
|
43081
|
+
403,
|
|
43082
|
+
"missing_provider_permission",
|
|
43083
|
+
false
|
|
43084
|
+
);
|
|
43085
|
+
}
|
|
43086
|
+
if (/RESOURCE_EXHAUSTED|rate.?limit|status["']?\s*:\s*429/i.test(detail)) {
|
|
43087
|
+
return new MainNangoTransportError("The connected provider is temporarily rate limited.", 429, "upstream_rate_limited", true);
|
|
43088
|
+
}
|
|
43089
|
+
if (/UNAUTHENTICATED|invalid_grant|status["']?\s*:\s*401/i.test(detail)) {
|
|
43090
|
+
return new MainNangoTransportError("The service connection requires reconnection.", 409, "connection_inactive", false);
|
|
43091
|
+
}
|
|
43092
|
+
return new MainNangoTransportError("The service connection is temporarily unavailable.", 503, "connection_transport_unavailable");
|
|
43093
|
+
}
|
|
43058
43094
|
function asRecord2(value) {
|
|
43059
43095
|
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
43060
43096
|
}
|
|
@@ -43286,19 +43322,31 @@ async function withNangoClient(connection, run) {
|
|
|
43286
43322
|
});
|
|
43287
43323
|
return value;
|
|
43288
43324
|
} catch (error) {
|
|
43325
|
+
const normalized = normalizeNangoClientError(error);
|
|
43289
43326
|
await recordServiceConnectionHealth({
|
|
43290
43327
|
connectionId: connection.id,
|
|
43291
|
-
operationalStatus: "unavailable",
|
|
43292
|
-
failureCode:
|
|
43293
|
-
retryable:
|
|
43328
|
+
operationalStatus: normalized.code === "connection_transport_unavailable" ? "unavailable" : "degraded",
|
|
43329
|
+
failureCode: normalized.code,
|
|
43330
|
+
retryable: normalized.retryable,
|
|
43294
43331
|
evidenceSource: "nango_mcp"
|
|
43295
43332
|
}).catch(() => void 0);
|
|
43296
|
-
|
|
43297
|
-
throw new MainNangoTransportError("The service connection is temporarily unavailable.", 503, "connection_transport_unavailable");
|
|
43333
|
+
throw normalized;
|
|
43298
43334
|
} finally {
|
|
43299
43335
|
await client2.close().catch(() => void 0);
|
|
43300
43336
|
}
|
|
43301
43337
|
}
|
|
43338
|
+
async function probeNangoConnectionDirect(identity, connectionId) {
|
|
43339
|
+
const connection = await requireOwnedActiveConnection(identity, connectionId);
|
|
43340
|
+
const providerKey = connection.provider ?? connection.providerConfigKey;
|
|
43341
|
+
if (providerKey !== "google-search-console") return;
|
|
43342
|
+
await withNangoClient(connection, async (client2) => {
|
|
43343
|
+
const listed = await client2.listTools();
|
|
43344
|
+
if (!listed.tools.some((tool) => tool.name === "list-sites")) {
|
|
43345
|
+
throw new MainNangoTransportError("The Search Console health-check tool is unavailable.", 404, "live_tool_missing", false);
|
|
43346
|
+
}
|
|
43347
|
+
await client2.callTool({ name: "list-sites", arguments: {} });
|
|
43348
|
+
});
|
|
43349
|
+
}
|
|
43302
43350
|
async function listNangoToolsDirect(identity, connectionId) {
|
|
43303
43351
|
const connection = await requireOwnedActiveConnection(identity, connectionId);
|
|
43304
43352
|
const listed = await withNangoClient(connection, (client2) => client2.listTools());
|
|
@@ -44111,6 +44159,7 @@ async function testNangoConnection(identity, connectionId) {
|
|
|
44111
44159
|
}
|
|
44112
44160
|
try {
|
|
44113
44161
|
const { tools } = await listNangoToolsDirect(identity, connectionId);
|
|
44162
|
+
await probeNangoConnectionDirect(identity, connectionId);
|
|
44114
44163
|
return { operationalStatus: "available", checkedAt: (/* @__PURE__ */ new Date()).toISOString(), toolCount: tools.length };
|
|
44115
44164
|
} catch (error) {
|
|
44116
44165
|
throw asNangoControlError(error);
|
|
@@ -44532,6 +44581,7 @@ var init_nango_control = __esm({
|
|
|
44532
44581
|
"connection_transport_unavailable",
|
|
44533
44582
|
"connection_control_failed",
|
|
44534
44583
|
"missing_provider_permission",
|
|
44584
|
+
"provider_api_disabled",
|
|
44535
44585
|
"permission_verification_unavailable",
|
|
44536
44586
|
"meta_app_feature_not_enabled",
|
|
44537
44587
|
"insufficient_credits",
|