AI List My Business
The AI List My Business server is an AI-callable business directory that enables AI assistants to search, discover, and retrieve ranked small-to-medium business (SMB) listings across multiple verticals and countries, returning UTM-tagged booking URLs so users can book directly with businesses.
Core capabilities:
Search businesses (
search_businesses): Find businesses (realtors, insurance agents, medical practitioners, dentists, home services, etc.) by category and location, with filtering by country, language, subcategory, minimum rating, and result count.Natural-language / fuzzy search (
search_by_query): Submit free-text queries like "evening dentist in Toronto that takes Sun Life" or "realtor in Dallas who speaks Spanish" without needing structured category inputs.Retrieve business profiles (
get_business_profile): Get detailed structured profiles by business ID, including services, hours, credentials/licenses, spoken languages, contact channels, and a UTM-tagged booking URL.Get booking options (
get_booking_options): Retrieve UTM-tagged booking URLs, accepted booking methods, hours of operation, timezone, and fallback contact info for direct booking on the SMB's own system.Discover categories (
get_categories): List available business verticals and subcategories, optionally filtered by country, so AI agents know what business types are searchable in a given region.
Key characteristics:
Results are ranked using a weighted relevance score (tier, distance, rating, vertical match, verified status, language match)
Zero customer PII — only public business data is cataloged
Multi-country support (US, CA, GB, AU, and more)
UTM attribution on all booking URLs enables SMB conversion tracking
Provides x402 metering for API tier usage, allowing pay-per-request billing for external API calls to the server.
Pulls public review data from Google Places API to enrich business profiles with aggregated ratings and review counts (Phase 2).
Generates embeddings for semantic search of business listings, enabling more accurate responses to natural language queries (Phase 2).
Provides geocoding of location strings to coordinates and calculates distances between businesses and user queries using Nominatim and Haversine formula.
Enables billing and payment processing for paid tiers of the MCP server, handling subscriptions and usage-based charges.
Serves as the database backend for storing business listings, categories, and related metadata, replacing mock data in Phase 2.
ailistmybusiness
MCP-callable directory for AI-driven SMB discovery. Country-agnostic, zero-PII catalog of realtors, insurance agents, and medical practitioners (Wave 1).
Working title. Public brand pending domain registration. Folder name and
package.jsonwill be renamed once the domain is locked.
What this is
When a user asks ChatGPT, Claude, or Gemini "find me a realtor in Dallas" / "evening walk-in clinic in Toronto" / "bilingual insurance broker", the AI calls this MCP server. It returns ranked business listings with UTM-tagged booking URLs. The user books directly with the SMB. We never see customer data — we are a business catalog, not a lead processor.
Related MCP server: discava – Business Directory for AI
Phase 1 status
MCP server scaffold (Node 20 + TypeScript)
5 tools:
search_businesses,get_business_profile,get_booking_options,search_by_query,get_categories30 mock SMBs across 3 verticals × 2 countries (Dallas + Toronto)
OpenStreetMap Nominatim geocoding (free, no PII)
UTM-tagged booking URLs for SMB attribution
Vitest test suite for all 5 tools
Smithery + Glama + Railway manifests
Supabase wiring (Phase 2)
Stripe billing for paid tiers (Phase 2)
Coinbase x402 metering for API tier (Phase 3)
Quick start
npm install
npm test # run unit tests
npm run test:mcp # smoke test all tools end-to-end
npm run dev # start MCP server on stdio
npm run http # start HTTP server on :3000 (preview endpoints + Railway entrypoint)Then visit http://localhost:3000/preview/search?category=realtor&location=Dallas to see the ranking output.
Architecture
src/
server.ts # MCP server (stdio transport, Smithery entrypoint)
http.ts # Express server (Railway entrypoint, /health, /preview/*)
types.ts # BusinessProfile, SearchHit, BookingOptions, etc.
tools/ # one file per MCP tool
searchBusinesses.ts
getBusinessProfile.ts
getBookingOptions.ts
searchByQuery.ts
getCategories.ts
lib/
db.ts # data access — switches on DATA_SOURCE env (mock | supabase)
ranking.ts # 6-factor weighted relevance score
utm.ts # UTM URL builder for booking links
geo.ts # OpenStreetMap Nominatim geocoder + Haversine distance
data/
mockBusinesses.json # 30 sample SMBs (realtors, insurance, medical × Dallas, Toronto)
categories.json # vertical taxonomy
scripts/
seed.ts # Supabase seeder (Phase 2 stub)
test-mcp.ts # smoke test runner
tests/
tools.test.ts # Vitest tests for all toolsZero-PII rule
This catalog stores business data only:
Business name, address, hours, services
Public credentials and license numbers
Aggregate review counts and ratings (sourced from public APIs in Phase 2)
UTM-tagged booking URLs
It explicitly does not store:
Customer / patient names, phones, emails, or any other identifiers
Insurance policy details, medical history, or anything covered by HIPAA / PIPEDA / GDPR
Individual booking records or appointment data
Booking flow: agent gets the SMB's booking URL → user clicks → user books on the SMB's own system. We see impressions; SMB sees conversions via UTM tags on their own analytics.
MCP tool contracts
search_businesses
{
category: string, // "realtor" | "insurance_agent" | "medical_practitioner" | etc.
location: string, // "Dallas, TX" — geocoded server-side
countryCode?: "US" | "CA" | "GB" | "AU" | ...,
language?: string, // ISO-639-1, e.g. "en", "fr", "es"
subcategory?: string,
maxResults?: number, // default 10, max 25
minRating?: number
}
→ SearchHit[]get_business_profile
{ id: string, agentName?: string }
→ BusinessProfile // bookingUrl is UTM-taggedget_booking_options
{ id: string, agentName?: string }
→ { bookingUrl, acceptedMethods, hours, timezone, fallbackContact }search_by_query
{ query: string, location?: string, countryCode?: string, maxResults?: number }
→ SearchHit[]Phase 1 implementation is keyword/substring-based. Phase 2 swaps in pgvector or OpenAI embeddings for true semantic search.
get_categories
{ countryCode?: string }
→ CategoryEntry[]Ranking logic
Weighted score (0–100) per business:
Tier (20%) — healthcare 100 / pro 85 / standard 65 / free 40
Distance (30%) — closer to query origin scores higher
Rating (20%) — public review rating × volume
Vertical / subcategory match (20%)
Verified listing (5%)
Language match (5%)
See src/lib/ranking.ts.
Hand-off to Claude Code
Once you clone this folder into your local dev directory:
# 1. Install
npm install
# 2. Initialize git
git init
git add .
git commit -m "Initial scaffold: MCP server + 5 tools + mock data"
git branch -M main
git remote add origin git@github.com:YOUR_GH_USERNAME/ailistmybusiness.git
git push -u origin main
# 3. Validate locally
npm run typecheck
npm test
npm run test:mcp
# 4. Submit to Smithery (when ready)
# https://smithery.ai/new — point to your GitHub repo
# 5. Deploy HTTP entrypoint to Railway (when ready)
# https://railway.app/new — uses railway.jsonPhase 2 plug-in points
When you're ready to wire real services:
Service | What to do | File to edit |
Supabase | Create tables |
|
Stripe | Add billing routes, wire |
|
Coinbase x402 | Wrap MCP tool handlers in metered facilitator |
|
AEO syndication | Push profiles to Google Business + schema.org markup on landing pages | new |
Real reviews | Pull from Google Places / OSM for Phase 2 listings | new |
License
MIT © 2026 SokoTech.
Available Tools
5 toolsget_booking_optionsA
Get UTM-tagged booking URL plus accepted methods and hours for a business. The user books directly with the SMB; we never see customer data.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Business ID. | |
| agentName | No | MCP client identifier for UTM attribution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the 'UTM-tagged' nature and the privacy aspect of not seeing customer data, but does not reveal additional behaviors such as caching, rate limits, or whether the URL is always returned. Some behavioral traits remain implicit.
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 wasted words. The first sentence front-loads the core functionality, and the second adds a relevant privacy caveat. Every sentence contributes value.
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?
The description lists the key outputs (booking URL, accepted methods, hours). Since there is no output schema, it would benefit from explicitly stating the response structure. However, for a simple tool with two parameters, it is reasonably complete.
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%, so baseline is 3. The description adds meaning by explaining that agentName is for 'UTM attribution,' clarifying its purpose beyond the schema's 'MCP client identifier for UTM attribution.' This extra context justifies a 4.
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 clearly states the tool retrieves a UTM-tagged booking URL along with accepted methods and hours for a business. The verb 'Get' is specific, and the resource 'booking options' is distinct from sibling tools like get_business_profile, get_categories, search_businesses, and search_by_query.
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 usage when needing booking details but does not explicitly state when to use this tool versus alternatives or when not to use it. The privacy note 'we never see customer data' provides some context but no direct guidance on selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_business_profileA
Get full structured profile for a business by ID. Returns services, hours, credentials, languages, contact channels, and a UTM-tagged booking URL.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Business ID returned by search_businesses. | |
| agentName | No | Optional MCP client identifier (e.g. 'chatgpt', 'claude', 'gemini'). Used for UTM attribution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description carries full burden. It describes returns but does not disclose safety (read-only assumed), authentication needs, rate limits, or potential errors. 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?
Two concise sentences, front-loaded with purpose, no waste. Every word adds value.
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?
No output schema, but description explains return values well. Parameter coverage is complete. Could mention output structure in more detail, but sufficient for typical use.
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 covers both params with descriptions (id from search_businesses, agentName for UTM). Description adds context about UTM-tagged URL but overall schema is sufficient. Baseline 3.
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 clearly states it gets a full structured profile by ID, listing specific return fields (services, hours, etc.). Distinct from sibling tools like search_businesses or get_booking_options.
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?
Implied usage when you have a business ID and need a full profile, but no explicit when-to-use vs alternatives or when-not-to-use guidance. Sibling names suggest different purposes but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_categoriesA
List available business verticals per country. Use to discover what kinds of businesses agents can search for in a given region.
| Name | Required | Description | Default |
|---|---|---|---|
| countryCode | No | ISO-3166 alpha-2 (US, CA, GB, ...). Omit for all categories everywhere. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must cover behavioral traits. It is adequate as a read-only listing tool, but does not mention optional omission of countryCode or any edge cases.
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, front-loaded with the essential verb and resource, 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?
Given the simple single-parameter tool and no output schema, the description sufficiently conveys the tool's purpose and usage context.
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 schema already provides 100% coverage for countryCode with a clear description. The tool description adds minimal value beyond reinforcing the 'per country' concept.
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 'business verticals per country', and it distinguishes itself from sibling tools like search_businesses or get_booking_options.
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 phrase 'Use to discover what kinds of businesses agents can search for in a given region' provides clear context for when to use the tool, though it lacks explicit when-not-to-use guidance or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_businessesB
Search businesses by category and location. Returns ranked hits with name, city, rating, and matchScore. Filters: countryCode, language, subcategory, minRating, maxResults.
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | Vertical to search. One of: realtor, insurance_agent, medical_practitioner, dentist, home_health, medical_transport, home_services. Or a free-text category like 'plumber'. | |
| location | Yes | Location string — city, region, postal code, or 'Dallas, TX' style. Geocoded server-side. | |
| countryCode | No | ISO-3166 alpha-2 (US, CA, GB, AU). Restricts results to that country. | |
| language | No | ISO-639-1 (en, fr, es, ...). Boosts businesses speaking this language. | |
| subcategory | No | Optional sub-tag, e.g. 'buyer-agent', 'auto-insurance', 'family-medicine'. | |
| maxResults | No | ||
| minRating | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description only states basic behavior (returns ranked hits) and lists filters. Lacks disclosure of side effects, read-only nature, rate limits, or pagination.
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: first states main action and return fields, second lists filters. No filler, front-loaded, efficient.
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?
Description covers basic purpose and filters but lacks details on error handling, default ordering, geocoding behavior, and interpretation of 'ranked'. Adequate but with clear 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 coverage is high (71%), so baseline 3. Description adds no extra semantic value beyond listing filter names already in schema. No explanation of parameter behavior like minRating or free-text categories.
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 clearly states it searches businesses by category and location and returns ranked hits with specific fields. However, it does not explicitly differentiate from the sibling 'search_by_query' 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?
Description implies usage for category/location searches with optional filters but provides no explicit when-to-use or when-not-to-use guidance, nor alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_queryA
Natural-language search across the catalog. Use for fuzzy queries like 'evening dentist that takes Sun Life' or 'realtor in Dallas who speaks Spanish'.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural-language query, e.g. 'evening dentist in Toronto that takes Sun Life' or 'realtor in Dallas who speaks Spanish'. | |
| location | No | Optional location override. | |
| countryCode | No | ||
| maxResults | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. It states 'natural-language search' implying approximate matching but does not disclose behavioral traits like pagination, result ordering, error handling, or rate limits. The description is not misleading but lacks depth.
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, front-loaded with purpose and examples. No wasted words, though could include more detail without being verbose.
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 no output schema and no annotations, the description is adequate but incomplete. It explains usage but not return format, error cases, or limitations like result set size. For a tool with 4 parameters, more context on result behavior would be beneficial.
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 describes 'query' with examples similar to description, and location is briefly mentioned. Description adds examples but does not clarify 'countryCode' or 'maxResults' beyond schema. With schema coverage 50%, description provides moderate added value but does not fully compensate.
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 clearly states the tool performs natural-language searches across the catalog, using verbs 'search' and examples like 'evening dentist that takes Sun Life'. This distinguishes it from sibling tool 'search_businesses', which likely supports structured queries.
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?
Description provides explicit usage examples for fuzzy queries, implying when to use this tool (natural-language) over alternatives. However, it does not explicitly state when not to use it or mention the sibling 'search_businesses' as an alternative for structured queries.
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. Dates show when Glama detected each change.
5 tool updates
v0.1.0- First observed
get_booking_options - First observed
get_business_profile - First observed
get_categories - First observed
search_businesses - First observed
search_by_query
TDQS
Each tool has a clearly distinct purpose: get_booking_options returns booking URL and hours; get_business_profile returns full structured profile; get_categories lists business verticals; search_businesses performs structured search; search_by_query handles natural-language queries. No overlaps.
All tool names follow a consistent verb_noun pattern in snake_case: get_* for retrieval operations, search_* for searching. Predictable and clear.
5 tools is well-scoped for a business listing and search server. It covers the core functionalities of searching (two modes), retrieving profiles, booking options, and category discovery without being bloated.
The tool surface covers the main use cases: search by category/location, natural-language search, profile retrieval, booking info, and category listing. Minor gaps include lack of review details or contact info beyond what's in the profile, but overall it's complete for a read-only search and listing service.
Maintenance
Related MCP Connectors
MCP layer for local businesses: discover, query, book, and transact with verified SMB AI agents.
Verified local businesses, bookable by AI agents: services, prices, availability and appointments.
Local business intel for AI agents: audits, lead scoring, tech stack, prospecting.
Directory of APIs, merchants, and tools AI agents can actually use.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceSearch for local businesses worldwide. Structured data optimized for AI agents. • Search Millions of businesses over 49 countries (Europe, Northamerica, Southamerica, Asia, Oceania) • Quality & demand scoring for every business • Ranking based on real user click-through data • No API key needed, free access • Rate limit: 500 requests/hour per IP-
- AlicenseAqualityDmaintenanceSearch for local businesses worldwide. Structured data optimized for AI agents. • Search Millions of businesses over 49 countries (Europe, Northamerica, Southamerica, Asia, Oceania) • Quality & demand scoring for every business • Ranking based on real user click-through data • No API key needed, free access • Rate limit: 500 requests/hour per IP61MIT
- AlicenseAqualityFmaintenanceUniversal search engine for AI agents. Discover products, services, and businesses across every category. 10 MCP tools, zero LLM calls, millisecond responses.114AGPL 3.0

@qasperai/mcp-serverofficial
AlicenseAqualityCmaintenanceEnables AI assistants to discover and book local service businesses like barbers, plumbers, and mechanics directly through MCP-compatible tools.9108MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mutamiri-sudo/ailistmybusiness'
If you have feedback or need assistance with the MCP directory API, please join our Discord server