apollomcpoutbound

Apollo + Scavio + Claude MCP: The Outbound Loop

Apollo for identity, Scavio for live signal, Claude Code MCP for the reasoning. The reference outbound architecture for 2026.

6 min read

Apollo gives you the contact record. Scavio gives you the context. Claude Code with MCP wires both into a loop that runs outbound without a human touching a keyboard. This post is the reference architecture: how the three fit together, what each tool actually does, and the gotchas.

What Each Tool Is Actually Good At

Using all three sounds redundant until you look at the failure modes. Apollo's 270M contact database is broad but stale. Scavio's live public data is fresh but has no email addresses. Claude Code has the reasoning but no CRM state. Use each for what it does well.

  • Apollo: canonical contact identity (name, email, title, employer). Source of truth for "who".
  • Scavio: live signal per account (recent news, Reddit mentions, YouTube interviews). Source of truth for "why now".
  • Claude Code + MCP: the agent loop that combines them into a personalized message.

The Outbound Loop

Four steps, all automated:

  1. Pull next batch of Apollo contacts matching ICP
  2. For each contact's company domain, fetch live context from Scavio
  3. Claude drafts a message combining Apollo identity + Scavio signal
  4. Message lands in a review inbox for human approval before send

Wiring MCP to Both

Both Apollo and Scavio expose MCP servers. The .mcp.jsonin your Claude Code workspace registers both so the agent has direct access to contact records and live signals in the same session.

JSON
{
  "mcpServers": {
    "apollo": {
      "command": "npx",
      "args": ["-y", "@apollo/mcp"],
      "env": { "APOLLO_API_KEY": "your_apollo_key" }
    },
    "scavio": {
      "command": "npx",
      "args": ["-y", "@scavio/mcp"],
      "env": { "SCAVIO_API_KEY": "your_scavio_key" }
    }
  }
}

The Claude Skill That Runs It

// ~/.claude/skills/outbound-loop/index.ts
export async function runLoop({ batchSize = 20 }: { batchSize?: number }) {
  // Claude pulls contacts via Apollo MCP
  // For each, calls Scavio MCP for live context
  // Composes a draft using both signals
  // Writes drafts to a review table
  // See the reference implementation for the full code
}

The Prompt That Matters

Claude needs specific instructions on what makes a good outbound message. "Personalize the opener" is too vague. The prompt that consistently gets replies:

Text
You are writing an outbound cold email.

Contact (from Apollo): {{apollo_record}}
Recent company signals (from Scavio): {{scavio_signals}}

Write a 4-line email:
- Line 1: reference one specific Scavio signal (not funding unless it's the only signal)
- Line 2: connect it to a pain our product solves
- Line 3: one-line pitch with a specific number
- Line 4: a direct question that is easy to answer

Do not start with "I noticed" or "I saw". Start with the specific fact.

Why This Beats Clay For Outbound

Clay is great if you want a visual pipeline. This setup is better if you want the LLM to do the reasoning, which matters for outbound because generic templates have collapsed response rates since 2025. The LLM reads the Scavio signal and decides which angle to lead with per contact, instead of running a static template per row.

Cost Per Contact

Apollo: roughly $0.05-0.10 per enriched contact on paid plans. Scavio: ~60 credits (~$0.003) for live signals. Claude LLM: ~$0.02 in tokens. Full cost per personalized draft: under $0.15. Response rates on specific-signal messages in 2026 hover around 3-5%, which pencils at ~$3-5 per reply, not bad for lukewarm outbound.

The full Claude skill, .mcp.json, and prompt template are in the Claude Code outbound loop reference. Apollo and Scavio keys plug in and it runs.