WarmblyDocs

MCP server

Connect any MCP client (Claude Code, Claude Desktop, Cursor) to Warmbly and use your data and workflows as tools. Sign in with OAuth, or scope a static API key.

Warmbly speaks the Model Context Protocol. Point any MCP client at Warmbly's server and it can search contacts, check campaigns, read your inbox, draft replies, and create draft campaigns and automations, all scoped to what you grant it.

  • URL: https://api.warmbly.com/v1/mcp
  • Transport: streamable HTTP
  • Auth: an OAuth 2.1 access token (browser sign-in) or a static API key (bearer header).

There are two ways to connect. OAuth is the one-command path: you run a single add command, approve access in the browser, and the client holds a short-lived token it can refresh. An API key is the static path: you mint a key and paste it into the client config. Both reach the exact same tools, gated the exact same way.

Connect with OAuth

This is the recommended path. You do not paste a key anywhere: the client discovers Warmbly's authorization server, opens a browser for you to sign in and approve the scopes, and stores the resulting token itself.

Claude Code

claude mcp add --transport http warmbly https://api.warmbly.com/v1/mcp

Then run /mcp inside Claude Code and pick Authenticate. A browser opens, you sign in to Warmbly, approve the requested scopes, and you are connected. No header, no key.

Claude Desktop and Cursor

Add the server with just its URL, and the client runs the OAuth flow on first use:

{
  "mcpServers": {
    "warmbly": { "type": "http", "url": "https://api.warmbly.com/v1/mcp" }
  }
}

What you are approving

The consent screen shows exactly which scopes the client is asking for. Sending real mail is never one of them: SEND_CAMPAIGNS and API-key management are excluded from OAuth-connected MCP clients by design, and the assistant only ever drafts. You can revoke a connected client at any time from your dashboard under connected apps.

Connect with an API key

Prefer a static, long-lived credential (CI, a shared script, a client that does not implement OAuth)? Mint an API key and send it as a bearer token:

Authorization: Bearer wmbly_...

Scope your key

Create a dedicated API key for each MCP client and grant it only the scopes it needs (see Permissions). The AI_AGENT scope is a convenient way to grant assistant-style access; combine it with the read/write scopes for the data you want the client to reach.

Claude Code

claude mcp add --transport http warmbly https://api.warmbly.com/v1/mcp \
  --header "Authorization: Bearer wmbly_..."

Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "warmbly": {
      "type": "http",
      "url": "https://api.warmbly.com/v1/mcp",
      "headers": { "Authorization": "Bearer wmbly_..." }
    }
  }
}

Cursor

Add to .cursor/mcp.json:

{
  "mcpServers": {
    "warmbly": {
      "url": "https://api.warmbly.com/v1/mcp",
      "headers": { "Authorization": "Bearer wmbly_..." }
    }
  }
}

What is exposed

The server exposes exactly the tools your credential is allowed to use, whether that credential is an OAuth token or an API key. A credential with only read scopes sees only the read tools; one with write scopes sees those too, so an MCP client acts with precisely the permissions you granted, and nothing more.

This is a subset of what the in-product assistant can do. Two categories are dashboard-only and never reachable by an API key or OAuth token: sending email (send_reply, compose_email), and workspace governance (team, workspace settings, and billing). Those routes are session-only and have no API scope to grant, so they never appear over MCP.

Every tool is gated by its API permission. tools/list returns only the tools your mask allows. Sending-class tools (anything that transmits a message to a recipient) are never exposed over MCP regardless of scope; over MCP the assistant only produces drafts (draft_reply).

ToolDoesRequired scope
search_contactsFind contacts by textREAD_CONTACTS
get_contactRead one contactREAD_CONTACTS
update_contact_fieldsUpdate contact fieldsWRITE_CONTACTS
add_tag / remove_tagTag a contactWRITE_CONTACTS
list_campaignsList campaignsREAD_CAMPAIGNS
get_campaign_statsCampaign statsREAD_CAMPAIGNS
list_campaign_leadsA campaign's leads with derived status + totalsREAD_CONTACTS
create_campaign_draftCreate a draft campaignWRITE_CAMPAIGNS
set_campaign_statusStart or stop a campaignSEND_CAMPAIGNS
get_dashboard_analyticsOrg-wide sending stats for a periodREAD_ANALYTICS
list_mailboxesSender mailboxes with health + warmup stateREAD_ANALYTICS
add_contact / delete_contactCreate or delete a contactWRITE_CONTACTS
bulk_edit_contactsTag or subscribe many contacts at onceBULK_CONTACTS
get_contact_timeline / get_contact_sent_emailsRead a contact's activity and sent mailREAD_CONTACTS
list_pipelines / list_deals / get_deal / list_deals_by_contactRead CRM pipelines and dealsREAD_CRM
create_task / create_dealCreate CRM recordsWRITE_CRM
update_deal / move_deal_stage / delete_dealEdit, move, or delete a dealWRITE_CRM
list_tasks / list_task_typesRead CRM tasks and task typesREAD_CRM
update_task / complete_task / delete_taskEdit, complete, or delete a taskWRITE_CRM
add_contact_note / list_contact_notesAdd or read contact notesWRITE_CRM / READ_CRM
update_contact_note / delete_contact_noteEdit or delete a noteWRITE_CRM
create_pipeline / update_pipeline / delete_pipelineManage CRM pipelinesWRITE_CRM
create_pipeline_stage / update_pipeline_stage / delete_pipeline_stageManage pipeline stagesWRITE_CRM
get_campaign / list_campaign_senders / get_campaign_logsRead a campaign's config, senders, and logsREAD_CAMPAIGNS
update_campaign / delete_campaignEdit or delete a campaignWRITE_CAMPAIGNS
set_campaign_senders / verify_campaign_tracking_domainSet senders, verify tracking domainWRITE_CAMPAIGNS
list_campaign_stepsRead a campaign's sequence stepsREAD_CAMPAIGNS
add_campaign_step / update_campaign_step / delete_campaign_stepEdit a campaign's sequence stepsWRITE_CAMPAIGNS
list_threads / get_threadRead the unified inboxREAD_UNIBOX
draft_replyDraft a reply (never sends)READ_UNIBOX
list_scheduled_sendsList queued outbound messagesREAD_UNIBOX
mark_thread_seen / set_thread_labelsMark seen, set thread labelsWRITE_UNIBOX
snooze_thread / unsnooze_thread / cancel_scheduled_sendSnooze a thread, cancel a queued sendWRITE_UNIBOX
get_mailbox / get_warmup_ban_statusRead a mailbox's config and warmup standingREAD_EMAILS
update_mailbox / set_mailbox_warmup / set_mailbox_tracking_domainEdit mailbox settings, warmup, tracking domainWRITE_EMAILS
submit_warmup_appeal / disconnect_mailboxAppeal a warmup ban, disconnect a mailboxWRITE_EMAILS
create_automation_draft / list_automations / get_automationRead automations, create a disabled draftINTEGRATIONS
update_automation / set_automation_enabled / delete_automationEdit, enable, or delete an automationINTEGRATIONS
list_api_keys / create_api_key / update_api_key / revoke_api_keyManage API keysAPI_KEYS
list_webhooks / list_webhook_deliveriesRead webhook endpoints and deliveriesWEBHOOKS
create_webhook / update_webhook / delete_webhook / rotate_webhook_secret / verify_webhookManage webhook endpointsWEBHOOKS
search_web / fetch_urlSearch and read public pagesany
load_skillRead one of your playbooksany

Rate limits apply to MCP calls exactly as they do to the rest of the API (per-key for API keys, per-user for OAuth tokens). SEND_CAMPAIGNS appears in the table because set_campaign_status needs it, but that tool is still withheld from MCP: no send-class tool is ever exposed over the MCP transport regardless of scope.

How OAuth discovery works

The one-command flow is standard MCP authorization, so any spec-compliant client works without Warmbly-specific setup. On a request with no valid token, /v1/mcp returns 401 with a WWW-Authenticate header pointing at the protected-resource metadata. The client then walks:

  • GET /.well-known/oauth-protected-resource: the resource and its authorization server (RFC 9728).
  • GET /.well-known/oauth-authorization-server: the authorize, token, and registration endpoints (RFC 8414).
  • POST /v1/oauth/register: dynamic client registration, so the client mints a public (PKCE) client_id with no manual app setup (RFC 7591).
  • Authorization code with PKCE (S256) in the browser, then POST /v1/oauth/token for a short-lived access token and a rotating refresh token.

The same discovery drives Warmbly's OAuth server for any client. See the OAuth 2.1 page for the full authorization-server reference.

See also

  • OAuth 2.1 for the authorization-server endpoints, scopes, and dynamic registration.
  • Authentication for how API keys and OAuth tokens work.
  • Permissions for the full scope list.
  • To connect Warmbly to external MCP servers instead (the other direction), see the Connect MCP tools guide.

On this page