Skip to main content
Glama
woodydaniel

whodoicallfor-mcp

by woodydaniel

whodoicallfor-mcp

Ein MCP-Server, der die Frage beantwortet, die Menschen in einem Hausnotfall tatsächlich stellen: welches Gewerk rufe ich?

Nicht „finde mir einen Klempner.“ Die vorherige Frage — ist das überhaupt ein Klempner?

Das Problem

Ich habe einen Klempner gerufen, der mir sagte, ich solle einen Gerätetechniker rufen. Ich habe einen Gerätetechniker gerufen, der mir sagte, ich solle einen Klempner rufen.

Das ist die normale Erfahrung bei einem Hausnotfall, und sie ist teuer. Zwei Anfahrtskosten, ein halber Tag verloren, und das Wasser kommt immer noch durch die Decke. Die Gewerke sind spezialisiert und ihre Grenzen sind von außen unsichtbar: Ein Fleck an deiner Decke ist ein Dachdecker, wenn er vom Wetter abhängt, ein HLK-Techniker, wenn er mit der Klimaanlage zusammenhängt, und ein Klempner, wenn er von der Dusche oben stammt. Wasserschaden nach dem Stoppen des Lecks ist ein viertes Gewerk — ein Trocknungsteam — und ein Klempner wird dir das sagen, nachdem du den Einsatz bezahlt hast.

Dieser Server gibt einem Assistenten die Routing-Tabelle. Beschreibe das Problem in einfachen Worten; du erhältst zurück, wen du anrufen sollst, in welcher Reihenfolge, wofür du sie nicht anrufen sollst, was es typischerweise kostet, mit einer datierten Quelle, und — wo vorhanden — eine 24/7-Einsatzleitung.

Die Inhalte stammen aus der öffentlichen JSON-API unter whodoicallfor.com. Keine Authentifizierung, kein API-Schlüssel, keine Konfiguration.

Installation

Claude Code

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

Cursor — füge zu ~/.cursor/mcp.json hinzu (oder .cursor/mcp.json in einem Projekt):

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

Dasselbe Format funktioniert für Claude Desktop (claude_desktop_config.json), Windsurf, Zed und alles andere, das stdio-MCP spricht.

Oder starte nichts. Eine gehostete Instanz dieses Servers ist live:

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

Sie spricht streambares HTTP, ist zustandslos und benötigt keine Anmeldedaten. Der abschließende Schrägstrich ist erforderlich — die URL ohne Schrägstrich antwortet mit einer 308-Weiterleitung, und mehrere MCP-Clients folgen einer Weiterleitung bei einem POST nicht.

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

Direkt ausführen

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

Erfordert Node.js 20.19 oder neuer.

Werkzeuge

Alle drei sind schreibgeschützt, idempotent und berühren nichts außerhalb der öffentlichen API.

Werkzeug

Argumente

Rückgabe

route_emergency

problem (erforderlich), state (optional)

Bis zu 3 bewertete Szenarien, beste zuerst

get_scenario

category, slug

Ein Szenario in voller Länge

list_scenarios

Jedes veröffentlichte Szenario mit kanonischen URLs

route_emergency

Problem in einfacher Sprache rein, bewertete Szenarien raus. Gib einen US-Bundesstaatscode oder -namen an ("FL", "Florida"), um die Einsatznummern auf Leitungen zu filtern, die diesen Staat tatsächlich abdecken.

Eingabe

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

Ausgabe (gekürzt — die echte Antwort enthält drei Treffer mit vollständigen costs-, faq- und sources-Arrays)

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

Das Feld not_for ist der Teil, der die verschwendete Anfahrtsgebühr erspart.

Wenn nichts hoch genug bewertet wird, erhältst du ein leeres matches-Array plus eine note, den Kategorie-Index und einen Link zur geführten Triage — statt einer selbstbewusst falschen Antwort.

get_scenario

Ruft ein Szenario vollständig ab, unter Verwendung von category und slug aus route_emergency oder list_scenarios.

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

Gibt dasselbe strukturierte Objekt zurück, plus body_markdown (die vollständige Schritt-für-Schritt-Anleitung), wenn die übergeordnete API es bereitstellt.

list_scenarios

Keine Argumente. Gibt { site, count, scenarios[] } zurück — jede veröffentlichte Situation mit Titel, Beschreibung, Kategorie, Slug, updated-Datum, kanonischer URL und JSON-URL.

Wie der Abgleich funktioniert

route_emergency sortiert nach gewichteter Token-Überschneidung zwischen deinem Problem und vier Feldern jeder Situation: Titel ×3, Beschreibung ×2, tldr ×1 und who/when jedes who_to_call-Schritts ×1. Token werden klein geschrieben, von Satzzeichen befreit, gegen eine Stoppwortliste gefiltert und suffixgefaltet, sodass „leaking“ zu „leak“ passt und „pipes“ zu „pipe“. Alles unter 3 Punkten wird verworfen; höchstens drei Treffer kommen zurück.

tldr und who_to_call leben in den seitenweisen Dokumenten und nicht im Index, daher wärmt der erste route_emergency-Aufruf einen vollständigen In-Memory-Cache (begrenzte Parallelität, ~2s kalt). Nachfolgende Aufrufe dauern einstellige Millisekunden. Der Index wird 10 Minuten lang gecacht und Seiteninhalte eine Stunde lang, sodass der Server die Website nie überlastet.

Es gibt kein unscharfes Matching, kein Einbettungsmodell und keinen Netzwerkaufruf an irgendetwas außer whodoicallfor.com. Es ist eine kleine deterministische Funktion, die man in einem Sitzen lesen kann: src/match.ts.

Offenlegung

Zwei Dinge, die man klar ansprechen sollte.

recommended_call-Einträge sind gesponsert. Es sind bezahlte Pay-per-Call-Leitungen, und jede ist im Payload mit "sponsored": true gekennzeichnet. Wenn eine Situation einen solchen Eintrag enthält, ist das der kommerzielle Motor hinter der Website. Behandle ihn wie eine Anzeige mit einer Telefonnummer und zeige ihn den Nutzern auch so — genau dafür ist das Flag in den Daten.

Lebensrettende Nummern werden niemals gesponsert. 911, Giftnotruf und Gasnotrufleitungen enthalten überhaupt kein recommended_call — es gibt eine harte serverseitige Schutzmaßnahme, die es für Gasszenarien und für jede Situation ohne kommerzielle Sparte entfernt. Wenn jemand Gas riecht, lautet die Antwort „Rausgehen und den Versorger von draußen anrufen“, und niemand hat für diese Platzierung bezahlt. Diese Schutzmaßnahme ist keine politische Präferenz; sie ist Code, upstream, und dieser Client kann sie nicht außer Kraft setzen.

Kostenangaben werden mit einer benannten Quelle und einem Zugriffsdatum zitiert. Überprüfe alles, auf dessen Grundlage du handeln willst.

Entwicklung

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

Abdeckung

US-orientiert. Etwa 40 Szenarien zu Wasser und Überschwemmung, Gas und Kohlenmonoxid, Strom und Elektrik, Heizung und Kühlung, Haushaltsgeräten, Schädlingen und Wildtieren, Ausgesperrtsein, Autopannen sowie Streitigkeiten mit Vermietern und Auftragnehmern. list_scenarios spiegelt immer wider, was tatsächlich veröffentlicht ist.

Lizenz

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