clinical-mcp
clinical-mcp
Ein MCP-Server für klinische Arbeitsabläufe: synthetische FHIR-R4-Patientenakten durchsuchen und zusammenfassen, Literatur aus PubMed abrufen und Freitext anonymisieren – alles von Claude (oder einem beliebigen MCP-Client) aus.
Als Referenz-MCP-Server gebaut: Er implementiert die gesamte Spezifikationsfläche (Tools, Ressourcen und Prompts – die meisten öffentlichen Server beschränken sich auf Tools), wird mit einer Testsuite geliefert, die das Drahtprotokoll übt, und läuft über stdio oder authentifiziertes streambares HTTP.
Alle Patientendaten sind synthetisch, generiert von Synthea. In diesem Projekt existiert keinerlei echte PHI.
Architecture
[Claude / MCP client]
| stdio or streamable-http (+ bearer auth)
v
[clinical-mcp (MCPServer)]
|-- tools ------ search_patients, get_patient_summary, get_observations,
| search_pubmed, get_pubmed_abstract, deidentify_text
|-- resources -- fhir://patients (roster)
| fhir://patients/{id} (full record, URI template)
|-- prompts ---- clinical_summary, literature_review
|
+-- FhirStore ----------- in-memory index over Synthea FHIR R4 bundles
+-- PubMedClient -------- NCBI E-utilities, rate-limited (3/s, 10/s w/ key)
+-- deidentify() -------- HIPAA Safe Harbor regex redactionQuick start
pip install clinical-mcpClaude Desktop / Claude Code-Konfiguration (mcpServers-Eintrag):
{
"clinical": {
"command": "clinical-mcp",
"env": { "CLINICAL_MCP_DATA_DIR": "/path/to/fhir/bundles" }
}
}Aus dem Quellcode:
git clone https://github.com/sarathi-aiml/clinical-mcp
cd clinical-mcp
pip install -e ".[dev]"
clinical-mcp # stdio, serves the bundled 10-patient sample
pytest # 33 tests, no network neededDann fragen Sie Claude zum Beispiel:
"Finden Sie Patientinnen über 50 mit Bluthochdruck, fassen Sie die erste zusammen und rufen Sie die drei aktuellsten PubMed-Artikel ab, die für ihre Medikamentenliste relevant sind."
Tools
Tool | Was es tut |
| Filtere die Liste nach Name, Geschlecht, Altersbereich oder diagnostizierter Erkrankung |
| Demografische Daten + Erkrankungen, Medikamente, Allergien, Impfungen |
| Laborwerte und Vitalzeichen, filterbar nach FHIR-Kategorie, Name und Datum |
| PubMed-Suche über NCBI E-utilities (unterstützt Feld-Tags wie |
| Vollständiges Abstract für eine PMID, Abschnittsbeschriftungen bleiben erhalten |
| Safe-Harbor-Schwärzung: Namen, Daten, SSN/MRN, Telefon, E-Mail, PLZ, Alter > 89 |
Ressourcen stellen dieselben Daten adressierbar bereit (fhir://patients/{id}), sodass Clients einen vollständigen Patientendatensatz als Kontext anhängen können, ohne einen Tool-Roundtrip. Prompts kodieren die beiden Arbeitsabläufe, die ich am häufigsten verwende – Zusammenfassung der Patientenakte und patientenbasierte Literaturrecherche – als wiederverwendbare Vorlagen.
HTTP transport with auth
CLINICAL_MCP_API_KEY=$(openssl rand -hex 32) clinical-mcp --transport http --port 8000Jede Anfrage muss Authorization: Bearer <key> enthalten; der Server weigert sich, ohne Authentifizierung über HTTP zu starten. stdio (die Standardeinstellung) benötigt keinen Schlüssel – der Transport ist die Vertrauensgrenze.
Data
Das Repository enthält 10 beschnittene synthetische Patienten unter data/sample/. Für einen größeren Korpus:
python scripts/fetch_data.py --out data/full # ~1,100 patients
CLINICAL_MCP_DATA_DIR=data/full clinical-mcp--trim reduziert Bundles auf die Ressourcentypen, die der Server tatsächlich liest (Patient, Condition, MedicationRequest, Observation, AllergyIntolerance, Encounter, Immunization, Procedure, DiagnosticReport, CarePlan) und begrenzt Typen mit hohem Volumen.
De-identification: scope and limits
deidentify_text ist ein regex-basiertes Safe-Harbor-Screening: Es erfasst die Identifikatorformate, die in strukturiertem klinischem Text vorkommen, und schwärzt zusätzlich jeden Patientennamen, der im Store geladen ist. Es ist keine zertifizierte De-Identifizierungs-Pipeline – Freitextnamen ohne Anrede, Tippfehler und Identifikatoren in seltenen Kontexten werden durchkommen. Für echte PHI benötigen Sie einen trainierten NER-Durchlauf (z. B. Philter oder einen LLM-Durchlauf mit menschlicher Überprüfung) als zusätzliche Ebene; dieses Tool ist der deterministische erste Filter, und seine Zählungen pro Kategorie machen Audits kostengünstig.
What breaks at 500K documents a week
Der In-Memory-Speicher. Alles wird beim Start in den RAM geladen; ~10.000 Patienten sind komfortabel, ~100.000 nicht, und die Startzeit wächst linear. Erste Lösung: SQLite/DuckDB mit Indizes auf Name, Geburtsdatum und Diagnosecodes hinter derselben
FhirStore-Schnittstelle. Echte Lösung: Den Speicher auf einen echten FHIR-Endpunkt (HAPI oder eine Cloud-FHIR-API) ausrichten und die Tools zu dünnen Übersetzungsschichten über FHIR-Suchparameter machen.Ein Patient pro Bundle. Der Loader geht von Syntheas Layout aus. Gemischte Bundles benötigen Referenzauflösung (
subject.reference) anstelle von Datei-Gruppierung.PubMed-Ratenlimits. 3 Anfragen/s (10 mit Schlüssel) sind interaktiv in Ordnung und in Stapelverarbeitung nutzlos. Bei hohem Volumen benötigen Sie einen lokalen Cache mit Abfrage-Hash und TTL sowie Batch-efetch (bis zu 200 PMIDs pro Anfrage) anstelle von Einzelartikel-Aufrufen.
Regex-De-Identifizierungs-Recall. Bei 500.000 Dokumenten pro Woche leckt selbst ein Recall von 99 % Tausende von Identifikatoren. Die Zählausgabe ist genau für diese Messung konzipiert: Stichprobe, Audit und Gate auf gemessenem Recall – dann ein NER-Modell in die Pipeline aufnehmen.
Einzelprozess-HTTP. Streambares HTTP unter uvicorn auf einem Prozess bedient ein Team, keine Flotte. Horizontale Skalierung erfordert zustandslose Sitzungen (der Speicher ist schreibgeschützt, daher ist dies größtenteils kostenlos) hinter einem Lastenausgleich und Ratenbegrenzung pro Client am Gateway.
Development
pip install -e ".[dev]"
pytest # protocol-level + unit tests, PubMed mocked
ruff check .Docker:
docker build -t clinical-mcp .
docker run --rm -i clinical-mcp # stdio
docker run --rm -p 8000:8000 -e CLINICAL_MCP_API_KEY=secret \
clinical-mcp --transport http --host 0.0.0.0License
MIT
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 Hub: AI service discovery, per-user OAuth, and multi-service workflow orchestration
Hosted MCP server exposing US hospital procedure cost data to AI assistants
Auditable MCP server for PubMed, Europe PMC, ClinicalTrials.gov, and bioRxiv/medRxiv queries
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/sarathi-aiml/clinical-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server