scrapeloop-mcp 0.13.0 → 0.15.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 +27 -1
- package/src/mutation-policies.js +2 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "scrapeloop-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.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
|
@@ -551,7 +551,7 @@ const TOOLS = {
|
|
|
551
551
|
},
|
|
552
552
|
create_scrape_plan: {
|
|
553
553
|
def: {
|
|
554
|
-
description: 'Save a scrape plan into an existing writable Table. Native coverage_mode complete requires start_mode draft, a stable scope_operation_id and no monthly raw-row caps or repeats. It saves the whole scope in restartable batches and
|
|
554
|
+
description: 'Save a scrape plan into an existing writable Table. Native coverage_mode complete requires start_mode draft, a stable scope_operation_id and no monthly raw-row caps or repeats. It saves the whole scope in restartable batches and requires saved shared budgets and the exact complete-plan launch review before Start. Set start_mode to draft to save without starting searches or spending. The default active mode starts approved work and can spend credits or vendor money. Preview the exact choices first and stay within the approved limit and time period. Pass explicit territory values and matching billing limits. Reuse the same idempotency_key after a lost reply, inspect list_scrape_plans and never create a second plan to escape an uncertain result. Over-time limits reset monthly; a total one-time approval does not authorize recurring spend.',
|
|
555
555
|
inputSchema: obj({ ...PLAN_FIELDS, scope_operation_id: { ...S, format: 'uuid' }, target_list_id: { ...S, format: 'uuid' }, start_mode: { ...S, enum: ['active', 'draft'] } }, [...PLAN_REQUIRED, 'target_list_id']),
|
|
556
556
|
},
|
|
557
557
|
run: ({ idempotency_key: _key, ...body }) => api('POST', '/plans', body),
|
|
@@ -582,6 +582,32 @@ const TOOLS = {
|
|
|
582
582
|
}, ['plan_id', 'expected_updated_at', 'goal']) },
|
|
583
583
|
run: ({ plan_id, ...body }) => api('PUT', `/plans/${enc(plan_id)}/ready`, body),
|
|
584
584
|
},
|
|
585
|
+
get_scrape_plan_budget: {
|
|
586
|
+
def: { description: 'Read shared monthly and lifetime lead/verify credit limits, reserved work and remaining allowance. Open holds stay counted across month changes. This makes no provider calls.', inputSchema: obj({ plan_id: { ...S, format: 'uuid' } }, ['plan_id']) },
|
|
587
|
+
run: (a) => api('GET', `/plans/${enc(a.plan_id)}/budget`),
|
|
588
|
+
},
|
|
589
|
+
set_scrape_plan_budget: {
|
|
590
|
+
def: { description: 'Save reviewed credit limits and Table ownership for a paused complete-search plan with a ready-email goal. Include Raw, Email ready and every check Table. One Table belongs to one budget. Preserve expected_revision from the current budget; omit it only for the first save. A lost reply requires readback before retry. This starts no work and does not enable checks. BYOK paid vendors are not supported by these limits. Use review_complete_scrape_plan to check readiness before requesting exact launch approval.', inputSchema: obj({
|
|
591
|
+
plan_id: { ...S, format: 'uuid' }, expected_revision: { ...S, format: 'uuid' },
|
|
592
|
+
limits: obj({
|
|
593
|
+
monthly_lead_credits: { type: 'integer', minimum: 0, maximum: 1000000000 },
|
|
594
|
+
lifetime_lead_credits: { type: 'integer', minimum: 0, maximum: 1000000000 },
|
|
595
|
+
monthly_verify_credits: { type: 'integer', minimum: 0, maximum: 1000000000 },
|
|
596
|
+
lifetime_verify_credits: { type: 'integer', minimum: 0, maximum: 1000000000 },
|
|
597
|
+
allowed_checks: { type: 'array', items: { ...S, enum: ['verify_email', 'verify_catchall', 'verify_phone'] }, maxItems: 3 },
|
|
598
|
+
}, ['monthly_lead_credits', 'lifetime_lead_credits', 'monthly_verify_credits', 'lifetime_verify_credits', 'allowed_checks']),
|
|
599
|
+
list_ids: { type: 'array', items: { ...S, format: 'uuid' }, minItems: 1, maxItems: 20 },
|
|
600
|
+
}, ['plan_id', 'limits', 'list_ids']) },
|
|
601
|
+
run: ({ plan_id, ...body }) => api('PUT', `/plans/${enc(plan_id)}/budget`, body),
|
|
602
|
+
},
|
|
603
|
+
review_complete_scrape_plan: {
|
|
604
|
+
def: { description: 'Read the exact complete-search scope, ready-output goal, Table rules, shared limits and current launch blockers. Free read. This does not start source work, checks or campaigns.', inputSchema: obj({ plan_id: { ...S, format: 'uuid' } }, ['plan_id']) },
|
|
605
|
+
run: (a) => api('GET', `/plans/${enc(a.plan_id)}/launch-review`),
|
|
606
|
+
},
|
|
607
|
+
launch_complete_scrape_plan: {
|
|
608
|
+
def: { description: 'Start or resume a complete native search after explicit approval of the exact reviewed plan, enabled checks and monthly/full-plan limits. This can spend credits. Requires the snapshot hash and updated timestamp from review_complete_scrape_plan, plus one stable operation UUID. A changed plan needs a fresh review. After uncertainty, read the plan and review; preserve the same operation and body. Never use this for sender Start or GHL writes.', inputSchema: obj({ plan_id: { ...S, format: 'uuid' }, operation_id: { ...S, format: 'uuid' }, snapshot_hash: { ...S, pattern: '^[0-9a-f]{64}$' }, expected_updated_at: { ...S, format: 'date-time' } }, ['plan_id', 'operation_id', 'snapshot_hash', 'expected_updated_at']) },
|
|
609
|
+
run: ({ plan_id, ...body }) => api('POST', `/plans/${enc(plan_id)}/launch`, body),
|
|
610
|
+
},
|
|
585
611
|
pause_scrape_plan: {
|
|
586
612
|
def: { description: 'Pause new work from a scrape plan. A job already running may still finish. Inspect the plan and its jobs after pausing.', inputSchema: obj({ plan_id: { ...S, format: 'uuid' } }, ['plan_id']) },
|
|
587
613
|
run: (a) => api('POST', `/plans/${enc(a.plan_id)}/pause`),
|
package/src/mutation-policies.js
CHANGED
|
@@ -44,8 +44,10 @@ export const MUTATION_POLICIES = Object.freeze({
|
|
|
44
44
|
preview_scrape_plan: read(),
|
|
45
45
|
create_scrape_plan: keyed('POST', ['list_scrape_plans'], ['name', 'target_list_id', 'kind']),
|
|
46
46
|
pause_scrape_plan: never('POST', ['get_scrape_plan'], ['plan_id']),
|
|
47
|
+
launch_complete_scrape_plan: reconcile('POST', ['get_scrape_plan', 'review_complete_scrape_plan'], ['plan_id', 'operation_id', 'snapshot_hash', 'expected_updated_at']),
|
|
47
48
|
start_scrape_plan: never('POST', ['get_scrape_plan'], ['plan_id']),
|
|
48
49
|
set_scrape_plan_ready_goal: reconcile('PUT', ['get_scrape_plan_ready_goal'], ['plan_id', 'goal']),
|
|
50
|
+
set_scrape_plan_budget: reconcile('PUT', ['get_scrape_plan_budget'], ['plan_id', 'limits', 'list_ids']),
|
|
49
51
|
estimate_scrape: read(),
|
|
50
52
|
submit_scrape: keyed('POST', ['list_jobs'], ['kind', 'integration_id', 'credential_id', 'table_id']),
|
|
51
53
|
cancel_job: never('POST', ['get_job'], ['job_id', 'status']),
|