Reply.io MCP server for AI agents

Live

BEARER TOKEN

SALES ENGAGEMENT

Marketing

Reply.io gives your agent sales engagement across email and LinkedIn: build and run sequences, manage contacts, accounts, and lists, work the inbox, handle tasks, and read sequence and team performance.

  • Per-user credentials: each call uses the actual user's access 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.
Reply.io
agent · Acme Q3
Run
Who in the Q4 Fintech sequence has replied so far?
S
reply_get_sequence_contacts
141ms
Sales engagement agent
7 of the 140 contacts in Q4 Fintech have replied. 4 are from companies already in your Fintech accounts list.
Sources: 1 sequence, 140 contacts
reply
140 contacts
18:29
Message Claude...

Tools your sales engagement agent reaches for on Reply.io, scoped per user.

CALL ANY TOOL
112 tools for sales engagement in Reply.io: create and run sequences, enroll and update contacts, reply in the inbox, manage tasks and templates, and read email stats.
reply_add_accounts_to_contact_account_list
List add accounts to contact account
Add accounts to a list while keeping their other list memberships. Up to 1000 ids per call. Returns the result as JSON.
Parameters
Name
Type
Required
Description
accountIds
array
Required
Account IDs to add or move (1 to 1000 items).
id
integer
Required
Account list ID.
reply_add_contact_note
Add contact note
reply_archive_sequence
Archive sequence
reply_assign_email_account_to_sequence
Assign email account to sequence
reply_bulk_delete_contacts
Bulk delete contacts
reply_bulk_remove_contacts_from_sequence
Bulk remove contacts from sequence
reply_create_contact
Create contact
reply_create_contact_list
List create contact
reply_create_email_template
Create email template
reply_create_sequence_folder
Create sequence folder
reply_delete_email_template
Delete email template
reply_filter_contact_accounts
Filter contact accounts
reply_get_background_job_by_id
Get background job by id
reply_get_contact_account_contacts
Get contact account contacts
reply_get_contact_inbox_threads
Get contact inbox threads
reply_get_email_account
Get email account
reply_get_emails_list
List get emails
reply_get_inbox_thread
Get inbox thread
reply_get_sequence_email_accounts
Get sequence email accounts
reply_get_sequence_templates
Get sequence templates
reply_import_contacts
Import contacts
reply_list_email_templates
List email templates
reply_list_schedules
List schedules
reply_mark_inbox_threads_as_read
Read mark inbox threads as
reply_render_email_template
Render email template
reply_send_direct_email
Send direct email
reply_set_contacts_opted_out
Set contacts opted out
reply_start_sequence
Start sequence
reply_update_contact
Update contact
reply_update_inbox_category
Update inbox category

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

// Reply.io tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["reply"], toolNames: [
    "reply_get_sequences",
    "reply_bulk_add_contacts_to_sequence",
    "reply_start_sequence"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Enroll these 50 contacts in the Q4 Fintech sequence and start it" }] });
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: ["reply"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Enroll these 50 contacts in the Q4 Fintech sequence and start it" }],
  tools,
});

// Execute the tool call with the user's vaulted Reply.io access 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: ["reply"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Enroll these 50 contacts in the Q4 Fintech sequence and start it" }],
  tools,
});

// Tool call runs with the user's vaulted Reply.io access 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: ["reply"] }, pageSize: 100,
});

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

await agent.run("Enroll these 50 contacts in the Q4 Fintech sequence and start it");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Reply.io tool. Click to copy, paste into your agent, done.
Sequences
Copy the prompt
Copied
Enroll these 50 contacts in the Q4 Fintech sequence.
Copy the prompt
Copied
Pause the Q4 Fintech sequence.
Copy the prompt
Copied
Compare A/B variants for each step of the Q4 Fintech sequence.
Contacts and inbox
Copy the prompt
Copied
Show unread inbox threads from this week.
Copy the prompt
Copied
Reply to Dana's thread and suggest Thursday at 2pm.
Copy the prompt
Copied
Opt out jordan@acme.com from all outreach.
Tasks and reporting
Copy the prompt
Copied
List my overdue call tasks.
Copy the prompt
Copied
Assign the Acme follow-up task to Priya.
Copy the prompt
Copied
Compare team performance for last month.
SEE HOW AUTH WORKS
Each user connects their own Reply.io access token once, and Scalekit sends it with every call. Tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Reply.io
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
Reply.io
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
Reply.io
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
Reply.io
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 sales and marketing connectors.
GTM and RevOps Teams
Outbound prospecting agent
Searches Apollo for prospects matching your ICP, scores and ranks them, drafts personalized outreach in Gmail, and logs every send to Google Sheets. Mail goes out as the rep, not from a shared inbox.
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 sales and marketing connectors.
SALES
Outbound prospecting agent
Search Apollo for ICP matches, rank them, draft personalised Gmail outreach, and log every send to Google Sheets.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Reply.io access token looks fine in a demo. In production every sequence change and email reply 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.
Reply.io 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 Reply.io as the user or through a shared token?
As the user. Each user connects their own Reply.io access token once, and Scalekit sends it with every call. Audit logs attribute every sequence change, email, and task to that user, not a shared service account.
Where is the Reply.io access token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new access token. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Reply.io?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the reporting and inbox read tools without reply_send_direct_email or reply_bulk_delete_contacts. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Reply.io 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.
Which Reply.io user does the agent act as?
The user the access token belongs to. reply_whoami returns that user's userId, username, and teamId, and tools such as reply_get_tasks return that user's tasks, plus teammates' tasks when their role allows it.
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"": {
""reply"": {
""url"": ""https://mcp.scalekit.com/reply"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.reply]
url = ""https://mcp.scalekit.com/reply""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""reply"": {
""url"": ""https://mcp.scalekit.com/reply"",
""type"": ""http""
}
}
}