scrapeloop-mcp 0.21.1 → 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 +1 -1
- package/src/index.js +32 -0
- package/src/mutation-policies.js +4 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "scrapeloop-mcp",
|
|
3
|
-
"version": "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
|
@@ -1024,6 +1024,38 @@ const TOOLS = {
|
|
|
1024
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
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
1026
|
},
|
|
1027
|
+
get_campaign_ghl_returns: {
|
|
1028
|
+
def: { description: 'Review the account-bound receiving address and signed GoHighLevel return counts for a shared journey. A saved address is not live delivery or provider removal proof. Unmatched updates remain saved; missing signed phone identity stays held. Read only.', inputSchema: obj({ campaign_id: S }, ['campaign_id']) },
|
|
1029
|
+
run: (a) => a.campaign_id ? api('GET', `/campaigns/${enc(a.campaign_id)}/ghl-returns`) : { ok: false, status: 400, error: { detail: 'campaign_id is required.' } },
|
|
1030
|
+
},
|
|
1031
|
+
save_campaign_ghl_returns: {
|
|
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
|
+
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
|
+
},
|
|
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
|
+
},
|
|
1027
1059
|
get_campaign_handoff_status: {
|
|
1028
1060
|
def: {
|
|
1029
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.',
|
package/src/mutation-policies.js
CHANGED
|
@@ -37,6 +37,10 @@ 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']),
|
|
43
|
+
save_campaign_ghl_returns: reconcile('PUT', ['get_campaign_ghl_returns'], ['campaign_id', 'credential_id', 'reviewed_revision']),
|
|
40
44
|
save_campaign_shared_stops: reconcile('PUT', ['get_campaign_shared_stops'], ['campaign_id', 'reviewed_revision']),
|
|
41
45
|
create_integration: keyed('POST', ['list_integrations'], ['vendor', 'plugin_kind']),
|
|
42
46
|
add_credential: reconcile('POST', ['list_credentials'], ['integration_id', 'label']),
|