Connect ContactOut to Claude: Find Decision Makers and Verify Emails
Learn how to architect a managed MCP server to connect ContactOut to Claude. Automate decision-maker sourcing, bulk profile enrichment, and email verification.
If your team uses ChatGPT, check out our guide on connecting ContactOut to ChatGPT or explore our broader architectural overview on connecting ContactOut to AI Agents.
Giving a Large Language Model (LLM) read and write access to an enterprise data intelligence platform like ContactOut is fundamentally an infrastructure challenge. You need a secure translation layer between Claude's function calling capabilities and ContactOut's complex REST API. This translation layer is defined by the Model Context Protocol (MCP). You can either build, host, and maintain a custom MCP server yourself, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL.
While the open MCP standard provides a predictable way for models to discover tools, implementing it against ContactOut's specific API topology requires mapping massive nested JSON schemas, managing a strict multi-tiered credit system, and orchestrating asynchronous polling jobs. Every time ContactOut updates an endpoint, adds a new filter parameter, or changes a schema constraint, a self-hosted MCP server requires code updates and redeployment.
This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for ContactOut, connect it natively to Claude, and execute complex B2B prospecting workflows using natural language.
The Engineering Reality of the ContactOut API
A custom MCP server is essentially a self-hosted integration proxy. If you decide to build one for ContactOut, you own the entire integration lifecycle. ContactOut's API is built for high-volume data enrichment and lead sourcing, and its architectural quirks reflect that domain.
Here are the specific integration challenges you will face when mapping ContactOut endpoints to MCP tools:
The Multi-Currency Credit Ledger
ContactOut does not just rate-limit requests; it deducts specific functional credits based on the type of data requested and found. A single API call might consume a mix of Search Credits, Email Credits, Phone Credits, and Verifier Credits.
For example, calling the contact_out_people_enrich endpoint costs 1 search credit automatically. If the endpoint successfully returns an email, it deducts an additional email credit. If it finds a phone number, it deducts a phone credit. An LLM has no inherent concept of financial API constraints. If you give Claude unfettered access to a generic Search tool and it decides to loop through 500 pages of results because of a vague prompt, it will rapidly deplete your organization's quota. You must strictly define your MCP tool descriptions to instruct the LLM on exactly when to execute expensive enrichment calls.
Synchronous vs. Asynchronous Bulk Workflows
While single-profile lookups are synchronous, ContactOut handles bulk enrichment (up to 1,000 LinkedIn profiles) and bulk email verification (up to 100 emails) via asynchronous V2 endpoints.
When you call create_a_contact_out_email_verification_job, ContactOut immediately returns a 202 Accepted with a job_id and a status like QUEUED. LLMs are stateless by default and expect synchronous returns. To handle this via MCP, your server must expose paired tools: one to create the job, and another (get_single_contact_out_email_verification_job_by_id) for the LLM to explicitly poll. You have to write prompt instructions that teach the LLM the exact polling interval and state machine logic, otherwise, the agent will hallucinate a completed result instantly.
Rate Limiting and Backoff Delegation
ContactOut enforces aggressive rate limits on aggressive endpoints (e.g., the People Search API is limited to 60 requests per minute).
Crucial architectural note: Truto does not retry, throttle, or apply backoff on rate limit errors. When ContactOut's API returns an HTTP 429, Truto passes that error directly back to the caller. However, Truto normalizes the upstream rate limit information into standardized HTTP headers per the IETF specification (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller (your agent framework or Claude Desktop) is entirely responsible for interpreting these headers and executing exponential backoff. Do not rely on the MCP server to absorb rate limit spikes.
Architecting the Managed MCP Server
Rather than hand-coding tool definitions, Truto derives them dynamically from existing data sources: the integration's resource definitions and the underlying API documentation. A tool only appears in the MCP server if it has a corresponding documentation entry, ensuring only well-described, LLM-ready endpoints are exposed.
You can generate an MCP server for ContactOut in two ways.
Method 1: Via the Truto UI
- Navigate to the Integrated Accounts page in your Truto dashboard and select your connected ContactOut instance.
- Click the MCP Servers tab.
- Click Create MCP Server.
- Configure the server (set a name, select allowed methods, tags, and an optional expiration date).
- Click Create and copy the generated MCP server URL (e.g.,
https://api.truto.one/mcp/a1b2c3d4e5f6...).
Method 2: Via the API
For teams building programmatic AI environments, you can generate MCP servers dynamically. The Truto API validates that the integration has tools available, generates a secure cryptographically hashed token, stores the metadata in a distributed key-value store, and returns the endpoint.
// POST /integrated-account/:id/mcp
{
"name": "ContactOut ABM Agent Server",
"config": {
"methods": ["read", "create", "custom"],
"tags": ["enrichment", "verification"]
},
"expires_at": "2026-12-31T23:59:59Z"
}Connecting the MCP Server to Claude
Because the MCP server URL contains a cryptographic token that encodes the account routing and tool configuration, the URL itself is the only configuration required by the client.
Method A: Via the Claude UI (and ChatGPT)
If your organization uses Claude Desktop or ChatGPT's web interface:
For Claude:
- Open Claude Settings → Integrations.
- Click Add MCP Server.
- Paste your Truto MCP URL and save.
For ChatGPT:
- Navigate to Settings → Apps → Advanced settings.
- Enable Developer mode.
- Under MCP servers / Custom connectors, paste the Truto MCP URL.
Method B: Via Manual Config File
If you are configuring a custom agent or managing Claude Desktop deployments via MDM, inject the configuration directly into claude_desktop_config.json:
{
"mcpServers": {
"contactout_sourcing": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sse",
"https://api.truto.one/mcp/a1b2c3d4e5f6..."
]
}
}
}Once connected, Claude dynamically requests tools/list and parses the JSON Schema definitions generated from ContactOut's documentation.
ContactOut Hero Tools for Claude
By default, an LLM framework processes arguments as a flat JSON object. Truto automatically maps Claude's function call arguments to ContactOut's specific query parameters or JSON body fields based on the OpenAPI schema.
Here are the most high-leverage tools available on the ContactOut MCP server:
contact_out_people_search_decision_makers
This is the spearhead tool for Account-Based Marketing (ABM) workflows. It returns decision-makers at a specific company. You must pass at least one of linkedin_url, domain, or name.
Usage Note: Costs 1 search credit per profile returned. Avoid setting reveal_info=true during initial discovery, as that will immediately burn email/phone credits for every result.
"Find the VP of Engineering and the CTO at acme.com using the
contact_out_people_search_decision_makerstool. Do not reveal contact info yet, just get me their LinkedIn URLs."
contact_out_people_enrich_by_linkedin_url
Takes a single LinkedIn profile URL and returns the full ContactOut profile. If profile_only is false, it attempts to find and return associated emails and phone numbers.
Usage Note: Costs 1 email credit and 1 phone credit when contact data is found. If you only want the work history without the contact details, set profile_only=true (costs 1 search credit).
"Take the LinkedIn URL for Acme's CTO that you just found, and use
contact_out_people_enrich_by_linkedin_urlto get their full profile, including their contact information."
contact_out_contacts_bulk_enrich
Executes a synchronous V1 bulk lookup for up to 100 LinkedIn profiles simultaneously.
Usage Note: This is highly efficient for LLM context windows compared to looping over individual URLs. Returns an object keyed by the requested URL containing emails (and phones if include_phone=true). Burns credits per successful find.
"I have a list of 45 LinkedIn URLs. Pass them all to
contact_out_contacts_bulk_enrichin a single request to get their email addresses. Return the results as a clean markdown table."
contact_out_companies_search
Allows Claude to search for target accounts based on highly specific firmographics: name, domain, size, location, industry, technologies, revenue, and founding year.
Usage Note: Paging is handled by passing page in the body. Costs 1 search credit per company returned.
"Use
contact_out_companies_searchto find SaaS companies based in London with a size of 50-200 employees that use Snowflake. Give me the top 10 results."
create_a_contact_out_email_verification_job
Initiates an asynchronous bulk verification job for up to 100 email addresses to check deliverability.
Usage Note: Returns a job_id and a status. The LLM must be instructed to save this job_id and poll the corresponding GET endpoint. Costs 1 verifier credit per email that resolves to valid, invalid, or accept_all.
"Take this list of 50 scraped emails and pass them to
create_a_contact_out_email_verification_job. Note the job ID it returns."
get_single_contact_out_email_verification_job_by_id
Retrieves the results of an async verification job.
Usage Note: Returns the status (which will be DONE when complete) and a result object mapping each email to its status (valid, invalid, accept_all, disposable, or unknown).
"Check the status of the verification job using
get_single_contact_out_email_verification_job_by_id. If it is DONE, filter out all emails that are not 'valid' and give me the final clean list."
For the complete tool inventory, including individual endpoint schemas and credit consumption rules, refer to the ContactOut Integration Documentation.
Workflows in Action
Giving Claude raw API tools is only half the battle. The true power of an MCP server is orchestrating multi-step workflows autonomously. Here are two concrete examples of how Claude executes domain-specific ContactOut tasks.
Scenario 1: The Account-Based Sourcing Loop
A Sales Development Representative (SDR) needs to build a highly targeted outreach list based on firmographics, identify the key buyers, and extract their contact info without wasting credits on low-level employees.
"Search ContactOut for companies in the 'cybersecurity' industry located in 'New York' with 50-200 employees. Pick the top 3 domains. For each domain, find decision makers with the title 'CISO' or 'Director of Security'. Finally, enrich only those specific individuals to get their work emails."
Execution Steps:
- Claude calls
contact_out_companies_searchwith the parameters{ "industry": "cybersecurity", "location": "New York", "size": "50-200" }. - The server returns a list of matching companies. Claude extracts the top 3
domainvalues. - Claude iterates through the domains, calling
contact_out_people_search_decision_makersfor each, passing the domain and querying for specific titles. - Claude aggregates the
linkedin_urlvalues from the decision-makers found. - Claude calls
contact_out_contacts_bulk_enrichpassing the array of LinkedIn URLs to retrieve the final email payload.
sequenceDiagram
participant Claude as Claude Agent
participant MCP as Truto MCP Server
participant Upstream as ContactOut API
Claude->>MCP: Call contact_out_companies_search
MCP->>Upstream: POST /v1/companies/search
Upstream-->>MCP: Returns list of domains
MCP-->>Claude: JSON Array of Domains
Claude->>MCP: Call contact_out_people_search_decision_makers
MCP->>Upstream: POST /v1/decision_makers
Upstream-->>MCP: Returns CISO Profiles
MCP-->>Claude: JSON Array of LinkedIn URLs
Claude->>MCP: Call contact_out_contacts_bulk_enrich
MCP->>Upstream: POST /v1/contacts/bulk
Upstream-->>MCP: Returns Contact Info
MCP-->>Claude: Final List of Verified EmailsScenario 2: Asynchronous List Cleansing
A Marketing Ops manager has a CSV of raw, unverified lead emails from an old webinar and needs Claude to sanitize the list to protect domain sender reputation.
"I have 85 emails from our legacy database. Verify all of them through ContactOut. Create the bulk job, check it until it's finished, and return only the emails marked strictly 'valid'."
Execution Steps:
- Claude parses the emails and calls
create_a_contact_out_email_verification_job, passing the array. - ContactOut returns a
job_id(e.g.,job_9a8b7c). - Claude waits briefly, then calls
get_single_contact_out_email_verification_job_by_idwithjob_9a8b7c. - If the status is
QUEUEDorPROCESSING, Claude loops and calls the GET endpoint again. - Once the status is
DONE, Claude processes theresultmap, discardsinvalid,accept_all, anddisposableaddresses, and presents the clean list to the user.
Security and Access Control
When exposing a platform that costs actual money per API call to an autonomous LLM, access control is critical. Truto's MCP servers provide several layers of configuration to secure your ContactOut integration:
- Method Filtering: Configure the
config.methodsarray (e.g.,["read"]) to restrict the LLM entirely to GET and LIST operations. This prevents the LLM from accidentally triggering POST requests that initiate expensive bulk jobs. - Tag Filtering: Use
config.tags(e.g.,["verification"]) to scope the server. If you only want an agent to do list cleansing, tag filtering hides the sourcing and company search endpoints, severely limiting the blast radius of LLM hallucinations. - Expiration (
expires_at): You can generate time-bound MCP servers that self-destruct. The underlying distributed alarm service automatically cleans up the database record and key-value entries once the timestamp is reached. - Secondary Authentication: By setting
require_api_token_auth: true, possession of the MCP URL is no longer sufficient. The connecting client must also pass a valid Truto API token in the Authorization header, preventing leaked URLs from being used.
Moving Fast with Managed Infrastructure
Connecting ContactOut to Claude unlocks entirely new autonomous workflows for RevOps and SDR teams. Instead of clicking through UI dashboards or writing fragile Python scripts to poll bulk endpoints, your team can simply command Claude to build, verify, and format highly targeted prospect lists in minutes.
By leveraging a managed MCP server through Truto, you bypass the infrastructure tax. There is no server to host, no token refresh logic to write, and no OpenAPI schema to manually translate into tool definitions. The tools are generated dynamically, secured by standard HTTP access controls, and ready to be queried immediately.
FAQ
- How does Claude handle ContactOut's API rate limits?
- Truto passes upstream rate limit errors (HTTP 429) directly from ContactOut to the caller, normalizing the data into standard IETF headers (`ratelimit-limit`, `ratelimit-remaining`, `ratelimit-reset`). The MCP server does not absorb or retry these errors; Claude or your underlying agent framework is responsible for implementing retry and exponential backoff logic.
- Does Truto cache ContactOut data during LLM requests?
- No. MCP tool calls execute via a proxy API layer that forwards the request directly to ContactOut. Data passes through in real-time, meaning your LLM always gets the live ContactOut profile, and no PII or prospect data is cached in the integration layer.
- How does the MCP server handle ContactOut's credit system?
- The MCP server translates your natural language requests into exact API calls, but you must instruct Claude on which tools to use. Because different endpoints consume different credits (e.g., search credits vs. verifier credits), you should define strict system prompts outlining exactly when Claude is allowed to call high-cost enrichment endpoints.
- Can I limit the MCP server to only verify emails without exposing the search API?
- Yes. When creating the MCP server in Truto, you can use tag filtering or method filtering in the configuration payload to restrict the server so it only exposes email verification tools, completely hiding the people search and company search endpoints from the LLM.