search_businesses
Search for local businesses worldwide using location, category, or keywords to find names, categories, and quality scores for AI-driven analysis.
Instructions
Search for local businesses. Returns name, category, city, country, logo_url, available_details (what data exists), and scores. Check available_details to see what is available, then call get_business for full details.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Search query (e.g. "plumber", "Zahnarzt", "Italian restaurant") | |
| city | No | City name (e.g. "Hamburg", "Wien", "New York") | |
| country | Yes | ISO country code (e.g. "DE", "AT", "CH", "US"). Required. | |
| category | No | Category slug (e.g. "plumber", "restaurant", "dentist") | |
| limit | No | Number of results (1-50, default 10) | |
| page | No | Page number | |
| min_confidence | No | Min confidence score 0-100 | |
| lang | No | Language for labels: "de" or "en" | en |
| lat | No | Latitude for distance | |
| lon | No | Longitude for distance |
Implementation Reference
- server.ts:53-81 (handler)The 'search_businesses' tool is registered and implemented directly in server.ts using the McpServer.tool method. It takes various query parameters, constructs a URL, calls the discava API, and returns the result.
server.tool( 'search_businesses', 'Search for local businesses. Returns name, category, city, country, logo_url, available_details (what data exists), and scores. Check available_details to see what is available, then call get_business for full details.', { query: z.string().optional().describe('Search query (e.g. "plumber", "Zahnarzt", "Italian restaurant")'), city: z.string().optional().describe('City name (e.g. "Hamburg", "Wien", "New York")'), country: z.string().describe('ISO country code (e.g. "DE", "AT", "CH", "US"). Required.'), category: z.string().optional().describe('Category slug (e.g. "plumber", "restaurant", "dentist")'), limit: z.number().optional().default(10).describe('Number of results (1-50, default 10)'), page: z.number().optional().default(1).describe('Page number'), min_confidence: z.number().optional().describe('Min confidence score 0-100'), lang: z.string().optional().default('en').describe('Language for labels: "de" or "en"'), lat: z.number().optional().describe('Latitude for distance'), lon: z.number().optional().describe('Longitude for distance'), }, async ({ query, city, country, category, limit, page, min_confidence, lang, lat, lon }) => { const params = new URLSearchParams({ country }); if (query) params.set('q', query); if (city) params.set('city', city); if (category) params.set('category', category); if (limit) params.set('limit', String(limit)); if (page) params.set('page', String(page)); if (min_confidence) params.set('min_confidence', String(min_confidence)); if (lang) params.set('lang', lang); if (lat !== undefined) params.set('lat', String(lat)); if (lon !== undefined) params.set('lon', String(lon)); return jsonContent(await api(`/search?${params}`)); } );