A production-grade FHIR bridge written in Go that connects Claude to EMR systems like Epic, Cerner, and OpenEMR through four generic operations: read, search, create, and update. Works with any FHIR R4 resource type, so you can query patients, observations, medications, and everything else without custom tooling per resource. Ships with OAuth2 and SMART on FHIR backend authentication, PHI scrubbing in logs, and a library of 40+ clinical workflow guides. Also includes MCP Apps that render interactive React UIs directly in Claude Desktop for things like patient dashboards and lab results, bypassing chat-based output. Useful when you need HIPAA-compliant AI workflows against real EMR data without building FHIR clients from scratch.
Enterprise-grade MCP Server for FHIR-based EMRs. Fully written in Go with enterprise-grade security and 4 generic FHIR operations that work with any FHIR R4 resource type. Supports EPIC, Cerner, OpenEMR, GCP Healthcare API, and any generic FHIR R4 server.
Ships with a 40+ Clinical Skills Library — agent-agnostic workflow guides covering medication management, lab interpretation, clinical decision support, documentation, population health, and more. Extend with ✨ New: Claude Managed Agents (9 production-ready clinical AI agents on the Anthropic Managed Agents API), MCP Apps (interactive clinical UIs inside Claude Desktop), a Healthcare Voice Agent (real-time voice AI over FHIR), and a LangCare CLI for agent frameworks that don't speak MCP natively.
Install via npm:
npm install -g @langcare/langcare-mcp-fhir
Or use directly without installation:
npx @langcare/langcare-mcp-fhir -config /path/to/config.yaml
LangCare MCP FHIR connects Claude to your FHIR-based EMR system. You need a YAML configuration file pointing to your backend.
Choose your backend:
Add to your Claude Desktop config file (~/.config/Claude/claude_desktop_config.json):
{
"mcpServers": {
"langcare-mcp-fhir": {
"command": "langcare-mcp-fhir",
"args": ["-config", "/path/to/your/config.yaml"]
}
}
}
On macOS, the config is typically at:
~/Library/Application\ Support/Claude/claude_desktop_config.json
Close and reopen Claude Desktop. The FHIR tools will now be available.
Need detailed setup help? See the Local Testing Guide.
This MCP server acts as an intelligent proxy between AI agents and FHIR R4 servers. It exposes 4 generic FHIR operations through the Model Context Protocol (MCP), enabling AI-powered workflows for any FHIR resource type.
Key Design:
github.com/modelcontextprotocol/go-sdk (Anthropic/Google maintained)All tools work with any FHIR resource type (Patient, Observation, Medication, etc.):
Read a FHIR resource by type and ID.
{
"resourceType": "Patient",
"id": "example-123"
}
Search FHIR resources with query parameters.
{
"resourceType": "Patient",
"queryParams": "name=John&birthdate=gt1990-01-01"
}
Create a new FHIR resource.
{
"resourceType": "Observation",
"resource": {
"resourceType": "Observation",
"status": "final",
"code": { ... },
"subject": { "reference": "Patient/123" }
}
}
Update an existing FHIR resource.
{
"resourceType": "Patient",
"id": "example-123",
"resource": {
"resourceType": "Patient",
"id": "example-123",
"name": [{ "family": "Smith" }]
}
}
LangCare MCP FHIR implements a two-layer security model for HIPAA-compliant healthcare data access:
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Claude │ Auth1 │ MCP Server │ Auth2 │ FHIR API │
│ Client │────────▶│ (Go) │────────▶│ (EMR) │
└─────────────┘ └──────────────┘ └─────────────┘
Auth1: MCP Client Authentication (Bearer Token/API Key)
Auth2: FHIR Backend Authentication (Bearer/OAuth2/SMART on FHIR)
private_key_jwt (RS384) for EPIC, OpenEMR, and other SMART-conformant EMRsFor complete security documentation, see Security Guide:
LangCare MCP FHIR ships with built-in MCP Apps — interactive, rich UI views that run directly inside MCP-capable hosts like Claude Desktop. Unlike traditional chat-based tool output, MCP Apps render full React-based interfaces with charts, tables, and interactive controls while using the same underlying FHIR tools.
How it works: Each app is a single-file HTML bundle (React + TypeScript, compiled with Vite) that gets embedded into the Go binary at compile time via go:embed. At runtime the MCP server registers each app as both an MCP Resource (text/html;profile=mcp-app) and a dedicated MCP Tool linked via _meta.ui.resourceUri. When an MCP host calls the tool, it fetches the resource and renders the UI. The app calls back into the server's generic FHIR tools (fhir_search, fhir_read, etc.) through app.callServerTool() — no LLM round-trips for data fetching.
Advantages over plain tool output:
| App | Tool | Description |
|---|---|---|
| FHIR Explorer | fhir_explorer | Interactive FHIR resource browser. Search, read, create, and update any FHIR R4 resource type with JSON detail views. |
| Patient Chart Review | patient_chart_review | Clinical dashboard with patient demographics, active conditions, medications, vitals, labs, and vitals trend charts (BP + weight over time). |
Both apps are reference implementations demonstrating the MCP Apps pattern. See apps/README.md for architecture details and how to build new apps.
Patient Chart Review running inside Claude Desktop
AI agents use LangCare MCP FHIR Server to help healthcare professionals access and manage patient health records through 4 FHIR tools. The server handles EMR authentication, allowing agents to focus on clinical workflows while maintaining strict privacy and accuracy standards.
Agent capabilities:
Common workflows:
System support:
📖 Complete guide: Agent Prompt Guide - System prompt, tool examples, workflows, and error handling
40+ agent-agnostic clinical workflow guides that teach AI agents how to perform complex healthcare tasks using the MCP server's 4 FHIR tools (fhir_search, fhir_read, fhir_create, fhir_update).
SKILL.md to your agent's system prompt or custom instructions| Category | Skills | Examples |
|---|---|---|
| Patient Data & Summary | 5 | Demographics, clinical summary (CCD-style), problem list audit, allergy review, insurance coverage |
| Medication Management | 5 | Med reconciliation, drug interactions (CYP450), adherence (MPR/PDC), Beers Criteria, opioid risk (ORT/MME) |
| Lab & Diagnostics | 5 | Lab interpretation, critical values (CAP/CLIA), pre-op labs, diabetes panel (ADA), renal function (KDIGO) |
| Clinical Decision Support | 5 | Sepsis (qSOFA/SOFA), cardiovascular risk (ASCVD/HEART), VTE (Wells/Caprini), fall risk (Morse), pneumonia (CURB-65) |
| Care Coordination | 5 | Discharge planning (LACE), referrals, care gaps (USPSTF), transitions of care (I-PASS), follow-up tasks |
| Documentation | 5 | SOAP notes, H&P, progress notes, discharge summaries, procedure notes |
| Population Health | 5 | Panel overview, quality measures (HEDIS), chronic disease registries, immunization status (CDC), preventive care compliance |
| Specialty | 5 | Prenatal (ACOG), pediatric growth (WHO/CDC), mental health (PHQ-9/GAD-7), oncology (TNM/RECIST), chronic pain |
Full catalog with links: skills/README.md
SKILL.md content into your AI agent's system prompt or custom instructionsreferences/ subdirectory contain detailed clinical knowledge (scoring criteria, code tables, thresholds) that can optionally be included for deeper clinical accuracy# Example: Add medication-reconciliation skill to your agent
skills/core/medication-management/medication-reconciliation/
├── SKILL.md # Copy this into agent instructions
└── references/
├── reconciliation-process.md # Joint Commission standards
└── high-risk-medications.md # ISMP high-alert drug list
Integration guides: Claude | ChatGPT | Gemini
Community contributions welcome - see CONTRIBUTING.md for guidelines.
make build
make run
# or
./bin/langcare-mcp-fhir -config configs/config.local.yaml
make run-http
# or
./bin/langcare-mcp-fhir -http -port 8080 -config configs/config.yaml
Starts the server with Streamable HTTP transport on /mcp and health check on /health.
make test
make lint
Deploy as a remote MCP server with Streamable HTTP transport, accessible by any MCP-compatible AI agent from anywhere.
# Install Fly CLI
brew install flyctl
fly auth login
# Create app
fly apps create --name langcare-mcp-dev
# Set CONFIG_FILE in fly/fly.dev.toml [env] block for your provider (EPIC or GCP)
# Then set secrets (EPIC example):
fly secrets set \
EPIC_BASE_URL="https://fhir.epic.com/interconnect-fhir-oauth/api/FHIR/R4" \
EPIC_CLIENT_ID="your-client-id" \
EPIC_TOKEN_URL="https://fhir.epic.com/interconnect-fhir-oauth/oauth2/token" \
EPIC_PRIVATE_KEY_B64="$(base64 < keys/epic/private-key.pem)" \
MCP_AUTH_TOKENS="your-token" \
--app langcare-mcp-dev
# Deploy
fly deploy -c fly/fly.dev.toml --app langcare-mcp-dev
# Verify
curl https://langcare-mcp-dev.fly.dev/health
Connect any MCP client to:
URL: https://langcare-mcp-dev.fly.dev/mcp
Auth: Authorization: Bearer your-token
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"langcare-fhir": {
"url": "https://langcare-mcp-dev.fly.dev/mcp",
"headers": {
"Authorization": "Bearer your-token"
}
}
}
}
Supports EPIC and GCP Healthcare API providers. See fly/README.md for provider setup, secrets, and full deployment guide.
For step-by-step instructions on setting up EPIC credentials and testing locally:
This guide covers:
Quick credential test:
# Test your EPIC credentials before running the server
go run test/test_epic_token.go "your-client-id" "/path/to/private-key.pem"
langcare-mcp-fhir/
├── cmd/
│ └── server/
│ └── main.go # Entry point
├── internal/
│ ├── apps/ # MCP Apps (embedded UIs)
│ │ ├── embed.go # go:embed directive for HTML bundles
│ │ ├── registry.go # App metadata, tool names, resource URIs
│ │ └── dist/ # Built HTML bundles (copied by build)
│ │ ├── fhir-explorer.html # FHIR Explorer single-file bundle
│ │ └── patient-chart-review.html # Patient Chart Review single-file bundle
│ ├── audit/
│ │ └── logger.go # HIPAA audit logging
│ ├── config/
│ │ └── config.go # YAML configuration loading
│ ├── fhir/
│ │ ├── client.go # FHIR HTTP client interface
│ │ ├── types.go # FHIR client types
│ │ └── providers/ # Backend implementations
│ │ ├── base.go # Base HTTP provider
│ │ ├── epic.go # EPIC OAuth2 provider
│ │ ├── cerner.go # Cerner OAuth2 provider
│ │ ├── openemr.go # OpenEMR SMART Backend Services provider
│ │ └── gcp.go # GCP Healthcare API provider
│ ├── mcp/
│ │ └── server.go # MCP server + app registration
│ ├── middleware/
│ │ ├── auth.go # MCP authentication
│ │ └── rate_limit.go # Rate limiting
│ ├── tools/ # MCP tool implementations
│ │ ├── registry.go # Tool registry
│ │ ├── fhir_read.go # Read FHIR resource
│ │ ├── fhir_search.go # Search FHIR resources
│ │ ├── fhir_create.go # Create FHIR resource
│ │ └── fhir_update.go # Update FHIR resource
│ └── transport/
│ ├── stdio.go # stdio transport (Claude Desktop)
│ └── http.go # Streamable HTTP transport (production)
├── apps/ # MCP App source code (React + TypeScript)
│ ├── README.md # App development guide
│ ├── package.json # Shared dependencies (React 19, MCP Apps SDK)
│ ├── vite.config.ts # Vite build config (single-file output)
│ ├── tsconfig.json # TypeScript config
│ ├── fhir-explorer/ # FHIR Explorer app
│ │ ├── index.html
│ │ └── src/
│ │ ├── app.tsx
│ │ └── global.css
│ └── patient-chart-review/ # Patient Chart Review app
│ ├── index.html
│ └── src/
│ ├── app.tsx
│ └── global.css
├── scripts/
│ ├── build-apps.sh # Build all apps → internal/apps/dist/
│ ├── create_jwks.sh # Generate JWKS from public key (EPIC)
│ └── create_jwks_openemr.sh # Generate JWKS from public key (OpenEMR)
├── pkg/
│ └── types/
│ └── errors.go # Custom error types
├── configs/
│ ├── config.epic.example.yaml # Example configuration for EPIC
│ ├── config.cerner.example.yaml # Example configuration for Cerner
│ ├── config.openemr.example.yaml # Example configuration for OpenEMR
│ ├── config.gcp.example.yaml # Example configuration for GCP
│ └── config.base.example.yaml # Example configuration for any FHIR R4 server
├── docs/
│ ├── AGENT_PROMPT.md # AI agent system prompt
│ ├── EPIC-APP-SECURITY.md # EPIC authentication setup
│ ├── OPENEMR-APP-SECURITY.md # OpenEMR SMART Backend Services setup
│ ├── EPIC-SCOPES.md # OAuth2 scopes reference
│ ├── LOCAL-TESTING.md # Local development guide
│ └── SECURITY.md # Production security guide
├── test/
│ ├── README.md # Test documentation
│ └── test_epic_token.go # EPIC OAuth2 token tester
├── fly/
│ ├── Dockerfile # Multi-stage Go build for Fly.io
│ ├── docker-entrypoint.sh # Key materialization + server startup
│ ├── fly.dev.toml # Fly.io dev deployment config
│ ├── config.fly.epic.yaml # Fly.io EPIC provider config
│ ├── config.fly.gcp.yaml # Fly.io GCP provider config
│ └── README.md # Fly.io deployment guide
├── bin/ # Build output (gitignored)
│ └── langcare-mcp-fhir # Compiled binary
├── go.mod # Go module definition
├── go.sum # Go module checksums
├── Makefile # Build commands
└── README.md # This file
Note: The following are gitignored and not committed:
keys/ - Private keys and credentialsconfig.local.*.yaml - Local configuration filesbin/ - Compiled binaries.env - Environment variablesapps/node_modules/, apps/dist/, apps/dist-tmp/ - App build artifactsReal-time voice AI that lets patients ask about their health records and get spoken answers pulled directly from their EMR.
The stack: PipeCat (open-source, Daily.co) for the voice pipeline — STT, LLM orchestration, TTS with sub-3-second latency. Claude for clinical reasoning and tool calling. LangCare MCP FHIR Server (open-source, Go) as a stateless proxy to any FHIR R4 EMR — Epic, Cerner, GCP Healthcare API.
MCP is the glue. PipeCat's native MCP client auto-discovers FHIR tools at startup. Patient asks "What medications am I on?" — Claude calls fhir_search — PipeCat routes it to the MCP server — data comes back — Claude responds in natural speech. No manual tool schemas needed.
Three-layer HIPAA auth: Caller identity verified before the session starts, bearer token to MCP, OAuth2/SMART on FHIR to EMR. Zero PHI storage.
Everything is swappable. Replace Claude with Gemini, DeepGram with Google STT, Daily with WebSocket. The MCP FHIR layer and clinical prompts stay the same.
Full documentation and setup guide
Command-line interface that wraps the 4 FHIR MCP tools (fhir_search, fhir_read, fhir_create, fhir_update) as CLI subcommands over HTTP. Built for AI agent frameworks that don't speak MCP natively — LangChain, smolagents, CrewAI, AutoGen, and any framework that can call a subprocess. The CLI handles the MCP session handshake internally, so agents get clean JSON on stdout with no protocol knowledge required.
# Install
pip install "langcare-cli @ git+https://github.com/langcare/langcare-mcp-fhir.git#subdirectory=cli"
# Use
langcare fhir search Patient --query "name=John"
langcare fhir read Patient 123
langcare fhir create Observation --data @obs.json
langcare fhir update Patient 123 --data @patient.json
The 40+ clinical skills in the Skills Library work as-is — skills reference abstract tool names, not transport. Register the CLI as subprocess tools in your agent framework and skills run without modification.
Full documentation and setup guide
private_key_jwt/RS384) setup, JWKS generation, and OpenEMR API client registrationgithub.com/modelcontextprotocol/go-sdk - Official MCP SDKgopkg.in/yaml.v3 - Configuration parsinggolang.org/x/oauth2 - OAuth2 client librarygithub.com/golang-jwt/jwt/v5 - JWT signing and verificationDefault configuration uses HAPI FHIR public test server (https://hapi.fhir.org/baseR4) for immediate testing without setup.
9 production-ready clinical AI agents built on the Anthropic Managed Agents API. Each agent connects to a LangCare MCP FHIR Server and uses a curated set of domain-specific clinical skills drawn from the 40+ Clinical Skills Library. Sessions are persistent, visible at platform.claude.com/workspaces/default/sessions, and can be run interactively or driven by a single prompt.
| Agent | Domain |
|---|---|
| Medication Management | Reconciliation, drug interactions, Beers Criteria, opioid risk, adherence |
| Care Coordination | Discharge planning, referrals, care gaps, transitions of care, follow-up tasks |
| Clinical Decision Support | Sepsis qSOFA, cardiovascular risk, VTE, fall risk, CURB-65 |
| Clinical Triage | Clinical summary, acuity, vitals review, sepsis indicators |
| Documentation | SOAP notes, H&P, progress notes, discharge summaries, procedure notes |
| Lab & Diagnostics | Critical values, diabetes panel, lab interpretation, pre-op labs, renal function |
| Patient Data | Demographics, allergy review, clinical summary, insurance coverage, problem list |
| Population Health | Chronic disease registries, immunization status, preventive care, quality measures |
| Specialty Care | Chronic pain, mental health, oncology, pediatric growth, prenatal |
# 1. Set environment variables
export ANTHROPIC_API_KEY=sk-ant-...
export LANGCARE_MCP_URL=https://langcare-mcp-dev.fly.dev/mcp
export LANGCARE_MCP_TOKEN=your-bearer-token
# 2. Upload skills, create environment + vault, deploy all 9 agents
cd cma/scripts
./setup.sh dev
# 3. Run a session
./run-session.sh <agent-id> <env-id> <vault-id> "Show active medications for patient ID d886a934-5568-42b3-9324-0f0b05fc018c"
setup.sh is idempotent — safe to re-run. At the end it prints the Environment ID and Vault ID needed for sessions.
Full guide: cma/README.md — env vars, all scripts reference, troubleshooting.
We welcome contributions from healthcare professionals, developers, and informaticists!
There are three main ways to contribute:
Skills are agent-agnostic workflow guides that work across Claude, ChatGPT, and Gemini. No coding required - just clinical expertise and FHIR knowledge!
See apps/README.md for the development guide.
Get started: Read CONTRIBUTING.md for detailed guidelines, code standards, and submission process.
Recognition: Contributors are credited in README, release notes, and skill/integration author credits. Outstanding contributors may be invited as maintainers.
Questions? Open a GitHub Discussion or issue!
See LICENSE file.
Built with ❤️ by the LangCare team and contributors.
Improving healthcare through better AI infrastructure.