ActiveCampaign MCP server for AI agents

Live

API KEY

EMAIL MARKETING

Marketing

ActiveCampaign gives your agent email marketing and CRM on your ActiveCampaign account: manage contacts, lists, and tags, add contacts to automations, schedule, pause, and resume campaigns, and work deals, tasks, and notes in pipelines.

  • Per-user credentials: each call uses the actual user's API key, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
ActiveCampaign
agent · Acme Q3
Run
How did last week's product newsletter perform?
S
activecampaign_get_campaign
109ms
Email marketing agent
The product newsletter went to 12,480 contacts. 41% opened, 6.2% clicked, and 18 unsubscribed.
Sources: ActiveCampaign campaign, 1 send
activecampaign
1 campaign
18:29
Message Claude...

Tools your email marketing agent reaches for on ActiveCampaign, scoped per user.

CALL ANY TOOL
120 tools for email marketing in ActiveCampaign: create, update, and tag contacts, manage lists and custom fields, add contacts to automations, schedule, pause, and resume campaigns, and work deals, tasks, and notes.
activecampaign_add_contact_to_automation
Add contact to automation
Add a contact to an automation, starting it at the automation's first step. Returns the contactAutomation row; its id is what activecampaign_remove_contact_from_automation needs. Use activecampaign_list_automations to find the automation ID.
Parameters
Name
Type
Required
Description
automation_id
integer
Required
ID of the automation, from list_automations.
contact_id
integer
Required
ID of the contact.
activecampaign_bulk_import_contacts
Bulk import contacts
activecampaign_create_account
Create account
activecampaign_create_contact
Create contact
activecampaign_create_deal_secondary_contact
Create deal secondary contact
activecampaign_create_ecom_customer
Create ecom customer
activecampaign_create_list
List create
activecampaign_delete_account
Delete account
activecampaign_delete_contact_field_value
Delete contact field value
activecampaign_delete_deal_task
Delete deal task
activecampaign_get_account
Get account
activecampaign_get_campaign_messages
Get campaign messages
activecampaign_get_contact_bounce_logs
Get contact bounce logs
activecampaign_get_contact_field_values
Get contact field values
activecampaign_get_custom_object_record
Get custom object record
activecampaign_get_ecom_customer
Get ecom customer
activecampaign_list_account_custom_fields
List account custom fields
activecampaign_list_contact_automations
List contact automations
activecampaign_list_deal_activities
List deal activities
activecampaign_list_deal_tasks
List deal tasks
activecampaign_list_forms
List forms
activecampaign_list_tags
List tags
activecampaign_move_deals_to_stage
Move deals to stage
activecampaign_remove_contact_from_automation
Remove contact from automation
activecampaign_set_account_custom_field_value
Set account custom field value
activecampaign_stop_campaign
Stop campaign
activecampaign_sync_contact
Sync contact
activecampaign_update_account
Update account
activecampaign_update_contact_field_value
Update contact field value
activecampaign_update_deal_task
Update deal task

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// ActiveCampaign tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["activecampaign"], toolNames: [
    "activecampaign_sync_contact",
    "activecampaign_add_tag_to_contact",
    "activecampaign_add_contact_to_automation"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Add jordan@acme.com, tag them webinar-sept, and start the onboarding automation" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["activecampaign"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Add jordan@acme.com, tag them webinar-sept, and start the onboarding automation" }],
  tools,
});

// Execute the tool call with the user's vaulted ActiveCampaign API key
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["activecampaign"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Add jordan@acme.com, tag them webinar-sept, and start the onboarding automation" }],
  tools,
});

// Tool call runs with the user's vaulted ActiveCampaign API key
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["activecampaign"] }, pageSize: 100,
});

const agent = new Agent({
  name: "email_marketing_agent",
  model: "gemini-2.5-pro",
  instruction: "ActiveCampaign tools scoped to this user",
  tools,
});

await agent.run("Add jordan@acme.com, tag them webinar-sept, and start the onboarding automation");
Try these prompts
Copy any prompt into your agent. Each maps directly to a ActiveCampaign tool. Click to copy, paste into your agent, done.
Contacts and lists
Copy the prompt
Copied
Create a contact for jordan@acme.com and subscribe them to the Newsletter list.
Copy the prompt
Copied
Tag this contact as webinar-sept.
Copy the prompt
Copied
Unsubscribe this contact from the Product Updates list.
Campaigns and automations
Copy the prompt
Copied
Show the send, open, and click totals for last week's newsletter.
Copy the prompt
Copied
Add this contact to the onboarding automation.
Copy the prompt
Copied
Pause the campaign that is sending now.
Deals
Copy the prompt
Copied
Create a $12,000 deal for Acme in the Sales pipeline at the Qualified stage.
Copy the prompt
Copied
List open deals in the Sales pipeline worth more than $10,000.
Copy the prompt
Copied
Add a note to the Acme deal summarizing today's call.
SEE HOW AUTH WORKS
Each user connects their own ActiveCampaign API key once, and Scalekit sends it with every call. Credentials stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
ActiveCampaign
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
ActiveCampaign
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
ActiveCampaign
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
ActiveCampaign
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other email marketing and CRM connectors.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.
Test other agents
See the same per-user auth pattern across other email marketing and CRM connectors.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
GTM
HubSpot to Slack updates agent
Watch HubSpot deal stage changes and post structured updates to the right Slack channel. Reps stop checking the CRM all day.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared ActiveCampaign API key looks fine in a demo. In production every contact update looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
ActiveCampaign today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access ActiveCampaign as the user or through a shared key?
As the user. Each user connects their own ActiveCampaign API key once, and Scalekit sends it with every call. Contact changes, campaign actions, and deal updates are attributed to that user in your audit trail, not a shared service account.
Where is the ActiveCampaign API key stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new API key. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in ActiveCampaign?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example contact and campaign tools without activecampaign_delete_contact or activecampaign_stop_campaign, which stops a campaign permanently. Scalekit also enforces scope checks before every API call.
What happens when a user revokes ActiveCampaign access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Does the connector cover ActiveCampaign deals as well as email?
Yes. Alongside contacts, lists, tags, automations, and campaigns, the tools manage the CRM side: pipelines, deal stages, deals, secondary contacts, tasks, notes, and accounts. activecampaign_list_deals searches deals by text, pipeline, stage, status, owner, value, or date.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""activecampaign"": {
""url"": ""https://mcp.scalekit.com/activecampaign"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.activecampaign]
url = ""https://mcp.scalekit.com/activecampaign""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""activecampaign"": {
""url"": ""https://mcp.scalekit.com/activecampaign"",
""type"": ""http""
}
}
}