Skip to main content
Glama

ailistmybusiness

用于 AI 驱动的中小企业发现的 MCP 可调用目录。这是一个不限国家、零个人身份信息(PII)的房地产经纪人、保险代理人和医疗从业者目录(第一阶段)。

暂定名称。 公共品牌名称待域名注册后确定。一旦域名锁定,文件夹名称和 package.json 将会重命名。

这是什么

当用户询问 ChatGPT、Claude 或 Gemini“帮我找一位达拉斯的房地产经纪人” / “多伦多的晚间免预约诊所” / “双语保险经纪人”时,AI 会调用此 MCP 服务器。它将返回带有 UTM 标签预订链接的排名企业列表。用户直接与中小企业进行预订。我们从不查看客户数据——我们是一个企业目录,而不是潜在客户处理商。

Related MCP server: discava – Business Directory for AI

第一阶段状态

  • [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 标签预订链接

  • [x] 针对所有 5 个工具的 Vitest 测试套件

  • [x] Smithery + Glama + Railway 清单

  • [ ] Supabase 连接(第二阶段)

  • [ ] 用于付费等级的 Stripe 计费(第二阶段)

  • [ ] 用于 API 等级的 Coinbase x402 计量(第三阶段)

快速开始

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 规则

此目录仅存储企业数据:

  • 企业名称、地址、营业时间、服务

  • 公共资质和执照号码

  • 汇总的评论数量和评分(第二阶段将从公共 API 获取)

  • 带有 UTM 标签的预订链接

明确不存储:

  • 客户/患者姓名、电话、电子邮件或任何其他标识符

  • 保险单详情、病史或任何受 HIPAA / PIPEDA / GDPR 保护的内容

  • 个人预订记录或预约数据

预订流程:智能体获取中小企业的预订链接 → 用户点击 → 用户在中小企业自己的系统上进行预订。我们看到展示次数;中小企业通过其自身分析中的 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[]

第一阶段实现基于关键词/子字符串。第二阶段将切换为 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

第二阶段插件点

准备好连接真实服务时:

服务

操作

编辑文件

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/

真实评论

为第二阶段列表从 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