scrapeloop-mcp 0.13.0 → 0.14.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.13.0",
3
+ "version": "0.14.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
@@ -582,6 +582,24 @@ 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. Launch remains gated until complete-search pacing and reviewed Start are ready.', 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
+ },
585
603
  pause_scrape_plan: {
586
604
  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
605
  run: (a) => api('POST', `/plans/${enc(a.plan_id)}/pause`),
@@ -46,6 +46,7 @@ export const MUTATION_POLICIES = Object.freeze({
46
46
  pause_scrape_plan: never('POST', ['get_scrape_plan'], ['plan_id']),
47
47
  start_scrape_plan: never('POST', ['get_scrape_plan'], ['plan_id']),
48
48
  set_scrape_plan_ready_goal: reconcile('PUT', ['get_scrape_plan_ready_goal'], ['plan_id', 'goal']),
49
+ set_scrape_plan_budget: reconcile('PUT', ['get_scrape_plan_budget'], ['plan_id', 'limits', 'list_ids']),
49
50
  estimate_scrape: read(),
50
51
  submit_scrape: keyed('POST', ['list_jobs'], ['kind', 'integration_id', 'credential_id', 'table_id']),
51
52
  cancel_job: never('POST', ['get_job'], ['job_id', 'status']),