clinic-mcp
clinic-mcp
Ein Referenz-Server für das Model Context Protocol zur Klinikplanung und Patientenaufnahme. Erstellt in TypeScript mit strenger Typisierung, strukturierten Fehlern und einer auf Datenebene erzwungenen Mandantentrennung. Die Daten sind synthetisch. Dies ist keine klinische Software.
Das Ziel ist es zu zeigen, wie ein MCP-Server in Produktionsqualität für einen Bereich aussieht, der Datenisolierung und fundierte Ausgaben erfordert: die gleiche Code-Struktur, die ich bei Rentive verwende, jedoch mit Mock-Daten und einer anderen Domäne, damit die Muster überprüfbar sind, ohne proprietäre Informationen preiszugeben.
Warum MCP
LLM-Anwendungen erfinden ständig dieselbe Verkabelung neu: Ad-hoc-Funktionsdefinitionen pro Anbieter, maßgeschneidertes Argument-Parsing, kein gemeinsamer Transport, kein konsistentes Fehlermodell. MCP ist ein kleines, offenes Protokoll, das die Verkabelungsebene vereinheitlicht. Ein Server stellt eine Liste typisierter Tools über stdio (oder HTTP) bereit, und jeder MCP-fähige Client (Claude Desktop, IDE-Integrationen, benutzerdefinierte Agenten) kann diese mit derselben Maschinerie entdecken und aufrufen.
Für Domänen-Backends bedeutet das: Sie schreiben Tools einmal und sie funktionieren überall. Für Agenten-Entwickler bedeutet es, dass Sie aufhören, Tool-Schemas von Hand zu erstellen, und anfangen, Server zu kombinieren.
Related MCP server: MCP Healthcare Server
Architektur
flowchart LR
Client["MCP client<br/>(Claude Desktop, custom agent)"]
Server["clinic-mcp server"]
Tools["Tools<br/>find_available_slot<br/>book_appointment<br/>record_intake<br/>search_protocols<br/>escalate_to_oncall"]
Store["ClinicStore<br/>tenant-scoped accessors"]
Seed[("seed.json<br/>synthetic clinics, providers,<br/>patients, protocols")]
Client -->|stdio JSON-RPC| Server
Server --> Tools
Tools --> Store
Store --> SeedJedes Tool akzeptiert eine clinic_id, und der Speicher stellt sicher, dass alle Lese- und Schreibvorgänge auf diese Klinik beschränkt sind. Ein mandantenübergreifender Zugriff löst einen TenantMismatchError aus, anstatt stillschweigend die falsche Zeile zurückzugeben. Dies spiegelt das Row-Level-Security-Muster wider, das eine Produktionsbereitstellung in Postgres erzwingen würde, hier jedoch im Anwendungscode abgebildet, damit die Garantie in einer Datei (src/store/index.ts) überprüfbar ist.
Lokal ausführen
Erfordert Node 20+ und pnpm.
git clone https://github.com/dominikstefanski/clinic-mcp.git
cd clinic-mcp
pnpm install
pnpm test # 29 tests
pnpm typecheck
pnpm dev # boots the server on stdioDer Server liest beim Start src/store/seed.json und bedient zwei synthetische Kliniken: clinic_north (Allgemeinmedizin, Kardiologie, Dermatologie) und clinic_west (Pädiatrie, Allgemeinmedizin).
In Claude Desktop einbinden
Fügen Sie dies Ihrer Claude Desktop-Konfiguration hinzu (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json). Ersetzen Sie den Pfad durch Ihren lokalen Klon.
{
"mcpServers": {
"clinic-mcp": {
"command": "npx",
"args": ["-y", "tsx", "/absolute/path/to/clinic-mcp/src/server.ts"]
}
}
}Starten Sie Claude Desktop neu. Die fünf Tools erscheinen im Verbindungsmenü. Versuchen Sie eine Eingabeaufforderung wie: "Finde einen Termin für Allgemeinmedizin in der clinic_north am nächsten Montagmorgen."
Tool-Referenz
Alle Tools geben bei Erfolg { ok: true, ...result } oder bei Fehler { ok: false, error: { code, message } } zurück. Eingaben werden mit zod validiert; MCP-Ebene-Argumentfehler werden als validation-Fehler mit Felddetails zurückgegeben.
find_available_slot
Findet freie Terminslots für ein Fachgebiet in einem Datumsbereich und überspringt Konflikte.
Feld | Typ | Hinweise | |||
| string | Erforderlich | |||
| enum |
|
|
|
|
| string | Inklusiver ISO 8601 Start | |||
| string | Exklusives ISO 8601 Ende | |||
| int | 15 bis 120, Standard 30 | |||
| int | 1 bis 50, Standard 10 |
book_appointment
Erstellt einen Termin. Erfordert einen vom Aufrufer bereitgestellten idempotency_key; Wiederholungen geben den ursprünglichen Termin zurück, anstatt doppelt zu buchen. Sprachagenten werden es erneut versuchen, daher ist dies nicht optional.
Feld | Typ | Hinweise |
| string | Erforderlich |
| string | Muss zu |
| string | Muss zu |
| string | ISO 8601 |
| int | 15 bis 120, Standard 30 |
| string | 1 bis 500 Zeichen |
| string | 8 bis 128 Zeichen, vom Aufrufer bereitgestellt |
Gibt { appointment, idempotent_replay } zurück.
record_intake
Speichert eine strukturierte Aufnahmenotiz und weist eine Triage-Stufe zu.
Feld | Typ | Hinweise |
| string | Erforderlich |
| string | Muss zu |
| string[] | 1 bis 20 Einträge |
| int | 1 bis 10, vom Patienten gemeldet |
| string | ISO 8601 |
| string | Optional, max. 2000 Zeichen |
Triage-Regel: Schweregrad >= 8 ist urgent, >= 5 ist elevated, ansonsten routine.
search_protocols
Stichwortsuche in der Protokollbibliothek der Klinik. Gibt bewertete Snippets zurück, die das Modell beim Antworten zitieren kann.
Feld | Typ | Hinweise |
| string | Erforderlich |
| string | 1 bis 500 Zeichen |
| int | 1 bis 20, Standard 5 |
Die aktuelle Implementierung ist ein naiver TF-Score mit Titelgewichtung (3x). Sie dient dazu, die Schnittstelle eines Retrieval-Tools zu demonstrieren; Produktionsbereitstellungen würden das Backend durch eine Vektorsuche ersetzen (siehe Design-Hinweise).
escalate_to_oncall
Markiert einen bestehenden Termin als dringend und weist ihn dem diensthabenden Anbieter der Klinik neu zu.
Feld | Typ | Hinweise |
| string | Erforderlich |
| string | Muss zu |
| string | 1 bis 500 Zeichen, wird an den Grund des Termins angehängt |
Gibt { appointment, on_call_provider, reassigned } zurück.
Design-Hinweise
Mandantentrennung wird im Speicher erzwungen, nicht im Tool. Tools akzeptieren eine clinic_id und geben sie weiter. Der Speicher validiert den Besitz bei jedem Zugriff und löst bei Nichtübereinstimmung einen TenantMismatchError aus. Wenn Sie morgen ein neues Tool hinzufügen, können Sie nicht versehentlich Daten zwischen Kliniken preisgeben; der Speicher lässt dies nicht zu.
Idempotenz bei Schreibvorgängen. book_appointment erfordert einen idempotency_key. Echte Aufrufer (Sprachagenten, Wiederholungsschleifen, Netzwerkprobleme) werden Anfragen wiederholen, und ein Gesundheitssystem, das auf Wiederholungen mit der Erstellung doppelter Termine reagiert, ist ein System, das vom ersten Tag an das Vertrauen verliert.
Strukturierte Fehler statt geworfener Strings. Jeder Domänenfehler ist eine typisierte DomainError-Unterklasse mit einem stabilen code. Der MCP-Wrapper wandelt sie in { ok: false, error: { code, message } } um. Clients können nach code verzweigen, anstatt message mit Regex zu durchsuchen.
Das Retrieval-Tool ist ein Platzhalter. search_protocols verwendet einen In-Memory-TF-Score, damit das Repo ohne externe Dienste läuft. In der Produktion ist dies die Schnittstelle, an der Sie Pinecone, pgvector oder Ihr bevorzugtes Retrieval-Backend anschließen. Der Input/Output-Vertrag des Tools bleibt gleich.
Zeitbehandlung ist vereinfacht. Die Arbeitszeiten der Anbieter werden zur Klarheit in UTC interpretiert. Eine echte Bereitstellung würde die Zeitzone jeder Klinik berücksichtigen (bereits im Schema vorhanden). Dies wird explizit erwähnt, damit Prüfer wissen, dass es beabsichtigt ist und kein Versehen.
Was dies nicht ist
Keine klinische Software. Die Triage-Regel ist ein Spielzeug und das Protokoll-Korpus ist handgeschriebene Prosa. Verwenden Sie es nicht für Dinge, die echte Patienten betreffen.
Nicht HIPAA-konform. Die Daten sind gefälscht, die Speicherung erfolgt im Arbeitsspeicher, es gibt kein Audit-Log. Die Produktion würde all das und mehr erfordern.
Kein vollständiges EMR- oder Planungs-Backend. Der Punkt ist, die Form des MCP-Servers zu zeigen, nicht ein Kliniksystem auszuliefern.
Lizenz
MIT. Siehe LICENSE.
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 Servers
- FlicenseAqualityBmaintenanceA learning MCP server providing synthetic FHIR patient data with read tools and a gated write workflow (propose → human approve → commit) with structured audit logging.10
- Flicense-qualityBmaintenanceAn MCP server for clinical workflows with tools for patient lookup, appointment booking, prescriptions, drug interactions, symptom triage, lab results, insurance eligibility, and telehealth, enforcing role-based access control and audit logging.2
- Alicense-qualityCmaintenanceA reference MCP server demonstrating safe agent access to multi-tenant CRM data with tenant isolation enforced in the data layer, role-based permissions, and human confirmation on writes.MIT
- AlicenseAqualityBmaintenanceA Claude-compatible MCP server that exposes health-domain tools over 100% synthetic data, built with security and compliance in mind.4MIT
Related MCP Connectors
MCP server for medicare-coverage
Hosted MCP server exposing US hospital procedure cost data to AI assistants
Self-hosted federated MCP gateway: one OAuth 2.1 MCP server in front of N apps, user-level scopes.
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/dominikstefanski/clinic-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server