Skip to main content
Glama

ailistmybusiness

AI 기반 중소기업 검색을 위한 MCP 호출 가능 디렉토리입니다. 국가 중립적이며, 부동산 중개인, 보험 설계사, 의료 종사자(1단계)에 대한 개인 식별 정보(PII)가 없는 카탈로그입니다.

가칭입니다. 도메인 등록 전까지는 공개 브랜드명이 확정되지 않았습니다. 도메인이 확정되면 폴더 이름과 package.json이 변경될 예정입니다.

이 프로젝트의 목적

사용자가 ChatGPT, Claude 또는 Gemini에게 "댈러스의 부동산 중개인 찾아줘" / "토론토의 저녁 야간 진료소" / "이중언어 보험 중개인" 등을 물어보면, AI가 이 MCP 서버를 호출합니다. 그러면 UTM 태그가 지정된 예약 URL이 포함된 비즈니스 목록을 순위별로 반환합니다. 사용자는 중소기업과 직접 예약하게 됩니다. 우리는 고객 데이터를 절대 보지 않습니다. 우리는 리드 프로세서가 아닌 비즈니스 카탈로그입니다.

Related MCP server: discava – Business Directory for AI

1단계 상태

  • [x] MCP 서버 스캐폴드 (Node 20 + TypeScript)

  • [x] 5가지 도구: search_businesses, get_business_profile, get_booking_options, search_by_query, get_categories

  • [x] 3개 업종 × 2개 국가(댈러스 + 토론토)에 걸친 30개의 모의 중소기업 데이터

  • [x] OpenStreetMap Nominatim 지오코딩 (무료, PII 없음)

  • [x] 중소기업 기여도 추적을 위한 UTM 태그 예약 URL

  • [x] 5개 도구 전체에 대한 Vitest 테스트 스위트

  • [x] Smithery + Glama + Railway 매니페스트

  • [ ] Supabase 연동 (2단계)

  • [ ] 유료 티어를 위한 Stripe 결제 (2단계)

  • [ ] API 티어 측정을 위한 Coinbase x402 (3단계)

빠른 시작

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)

그런 다음 http://localhost:3000/preview/search?category=realtor&location=Dallas를 방문하여 순위 결과를 확인하세요.

아키텍처

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

제로 PII 규칙

이 카탈로그는 비즈니스 데이터만 저장합니다:

  • 비즈니스 이름, 주소, 영업시간, 서비스

  • 공개 자격 증명 및 면허 번호

  • 집계된 리뷰 수 및 평점 (2단계에서 공개 API를 통해 소싱)

  • UTM 태그가 지정된 예약 URL

다음 정보는 명시적으로 저장하지 않습니다:

  • 고객/환자 이름, 전화번호, 이메일 또는 기타 식별자

  • 보험 정책 세부 정보, 의료 기록 또는 HIPAA/PIPEDA/GDPR의 적용을 받는 모든 정보

  • 개별 예약 기록 또는 약속 데이터

예약 흐름: 에이전트가 중소기업의 예약 URL을 가져옴 → 사용자가 클릭 → 사용자가 중소기업의 자체 시스템에서 예약. 우리는 노출 수만 확인하며, 중소기업은 자체 분석 도구의 UTM 태그를 통해 전환을 확인합니다.

MCP 도구 계약

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[]

1단계 구현은 키워드/부분 문자열 기반입니다. 2단계에서는 진정한 의미론적 검색을 위해 pgvector 또는 OpenAI 임베딩으로 교체됩니다.

get_categories

{ countryCode?: string }
→ CategoryEntry[]

순위 로직

비즈니스별 가중치 점수(0–100):

  • 티어 (20%) — 의료 100 / 전문가 85 / 일반 65 / 무료 40

  • 거리 (30%) — 쿼리 원점과 가까울수록 높은 점수

  • 평점 (20%) — 공개 리뷰 평점 × 볼륨

  • 업종/하위 카테고리 일치 (20%)

  • 인증된 리스팅 (5%)

  • 언어 일치 (5%)

src/lib/ranking.ts를 참조하세요.

Claude Code로의 핸드오프

이 폴더를 로컬 개발 디렉토리에 복제한 후:

# 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

2단계 플러그인 포인트

실제 서비스를 연결할 준비가 되었을 때:

서비스

수행 작업

편집할 파일

Supabase

businesses + categories 테이블 생성, SUPABASE_* 환경 변수 설정, DATA_SOURCE=supabase 설정, npm run seed 실행

src/lib/db.ts

Stripe

결제 경로 추가, POST /webhooks/stripe 연결, 순위 지정 시 유료 티어 기능 제한

src/http.ts, 신규 src/billing/

Coinbase x402

MCP 도구 핸들러를 측정 가능한 패실리테이터로 래핑

src/server.ts, 신규 src/lib/x402.ts

AEO 신디케이션

Google Business로 프로필 전송 + 랜딩 페이지에 schema.org 마크업 추가

신규 src/syndication/

실제 리뷰

2단계 리스팅을 위해 Google Places / OSM에서 가져오기

신규 src/lib/reviews.ts

라이선스

독점. © 2026 Charles Mutamiri.

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.

  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

Scored across 5 tools

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
    C
    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