Connect ZoomInfo to Claude: Track News, Scoops, and Company Structures
Learn how to build a managed MCP server to give Claude secure, read-and-write access to ZoomInfo for automated prospecting and intent tracking.
If your team needs to connect ZoomInfo to Claude to automate B2B prospecting, track buyer intent signals, or monitor corporate hierarchies, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's natural language tool calls and ZoomInfo's specialized 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-zoominfo-to-chatgpt-enrich-contact-and-company-intent-data/ or explore our broader architectural overview on /connect-zoominfo-to-ai-agents-automate-prospecting-and-tech-insights/.
Giving a Large Language Model (LLM) read and write access to a sprawling data intelligence platform like ZoomInfo is an engineering challenge. You have to handle OAuth 2.0 token lifecycles, map massive JSON schemas to MCP tool definitions, and deal with ZoomInfo's strict API quotas and specialized credit logic. Every time ZoomInfo updates an endpoint or modifies an intent category, 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 ZoomInfo, connect it natively to Claude Desktop, and execute complex go-to-market workflows using natural language.
The Engineering Reality of the ZoomInfo 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 ZoomInfo's specific APIs is painful. ZoomInfo is built to manage massive scale firmographics, intent data, and news scopes. Its API reflects that complexity.
If you decide to build a custom ZoomInfo MCP server, here are the specific integration challenges you will face:
Granular OAuth Scopes and 403 Errors
ZoomInfo enforces strict access control through OAuth scopes linked directly to your organization's licensing SKUs. If you attempt to access Intent Signals or News without explicitly enabling api:data:intent or api:data:news on your OAuth app (and paying for the underlying package), the API returns obscure ZI0002 or ZI0003 403 Forbidden errors. An LLM cannot debug a licensing error. Your MCP server must present only the tools that match the authorized scopes to prevent Claude from constantly hallucinating or crashing on permission denials.
The Dual Credit and Record Quota System
ZoomInfo does not use simple rate limiting - it uses a dual-quota system consisting of Requests, Credits, and Records. When you call an enrichment endpoint like zoom_info_companies_enrich, you are charged a Request count. If a record is matched and returned, you are charged a Credit (unless it is already under management). If a record results in a NO_MATCH, it does not consume a Credit, but it still counts against your Record Limit. You must architect your tool schemas to ensure Claude batches queries (up to 25 companies per request) to avoid rapidly draining your API quotas through inefficient, single-record lookups.
Manual Pagination on Enrichment Endpoints
Unlike standard CRUD APIs that use cursors for all list operations, ZoomInfo relies on strict page.number and page.size integer pagination for enrichment endpoints (like Intent and News). Truto does not auto-paginate these specific enrich calls, meaning it returns the data array exactly as requested. To parse the total available pages, REST callers must append truto_response_format=raw to read meta.page.total. For Claude, you must explicitly define these pagination parameters in the tool schema so the agent knows how to traverse multiple pages of buyer intent data without getting stuck in a loop.
Unforgiving Rate Limits
ZoomInfo's rate limits are notoriously strict. It is critical to understand that Truto does not retry, throttle, or apply backoff on rate limit errors. When ZoomInfo returns an HTTP 429 Too Many Requests, Truto passes that error directly to the caller. Truto normalizes the upstream rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF spec. The caller - in this case, your MCP client or AI orchestration layer - is entirely responsible for detecting the 429 and implementing exponential backoff. Do not assume the integration middleware will absorb rate limit spikes.
Creating the ZoomInfo MCP Server
Truto derives MCP tools dynamically from ZoomInfo's API resources and documentation. A tool only appears in the MCP server if it has a corresponding documentation entry - this acts as a quality gate to ensure only well-documented endpoints are exposed to Claude.
You can generate an MCP server for a connected ZoomInfo account in two ways: via the Truto UI or programmatically via the API.
Method 1: Via the Truto UI
- Log into your Truto dashboard and navigate to the integrated account page for your ZoomInfo connection.
- Click the MCP Servers tab.
- Click Create MCP Server.
- Select your desired configuration. You can filter the server to only expose specific tags (e.g., "enrichment", "intent") or specific methods (e.g., "read").
- Copy the generated MCP server URL.
Method 2: Via the Truto API
For platform builders provisioning AI agents dynamically, you can generate MCP servers programmatically.
Make a POST request to /integrated-account/:id/mcp with your desired configuration:
// POST https://api.truto.one/integrated-account/<zoominfo_account_id>/mcp
// Header: Authorization: Bearer <your_truto_api_key>
{
"name": "ZoomInfo Prospecting Agent",
"config": {
"methods": ["custom", "read"],
"tags": ["enrich", "intent", "scoops"]
},
"expires_at": "2026-12-31T23:59:59Z"
}The API returns a fully configured, authenticated MCP server URL:
{
"id": "mcp-zoom-789",
"name": "ZoomInfo Prospecting Agent",
"config": { "methods": ["custom", "read"], "tags": ["enrich", "intent", "scoops"] },
"expires_at": "2026-12-31T23:59:59Z",
"url": "https://api.truto.one/mcp/z1x2c3v4b5n6m7..."
}Connecting the MCP Server to Claude
Once you have the Truto MCP URL, you can connect it to Claude Desktop. You can do this through the Claude UI or by editing the local configuration file.
Method 1: Via the Claude UI
- Open Claude Desktop.
- Navigate to Settings -> Integrations -> Add MCP Server.
- Provide a name for the server (e.g., "ZoomInfo (Truto)").
- Paste the Truto MCP URL you copied earlier.
- Click Add. Claude will instantly handshake with the Truto server, fetch the tool definitions, and make them available in your chat context.
Method 2: Via the Configuration File
If you prefer managing your MCP connections as code, you can edit the Claude Desktop configuration file directly. Truto MCP URLs utilize Server-Sent Events (SSE) for remote transport.
Open your claude_desktop_config.json file (typically located in ~/Library/Application Support/Claude/ on macOS or %APPDATA%\Claude\ on Windows) and add the following:
{
"mcpServers": {
"zoominfo_truto": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sse",
"https://api.truto.one/mcp/z1x2c3v4b5n6m7..."
]
}
}
}Restart Claude Desktop. The agent will initialize the connection and load the ZoomInfo tools.
Hero Tools for ZoomInfo
Truto automatically generates descriptive, snake_case tool names based on ZoomInfo's resources. The query and body parameters share a flat input namespace, and Truto's schemas determine exactly how the arguments are routed.
Here are the highest-leverage tools available for ZoomInfo.
zoom_info_companies_enrich
This is the core B2B firmographic tool. It allows Claude to enrich up to 25 ZoomInfo company records per call. The tool matches on identifiers like companyId, companyWebsite, or ipAddress (note: if using IP, it must be the sole input for a record). It returns per-record attributes carrying requested outputFields such as name, website, revenue, and social media URLs.
Usage Note: Failed matches (meta.matchStatus: NO_MATCH) do not incur a credit, but they do consume overall Record limits. Ensure Claude batches queries when researching multiple domains.
"I have a list of three competitor domains: competitor-a.com, competitor-b.com, and competitor-c.com. Use zoom_info_companies_enrich to find their latest reported revenue and current employee headcount."
zoom_info_contacts_enrich
This tool enriches up to 25 ZoomInfo contacts per request using matchPersonInput (which accepts personId or a combination of name and company details). It returns detailed attributes including company data, names, job titles, and contact accuracy scores.
Usage Note: Email addresses and phone numbers are strictly governed by your API package. Ensure Claude requests specific outputFields to limit payload bloat.
"I found a person ID '1122334455' in a previous search. Run zoom_info_contacts_enrich to pull their current job title, accuracy score, and direct dial information."
zoom_info_intents_enrich
Fetch Intent Signals for a single company to determine if they are actively researching your product category. This requires passing a company identifier and an array of topics (between 1 and 50 intent topics per request).
Usage Note: This tool strictly requires the api:data:intent scope enabled on your ZoomInfo OAuth app. Charges apply as a single credit for the enriched company. The results are paged; instruct Claude to increment page.number if it needs more than page.size records.
"Check if truto.one is showing buyer intent for the topics 'API Integration' and 'Data Warehousing'. Use zoom_info_intents_enrich and return their audience strength and signal score."
zoom_info_news_enrich
Enrich a specified ZoomInfo company with relevant, recent news articles. This requires a companyId in the data attributes.
Usage Note: This tool requires the api:data:news scope. It is incredibly useful for triggering automated outreach based on positive PR events. A credit is counted for the enriched company, not per article returned.
"Find the latest news articles for company ID '88776655'. Filter the results for anything published in the last 14 days involving executive leadership changes."
zoom_info_scoops_enrich
Search ZoomInfo Scoops (actionable intelligence and news items) for a specific company. Returns attributes like company descriptions, scoop types, topics, and original published dates.
Usage Note: Requires api:data:scoops. Scoops differ from standard news as they are often curated B2B intelligence (e.g., "Company X is evaluating new CRM vendors").
"Use zoom_info_scoops_enrich on target company 'acme-corp.com' to see if there are any recent scoops related to IT spending or infrastructure overhauls."
zoom_info_corporate_hierarchies_enrich
Enrich the corporate hierarchy of up to 25 companies per request. This tool maps out parent companies, subsidiaries, and franchise locations within the ZoomInfo database.
Usage Note: Requires the api:data:company scope. It returns a familyTree object. This is essential for ABM (Account-Based Marketing) strategies to prevent sales reps from stepping on each other's toes when selling into subsidiaries of a master holding company.
"We just closed a deal with 'Yum Brands'. Use zoom_info_corporate_hierarchies_enrich to map out their subsidiaries so we can build a targeted cross-sell campaign."
For the complete inventory of tools, schemas, and required properties, visit the ZoomInfo integration page.
Workflows in Action
Giving an AI agent raw API access is only valuable if it can chain operations together to solve actual business problems. Here is how Claude handles complex ZoomInfo workflows autonomously.
Scenario 1: Prospecting and Intent Scoring
Persona: SDR/BDR Manager automating account research.
"I need to qualify 'TechLogix Inc'. First, use zoom_info_companies_enrich to get their companyId and revenue. If their revenue is over $50M, use zoom_info_intents_enrich with topics 'Cloud Security' and 'Zero Trust'. Finally, if they have a signal score above 80, map out their subsidiaries using zoom_info_corporate_hierarchies_enrich."
How Claude executes this:
zoom_info_companies_enrich: Claude passes the domaintechlogix.comto fetch the base firmographics, retrieving the internalcompanyIdand confirming revenue exceeds $50M.zoom_info_intents_enrich: Claude uses the newly acquiredcompanyIdalong with the requested topics to query the intent database.- Conditional Logic: The agent parses the returned payload. The
signalScoreis 92. zoom_info_corporate_hierarchies_enrich: Claude executes a final call to map the family tree, returning three targetable subsidiaries to the SDR.
sequenceDiagram
participant ClaudeUI as Claude Desktop
participant TrutoMCP as Truto MCP Server
participant ZIApi as "ZoomInfo API"
ClaudeUI->>TrutoMCP: zoom_info_companies_enrich(domain)
TrutoMCP->>ZIApi: POST /enrich/company
ZIApi-->>TrutoMCP: 200 OK (companyId, revenue)
TrutoMCP-->>ClaudeUI: Schema Mapped Result
ClaudeUI->>TrutoMCP: zoom_info_intents_enrich(companyId, topics)
TrutoMCP->>ZIApi: POST /enrich/intent
ZIApi-->>TrutoMCP: 200 OK (signalScore)
TrutoMCP-->>ClaudeUI: Schema Mapped Result
ClaudeUI->>TrutoMCP: zoom_info_corporate_hierarchies_enrich(companyId)
TrutoMCP->>ZIApi: POST /enrich/hierarchy
ZIApi-->>TrutoMCP: 200 OK (familyTree)
TrutoMCP-->>ClaudeUI: Schema Mapped ResultScenario 2: Executive Change Alerts
Persona: RevOps Engineer maintaining CRM data hygiene.
"Monitor 'Stark Industries' for executive changes. Run zoom_info_scoops_enrich to check for any 'Leadership Change' scoops in the last 30 days. If you find a new executive, run zoom_info_contacts_enrich to retrieve their direct contact info and accuracy score."
How Claude executes this:
zoom_info_scoops_enrich: Claude queries the scoops endpoint using the company name. It filters the returned array forscoopType: "Leadership Change".- Data Extraction: Claude identifies a text payload in the scoop stating "Jane Doe appointed as new CIO". It extracts the name.
zoom_info_contacts_enrich: Claude constructs a query using the name "Jane Doe" and company "Stark Industries" (matchPersonInput).- Result Delivery: Claude returns Jane Doe's
personId, job title, contact accuracy score, and contact hints.
Security and Access Control
When exposing a massive database like ZoomInfo to an LLM, security and cost control are paramount. Truto's MCP tokens are fully self-contained and heavily configurable to restrict agent capabilities.
- Method Filtering: You can restrict the MCP server to only perform specific operations. Setting
config.methods: ["read"]ensures the agent can query data but cannot trigger state-changing methods. - Tag Filtering: Truto allows you to group tools by tags. By configuring
config.tags: ["intent"], the server will completely hide all contact, news, and company enrichment tools, exposing only the intent-related endpoints. This reduces the LLM's context window and minimizes hallucinated tool calls. - Time-To-Live (Expires At): By setting the
expires_atfield (e.g., 7 days in the future), Truto schedules a Durable Object alarm that permanently deletes the server configuration and underlying KV tokens upon expiration. This is ideal for granting contractors or temporary autonomous workers short-lived access to ZoomInfo data. - Require API Token Auth: By default, possession of the Truto MCP URL grants access to the tools. If you enable
require_api_token_auth: true, the standard Truto session middleware is enforced. The connecting client must also pass a valid Truto API token in theAuthorizationheader, meaning URL leakage alone is not a security risk.
Moving Past Manual Data Sourcing
Connecting ZoomInfo to Claude via a managed MCP server transforms a static intelligence database into an active, autonomous participant in your go-to-market strategy. By abstracting away OAuth flows, API quotas, and schema drift, your engineering team can focus on designing high-leverage prompts instead of wrestling with rate limit headers.
Whether you are building automated SDR agents to parse intent signals, or RevOps workflows to monitor corporate hierarchies, Truto provides the secure, dynamic toolset necessary to execute the job reliably.
FAQ
- How does Truto handle ZoomInfo rate limits?
- Truto does not retry, throttle, or apply backoff to rate limit errors. When ZoomInfo returns an HTTP 429, Truto passes that error directly to the caller, normalizing the upstream rate limit info into standardized IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller is responsible for implementing retry logic.
- Do failed ZoomInfo enrichments cost credits?
- If a record returns NO_MATCH, it does not incur a credit. However, every enriched record does count against your overall API Record Limit.
- Why am I getting ZI0002 or ZI0003 errors?
- These 403 Forbidden errors typically occur when your ZoomInfo OAuth app or package lacks the necessary scopes for specific endpoints, such as api:data:intent for intents or api:data:news for news enrichment.
- How do I connect the Truto MCP Server to Claude Desktop?
- You can connect it via the Claude UI under Settings > Integrations > Add MCP Server, or manually by editing the claude_desktop_config.json file and using the npx @modelcontextprotocol/server-sse command.