Skip to content

Connect Apollo to Claude: Research Companies and Find Global Prospects

Learn how to connect Apollo to Claude using a managed MCP server. Execute company research, enrich profiles, and automate prospecting workflows with AI.

Nidhi KN Nidhi KN · · 10 min read
Connect Apollo to Claude: Research Companies and Find Global Prospects

If your team needs to connect Apollo to Claude to automate company research, enrich prospect profiles, or manage global lead databases, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's tool calls and Apollo's REST APIs. You can either build and maintain this infrastructure yourself, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL. If your team uses ChatGPT, check out our guide on /connect-apollo-to-chatgpt-enrich-profiles-and-search-lead-databases/ or explore our broader architectural overview on /connect-apollo-to-ai-agents-automate-lead-discovery-and-data-matching/.

Giving a Large Language Model (LLM) read and write access to a specialized sales intelligence platform like Apollo is an engineering challenge. You have to map highly specific search schemas to MCP tool definitions, manage complex API credit costs, and handle highly unusual endpoint design patterns. Every time you want to expose a new filter or data point, you have to update your server code, redeploy, and test the integration.

This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Apollo, connect it natively to Claude Desktop, and execute complex prospecting workflows using natural language.

The Engineering Reality of the Apollo API

A custom MCP server is a self-hosted integration layer. While the open MCP standard provides a predictable way for models to discover tools, the reality of implementing it against Apollo's APIs is painful. Apollo is built to handle massive datasets and highly specific query structures, and its API reflects that complexity.

If you decide to build a custom MCP server for Apollo, here are the specific challenges you will face:

POST Methods Expecting Query Parameters Apollo's API design includes a notorious quirk: many of its core search and enrichment endpoints are HTTP POST requests, but they expect every single parameter to be sent in the URL query string. No JSON body is accepted. For example, the apollo_people_enrichment_match endpoint is a POST request, but according to Apollo's own OpenAPI spec, every parameter is marked in: query. If an LLM attempts to send a standard JSON payload body to this endpoint, Apollo will throw a 422 Unprocessable Entity error. A managed MCP server abstracts this away by flattening the input namespace and correctly mapping the arguments into the query string before execution.

Masked Data and OAuth Scopes Not all endpoints return complete data. The list_all_apollo_mixed_people endpoint, for example, requires a master API key or a specific OAuth scope (mixed_people_api_search). If a standard API key is used, you get a 403 Endpoint Access Denied error. Even when successful, the results are intentionally partial - email and phone fields are omitted (replaced by boolean has_email flags), and last names are obfuscated (e.g., "Hu***n"). An LLM has no intuition for why the data is masked. Your MCP layer needs explicit descriptions guiding the model to use the search endpoint for discovery, and the enrichment endpoints for unlocking full data.

Credit Costs and Execution Logic Apollo charges varying credits depending on the operation and the outcome. A people enrichment match costs 0 credits if no match is found, but 1 - 9 credits if a match is successful (and more if a mobile phone is revealed). Searching mixed companies costs 1 credit per page. Giving an LLM raw access to these endpoints without strict pagination constraints can burn through your monthly API limits in minutes if an agent gets caught in a loop.

Strict Rate Limiting Behavior It is critical to understand how rate limits function when using Truto as an MCP provider. Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream Apollo API returns an HTTP 429 Too Many Requests, Truto passes that error directly to the caller. Truto normalizes the upstream rate limit information into standardized HTTP headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF specification. The caller (whether that is Claude Desktop or a custom LangGraph orchestration layer) is entirely responsible for detecting the 429 status, reading the ratelimit-reset header, and applying proper retry and backoff logic.

Generating a Managed MCP Server for Apollo

Instead of building a custom Node.js or Python server to translate JSON-RPC requests into Apollo's specific formats, you can use Truto to generate a managed MCP server dynamically. Truto creates an authenticated endpoint (/mcp/:token) that exposes Apollo's resources as fully typed MCP tools.

You can generate this server via the Truto UI or the API.

Method 1: Via the Truto UI

If you are setting up an agent for internal use, the UI is the fastest path.

  1. Log into Truto and navigate to the Integrated Accounts page.
  2. Select your connected Apollo instance.
  3. Click the MCP Servers tab.
  4. Click Create MCP Server.
  5. Select your desired configuration (e.g., name the server, filter to read methods only, set an expiration date).
  6. Copy the generated MCP Server URL (e.g., https://api.truto.one/mcp/a1b2c3d4e5f6...).

Method 2: Via the Truto API

If you are building an application that provisions AI agents for your own users, you should generate MCP servers programmatically.

Make a POST request to the /integrated-account/:id/mcp endpoint:

curl -X POST https://api.truto.one/integrated-account/{integrated_account_id}/mcp \
  -H "Authorization: Bearer YOUR_TRUTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Apollo Research Agent",
    "config": {
      "methods": ["read", "custom"],
      "tags": ["prospecting"]
    }
  }'

Truto returns a secure, authenticated URL backed by a hashed token in Cloudflare KV:

{
  "id": "mcp_token_9x8y7z",
  "name": "Apollo Research Agent",
  "config": {
    "methods": ["read", "custom"],
    "tags": ["prospecting"]
  },
  "expires_at": null,
  "url": "https://api.truto.one/mcp/a1b2c3d4e5f67890"
}

This URL is completely self-contained. It encodes the tenant routing, authentication, and specific tool filters. You pass this single string directly to your MCP client.

Connecting the Apollo MCP Server to Claude

Once you have your Truto MCP URL, you need to register it with Claude. There are two primary methods to do this depending on your client environment.

Method A: Via the Claude Desktop UI

For users operating directly inside the Claude Desktop application or web interface:

  1. Open Claude and navigate to Settings.
  2. Click on Integrations (or Connectors depending on your plan tier).
  3. Select Add MCP Server or Add custom connector.
  4. Paste the Truto MCP URL (https://api.truto.one/mcp/...) into the Server URL field.
  5. Click Add.

Claude will immediately initiate an MCP handshake (initialize request) and pull down the complete list of Apollo tools and JSON schemas.

Method B: Via the Configuration File

For advanced users, developers, or headless agent setups, you can connect the server by modifying the claude_desktop_config.json file. Truto's MCP servers communicate over Server-Sent Events (SSE).

Locate your configuration file:

  • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Add the Truto endpoint using the official @modelcontextprotocol/server-sse transport wrapper:

{
  "mcpServers": {
    "apollo_truto": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "https://api.truto.one/mcp/a1b2c3d4e5f67890"
      ]
    }
  }
}

Restart Claude. The integration is now active and ready for prompt execution.

Hero Tools for Apollo

Truto dynamically generates MCP tools by parsing Apollo's integration documentation and endpoint schemas. Here are the highest-leverage tools available for your AI agents.

apollo_people_enrichment_match

Finds a single person by their email, LinkedIn URL, or name alongside their organization name, and returns an enriched profile. This tool handles the quirk of sending all parameters as a query string despite being a POST request.

Note: This costs 1 - 9 credits per successful match. Phone numbers cannot be revealed through this synchronous method, as Apollo relies on async webhooks for that data.

"I need to enrich the profile for Jane Doe who works at Acme Corp. Use the Apollo people enrichment tool to find her current title, location, and validated email address."

apollo_organizations_enrich

Finds a single company by domain, LinkedIn URL, or website and returns its fully enriched firmographic profile. It costs 1 credit per organization matched.

"Enrich the organization data for stripe.com. I need their estimated employee count, total funding, and industry classification."

list_all_apollo_mixed_people

Searches the Apollo database for people based on highly specific filters. This endpoint is free (0 credits) but returns partial, masked data (last names are obfuscated, emails are hidden behind boolean flags).

Note: This requires an API key with the mixed_people_api_search OAuth scope.

"Find me a list of Vice Presidents of Engineering working at companies in the SaaS sector with more than 500 employees. Return the first 10 results."

list_all_apollo_mixed_companies

Searches the Apollo database for companies based on firmographic filters. Unlike the people search, this costs 1 credit per page and returns full, unmasked company records.

"Search for series B startups in the artificial intelligence sector located in San Francisco. Provide a list of their domains."

get_single_apollo_contact_by_id

Retrieves a complete, unmasked contact record from your existing saved Apollo database using the specific contact ID. This is standard CRUD functionality for managing leads you have already unlocked.

"Fetch the full contact record for Apollo ID 64a8b2c1e4f3. I need to see if we have logged any recent activities with them."

create_an_apollo_contact

Adds a new, explicitly defined contact into your Apollo CRM database. This is used when you are sourcing leads externally and want to push them into Apollo sequences.

"Create a new contact in Apollo for John Smith. His email is jsmith@example.com, and he works at Example Industries."

For the complete list of available operations and full schema details, visit the Apollo integration page.

Workflows in Action

Exposing individual tools is only the first step. The real power of an MCP server is allowing Claude to chain these operations together to automate multi-step research and prospecting tasks.

Scenario 1: Account Research and Enrichment

Imagine a scenario where an SDR wants to research a competitor's customer base and enrich the target organization before reaching out.

"Search for companies in the logistics sector located in Europe. Take the top result, enrich its organization profile to get the exact employee count, and then find 5 executives who work there."

sequenceDiagram
    participant Claude as Claude Desktop
    participant MCP as Truto MCP Server
    participant Upstream as "Upstream API (Apollo)"

    Claude->>MCP: Call list_all_apollo_mixed_companies<br>(industry: logistics, location: Europe)
    MCP->>Upstream: POST /mixed_companies/search
    Upstream-->>MCP: Returns list of matching companies
    MCP-->>Claude: Returns company data (e.g., EuroLogistics)
    
    Claude->>MCP: Call apollo_organizations_enrich<br>(domain: eurologistics.com)
    MCP->>Upstream: POST /organizations/enrich
    Upstream-->>MCP: Returns enriched firmographics
    MCP-->>Claude: Returns full company profile
    
    Claude->>MCP: Call list_all_apollo_mixed_people<br>(domain: eurologistics.com, titles: executive)
    MCP->>Upstream: POST /mixed_people/search
    Upstream-->>MCP: Returns masked executive data
    MCP-->>Claude: Returns list of 5 executives

Step-by-step breakdown:

  1. Claude calls list_all_apollo_mixed_companies to find logistics companies in Europe.
  2. Upon receiving the results, Claude extracts the domain of the top company.
  3. Claude passes that domain into apollo_organizations_enrich to gather deeper firmographic details.
  4. Claude takes the domain and calls list_all_apollo_mixed_people, filtering for executive titles, to generate a masked contact list for the user to review.

Scenario 2: High-Value Prospect Sourcing

In this scenario, a recruiter wants to find engineering leaders at a specific competitor and unlock their profiles for immediate outreach.

"Find the Director of Engineering at acme.com. Once you find their masked profile, use the enrichment tool to unlock their full details and validated email."

sequenceDiagram
    participant Claude as Claude Desktop
    participant MCP as Truto MCP Server
    participant Upstream as "Upstream API (Apollo)"

    Claude->>MCP: Call list_all_apollo_mixed_people<br>(domain: acme.com, title: Director of Engineering)
    MCP->>Upstream: POST /mixed_people/search
    Upstream-->>MCP: Returns masked profile (e.g., J**n S***h)
    MCP-->>Claude: Returns masked prospect data
    
    Claude->>MCP: Call apollo_people_enrichment_match<br>(first_name: John, last_name: Smith, domain: acme.com)
    MCP->>Upstream: POST /people/match
    Upstream-->>MCP: Returns full enriched profile
    MCP-->>Claude: Returns unmasked email and details

Step-by-step breakdown:

  1. Claude calls list_all_apollo_mixed_people with the target domain and title. This costs 0 credits but returns partial data.
  2. Claude extracts the necessary identifiers from the masked result.
  3. Claude calls apollo_people_enrichment_match using those identifiers to pay the credit cost and unlock the full profile, returning the prospect's validated email address to the user.

Security and Access Control

When connecting an AI agent to a high-value database like Apollo—where API calls cost physical credits—you must enforce strict access boundaries. Truto's MCP servers include native security controls configured at the token level:

  • Method Filtering: Restrict the server using config.methods. You can limit Claude to ["read"] operations (e.g., list, get), preventing the model from accidentally calling create or update methods and altering your CRM data.
  • Tag Filtering: Group specific tools using config.tags. For example, you can create a server that only exposes tools tagged with prospecting, hiding unrelated Apollo administrative endpoints.
  • require_api_token_auth: By default, possessing the MCP server URL grants access. By setting require_api_token_auth: true, the MCP client must also pass a valid Truto API token in the Authorization header, adding a second layer of identity verification.
  • expires_at: For contractors or temporary automated workflows, you can append an ISO datetime to the expires_at field. Once the timestamp passes, Cloudflare KV automatically purges the token, and a Durable Object alarm cleans up the database record, immediately terminating access.

Strategic Wrap-Up

Building an AI agent that can autonomously prospect, enrich, and research companies requires more than just connecting an LLM to an API. Apollo's unique endpoint structures, complex data masking, and strict rate limits make it a difficult target for naive integration code. By leveraging a managed MCP server via Truto, you bypass the infrastructure headache of mapping schemas and managing authentication.

Instead of writing boilerplate Node.js code to translate Claude's JSON-RPC requests into Apollo's specific query-string POST formats, you can generate a secure, scoped toolset in seconds and focus entirely on engineering the perfect prospecting prompts.

FAQ

Does Truto automatically handle Apollo's API rate limits?
No. Truto does not retry, throttle, or apply backoff on rate limit errors. When Apollo returns an HTTP 429, Truto passes that error directly to the caller. Truto normalizes the upstream rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller is responsible for implementing retry and backoff logic.
How do I deal with Apollo endpoints that require query parameters for POST requests?
When using Truto's auto-generated MCP tools, the underlying schemas correctly map the arguments. The MCP router automatically extracts the caller's arguments and maps them into the query string as required by Apollo's OpenAPI specification, ignoring standard JSON body rules for these specific endpoints.
Can I limit the Claude MCP server to only read operations?
Yes. When generating the MCP token in Truto, you can pass an array of allowed methods (e.g., ["read"]). This ensures the AI model only discovers and uses safe, read-only tools like searching for people or enriching organizations.

More from our Blog