scrapeloop-mcp 0.6.0 → 0.7.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 CHANGED
@@ -42,8 +42,8 @@ pair it with the generated instructions pack (skill `dist/chatgpt-instructions.m
42
42
 
43
43
  ## Scopes
44
44
 
45
- The key's scopes gate the **write/spend** surface (reads are free + ungated; credit
46
- gating lives in the API as 402s). The "MCP / full automation" preset requests the
45
+ The key's scopes gate tenant data reads, writes, and spend. Catalog reads remain
46
+ free, and credit gating lives in the API as 402s. The "MCP / full automation" preset requests the
47
47
  full set so the setup flow works end-to-end:
48
48
 
49
49
  ```
@@ -70,7 +70,42 @@ cleaners, strategy tags, vendors, scopes, and the ordered 7 setup steps) and
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
- | Lists | `get_lists`, `create_list`, `add_list_members` |
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`, `create_table_preset_column`, `set_table_cells`, `list_table_rows` |
75
+
76
+ `import_leads`, `preview_import`, and `import_leads_csv` accept raw identities
77
+ without placeholder emails. Each row needs an email, LinkedIn URL, external ID,
78
+ or absolute source URL. The default match order is normalized email, canonical
79
+ LinkedIn, then external/source identity, all scoped to the API key's workspace.
80
+ A later import with a real email enriches the existing raw lead.
81
+ Mutating imports generate one `operation_id` and reuse it across transient HTTP
82
+ retries. The API returns the first committed result for the same key and
83
+ payload, and rejects reuse with different inputs. If every response is lost,
84
+ retry the original request with the exact key returned in the error.
85
+
86
+ Manual Table columns and cells are zero-cost, and cell writes are limited to
87
+ active static Tables. Archived Tables must be unarchived before column or cell
88
+ writes. Select types require 1-100 declared options. Every cell must include a
89
+ typed value, with explicit `null` reserved for clearing. `set_table_cells`
90
+ accepts at most 500 cells and 256 KiB of JSON, validates the complete batch,
91
+ then persists it as one atomic upsert.
92
+
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
103
+ idempotent. The MCP generates one `operation_id` for the logical create and
104
+ reuses it across transient HTTP retries. The API returns the first resource for
105
+ the same key and normalized payload, including concurrent calls, and returns
106
+ 409 if that key is reused with different inputs. If every response is lost, the
107
+ terminal error includes the exact key and retry call. Retry with that same key,
108
+ never a replacement UUID.
74
109
 
75
110
  Credit-spending (`reveal_lead`, `save_leads`, `submit_scrape`, `verify_*`,
76
111
  `run_enrich`) and send-starting (`activate_campaign`) tools should be preceded by the
@@ -84,4 +119,51 @@ the assistant can explain or self-correct.
84
119
  SCRAPELOOP_API_URL=http://localhost:8000 \
85
120
  SCRAPELOOP_API_KEY=sl_live_… \
86
121
  node test/mcp_smoke.mjs # drives tools against a running API + drift-checks the manifest
122
+
123
+ node test/mcp_table_tools.mjs # offline endpoint/schema contract for Table tools
124
+ ```
125
+
126
+ ## Release readiness
127
+
128
+ MCP package releases use the `publish-mcp` GitHub Actions workflow. A release is
129
+ successful only after all four conditions are true:
130
+
131
+ 1. The exact `mcp-v<version>` tag matches `package.json`.
132
+ 2. Tests pass and the packed tarball contains only the declared package files.
133
+ 3. npm accepts the exact tarball through Trusted Publishing, or already has
134
+ that same version with the same integrity.
135
+ 4. `npx scrapeloop-mcp@<version>` reports the expected version and tool count.
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
+
142
+ The Actions summary reports **Build and test** separately from **Publish and
143
+ registry**. A green package build does not mean the version is published. A
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.
154
+
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.
158
+
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.
162
+
163
+ Local preflight, which never publishes:
164
+
165
+ ```bash
166
+ npm ci --no-audit --no-fund
167
+ npm test
168
+ npm run release:preflight -- --tag mcp-v0.7.1
87
169
  ```
package/package.json CHANGED
@@ -1,8 +1,13 @@
1
1
  {
2
2
  "name": "scrapeloop-mcp",
3
- "version": "0.6.0",
3
+ "version": "0.7.1",
4
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, …).",
5
5
  "type": "module",
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/mutation_retry_contract.mjs && node test/release_readiness.mjs",
8
+ "release:preflight": "node scripts/release-preflight.mjs",
9
+ "release:verify": "node scripts/release-installed-verify.mjs"
10
+ },
6
11
  "bin": {
7
12
  "scrapeloop-mcp": "src/index.js"
8
13
  },