Reply for agents - Run outbound from Claude Code or Codex
Your agent builds the list. Reply sends it.
Connect Reply to Claude Code, Codex or any MCP client.
70 tools, a CLI, and packaged workflows with confirmation gates.
Run sequences, mailboxes and your unified inbox from the terminal you already have open.
claude · reply mcp
>
add the 40 leads from ./icp.csv to “Q3 Outbound” and start it
●
reply_list_sequences→12 sequences
●
reply_add_contact_to_sequence ×40→40 enrolled, 3 dupes merged
⚠
reply_start_sequence is annotated destructive. This will send to 40 people. Confirm?
3 warmed mailboxes · 40/day · first send 09:00 your time
>
y
●
reply_start_sequence “Q3 Outbound” → running
claude mcp add –transport http reply https://mcp.reply.io/ –header “Authorization: Bearer YOUR_REPLY_API_KEY”
Every agentic GTM tool stops at the CSV
Your agent finds the accounts, enriches the contacts and writes the copy. Then it writes a file. You open a tab, upload it, map the columns, pick a mailbox, and hope it’s warm. That last step is the only one that generates revenue, and it’s the only one still done by hand.
1
Sourcing tools
Signal feeds, scrapers, and lookalike lists. A crowded, well-served market.
2
Enrichment tools
Waterfall enrichment, verified emails, firmographic fill. Also crowded, also solved.
3
Your agent
Research, qualify, draft. This is what your agent is already good at.
4
Reply
Sequences across email, LinkedIn, calls and SMS, on warmed mailboxes, with replies landing in one inbox.
Four ways in. One account, one key.
MCP
For agents in Claude, Cursor and Claude Code. Annotated read-only or destructive, so your client can gate them.
Skills
Multi-step outreach procedures with confirmation gates and previews. Four more listed as coming soon.
CLI
Sign in once, then call any v3 endpoint as yourself from a shell or CI.
REST API
The exhaustive surface. Webhooks, bulk imports and background jobs live here and nowhere else.
What that looks like in practice
The tools are the surface. These are the sentences. Every chain below is real. The markers show which calls only read, which write, and which Reply flags as high-stakes so your client can stop and ask first.
- Read-only
- Writes
- High-stakes, gate this one
Who replied this week and hasn’t been followed up
reply_get_inbox_emails
reply_get_contact_activity
Pause anything under a 3% reply rate
reply_search_sequences
reply_get_sequence_stats
reply_pause_sequence
Add the 40 from ./icp.csv to Q3 Outbound and start it
reply_search_contacts
reply_create_contact
reply_add_contact_to_sequence
reply_start_sequence
Draft replies to everyone marked interested, don’t send
reply_list_pending_approvals
reply_regenerate_message
Compare last month’s two sequences, tell me which step loses people
reply_compare_sequence_performance
reply_get_sequence_steps
reply_get_sequence_step_variants
This lead asked to be removed, blacklist them
reply_search_contacts
reply_blacklist_contact
If it speaks MCP, it speaks Reply
A standard MCP server over JSON-RPC 2.0. Anything implementing the protocol can call it.
Claude Code
claude mcp add
Codex
MCP config
Cursor
JSON config
Claude Desktop
OAuth connector
ChatGPT
OAuth connector
Windsurf
MCP config
Cline
MCP config
n8n
HTTP / MCP node
Make
HTTP module
Zapier
REST
Your first ten minutes
Connect, prove the credential, read something, then do one real thing under a confirmation gate. In that order, because it’s the same discover → configure → execute → verify pattern Reply’s own agent guide prescribes.
1
Get your API key
Reply → Settings → API Key. Scope it while you’re there. sequences:read is enough for everything up to step 4, and a read-only key is a good way to start.
Treat your API key like a password. Credentials in a URL are not supported: always the Authorization header.
2
Add the server to your client
Header auth is the recommended path. Clients without header support can add the URL as a remote connector and authorise over OAuth, but that grants the full tool catalogue rather than your key’s scopes.
Claude Code
# one line, then restart your session
claude mcp add --transport http reply https://mcp.reply.io/ \
--header "Authorization: Bearer YOUR_REPLY_API_KEY"
curl https://api.reply.io/v3/whoami -H “Authorization: Bearer $REPLY_KEY”
3
Check it actually answered
Before you ask an agent to do anything, prove the credential works.
200 and your user → you’re connected.
401 with an empty body → the key is wrong.
4
Read something before you write anything
Ask your agent for a report, not an action. Both of these tools are annotated read-only, so there is nothing to undo.
> list my sequences and show stats for the busiest one
⏺ reply_search_sequences → 12 sequences
⏺ reply_get_sequence_stats → 1,204 sent · 4.1% replied
5
Do one real thing, gated
Now enrol a single contact into a test sequence. Both calls are marked high-stakes, so a well-behaved client will stop and confirm, which is exactly what you want to see happen before you trust it with 400 people.
> add me to “Internal test” and start it
⏺ reply_search_contacts → 1 match
⚠ reply_add_contact_to_sequence is high-stakes.
Confirm?
Then teach it your rules
Drop this in your project root as CLAUDE.md (or AGENTS.md) and your agent inherits your ICP, your voice and your guardrails on every run. The MCP rules below are lifted from Reply’s own agent guide. The irreversible-reject warning and the send constraints are real, documented traps, not hypotheticals.
CLAUDE.md
# Outbound rules for this project
## Who we sell to
[Company size, industry, the titles that matter, and the trigger that\
makes an account worth contacting this week rather than any week.]
## Voice
Short. No exclamation marks. No “I hope this finds you well.”
One ask per message. Never imply we have met before.
## Reply MCP house rules
Resolve before you mutate.
Never invent an ID and never ask me for one. Search for the object,
confirm the match is right, act, then verify.
Discover -> configure -> execute -> verify. In that order, every time.
### Always stop and ask me first
# the tools Reply marks high-stakes
reply_start_sequence
reply_add_contact_to_sequence
reply_send_inbox_reply
reply_approve_message / reply_bulk_approve_messages / reply_reject_message
reply_blacklist_contact
reply_change_contact_owner
reply_set_sequence_reply_mode
### Never without me saying so explicitly
reply_reject_message is irreversible. It removes the contact from the
sequence entirely. It does not just discard a draft.
Switching the AI SDR to Autonomous. Ask me twice.
### Limits
Max [N] new contacts enrolled per day without checking with me.
Never enrol a contact who is already in another live sequence.
reply_send_inbox_reply takes threadId + channel + message only:
no attachments, no scheduling, 32,000 characters maximum.
### When a call fails
Parse Success, branch on ErrorCode.
NoEmailAccounts or NoContacts means a configuration step was skipped.
Go back and fix it. Do not retry the same call.
After a timeout, verify before retrying. Never blind-retry a send.
Paginate with top/skip until HasMore is false.
## Weekly
Every Monday: sequences below [X]% reply rate, which step is losing
people, and one recommendation. Change nothing without asking.
## Packaged workflows that stop and ask
#### Import prospects
CSV in, deduplicated contacts out: mapped, verified, organised into a list.
#### Manage replies
Triage the inbox, categorise threads, draft responses. Sends only after approval.
#### Launch outreach
Verify accounts, build the sequence, enrol contacts, start, all behind a checkpoint.
#### Analyze performance
Pull reporting and identify which sequences to scale, pause or rewrite.
## Documented call graphs, not vibes
Reply publishes the exact sequence of calls for its core workflows. Each one resolves IDs first, configures where needed, confirms before the high-stakes step, and verifies afterwards, so your agent isn’t improvising a send path.
- Read-only
- Writes
- High-stakes, gate this one
### Launch a sequence safely
Resolve the sequence, make sure it has somewhere to send from, then start it, and only then.
#### Discover
reply_search_sequences
reply_get_sequence_steps
#### Configure
reply_list_email_accounts
reply_assign_email_account_to_sequence
reply_assign_schedule_to_sequence
#### Execute , confirm first
reply_start_sequence
#### Verify
reply_get_sequence_stats
### Enrol a contact
Find them before you create them, so you don’t end up with two records and two sequences.
#### Discover
reply_search_contacts
reply_search_sequences
#### Create only if missing
reply_create_contact
#### Execute , confirm first
reply_add_contact_to_sequence
#### Verify
reply_get_contact_activity
### Supervise the AI SDR in review mode
Every generated message queues for approval. Nothing reaches a person until you say so.
#### Configure
reply_set_sequence_reply_mode
#### Review
reply_list_pending_approvals
#### Act on each , one of
reply_approve_message
reply_regenerate_message
reply_reject_message
### Answer an inbox thread
Read the thread, send on the right channel, then re-categorise so the sequence behaves.
#### Discover
reply_get_inbox_emails
#### Execute , confirm first
reply_send_inbox_reply
#### Tidy up
reply_change_inbox_category
## The terminal isn’t a replacement. It’s a second door.
Faster in the terminal
Better in the dashboard
Bulk work
Enrolling hundreds of contacts, bulk status changes
Reviewing one thread carefully
Reporting
Piping stats into your own dashboard or a scheduled job
Scanning a campaign at a glance
Operations
Start / pause from a script, CI, or a cron
Mailbox health and deliverability warnings
Replies
Triage and draft at volume
Reading tone, deciding what to say
## Top-rated on G2
### 10+
years running outbound
### 3000+
businesses
### 4.6/5
on G2, from 1,480 reviews
### 98%
email delivery rate