Skip to main content
Glama

Max MCP Server (Digital Crew)

MCP server for Max, the AI sales agent from Digital Crew. Max is built for lead qualification, cold outreach, and pipeline growth—see the product story on max.digitalcrew.tech.

This repo hosts a Next.js app that exposes MCP tools over Streamable HTTP so Max (or any MCP-capable client) can read and update workspace profile settings against the Digital Crew backend API.

What it does

The server registers MCP tools that proxy to the Digital Crew max-agent API.

Generated by pnpm docs:tools — do not edit by hand.

419 tools registered, carrying 445 operations (some rows are grouped tools with several actions). Under the default grouped configuration these are exposed as 35 tools — the operation count is the same either way.

Tool

Purpose

add_campaign_audience_prospects

Add people directly (no list) by prospect_ids, organization_ids and/or stage_keys — at least one required. On an active/paused campaign they START THE SEQUENCE IMMEDIATELY (outreach is sent). Returns enrolled/already_enrolled/reactivated counts and *_truncated flags when the 1000-person cap was hit.

add_deal_line_item

Add an active catalog item (offering_id) to an OPEN deal at an agreed unit_price in the deal's currency, with quantity (default 1) and scope. Returns {data: LineItem}.

add_deal_prospect

Link a prospect to a deal as a contact, with optional role and is_primary. Returns {data: DealContact[]} (all the deal's contacts).

add_prospects_to_list

Add prospects to a prospect list by their UUIDs.

agent_draft_create

Stage an action (e.g. send a nudge, upsert a CRM contact, export a CSV) as a PENDING draft in the workspace for the human to approve. The draft is persisted in max-agent's agent_action_drafts table; nothing runs until the human approves. Returns { draft_id, state:'pending', review_url }. AFTER CREATING, POST THE RETURNED review_url (or a link to the agent drafts view in the workspace UI) TO THE USER'S CHAT CHANNEL SO THEY CAN APPROVE. Use this whenever an agent wants to take a write action on the user's behalf but the user hasn't pre-authorized the specific instance.

agent_draft_get

Fetch one agent action draft by id, including its full payload, current state, audit trail, and any execution result. Use to inspect a specific draft before recommending approve/reject to the user.

agent_draft_list

List agent action drafts in the workspace, optionally filtered by state (pending/approved/rejected/executed/failed/canceled) and/or action_type. Paginated via { limit, cursor }. Returns { data: [...], next_cursor? }. Use to show the user what's awaiting their approval or to audit recently-executed actions.

apollo_add_more

Append more leads to an existing Apollo list (async). Re-runs the saved search for additional results.

apollo_create_list

LAST RESORT: create an Apollo-backed prospect list (async). Use only when getleads_create_list and the Explorium tools cannot serve the request, or the user explicitly asks for Apollo. People search → ingestion. Poll with wait_for_prospect_list.

approve_inbox_draft

Approve a drafted reply and send it in-thread via Unipile, setting the action's status to 'approved'. Optionally pass body to send an edited reply instead of the stored draft. Returns the updated {data: InboxAutopilotAction}. Fails with 404 (draft not found), 409 (action not in 'draft' status), or 400 SendReplyError (code CHAT_NOT_FOUND | ACCOUNT_NOT_FOUND | ACCOUNT_NOT_CONNECTED | NO_PROSPECT_EMAIL | SEND_FAILED).

approve_proposal

Approve a pending proposal and launch its draft campaign. SYNCHRONOUS — max-agent builds the prospect list, creates the campaign, and launches it (may take a while). Optionally pass modifications (titles, target_prospect_ids, campaign_name, campaign_description) to override the recommendation before launch; omit them to approve as-is. On success returns {data: SignalProposal (status 'launched', draft_campaign_id set), campaign_id}. Can fail with 402 (enrichment quota exceeded — proposal reverts to pending), 409 (not pending / already decided / expired), or 422 (no target prospects / no connected account).

archive_campaign

Archive a campaign (soft delete) — hidden from default views but restorable.

archive_chat

Archive a chat (soft delete). Messages remain, use archived=true filter to see them.

attach_campaign_audience_list

Attach a prospect list as included (default) or excluded, also while running. Unless enroll_now=false, an included list's new members are enrolled at once — on an active/paused campaign that starts outreach to them.

attach_campaign_to_intent_trigger

Link an existing campaign to up to 20 intent triggers so a changed signal auto-launches it. Idempotent. Returns {data: {attached, requested}}; 404 if the campaign or none of the triggers are in this workspace.

auto_create_organization_list

Create a saved company (organization) list from unified criteria (async). GetLeads first, Explorium as the fallback; Apollo is never used. Charges credits. Returns a pending list; poll with wait_for_prospect_list.

auto_create_prospect_list

Default way to source new people: create a prospect list from unified criteria (async). Runs GetLeads first and falls back to Explorium only when GetLeads can't express the filters (intent, departments, revenue, keywords) or finds nothing; Apollo is never used. Charges credits. Returns a pending list; poll with wait_for_prospect_list.

automation_activate

Publish the pending draft and arm its trigger — from now on it fires automatically on real records (422 with {details:[{step_id,message}]} if not runnable). A new webhook's one-time token is redacted. Returns {data: WorkflowDetail}.

automation_cancel_run

Cancel a queued or waiting (delayed) run; 409 if it already ran or is running. Returns {data: Run}.

automation_create

Create a workflow (unique name) with a first draft version; nothing fires until automation_activate. Returns {data: WorkflowDetail}.

automation_deactivate

Pause an active workflow: disarms its trigger; versions, runs and counters stay. Returns {data: WorkflowDetail}.

automation_delete

Permanently delete a workflow with all its versions and run history. Returns {data: {deleted: true}}.

automation_discard_draft

Archive the pending draft, keeping the active version (409 if there is no draft; 404 where the draft lifecycle is not enabled). Returns {data: Version}.

automation_get

Get one workflow with its draft_version and active_version documents and webhook_url. Returns {data: WorkflowDetail}.

automation_get_run

One run with per-step states, outputs and errors (403 for document-triggered runs without a member session). Returns {data: Run}.

automation_list

List the workspace's automation workflows with status, trigger, run counters and a summary of the draft/active version. Returns {data: Workflow[]}.

automation_list_runs

A workflow's run log, newest first, 25 per page. 403 if the page includes document-triggered runs (member session required). Returns {data: Run[], count}.

automation_list_versions

Every version of a workflow (draft, active, archived), newest first. Returns {data: Version[]}.

automation_resume

Re-arm a paused workflow's existing active version (never publishes a pending draft). Returns {data: WorkflowDetail}.

automation_run

Fire the workflow once, now, inline — runs the draft if one exists, else the active version — and REALLY executes its actions (tasks, campaign enrolls, webhooks, signature requests). Pass prospect_id for person-scoped manual triggers. Returns {data: Run}.

automation_save_draft

Replace the workflow's draft definition (creates a new draft if the latest version is active; the live version is untouched until automation_activate). Returns {data: Version}.

automation_update

Rename or redescribe a workflow (definition changes go through automation_save_draft). Returns {data: Workflow}.

book_meeting

Create a Cal.com booking and record it as a meeting. event_type_id defaults to the connection's default event type; start is a required ISO8601 UTC time; attendee_name, attendee_email, and attendee_time_zone (IANA) describe the attendee. Optionally pass recurrence_count (recurring event types), prospect_id (advances that prospect to 'replied'), campaign_id, and a flat string metadata map. Returns the created {data: meeting row} (calcom_booking_uid, meeting_url, status 'scheduled', etc.). Fails with 409 (no calendar connected), 400 (invalid body / no default event type), or 4xx/502 CALCOM_ERROR (e.g. slot conflict / instance unreachable).

bulk_create_intent_triggers

Create one monitor per member of a prospect_list_id (first 200) OR per organization_ids, sharing signal_type/platform/frequency/criteria/campaign_ids. Members with no URL for the platform are skipped, not fatal. Returns 201 {data: {created, skipped[{member_id, member_name, reason}], truncated}}; 422 if no member is monitorable or a linked campaign is not launch-ready.

bulk_delete_organizations

Delete multiple organizations. Set deleteProspects=true to cascade-delete linked prospects.

bulk_delete_prospects

Delete multiple prospects by IDs.

bulk_enrich

Queue many prospects and/or organizations for background enrichment by the cron worker (does NOT run inline). Provide prospect_ids and/or organization_ids. Returns {accepted} — how many rows were queued. Use this instead of calling enrich_prospect in a loop when enriching more than a couple of records.

bulk_get_campaign_node_run_counts

Node run counts for up to 100 campaigns in one call: { nodeRunCounts: { campaignId: { nodeId: count } } }. Inaccessible ids and campaigns with no runs are omitted.

bulk_import_organizations

Import multiple organizations. Deduplicates by domain. Returns imported/existing/failed counts.

bulk_import_prospects

Import multiple prospects at once. Deduplicates by email. Returns imported/existing/failed counts.

calendar_status

Return the workspace's Cal.com connection status. Returns {data: {connected: false}} when no instance is connected, or {data: CalendarStatus} (baseUrl, username, label, defaultEventTypeId, eventTypes) when connected. eventTypes may be [] if the instance is currently unreachable. The api_key is never returned.

cancel_meeting

Cancel a recorded meeting by its meetings.id UUID. If the meeting has a Cal.com booking uid it is cancelled on Cal.com first, then the row is marked cancelled. Optionally pass a reason. Irreversible; Cal.com notifies the attendee. Returns the updated {data: meeting row} with status 'cancelled'. Fails with 404 (unknown / not in this workspace), 409 (no calendar connected, only when a Cal.com cancel is needed), or 4xx/502 CALCOM_ERROR.

cancel_meeting_series

Cancel a recurring Cal.com series from one occurrence (meeting_id): scope 'remaining' (this and later occurrences) or 'series' (all), optional reason. Irreversible; Cal.com notifies every attendee. Returns {data: meeting row, meta: {scope, occurrence_count}}; 409 if the meeting is not part of a recurring series.

cancel_warmup

Stop a warm-up at the end of its paid period (no refund; ends immediately if unpaid). resume_warmup undoes a pending cancellation.

claire_deep_research

Multi-source background research on a named person or company. Returns recent activity, news, role context, company highlights, and proof points. Synchronous (may take 30-90s). Call this BEFORE crafting personalized outreach so the message reflects who the prospect actually is.

claire_enrich_person

Resolve one person to their current title, seniority, employer (with headcount), location, dated career history and education — and optionally their work email and phone. COSTS CREDITS ON EVERY CALL, including when nothing is found: narrowing sections changes what comes back, not what it costs, so do not call this to browse or to check whether someone exists. Identify them with a LinkedIn URL, a work email, or a name PLUS a company or domain; a bare name is refused, because it matches the wrong person and is billed anyway. Add 'contact' to sections only when you intend to reach out — it runs a paid email/phone waterfall on top of the profile. Known gaps: skills is usually empty and there is no buyer-intent data, so do not retry hoping to fill them.

claire_extract_prospects_from_url

Fetch a public URL (conference attendee list, team / about page, press release, panel announcement, etc.) and extract structured prospects (people / contacts) from it via Claire. Returns { prospects:[{ name, title, company, linkedin_url?, email?, ... }], source_url, extracted_count, claire_request_id? }. Use when the user pastes a URL and asks to 'find leads here' / 'build a list from this page'. Pair with create_prospect or import_prospect_list_csv to persist the result.

claire_find_competitors

Identify direct competitors of a company by URL. Returns a list of competing companies with descriptions and sources. Synchronous (typically 1-3 min). Use to expand a prospect list with similar companies or to ground competitive positioning in outreach.

claire_market_watch

Run a market-watch pass on a URL, optionally filtered by criteria (e.g. 'pricing', 'hiring', 'funding'). Returns a snapshot of detected signals. Use to inform outreach timing (e.g. just-funded companies) or to spot competitive moves.

claire_search

Free-text research query against Claire's hub. Use for quick lookups like industry trends, funding news, or any topic where you'd otherwise google. Synchronous — waits for Claire to finish and returns the result. Use mode='lite' for fast first-pass (default), 'full' for deeper multi-source.

clear_failed_requests

Drain the dead-letter queue. Returns the number of entries removed. Use after manually replaying or after resolving the upstream issue.

confirm_meeting

Accept a pending Cal.com booking request (status 'pending' in get_upcoming_meetings) by meeting_id. Cal.com notifies the attendee. Returns {data: meeting row} with status 'scheduled'; 409 MEETING_LIFECYCLE_CONFLICT if the meeting is not pending.

connect_calendar

Connect the workspace's self-hosted Cal.com instance so Max can read availability and book meetings. Validates the credentials by calling Cal.com listEventTypes before storing them. Pass base_url (the instance API base, e.g. https://cal.example.com or .../api/v2), api_key, and optionally default_event_type_id. Returns {data: CalendarStatus} with connected:true, baseUrl, username, label, defaultEventTypeId, and the list of eventTypes. The api_key is never returned.

create_calendar_event

Create an event directly on a synced Google/Outlook calendar (account_id; primary calendar unless calendar_id). Needs title and start_at (timed) or start_date (all-day); optional end_at/end_date, time_zone, body, location, attendees, recurrence. The provider may email invitations to attendees. Returns {data: provider event} whose id is the event_id for update/delete. For a Cal.com booking use book_meeting instead.

create_campaign

Create a new campaign in draft state. Requires name, included_lists, and accounts. Won't send until launched.

create_campaign_share_link

PUBLISHES the campaign: enables an 'anyone with the link' URL (/share/) viewable without login. Re-enables the same token if one existed. Owner or workspace admin only; confirm with the user first.

create_deal

Create a native Max deal. Requires name; defaults to the default pipeline's first open stage and EUR. prospect_ids links contacts (first = primary; required if created in a won stage). Returns {data: Deal}.

create_deal_pipeline

Create a deal pipeline seeded with the default stages (max 10 per workspace). Returns {data: Pipeline}.

create_deal_stage

Add a stage (column) to a deal pipeline (max 24): label, optional color, type, win_probability, position. Returns {data: Stage}.

create_deal_stage_rule

Add an entry rule to a deal stage: rule_action notify, assign or enroll_campaign (enrolls the deal's primary contact in a campaign, which sends outreach) with matching config. Returns {data: Rule}.

create_icp

Save a new ICP. Only name is required; criteria/profile can be filled later. 409 code name_taken on a duplicate name. Returns {data: Icp}.

create_intent_trigger

Set up a monitor that watches for a buying signal (funding, hiring, tech_stack, news, job_change, topic, or custom): either a specific target_url, or a person/organization's stored profile on a platform. Optionally set the re-poll frequency and campaigns to auto-launch when it fires. Returns the created {data: IntentTrigger}.

create_linkedin_prospect_list

Create a list filled by a people search run on a connected LinkedIn account (classic or Sales Navigator). No credits; no emails/phones returned. Async: returns the pending list — poll wait_for_prospect_list.

create_mailpool_order

CHARGES THE WORKSPACE: buys domains and pre-configured sending mailboxes from Mailpool (real supplier purchase; not reversible). Confirm domains, mailboxes and price with the user first (search_mailpool_domains, get_mailpool_pricing). Never retry blindly: on an error or timeout check list_mailpool_orders first. Returns {order_id, status, tokens_charged, warning}.

create_organization

Create a new organization/company record.

create_organization_share_link

PUBLISHES the organization: enables an 'anyone with the link' URL (/share/) viewable without login. Re-enables the same token if one existed. Owner or workspace admin only; confirm with the user first.

create_people_share_link

PUBLISHES the workspace's ENTIRE People database: anyone with the link (/share/{token}) can view it (contact details masked). Creates or re-enables. Admin only.

create_prospect

Create a single prospect. Deduplicates by email — returns existing row if email already exists.

create_prospect_intelligence_watchers

Ask Claire to propose recurring research watchers for a prospect and create up to 4 (as claire profile hooks, deduped against existing). Runs a Claire search (~2 min); later hook runs charge credits. 409 if a run is already in progress.

create_prospect_list

Create an empty platform prospect list. To source NEW leads into a list use auto_create_prospect_list (GetLeads → Explorium), or pin a provider in this order: getleads_create_list, then explorium_create_list, then apollo_create_list as a last resort.

create_prospect_list_share_link

PUBLISHES the list publicly: anyone with the link (/share/{token}) can view its prospects (contact details masked). Creates or re-enables the same token. List owner or admin only. Also the way to copy a list into ANOTHER Max workspace: the user opens the link while signed into that workspace and clicks Import.

create_prospect_profile_hook

Create a recurring watcher on a prospect (scrapecreators social posts, fullenrich contact refresh, or claire research). Each scheduled run may charge credits. Results land in list_prospect_profile_activities.

create_prospect_share_link

PUBLISHES the prospect publicly: anyone with the link (/share/{token}) can view it (contact details masked). Creates or re-enables the same token. Owner or admin only.

create_sales_catalog_field

Define a custom catalog field (max 50): key, label, type text|number|boolean|date|select, kind product|service|both, options (required for select only). Returns {data: Field}.

create_sales_catalog_item

Create a catalog product/service: name, kind; optional description, status draft|active|archived (default draft; only active can go on deals), unit_price+currency (both or neither), unit_label, attributes. Returns {data: Offering}.

create_saved_view

Save a named view (filters, sorting, columns, page size) on a list surface; appended as the last tab. 409 code name_taken on a duplicate name. Returns {data: SavedView}.

create_schedule_preset

Save a scheduling_config under a name so later campaigns can reuse it. Names are unique per workspace. Set is_default to pre-fill it on new campaigns. Applying a preset copies it — later edits never retime a running campaign.

crm_assign_prospects

Assign prospects to HubSpot owners using agent_settings.assignment_rules (or assignment_rules_override). First matching rule wins; no match → owner_id null, reason 'no rule matched', priority 'low'. Priority otherwise derives from prospect.score (>=75 high, 50–74 med, <50 low) else 'med'. Returns { assignments: [{ id|email, owner_id, owner_name, owner_email, reasoning, priority }] }.

crm_detect_forecast_changes

Compare current open HubSpot deals against the workspace's deal snapshot from window_days ago (read from max-agent's crm_deal_snapshots via GET /api/v1/crm/deal-snapshots). Flags amount changes (abs delta pct > threshold), stage moves (forward/backward via pipeline displayOrder), close-date slips (> threshold days), new deals since last snapshot, and deals that disappeared. Returns { window_days, baseline_iso, current_iso, changes:[{ deal_id, dealname, owner_id, owner_name, amount, prior_amount, amount_delta_pct, stage, prior_stage, stage_movement, close_date, prior_close_date, close_date_slip_days, flag_reasons[] }] }.

crm_export_import_csv

Build a HubSpot-import CSV (base64-encoded) from prospects. When dedup_against_hubspot (default true), drops prospects whose email already exists in HubSpot (concurrency <=5). Columns: Email, First Name, Last Name, Job Title, Company, Company Domain, Country, Industry, Number of Employees [, HubSpot Owner ID when include_assignment]. Returns { csv_base64, row_count, deduped_count, deduped:[{ email, existing_id }] }.

crm_get_contact

Fetch a single CRM contact by email (the dedup identity). Returns {data: contact} or {data: null} if not found.

crm_get_deal

Fetch a single HubSpot deal by id, including its full properties and associated company/contact ids. Returns null if not found.

crm_list_activities

List HubSpot engagements (call/email/meeting/note/task) with optional filters (deal, contact, owner, types, since). Per-type queries are merged sorted by timestamp desc. Returns id, type, timestamp, ownerId, dealId, contactId, subject, body.

crm_list_deals

List deals from HubSpot with optional filters (stage, owner, pipeline, amount range, close-date range, modified-after). Returns id, dealname, amount, ownerId, stage, pipeline, closeDate, lastModified, lastActivityDate, nextStep, associated company/contact ids.

crm_list_owners

List HubSpot owners (sales reps) for the workspace. Returns id, email, firstName, lastName, teams. Use to map deals/assignments to people.

crm_list_pipeline_stages

List deal pipeline stages (optionally scoped to one pipeline). Returns id, label, displayOrder, pipelineId, isWonStage, isLostStage.

crm_pipeline_risk_scan

Scan open HubSpot deals for risk: days inactive, days-to-close, missing fields (amount/owner/next_step/last_activity), close-date slipping, and high-value-low-activity. Computes a transparent weighted risk_score (0–100) and a PRIVATE suggested nudge draft to the owner (never sent). Uses agent_settings.risk_thresholds. Returns { scanned_count, flagged:[...] }.

crm_score_prospects

Score prospects 0–100 against the workspace ICP rules (agent_settings.icp_rules): country 25, industry 25, employee-in-range 20, any title keyword 30. With no rules configured, every prospect scores 50 (reason no_icp_rules_configured). Returns { scored: [{ id|email, score, matched[], missed[] }] }.

crm_search_contacts

Search the connected CRM (HubSpot) for contacts by free text (name, email, company). Returns {data: contacts[]}. Use before creating a contact to check if one already exists.

crm_status

Report whether HubSpot is connected for this workspace. Returns { connected: bool, provider, connections: [{ provider, portal_id, connected_at, last_refresh_at }] }.

crm_upsert_company

Create-or-update a company in the connected CRM, matched by domain — never creates a duplicate. Requires a read + write HubSpot connection.

crm_upsert_contact

Create-or-update a contact in the connected CRM, matched by email — never creates a duplicate. Use when the user asks to add or update a contact in HubSpot. Requires a read + write HubSpot connection.

crm_weekly_brief_compose

Compose a structured weekly sales brief from last week's activities, current open deals, the pipeline risk scan, and per-rep aggregates. Pure data (no writes). Returns { week_ending, last_week_summary, this_week_priorities, stale_deals, deals_without_next_step, top_risks, per_rep_questions, suggested_bj_notes, action_items }. Pass the result to notion_publish_weekly_brief to draft it in Notion.

decline_meeting

Reject a pending Cal.com booking request by meeting_id, with an optional reason. Irreversible; Cal.com notifies the attendee. Returns {data: meeting row} with status 'rejected'; 409 if the meeting is not pending.

delete_calendar_event

Delete an event from a synced Google/Outlook calendar by event_id + account_id. Irreversible; the provider may notify attendees. Returns {success: true}; 404 if the event is not found.

delete_campaign

Permanently delete a campaign and all its workflow executions. Prefer archive for soft removal.

delete_deal

Permanently delete a deal, its line items and attached files. Irreversible. Fails (500) if documents are linked to it. Returns {success: true}.

delete_deal_attachment

Permanently delete a file attached to a deal. Irreversible. Returns {success: true}.

delete_deal_pipeline

Permanently delete an EMPTY deal pipeline; 409 pipeline_in_use if it holds deals (archive it instead). The last pipeline can't be deleted. Returns {success: true}.

delete_deal_stage

Delete a custom deal stage (default stages can't be). If it holds deals, pass reassignTo (a stage in the same pipeline) or it 409s reassign_required. Returns {success: true}.

delete_deal_stage_rule

Delete a deal stage entry rule. Returns {success: true}.

delete_icp

Permanently delete an ICP and its record links (searches it produced are kept). Prefer update_icp status=archived. Returns {data: {id}}.

delete_organization

Delete an organization. Linked prospects get organization_id = null.

delete_prospect

Delete a prospect permanently.

delete_prospect_list

Delete a prospect list (prospects themselves are NOT deleted).

delete_prospect_profile_hook

Delete a profile hook permanently.

delete_saved_view

Permanently delete a saved view (creator or signed-in admin only). Records are untouched. Returns {data: {id}}.

delete_schedule_preset

Delete a saved schedule. Campaigns keep their own copy, so this never changes how an existing campaign sends.

detach_campaign_audience_list

Detach a prospect list from a campaign. People it already enrolled stay in — use remove_campaign_audience_prospects to stop them.

disable_trigger

Disable an intent trigger (sets active=false) so it stops re-polling. Returns the updated {data: IntentTrigger}, or a 404 error if the trigger is not in this workspace.

disconnect_account

Disconnect a LinkedIn or email account from the workspace. Use hosted_auth_link to reconnect.

disconnect_data_supplier

Revoke the workspace's stored key for a data supplier; searches stop using it until a human reconnects it. Returns {data: {provider, connected: false}}.

disconnect_synced_calendar_account

Disconnect a synced Google/Outlook calendar account by account_id (any member's, not only yours) and stop syncing it. Destructive: only the owner can reconnect it, by signing in again in the app. Returns {success: true}.

dismiss_duplicate_pair

Mark a duplicate pair as not-a-duplicate so it leaves the pending queue. Records are untouched. Returns {success: true}.

duplicate_campaign

Copy a campaign into a new draft (workflow, scheduling, exclusions, lists, accounts). Run history, enrolled people and sharing are not copied. Returns { campaign }.

enrich_contact_details

Find emails/phones (optionally LinkedIn URLs) for prospect_ids or a whole list_id via FullEnrich (default) or Explorium; results are written onto the prospects. CHARGES CREDITS (402 if insufficient) — run preview_enrichment first for the cost. Async: returns 202 {job_id, job_ids, status, total}; poll get_contact_enrichment_job.

enrich_organization

Run Claire deep-research on an organization and save the result onto the record. SYNCHRONOUS — waits for Claire (may take 30-180s) and returns {status} ('complete' with the research, 'skipped' if the org has no name, or 'busy' if another enrichment is already running). Counts against the workspace's daily enrichment quota; returns a 429 quota error when exhausted. Set force=true to re-enrich an already-complete record.

enrich_prospect

Run Claire deep-research on a prospect and save the result onto the record. SYNCHRONOUS — waits for Claire (may take 30-180s) and returns {status} ('complete' with the research, 'skipped' if the prospect has no name, or 'busy' if another enrichment is already running). Counts against the workspace's daily enrichment quota; returns a 429 quota error when exhausted. Set force=true to re-enrich an already-complete record. Call this BEFORE crafting personalized outreach.

enrich_prospect_with_claire

Resolve one prospect through Claire and fill missing/wrong fields (conflicts saved as alternates). CHARGES CREDITS on every lookup, even a miss; a complete record returns skipped:true free. 402 = insufficient credits. Synchronous, up to ~2 min.

explorium_add_more

Append more leads to an existing Explorium list (async). Re-runs the saved search for additional results. Poll the list (or use wait_for_prospect_list) for progress.

explorium_create_company_list

Create an Explorium-backed company (organization) list (async). Prefer auto_create_organization_list, which tries GetLeads first; use this to pin Explorium for revenue, age, tech-stack or intent filters. Business search → enrichment → ingestion. Returns a pending list; poll with wait_for_prospect_list.

explorium_create_list

SECOND CHOICE after getleads_create_list: create an Explorium-backed prospect (people) list (async). Use when GetLeads can't express the filters (buyer intent, departments, revenue, website keywords, enrichments) or returned nothing. People search → enrichment → ingestion; ~100× GetLeads' cost. Returns a pending list; poll with wait_for_prospect_list.

generate_icp

Draft an ICP with Max from a free-text brief (or refine icp_id). CHARGES workspace credits; slow (up to ~90s). Returns an UNSAVED {data: {draft, model, truncated}} — save it with create_icp/update_icp and source='max'.

generate_message_preview

Use AI to generate a personalized message for a prospect. Charges credits. Specify channel and prompt.

generate_workflow

Use AI to generate a campaign workflow from natural language. Charges credits. Provide a prompt or structured fields.

generate_workspace_intel

Have Max scan the workspace's People and Organization cards and write a workspace intel report, OVERWRITING the saved one. CHARGES workspace credits; slow (up to ~2 min). 422 if there are no cards. Returns {data: WorkspaceIntel}.

get_account

Get full details of a connected account — provider, channel, config, sync status.

get_account_rate_limits

Get daily/weekly sending limits and current usage for a specific account.

get_agent_session_messages

Read one of the caller's Max chat threads, oldest message first (first 500). Returns {data: {session, messages}}.

get_analytics_overview

Workspace analytics for a period, optionally filtered by campaign_ids/account_ids: totals and rates per channel (email, LinkedIn, WhatsApp, mail, meetings), by_campaign, by_account, prospect_lists, deals, crew, signals, funnel, previous-period totals (when from is set) and a daily timeseries. Large payload — narrow the period.

get_availability

Fetch open booking slots for an event type, grouped by date. event_type_id defaults to the connection's default event type; start defaults to now and end to now + 14 days; time_zone is an optional IANA string to localize slots. Returns {data: {eventTypeId, slotsByDate: {: [{start, end?}]}}}. Fails with 409 if no calendar is connected, or 400 if no event type id is available.

get_campaign

Get full details of a campaign by ID — workflow, scheduling, accounts, prospect lists, stats.

get_campaign_ab_tests

Every email step testing 2+ variants: weights, live traffic share, per-variant sent/open/click/reply/bounce rates and a verdict (collecting/inconclusive/winner with confidence). Empty tests[] when none run.

get_campaign_audience

Lists the campaign draws from (included/excluded, live member count, pending_count not yet enrolled) plus a rollup: in_campaign, active, finished, removed, manual, pending_from_lists. Also says whether the audience is editable and enrolls immediately.

get_campaign_engagement_summary

Engagement summary for a campaign: open/click/reply/bounce rates plus per-link click detail (top links, distinct URLs clicked).

get_campaign_feed

Most recent workflow steps executed in a campaign, newest first: node, action_type, status, error_message, prospect. limit default 20, max 100.

get_campaign_launch_preflight

Before launch: how many people in the audience at least one sequence step can reach. Returns { audience, reachable, unreachable, required_channels, segments } (segments keyed by channel combo, e.g. 'email+linkedin').

get_campaign_lead_analytics

Per-prospect breakdown — where each lead is in the workflow and message event history.

get_campaign_memory

Read Max's durable memory for a campaign (ICP, decisions, notes). Recall this when working on one of several simultaneous campaigns so you keep them straight.

get_campaign_node_run_counts

Map of workflow node ID → execution count. Useful for funnel visualization.

get_campaign_share_link

Read a campaign's public share link: { data: { token, enabled, view_count, ... } | null }. Public URL is /share/. Owner or workspace admin only.

get_campaign_stats

Aggregate performance stats — email open/reply rates, LinkedIn connection/reply rates, execution counts.

get_channel_sync_rules

Get one account's Unibox history-import rules. No rules = import everything.

get_chat

Get full details of a single Unibox chat/conversation thread.

get_circuit_status

Inspect the circuit-breaker state for each upstream host the MCP server has called. Shows whether requests are being fast-failed (state=open), probing (half-open), or flowing normally (closed).

get_contact_enrichment_job

Status of a contact-enrichment job: {job_id, status (pending|processing|completed|failed), total, enriched_count, error_message}. Poll until completed or failed, then re-read the prospects.

get_current_workspace

Return the Max workspace this connection reads and writes: {data: {workspace_id, workspace_name, auth_method, scopes}}. A Max API key reaches exactly ONE workspace; no tool can act in another. Check this before writing when the user names a workspace. If it differs: to copy a prospect list there, use create_prospect_list_share_link and have the user open the link while signed into the target workspace and click Import; to work there directly, the user connects that workspace's Max MCP key (Settings → API keys in that workspace).

get_dashboard_kpis

Workspace-wide aggregate stats — execution counts, email/LinkedIn rates, completion percentage.

get_data_quality_settings

Read the workspace's duplicate auto-merge policy. Returns {data: {auto_merge_enabled, auto_merge_threshold_percent}}.

get_deal

Get one native deal by deal_id with its organization and linked contacts (each omitted if the key lacks organizations:read / prospects:read). Returns {data: Deal}.

get_deal_board_totals

Per-stage totals for one deal pipeline, optionally filtered by status/owner_id/organization_id/search. Returns {data: {: {count, sums: [{currency, amount, weighted}]}}}; weighted = amount × probability.

get_email_tracking_events

Raw per-event email tracking rows for a prospect (opens, clicks, replies, bounces) with url/ip/user_agent detail. Newest first. Optionally filter by event_types.

get_email_verification_job

Status of an email-verification job: {job_id, status (pending|processing|completed|failed), total, error_message}. Poll until completed, then read verdicts from the prospects.

get_enrichment_credits

Return the workspace's daily enrichment quota usage: {cap, used_today, remaining}. Check this before a large bulk enrichment to confirm there's headroom.

get_enrichment_status

Check the enrichment state of a single prospect or organization. Provide exactly one of prospect_id or organization_id. Returns {enrichment_status, enrichment_updated_at, has_research}.

get_entity_analytics

360° analytics for one person (prospect) or organization over a period: touch totals per channel, meetings, by_campaign enrollment, linked deals, by_contact (organizations), daily timeseries and comparison totals. 404 if not in this workspace.

get_icp

Get one ICP by id with its criteria, profile and stats. Returns {data: Icp}.

get_inbox_autopilot_status

Return the workspace's current inbox autopilot setting: {enabled, mode ('auto_safe'|'draft_all'|'off'), daily_cap}. Use this to confirm whether autopilot is active and how it is configured before changing it or reviewing drafts.

get_inbox_placement

Get one inbox placement check: {check, result} with placement per provider and per seed inbox once completed (result null until then).

get_link_click_details

Link clicks for a campaign grouped by url, with total click counts and unique-prospect counts. Sorted by clicks desc.

get_mailpool_pricing

Monthly price per done-for-you mailbox (USD and credits) for Google and Microsoft, and whether purchasing is enabled.

get_organization

Get full details of an organization — domain, industry, employee count, funding, social URLs.

get_organization_geo_points

The workspace's organizations geocoded from city/country to lat/lng: { points: [{ id, name, city, country, lat, lng, precision }], capped }. Ungeocodable ones are omitted; capped=true means the list was truncated.

get_organization_geo_stats

Geographic distribution of the workspace's organizations: { total, located, byCountry: [{ country, count }], byCity: [{ city, country, count }] }.

get_organization_share_link

Read an organization's public share link: { data: { token, enabled, view_count, ... } | null }. Public URL is /share/. Owner or workspace admin only.

get_people_share_link

Get the public share link of the workspace's whole People database {token, enabled, view_count} or null. Admin only.

get_prospect

Get full profile of a prospect — name, title, company, LinkedIn, email, location, enrichment data.

get_prospect_campaign_activity

Chronological log of message events for a prospect across all campaigns (newest first).

get_prospect_engagement_timeline

Chronological email engagement timeline for a prospect (oldest first) — every open, click, reply, and bounce.

get_prospect_list

Get full details of a prospect list by ID — status, search config, result counts, timestamps.

get_prospect_list_share_link

Get a list's public share link {token, enabled, view_count} or null. List owner or admin only.

get_prospect_qualification

Qualification derived from the prospect's latest confirmed meeting transcript. Returns {state: available|needs_confirmation|no_meeting, meeting, qualification}. API keys need prospects:read AND workspace:read.

get_prospect_share_link

Get a prospect's public share link {token, enabled, view_count} or null. Owner or admin only.

get_sales_workspace

Read-only map of the sales setup (lists, campaigns, signals, people/deal pipelines and stages, stage rules, meetings) as {nodes, edges, notices, updatedAt}. limit caps each source (1-100, default 50).

get_saved_view

Get one saved view by id. Returns {data: SavedView}.

get_signal_history

Return the detected SignalEvent rows for a single trigger — each event records whether the poll found changes, a summary, and the raw scrape. Returns {data: SignalEvent[]}.

get_signal_proposal

Fetch a single signal proposal by id, including its full recommendation (campaign name/description, workflow_config, target_prospect_ids, estimated contacts/credits, matched ICP, and entity). Returns {data: SignalProposal}, or a 404 error if not found.

get_team_calendar_availability

Per-member free/busy from the workspace's synced Google/Outlook calendars (not Cal.com); books nothing. Free time counts only inside working hours (start_hour/end_hour/days/time_zone, default 09-18 Mon-Fri UTC); is_available = longest free run >= min_free_minutes. Returns {data: {window, members: [{user_id, name, has_calendar, stale, free_minutes, busy_blocks, next_free_at, is_available, ...}]}}.

get_unibox_message

Get one Unibox message's full body as plain text: {id, chat_id, subject, text}. Private messages return 404.

get_unibox_sync_progress

Live state of the Unibox history import: per-account phase and counters plus a summary. Cheap; poll while sync_unibox runs.

get_upcoming_meetings

List upcoming meetings (excluding cancelled/rejected) ordered by start time ascending. from defaults to now and to defaults to now + 30 days (both ISO8601). Returns {data: meeting row[]} (status one of pending|scheduled|rescheduled|completed|no_show; pending = awaiting confirm_meeting / decline_meeting).

get_warmup_deliverability

Warm-up health of every done-for-you mailbox, read live from Mailpool: status, health score, inbox rate, landed-inbox/spam totals and a daily series.

get_warmup_pricing

Warm-up price per mailbox (daily credits/USD, monthly USD) and whether purchasing is enabled.

get_workspace_agents

Read the workspace's agent configuration (soul, system prompt overrides, knowledge, skill switches per agent) plus shipped baselines and the caller's access. Read-only via API key. Returns {data: {config, access, baselines}}.

get_workspace_profile

Fetch workspace profile settings (company info) for the authenticated workspace via DigitalCrew API. Uses the MCP connection Authorization: Bearer token when set.

get_workspace_wallet

Read the workspace's token balances: pooled wallet, owner balance, spendable total and caller contribution. Returns {data: {wallet_balance, owner_balance, spendable, …}, billingEnabled}.

getleads_add_more

Append more contacts to a COMPLETED GetLeads list (async), re-running its saved filters from the next offset. Charges credits per contact returned. Poll with wait_for_prospect_list.

getleads_create_list

FIRST CHOICE for sourcing new people: create a GetLeads-backed prospect list (async). Needs at least one targeting filter (job_titles, seniority, countries, industries or domains). Returns a pending list; poll it with wait_for_prospect_list. Charges credits per contact returned. Use Explorium only for buyer intent, departments, revenue or keywords, or when GetLeads returns nothing.

hosted_auth_link

Generate a short-lived URL for the user to connect a LinkedIn or email account via Unipile hosted auth.

import_prospect_list_csv

Create a new prospect list and import prospects in one call. Each row needs an email (for dedup).

launch_campaign

Launch a draft campaign — transitions draft → active and creates workflow executions for each prospect.

link_icp

Mark a deal, organization or prospect as matching an ICP, with optional fit_score (0-100) and rationale. Upserts: re-linking updates the existing link. Returns {data: IcpLink}.

linkedin_cancel_invitation

Cancel/withdraw a sent LinkedIn invitation by its invitation_id (from list_invitations_sent).

linkedin_comment_on_post

Comment on a LinkedIn post.

linkedin_create_post

Create a LinkedIn post from the connected account.

linkedin_find_profile

Find a LinkedIn profile by name, company and/or title. Searches LinkedIn directly — always use this before any invitation or message. If multiple people share the name, returns candidates with ambiguous:true; show them to the user and ask which one. Never guess a slug or proceed when ambiguous.

linkedin_get_all_messages

Get all recent LinkedIn messages across all conversations.

linkedin_get_company_profile

Get a LinkedIn company profile by its identifier or slug.

linkedin_get_conversation_messages

Get messages in a specific LinkedIn conversation.

linkedin_get_own_profile

Get the profile of the connected LinkedIn account. Useful to confirm the account is active.

linkedin_get_profile

Get a full LinkedIn profile by slug (public identifier). Returns provider_id and profile data.

linkedin_get_user_posts

Get recent posts by a LinkedIn user.

linkedin_list_connections

List first-degree LinkedIn connections of the connected account.

linkedin_list_conversations

List LinkedIn conversations (inbox).

linkedin_list_invitations_received

List pending LinkedIn invitations received from others.

linkedin_list_invitations_sent

List pending LinkedIn invitations you have sent.

linkedin_react_to_post

React to a LinkedIn post.

linkedin_reply_in_chat

Reply in an existing LinkedIn conversation.

linkedin_search_people

Search LinkedIn for people by keywords.

linkedin_send_invitation

Send a LinkedIn connection request. ALWAYS call find_profile first to get provider_id.

linkedin_send_message

Send a LinkedIn direct message to start a new conversation. Requires existing connection or InMail credits.

list_account_shares

List the other workspaces a connected account is shared with (they see its live conversations). Returns share rows with the campaign/direct conversation flags.

list_accounts

List all connected LinkedIn and email accounts — name, email, status, daily limits.

list_agent_sessions

List the caller's own Max chat threads (API key: its owner's), most recent first, for one surface (default max_chat). Returns {data: AgentSession[]}.

list_campaign_audience_prospects

Paginated people in a campaign with enrollment status, source (list/manual) and workflow execution status. Filter by search, enrollment_status, source. Returns { data, count, page, pageSize }.

list_campaign_conversations

Newest-first feed of every Unibox message the campaign sent/received (chat_id, direction, subject, preview, status) merged with its physical letters (delivery status). Returns { data: { items, counts } }.

list_campaigns

List all outreach campaigns. Filter by status, search by name, paginate and sort.

list_chat_messages

Get all messages in a conversation — body, direction (in/out), timestamp, status.

list_chats

List LinkedIn and email conversations — filter by channel, prospect, account, or archived status.

list_conversation_analytics

Conversation-intelligence rollup of analyzed meetings in a period: {data: {totals (analyzedConversations, averageScore, averageInternalTalkPct, objectionRatePct, highRiskDeals), forecast, benchmarks per rep, trackerTrends, dealRisks, coachingLibrary}}.

list_crew_rates

List hourly rates and commission for the workspace default, members and digital workers. Returns {data: [{subject_type, subject_id, label, currency, hourly_rate, commission_pct, default_action_minutes, weekly_capacity_hours}]}.

list_custom_fields

List the workspace's custom field definitions, optionally for one entity_type (prospect, organization, deal). Returns {data: [{id, entity_type, key, label, field_type, options, is_required, default_value, position, is_archived}]}.

list_data_suppliers

List the bring-your-own-key data suppliers (getleads, explorium, apollo) with enabled flag, status (active/revoked/error) and saved default config. Never returns keys. A disconnected supplier can still show connected=true — trust status. Returns {data: DataSupplier[]}.

list_deal_attachments

List files attached to a deal — metadata only (file_name, mime_type, size_bytes, created_at, derivation status); no file contents. Returns {data: Attachment[]}.

list_deal_line_items

List a deal's product/service line items (snapshots, including removed ones with removed_at set). Returns {data: LineItem[]}.

list_deal_pipelines

List deal pipelines with their ordered stages (id, label, type open/won/lost, win_probability, rule_count). Seeds the default pipeline on first use. Returns {data: Pipeline[]}.

list_deal_stage_events

A deal's stage-change history, newest first. Returns {data: [{from_stage_id, to_stage_id, amount_at_change, changed_by, changed_at}]}.

list_deal_stage_rules

List a deal stage's entry-automation rules (run whenever a deal enters the stage). Returns {data: Rule[]}.

list_deals

List deals in Max's native pipeline (not HubSpot — that is crm_*). Filter by pipeline_id, stage_id, status, owner_id, organization_id, prospect_id, search or close-date window; paginate/sort. Returns {data: Deal[], count, page, pageSize}.

list_digital_workers

List the workspace's digital workers (AI crew members) with status, role, access mode and permissions. Returns {data: DigitalWorker[]}.

list_duplicate_records

List pending duplicate pairs for prospects (default) or organizations, each with match_type, confidence and a summary of both records. Returns {data: Pair[], counts} (pending counts per match type). Merging is a human action in the app.

list_failed_requests

Inspect the dead-letter queue — write requests (POST/PATCH/DELETE) that exhausted all retries. Useful for forensics or manual replay. Backed by Redis if REDIS_URL is set, otherwise an in-memory ring buffer of up to 500 entries.

list_icp_links

List the deals, organizations and prospects an ICP claims. Returns {data: IcpLink[]} (entity_type, entity_id, entity_label, fit_score, rationale, linked_by).

list_icps

List the workspace's Ideal Customer Profiles (default first). Filter by status (default active) or name search. Returns {data: Icp[]} with criteria, profile and stats (linked deals/organizations/prospects, searches run).

list_icps_for_record

Reverse lookup: which ICPs claim this deal, organization or prospect. Returns {data: IcpLink[]} including icp_name.

list_inbox_drafts

List the autopilot-generated reply drafts awaiting review (status='draft') for the workspace, newest first. Returns {data: InboxAutopilotAction[]}, each row including intent, sentiment, confidence, and the proposed reply_body. Review these before calling approve_inbox_draft or reject_inbox_draft.

list_inbox_placements

List inbox placement (spam) checks run on the workspace's done-for-you mailboxes, newest first: status, score, inbox/spam/promotions counts. results inlines the full result of the N latest completed checks.

list_intent_signals

List the workspace's intent triggers (optionally filtered by active state) so you can see what is being monitored and review recent signal activity. Returns {data: IntentTrigger[]}, each row including last_run_at and last_error. Use get_signal_history to drill into the detected events for a specific trigger.

list_mailpool_domains

List domains this workspace already bought through done-for-you setup, with Mailpool status, so new mailboxes can reuse them.

list_mailpool_orders

List the workspace's done-for-you email setup orders: domains, mailboxes, provisioning status and billing.

list_organizations

List all organizations/companies — search by name or domain, filter by industry/country.

list_prospect_campaigns

Campaigns a prospect is enrolled in: campaign name/status, enrollment status, source, added/removed dates, next scheduled step.

list_prospect_list_member_ids

IDs of every list member matching filters, unpaginated, for bulk actions. Returns {ids, count, truncated} (ids capped at limit).

list_prospect_list_members

List all prospects in a specific list — paginated, searchable, sortable.

list_prospect_list_organizations

List companies in an organization-type list (search_type=organizations). Paginated, searchable. Returns {data: Organization[], count}.

list_prospect_lists

List all prospect lists — name, status, result counts, and search criteria.

list_prospect_profile_activities

Stored social/profile activity timeline for a prospect (posts, contact changes, research found by profile hooks), newest first.

list_prospect_profile_hooks

Recurring watchers on a prospect (provider, source, frequency, active, last run status).

list_prospects

List prospects with rich filtering — search, status, org, titles, countries, industries, pagination, sorting.

list_sales_catalog_fields

List the custom catalog field definitions (key, label, type, kind, options) that catalog items' attributes use. Returns {data: Field[]}.

list_sales_catalog_items

Search the products/services catalog (30 per page) by name or kind. Returns {data: Offering[], count}.

list_saved_views

List one surface's saved views in tab order (workspace-shared plus your private ones). Returns {data: SavedView[]} with name, visibility, is_default, position, config.

list_schedule_presets

List the workspace's reusable sending schedules (timezone, available days, time windows). Check these before asking someone to spell out a schedule — copy the default one's scheduling_config into a new campaign.

list_signal_proposals

List the AI-generated campaign proposals produced from detected signals, optionally filtered by status (pending, approved, rejected, modified, launched, expired). An unknown status is ignored and all proposals are returned. Returns {data: SignalProposal[]}. Review pending proposals before approving them.

list_synced_calendar_accounts

List the workspace's connected Google/Outlook calendar accounts (synced via Unipile; separate from Cal.com). Returns {data: [{id, provider, externalAccountEmail, status, lastSyncedAt, syncIssue, needsReauth, scopeMissing, canReconnect}]}; id is the account_id the other synced-calendar tools take.

list_unibox_channels

List the accounts the Unibox imports (own + shared-in email, LinkedIn, WhatsApp) with message/contact stats, the last history-import job and each account's sync rules.

list_wallet_budgets

List per-member spending allowances on the workspace wallet. Returns {data: MemberBudget[]}.

list_wallet_consumption

Who spent how many workspace tokens, with their allowance, optionally since a timestamp. Returns {data: MemberConsumption[]}.

list_wallet_gifts

List token gifts this workspace gives to other workspaces (one-off and recurring). Returns {data: WorkspaceGrant[]}.

list_warmups

List the workspace's email warm-ups, the mailboxes eligible for warm-up (with a reason when not), and current pricing: {data, eligible, pricing}.

list_workspace_members

List human members and pending invites. Returns {data: [{id, user_id, name, email, role, custom_role, status, access_mode, is_admin, permissions, invited_at, joined_at}]}.

list_workspace_roles

List custom roles with their object/field permissions and assignment counts. Returns {data: CustomRole[]}.

lose_deal

Mark a deal lost with optional lost_reason: moves it to its pipeline's lost stage and runs that stage's entry rules. Returns {data: Deal}.

meetings

Read and annotate the workspace's meetings (meeting hub), and read or stop its Vexa recording bots. The workspace comes from your bearer token — prospect_id filters within it.

modify_proposal

Adjust a pending proposal WITHOUT launching it: pass modifications (titles, target_prospect_ids, campaign_name, campaign_description) to re-select prospects and regenerate the campaign workflow. The proposal stays pending so it can be reviewed and approved later. Returns the updated {data: SignalProposal}. Fails with 409 if the proposal is not pending, or 404 if not found.

move_deal

Move a deal to stage_id (any pipeline). Runs the target stage's entry rules (notify, assign owner, or enroll the primary contact in a campaign). A won stage needs a linked contact. Returns {data: Deal}.

notion_append_blocks

Append an array of Notion block JSON objects to an existing page (chunked into ≤100-block requests). Requires agent_settings.allow_notion_writes (default true). Returns { appended }.

notion_create_page

Create a new Notion page under a parent page, with an optional body of Notion block JSON. Requires agent_settings.allow_notion_writes (default true). Returns { id, url }.

notion_get_page

Fetch a Notion page object plus all of its child blocks (paginated). Returns { page, blocks }.

notion_publish_weekly_brief

Render a crm_weekly_brief_compose output as a DRAFT Notion page (H1 title + H2 section per part) under the workspace's Drafts/the assistant parent. Write-gated by agent_settings.allow_notion_writes. Defaults parent to agent_settings.notion_drafts_parent_id and template to agent_settings.notion_weekly_template_id. Returns { page_id, url, status:'draft', partial_success? }.

notion_search_pages

Search the connected Notion workspace for pages matching a free-text query. Returns [{ id, title, url }].

pause_campaign

Pause an active campaign — stops dequeueing new actions (in-flight calls finish).

pipeline_create_campaign_route

Route a campaign outcome (contacted/replied/bounced/opted_out) into a column: prospects are moved there automatically when it happens. One route per campaign+outcome (409 if taken). Returns {data: CampaignRoute}.

pipeline_create_canvas_draft

Start a change set based on current Production (empty, or duplicate_from another); add operations with pipeline_update_canvas_draft. Returns {data: ChangeSet} incl. revision and definition.base.

pipeline_create_link

Link two pipelines, or two columns (both stage ids) as a handoff; auto_move=true moves every prospect entering from_stage into to_stage. Returns {data: Link}.

pipeline_create_pipeline

Create a pipeline (max 12 per workspace); starter columns are seeded unless seed_stages=false. Returns {data: Pipeline}.

pipeline_create_stage

Add a column to a pipeline (workspace default when pipeline_id omitted; max 24 per pipeline). Returns {data: Stage}.

pipeline_create_stage_rule

Add an on-enter rule to a column: every prospect entering it gets rule_action (enroll in campaign, notify, assign, create deal, move, set field) — fires for real prospects once enabled. Cross-workspace move_stage needs a signed-in user, not an API key. Returns {data: StageRule}.

pipeline_delete_campaign_route

Delete a campaign outcome route. Returns {success}.

pipeline_delete_canvas_draft

Delete an unpublished change set. Returns an empty body (204) on success.

pipeline_delete_link

Delete a pipeline link (stops its auto_move handoff). Returns {success}.

pipeline_delete_pipeline

Permanently delete a non-default pipeline with its stages and links. If it holds prospects pass reassign_to, else 409 reassign_required. Returns {success}.

pipeline_delete_placement

Forget a canvas node's saved position so it is auto-laid-out. Layout only. Returns {success}.

pipeline_delete_stage

Permanently delete a custom column (system columns can't be deleted; archive instead). If it holds prospects pass reassign_to, else 409. Returns {success}.

pipeline_delete_stage_rule

Permanently delete a stage rule. Returns {success}.

pipeline_get_canvas

The whole journey graph in one read: pipelines with stages, prospect and rule counts, links, campaigns and their routes, stage automations, webhooks and their routes, deal pipelines. Returns {data: {...}}.

pipeline_get_canvas_draft_diff

Review a change set against current Production: additions, edits, removals, relocations, warnings, conflicts and drift. Returns {data: Diff}.

pipeline_get_pipeline

Get one pipeline with all its stages (archived included). Returns {data: Pipeline & {stages: Stage[]}}.

pipeline_get_prospect_journey

One prospect's stage-change trail across pipelines, oldest first. Returns {data: {current, entry, steps[], pipelines_visited[], truncated}}.

pipeline_list_campaign_routes

List campaign outcome routes (campaign outcome → column). Returns {data: CampaignRoute[]}.

pipeline_list_canvas_draft_publications

A change set's publication history (reason, actor, before/after fingerprints, operations). Returns {data: Publication[]}.

pipeline_list_canvas_drafts

List Production change sets (reviewed batches of pipeline edits) with status, revision and operations. Returns {data: ChangeSet[]}; 404 if change sets are disabled.

pipeline_list_links

List pipeline links: journey edges between pipelines, or column-to-column handoffs when both stage ids are set. Returns {data: Link[]}.

pipeline_list_pipelines

List the workspace's prospect pipelines (funnels); seeds the default one on first call. Returns {data: Pipeline[]}.

pipeline_list_placements

List saved journey-canvas positions of campaign / webhook / deal-pipeline nodes. Returns {data: Placement[]}.

pipeline_list_stage_rules

List a column's on-enter automation rules. Returns {data: StageRule[]} with id, action, config, is_enabled, position.

pipeline_list_stages

List pipeline columns (stages), optionally for one pipeline. Returns {data: Stage[]} with id, pipeline_id, key, label, type, position.

pipeline_preview_rule_assignment

Dry-run an assign stage rule: who it would assign now (or at at) and why, with each candidate's calendar availability. Changes nothing. Returns {data: {assignees, candidates, strategy, reason}}.

pipeline_publish_canvas_draft

Atomically apply a 'ready' change set to Production — immediately changes live routing and automation for real prospects (may remove columns/archive pipelines). 409 production_drift if Production moved (rebase first). Returns {data: {publication_id, status, fingerprint, revision}}.

pipeline_rebase_canvas_draft

Re-base a drifted change set onto current Production (new base fingerprint); review and mark ready again before publishing. Returns {data: ChangeSet}.

pipeline_reorder_stages

Set a new left-to-right column order. Returns {data: Stage[]} (every column).

pipeline_rollback_canvas_publication

Create a NEW draft change set that reverts a publication (422 if Production changed since). Nothing goes live until it is marked ready and published. Returns {data: ChangeSet}.

pipeline_set_placement

Save where a campaign / webhook / deal-pipeline node sits on the journey canvas (upsert by kind + ref_id). Layout only. Returns {data: Placement}.

pipeline_update_campaign_route

Point a campaign route at another column, or arm/disarm it. Returns {data: CampaignRoute}.

pipeline_update_canvas_draft

Save a change set's name, full definition (operations) or status. Flow: save definition → status 'ready' (validates; 409 production_drift / 422 invalid) → pipeline_publish_canvas_draft. Returns {data: ChangeSet} with the new revision.

pipeline_update_link

Relabel, re-point, pin/unpin columns or arm/disarm auto_move on a pipeline link. Returns {data: Link}.

pipeline_update_pipeline

Rename, recolor, reorder or archive a pipeline, make it the default (is_default=true), or set its canvas position. Returns {data: Pipeline}.

pipeline_update_stage

Rename, recolor, retype, move or archive a column. Returns {data: Stage}.

pipeline_update_stage_rule

Change a stage rule's action, config, enabled flag or order. Returns {data: StageRule}.

pipeline_validate_canvas_draft

Check a change set against current Production without saving anything. Returns {data: {valid, drifted, issues[]}}.

pipeline_webhook_create

Create an inbound webhook endpoint that turns posted JSON into prospects. Pass to_stage_id to seed a catch-all branch into that column (otherwise add branches with pipeline_webhook_route_create). Returns {data} with endpoint_url, plus secret for auth_mode hmac/token. The secret is shown ONLY in this response and cannot be read again: give it to the user to store in the sender; never log or repeat it.

pipeline_webhook_delete

Permanently delete an endpoint with its branches and delivery log; its URL stops accepting posts. Returns {data: {id}}.

pipeline_webhook_get

Get one inbound webhook endpoint by webhook_id, with its routing branches. Returns {data: Webhook & {routes}}.

pipeline_webhook_list

List the workspace's inbound lead-capture webhook endpoints, each with endpoint_url, auth settings, health counters and its routing branches. Returns {data: Webhook[]}. Never includes secrets.

pipeline_webhook_list_deliveries

Read an endpoint's delivery log, newest first: received payload, status, matched branches, prospect_id, error. Filter by status (e.g. unmatched); paginate with page/pageSize. Returns {data: Delivery[], count}.

pipeline_webhook_replay_delivery

Re-run a logged delivery's payload through the endpoint's CURRENT mapping and branches (e.g. to recover leads after fixing a filter). dry_run defaults to FALSE: it really creates/moves prospects and fires column automations. Returns {data: {delivery_id, replay_of, status, prospect_id, matched}}.

pipeline_webhook_rotate

Replace an endpoint's credentials; the old ones stop working immediately. target=secret (default) issues a new HMAC secret/token (optionally switching auth_mode to hmac|token) returned as secret. The secret is shown ONLY in this response and cannot be read again: give it to the user to store in the sender; never log or repeat it. target=url issues a new endpoint_url; every sender breaks until updated.

pipeline_webhook_route_create

Add a branch sending payloads that match filter (omit = catch-all) from webhook_id into column to_stage_id. Returns {data: Route}; 409 if the endpoint already routes into that column.

pipeline_webhook_route_delete

Permanently delete a routing branch; payloads it matched fall through to the remaining branches. Returns {data: {id}}.

pipeline_webhook_route_list

List routing branches (payload filter -> destination column) in evaluation order, for one webhook_id or the whole workspace. Returns {data: Route[]}.

pipeline_webhook_route_reorder

Set the evaluation order of one endpoint's branches (under first_match, order decides where a lead lands). Returns {data: Route[]} in the new order.

pipeline_webhook_route_update

Partially update a branch: to_stage_id, label, filter (replaced whole), position, is_enabled. Returns {data: Route}.

pipeline_webhook_test

Run a sample JSON payload through an endpoint's current mapping and branch filters. dry_run defaults to true (creates nobody); dry_run=false really creates/updates the prospect and fires the destination column's automations. Returns {data: {status, mapped, matched, prospect_id, suggested_mapping, sample_signature}}.

pipeline_webhook_update

Partially update an endpoint (name, auth, field_mapping, routing/dedupe mode, rate limit, is_enabled). Changing auth_mode to hmac/token issues new material (the old stops working) returned as secret. The secret is shown ONLY in this response and cannot be read again: give it to the user to store in the sender; never log or repeat it.

preview_enrichment

Free, read-only estimate for enrich_contact_details / verify_emails over prospect_ids or a list_id. Returns {coverage (with_email, with_phone, missing_contact, unverified_email...), providers [{provider, eligible, skipped, estimated_credits, available}], balance}.

preview_organization_search

Run a small, unsaved company search (1–25 rows) to check targeting before building a list. Tries GetLeads first, then Explorium. Billed like any provider call. Returns {data: companies[], provider, attempts, dropped_filters}.

propose_times

Return the n soonest available slots as a flat list — handy for offering a prospect a few concrete times. count is 1-50 (default 3); event_type_id defaults to the connection's default event type; time_zone is an optional IANA string. Returns {data: {eventTypeId, slots: [{start, end?}]}}. Fails with 409 if no calendar is connected.

prospect_list_meetings

List the meetings involving one prospect, newest first — the prospect meeting feed. Same filters and shape as the meetings group's list action, with prospect_id required. Returns {data: MeetingSessionSummaryDto[], nextCursor}. Paginated: echo nextCursor back as cursor; null means the last page. prospect_id filters within your authenticated workspace.

prospect_list_tasks

List the tasks about one prospect, newest first. Same filters and shape as the tasks group's list action, with prospect_id required. Returns {data: TaskDto[], nextCursor}. Paginated: echo nextCursor back as cursor; null means the last page. prospect_id filters within your authenticated workspace.

refresh_prospect_images

Re-fetch the prospect's photo and their company's logo. Returns {photo_updated, logo_updated, photo_url, logo_url, warnings}.

refresh_prospect_social_profiles

Recompute the prospect's social_profiles list from its row and enrichment data (no provider call). Returns the refreshed list.

reject_inbox_draft

Reject a drafted reply so it will not be sent, setting the action's status to 'rejected'. No message is sent. Returns the updated {data: InboxAutopilotAction}. Fails with 404 (draft not found) or 409 (action not in 'draft' status).

reject_proposal

Reject a pending proposal so it will not be launched. Returns the updated {data: SignalProposal (status 'rejected')}. Fails with 409 if the proposal is not pending.

remove_campaign_audience_prospects

Take people out of a campaign and stop any in-flight executions so they get no further outreach. Enrollment is kept as 'removed'; a later sync never re-adds them.

remove_deal_line_item

Remove a line item from an OPEN deal (soft-removed, kept in history). Returns {data: {id}}.

remove_deal_prospect

Unlink a contact (prospect_id) from a deal. A won deal must keep at least one contact. Returns {success: true}.

remove_prospects_from_list

Remove prospects from a prospect list by their UUIDs.

reorder_deal_stages

Reorder a deal pipeline's stages; ordered_ids lists every stage id in the new order. Returns {data: Stage[]}.

reschedule_meeting

Move a scheduled Cal.com meeting (meeting_id) to new_start (future ISO8601; check get_availability first), with an optional reason. Cal.com emails the attendee the new time. Returns {data: meeting row} with status 'rescheduled' and a new calcom_booking_uid; 409 if the meeting is not active or its event type forbids rescheduling.

restore_campaign

Restore an archived campaign back to draft status.

resume_campaign

Resume a paused campaign — transitions paused → active.

resume_warmup

MAY CHARGE THE WORKSPACE: undoes a pending cancellation (free), or pays a past-due warm-up's next day now and re-enables it. Confirm with the user first. 402 when credits are short.

revoke_campaign_share_link

Disable a campaign's public share link — anyone holding the URL loses access immediately. Owner or workspace admin only.

revoke_organization_share_link

Disable an organization's public share link — anyone holding the URL loses access immediately. Owner or workspace admin only.

revoke_people_share_link

Disable the People database public share link; the URL stops working. Admin only.

revoke_prospect_list_share_link

Disable a list's public share link; the URL stops working (re-enabling restores the same token).

revoke_prospect_share_link

Disable a prospect's public share link; the URL stops working (re-enabling restores the same token).

run_prospect_profile_hook

Run a profile hook immediately (synchronous, up to ~5 min). May charge credits for the provider work. Returns {status, activitiesWritten, summary}.

scan_duplicate_records

Rescan all workspace prospects and organizations for duplicates now (can be slow). Returns {data: {prospects_scanned, organizations_scanned, new_candidates}}; read pairs with list_duplicate_records.

search_mailpool_domains

Check availability and annual price of a domain name across TLDs, plus suggestions and mailbox pricing. Read-only; buys nothing.

search_prospect_lists

Preview filter results without creating a list — search by titles, countries, industries, employee count, etc.

search_workspace

Full-text search across people, organizations, deals, lists, campaigns, tasks and meeting notes. Returns {query, groups:[{type, total, hits:[{id, title, subtitle, meta, href}]}]}; entity kinds the key lacks scope for come back empty.

send_booking_link

Compose the rep's public Cal.com booking link so it can be shared with a prospect. Does NOT call Cal.com. Optionally pass event_type_id (defaults to the connection's default) and prospect_id for context. Returns {data: {url, bookingLink, username}}. Fails with 409 if no calendar is connected.

send_chat_message

Send a manual reply in an existing Unibox chat. Channel (email/LinkedIn) is inferred from the chat.

send_new_email

Compose and send a brand-new email to any recipient, outside any chat or campaign. Sends from the workspace's connected email account. Use send_chat_message instead to reply within an existing conversation.

set_channel_sync_rules

Replace an account's Unibox history-import rules with the given full set (max 20). A message is imported when any enabled rule matches; [] imports everything. Returns the saved rules.

set_inbox_autopilot

Set the workspace's inbox autopilot configuration. enabled is the master kill switch (false = do nothing). When enabled, the autopilot reads each inbound email reply, drafts a suggested reply in the rep's voice, and NOTIFIES the user to review/approve it — it NEVER auto-sends; a human approves every reply (via list_inbox_drafts + approve_inbox_draft). mode: 'off' suppresses entirely; 'auto_safe' and 'draft_all' both draft-and-notify (auto-send is disabled in v1). daily_cap is reserved for a future auto-send mode. Returns the saved {data: inboxAutopilot}.

simulate_account_connected

Fire a Unipile account-connected webhook event. Use to test the handler that creates/updates an account record when Unipile finishes connecting.

simulate_account_status

Fire a Unipile account-status webhook. Use to test status changes (OK, CREDENTIALS, ERROR, CONNECTING, STOPPED). Useful for verifying that disconnected accounts are flagged correctly.

simulate_email_tracking

Fire a Unipile mail_opened or mail_link_clicked tracking event. Pass label as 'execution_state_id:node_id' to link the event to a campaign execution and increment open/click counts.

simulate_linkedin_messaging

Fire a Unipile LinkedIn messaging event (message_received, message_read, message_delivered, etc.). Use to test reply detection and campaign execution advancement on LinkedIn.

simulate_new_email

Fire a Unipile mail_received webhook. Use to test inbound email handling — reply detection, chat thread creation, and campaign execution advancement.

simulate_new_relation

Fire a Unipile new_relation event (LinkedIn invitation accepted). Use to test that the connection record is updated and any waiting campaign executions are advanced.

social_cancel_invitation

Withdraw a pending invitation sent by the account (LinkedIn only).

social_comment

Publish a comment on a post, or a reply to one of its comments, as the account (public). Returns {comment_id}.

social_create_post

Publish a text post as the account (public). LinkedIn only here: Instagram posts need an image, which this tool can't upload. Returns {post_id}.

social_endorse_skill

Endorse one of a person's LinkedIn skills as the account (publicly visible). Returns {endorsed}.

social_follow

Follow a person or company as the account (publicly visible). LinkedIn returns {requested: true}; the follow itself is not confirmed.

social_get_post

Get one post: text, author, date and reaction/comment/repost counters.

social_handle_invitation

Accept or decline an invitation received by the account. Returns {status: ACCEPTED|DECLINED}.

social_inmail_balance

Remaining LinkedIn InMail credits of the account per product: {premium, recruiter, sales_navigator}.

social_invite

Send a connection invitation (LinkedIn) or follow request (Instagram) as the given account — goes out to the person. Returns {invitation_id}.

social_list_comments

List comments on a post, or replies to one comment. Paginated: {items, cursor}.

social_list_invitations_received

List invitations received by the account. Paginated: {items, cursor}.

social_list_invitations_sent

List pending invitations sent by the account. Paginated: {items, cursor}.

social_list_posts

List recent posts by a person or company: text, date, counters, share_url. Paginated: {items, cursor}.

social_list_reactions

List reactions on a post or comment, with who reacted. Paginated: {items, cursor}.

social_react

React to a post, or one of its comments, as the account (publicly visible).

social_relationship

Check whether the account is connected to a person (LinkedIn only): {status: connected|not_connected|unknown, network_distance}.

social_send_inmail

Send a LinkedIn InMail as the account — sends a message and spends one InMail credit of the chosen product (see social_inmail_balance). Returns {chat_id, message_id}; nulls mean accepted but delivery unconfirmed.

start_warmup

CHARGES THE WORKSPACE: buys email warm-up for each mailbox, billed the first day now and then daily until cancel_warmup. Confirm the mailboxes and price (get_warmup_pricing) with the user first. Returns {started, failed, tokens_charged}; 402 when credits are short, 422 when none started.

stop_campaign

Stop an active or paused campaign permanently — cannot be resumed.

suggest_campaign_ideas

Propose 3-8 distinct outbound campaign ideas for an audience. Charges credits (402 if insufficient); creates nothing. Returns {data: {ideas: [{title, description, instruction, play}]}} — pass an idea's instruction as generate_workflow's prompt.

suggest_chat_replies

Generate up to 3 ready-to-send reply drafts for a Unibox chat (nothing is sent). Charges 1 automation credit per call (402 when the balance is short). Returns {suggestions: [{label, intent, deal_target, rationale, text}], usedProspectCard}.

sync_accounts

Reconcile the workspace's connected accounts with Unipile: import accounts missing from Max, refresh statuses, remove duplicates, link done-for-you mailboxes. Safe to re-run; returns counts per pass and a message saying to run again when a large workspace was only partly synced.

sync_all_warmups

Refresh every live warm-up from Mailpool. Returns {data, unmanaged (warm-ups Mailpool runs that Max doesn't track), errors}.

sync_calendars_now

Pull the latest events from the synced Google/Outlook calendars now: every account, or only account_id. May take minutes; an account already mid-sync is skipped. Returns {data: {accounts, synced, needsReauth, failed, skipped, eventsUpserted, eventsCancelled, results: [{accountId, provider, status, error}]}}.

sync_campaign_audience

Enroll members added to the campaign's included lists since it started (minus excluded lists; removed people are never re-added). On an active/paused campaign they start the sequence immediately.

sync_mailpool_order

Refresh an order's domain/mailbox provisioning and DNS status from Mailpool, auto-connecting newly active mailboxes. Returns the order.

sync_unibox

Import message history from every connected account (or one account_id) into the Unibox. Long-running (up to ~5 min) and idempotent; returns partial:true when the time budget ran out — call again to continue. Track it with get_unibox_sync_progress.

sync_warmup

Refresh one warm-up's status and stats from Mailpool and return it.

tasks

Read tasks and propose new ones. Agents propose, humans dispose: you can create suggestions and drive accepted work forward, but only a human can approve or reject a suggestion. The workspace comes from your bearer token.

unlink_icp

Remove one ICP link by link_id (the record itself is untouched). Returns {data: {id}}.

update_account

Update account sender name, timezone, working hours, and email signature.

update_account_rate_limit

Update daily or weekly sending cap for a specific rate-limit row.

update_calendar_event

Patch an event on a synced Google/Outlook calendar by event_id + account_id; omitted fields are left unchanged. The provider may notify attendees. Returns {data: provider event}; 409 conflict if it was edited elsewhere, 401 reauth_required if the account must be reconnected.

update_campaign

Partial update of a campaign — name, description, workflow, lists, accounts, scheduling. Name and description can be changed at any status (including launched campaigns); all other fields require the campaign to be in 'draft' or 'stopped'.

update_campaign_ab_test

Apply one live traffic control to an email step's A/B test: pause/activate/promote a variant (needs variant_id), set_weights (needs weights), or reset. Takes effect on the next send, including already-enrolled prospects.

update_campaign_memory

Record/update Max's durable memory for a campaign. Pass a partial 'memory' object (top-level keys merge; send the full array to change decisions/notes). Use it to remember ICP, decisions, and progress per campaign.

update_chat

Update chat metadata — title, read state, archived status, prospect link.

update_data_supplier

Enable/disable a connected data supplier or replace its saved default search config. 404 if the provider is not connected. Returns {data: DataSupplier}.

update_deal

Partially update a deal (name, amount, currency, close_date, probability, owner_id, organization_id, description, custom_fields, lost_reason). Change stage with move_deal / win_deal / lose_deal. Returns {data: Deal}.

update_deal_pipeline

Rename, reposition, make default, or archive/restore a deal pipeline. Returns {data: Pipeline}.

update_deal_stage

Update a deal stage's label, color, type, win_probability or position. Changing type re-syncs its deals' status. Returns {data: Stage}.

update_deal_stage_rule

Update a deal stage rule's rule_action, config, is_enabled or position; config is re-validated against the action. Returns {data: Rule}.

update_icp

Patch an ICP: rename, archive, make default, or replace its criteria/profile. Omitted fields are untouched, but a sent criteria or profile object replaces that whole half. Returns {data: Icp}.

update_meeting_attendance

Mark (absent: true) or clear (absent: false) a guest's no-show on a Cal.com meeting that has already ended, by meeting_id and attendee_email. Returns the updated {data: meeting row}; 409 if the meeting has not ended, is pending/cancelled, or the email is not a recorded guest.

update_organization

Update an organization's fields (partial update).

update_prospect

Update a prospect's fields (partial update).

update_prospect_list

Update a prospect list (only list_name and status are editable).

update_prospect_profile_hook

Update a profile hook's source, label, custom_prompt, frequency, or active (false pauses it).

update_sales_catalog_item

REPLACE a catalog item: omitted optional fields reset to defaults, so send the full record plus expected_updated_at (its current updated_at; 409 if it changed). Returns {data: Offering}.

update_saved_view

Rename, reconfigure, reorder, share/unshare or make default a saved view. Only the view's creator (or a signed-in admin) may change it; else 403. Returns {data: SavedView}.

update_schedule_preset

Rename a saved schedule, replace its scheduling_config, or make it the workspace default. At least one field beyond the id is required.

update_warmup

Change a warm-up's daily target and ramp-up days. Returns the updated warm-up.

update_workspace_profile

Create or update workspace profile settings for the authenticated workspace via DigitalCrew API (PUT upsert). Uses the MCP connection Authorization: Bearer token when set.

verify_emails

Queue email verification (Bouncer) for prospect_ids or a whole list_id. CHARGES CREDITS (402 if insufficient). Async: returns 202 {job_id, job_ids, total}; a cron writes deliverable/risky/undeliverable/unknown onto each prospect's email_verification_status within ~5 min — poll get_email_verification_job.

wait_for_prospect_list

Poll a provider-built list (auto, GetLeads, Explorium, LinkedIn or Apollo) until its status becomes completed, failed, or cancelled — or the timeout elapses. Use after any *_create_list / *_add_more so the agent doesn't need to manage polling itself.

win_deal

Mark a deal won: moves it to its pipeline's won stage and runs that stage's entry rules. 400 deal_contact_required if no contact is linked (add_deal_prospect first). Returns {data: Deal}.

Tool definitions and validation use Zod per domain under features/pilot-tools/<domain>/schema.ts.

Related MCP server: Corebee MCP Server

Requirements

  • Node.js (see Next.js 15 requirements)

  • pnpm (see packageManager in package.json)

Configuration

Set these environment variables (e.g. in .env.local for local dev, or in your host’s env for production):

Variable

Required

Description

DIGITALCREW_API_BASE_URL

Yes

Base URL of the Digital Crew API (no trailing slash)

MCP_GATEWAY_SECRET

Yes (prod)

Shared secret; first-party callers send X-MCP-Gateway-Key on /mcp and /chat. External MCP clients use a workspace Max API key instead — Authorization: Bearer max_live_…, x-api-key: max_live_… or /mcp?key=max_live_… — on /mcp only

MCP_ADMIN_GATEWAY_KEY

No

Separate key required for admin tools when ENABLE_ADMIN_TOOLS=true

ALLOW_ENV_TOKEN_FALLBACK

No

Set true only for legacy scripts that cannot send per-request tokens

DIGITALCREW_API_TOKEN or DIGITALCREW_BEARER_TOKEN

No*

Used only when ALLOW_ENV_TOKEN_FALLBACK=true

ENABLE_ADMIN_TOOLS

No

Set true to expose dead-letter / circuit-breaker admin tools

ENABLE_WEBHOOK_SIMULATORS

No

Set true to expose webhook simulation tools (dev/staging only)

ENABLE_PURCHASE_TOOLS

No

Set true to expose the tools that spend real money: start_warmup, resume_warmup and create_mailpool_order (all need accounts:purchase). Off by default so a model cannot buy warm-up or mailboxes on its own initiative

CHAT_RATE_LIMIT_PER_MINUTE

No

Per-gateway-key chat limit (default 20)

CHAT_DAILY_REQUEST_CAP

No

Daily OpenRouter call cap per key (default 500)

REDIS_URL

No

Shared dead-letter queue and circuit-breaker state across instances

*Preferred auth: Authorization: Bearer <token> on the MCP HTTP request, or bearer_token on a tool call. Precedence: tool bearer_token → MCP Authorization → env (only if fallback enabled). A Max API key sent as x-api-key or as ?key= on the URL is re-issued as Authorization: Bearer by the gateway middleware before it reaches the tools. Claude's connector dialog reserves the Authorization name for OAuth, so x-api-key is the header its users can attach; ChatGPT's connector form has no header field at all, so its users put the key on the URL (it is stripped from the URL before the route handler runs, but does appear in edge request logs — revoke the key if that URL leaks).

Workspace binding and availability. A Max API key reaches exactly one workspace; workspace → get_current_workspace tells a client which one, so it can say so before writing. To copy a prospect list into another workspace, share it (create_prospect_list_share_link) and import it from the link while signed into that workspace. If max-agent cannot be reached to verify a key (timeout, network error, 5xx), the gateway answers 503 with Retry-After, not 401: a 401 tells MCP clients the credential is dead and they drop the connector's tools mid-conversation. A key max-agent confirmed within the last hour keeps being admitted through such an outage. Every tool call is re-authenticated by max-agent anyway.

Getting started

pnpm install
# Create .env.local with DIGITALCREW_API_BASE_URL (and optional token vars)

pnpm dev

The MCP endpoint is:

  • Local: http://localhost:3000/mcp

  • Production: https://<your-deployment>/mcp

Point your MCP client at that URL using Streamable HTTP transport.

Optional: smoke-test with the bundled script

scripts/test-streamable-http-client.mjs lists tools via Streamable HTTP. It expects the @modelcontextprotocol/sdk client package available in your environment (install it if the script is not runnable yet):

node scripts/test-streamable-http-client.mjs http://localhost:3000

Note: SSE is currently disabled in app/mcp/route.ts (disableSse: true). The older scripts/test-client.mjs (SSE) is not aligned with the default setup unless you enable SSE and Redis per Vercel’s MCP pattern.

Stack

Deploying on Vercel

  • Enable Fluid compute for efficient execution.

  • Adjust maxDuration in app/mcp/route.ts if your plan allows (e.g. up to 800s on Pro/Enterprise).

  • SSE: If you switch disableSse to false, attach Redis and set REDIS_URL as required by the adapter. See also the Next.js MCP template.

Learn more

License

Private project ("private": true in package.json). Use and deployment are governed by your Digital Crew agreements.

Related MCP Connectors

Related MCP Servers