scrapeloop-mcp 0.22.0 → 0.23.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,6 +1,6 @@
1
1
  {
2
2
  "name": "scrapeloop-mcp",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
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
@@ -1032,6 +1032,30 @@ const TOOLS = {
1032
1032
  def: { description: 'Save the reviewed GoHighLevel receiving address for a paused shared journey with feeds off. Makes one free account identity read. Does not create credentials, grant access, subscribe events, install workflows or start outreach. The owner must set up signed Marketplace events separately. Inspect after an uncertain result.', inputSchema: obj({ campaign_id: S, credential_id: S, reviewed_revision: S }, ['campaign_id', 'credential_id', 'reviewed_revision']) },
1033
1033
  run: (a) => a.campaign_id && a.credential_id && a.reviewed_revision ? api('PUT', `/campaigns/${enc(a.campaign_id)}/ghl-returns`, { credential_id: a.credential_id, reviewed_revision: a.reviewed_revision }) : { ok: false, status: 400, error: { detail: 'campaign_id, credential_id and reviewed_revision are required.' } },
1034
1034
  },
1035
+ get_campaign_removals: {
1036
+ def: { description: 'Read saved sender removal setup and dated receipts. Includes up to 50 stopped contacts and next_cursor; pass after to continue. Automatic removal and shared launch remain off. No provider calls.', inputSchema: obj({ campaign_id: S, after: S }, ['campaign_id']) },
1037
+ run: (a) => api('GET', `/campaigns/${enc(a.campaign_id)}/removals${qs({ after: a.after })}`),
1038
+ },
1039
+ preview_campaign_removal_setup: {
1040
+ def: { description: 'Free sender reads to review the exact account and campaign/workflow for individual removals. Instantly requires an existing archive_list_id in the same account with auto-enrichment off. All shared campaigns must be paused with feeds off. Saves nothing.', inputSchema: obj({ campaign_id: S, archive_list_id: S }, ['campaign_id']) },
1041
+ run: (a) => api('GET', `/campaigns/${enc(a.campaign_id)}/removal-setup${qs({ archive_list_id: a.archive_list_id })}`),
1042
+ },
1043
+ save_campaign_removal_setup: {
1044
+ def: { description: 'Save reviewed sender removal setup only. Does not activate automatic removal, remove contacts, or start a sender. Pass the exact preview revision and same Instantly archive list. Inspect after an uncertain save.', inputSchema: obj({ campaign_id: S, archive_list_id: S, reviewed_revision: S }, ['campaign_id', 'reviewed_revision']) },
1045
+ run: (a) => api('PUT', `/campaigns/${enc(a.campaign_id)}/removal-policy`, { archive_list_id: a.archive_list_id || null, reviewed_revision: a.reviewed_revision }),
1046
+ },
1047
+ preview_campaign_removal: {
1048
+ def: { description: 'Free exact contact identity and destination review for one retained stop. Missing proof or changed account stays held. A prior attempt is shown for readback, never repeated. Show the contact, account and exact action to the user before requesting removal approval.', inputSchema: obj({ campaign_id: S, target_id: S }, ['campaign_id', 'target_id']) },
1049
+ run: (a) => api('GET', `/campaigns/${enc(a.campaign_id)}/removals/${enc(a.target_id)}/preview`),
1050
+ },
1051
+ apply_campaign_removal: {
1052
+ def: { description: 'Perform one explicitly approved exact contact removal from the reviewed sender destination. Production sender writes require the user\'s exact approval. Persisted claims prevent a second provider request after a timeout or replay. This preserves contacts and does not start outreach. Inspect get_campaign_removals after any uncertain result; never retry automatically.', inputSchema: obj({ campaign_id: S, target_id: S, policy_id: S, reviewed_revision: S, confirm_removal: B }, ['campaign_id', 'target_id', 'policy_id', 'reviewed_revision', 'confirm_removal']) },
1053
+ run: (a) => a.confirm_removal === true ? api('POST', `/campaigns/${enc(a.campaign_id)}/removals/${enc(a.target_id)}/apply`, { policy_id: a.policy_id, reviewed_revision: a.reviewed_revision, confirm_removal: true }) : { ok: false, status: 400, error: { detail: 'Exact removal approval is required.' } },
1054
+ },
1055
+ check_campaign_removal: {
1056
+ def: { description: 'Check an existing sender removal using free reads and save its proof. Never resends a provider mutation. A missing receipt, partial audience or later upload stays held for review. A dated successful receipt does not prove future manual sender changes cannot occur.', inputSchema: obj({ campaign_id: S, target_id: S }, ['campaign_id', 'target_id']) },
1057
+ run: (a) => api('POST', `/campaigns/${enc(a.campaign_id)}/removals/${enc(a.target_id)}/check`),
1058
+ },
1035
1059
  get_campaign_handoff_status: {
1036
1060
  def: {
1037
1061
  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,9 @@ const never = (method, inspectWith, matchFields) => ({
37
37
  });
38
38
 
39
39
  export const MUTATION_POLICIES = Object.freeze({
40
+ save_campaign_removal_setup: reconcile('PUT', ['get_campaign_removals'], ['campaign_id', 'archive_list_id', 'reviewed_revision']),
41
+ apply_campaign_removal: never('POST', ['get_campaign_removals'], ['campaign_id', 'target_id', 'policy_id', 'reviewed_revision']),
42
+ check_campaign_removal: reconcile('POST', ['get_campaign_removals'], ['campaign_id', 'target_id']),
40
43
  save_campaign_ghl_returns: reconcile('PUT', ['get_campaign_ghl_returns'], ['campaign_id', 'credential_id', 'reviewed_revision']),
41
44
  save_campaign_shared_stops: reconcile('PUT', ['get_campaign_shared_stops'], ['campaign_id', 'reviewed_revision']),
42
45
  create_integration: keyed('POST', ['list_integrations'], ['vendor', 'plugin_kind']),