Announcing CIMD support for MCP Client registration
Learn more

LeadIQ MCP vs LeadIQ API for AI Agents (2026)

Shri Mithran
Director of Marketing

TL;DR

  • LeadIQ MCP and the LeadIQ API have overlapping but asymmetric coverage. MCP ships first-class job-change discovery, email verification, and prospect-list writes. The GraphQL API gives you field-level response shaping, submitPersonFeedback, and grouped prospecting that returns contacts inside each company rather than a match count.
  • MCP auth is OAuth 2.0 authorization code only, issued through LeadIQ's Auth0 tenant with the api:company and offline_access scopes. The GraphQL API uses a static API key sent as Authorization: Basic <base64-key>, and the Prospector REST API uses the decoded key in X-API-Key. Your credential model changes depending on which you pick.
  • Neither surface has an event subscription. There are no webhooks on either path. Any "notify me when a champion changes jobs" agent is a polling agent regardless of which path you build against.
  • Credit spend, not rate limits, is the production constraint. A single unlocked phone number costs 10 UC against a plan balance that is shared by every user on the account, and an over-eager agent loop can burn a month of credits in one run.
  • For multi-tenant B2B agents, both paths leave you with N credentials to store, rotate, and revoke. Scalekit ships separate LeadIQ and LeadIQ MCP connectors that share one token vault, one execute_tool interface, and one audit trail, so the MCP versus API decision does not change your auth infrastructure.

Your prospecting agent needs to talk to LeadIQ. It needs to find people matching an ICP, unlock verified work emails and direct dials, and drop the results into a list a rep will actually work. LeadIQ ships two ways to do that: a hosted MCP server at mcp.leadiq.com and a GraphQL API at api.leadiq.com that has been in production for years. The two surfaces are not a superset and a subset of each other; each exposes something the other does not, and they put you on completely different credential models. Here is how to pick.

What LeadIQ MCP and the LeadIQ API actually are

These are two distinct products built on the same underlying B2B database. The MCP server is new; the API predates it by years and carries a wider historical surface. Establishing what each one actually is matters before comparing them.

The LeadIQ MCP server

LeadIQ launched its prospecting MCP server in early 2026 as a hosted, LeadIQ-maintained endpoint at https://mcp.leadiq.com/mcp. Transport is MCP Streamable HTTP with SSE-framed responses. The server is stateless: it issues no Mcp-Session-Id, and GET or DELETE against /mcp returns 405. The deprecated HTTP plus SSE transport is not offered.

Authentication is OAuth 2.0 authorization code through LeadIQ's Auth0 tenant. Clients register dynamically, so no client ID or secret needs to be provisioned by hand; the user signs in with their LeadIQ credentials and approves the api:company and offline_access scopes. LeadIQ documents fifteen tools split eleven free and four paid. Setup instructions and the tool catalogue live on the LeadIQ MCP integration page and in the LeadIQ MCP connector guide.

The LeadIQ GraphQL API and Prospector REST API

The LeadIQ Public API is GraphQL, not REST. Every request is a POST to https://api.leadiq.com/graphql with Content-Type: application/json. The schema exposes nine queries and three mutations: searchPeople, searchCompany, flatAdvancedSearch, groupedAdvancedSearch, account, lists, list, prospect, workatoToken, plus createList, addProspectToList, and submitPersonFeedback.

List management has a second, separate surface. The Prospector REST API at https://prospector.leadiq.com handles list creation, prospect insertion, and CSV export, and it authenticates with the decoded API key in X-API-Key rather than the Base64 form the GraphQL endpoint expects. Two base URLs, two header conventions, one key. Full schema at the LeadIQ Public API Reference, with auth and samples in the LeadIQ Public API Guide.

Comparing them where it matters for agents

Four dimensions decide this for an agent builder: what the surface can do, what auth model it forces, what the spend model looks like at runtime, and what you are left maintaining. LeadIQ is unusual in that the capability comparison does not resolve cleanly in favour of the API.

What your agent can actually do

Capability
LeadIQ MCP
LeadIQ API
Person enrichment by LinkedIn URL, email, or name
Yes, batched up to 10 per call
Yes, one identity per query, up to 25 candidate matches
Company enrichment by domain, name, or LinkedIn
Yes, batched up to 10 per call
Yes, via searchCompany
ICP prospecting, flat list of people
Yes, via find-people
Yes, via flatAdvancedSearch
ICP prospecting grouped by company
Partial: returns companies plus a match count
Yes: returns each company with its matching contacts
Job-change and promotion triggers
Yes, dedicated job-change tool
Limited access: jobChangeFilter is ignored unless enabled for your org
Email deliverability verification
Yes, standalone and on saved prospects
Not present in the published query set
Prospect list reads
Yes, four dedicated tools
Yes, via lists, list, prospect
Prospect list writes
Yes, create, attach, and idempotent re-attach
Partial: createList and addProspectToList, rest via Prospector REST
Field-level response shaping
No, tool outputs are fixed
Yes, GraphQL selection sets
Credit balance and live unlock prices
Yes, via check-credits
Yes, via the account query
Reporting bad contact data
No
Yes, via submitPersonFeedback
Event subscriptions or webhooks
No
No

Where MCP is genuinely ahead

The MCP server wins on write-path completeness and on trigger data. Prospect list creation, standalone prospect creation, idempotent list attachment, and email re-verification are all first-class tools.

Job-change discovery is the sharper advantage. It is available to any MCP account, whereas the GraphQL jobChangeFilter and the personJobChange field are flagged limited access and silently ignored unless LeadIQ has enabled the feature for your organization. For a champion-tracking agent, that difference is the whole product.

Where the API is genuinely ahead

The API wins on precision. GraphQL selection sets mean you ask for exactly the fields you want, and LeadIQ bills only for the data points you actually select.

groupedAdvancedSearch returns the contacts inside each company, which is what account-based multi-threading needs; the MCP find-companies tool returns companies plus a count and leaves you to enrich separately. submitPersonFeedback has no MCP equivalent either, so an agent that detects a bounce cannot close the data-quality loop over MCP.

The neither-path gap: no event surface

Neither path publishes webhooks, change data capture, or any subscription mechanism. The GraphQL schema is queries and mutations; the MCP server is request and response. If your agent needs to react to a job change, a new hire, or a verification status flip, it polls. Design for that from day one rather than discovering it after you have promised a customer real-time signals.

The auth path each one puts you on

MCP is OAuth only, per user, every time. Each rep completes a browser consent flow against LeadIQ's Auth0 tenant, and the resulting token acts as that rep. There is no static credential option, which means a background agent running on a schedule needs a pre-established, refreshable grant per user before it can do anything.

The API is API key only. There is no OAuth flow on the GraphQL surface. That makes headless execution trivial and makes per-user identity impossible without provisioning a separate key per user. And a LeadIQ API key carries full account access, so the convenient path of one shared key for the whole product is also the path where every user's agent can read and write every list in the workspace. Understanding the tradeoffs here is important — see our deeper look at OAuth vs API Keys for AI Agents for the full picture.

Credit spend is the real production constraint

LeadIQ meters in Universal Credits, and the pricing is asymmetric. A profile costs 0.1 UC, a work email 1 UC, company firmographics 3 UC, and a phone number 10 UC. An agent that unlocks phones across a 200-row prospecting run spends roughly 2,000 UC in one loop iteration.

Both paths ship a pre-flight check. Wire it into the loop rather than leaving spend to the model's judgement.

The MCP server exposes a check-credits tool returning live per-field prices, and instructs agents to disclose cost before company unlocks or any operation above 1,000 UC. On the API path, the account query returns the same balance and cost table, and Scalekit's LeadIQ connector adds a preview tool that reports whether an email or phone exists for a person without spending anything.

What you own in production

On the MCP path, LeadIQ owns hosting, tool schemas, and the consent flow. You own per-user token storage, refresh against offline_access, revocation when a rep leaves, and the credit-consent policy your agent applies before paid tools fire.

On the API path, you own the GraphQL client, two base URLs with two header conventions, pagination, retry on 429, and the distinction that trips up most first implementations: GraphQL errors arrive in the errors array with an HTTP 200. A naive response.raise_for_status() treats a failed enrichment as a success. You also own the 402 case, which means insufficient credits rather than a transient failure and should not be retried. These are exactly the kinds of tool calling auth production problems and anti-patterns worth anticipating before you ship.

The tool surface is already drifting

LeadIQ's own documentation currently describes the same MCP server three different ways. The help-center article lists tools named tool_SearchPeople, tool_FlatSearch, tool_Account, and tool_Usage. LeadIQ's certified connector listing documents a completely different naming convention with enrich-people, find-people, and check-credits, counted at fifteen. Scalekit's LeadIQ MCP connector page lists sixteen, the extra one being job-change discovery.

Three published snapshots, three surfaces, no version header anywhere in the protocol. The GraphQL API is not date-versioned either, but GraphQL's contract is structurally kinder: additive schema changes cannot break an existing selection set, and retired fields are marked in the schema itself rather than disappearing. Company.score and ProfileFilterType.HasWorkPhone both still resolve and both carry a "not supported anymore" note. Your client keeps working while you migrate.

When to use MCP, when to use the API

Use LeadIQ MCP when:

  • Your agent is interactive and the rep is present for the OAuth consent, such as a Claude or Cursor-embedded assistant that preps accounts on demand
  • Job-change and promotion triggers are core to the product and your org does not have the API's limited-access filters enabled
  • The agent writes back to LeadIQ Prospector, since list and prospect creation are complete on this surface and split across two APIs on the other
  • You want per-user identity by default, with each rep's credit consumption and list access tied to their own LeadIQ login

Use the LeadIQ API directly when:

  • The agent runs headless on a schedule and no browser consent is available at execution time
  • Credit efficiency at volume matters, and you want to select only the fields you will actually use rather than accept a fixed tool payload
  • You need grouped account-based results with contacts attached, not companies plus a count
  • Your agent closes the data-quality loop by reporting bounced emails and wrong numbers back through submitPersonFeedback
  • You need CSV export from Prospector, which lives only on the REST surface

The credential problem that exists on both paths

Both paths hand you a credential per user and neither hands you a place to keep it. That is the part that has to be solved before either path is production-safe.

API keys carry full account access

This is the sharper edge on the API path. A LeadIQ API key is not scoped to a user, a list, or a spend cap. Whichever key your agent holds, it can read every prospect list in the workspace and burn the entire credit balance. A shared key looks fine in a demo and produces a usage report where every enrichment is attributed to the same service identity, which makes per-rep credit chargeback impossible and makes offboarding a manual key-rotation exercise across the whole team.

N users, N credentials, N lifecycles

The OAuth path fixes attribution and creates a different problem. Forty reps means forty tokens to encrypt at rest, isolate per tenant, refresh before expiry, and invalidate on the next tool call when someone disconnects or leaves. Multiply that across every customer org in a multi-tenant product. The token type differs between the two paths. The infrastructure required does not. This is the core challenge explored in secure token management for AI agents at scale.

Scalekit's LeadIQ connectors handle the OAuth flow, API key vaulting, token refresh, and per-user resolution for both paths, so the MCP versus API decision does not change what you build for auth.

Building a LeadIQ agent with Scalekit

Scalekit ships LeadIQ as two separate connectors because the two surfaces really are two products. Both are reachable through the same SDK, the same execute_tool call, and the same connected-account model.

Two connectors, one auth layer

The LeadIQ connector wraps the GraphQL and Prospector APIs. It uses API key auth, needs no redirect URI, and exposes thirteen tools prefixed leadiq_. The LeadIQ MCP connector wraps the hosted MCP server, uses OAuth 2.1 with dynamic client registration, and exposes sixteen tools prefixed leadiqmcp_. Picking a path is picking a connection_name.

One note before any code: the connection_name string in your code must match the connection name configured in the Scalekit dashboard under AgentKit, Connections. Mismatched connection names are the single most common integration error.

Connect the API path with an API key

On the API path there is no authorization link and no redirect. You store the rep's LeadIQ key once, typically from an integrations settings page in your product, and Scalekit injects it into every downstream request from then on.

import os from scalekit import ScalekitClient scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENV_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) actions = scalekit_client.actions # connection_name must match the connection configured in # the Scalekit dashboard under AgentKit > Connections. actions.upsert_connected_account( connection_name="leadiq", identifier="user_123", credentials={"username": get_user_leadiq_api_key()}, )

Retrieve the tools this user is authorized to call

Before the agent loop runs, the agent needs a tool surface. This is where the connected-account model does real work: list_scoped_tools does not return the LeadIQ catalogue, it returns the tools this specific user's connected account is authorized to call. Filtering further to the four tools a prospecting agent needs keeps the decision space small, which is the lever on tool-calling accuracy.

from google.protobuf.json_format import MessageToDict IDENTIFIER = "user_123" scoped_response, _ = actions.tools.list_scoped_tools( identifier=IDENTIFIER, filter={ "connection_names": ["leadiq"], "tool_names": [ "leadiq_get_usage", "leadiq_search_people_preview", "leadiq_search_people", "leadiq_search_company", ], }, page_size=100, ) llm_tools = [ { "name": MessageToDict(t.tool).get("definition", {}).get("name"), "description": MessageToDict(t.tool).get("definition", {}).get("description", ""), "input_schema": MessageToDict(t.tool).get("definition", {}).get("input_schema", {}), } for t in scoped_response.tools ]

Run the agent loop with the Claude SDK

Scalekit returns schemas with input_schema, which is the exact shape Anthropic's tool use API expects, so nothing needs reshaping. execute_tool resolves the user's vaulted LeadIQ key server-side; the credential never enters the model context.

import anthropic claude = anthropic.Anthropic() messages = [{ "role": "user", "content": ( "Check my LeadIQ credit balance first. Then preview whether LeadIQ has a " "work email for https://www.linkedin.com/in/janedoe before spending credits, " "and only enrich if the preview says an email exists." ), }] while True: response = claude.messages.create( model="claude-sonnet-4-6", max_tokens=1024, tools=llm_tools, messages=messages, ) if response.stop_reason == "end_turn": print(response.content[0].text) break tool_results = [] for block in response.content: if block.type == "tool_use": result = actions.execute_tool( tool_name=block.name, connection_name="leadiq", identifier=IDENTIFIER, tool_input=block.input, ) tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": str(result.data), }) messages.append({"role": "assistant", "content": response.content}) messages.append({"role": "user", "content": tool_results})

Connect the MCP path with OAuth

The MCP path adds a consent step and changes nothing else about the calling convention. Same client, same executeTool, different connectionName and a leadiqmcp_ tool prefix.

import { ScalekitClient } from '@scalekit-sdk/node'; import 'dotenv/config'; const scalekit = new ScalekitClient( process.env.SCALEKIT_ENV_URL!, process.env.SCALEKIT_CLIENT_ID!, process.env.SCALEKIT_CLIENT_SECRET!, ); const actions = scalekit.actions; // Must match the connection name configured in AgentKit > Connections. const connectionName = 'leadiqmcp'; const identifier = 'user_123'; const { link } = await actions.getAuthorizationLink({ connectionName, identifier }); console.log('Authorize LeadIQ MCP:', link); // After the rep completes the OAuth flow: const credits = await actions.executeTool({ connectionName, identifier, toolName: 'leadiqmcp_check_credits', toolInput: {}, }); console.log(credits.data);

Why the Scalekit path holds up for multi-tenant LeadIQ agents

The comparison above is a build decision. The reason it stops mattering once Scalekit is in the stack is that both paths converge on the same three primitives: a per-user credential, an audited call, and a scoped tool surface. This convergence is central to how tool calling auth changes when you move from single-tenant to multi-tenant.

Downstream tool-call audit logs

Every LeadIQ tool call is logged against the user whose connected account authorized it, not against a service identity. For a data product billed in credits, that is not just a compliance artifact. It is how you answer "which rep spent 4,000 UC last Tuesday" and how you attribute a bad enrichment back to the run that produced it. Scalekit retains 90 days of that history and streams it to your SIEM or warehouse. More detail on the Scalekit LeadIQ connector page.

Virtual MCP servers for multi-tool prospecting agents

A real prospecting agent does not stop at LeadIQ. It finds the person, enriches them, and then drafts outreach in Gmail or files them in a CRM. Handing that agent the full LeadIQ MCP server plus a full Gmail server means sixteen plus thirty tools in context, most of which it will never call, and an unbounded blast radius if it misfires on a paid unlock.

Agent tool observability is what lets you detect when a multi-tool agent misfires — but the first line of defence is scoping the tool surface before the run. Virtual MCP servers fix that by declaring the exact tool set once per agent role. You get a static mcp_server_url, and per-user isolation comes from a short-lived session token minted before each run.

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping vmcp = scalekit_client.actions.mcp.create_config( name="prospecting-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="leadiqmcp", tools=[ "leadiqmcp_check_credits", "leadiqmcp_find_people", "leadiqmcp_enrich_people", "leadiqmcp_add_prospect_to_list", ], ), McpConfigConnectionToolMapping( connection_name="gmail", tools=["gmail_send_mail"], ), ], ) config_id = vmcp.config.id mcp_server_url = vmcp.config.mcp_server_url

Minting a per-user session token before each run

Setup happens once per agent role. Runtime is a connection check and a token mint, which is what keeps one server definition safe across every tenant.

from datetime import timedelta accounts = scalekit_client.actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier="user_123", include_auth_link=True, ) for account in accounts.connected_accounts: if account.connected_account_status != "ACTIVE": print(f"{account.connection_name} needs auth: {account.authentication_link}") token_response = scalekit_client.actions.mcp.create_session_token( mcp_config_id=config_id, identifier="user_123", expiry=timedelta(minutes=30), ) mcp_server = { "url": mcp_server_url, "headers": {"Authorization": f"Bearer {token_response.token}"}, }

The endpoint is static. The identity is not. Notice the check on connected_account_status before the mint: LeadIQ OAuth grants can be revoked by the rep at any time, and detecting that before the run beats discovering it halfway through a 200-record enrichment.

One tier check before you ship

Two LeadIQ sources currently disagree on plan requirements for MCP. The LeadIQ MCP integration page states that an active paid subscription is needed, while LeadIQ's certified connector documentation states that any plan including the free tier works, with credits required only for the four paid tools. Prospect list tools on the API path are also plan-gated and return a 401 from the Prospector service on Freemium accounts. Verify against your own tier before you promise a customer either path.

Which one to build against

If your agent is interactive, needs job-change triggers, and writes prospects back into LeadIQ, build against the MCP server. OAuth gives you correct per-rep attribution for free, and the write path is complete there in a way it is not on the API.

If your agent runs on a schedule, needs grouped account results with contacts attached, or has to report bad data back, build against the GraphQL API and accept the two-base-URL split for Prospector work.

Most production LeadIQ agents will use both. The interactive assistant runs on MCP; the nightly enrichment pipeline runs on GraphQL. The credential layer does not change between them, and that is the piece that has to be production-grade before either agent touches a customer's credit balance. For a broader look at credential ownership across agent tool-calling patterns, that post covers the full spectrum of identity models in production agentic systems.

Talk to other LeadIQ agent builders

Browse the Scalekit LeadIQ connector: scalekit.com/connectors/leadiq

Building a prospecting agent and want a second opinion on the auth model? Join the Scalekit Slack community, or talk to an engineer if you need help now.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
zero upfront cost.

Every feature unlocked. No hidden fees.