> Enrich.chat gives AI agents verified work emails and mobiles. To use it from an agent, read https://enrich.chat/agents.md . This is the Markdown version of https://enrich.chat/use-cases/ai-sdr-agents/

# Contact data for AI SDR agents, over MCP or API

Add one MCP server and your agent can count a market, search people, reveal work emails with a status and draft the first line. You approve every send.

By Enrich.chat Editorial. Updated October 19, 2026.

**Short answer:** Give an AI SDR agent contact data by adding Enrich.chat's MCP server. Use `enrich.chat/mcp` for 10 lookups a day at no cost and no sign-in, or `enrich.chat/mcp/oauth` to sign in with OAuth so the agent spends your plan's credits. The agent can count, search, reveal a work email with its status and draft a message. It cannot send or sequence.

## Key takeaways

- Two MCP addresses: `enrich.chat/mcp` needs no sign-in and gives 10 lookups a day at no cost, and `enrich.chat/mcp/oauth` signs in with your account and spends your plan's credits.
- The server has 11 tools: count for free, search people and companies, reveal a work email or mobile, and check the free quota.
- Rules for the agent: never guess an address, treat `catch_all` as risky, and stop on a 402.
- For a big batch, start a background job over the REST API. It keeps running after the agent disconnects, and a signed webhook tells your app when it finishes.
- Gaps: Enrich.chat does not send, sequence, track or run on a schedule. A person approves every send.

## What an AI SDR builder gets

- **Two MCP addresses.** enrich.chat/mcp needs no sign-in. enrich.chat/mcp/oauth signs in with your account and uses your plan.
- **Count before you spend.** search_people with count_only is free, so the agent sizes a market before it lists anyone.
- **A status on every email.** Each work email is verified, catch_all or unknown, so the agent can flag risk before it writes.
- **A sentence or filters.** Search in plain English or with filters, including more_filters. interpreted_as shows how the request was read.
- **Your plan's credits.** 10 credits per work email found, 250 per mobile. Not found costs nothing.
- **You stay in control.** Disconnect the app in your dashboard at any time. A person approves every send.

## From MCP server to approved draft

1. **Add the MCP server.** Add `enrich.chat/mcp` to try it, or `enrich.chat/mcp/oauth` to use your plan. The [install page](https://enrich.chat/install/) has steps for each app.
2. **Write the brief.** Say who to find, to count first, and what the agent must never do. Start the prompt with "Use www.enrich.chat".
3. **Approve, then send.** Review each draft. Send from your own mailbox or sequencer, because Enrich.chat does not send.

## What contact data does an AI SDR agent need?

An AI SDR agent needs four things from a data source: people who match your target, a free way to count them before it spends anything, a work email with a status, and a clear signal when a limit is reached. A language model cannot supply these from memory. A 2025 paper, [Why Language Models Hallucinate](https://arxiv.org/abs/2509.04664), argues that training and testing reward guessing over admitting doubt, so an agent with no data tool can invent an address.

Bad data does the rest of the damage. [Common Room's write-up on AI SDRs](https://www.commonroom.io/blog/ai-sdr/) names wrong people, stale titles and duplicate CRM records as the kind of data an agent acts on with confidence. A status on each field gives the agent something to check before it writes. Our [data API for AI agents](https://enrich.chat/agents/) page covers the general case, and [how to build an AI SDR](https://enrich.chat/blog/how-to-build-an-ai-sdr/) walks through a full build.

## Which MCP address should an AI SDR use, /mcp or /mcp/oauth?

Use `https://enrich.chat/mcp` to try it and `https://enrich.chat/mcp/oauth` to run on your plan. Both addresses expose the same 11 tools.

|  | No sign-in | Your plan |
| --- | --- | --- |
| Address | `enrich.chat/mcp` | `enrich.chat/mcp/oauth` |
| Sign-in | None | Your Enrich.chat account, over OAuth 2.1 with PKCE |
| What it uses | 10 lookups a day, at no cost | Your plan's credits, shared by your whole team, or your own free lookups |
| Best for | Trying a prompt or a prototype | An agent doing real work for your team |
| How to remove it | Delete the connector in the app | Disconnect it in the dashboard at Connect an agent |

The OAuth address follows the MCP authorization specification. In the [June 18, 2025 revision](https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization), clients must use PKCE, and clients and servers should support [dynamic client registration](https://www.rfc-editor.org/rfc/rfc7591), so an app can get a client ID without a person filling in a form. [PKCE](https://www.rfc-editor.org/rfc/rfc7636) protects a sign-in code from being intercepted and reused. The [July 28, 2026 revision](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization) marks registration as deprecated in favor of client ID metadata documents and keeps it for older setups. You handle none of this by hand: the app opens a login page, you press Allow, and the app receives a token.

Claude's help center describes [adding a remote MCP server as a custom connector](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp) and choosing how people sign in. In Claude Code, run `claude mcp add --transport http enrich https://enrich.chat/mcp/oauth`. ChatGPT takes it as a Developer mode connector. The [install page](https://enrich.chat/install/) has Cursor, VS Code and Codex steps.

## Which Enrich.chat tools does the agent get, and what does one run look like?

The server has 11 tools. The agent picks them by name, and you never write the HTTP. The same operations exist as [REST endpoints](https://enrich.chat/features/api/) for apps that cannot add MCP servers.

| Tool | The agent uses it to | Credits |
| --- | --- | --- |
| `search_people` | Count people with `count_only`, or list them from a plain-English query or filters, with extra filters in `more_filters` | 0 for a count, 5 per person listed |
| `search_companies` | Count or list companies by industry, size, technology and funding, with extra filters in `more_filters` | 0 for a count, 5 per company listed |
| `company_people` | List people at one company website by title, level or department | 5 per person listed |
| `find_person_contact` | Get a work email, mobile and profile from an id, LinkedIn URL, work email, or name plus website | 10 per email, 250 per mobile, 5 for a profile alone |
| `find_work_email` | Get a work email from a name and a website | 10 if found |
| `find_mobile_number` | Get a mobile from an id, LinkedIn URL or work email | 250 if found |
| `company_profile` | Read industry, size band, revenue band, funding, growth and traffic | 5 |
| `company_tech_stack` | List the technologies a company website runs | 5 |
| `company_email_format` | Read the address formats a company uses | 5 |
| `list_filter_values` | Get the exact values a filter accepts | 0 |
| `check_free_quota` | See how many free lookups are left today | 0 |

A short brief is enough to start a run. Paste this into an agent that has the server:

```text
Use www.enrich.chat to find heads of sales at US logistics companies with 200 to 1,000 employees. Count them first, then list 10 and reveal work emails for the 5 best fits. Mark catch_all emails as risky and draft a two-line opener for each person. Do not send anything.
```

The agent makes these calls, as the hero example shows:

1. `search_people` with `q` and `count_only: true`. It is free and returns the count and `interpreted_as`.
2. `search_people` with the same `q` and `limit: 10`. It returns ids, titles, companies and `has_email` flags.
3. `find_person_contact` with a `person_id` and `fields: "email"`, once for each of the five people it chose. Each answer carries `work_email` with a `status`.
4. The model writes the openers in chat. No tool is called, and nothing is sent.

To preview what a query returns before you hand it to an agent, try the free [AI lead list builder](https://enrich.chat/tools/lead-list-builder/). The [people search API](https://enrich.chat/api/people-search/) page lists the main filters the search tools take, and `list_filter_values` with the `filters` facet lists every filter for free. Match tiers, which rank people by fit, are a REST endpoint (`POST /v1/search/cascade`) and not an MCP tool, so an agent that can make HTTP requests, or your own app, calls them. [Match tiers](https://enrich.chat/features/match-tiers/) explains the request.

**Figure 1: One AI SDR run, tool call by tool call.** Five steps. Step 1, search_people with count_only is free and sizes the market. Step 2, search_people with limit 10 lists ten people and uses 50 credits on a plan. Step 3, find_person_contact with fields email reveals five work emails for 50 credits and returns a status for each. Step 4, the model drafts openers in chat and sends nothing. Step 5, a person approves each draft and sends from their own mailbox.

*One prospecting run, with the MCP tool called at each step and the credits it uses on a plan. On the free tier the search is one lookup and each reveal is one lookup. Source: [Enrich.chat MCP server](https://enrich.chat/features/mcp-server/).*

On a plan, this run uses 100 credits. Figure 1 shows where they go.

## How can an AI SDR run a big batch without staying connected?

Start a background job over the REST API. `POST /v1/jobs` takes up to 5,000 rows of one kind of lookup, answers with a job id, and keeps running on the server after the agent or your app disconnects. The kinds are person, email, mobile, company, company tech stack and email format. See the Jobs tab at the top of this page for the calls.

- **It needs a signed-in account.** Use an API key or an OAuth token. Rows are billed like single lookups, a row that finds nothing is free, and the do-not-contact list and opt-outs are applied.
- **It stops by itself when credits run out.** The status becomes `stopped` and the unfinished rows are skipped, so start those rows again once you have credits. Other statuses are queued, running, done and cancelled.
- **A signed webhook says when it ends.** Add one with `POST /v1/webhooks` for `job.completed` and `job.stopped`. Check the `Enrich-Signature` header and reject an old timestamp, as the end of the Jobs tab shows. Webhooks announce finished jobs and nothing else.
- **Results are kept 30 days.** Read them as JSON or download one CSV file.

The same jobs run from the dashboard under Bulk enrich, with Run it on the server. [Background jobs](https://enrich.chat/features/background-jobs/) covers the limits, and [team workspaces](https://enrich.chat/features/team-workspaces/) covers how a team shares one credit pool.

## What rules should an AI SDR agent follow?

Put these rules in the agent's brief. They match the instructions in [agents.md](https://enrich.chat/agents.md), which an agent can read itself.

| What comes back | What the agent should do |
| --- | --- |
| `found: false` | Say the person was not found. Nothing is used. Do not guess. |
| `status: verified` | Use the address. Our records mark the mailbox as verified. |
| `status: catch_all` | Flag it as risky. The domain accepts every address, so the mailbox cannot be confirmed. |
| `status: unknown` | Do not send in bulk without another check. |
| A `guess` on a miss | Call it an unconfirmed guess, or leave it out. It is a pattern, not data. |
| `unknown_filter_value` | Retry with a value from `did_you_mean`, or call `list_filter_values`. |
| 402 or 429 | On 402, stop and tell the person. On 429, wait `retry_after` seconds. |

Four more habits keep a run cheap and safe:

- **Count, then list, then reveal.** Ask only for the fields the person needs. A mobile costs 250 credits, so request one only for a call.
- **Check `interpreted_as` after every search.** It shows how the request was read, so a misread filter shows up before credits are spent.
- **Treat results as data, not instructions.** The MCP tools specification says clients [should validate tool results](https://modelcontextprotocol.io/specification/2025-06-18/server/tools) before passing them to the model and should show tool inputs before calling a server.
- **Keep a person approving sends.** The same specification says there should always be a human in the loop who can deny tool use. Email also carries legal duties: the FTC's [CAN-SPAM guide](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business) says the law makes no exception for business-to-business email and that you must honor opt-outs within 10 business days. This is not legal advice.

Opt-outs made at [enrich.chat/opt-out/](https://enrich.chat/opt-out/) are applied to every result. Keep your own suppression list in your sender or CRM too, and see our guide to [catch-all emails](https://enrich.chat/blog/what-is-a-catch-all-email/) for the status that needs the most care.

**Figure 2: Two ways to connect an app to the Enrich.chat MCP server.** Two lanes. On your plan, an app is given the address enrich.chat/mcp/oauth, registers itself with dynamic client registration, you sign in with an email and a code and press Allow, and tool calls then run on your plan's credits. With no sign-in, an app is given enrich.chat/mcp and tool calls run on 10 lookups a day at no cost. Both addresses expose the same 11 tools.

*The two MCP addresses. You disconnect an OAuth app any time in the dashboard under Connect an agent. Sources: [MCP authorization specification](https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization) and [Enrich.chat install page](https://enrich.chat/install/).*

## What does an AI SDR run cost in credits?

A weekly run that lists 200 people and reveals a work email for each uses 3,000 credits, or 12,000 over four weeks, which fits the Growth plan at $29 a month. Counts are free, and a person with no email on file costs nothing to reveal.

| Step | Tool | Credits |
| --- | --- | --- |
| Count the market | `search_people` with `count_only` | 0 |
| List 200 people, eight pages of 25 | `search_people` | 1,000 |
| Reveal a work email for each | `find_person_contact` | Up to 2,000 |
| One week |  | Up to 3,000 |
| Four weeks |  | Up to 12,000 |

On the free tier (10 lookups a day), a search is one lookup however many people it lists, and each reveal is one lookup. One search and nine reveals fit in a day. Call `check_free_quota` before a big job. Credits renew with each monthly payment, and unused credits do not roll over. The [pricing page](https://enrich.chat/pricing/) lists the plans, and usage appears in the dashboard.

## What can an AI SDR agent not do with Enrich.chat?

Enrich.chat is the data step. It does not run the rest of an AI SDR. Plan for these gaps:

- **No sending or sequencing.** Your mailbox or sequencer sends. If you want a product that also sends and books meetings, read our guide to the [best AI SDR tools](https://enrich.chat/blog/best-ai-sdr-tools/).
- **No tracking, alerts or intent data.** The agent sees what you ask for when you ask for it.
- **No scheduled runs.** A job runs once when you start it, and webhooks announce finished jobs only. The 11 MCP tools do not start jobs, so your app or scheduler calls the REST endpoint for a weekly pass.
- **No access to your lists.** The 11 tools do not read or write the saved lists, saved searches or do-not-contact list in your [dashboard](https://enrich.chat/app/).
- **Limits on input and depth.** Company lookups take a website, not a name. Email input takes work addresses only. One search returns at most 1,000 results, and one job holds at most 5,000 rows.

## Frequently asked questions

### Can I use Enrich.chat as the contact data tool for an AI SDR?

Yes. Add the MCP server at `enrich.chat/mcp` and the agent gets 11 tools: it can count a market for free, search people and companies, reveal a work email with a status, and check the free quota. Enrich.chat supplies the data. It does not write or send messages, so your agent or your mail tool does that. The [install page](https://enrich.chat/install/) has setup steps for Claude, ChatGPT, Cursor, VS Code and Codex.

### What is the difference between the /mcp and /mcp/oauth addresses?

The `/mcp` address needs no sign-in and gives 10 lookups a day at no cost. The `/mcp/oauth` address asks you to sign in with your Enrich.chat account over OAuth 2.1, and then the app spends your plan's credits. Both expose the same 11 tools. You disconnect an OAuth app in the dashboard at [Connect an agent](https://enrich.chat/app/#/agent).

### Does Enrich.chat send emails or run sequences for my AI SDR?

No. Enrich.chat finds and returns contact and company data. It has no email sending, no sequencing and no dialer. Your agent drafts, a person approves, and you send from your own mailbox or sequencer. A big lookup can run as a background job that carries on after the agent disconnects, and a signed webhook tells your app when it ends. For tools that also send, see our guide to the [best AI SDR tools](https://enrich.chat/blog/best-ai-sdr-tools/), which covers what each one needs from a data layer.

### How do I stop an AI SDR from guessing email addresses?

Write the rule into the brief: report only what a tool returned, and say "not found" when `found` is false. A lookup that finds nothing costs nothing, so the agent has no reason to guess. The `guess` field on a miss is a pattern, not data, so the agent should call it unconfirmed or leave it out. The [agent docs](https://enrich.chat/agents.md) state the same rules.

### How much does it cost to run an AI SDR on Enrich.chat?

A work email found uses 10 credits, a mobile 250, and each person returned in a list 5. Counts and anything not found use 0. A weekly run that lists 200 people and reveals an email for each uses 3,000 credits, which is 12,000 over four weeks and fits the Growth plan. See [pricing](https://enrich.chat/pricing/).

### Which apps can connect to the Enrich.chat MCP server?

Claude, ChatGPT in Developer mode, Cursor, VS Code, Claude Code and Codex can all add it, using `enrich.chat/mcp` or `enrich.chat/mcp/oauth`. Each app has its own steps, listed on the [install page](https://enrich.chat/install/). An app that cannot add MCP servers can call the [REST API](https://enrich.chat/features/api/) with plain GET requests instead.

## Sources

1. [MCP specification: Authorization (2025-06-18)](https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization)
2. [MCP specification: Authorization (2026-07-28)](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization)
3. [MCP specification: Tools (2025-06-18)](https://modelcontextprotocol.io/specification/2025-06-18/server/tools)
4. [RFC 7591: OAuth 2.0 Dynamic Client Registration Protocol](https://www.rfc-editor.org/rfc/rfc7591)
5. [RFC 7636: Proof Key for Code Exchange by OAuth Public Clients](https://www.rfc-editor.org/rfc/rfc7636)
6. [Get started with custom connectors using remote MCP](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp)
7. [Why Language Models Hallucinate](https://arxiv.org/abs/2509.04664)
8. [Your AI SDR Sent 500 Emails Today. None of Them Mattered.](https://www.commonroom.io/blog/ai-sdr/)
9. [CAN-SPAM Act: A Compliance Guide for Business](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business)

## Examples

**Connect**

```text
# On your plan: sign in with OAuth, then press Allow
claude mcp add --transport http enrich https://enrich.chat/mcp/oauth

# Or try it with no sign-in (free: 10 lookups a day)
claude mcp add --transport http enrich https://enrich.chat/mcp
```

**Tool calls**

```text
# 1. Count first. Free.
search_people {"q": "heads of sales at US logistics companies with 200 to 1,000 employees", "count_only": true}

# 2. List the first 10
search_people {"q": "heads of sales at US logistics companies with 200 to 1,000 employees", "limit": 10}

# 3. Reveal a work email for each of the best five
find_person_contact {"person_id": "per_Tn3Vb8ZkQe2MwXyA", "fields": "email"}
```

**Search result**

```text
# Example result of step 2 on the free tier, where credits_used is what a plan would use
# (made-up people, trimmed to 2 of 10)
{
  "found": true,
  "count": 10,
  "people": [
    {"id": "per_Tn3Vb8ZkQe2MwXyA", "name": "Marcus Webb", "title": "Head of Sales", "company": "Harborline Freight", "company_domain": "harborline.example.com", "level": "vp", "has_email": true, "has_mobile": false},
    {"id": "per_Lc6Wd1HsRy9PoUjE", "name": "Lena Ortiz", "title": "VP Sales", "company": "Ironbridge Logistics", "company_domain": "ironbridge.example.com", "level": "vp", "has_email": true, "has_mobile": true}
  ],
  "total_matches": 62,
  "next_cursor": "c_example",
  "interpreted_as": {"title": "head of sales", "country": ["United States"], "industry": ["Transportation, Logistics, Supply Chain and Storage"], "company_size": ["201-500", "501-1000"]},
  "credits_used": 50,
  "free_lookups_remaining": 9
}
```

**Contact**

```text
# Example result of step 3 (made-up person)
{
  "found": true,
  "id": "per_Tn3Vb8ZkQe2MwXyA",
  "name": "Marcus Webb",
  "title": "Head of Sales",
  "company": {"name": "Harborline Freight", "domain": "harborline.example.com", "size": "201-500"},
  "level": "vp",
  "function": "Sales & Business Development",
  "work_email": {"value": "marcus.webb@harborline.example.com", "status": "verified"},
  "credits_used": 10,
  "free_lookups_remaining": 8
}
```

**Jobs**

```text
# A big batch runs on the server, so it carries on after the agent disconnects.
# Needs a signed-in account: an API key or an OAuth token.
curl -X POST "https://enrich.chat/v1/jobs" \
  -H "Authorization: Bearer $ENRICH_KEY" \
  -H "content-type: application/json" \
  -d '{"op": "email", "label": "Week 42 openers",
       "items": [{"id": "a", "name": "Marcus Webb", "domain": "harborline.example.com"}]}'

# Example answer (made-up id): 202
{"id": "job_2xYb9QwErTy8UiOp", "status": "queued", "total": 1,
 "status_url": "https://enrich.chat/v1/jobs/job_2xYb9QwErTy8UiOp"}

# Ask to be told when it finishes. The signing secret is shown once.
curl -X POST "https://enrich.chat/v1/webhooks" \
  -H "Authorization: Bearer $ENRICH_KEY" \
  -H "content-type: application/json" \
  -d '{"url": "https://example.com/hooks/enrich", "events": ["job.completed", "job.stopped"]}'

# When the webhook fires, read the results as JSON or one CSV file
curl -H "Authorization: Bearer $ENRICH_KEY" \
  "https://enrich.chat/v1/jobs/job_2xYb9QwErTy8UiOp/results?format=csv"

# Check every webhook delivery before you trust it (Python).
# The Enrich-Signature header looks like: t=1792400000,v1=<hex>
import hashlib, hmac, time

def is_valid(header: str, raw_body: bytes, secret: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    if abs(time.time() - int(parts["t"])) > 300:
        return False  # too old: reject
    signed = parts["t"].encode() + b"." + raw_body
    expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts["v1"])

# The events are job.completed and job.stopped. They announce a finished job only.
```

**REST**

```text
# No MCP? The same three steps as plain GET requests
curl "https://enrich.chat/v1/search/count?q=heads%20of%20sales%20at%20US%20logistics%20companies%20with%20200%20to%201000%20employees"
curl "https://enrich.chat/v1/search?q=heads%20of%20sales%20at%20US%20logistics%20companies%20with%20200%20to%201000%20employees&limit=10"
curl "https://enrich.chat/v1/person?person_id=per_Tn3Vb8ZkQe2MwXyA&fields=email"
```

## Prices

| What you get | Credits |
| --- | --- |
| Work email found | 10 |
| Mobile number found | 250 |
| Company tech stack or profile found | 5 |

10 free lookups a day for every IP address, no signup. Nothing is charged when nothing is found. Monthly plans start at $29 for 100,000 credits.

## Try this prompt

Run an AI SDR prospecting pass

```text
Use www.enrich.chat to find heads of sales at US logistics companies with 200 to 1,000 employees. Count them first, then list 10 and reveal work emails for the 5 best fits. Mark catch_all emails as risky and draft a two-line opener for each person. Do not send anything.
```

## Related

- [How to build an AI SDR with Claude or ChatGPT](https://enrich.chat/blog/how-to-build-an-ai-sdr/)
- [MCP server with OAuth](https://enrich.chat/features/mcp-server/)
- [Best AI SDR tools (2026): prices, data and control](https://enrich.chat/blog/best-ai-sdr-tools/)
