Max MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Max MCP Serverget my workspace profile settings"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 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 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}. |
| 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 a prospect list by their UUIDs. |
| 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. |
| 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. |
| 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. |
| Append more leads to an existing Apollo list (async). Re-runs the saved search for additional results. |
| 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 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 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 a campaign (soft delete) — hidden from default views but restorable. |
| Archive a chat (soft delete). Messages remain, use archived=true filter to see them. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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}. |
| Cancel a queued or waiting (delayed) run; 409 if it already ran or is running. Returns {data: Run}. |
| Create a workflow (unique name) with a first draft version; nothing fires until automation_activate. Returns {data: WorkflowDetail}. |
| Pause an active workflow: disarms its trigger; versions, runs and counters stay. Returns {data: WorkflowDetail}. |
| Permanently delete a workflow with all its versions and run history. Returns {data: {deleted: true}}. |
| 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}. |
| Get one workflow with its draft_version and active_version documents and webhook_url. Returns {data: WorkflowDetail}. |
| One run with per-step states, outputs and errors (403 for document-triggered runs without a member session). Returns {data: Run}. |
| List the workspace's automation workflows with status, trigger, run counters and a summary of the draft/active version. Returns {data: Workflow[]}. |
| 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}. |
| Every version of a workflow (draft, active, archived), newest first. Returns {data: Version[]}. |
| Re-arm a paused workflow's existing active version (never publishes a pending draft). Returns {data: WorkflowDetail}. |
| 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}. |
| 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}. |
| Rename or redescribe a workflow (definition changes go through automation_save_draft). Returns {data: Workflow}. |
| 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). |
| 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. |
| Delete multiple organizations. Set deleteProspects=true to cascade-delete linked prospects. |
| Delete multiple prospects by IDs. |
| 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. |
| Node run counts for up to 100 campaigns in one call: { nodeRunCounts: { campaignId: { nodeId: count } } }. Inaccessible ids and campaigns with no runs are omitted. |
| Import multiple organizations. Deduplicates by domain. Returns imported/existing/failed counts. |
| Import multiple prospects at once. Deduplicates by email. Returns imported/existing/failed counts. |
| 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 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 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. |
| Stop a warm-up at the end of its paid period (no refund; ends immediately if unpaid). resume_warmup undoes a pending cancellation. |
| 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. |
| 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 |
| 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. |
| 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. |
| 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. |
| 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. |
| Drain the dead-letter queue. Returns the number of entries removed. Use after manually replaying or after resolving the upstream issue. |
| 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 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 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 a new campaign in draft state. Requires name, included_lists, and accounts. Won't send until launched. |
| 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 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 a deal pipeline seeded with the default stages (max 10 per workspace). Returns {data: Pipeline}. |
| Add a stage (column) to a deal pipeline (max 24): label, optional color, type, win_probability, position. Returns {data: Stage}. |
| 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}. |
| 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}. |
| 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 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. |
| 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 a new organization/company record. |
| 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. |
| 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 a single prospect. Deduplicates by email — returns existing row if email already exists. |
| 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 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. |
| 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 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. |
| 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. |
| 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 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}. |
| 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}. |
| 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. |
| 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 }] }. |
| 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[] }] }. |
| 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 }] }. |
| Fetch a single CRM contact by email (the dedup identity). Returns {data: contact} or {data: null} if not found. |
| Fetch a single HubSpot deal by id, including its full properties and associated company/contact ids. Returns null if not found. |
| 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. |
| 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. |
| List HubSpot owners (sales reps) for the workspace. Returns id, email, firstName, lastName, teams. Use to map deals/assignments to people. |
| List deal pipeline stages (optionally scoped to one pipeline). Returns id, label, displayOrder, pipelineId, isWonStage, isLostStage. |
| 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:[...] }. |
| 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[] }] }. |
| 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. |
| Report whether HubSpot is connected for this workspace. Returns { connected: bool, provider, connections: [{ provider, portal_id, connected_at, last_refresh_at }] }. |
| Create-or-update a company in the connected CRM, matched by domain — never creates a duplicate. Requires a read + write HubSpot connection. |
| 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. |
| 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. |
| 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 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. |
| Permanently delete a campaign and all its workflow executions. Prefer archive for soft removal. |
| Permanently delete a deal, its line items and attached files. Irreversible. Fails (500) if documents are linked to it. Returns {success: true}. |
| Permanently delete a file attached to a deal. Irreversible. Returns {success: true}. |
| 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 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 a deal stage entry rule. Returns {success: true}. |
| Permanently delete an ICP and its record links (searches it produced are kept). Prefer update_icp status=archived. Returns {data: {id}}. |
| Delete an organization. Linked prospects get organization_id = null. |
| Delete a prospect permanently. |
| Delete a prospect list (prospects themselves are NOT deleted). |
| Delete a profile hook permanently. |
| Permanently delete a saved view (creator or signed-in admin only). Records are untouched. Returns {data: {id}}. |
| Delete a saved schedule. Campaigns keep their own copy, so this never changes how an existing campaign sends. |
| Detach a prospect list from a campaign. People it already enrolled stay in — use remove_campaign_audience_prospects to stop them. |
| 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 a LinkedIn or email account from the workspace. Use hosted_auth_link to reconnect. |
| 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 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}. |
| Mark a duplicate pair as not-a-duplicate so it leaves the pending queue. Records are untouched. Returns {success: true}. |
| Copy a campaign into a new draft (workflow, scheduling, exclusions, lists, accounts). Run history, enrolled people and sharing are not copied. Returns { campaign }. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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'. |
| Use AI to generate a personalized message for a prospect. Charges credits. Specify channel and prompt. |
| Use AI to generate a campaign workflow from natural language. Charges credits. Provide a prompt or structured fields. |
| 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 full details of a connected account — provider, channel, config, sync status. |
| Get daily/weekly sending limits and current usage for a specific account. |
| Read one of the caller's Max chat threads, oldest message first (first 500). Returns {data: {session, messages}}. |
| 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. |
| 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 full details of a campaign by ID — workflow, scheduling, accounts, prospect lists, stats. |
| 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. |
| 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. |
| Engagement summary for a campaign: open/click/reply/bounce rates plus per-link click detail (top links, distinct URLs clicked). |
| Most recent workflow steps executed in a campaign, newest first: node, action_type, status, error_message, prospect. limit default 20, max 100. |
| 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'). |
| Per-prospect breakdown — where each lead is in the workflow and message event history. |
| 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. |
| Map of workflow node ID → execution count. Useful for funnel visualization. |
| Read a campaign's public share link: { data: { token, enabled, view_count, ... } | null }. Public URL is /share/. Owner or workspace admin only. |
| Aggregate performance stats — email open/reply rates, LinkedIn connection/reply rates, execution counts. |
| Get one account's Unibox history-import rules. No rules = import everything. |
| Get full details of a single Unibox chat/conversation thread. |
| 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). |
| 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. |
| 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). |
| Workspace-wide aggregate stats — execution counts, email/LinkedIn rates, completion percentage. |
| Read the workspace's duplicate auto-merge policy. Returns {data: {auto_merge_enabled, auto_merge_threshold_percent}}. |
| 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}. |
| 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. |
| 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. |
| 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. |
| Return the workspace's daily enrichment quota usage: {cap, used_today, remaining}. Check this before a large bulk enrichment to confirm there's headroom. |
| 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}. |
| 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 one ICP by id with its criteria, profile and stats. Returns {data: Icp}. |
| 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 one inbox placement check: {check, result} with placement per provider and per seed inbox once completed (result null until then). |
| Link clicks for a campaign grouped by url, with total click counts and unique-prospect counts. Sorted by clicks desc. |
| Monthly price per done-for-you mailbox (USD and credits) for Google and Microsoft, and whether purchasing is enabled. |
| Get full details of an organization — domain, industry, employee count, funding, social URLs. |
| 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. |
| Geographic distribution of the workspace's organizations: { total, located, byCountry: [{ country, count }], byCity: [{ city, country, count }] }. |
| Read an organization's public share link: { data: { token, enabled, view_count, ... } | null }. Public URL is /share/. Owner or workspace admin only. |
| Get the public share link of the workspace's whole People database {token, enabled, view_count} or null. Admin only. |
| Get full profile of a prospect — name, title, company, LinkedIn, email, location, enrichment data. |
| Chronological log of message events for a prospect across all campaigns (newest first). |
| Chronological email engagement timeline for a prospect (oldest first) — every open, click, reply, and bounce. |
| Get full details of a prospect list by ID — status, search config, result counts, timestamps. |
| Get a list's public share link {token, enabled, view_count} or null. List owner or admin only. |
| 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 a prospect's public share link {token, enabled, view_count} or null. Owner or admin only. |
| 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 one saved view by id. Returns {data: SavedView}. |
| 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[]}. |
| 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. |
| 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 one Unibox message's full body as plain text: {id, chat_id, subject, text}. Private messages return 404. |
| Live state of the Unibox history import: per-account phase and counters plus a summary. Cheap; poll while sync_unibox runs. |
| 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). |
| 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. |
| Warm-up price per mailbox (daily credits/USD, monthly USD) and whether purchasing is enabled. |
| 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}}. |
| Fetch workspace profile settings (company info) for the authenticated workspace via DigitalCrew API. Uses the MCP connection Authorization: Bearer token when set. |
| Read the workspace's token balances: pooled wallet, owner balance, spendable total and caller contribution. Returns {data: {wallet_balance, owner_balance, spendable, …}, billingEnabled}. |
| 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. |
| 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. |
| Generate a short-lived URL for the user to connect a LinkedIn or email account via Unipile hosted auth. |
| Create a new prospect list and import prospects in one call. Each row needs an email (for dedup). |
| Launch a draft campaign — transitions draft → active and creates workflow executions for each prospect. |
| 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}. |
| Cancel/withdraw a sent LinkedIn invitation by its invitation_id (from list_invitations_sent). |
| Comment on a LinkedIn post. |
| Create a LinkedIn post from the connected account. |
| 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. |
| Get all recent LinkedIn messages across all conversations. |
| Get a LinkedIn company profile by its identifier or slug. |
| Get messages in a specific LinkedIn conversation. |
| Get the profile of the connected LinkedIn account. Useful to confirm the account is active. |
| Get a full LinkedIn profile by slug (public identifier). Returns provider_id and profile data. |
| Get recent posts by a LinkedIn user. |
| List first-degree LinkedIn connections of the connected account. |
| List LinkedIn conversations (inbox). |
| List pending LinkedIn invitations received from others. |
| List pending LinkedIn invitations you have sent. |
| React to a LinkedIn post. |
| Reply in an existing LinkedIn conversation. |
| Search LinkedIn for people by keywords. |
| Send a LinkedIn connection request. ALWAYS call find_profile first to get provider_id. |
| Send a LinkedIn direct message to start a new conversation. Requires existing connection or InMail credits. |
| 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 all connected LinkedIn and email accounts — name, email, status, daily limits. |
| 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[]}. |
| 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 }. |
| 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 all outreach campaigns. Filter by status, search by name, paginate and sort. |
| Get all messages in a conversation — body, direction (in/out), timestamp, status. |
| List LinkedIn and email conversations — filter by channel, prospect, account, or archived status. |
| Conversation-intelligence rollup of analyzed meetings in a period: {data: {totals (analyzedConversations, averageScore, averageInternalTalkPct, objectionRatePct, highRiskDeals), forecast, benchmarks per rep, trackerTrends, dealRisks, coachingLibrary}}. |
| 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 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 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 files attached to a deal — metadata only (file_name, mime_type, size_bytes, created_at, derivation status); no file contents. Returns {data: Attachment[]}. |
| List a deal's product/service line items (snapshots, including removed ones with removed_at set). Returns {data: LineItem[]}. |
| 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[]}. |
| A deal's stage-change history, newest first. Returns {data: [{from_stage_id, to_stage_id, amount_at_change, changed_by, changed_at}]}. |
| List a deal stage's entry-automation rules (run whenever a deal enters the stage). Returns {data: Rule[]}. |
| 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 the workspace's digital workers (AI crew members) with status, role, access mode and permissions. Returns {data: DigitalWorker[]}. |
| 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. |
| 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 the deals, organizations and prospects an ICP claims. Returns {data: IcpLink[]} (entity_type, entity_id, entity_label, fit_score, rationale, linked_by). |
| 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). |
| Reverse lookup: which ICPs claim this deal, organization or prospect. Returns {data: IcpLink[]} including icp_name. |
| 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 placement (spam) checks run on the workspace's done-for-you mailboxes, newest first: status, score, inbox/spam/promotions counts. |
| 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 domains this workspace already bought through done-for-you setup, with Mailpool status, so new mailboxes can reuse them. |
| List the workspace's done-for-you email setup orders: domains, mailboxes, provisioning status and billing. |
| List all organizations/companies — search by name or domain, filter by industry/country. |
| Campaigns a prospect is enrolled in: campaign name/status, enrollment status, source, added/removed dates, next scheduled step. |
| IDs of every list member matching filters, unpaginated, for bulk actions. Returns {ids, count, truncated} (ids capped at limit). |
| List all prospects in a specific list — paginated, searchable, sortable. |
| List companies in an organization-type list (search_type=organizations). Paginated, searchable. Returns {data: Organization[], count}. |
| List all prospect lists — name, status, result counts, and search criteria. |
| Stored social/profile activity timeline for a prospect (posts, contact changes, research found by profile hooks), newest first. |
| Recurring watchers on a prospect (provider, source, frequency, active, last run status). |
| List prospects with rich filtering — search, status, org, titles, countries, industries, pagination, sorting. |
| List the custom catalog field definitions (key, label, type, kind, options) that catalog items' attributes use. Returns {data: Field[]}. |
| Search the products/services catalog (30 per page) by name or kind. Returns {data: Offering[], count}. |
| 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 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 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 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 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 per-member spending allowances on the workspace wallet. Returns {data: MemberBudget[]}. |
| Who spent how many workspace tokens, with their allowance, optionally since a timestamp. Returns {data: MemberConsumption[]}. |
| List token gifts this workspace gives to other workspaces (one-off and recurring). Returns {data: WorkspaceGrant[]}. |
| 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 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 custom roles with their object/field permissions and assignment counts. Returns {data: CustomRole[]}. |
| 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}. |
| 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. |
| 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 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}. |
| 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 }. |
| 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 }. |
| Fetch a Notion page object plus all of its child blocks (paginated). Returns { page, blocks }. |
| 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? }. |
| Search the connected Notion workspace for pages matching a free-text query. Returns [{ id, title, url }]. |
| Pause an active campaign — stops dequeueing new actions (in-flight calls finish). |
| 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}. |
| 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. |
| 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}. |
| Create a pipeline (max 12 per workspace); starter columns are seeded unless seed_stages=false. Returns {data: Pipeline}. |
| Add a column to a pipeline (workspace default when pipeline_id omitted; max 24 per pipeline). Returns {data: Stage}. |
| 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}. |
| Delete a campaign outcome route. Returns {success}. |
| Delete an unpublished change set. Returns an empty body (204) on success. |
| Delete a pipeline link (stops its auto_move handoff). Returns {success}. |
| Permanently delete a non-default pipeline with its stages and links. If it holds prospects pass reassign_to, else 409 reassign_required. Returns {success}. |
| Forget a canvas node's saved position so it is auto-laid-out. Layout only. Returns {success}. |
| Permanently delete a custom column (system columns can't be deleted; archive instead). If it holds prospects pass reassign_to, else 409. Returns {success}. |
| Permanently delete a stage rule. Returns {success}. |
| 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: {...}}. |
| Review a change set against current Production: additions, edits, removals, relocations, warnings, conflicts and drift. Returns {data: Diff}. |
| Get one pipeline with all its stages (archived included). Returns {data: Pipeline & {stages: Stage[]}}. |
| One prospect's stage-change trail across pipelines, oldest first. Returns {data: {current, entry, steps[], pipelines_visited[], truncated}}. |
| List campaign outcome routes (campaign outcome → column). Returns {data: CampaignRoute[]}. |
| A change set's publication history (reason, actor, before/after fingerprints, operations). Returns {data: Publication[]}. |
| List Production change sets (reviewed batches of pipeline edits) with status, revision and operations. Returns {data: ChangeSet[]}; 404 if change sets are disabled. |
| List pipeline links: journey edges between pipelines, or column-to-column handoffs when both stage ids are set. Returns {data: Link[]}. |
| List the workspace's prospect pipelines (funnels); seeds the default one on first call. Returns {data: Pipeline[]}. |
| List saved journey-canvas positions of campaign / webhook / deal-pipeline nodes. Returns {data: Placement[]}. |
| List a column's on-enter automation rules. Returns {data: StageRule[]} with id, action, config, is_enabled, position. |
| List pipeline columns (stages), optionally for one pipeline. Returns {data: Stage[]} with id, pipeline_id, key, label, type, position. |
| Dry-run an |
| 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}}. |
| Re-base a drifted change set onto current Production (new base fingerprint); review and mark ready again before publishing. Returns {data: ChangeSet}. |
| Set a new left-to-right column order. Returns {data: Stage[]} (every column). |
| 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}. |
| Save where a campaign / webhook / deal-pipeline node sits on the journey canvas (upsert by kind + ref_id). Layout only. Returns {data: Placement}. |
| Point a campaign route at another column, or arm/disarm it. Returns {data: CampaignRoute}. |
| Save a change set's name, full |
| Relabel, re-point, pin/unpin columns or arm/disarm auto_move on a pipeline link. Returns {data: Link}. |
| Rename, recolor, reorder or archive a pipeline, make it the default (is_default=true), or set its canvas position. Returns {data: Pipeline}. |
| Rename, recolor, retype, move or archive a column. Returns {data: Stage}. |
| Change a stage rule's action, config, enabled flag or order. Returns {data: StageRule}. |
| Check a change set against current Production without saving anything. Returns {data: {valid, drifted, issues[]}}. |
| 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 |
| Permanently delete an endpoint with its branches and delivery log; its URL stops accepting posts. Returns {data: {id}}. |
| Get one inbound webhook endpoint by webhook_id, with its routing branches. Returns {data: Webhook & {routes}}. |
| 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. |
| 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}. |
| 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}}. |
| 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 |
| 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. |
| Permanently delete a routing branch; payloads it matched fall through to the remaining branches. Returns {data: {id}}. |
| List routing branches (payload filter -> destination column) in evaluation order, for one webhook_id or the whole workspace. Returns {data: Route[]}. |
| 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. |
| Partially update a branch: to_stage_id, label, filter (replaced whole), position, is_enabled. Returns {data: Route}. |
| 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}}. |
| 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 |
| 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}. |
| 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}. |
| 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. |
| List the meetings involving one prospect, newest first — the prospect meeting feed. Same filters and shape as the |
| List the tasks about one prospect, newest first. Same filters and shape as the |
| Re-fetch the prospect's photo and their company's logo. Returns {photo_updated, logo_updated, photo_url, logo_url, warnings}. |
| Recompute the prospect's social_profiles list from its row and enrichment data (no provider call). Returns the refreshed list. |
| 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 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. |
| 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 a line item from an OPEN deal (soft-removed, kept in history). Returns {data: {id}}. |
| Unlink a contact (prospect_id) from a deal. A won deal must keep at least one contact. Returns {success: true}. |
| Remove prospects from a prospect list by their UUIDs. |
| Reorder a deal pipeline's stages; ordered_ids lists every stage id in the new order. Returns {data: Stage[]}. |
| 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 an archived campaign back to draft status. |
| Resume a paused campaign — transitions paused → active. |
| 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. |
| Disable a campaign's public share link — anyone holding the URL loses access immediately. Owner or workspace admin only. |
| Disable an organization's public share link — anyone holding the URL loses access immediately. Owner or workspace admin only. |
| Disable the People database public share link; the URL stops working. Admin only. |
| Disable a list's public share link; the URL stops working (re-enabling restores the same token). |
| Disable a prospect's public share link; the URL stops working (re-enabling restores the same token). |
| Run a profile hook immediately (synchronous, up to ~5 min). May charge credits for the provider work. Returns {status, activitiesWritten, summary}. |
| 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. |
| Check availability and annual price of a domain name across TLDs, plus suggestions and mailbox pricing. Read-only; buys nothing. |
| Preview filter results without creating a list — search by titles, countries, industries, employee count, etc. |
| 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. |
| 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 a manual reply in an existing Unibox chat. Channel (email/LinkedIn) is inferred from the chat. |
| 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. |
| 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 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}. |
| Fire a Unipile account-connected webhook event. Use to test the handler that creates/updates an account record when Unipile finishes connecting. |
| 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. |
| 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. |
| Fire a Unipile LinkedIn messaging event (message_received, message_read, message_delivered, etc.). Use to test reply detection and campaign execution advancement on LinkedIn. |
| Fire a Unipile mail_received webhook. Use to test inbound email handling — reply detection, chat thread creation, and campaign execution advancement. |
| 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. |
| Withdraw a pending invitation sent by the account (LinkedIn only). |
| Publish a comment on a post, or a reply to one of its comments, as the account (public). Returns {comment_id}. |
| 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}. |
| Endorse one of a person's LinkedIn skills as the account (publicly visible). Returns {endorsed}. |
| Follow a person or company as the account (publicly visible). LinkedIn returns {requested: true}; the follow itself is not confirmed. |
| Get one post: text, author, date and reaction/comment/repost counters. |
| Accept or decline an invitation received by the account. Returns {status: ACCEPTED|DECLINED}. |
| Remaining LinkedIn InMail credits of the account per product: {premium, recruiter, sales_navigator}. |
| Send a connection invitation (LinkedIn) or follow request (Instagram) as the given account — goes out to the person. Returns {invitation_id}. |
| List comments on a post, or replies to one comment. Paginated: {items, cursor}. |
| List invitations received by the account. Paginated: {items, cursor}. |
| List pending invitations sent by the account. Paginated: {items, cursor}. |
| List recent posts by a person or company: text, date, counters, share_url. Paginated: {items, cursor}. |
| List reactions on a post or comment, with who reacted. Paginated: {items, cursor}. |
| React to a post, or one of its comments, as the account (publicly visible). |
| Check whether the account is connected to a person (LinkedIn only): {status: connected|not_connected|unknown, network_distance}. |
| 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. |
| 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 an active or paused campaign permanently — cannot be resumed. |
| 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. |
| 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}. |
| 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. |
| Refresh every live warm-up from Mailpool. Returns {data, unmanaged (warm-ups Mailpool runs that Max doesn't track), errors}. |
| 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}]}}. |
| 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. |
| Refresh an order's domain/mailbox provisioning and DNS status from Mailpool, auto-connecting newly active mailboxes. Returns the order. |
| 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. |
| Refresh one warm-up's status and stats from Mailpool and return it. |
| 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. |
| Remove one ICP link by link_id (the record itself is untouched). Returns {data: {id}}. |
| Update account sender name, timezone, working hours, and email signature. |
| Update daily or weekly sending cap for a specific rate-limit row. |
| 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. |
| 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'. |
| 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. |
| 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 metadata — title, read state, archived status, prospect link. |
| Enable/disable a connected data supplier or replace its saved default search config. 404 if the provider is not connected. Returns {data: DataSupplier}. |
| 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}. |
| Rename, reposition, make default, or archive/restore a deal pipeline. Returns {data: Pipeline}. |
| Update a deal stage's label, color, type, win_probability or position. Changing type re-syncs its deals' status. Returns {data: Stage}. |
| Update a deal stage rule's rule_action, config, is_enabled or position; config is re-validated against the action. Returns {data: Rule}. |
| 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}. |
| 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 an organization's fields (partial update). |
| Update a prospect's fields (partial update). |
| Update a prospect list (only list_name and status are editable). |
| Update a profile hook's source, label, custom_prompt, frequency, or active (false pauses it). |
| 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}. |
| 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}. |
| Rename a saved schedule, replace its scheduling_config, or make it the workspace default. At least one field beyond the id is required. |
| Change a warm-up's daily target and ramp-up days. Returns the updated warm-up. |
| Create or update workspace profile settings for the authenticated workspace via DigitalCrew API (PUT upsert). Uses the MCP connection Authorization: Bearer token when set. |
| 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. |
| 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. |
| 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
packageManagerinpackage.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 |
| Yes | Base URL of the Digital Crew API (no trailing slash) |
| Yes (prod) | Shared secret; first-party callers send |
| No | Separate key required for admin tools when |
| No | Set |
| No* | Used only when |
| No | Set |
| No | Set |
| No | Set |
| No | Per-gateway-key chat limit (default 20) |
| No | Daily OpenRouter call cap per key (default 500) |
| 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 devThe MCP endpoint is:
Local:
http://localhost:3000/mcpProduction:
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:3000Note: SSE is currently disabled in
app/mcp/route.ts(disableSse: true). The olderscripts/test-client.mjs(SSE) is not aligned with the default setup unless you enable SSE and Redis per Vercel’s MCP pattern.
Stack
Next.js App Router
mcp-handler(Vercel MCP adapter)Zod for tool input schemas
Deploying on Vercel
Enable Fluid compute for efficient execution.
Adjust
maxDurationinapp/mcp/route.tsif your plan allows (e.g. up to 800s on Pro/Enterprise).SSE: If you switch
disableSsetofalse, attach Redis and setREDIS_URLas required by the adapter. See also the Next.js MCP template.
Learn more
Digital Crew — AI workforce platform
Max — Outreach control center — Max product site
Model Context Protocol — MCP specification
License
Private project ("private": true in package.json). Use and deployment are governed by your Digital Crew agreements.
This server cannot be deployed
Maintenance
Related MCP Connectors
Manage SRG+ hubs, channels, content, assets, users, and workspaces from any MCP-aware AI agent.
AI agent platform: manage leads, conversations, bots, calendar and CRM via MCP.
Work your Luca workspace from any MCP client: 183 API tools + 15 task tools for leads and calls.
Set up and run an in-product AI assistant: widgets, knowledge, MCP connections, usage.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables interaction with Salesforce data and services via custom MCP tools, including account analytics, opportunity queries, case creation, and AI agent invocation.4-
- AlicenseNot gradedqualityCmaintenanceEnables AI-driven customer support operations including conversation management, knowledge base, contacts, metrics, and settings via MCP.MIT

Savanto MCP Serverofficial
AlicenseNot gradedqualityDmaintenanceExposes Savanto AI workspace tools to MCP clients, enabling natural-language configuration, content management, analytics, and diagnostics for store AI assistants.25 npmMIT- AlicenseNot gradedqualityFmaintenanceEnables MCP-capable agents to interact with Dock workspaces, including reading, creating, updating, and deleting rows, managing workspaces, and retrieving activity logs.5 npmMIT