Skip to main content
Glama
woodydaniel

whodoicallfor-mcp

by woodydaniel

whodoicallfor-mcp

MCP-сервер, который отвечает на вопрос, который люди на самом деле задают при домашней аварии: какому специалисту звонить?

Не «найдите мне сантехника». Предшествующий вопрос — а это вообще сантехник?

Проблема

Я позвонил сантехнику, который сказал мне вызвать мастера по бытовой технике. Я позвонил мастеру по бытовой технике, который сказал мне вызвать сантехника.

Это обычный опыт бытовой аварии, и он дорого обходится. Две платы за выезд, полдня потеряно, а вода всё ещё течёт через потолок. Специальности узкие, и их границы невидимы со стороны: пятно на потолке — это кровельщик, если оно зависит от погоды, специалист по ОВиК, если оно зависит от кондиционера, и сантехник, если оно зависит от душа наверху. Ущерб от воды после того, как течь остановлена, — это четвёртая специальность — бригада по устранению последствий, — и сантехник скажет вам об этом после того, как вы оплатили вызов.

Этот сервер предоставляет ассистенту таблицу маршрутизации. Опишите проблему простыми словами; получите в ответ, кому звонить, в каком порядке, по какому поводу к ним не обращаться, сколько это обычно стоит с указанием источника и даты, и — если есть — круглосуточную диспетчерскую линию.

Контент берётся из публичного JSON API на сайте whodoicallfor.com. Без аутентификации, без 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/

Он говорит по streamable 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

category, slug

Одна ситуация полностью

list_scenarios

Все опубликованные ситуации с каноническими URL

route_emergency

Проблема на простом языке на входе, ранжированные ситуации на выходе. Передайте код или название штата США ("FL", "Florida"), чтобы отфильтровать диспетчерские номера до линий, которые действительно покрывают этот штат.

Вход

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

Выход (сокращено — настоящий ответ содержит три совпадения с полными массивами costs, faq и sources)

{
  "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

Получите одну ситуацию полностью, используя category и slug из route_emergency или list_scenarios.

{ "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/when каждого шага who_to_call ×1. Токены приводятся к нижнему регистру, очищаются от пунктуации, фильтруются по списку стоп-слов и сворачиваются по суффиксам, поэтому «leaking» соответствует «leak», а «pipes» соответствует «pipe». Всё, что набирает меньше 3, отбрасывается; в ответ возвращается не более трёх совпадений.

tldr и who_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