whodoicallfor-mcp
whodoicallfor-mcp
MCP-сервер, который отвечает на вопрос, который люди на самом деле задают при домашней аварии: какому специалисту звонить?
Не «найдите мне сантехника». Предшествующий вопрос — а это вообще сантехник?
Проблема
Я позвонил сантехнику, который сказал мне вызвать мастера по бытовой технике. Я позвонил мастеру по бытовой технике, который сказал мне вызвать сантехника.
Это обычный опыт бытовой аварии, и он дорого обходится. Две платы за выезд, полдня потеряно, а вода всё ещё течёт через потолок. Специальности узкие, и их границы невидимы со стороны: пятно на потолке — это кровельщик, если оно зависит от погоды, специалист по ОВиК, если оно зависит от кондиционера, и сантехник, если оно зависит от душа наверху. Ущерб от воды после того, как течь остановлена, — это четвёртая специальность — бригада по устранению последствий, — и сантехник скажет вам об этом после того, как вы оплатили вызов.
Этот сервер предоставляет ассистенту таблицу маршрутизации. Опишите проблему простыми словами; получите в ответ, кому звонить, в каком порядке, по какому поводу к ним не обращаться, сколько это обычно стоит с указанием источника и даты, и — если есть — круглосуточную диспетчерскую линию.
Контент берётся из публичного JSON API на сайте whodoicallfor.com. Без аутентификации, без API-ключа, без настройки.
Установка
Claude Code
claude mcp add whodoicallfor -- npx -y whodoicallfor-mcpCursor — добавьте в ~/.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.
Инструмент | Аргументы | Возвращает |
|
| До 3 ранжированных ситуаций, лучшая первой |
|
| Одна ситуация полностью |
| — | Все опубликованные ситуации с каноническими 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 :3000src/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
This server cannot be installed
Maintenance
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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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