scrapeloop-mcp 0.7.0 → 0.8.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 +39 -18
- package/package.json +23 -7
- package/src/index.js +642 -78
- package/src/mutation-policies.js +232 -0
package/README.md
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
A [Model Context Protocol](https://modelcontextprotocol.io) server for Scrapeloop.
|
|
4
4
|
**Set up and run Scrapeloop end-to-end from Claude Desktop, Cursor, ChatGPT, or any
|
|
5
|
-
MCP client**
|
|
5
|
+
MCP client** - connect integrations, scrape or pull from the lead database, verify
|
|
6
6
|
(incl. catch-all), clean, enrich, tag, and feed Instantly campaigns.
|
|
7
7
|
|
|
8
|
-
Pair it with the [`scrapeloop
|
|
8
|
+
Pair it with the [`scrapeloop` skill](../skill) for a saved Playbook setup and task
|
|
9
9
|
flow ("set up Scrapeloop").
|
|
10
10
|
|
|
11
11
|
## Setup
|
|
@@ -52,7 +52,7 @@ integrations:write scrape enrich cleaners strategies campaigns:write insta
|
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
A 403 with `"API key missing scope(s): …"` means the key was minted with a narrower
|
|
55
|
-
set
|
|
55
|
+
set - regenerate it with the full preset.
|
|
56
56
|
|
|
57
57
|
## Tools
|
|
58
58
|
|
|
@@ -64,14 +64,14 @@ cleaners, strategy tags, vendors, scopes, and the ordered 7 setup steps) and
|
|
|
64
64
|
|------|-------|
|
|
65
65
|
| Discovery | `get_capabilities`, `get_setup_status`, `get_credits`, `get_meta` |
|
|
66
66
|
| Integrations (BYOK) | `list_integrations`, `create_integration`, `list_credentials`, `add_credential`, `test_credential`, `list_instantly_connections` |
|
|
67
|
-
| Scrape | `list_scrapers`, `estimate_scrape`, `submit_scrape`, `list_jobs`, `get_job`, `cancel_job` |
|
|
67
|
+
| Scrape | `list_scrapers`, `estimate_scrape`, `submit_scrape`, `list_jobs`, `get_job`, `cancel_job`, `attach_job_to_table` |
|
|
68
68
|
| Lead database | `search_leads`, `estimate_leads`, `reveal_lead`, `save_leads`, `bulk_verify_leads` |
|
|
69
69
|
| Verify | `verify_email`, `verify_catchall` |
|
|
70
70
|
| Clean | `list_cleaners`, `preview_cleaners`, `apply_cleaners` |
|
|
71
71
|
| Enrich + strategies | `list_presets`, `create_preset`, `estimate_enrich`, `run_enrich`, `test_recipe`, `get_ai_settings`, `update_ai_settings`, `list_strategies`, `create_strategy`, `assign_strategy` |
|
|
72
72
|
| Campaigns + Instantly | `list_instantly_campaigns`, `list_instantly_lead_lists`, `import_instantly_campaigns`, `import_instantly_lead_list`, `list_segments`, `create_segment`, `preview_segment`, `list_campaigns`, `create_campaign`, `update_campaign`, `activate_campaign`, `pause_campaign`, `sync_campaign`, `campaign_stats`, `get_sender_config`, `update_sender_config` |
|
|
73
73
|
| B2B saved collections | `get_lists`, `create_list`, `add_list_members` |
|
|
74
|
-
| Campaign-ready Tables | `get_tables`, `create_table`, `get_table_columns`, `create_table_column`, `set_table_cells`, `list_table_rows` |
|
|
74
|
+
| Campaign-ready Tables | `get_tables`, `create_table`, `get_table_columns`, `create_table_column`, `create_table_preset_column`, `set_table_cells`, `list_table_rows` |
|
|
75
75
|
|
|
76
76
|
`import_leads`, `preview_import`, and `import_leads_csv` accept raw identities
|
|
77
77
|
without placeholder emails. Each row needs an email, LinkedIn URL, external ID,
|
|
@@ -90,7 +90,16 @@ typed value, with explicit `null` reserved for clearing. `set_table_cells`
|
|
|
90
90
|
accepts at most 500 cells and 256 KiB of JSON, validates the complete batch,
|
|
91
91
|
then persists it as one atomic upsert.
|
|
92
92
|
|
|
93
|
-
`
|
|
93
|
+
`create_table_preset_column` attaches a shipped system preset or an active
|
|
94
|
+
workspace preset as a real enrichment column. It requires a stable
|
|
95
|
+
`operation_id`, defaults `auto_run` to false, and accepts only overrides declared
|
|
96
|
+
by the preset. When auto-run would backfill existing rows, the first call returns
|
|
97
|
+
the exact row and cost estimate without writing. Repeat with `confirm_auto_run`
|
|
98
|
+
and that exact `confirmed_estimated_cost_usd` only after user confirmation. The
|
|
99
|
+
Table master switch and workspace budget caps still gate the queued work.
|
|
100
|
+
|
|
101
|
+
`create_table`, `create_table_column`, `create_table_preset_column`, and
|
|
102
|
+
`create_table_view` are
|
|
94
103
|
idempotent. The MCP generates one `operation_id` for the logical create and
|
|
95
104
|
reuses it across transient HTTP retries. The API returns the first resource for
|
|
96
105
|
the same key and normalized payload, including concurrent calls, and returns
|
|
@@ -121,28 +130,40 @@ successful only after all four conditions are true:
|
|
|
121
130
|
|
|
122
131
|
1. The exact `mcp-v<version>` tag matches `package.json`.
|
|
123
132
|
2. Tests pass and the packed tarball contains only the declared package files.
|
|
124
|
-
3. npm accepts the exact tarball
|
|
125
|
-
version with the same integrity.
|
|
133
|
+
3. npm accepts the exact tarball through Trusted Publishing, or already has
|
|
134
|
+
that same version with the same integrity.
|
|
126
135
|
4. `npx scrapeloop-mcp@<version>` reports the expected version and tool count.
|
|
127
136
|
|
|
137
|
+
The installed-package check removes GitHub Actions' temporary npm authentication
|
|
138
|
+
settings and replaces them with an empty, temporary public-registry config
|
|
139
|
+
before it runs `npx`. That makes the final check use the public registry exactly
|
|
140
|
+
like a customer install, without reusing publishing access.
|
|
141
|
+
|
|
128
142
|
The Actions summary reports **Build and test** separately from **Publish and
|
|
129
143
|
registry**. A green package build does not mean the version is published. A
|
|
130
|
-
missing
|
|
131
|
-
registry verification timeout fails the workflow.
|
|
144
|
+
missing OIDC identity, a rejected trusted-publisher match, a conflicting
|
|
145
|
+
duplicate version, or a registry verification timeout fails the workflow.
|
|
146
|
+
|
|
147
|
+
### Trusted npm publishing
|
|
148
|
+
|
|
149
|
+
The npm package trusts only the `publish-mcp.yml` GitHub Actions workflow in
|
|
150
|
+
`Hinkam-Lanello/scrapeloop`. The workflow uses GitHub OIDC to request a
|
|
151
|
+
short-lived npm publishing identity. It must run on a GitHub-hosted runner with
|
|
152
|
+
`id-token: write`, Node.js 24, and npm 11.5.1 or newer. Do not add `NPM_TOKEN` or
|
|
153
|
+
another long-lived publish token.
|
|
132
154
|
|
|
133
|
-
|
|
155
|
+
The source repository is private, so the workflow must not force npm
|
|
156
|
+
provenance. npm supports Trusted Publishing from a private GitHub repository,
|
|
157
|
+
but provenance is available only when the source repository is public.
|
|
134
158
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
an already tagged but unpublished version, run the workflow manually with its
|
|
139
|
-
exact existing tag. The workflow archives and publishes that tag's source rather
|
|
140
|
-
than the current default branch.
|
|
159
|
+
To recover an already tagged but unpublished version, run the workflow manually
|
|
160
|
+
with its exact existing tag. The workflow archives and publishes that tag's
|
|
161
|
+
source rather than the current default branch.
|
|
141
162
|
|
|
142
163
|
Local preflight, which never publishes:
|
|
143
164
|
|
|
144
165
|
```bash
|
|
145
166
|
npm ci --no-audit --no-fund
|
|
146
167
|
npm test
|
|
147
|
-
npm run release:preflight -- --tag mcp-v0.7.
|
|
168
|
+
npm run release:preflight -- --tag mcp-v0.7.1
|
|
148
169
|
```
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "scrapeloop-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Scrapeloop MCP server
|
|
3
|
+
"version": "0.8.0",
|
|
4
|
+
"description": "Scrapeloop MCP server - set up and run Scrapeloop end-to-end (integrations, scraping, lead database, verification, cleaners, enrichment, strategies, Instantly campaigns) from any MCP client (Claude Desktop, Cursor, ChatGPT, \u2026).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"test": "node --check src/index.js && node test/mcp_table_tools.mjs && node test/mcp_community_intent.mjs && node test/mcp_api_key_preflight.mjs && node test/release_readiness.mjs",
|
|
7
|
+
"test": "node --check src/index.js && node test/mcp_table_tools.mjs && node test/mcp_playbook_plans.mjs && node test/mcp_community_intent.mjs && node test/mcp_api_key_preflight.mjs && node test/mutation_retry_contract.mjs && node test/release_readiness.mjs",
|
|
8
8
|
"release:preflight": "node scripts/release-preflight.mjs",
|
|
9
9
|
"release:verify": "node scripts/release-installed-verify.mjs"
|
|
10
10
|
},
|
|
@@ -21,10 +21,26 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
23
23
|
},
|
|
24
|
-
"keywords": [
|
|
24
|
+
"keywords": [
|
|
25
|
+
"mcp",
|
|
26
|
+
"scrapeloop",
|
|
27
|
+
"leads",
|
|
28
|
+
"b2b",
|
|
29
|
+
"email-verification",
|
|
30
|
+
"cold-email",
|
|
31
|
+
"model-context-protocol"
|
|
32
|
+
],
|
|
25
33
|
"homepage": "https://scrapeloop.com",
|
|
26
|
-
"repository": {
|
|
27
|
-
|
|
28
|
-
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/Hinkam-Lanello/scrapeloop.git",
|
|
37
|
+
"directory": "packages/mcp"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/Hinkam-Lanello/scrapeloop/issues"
|
|
41
|
+
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
29
45
|
"license": "UNLICENSED"
|
|
30
46
|
}
|