
FHIR
STDIOMCP server for FHIR healthcare data management with CRUD operations and AI-powered document processing
MCP server for FHIR healthcare data management with CRUD operations and AI-powered document processing
FHIR MCP Server implements a complete Model Context Protocol (MCP) server, designed to facilitate seamless interaction between LLM-based agents and a FHIR-compliant backend. It provides a standardized interface that enables full CRUD operations on FHIR resources through a comprehensive suite of tools - accessible from MCP-compatible clients such as Claude Desktop, allowing users to query and manipulate clinical data using natural-language prompts.
.env
-based configuration optionsThe server is built with a modular architecture:
This demo shows how Claude uses the fhir-mcp-server
to communicate with a FHIR server (in this case Medplum) to answer questions. You will see, among other things:
request_patient_resource
tool which retrieves basic patient informationrequest_condition_resource
tool to answer the question whether any of the previously diagnosed diseases may cause symptoms that the patient is currently complaining aboutrequest_medication_resource
, request_encounter_resource
, request_generic_resource
tools to answer the question whether the patient has already received any treatment for hypertensionYou can observe how Claude automatically selects the tools worth using to answer the question based on the user's query.
https://github.com/user-attachments/assets/3a3a8ed3-f881-447d-af03-5f24432a2cdd
Here you can observe how Claude first uses the tool searching for LOINC codes for the lipid panel specific codes, but not finding any related observations in FHIR server, it repeats the search for individual biomarkers that make up such a panel.
https://github.com/user-attachments/assets/2fb39801-d5d6-4461-bedd-9f58ab4d52ec
Developers working with FHIR often need to generate specific test data to validate FHIR server functionality, such as search capabilities and data relationships. While you can use Synthea to generate synthetic data and then manually import the resulting bundles to your server, fhir-mcp-server streamlines this process by allowing you to generate and deploy test data directly through Claude.
This eliminates the typical workflow of running synthea separately, downloading bundles, and manually importing them to your FHIR server. Instead, you can create targeted test scenarios, generate appropriate synthetic data, and populate your server all within Claude's interface.
https://github.com/user-attachments/assets/d87da1d8-6401-4a9e-a6f0-50ba23396e12
Note: fhir-mcp-server was not designed with this use case in mind, so as you'll see in the demo, it doesn't work perfectly - what can be observed, however, is how well the LLM handles using trial and error to correct any wrong choices.
Follow these steps to set up FHIR MCP Server in your environment.
Docker (recommended) or uv: For dependency management
FHIR Server Account: Access to FHIR API (e.g. Medplum)
Pinecone API key (required for document search): Enables vector-based search over processed documents. Without it, semantic retrieval features will be unavailable.
LOINC Account (optional): Enables retrieval of the latest LOINC codes from the official API. Without it, the system relies on static or language model-inferred codes, which may be outdated or imprecise.
Clone the repository:
git clone https://github.com/the-momentum/fhir-mcp-server cd fhir-mcp-server
Set up environment variables:
cp config/.env.example config/.env
Edit the config/.env
file with your credentials and configuration. See Environment Variables
Install Dependencies
For Docker-based execution run:
make build
For uv-based execution run:
make uv
Update the MCP Client configuration
e.g. Claude Desktop -> edit claude_desktop_config.json
Docker
{ "mcpServers": { "docker-mcp-server": { "command": "docker", "args": [ "run", "-i", "--rm", "--init", "--name", "fhir-mcp-server", "--mount", // optional - volume for reload "type=bind,source=<your-project-path>/app,target=/root_project/app", // optional - volume for reload "--mount", "type=bind,source=<your-project-path>/config/.env,target=/root_project/config/.env", "-e", "TRANSPORT_MODE=stdio", // Set transport mode: stdio, http, or https "mcp-server:latest" ] } } }
Make sure to replace <your-project-path>
with the actual path to your installation
uv
Firstly, get uv path from terminal:
Windows:
(Get-Command uv).Path
MacOS/Linux:
which uv
Then, update config file:
{ "mcpServers": { "uv-mcp-server": { "command": "uv", "args": [ "run", "--frozen", "--directory", "<your-project-path>", "start" ], "env": { "PATH": "<uv-bin-folder-path>" } } } }
Make sure to replace
Restart MCP Client
After completing all of the above steps, restart the MCP Client to apply the changes. In some cases, you may need to terminate all related processes using Task Manager or your system's process manager. This ensures that:
The FHIR MCP Server includes built-in encryption infrastructure to protect sensitive configuration values. Sensitive fields like API keys and passwords are automatically encrypted and decrypted at runtime.
You are allowed to store passwords as a plain text, but if you want to have them encrypted, follow the instruction below.
For most users, use the automated setup script:
# uv method uv run scripts/cryptography/setup_encryption.py # docker method docker exec fhir-mcp-server uv run scripts/cryptography/setup_encryption.py
This script will:
MASTER_KEY
in config/.env
and generate one if neededLOINC_PASSWORD
, FHIR_SERVER_CLIENT_SECRET
, PINECONE_API_KEY
).env
file with encrypted valuesGenerate a Master Key:
# uv method uv run scripts/cryptography/generate_master_key.py # docker method docker exec fhir-mcp-server uv run scripts/cryptography/generate_master_key.py
Put that key as a MASTER_KEY environment variable in .env.
Encrypt Sensitive Values:
# uv method uv run scripts/cryptography/encrypt_setting.py "your_secret_value" # docker method docker exec fhir-mcp-server uv run scripts/cryptography/encrypt_setting.py "your_secret_value"
Decrypt Values (for verification):
# uv method uv run scripts/cryptography/decrypt_setting.py "encrypted_value" # docker method docker exec fhir-mcp-server uv run scripts/cryptography/decrypt_setting.py "encrypted_value"
The following fields are automatically encrypted when using EncryptedField
:
FHIR_SERVER_CLIENT_SECRET
- OAuth2 client secret for FHIR serverLOINC_PASSWORD
- LOINC account passwordPINECONE_API_KEY
- Pinecone API key for vector searchVariable | Description | Example Value | Encryption |
---|---|---|---|
MASTER_KEY | Master encryption key | gAAAAABl... | Required |
FHIR_SERVER_HOST | FHIR API host URL | https://api.medplum.com | No |
FHIR_BASE_URL | FHIR base path | /fhir/R4 | No |
FHIR_SERVER_CLIENT_ID | OAuth2 client ID for FHIR | 019720e7... | No |
FHIR_SERVER_CLIENT_SECRET | OAuth2 client secret for FHIR | gAAAAABl... | Yes |
LOINC_ENDPOINT | LOINC API search endpoint | https://loinc.regenstrief.org/searchapi/loincs | No |
LOINC_USERNAME | LOINC account username | loinc-user | No |
LOINC_PASSWORD | LOINC account password | gAAAAABl... | Yes |
PINECONE_API_KEY | Pinecone API key | gAAAAABl... | Yes |
EMBEDDING_MODEL | Hugging Face embedding model name | NeuML/pubmedbert-base-embeddings | No |
The FHIR MCP Server provides a comprehensive set of tools for interacting with FHIR resources and document management:
Tool | Resource Type | Description |
---|---|---|
request_patient_resource | Patient | Manage patient demographic and administrative information |
request_observation_resource | Observation | Handle clinical measurements and assessments |
request_condition_resource | Condition | Manage patient problems and diagnoses |
request_medication_resource | Medication | Handle medication information and orders |
request_immunization_resource | Immunization | Manage vaccination records |
request_encounter_resource | Encounter | Handle patient visits and interactions |
request_allergy_intolerance_resource | AllergyIntolerance | Manage patient allergy information |
request_family_member_history_resource | FamilyMemberHistory | Handle family health history |
request_generic_resource | Any FHIR Resource | Operate on any FHIR resource not covered by specific tools |
Tool | Description |
---|---|
request_document_reference_resource | Manage FHIR DocumentReference resources |
add_document_to_pinecone | Ingests documents into the vector database for semantic search |
search_pinecone | Performs semantic search across indexed documents using vector embeddings |
Tool | Description |
---|---|
get_loinc_codes | Retrieves standardized LOINC codes for medical observations and laboratory tests |
We're continuously enhancing FHIR MCP Server with new capabilities. Here's what's on the horizon:
Have a suggestion? We'd love to hear from you! Contact us or contribute directly.
Distributed under the MIT License. See MIT License for more information.
Built with ❤️ by Momentum • Transforming healthcare data management with AI