B2BLeads MCP Server
This server gives AI agents real-time B2B lead search and enrichment via MCP tools.
search_leads: Find companies by free-text query, industry, city, radius, rating, website presence, verified status, open now, price level, and language; sort by relevance or distance; paginate; limit 1-20 results per call; optionally save results to a saved list.
list_industries: List predefined industry categories usable as filters in search_leads.
list_saved_lists: View all saved lead lists with their full saved leads.
get_saved_list: Retrieve one saved lead list by ID with its full saved leads.
find_email: Look up a best-effort contact email for a single business website (returns null if none found; never fabricates emails).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@B2BLeads MCP ServerFind SaaS companies in Austin, TX with websites and email contacts"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
B2BLeads MCP Server
An MCP (Model Context Protocol) server that gives AI agents — Claude, Cursor, and any other MCP-compatible client — a search_leads tool for real-time B2B company discovery and enrichment.
Ask your agent things like:
"Find construction companies in Munich with a website and phone number."
"Collect 50 IT companies in Berlin rated above 4.0."
"Enrich this lead list with email contacts where available."
...and it calls this tool to return a ready-made list of companies: name, address, phone, website, rating, and email where available.
This server is a thin MCP wrapper around the B2BLeads REST API. You need a B2BLeads account and API key — see Getting an API key below.
Requirements
Node.js 18 or later
A B2BLeads API key (sign up)
Related MCP server: DataLayer MCP
Installation
No install needed — run it directly with npx. Add it to your MCP client's config:
Claude Desktop / Claude Code
Edit your claude_desktop_config.json (or run claude mcp add):
{
"mcpServers": {
"b2bleads": {
"command": "npx",
"args": ["-y", "b2bleads-mcp"],
"env": {
"B2BLEADS_API_KEY": "your-api-key-here"
}
}
}
}Cursor
Add the same block to .cursor/mcp.json in your project (or your global Cursor MCP settings).
Any other MCP client
Point it at the command npx -y b2bleads-mcp with the B2BLEADS_API_KEY environment variable set.
Getting an API key
Create an account at b2bleadsapi.com.
Pick a plan in Billing.
Generate a key under API Keys in the dashboard.
Set it as
B2BLEADS_API_KEYin your MCP client config (see above).
Tools
search_leads
Search for companies and business contacts in real time.
Parameter | Type | Description |
| string | Free-text query, e.g. |
| string | One of the categories from |
| string | City or region to search in. |
| number | Search radius in kilometers. |
| number | Minimum rating (0-5). |
| boolean | Only businesses with a website. |
| boolean | Only businesses with a verified listing. |
| boolean | Only businesses currently open. |
| string |
|
| string |
|
| integer | Max results per call, 1-20. |
| string | Result language, BCP-47 tag (e.g. |
| string | Pagination token from a previous call. |
| boolean | Also save results into a B2BLeads saved list. |
| string | Existing saved-list ID to append to. |
| string | Saved-list name to find-or-create and append to. |
At least one of q, industry, or city is required.
list_industries
Lists the predefined industry categories usable in search_leads's industry filter. Takes no arguments.
list_saved_lists
Lists all of your saved lead lists, each with its full set of saved leads. Read-only. Takes no arguments.
get_saved_list
Gets one saved lead list by ID, with its full set of saved leads. Read-only.
Parameter | Type | Description |
| string | The saved list's ID, from |
find_email
Looks up a best-effort contact email for a single business website (checks the homepage and common contact pages). Use this for one specific website rather than re-running search_leads. Requires a Business/Premium plan; may return a null email if none is found.
Parameter | Type | Description |
| string | The business website URL to look up, e.g. |
Configuration
Environment variable | Required | Description |
| Yes | Your B2BLeads API key. |
| No | Override the API base URL. Defaults to |
Pricing & rate limits
Each search consumes quota from your B2BLeads plan — see pricing. Rate limits and quota errors are returned by the API and surfaced back to your agent as tool errors.
Links
License
MIT
Available Tools
5 toolsfind_emailA
Look up a best-effort contact email for a single business website (checks the homepage and common contact pages). Use this for one specific website, e.g. from a saved list or CSV, rather than re-running search_leads. May return a null email if none could be found; this tool never fabricates an address.
| Name | Required | Description | Default |
|---|---|---|---|
| website | Yes | The business website URL to look up a contact email for, e.g. "https://example.com". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that the lookup is best-effort, may return null, and never fabricates an address. It doesn't cover edge cases like redirects or rate limits, but the core reliability behavior is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all informative, with the main purpose and usage guidance front-loaded before the null-return caveat. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup with no output schema, the description explains input scope, alternative, and possible null result. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema description already includes the URL example and purpose. The description adds only the 'single business website' qualifier, which is helpful but not substantial beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Look up a best-effort contact email'), a clear resource ('a single business website'), and the method ('checks the homepage and common contact pages'). It also distinguishes itself from search_leads, so an agent can select it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs use for one specific website, e.g., from a saved list or CSV, and tells the agent to use it 'rather than re-running search_leads.' This is clear when-to-use guidance with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_saved_listA
Get one saved lead list by ID, including its full set of saved leads (read-only).
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes | The saved list's ID, from list_saved_lists or a search_leads save_to_list response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It states 'read-only', which is a key behavioral trait, and mentions the return includes the full set of saved leads. However, it does not disclose error behavior (e.g., missing ID), authentication requirements, or potential size implications of the full lead set. For a simple read operation, this is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, compact sentence that is front-loaded with the primary action and scope. Every word adds value – 'by ID', 'including its full set of saved leads', and 'read-only' are all necessary. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter and no output schema, the description is reasonably complete. It tells the agent what the tool does, what it returns, and that it is read-only. It does not specify the exact response structure, but the absence of an output schema lowers the burden. The missing details about not-found errors are minor and common to such tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% – the list_id parameter already includes a description mentioning its origin from list_saved_lists or search_leads. The tool description does not add any new semantic details about the parameter; it only references the list itself. Since the schema fully documents the parameter, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Get' with a clear resource ('one saved lead list by ID') and explicitly states the scope ('including its full set of saved leads'). It also adds the read-only qualifier, distinguishing it from mutating operations. This clearly separates it from siblings like list_saved_lists (which likely returns multiple lists) and search_leads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you have a specific list_id and need a single list with its leads. It also notes the ID can come from list_saved_lists or search_leads responses, which provides context for obtaining the parameter. However, it does not explicitly state when NOT to use it or name alternative tools, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_industriesA
List the predefined industry categories that can be used as the industry filter in search_leads.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. The verb 'List' implies a non-destructive read, but the description does not explicitly state the safety profile, nor does it mention response format, ordering, localization, or error behavior. It does add the useful fact that the categories are predefined and serve a specific filter purpose, which gives some behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler. The verb and resource are front-loaded, and the purpose and relationship to search_leads are stated compactly. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema list tool, the description is highly complete. It states what the tool lists, why the values matter, and how they connect to the sibling tool. The only minor omission is any detail about the format or type of the returned entries, but this does not hinder an agent from using the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100% (empty schema), so the baseline is 4. The description adds meaning beyond the schema by explaining that the returned values are intended to be used as the `industry` filter in search_leads, which is not evident from the empty schema. This helps the agent understand the semantic value of the output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a clear resource ('predefined industry categories'), and immediately ties them to their purpose ('as the `industry` filter in search_leads'). This clearly distinguishes the tool from its sibling, search_leads, by showing it is the source of valid filter values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: it says the industry categories 'can be used as the `industry` filter in search_leads.' This implicitly tells the agent to call this tool before or when constructing a search_leads call with an industry filter. It does not explicitly cover when not to use it, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_saved_listsA
List all of the user's saved lead lists (read-only), each with its full set of saved leads. Use this when the user asks what they've already saved, or which lists exist.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the read-only nature ('read-only') and notes it returns the full set of leads, which adds transparency. However, it does not describe the response format, potential edge cases (e.g., empty lists), or performance characteristics. For a simple read-only operation, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with a clear action and a usage hint. It is front-loaded with the primary purpose and adds the usage context at the end. No wasted words or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters and no output schema, the description covers the essential information: what it returns (all saved lists with full leads) and when to use it. It does not mention any limitations or caveats, but for this simple operation, nothing critical is missing. The sibling context is implicitly handled by the 'list all' wording.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and the schema coverage is trivially 100%. The description adds no parameter-specific details because none exist. Per the rubric, 0 params warrant a baseline of 4, and the description does not need to compensate for anything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'saved lead lists', and specifies that it returns the full set of saved leads for each list. This distinguishes it from sibling tools like get_saved_list, which retrieves a single list, and search_leads, which searches leads. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'when the user asks what they've already saved, or which lists exist.' It does not mention alternatives or when not to use it, but the context is clear and actionable. Missing explicit 'when-not' guidance keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_leadsA
Search for companies and business contacts in real time by industry, city, and other filters. Returns a ready-to-use list of leads (name, address, phone, website, rating, and email where available). Use this whenever the user asks to find, list, or collect businesses/companies for sales, outreach, or research.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Free-text search query, e.g. "construction companies in Munich". Optional if industry+city are given. | |
| city | No | City or region to search in, e.g. "Berlin" or "Austin, TX". | |
| lang | No | Result language as a BCP-47 tag, e.g. "en" or "pt-BR". | |
| limit | No | Max number of results to return (1-20). Defaults to a server-side value if omitted. | |
| list_id | No | Existing saved-list ID to append results to. | |
| rank_by | No | How to sort results. | |
| industry | No | Industry filter. One of the predefined categories. | |
| open_now | No | Only return businesses that are currently open. | |
| list_name | No | Name of a saved list to find-or-create and append results to. | |
| radius_km | No | Search radius in kilometers around the city center. | |
| min_rating | No | Minimum rating (0-5) a business must have to be included. | |
| page_token | No | Pagination token returned by a previous call, to fetch the next page of results. | |
| has_website | No | Only return businesses that have a website. | |
| price_level | No | Filter by price level. | |
| save_to_list | No | If true, also save the results into a B2BLeads saved list (requires list_id or list_name). | |
| verified_only | No | Only return businesses with a verified listing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It usefully discloses that results are real-time, that email is 'where available,' and that the output is a ready-to-use lead list. However, it does not mention pagination behavior or the side effect that save_to_list can persist results into a saved list, which is relevant given the parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core action and output are front-loaded, and the usage guidance is a separate, efficient sentence. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 16 optional parameters and no output schema, the description does a solid job of explaining the output shape and the intended use case. The schema covers parameter semantics, and the description covers the high-level outcome. It is slightly incomplete in not addressing pagination or saved-list side effects, but overall it is sufficient for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents every parameter. The description adds no extra parameter-level meaning beyond naming 'industry, city, and other filters,' which is acceptable but not additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') plus a clear resource ('companies and business contacts') and scoping filters ('by industry, city, and other filters'). It also names the concrete output ('ready-to-use list of leads') with field details, making it easy to distinguish from the sibling list_industries tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'whenever the user asks to find, list, or collect businesses/companies for sales, outreach, or research.' It provides clear context but does not mention exclusions or contrast with the sibling list_industries tool, so it loses one point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v1.3.0- Added
find_email - Added
get_saved_list - Added
list_saved_lists
2 tool updates
v1.0.0- First observed
list_industries - First observed
search_leads
TDQS
Scored across 5 tools
Each tool targets a distinct action: listing saved lists, fetching one saved list, finding a single email, listing industries, and searching leads. Even the list/get pair is clearly separated by the ID parameter and tool descriptions.
All tool names follow a consistent verb_noun pattern using lowercase snake_case: list_saved_lists, get_saved_list, find_email, list_industries, search_leads. The naming style is uniform and predictable.
Five tools is a well-scoped surface for a B2B lead discovery and saved-list lookup server. Each tool covers a meaningful capability without unnecessary overlap or bloat.
The server covers lead searching, email lookup, and read-only access to saved lists, but there are no tools to create, update, or delete saved lists/leads, nor bulk email enrichment. Users can discover leads but cannot manage or persist them through this MCP server.
Maintenance
Related MCP Connectors
Company profile lookup and B2B company search for AI agents.
- mcpOAuthai.astrofabric
Agentic AI for business intelligence: discover, verify and enrich company and contact data.
Remote MCP server to enrich company profiles with structured B2B data and confidence scores.
Company enrichment for AI agents: firmographics, tech stack, headcount, funding, domain emails.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceAn MCP server providing real-time access to comprehensive B2B company and contact data for lead generation and business intelligence. It enables AI tools to search firmographics, discover key contacts, and automate personalized outreach workflows.55MIT
- AlicenseAqualityDmaintenanceGive your AI agent access to 60M+ companies and 300M+ verified contacts. Enrich leads, find work emails, discover tech stacks, and identify buying intent — directly from Claude, Cursor, Windsurf, or any MCP-compatible AI agent.1126 npmMIT
- AlicenseNot gradedqualityFmaintenanceDomain -> company intelligence for AI agents. Look up company name, country, contacts, and social profiles from any MCP-compatible client.6MIT
- AlicenseNot gradedqualityAmaintenanceMCP server that enables AI agents to discover and qualify B2B leads from Leadbay's knowledge base, with tools for lead research, enrichment, and outreach logging.MIT