Aircall MCP server for AI agents

Live

OAUTH 2.0

BUSINESS CALLING

Communication

Aircall gives your agent business calling data and actions: search calls and read AI summaries and transcripts, manage shared contacts and tags, run Outbound Campaigns and Power Dialer lists, and send SMS and WhatsApp messages.

  • Per-user credentials: each call uses the actual user's token, 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.
Aircall
agent · Acme Q3
Run
Summarize my last call with Contoso.
S
aircall_call_summary_get
123ms
Calling agent
Contoso asked to move the renewal to March and needs a revised quote by Friday.
Sources: Aircall AI summary, 1 call
aircall
1 call
18:29
Message Claude...

Tools your calling agent reaches for on Aircall, scoped per user.

CALL ANY TOOL
78 tools for calling in Aircall: search calls, read AI summaries, transcripts, and sentiment, manage contacts, tags, and numbers, run Outbound Campaigns and Power Dialer lists, and send SMS and WhatsApp messages.
aircall_ai_voice_agent_call_trigger
Trigger ai voice agent call
Ask an Aircall Outbound AI Voice Agent to call a contact, for example for an appointment reminder or a follow-up. The request is queued and placed when a calling slot is free. Returns id, idempotency_key, status (PENDING) and virtual_agent_id (HTTP 202). Use aircall_ai_voice_agent_call_trigger for AI-placed calls. Use aircall_user_call_start for a call placed by a human user. The agent must be configured in the Aircall Dashboard with a phone number and a first message.
Parameters
Name
Type
Required
Description
agent_id
string
Required
ID of the Outbound Voice Agent, from the Outbound Call Workflow tab of the agent's configuration page. Example: agent-abc123
contact_phone
string
Required
Phone number to call, with country code. A leading + is optional. Example: +15551234567
idempotency_key
string
Required
Unique key for this call request; sending the same key twice won't create a second call. Use a new key for every retry. Example: appt-reminder-2026-03-15-cust-12345
context
object
Optional
Values for the {{variable}} placeholders in the agent's first message, voicemail message and guidelines. Every variable in the first message and voicemail message must be present. Add a timezone key (IANA, such as America/New_York) when a value is a UTC datetime. Example: {"first_name": "Jane", "appointment_date": "March 20th at 2:00 PM"}
expiration_seconds
integer
Optional
How long, in seconds, to keep trying to place the call if the concurrency limit is reached: 60 to 86400. Default: 3600. Default: `3600`.
aircall_analytics_export_create
Create analytics export
aircall_analytics_export_get
Get analytics export
aircall_call_evaluations_get
Get call evaluations
aircall_call_predicted_csat_get
Get call predicted csat
aircall_call_recording_pause
Pause call recording
aircall_call_tags_add
Add call tags
aircall_call_topics_get
Get call topics
aircall_call_transfer
Call transfer
aircall_calls_list
List calls
aircall_calls_search
Search calls
aircall_campaign_contact_remove
Remove campaign contact
aircall_campaign_contacts_list
List campaign contacts
aircall_campaign_pause
Pause campaign
aircall_campaign_stats_get
Get campaign stats
aircall_contact_create
Create contact
aircall_contact_delete
Delete contact
aircall_contact_email_add
Add contact email
aircall_contact_email_update
Update contact email
aircall_contact_update
Update contact
aircall_contacts_list
List contacts
aircall_dialer_campaign_delete
Delete dialer campaign
aircall_dialer_campaign_get
Get dialer campaign
aircall_group_message_send
Send group message
aircall_number_registration_status_get
Get number registration status
aircall_sms_templates_list
List sms templates
aircall_teams_list
List teams
aircall_tracker_get
Get tracker
aircall_user_call_start
Start user call
aircall_users_availabilities_list
List users availabilities

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);

// Aircall tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["aircall"], toolNames: [
    "aircall_calls_search",
    "aircall_call_summary_get",
    "aircall_call_comment_create"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Summarize my last call with Contoso and add a comment" }] });
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: ["aircall"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Summarize my last call with Contoso and add a comment" }],
  tools,
});

// Execute the tool call with the user's vaulted Aircall OAuth token
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: ["aircall"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Summarize my last call with Contoso and add a comment" }],
  tools,
});

// Tool call runs with the user's vaulted Aircall OAuth token
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: ["aircall"] }, pageSize: 100,
});

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

await agent.run("Summarize my last call with Contoso and add a comment");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Aircall tool. Click to copy, paste into your agent, done.
Calls and insights
Copy the prompt
Copied
Summarize my last call with Contoso.
Copy the prompt
Copied
List the action items from yesterday's call with Fabrikam.
Copy the prompt
Copied
List inbound calls from today.
Contacts and tags
Copy the prompt
Copied
Create a shared contact for Dana Kim with her mobile number.
Copy the prompt
Copied
Tag the Contoso call as renewal.
Copy the prompt
Copied
Search contacts by the number +1 415 555 0134.
Outreach
Copy the prompt
Copied
Add these 40 contacts to the Q4 renewal campaign.
Copy the prompt
Copied
Pause the Q4 renewal campaign.
Copy the prompt
Copied
Send an SMS from our support line confirming tomorrow's appointment.
SEE HOW AUTH WORKS
Each user signs in to Aircall once, and Scalekit stores and refreshes their tokens. Credentials stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Aircall
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
Aircall
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
Aircall
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
Aircall
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 communication and support connectors.
GTM and RevOps Teams
Sales call prep agent
Reads tomorrow's calls from Google Calendar, mines past Granola notes and Attio history for context, and delivers each rep a prep brief in Slack, scoped to the calls that rep actually owns.
Support and Ops Teams
Support triage agent
Fetches new Zendesk tickets, classifies them by type and urgency, searches the Notion knowledge base for an answer, and routes what it cannot resolve to Slack. Every call runs on the support agent's own delegated OAuth.
GTM and RevOps Teams
Deal intelligence agent
Pulls recent Gong calls, scores deal risk with an LLM, cross-references the record in Attio, and DMs each owner their at-risk deals in Slack. Every read is scoped to that rep's own access.
Test other agents
See the same per-user auth pattern across other communication and support connectors.
SALES
Sales call prep agent
Read tomorrow's calls from Google Calendar, mine Granola notes and Attio history, and deliver each rep a prep brief in Slack.
SUPPORT
Support triage agent
Classify new Zendesk tickets, search the Notion knowledge base for an answer, and route what it cannot resolve to Slack.
SALES
Deal intelligence agent
Score Gong call risk with an LLM, cross-reference the Attio record, and DM each owner their at-risk deals in Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Aircall token looks fine in a demo. In production every call note and SMS 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 token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Aircall 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 Aircall as the user or through a shared service account?
As the user. Each user signs in to Aircall once, and Scalekit stores and refreshes their tokens. Every call comment, contact change, and message in your audit trail is attributed to that user, not a shared service account.
Where is the Aircall OAuth token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Aircall?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example call search and summaries without aircall_message_send, or without aircall_contact_delete, which deletes a shared contact and cannot be undone. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Aircall 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.
What do the Aircall AI call tools need?
aircall_call_summary_get, aircall_call_topics_get, aircall_call_sentiments_get, and the other AI insight tools require the Aircall AI Assist or AI Assist Pro package. aircall_calls_search covers the company's calls from the last six months.
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"": {
""aircall"": {
""url"": ""https://mcp.scalekit.com/aircall"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.aircall]
url = ""https://mcp.scalekit.com/aircall""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""aircall"": {
""url"": ""https://mcp.scalekit.com/aircall"",
""type"": ""http""
}
}
}