Skip to main content
Glama

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.json will 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_categories

  • 30 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 tools

Zero-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-tagged

get_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.json

Phase 2 plug-in points

When you're ready to wire real services:

Service

What to do

File to edit

Supabase

Create tables businesses + categories, set SUPABASE_* env vars, set DATA_SOURCE=supabase, run npm run seed

src/lib/db.ts

Stripe

Add billing routes, wire POST /webhooks/stripe, gate paid-tier features in ranking

src/http.ts, new src/billing/

Coinbase x402

Wrap MCP tool handlers in metered facilitator

src/server.ts, new src/lib/x402.ts

AEO syndication

Push profiles to Google Business + schema.org markup on landing pages

new src/syndication/

Real reviews

Pull from Google Places / OSM for Phase 2 listings

new src/lib/reviews.ts

License

MIT © 2026 SokoTech.

Available Tools

5 tools
get_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesBusiness ID.
agentNameNoMCP client identifier for UTM attribution.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesBusiness ID returned by search_businesses.
agentNameNoOptional MCP client identifier (e.g. 'chatgpt', 'claude', 'gemini'). Used for UTM attribution.

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countryCodeNoISO-3166 alpha-2 (US, CA, GB, ...). Omit for all categories everywhere.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryYesVertical to search. One of: realtor, insurance_agent, medical_practitioner, dentist, home_health, medical_transport, home_services. Or a free-text category like 'plumber'.
locationYesLocation string — city, region, postal code, or 'Dallas, TX' style. Geocoded server-side.
countryCodeNoISO-3166 alpha-2 (US, CA, GB, AU). Restricts results to that country.
languageNoISO-639-1 (en, fr, es, ...). Boosts businesses speaking this language.
subcategoryNoOptional sub-tag, e.g. 'buyer-agent', 'auto-insurance', 'family-medicine'.
maxResultsNo
minRatingNo

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesNatural-language query, e.g. 'evening dentist in Toronto that takes Sun Life' or 'realtor in Dallas who speaks Spanish'.
locationNoOptional location override.
countryCodeNo
maxResultsNo

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.1.0
    • First observedget_booking_options
    • First observedget_business_profile
    • First observedget_categories
    • First observedsearch_businesses
    • First observedsearch_by_query

TDQS

A4/5.0
Disambiguation5/5

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.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case: get_* for retrieval operations, search_* for searching. Predictable and clear.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Search 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
    -
  • A
    license
    A
    quality
    D
    maintenance
    Search 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
    6
    1
    MIT

Latest Blog Posts

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