Skip to main content
Glama
woodydaniel

whodoicallfor-mcp

by woodydaniel

whodoicallfor-mcp

Un servidor MCP que responde a la pregunta que la gente realmente se hace durante una emergencia doméstica: ¿a qué oficio llamo?

No «encuéntrame un fontanero». La pregunta previa — ¿esto es siquiera cosa de un fontanero?

El problema

Llamé a un fontanero, que me dijo que llamara a un técnico de electrodomésticos. Llamé a un técnico de electrodomésticos, que me dijo que llamara a un fontanero.

Esa es la experiencia normal de una emergencia doméstica, y es cara. Dos cargos por desplazamiento, medio día perdido y el agua sigue entrando por el techo. Los oficios están especializados y sus límites son invisibles desde fuera: una mancha en el techo es cosa del techador si varía con el clima, del técnico de climatización si varía con el aire acondicionado y del fontanero si viene de la ducha de arriba. El daño por agua después de que la fuga se detenga es un cuarto oficio — un equipo de mitigación — y un fontanero te lo dirá después de que hayas pagado la visita.

Este servidor le da a un asistente la tabla de enrutamiento. Describe el problema en palabras sencillas; recibe a quién llamar, en qué orden, para qué no llamarles, cuánto cuesta normalmente con una fuente fechada y — si existe — una línea de emergencia 24/7.

El contenido proviene de la API JSON pública en whodoicallfor.com. Sin autenticación, sin clave de API, sin configuración.

Instalación

Claude Code

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

Cursor — añádelo a ~/.cursor/mcp.json (o .cursor/mcp.json en un proyecto):

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

La misma estructura funciona para Claude Desktop (claude_desktop_config.json), Windsurf, Zed y cualquier otra cosa que hable MCP por stdio.

O no ejecutes nada. Una instancia alojada de este servidor está activa:

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

Habla HTTP streamable, no tiene estado y no necesita credenciales. La barra final es obligatoria — la URL sin barra responde con un redireccionamiento 308, y varios clientes MCP no siguen un redireccionamiento en una petición POST.

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

Ejecutarlo directamente

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

Requiere Node 20.19 o superior.

Herramientas

Las tres son de solo lectura, idempotentes y no tocan nada fuera de la API pública.

Herramienta

Argumentos

Devuelve

route_emergency

problem (obligatorio), state (opcional)

Hasta 3 situaciones ordenadas, la mejor primero

get_scenario

category, slug

Una situación completa

list_scenarios

Cada situación publicada con URLs canónicas

route_emergency

Problema en lenguaje natural dentro, situaciones ordenadas fuera. Pasa un código o nombre de estado de EE. UU. ("FL", "Florida") para filtrar los números de emergencia y quedarte solo con las líneas que realmente cubren ese estado.

Entrada

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

Salida (resumido — la respuesta real incluye tres coincidencias con los arrays completos costs, faq y 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
}

El campo not_for es la parte que evita el cargo de desplazamiento desperdiciado.

Cuando nada obtiene una puntuación suficientemente alta, recibes un array matches vacío, más una note, el índice de categoría y un enlace a un triaje guiado — en lugar de una respuesta errónea dada con seguridad.

get_scenario

Obtén una situación completa usando category y slug de route_emergency o list_scenarios.

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

Devuelve el mismo objeto estructurado, más body_markdown (la guía completa paso a paso) cuando la API de origen lo proporciona.

list_scenarios

Sin argumentos. Devuelve { site, count, scenarios[] } — cada situación publicada con su título, descripción, categoría, slug, fecha updated, URL canónica y URL JSON.

Cómo funciona la coincidencia

route_emergency ordena por solapamiento ponderado de tokens entre tu problema y cuatro campos de cada situación: título ×3, descripción ×2, tldr ×1, y el who/when de cada paso who_to_call ×1. Los tokens se pasan a minúsculas, se les quita la puntuación, se filtran con una lista de palabras vacías y se pliegan los sufijos, de modo que "leaking" coincide con "leak" y "pipes" con "pipe". Todo lo que puntúe por debajo de 3 se descarta; como máximo vuelven tres coincidencias.

tldr y who_to_call viven en los documentos de cada página, no en el índice, así que la primera llamada a route_emergency calienta una caché completa en memoria (concurrencia limitada, ~2 s en frío). Las llamadas posteriores tardan pocos milisegundos. El índice se guarda en caché durante 10 minutos y los cuerpos de página durante una hora, de modo que el servidor nunca satura el sitio.

No hay coincidencia difusa, ni modelo de embedding, ni llamada de red a nada que no sea whodoicallfor.com. Es una pequeña función determinista que puedes leer de una sentada: src/match.ts.

Divulgación

Dos cosas sobre las que conviene ser claros.

Las entradas recommended_call están patrocinadas. Son líneas de pago por llamada, y cada una está etiquetada como "sponsored": true en la carga útil. Cuando una situación incluye una, ese es el motor comercial del sitio. Trátala como un anuncio con número de teléfono y muéstrasela a los usuarios como tal: el indicador está en los datos precisamente para que puedas hacerlo.

Los números de seguridad vital nunca están patrocinados. Las líneas de emergencia del 911, del control de intoxicaciones y de las compañías de gas no llevan ningún recommended_call — hay una protección estricta en el servidor que lo elimina para escenarios de gas y para cualquier situación sin una vertical comercial. Si alguien huele a gas, la respuesta es «sal y llama a la compañía desde fuera», y nadie ha pagado por esa colocación. Esa protección no es una preferencia de política; es código, en el servidor de origen, y este cliente no puede anularla.

Las cifras de coste se citan con una fuente identificada y una fecha de acceso. Verifica cualquier cosa sobre la que vayas a actuar.

Desarrollo

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

Cobertura

Centrado en EE. UU. Alrededor de 40 situaciones en agua e inundaciones, gas y monóxido de carbono, electricidad y suministro eléctrico, calefacción y refrigeración, electrodomésticos, plagas y fauna, cerraduras, problemas con el coche y disputas con propietarios y contratistas. list_scenarios siempre refleja lo que está realmente publicado.

Licencia

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