scrapeloop-mcp 0.20.0 → 0.21.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "scrapeloop-mcp",
3
- "version": "0.20.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).",
3
+ "version": "0.21.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, …).",
5
5
  "type": "module",
6
6
  "scripts": {
7
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 && node test/mcp_server_version.mjs",
package/src/index.js CHANGED
@@ -1016,6 +1016,14 @@ const TOOLS = {
1016
1016
  def: { description: 'Read campaign membership, actual daily email activity, sequence steps, sending calendar, dated sender queues and remaining-month follow-up estimates. Counts shared Instantly mailbox capacity once, deducts waiting sender leads and exposes stale or unknown history. Background reads refresh about every five minutes. Other sender metrics may be unavailable. This never fills or starts campaigns, and the estimate does not change scrape goals or budgets.', inputSchema: obj({}) },
1017
1017
  run: () => api('GET', '/campaigns/sending-metrics'),
1018
1018
  },
1019
+ get_campaign_shared_stops: {
1020
+ def: { description: 'Review shared replies and stops for campaigns in one pipeline. Shows local blocks separately from unconfirmed sender removals. This reads only.', inputSchema: obj({ campaign_id: S }, ['campaign_id']) },
1021
+ run: (a) => a.campaign_id ? api('GET', `/campaigns/${enc(a.campaign_id)}/shared-stops`) : { ok: false, status: 400, error: { detail: 'campaign_id is required.' } },
1022
+ },
1023
+ save_campaign_shared_stops: {
1024
+ def: { description: 'Save the exact reviewed shared stop group for a completed pipeline. Campaigns must be paused or draft with feeds off. Retains replies locally and lists removal needs. Does not contact a provider or start outreach. Inspect after an uncertain result. Sender removal setup and proof are still needed before launch.', inputSchema: obj({ campaign_id: S, reviewed_revision: S }, ['campaign_id', 'reviewed_revision']) },
1025
+ run: (a) => a.campaign_id && a.reviewed_revision ? api('PUT', `/campaigns/${enc(a.campaign_id)}/shared-stops`, { reviewed_revision: a.reviewed_revision }) : { ok: false, status: 400, error: { detail: 'campaign_id and reviewed_revision are required.' } },
1026
+ },
1019
1027
  get_campaign_handoff_status: {
1020
1028
  def: {
1021
1029
  description: 'Read waiting, completed and held review Table handoffs for a campaign. No provider call, retry or write. Held copies may already have happened; inspect before moving again.',
@@ -37,6 +37,7 @@ const never = (method, inspectWith, matchFields) => ({
37
37
  });
38
38
 
39
39
  export const MUTATION_POLICIES = Object.freeze({
40
+ save_campaign_shared_stops: reconcile('PUT', ['get_campaign_shared_stops'], ['campaign_id', 'reviewed_revision']),
40
41
  create_integration: keyed('POST', ['list_integrations'], ['vendor', 'plugin_kind']),
41
42
  add_credential: reconcile('POST', ['list_credentials'], ['integration_id', 'label']),
42
43
  test_credential: idempotent('POST', ['list_credentials'], ['credential_id']),