Skip to main content
Glama
woodydaniel

whodoicallfor-mcp

by woodydaniel

whodoicallfor-mcp

一个 MCP 服务器,回答人们在家庭紧急情况下真正会问的问题:该给哪个工种打电话?

不是“帮我找个水管工。”而是更前面的问题——这真的是水管工的活儿吗?

问题

我给水管工打了电话,他让我找电器维修工。我给电器维修工打了电话,他又让我找水管工。

这就是家庭紧急情况的常态,而且代价高昂。两次上门费,半天时间没了,水还在从天花板往下漏。这些工种各有专攻,但从外面看,它们的界限并不明显:天花板上的水渍,如果随天气变化就是屋顶工的事,如果随空调使用而变就是暖通空调技工的事,如果随楼上淋浴而变就是水管工的事。漏水停止后的水损修复则是第四个工种——减灾团队——而水管工会等你付了上门费之后才告诉你这一点。

这个服务器为助手提供了一张“分诊表”。用大白话描述问题,就能得到该给谁打电话、按什么顺序打、不要因为什么原因找他们、通常要花多少钱(附有注明日期的来源),以及——如果存在的话——24/7 调度电话。

内容来自 whodoicallfor.com 的公共 JSON API。无需身份验证、无需 API 密钥、无需配置。

安装

Claude Code

claude mcp add whodoicallfor -- npx -y whodoicallfor-mcp

Cursor——添加到 ~/.cursor/mcp.json(或项目中的 .cursor/mcp.json):

{
  "mcpServers": {
    "whodoicallfor": {
      "command": "npx",
      "args": ["-y", "whodoicallfor-mcp"]
    }
  }
}

同样的配置也适用于 Claude Desktop(claude_desktop_config.json)、Windsurf、Zed,以及任何支持 stdio MCP 的客户端。

或者什么都不用运行。 这个服务器的托管实例已经上线:

https://whodoicallfor.com/api/mcp/

它支持流式 HTTP,无状态,也不需要任何凭据。必须带末尾斜杠——不带斜杠的 URL 会返回 308 重定向,而一些 MCP 客户端不会在 POST 时跟随重定向。

claude mcp add --transport http whodoicallfor https://whodoicallfor.com/api/mcp/

直接运行

npx whodoicallfor-mcp                # stdio (default)
npx whodoicallfor-mcp --http         # streamable HTTP on http://localhost:3000/mcp
npx whodoicallfor-mcp --http 8080    # ...on a port you pick

需要 Node 20.19 或更高版本。

工具

这三个工具都是只读、幂等的,除了公共 API 之外不接触任何东西。

工具

参数

返回

route_emergency

problem(必填)、state(可选)

最多 3 个按优先级排序的情景,最佳匹配排在最前

get_scenario

categoryslug

一个完整的情景

list_scenarios

所有已发布的情景,附带规范 URL

route_emergency

输入大白话问题,输出排序后的情景。传入美国州代码或名称("FL""Florida"),可将调度号码过滤为真正覆盖该州的线路。

输入

{ "problem": "water coming through my ceiling" }

输出(节选——真实响应会携带三个匹配结果,包含完整的 costsfaqsources 数组)

{
  "matches": [
    {
      "title": "Water Leaking From the Ceiling — Who Do I Call?",
      "category": "water",
      "vertical": "water-damage",
      "tldr": "What's directly above matters less than timing. Appears or worsens when it rains → roofer. Appears when the AC runs, or only in cooling season → HVAC condensate line. Neither, and it tracks water use upstairs → plumber. If water is still coming, shut the main valve, keep it clear of lights and outlets, and photograph everything before any repair. Renting? The landlord's emergency line comes before any of this.",
      "who_to_call": [
        {
          "who": "Emergency plumber",
          "when": "Water is actively dripping or flowing and you can't stop it at the source",
          "not_for": "The leak has stopped — a plumber fixes pipes, not soaked drywall"
        },
        {
          "who": "Roofer",
          "when": "The stain appears or worsens when it rains and stays quiet in dry weather — usually failed flashing",
          "not_for": "The stain tracks showers, washes, or flushes rather than the weather"
        }
      ],
      "costs": [
        {
          "item": "Water-damaged ceiling repair",
          "range": "$200–$1,500",
          "source": "Fixr",
          "source_url": "https://www.fixr.com/costs/ceiling-repair"
        }
      ],
      "updated": "2026-08-12",
      "url": "https://whodoicallfor.com/water/ceiling-leaking/",
      "recommended_call": null,
      "match_score": 12
    }
  ],
  "state": null
}

not_for 字段正是帮你省下那笔冤枉上门费的部分。

当没有条目得分足够高时,你会得到一个空的 matches 数组,外加 note、类别索引,以及一个指向引导式分诊的链接——而不是一个自信但错误的答案。

get_scenario

使用来自 route_emergencylist_scenarioscategoryslug 获取一个完整的情景。

{ "category": "water", "slug": "ceiling-leaking" }

返回相同的结构化对象,并附带 body_markdown(完整的逐步指南),前提是上游 API 提供了该字段。

list_scenarios

无参数。返回 { site, count, scenarios[] }——所有已发布的情景,包含标题、描述、类别、slug、updated 日期、规范 URL 和 JSON URL。

匹配机制

route_emergency 通过你的问题与每个情景的四个字段之间的加权词元重叠来进行排名:标题 ×3、描述 ×2、tldr ×1,以及每个 who_to_call 步骤的 who/when ×1。词元会被转换为小写、去除标点、按停用词表过滤,并进行后缀折叠,因此 "leaking" 能匹配 "leak","pipes" 能匹配 "pipe"。得分低于 3 的条目会被丢弃;最多返回三个匹配结果。

tldrwho_to_call 位于每个页面的文档中,而不是索引中,因此第一次 route_emergency 调用会预热一个完整的内存缓存(有界并发,冷启动约 2 秒)。后续调用只需几毫秒。索引缓存 10 分钟,页面正文缓存一小时,因此服务器绝不会对站点造成压力。

这里没有模糊匹配,没有嵌入模型,除了 whodoicallfor.com 之外不会调用任何网络请求。它是一个小而确定的函数,你可以一口气读完:src/match.ts

披露

有两件事需要说明白。

recommended_call 条目是赞助内容。 它们是付费的按呼叫计费电话线路,每条都会在载荷中标记为 "sponsored": true。当一个情景带有这样的条目时,这就是网站背后的商业引擎。请将其视为带电话号码的广告,并以此向用户展示——数据中之所以有这个标记,正是为了让你这么做。

涉及生命安全的号码绝不会是赞助内容。 911、毒物控制中心和燃气公用事业应急热线完全不携带 recommended_call——服务端有一个硬性守卫,会为燃气情景以及任何没有商业垂直领域的情景移除该字段。如果有人闻到燃气味,答案是“马上出去,从外面给燃气公司打电话”,而没有人为此付过费。这个守卫不是政策偏好;它是上游代码,这个客户端无法覆盖它。

费用数据均引用自具名来源,并附有访问日期。在依据任何信息行动之前,请先核实。

开发

npm install
npm run typecheck
npm run build
npm start           # stdio
npm run start:http  # http on :3000
src/index.ts    entry point: tool definitions, stdio + streamable HTTP transports
src/client.ts   cached fetches against the public JSON endpoints
src/match.ts    token-overlap ranking

覆盖范围

以美国为主。涵盖水患与洪涝、燃气与一氧化碳、电力与电气、供暖与制冷、家电、害虫与野生动物、门锁故障、汽车故障,以及房东和承包商纠纷等约 40 种情景。list_scenarios 始终反映实际发布的内容。

许可证

MIT © Daniel Widmonte

-
license - not tested
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • MCP server for generating rough-draft project plans from natural-language prompts.

  • MCP server giving Claude AI access to 22+ NYC public-record databases for real estate due diligence

  • Hosted MCP server exposing US hospital procedure cost data to AI assistants

View all MCP Connectors

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/woodydaniel/whodoicallfor-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server