yelp-mcp-min
Provides tools for searching businesses, looking up by phone, matching by address, getting business details, and fetching reviews from the Yelp Fusion API.
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., "@yelp-mcp-minsearch for pizza places in Chicago"
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.
yelp-mcp-min
Minimal MCP server for the Yelp Fusion API v3, built with FastMCP 3.
Prerequisites
Python 3.11+
uv 0.11+
Docker (optional)
A Yelp Fusion API key — https://www.yelp.com/developers/v3/manage_app
Related MCP server: yelp-mcp-sdk
Installation
uv sync
cp .env.example .env
# Edit .env and set YELP_API_KEYRunning
# stdio transport (for use with Claude Desktop or an MCP client)
uv run python -m server.main
# Docker
docker build -t yelp-mcp-min .
docker run --env-file .env yelp-mcp-min
docker buildx build -t yelp-mcp-min .Environment variables
Variable | Required | Default | Description |
| Yes | — | Yelp Fusion API bearer token |
| No |
| API base URL |
| No |
| Request timeout in seconds |
| No |
| Max retry attempts on 429/5xx |
| No |
| Min back-off wait in seconds |
| No |
| Max back-off wait in seconds |
| No |
| structlog level |
| No |
| Emit JSON log lines (for Datadog etc) |
Tools
Tool | Yelp endpoint | Description |
|
| Full-text + geo search with pagination |
|
| Look up a business by E.164 phone number |
|
| Match structured name+address to Yelp listing |
|
| Full business profile by Yelp ID or alias |
|
| Customer reviews with pagination |
Resource
yelp://business/{id} — Returns the same payload as get_business as an MCP
resource (application/json). MCP clients that support resources can embed or
subscribe to this URI directly.
Project structure
yelp-mcp-min/
server/
main.py # FastMCP instance + wiring
core/
config.py # pydantic-settings (YELP_API_KEY, tunables)
logging.py # structlog setup (stderr only)
client.py # async httpx client, retry, error mapping
models.py # Pydantic output models
tools/
search.py # search_businesses
business.py # find_by_phone, match, get_business
reviews.py # get_business_reviews
resources/
business.py # yelp://business/{id}
tests/
conftest.py
test_client.py
test_tools.py
test_models.py
Dockerfile
pyproject.toml
.env.exampleRunning tests
uv run pytest -vAvailable Tools
5 toolsfind_business_by_phoneARead-onlyIdempotent
Look up Yelp businesses that match a phone number.
Use this when you have a phone number and need to identify which business it belongs to. Returns up to a handful of candidates ranked by relevance. An empty list means no Yelp listing was found for that number.
The phone must include the country code in E.164 format (+14155551234).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. Description adds valuable context: returns up to a handful of candidates, empty list if not found, no contradictions.
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, front-loads the purpose, no fluff. Every sentence serves a purpose.
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?
Given one parameter, output schema, and annotations, the description covers purpose, usage, phone format, and return behavior completely. No gaps.
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 already contains parameter description for phone. Tool description repeats the E.164 format requirement, adding no new information beyond what schemas provides. With 0% schema coverage context, but the schema actually has a description, so 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 states 'Look up Yelp businesses that match a phone number,' which clearly specifies the action (look up) and resource (Yelp businesses) and distinguishes it from siblings that do not use phone number as primary key.
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 states when to use: when you have a phone number and need to identify the business. Mentions return behavior but lacks explicit exclusion of alternatives, though sibling tools are differentiated implicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_businessARead-onlyIdempotent
Fetch the full Yelp profile for a specific business by its ID or alias.
Use this when you already have a Yelp business ID (from search results or a previous call) and need complete details: hours, all photos, full address, price tier, categories, and the Yelp URL.
Raises an error if the business ID does not exist on Yelp.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| url | No | |
| phone | No | |
| display_phone | No | |
| rating | No | |
| review_count | No | |
| price | No | |
| is_closed | No | |
| location | No | |
| categories | No | |
| coordinates | No | |
| image_url | No | |
| photos | No | |
| hours | No | |
| alias | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint as true, signaling safety and idempotency. The description adds that the tool raises an error for invalid IDs, which is useful but not extensive. Additional behavioral details (e.g., rate limits, authentication) are absent, but annotations cover the core safety profile.
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 concise sentences: the first clearly states the action, the second provides usage context and return value summary, the third handles an error case. No extraneous information, and the most important information is front-loaded.
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?
Given the tool's simplicity (single required param, read-only, with output schema), the description adequately covers purpose, usage scenario, and error condition. It could mention behavior for aliases that don't exist, but the error note covers non-existent IDs broadly. The presence of sibling tools and output schema compensates for missing edge case details.
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?
Input schema provides thorough descriptions for both parameters (business_id and locale). The tool description mentions 'by its ID or alias', which aligns with the business_id description. With schema coverage effectively 100% (both params described), the description adds no new parameter meaning, so baseline score of 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?
Description starts with a specific verb ('Fetch') and resource ('full Yelp profile for a specific business'), clearly distinguishing it from sibling tools that search or match. It also enumerates the returned details (hours, photos, address, etc.), leaving no ambiguity about what the tool does.
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 states when to use: when you already have a business ID from search results or previous calls. Does not explicitly exclude alternatives, but the context implies that if you lack an ID, use search or match tools. The error condition for non-existent ID is also noted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_business_reviewsARead-onlyIdempotent
Retrieve user reviews for a specific Yelp business.
Use this when the user wants to read what customers say about a business: sentiment, specific comments about food, service, or atmosphere. Returns up to 50 reviews per call with text excerpts, star ratings, and reviewer info.
The 'total' field in the response shows how many reviews exist in full; use 'offset' to paginate through them.
Raises an error if the business ID does not exist on Yelp.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reviews | No | |
| total | No | |
| possible_languages | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint), the description discloses important behaviors: returns up to 50 reviews, pagination via offset, total field, and error handling. No contradictions with annotations.
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 concise—five short sentences, each valuable. It is front-loaded with the main purpose and organized logically (purpose, usage, behavior, error).
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 an output schema, the description adequately mentions return fields (text excerpts, star ratings, reviewer info), pagination behavior, and error conditions. It is complete for an AI agent to understand usage.
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?
While the input schema provides rich descriptions for all parameters (e.g., locale, sort_by), the tool description adds minimal new information beyond summarizing pagination. Given the schema's thoroughness, the description provides adequate but not exceptional additional meaning.
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 'Retrieve user reviews for a specific Yelp business,' using a specific verb and resource. It distinguishes itself from sibling tools (like get_business or search_businesses) by focusing solely on reviews.
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?
It explicitly says 'Use this when the user wants to read what customers say about a business,' which provides clear context. It also mentions an error condition if the business ID doesn't exist, but does not exclude other scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_businessARead-onlyIdempotent
Match a business by name and address to its canonical Yelp listing.
Use this when you have structured address data (from a CRM, spreadsheet, or user input) and need to verify or enrich it with Yelp data such as the Yelp ID, rating, hours, and URL.
Name + address1 + city + state + country are required. Adding zip_code and phone significantly improves match precision.
Returns ranked candidates; the first result is the best match. An empty list means no match was found at the chosen threshold.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return behavior (ranked candidates, first is best match, empty list on no match) beyond what annotations provide. Annotations (readOnlyHint, idempotentHint) already indicate safety; description adds matching details.
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?
5 sentences, front-loaded with purpose, well-structured. Could be slightly more concise but no waste. Effective for an AI agent.
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?
Covers purpose, usage, parameters, and return format. Output schema exists but is not explained in description; however, the description mentions enrichment fields (Yelp ID, rating, etc.) which is sufficient for an AI agent.
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?
Description adds semantic context beyond input schema, e.g., 'significantly improves match precision' for zip_code/phone, and explains match_threshold values. Schema coverage is 0% but description compensates well.
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 tool matches a business by name/address to its canonical Yelp listing, differentiating it from siblings like find_business_by_phone and search_businesses.
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 states when to use (structured address data for verification/enrichment) and describes required vs optional parameters. Could be improved by contrasting with sibling tools, but still clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_businessesARead-only
Search Yelp for businesses matching a term, location, or both.
Use this tool when the user wants to discover businesses — restaurants, services, shops, entertainment — in a given area. It supports free-text search, geo coordinates, category filters, price tiers, open-now filtering, and pagination.
Supply at least one of: location, or both latitude + longitude.
Returns a list of matching businesses with ratings, review counts, price tier, address, and a Yelp URL. The 'total' field indicates how many results exist in the full result set; use 'offset' to paginate.
Raises ValueError when neither location nor coordinates are provided.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes | Parameters for search_businesses. |
Output Schema
| Name | Required | Description |
|---|---|---|
| businesses | No | |
| total | No | |
| region | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond annotations by detailing the return format (ratings, review counts, price tier, address, Yelp URL), pagination via 'offset', and error handling (ValueError when missing location/coordinates). Annotations already indicate read-only and open-world hints, and the description does not contradict them.
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 concise (about 10 sentences), front-loaded with the purpose, and every sentence contributes meaningful information. No redundancy or fluff.
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?
Given the tool's complexity (many parameters, filters, pagination) and the existence of an output schema, the description covers the core functionality, usage prerequisites, return structure, and a common error. It is complete enough for an agent to use 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?
With 100% schema description coverage, the schema already documents all parameters thoroughly. The description provides a helpful summary and usage guidance but does not add significant new meaning beyond the schema. 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 clearly states the verb 'search' and the resource 'Yelp businesses', and specifies matching by term, location, or both. It distinguishes itself from sibling tools like find_business_by_phone and get_business, which are for specific lookups.
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 explains when to use this tool ('when the user wants to discover businesses'), lists supported features, and specifies prerequisites ('Supply at least one of: location, or both latitude + longitude'). It does not explicitly exclude alternatives, but the context is clear.
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.
5 tool updates
v0.1.0- First observed
find_business_by_phone - First observed
get_business - First observed
get_business_reviews - First observed
match_business - First observed
search_businesses
TDQS
Scored across 5 tools
Each tool targets a distinct use case: phone lookup, ID-based details, reviews, name+address matching, and keyword/location search. No functional overlap exists.
All tool names follow the verb_noun pattern in snake_case, starting with 'get', 'find', 'match', or 'search' followed by 'business' or 'businesses'. Highly consistent.
Five tools is appropriate for a Yelp information server, covering the essential operations without being too sparse or overly granular.
The tool set covers the main read operations for Yelp business data: search, direct lookup by ID, phone, or name+address, and reviews. No critical gaps for typical usage.
Maintenance
Related MCP Connectors
- mcpOAuthcom.zomato
An MCP server that exposes functionalities to use Zomato's services.
MCP server for Nylas — read email, calendars, events and contacts, and send email or create events.
MCP server for Riveter's enrichment, scraping, and monitoring API
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables conversational interactions with Yelp's business data through an MCP server, allowing natural language queries about local businesses, multi-turn conversations, and direct business inquiries powered by Yelp Fusion AI.126Apache 2.0
- FlicenseAqualityDmaintenanceProvides Yelp Fusion API access through MCP tools and resources for searching businesses, getting reviews, and more.5-
- AlicenseNot gradedqualityDmaintenanceFastMCP server that exposes the YNAB API for budget management, enabling interaction with YNAB data through MCP tools.1MIT
- AlicenseNot gradedqualityDmaintenanceA production-ready FastMCP server template supporting local development with stdio and secure web deployment with HTTPS and OAuth.4MIT