scrapeloop-mcp 0.30.0 → 0.31.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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/index.js +6 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scrapeloop-mcp",
3
- "version": "0.30.0",
3
+ "version": "0.31.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
6
  "scripts": {
package/src/index.js CHANGED
@@ -573,10 +573,11 @@ const TOOLS = {
573
573
  run: (a) => api('GET', `/plans/${enc(a.plan_id)}/yield`),
574
574
  },
575
575
  set_scrape_plan_ready_goal: {
576
- def: { description: 'Save a verified-email goal on a native Maps draft without repeat searches. Choose the ready Table and its email campaign, monthly goal/minimum, unused-stock ceiling and evidence rules. Pass the reviewed expected_updated_at from get_scrape_plan. Counts require current input-bound verification, qualification, campaign fields and sender-history checks. This does not start scraping, verification or campaigns. Complete-search pacing must be available before Start.', inputSchema: obj({
576
+ def: { description: 'Save a verified-email goal on a native Maps draft without repeat searches. Choose the ready Table and its email campaign, monthly goal/minimum, optional hard-maximum mode, unused-stock ceiling and evidence rules. Pass the reviewed expected_updated_at from get_scrape_plan. Counts require current input-bound verification, qualification, campaign fields and sender-history checks. This does not start scraping, verification or campaigns. Complete-search pacing must be available before Start.', inputSchema: obj({
577
577
  plan_id: { ...S, format: 'uuid' }, expected_updated_at: { ...S, format: 'date-time' },
578
578
  goal: obj({ kind: { ...S, enum: ['verified_email'] }, ready_list_id: { ...S, format: 'uuid' },
579
579
  campaign_id: { ...S, format: 'uuid' }, monthly_goal: { type: 'integer', minimum: 1, maximum: 1000000 },
580
+ limit_mode: { ...S, enum: ['target', 'maximum'] },
580
581
  monthly_minimum: { type: 'integer', minimum: 0, maximum: 1000000 },
581
582
  stock_ceiling: { type: 'integer', minimum: 1, maximum: 1000000 }, timezone: S,
582
583
  evidence_max_age_days: { type: 'integer', minimum: 1, maximum: 90 }, allow_resolved_catchall: B,
@@ -1116,6 +1117,7 @@ const TOOLS = {
1116
1117
  sender_options: { ...O, description: "GoHighLevel SMS choices: workflow_id, tags, require_verified_mobile, voip_counts_as_mobile, missing_fields (ask, create, never)." },
1117
1118
  icon: { type: ["string", "null"], description: "One or two emoji, or null to clear." },
1118
1119
  source_list_id: S,
1120
+ eligibility_rule: { type: ["object", "null"], additionalProperties: false, required: ["source_list_id", "filter"], properties: { source_list_id: S, filter: O }, description: "Optional Current qualification: an open static evidence Table and nonempty current lead/column conditions. The API binds reviewed columns. Null turns this check off." },
1119
1121
  segment_id: S,
1120
1122
  sender_credential_id: S,
1121
1123
  external_list_id: S,
@@ -1142,7 +1144,7 @@ const TOOLS = {
1142
1144
  run: (a) => {
1143
1145
  const body = { name: a.name, sender_credential_id: a.sender_credential_id, external_list_id: a.external_list_id };
1144
1146
  for (const k of [
1145
- 'source_list_id', 'segment_id', 'instantly_campaign_name', 'feed_mode', 'drip_strategy',
1147
+ 'source_list_id', 'segment_id', 'instantly_campaign_name', 'feed_mode', 'drip_strategy', 'eligibility_rule',
1146
1148
  'allow_risky_emails', 'offload_enabled', 'offload_no_reply_days', 'offload_to_instantly',
1147
1149
  'offload_to_scrapeloop', 'offload_scrapeloop_list_id',
1148
1150
  'drip_daily_count', 'target_active_count', 'cooldown_days', 'resting_period_days',
@@ -1158,7 +1160,7 @@ const TOOLS = {
1158
1160
  run: (a) => api('GET', `/campaigns/${enc(a.campaign_id)}/qualification`),
1159
1161
  },
1160
1162
  update_campaign: {
1161
- def: { description: 'Patch a campaign (feed_mode, target_active_count, cooldown_days, external_list_id, …). Switching feed_mode on for an already active campaign runs the same check as campaign_readiness_check: any fail answers 422 with the report under detail.readiness.', inputSchema: obj({ campaign_id: S, patch: { ...O, description: "Campaign settings to change. qualification: {} disables the gate; {rule: be_dutch, evidence_column_id: UUID, max_age_days: 90} requires current Dutch website evidence outside Wallonia. This changes future uploads only; it does not remove sender leads or start checks.", properties: { sender_options: { ...O, description: "GoHighLevel SMS settings. Only supplied keys change." }, icon: { type: ["string", "null"], description: "One or two emoji, or null to clear." } }, additionalProperties: true } }, ['campaign_id', 'patch']) },
1163
+ def: { description: 'Patch a campaign (feed_mode, target_active_count, cooldown_days, external_list_id, …). Switching feed_mode on for an already active campaign runs the same check as campaign_readiness_check: any fail answers 422 with the report under detail.readiness.', inputSchema: obj({ campaign_id: S, patch: { ...O, description: "Campaign settings to change. eligibility_rule uses {source_list_id, filter} for Current qualification, or null to turn it off. qualification: {} disables the Belgium website language gate; {rule: be_dutch, evidence_column_id: UUID, max_age_days: 90} enables it. Read back after saving. These settings do not start checks or remove sender leads.", properties: { eligibility_rule: { type: ["object", "null"], additionalProperties: false, required: ["source_list_id", "filter"], properties: { source_list_id: S, filter: O } }, qualification: { ...O, description: "Belgium website language rule, or {} to disable." }, sender_options: { ...O, description: "GoHighLevel SMS settings. Only supplied keys change." }, icon: { type: ["string", "null"], description: "One or two emoji, or null to clear." } }, additionalProperties: true } }, ['campaign_id', 'patch']) },
1162
1164
  run: (a) => api('PATCH', `/campaigns/${enc(a.campaign_id)}`, a.patch || {}),
1163
1165
  },
1164
1166
  duplicate_campaign: {
@@ -2489,7 +2491,7 @@ const TOOLS = {
2489
2491
  limit: N,
2490
2492
  sort: S,
2491
2493
  q: S,
2492
- filter: { ...O, description: 'FilterExpr JSON (object): server-side row filter; adds total_filtered. lead.email_domain derives the exact lowercase domain from the current email, separate from website lead.domain. Use eq/any_of/none_of for exact lists; add not_empty to hold malformed or blank addresses under exclusions. No DNS or provider lookup.' },
2494
+ filter: { ...O, description: 'FilterExpr JSON (object): server-side row filter; adds total_filtered. lead.email_domain derives the exact lowercase domain from the current email, separate from website lead.domain. lead.gcid reads an exact Google category ID from current source data; it does not prove business fit. Use eq/any_of/none_of for exact lists; add not_empty to hold missing or malformed values. No DNS or provider lookup.' },
2493
2495
  view_id: { ...S, description: 'A saved custom view uuid or a system key (errored_rows/fully_enriched/data_only) from list_table_views. An ad-hoc filter/sort replaces the view\'s.' },
2494
2496
  },
2495
2497
  ['list_id'],