On this page

MCP

MCP server that exposes the same workspace operations as Public REST, plus MCP-only helpers such as wait_for_campaign_leads. MCP only calls the Public API with the user’s API key — it does not hold mailbox or Maps provider secrets.

Host: https://mcp.notiq.io

Canonical docs: https://docs.notiq.io. White-label vanity MCP must not advertise NotiQ docs.

First-time setup runbook: Agent setup.

Auth (resolution order)

MCP accepts any of:

  1. X-API-Key: sk_live_…
  2. Authorization: Bearer sk_live_…
  3. Authorization: Bearer mcp_at_… — OAuth access token from the consent flow
ClientTypical method
CursorX-API-Key in MCP client headers
Claude / ChatGPTOAuth — paste sk_… on the consent page (see Connect Claude / ChatGPT)

Rules:

  • Discovery / initialize / tools/list may omit a key; tools/call requires one.
  • Outbound REST always uses X-API-Key only (never Bearer, never mcp_at_).
  • Never ask the user to paste a key into chat.

Tools ↔ REST

MCP toolREST
get_creditsGET /credits
validate_emailPOST /tools/validate-email
validate_emailsPOST /tools/validate-emails
enrich_websitePOST /tools/enrich-website
list_accountsGET /accounts
list_campaignsGET /campaigns
create_campaignPOST /campaigns
get_campaignGET /campaigns/:id
wait_for_campaign_leadsMCP-only poll of GET /campaigns/:id until ready (extensionStatus null); keeps polling while extend is FINDING_LEADS
get_insights_overviewGET /insights/overview
get_recent_activityGET /activity
start_campaignPOST /campaigns/:id/start
pause_campaignPOST /campaigns/:id/pause
list_leadsGET /campaigns/:id/leads
get_leadGET /campaigns/:id/leads/:leadId
add_leadPOST /campaigns/:id/leads
add_leads_batchPOST /campaigns/:id/leads/batch
update_leadPATCH /campaigns/:id/leads/:leadId
update_leads_batchPOST /campaigns/:id/leads/batch-update
delete_leads_batchPOST /campaigns/:id/leads/batch-delete
send_messagePOST /inbox/messages
get_setup_statusGET /setup
list_templatesGET /templates
get_templateGET /templates/:id
create_templatePOST /templates
update_templatePATCH /templates/:id
delete_templateDELETE /templates/:id
assign_templatePOST /campaigns/:id/template
list_tagsGET /tags
create_tagPOST /tags
update_tagPATCH /tags/:labelKey
set_campaign_goalPOST /campaigns/:id/overview-goal
list_excluded_leadsGET /excluded-leads
add_excluded_leadsPOST /excluded-leads
remove_excluded_leadsPOST /excluded-leads/remove
list_excluded_domainsGET /excluded-domains
add_excluded_domainsPOST /excluded-domains
remove_excluded_domainsPOST /excluded-domains/remove
create_manual_campaignPOST /campaigns/manual
rename_campaignPATCH /campaigns/:id
delete_campaignDELETE /campaigns/:id
delete_leadDELETE /campaigns/:id/leads/:leadId
pause_resume_agentPOST /campaigns/:id/leads/:leadId/agent
preview_leadPOST /campaigns/:id/leads/:leadId/preview
update_account_limitsPATCH /accounts/:id
delete_accountDELETE /accounts/:id
create_mailbox_connect_linkPOST /accounts/connect-link
create_mailbox_reconnect_linkPOST /accounts/:id/reconnect-link

Count: 48 tools. Not shipped: LinkedIn tools. wait_for_campaign_leads is MCP-only (no new REST route).

wait_for_campaign_leads

MCP-only helper that polls campaign readiness after Maps create_campaign (or while UI “Add more leads” / file-import extend runs). It waits until status is ready (READY_TO_SEND / already sending / paused / done) and extensionStatus is null; keeps polling while discovering or while extensionStatus === "FINDING_LEADS". On time_budget, resume with the same campaignId. Optional bounded minLeads; default readiness is by status + extension. Discovery does not send email — still confirm before start_campaign. Use the user’s full numberOfSearch (credit-bound).

Recipes

GoalTool call
First run / blockersget_setup_status
Connect a mailboxcreate_mailbox_connect_link with mailboxKind gmail | outlook | imap — user opens connectUrl
Maps find-N leadscreate_campaign with full numberOfSearch → wait_for_campaign_leads until READY_TO_SEND with extensionStatus null (resume on time_budget)
Manual agent → campaigncreate_template → assign_template → preview_lead → confirm → start_campaign
Overview goalset_campaign_goal with Meeting booked (not “Meetings”)
Custom reply tagslist_tags / create_tag / update_tag then update_lead
Workspace do-not-contactexclude-desk tools (list_* / add_* / remove_*)
Dry-run copypreview_lead
Interested leadslist_leads(tag="Interested")
Set CRM slotsupdate_lead / update_leads_batch with custom1…custom10 (detail via get_lead)
Waiting on youlist_leads(needsReply=true)
Excluded campaign leadslist_leads(excluded=true)
Last replyget_recent_activity(type="reply_received")
Check one addressvalidate_email (mode=mx is free)
Personalization snippetenrich_website (0 credits)

Argument schemas live on MCP tools/list after connect.

Credits & safety (for agents)

  • At call time, credits may be charged by add_lead / add_leads_batch (1 per create) and by validate_email / validate_emails (1 per full-validation API hit in mode=full; mode=mx and cache hits are free). Setup, templates, tags, goals, exclude desk, mailbox connect, campaign/lead/account ops, enrich, batch update/delete, start/pause, and send are 0 credits. Maps discovery still debits 1 per email lead found asynchronously.
  • Confirm with the user before: delete_template, delete_campaign, delete_lead, delete_leads_batch, delete_account, remove_excluded_leads, remove_excluded_domains, send_message, start_campaign (real email from a connected mailbox).
  • update_template is echo-all — call get_template first.
  • Start with get_setup_status, then list_accounts / list_campaigns for ids; paginate with nextCursor.

Discovery endpoints (no auth)

PathRole
/healthLiveness + whether Public API base is configured
/, /.well-known/mcp.jsonSlim discovery JSON (tool names + blurbs)
/.well-known/oauth-authorization-serverOAuth AS metadata
/.well-known/oauth-protected-resourceOAuth resource metadata
/llms.txtShort machine-readable summary
/mcpStreamable HTTP MCP endpoint
/authorize, /token, /registerOAuth / DCR (Claude/ChatGPT style clients)

Connection tip (Cursor)

{
  "mcpServers": {
    "notiq": {
      "url": "https://mcp.notiq.io/mcp",
      "headers": {
        "X-API-Key": "sk_live_…"
      }
    }
  }
}

Create the key at /api-mcp.