Comparison
FHIR MCP servers compared
Open-source MCP servers whose public docs describe access to a FHIR API. Last EHR is one row in this table.
A FHIR MCP server exposes tools an MCP client, such as Claude or Cursor, can call against a FHIR backend. The columns are the language, the backends the project documents, what those docs say it can read, whether it can write, whether a person must approve each write, the license, and the latest commit on the default branch.
Checked on . Rows are alphabetical. This is not a ranking, and it is not a clinical, safety, or compliance claim. Last commit is the committer date of the default-branch HEAD from the GitHub API. A package version, when shown, is the npm or PyPI version returned the same day. Those are different facts. "Not described" means the linked README does not describe that behavior.
| Name | Language | FHIR backends | Read coverage | Write support | Writes require human approval | License | Last commit |
|---|---|---|---|---|---|---|---|
| Azure AHDS FHIR MCP Serverazure-fhir-mcp-server 1.2.0 | Python | Azure Health Data Services FHIR. The README sets fhirUrl with Azure AD client credentials, or an OAuth on-behalf-of HTTP mode. | search_fhir, MCP resources such as fhir://Patient/{id}, and get_user_info when OAuth is on. | No write tool is listed in the README tools section. | Not applicable. No write tool is listed. | MIT | |
| Epic FHIR MCP Server | Python | Epic FHIR R4. The README walks through a non-production Epic sandbox app with backend-services JWT auth. | Patient search and read, plus per-patient Condition, MedicationRequest, Observation, AllergyIntolerance, Immunization, and Procedure reads. | No write tool is listed. | Not applicable. No write tool is listed. | Apache-2.0. The README badge says MIT; the GitHub license API reports Apache-2.0. | |
| fhir-dsl MCP@fhir-dsl/mcp 1.2.2 | TypeScript | One configured FHIR base URL. Auth can be a bearer token, SMART backend services, or a patient-launch refresh token. Resource types are a configured list. | read, vread, search, history, capabilities, and operation. Read-only until writes are turned on. | Opt-in create, update, patch, and delete. | Optional, and it is not a separate approval screen. With confirmWrites, a write is rejected unless the tool call includes confirm: true. dryRun is a separate optional guard. | MIT | |
| fhir-mcpfhir-mcp 0.2.2 | Python | In-memory synthetic patients by default. The README also describes FHIR_MCP_BACKEND=hapi and other FHIR R4 servers. | search_patients, get_patient_summary, search_observations, search_conditions, get_medications, validate_code, and run_cds_hook. These are focused tools, not a generic resource browser. | create_clinical_note creates a DocumentReference. | Not described in the README. | Apache-2.0 | |
| FHIR-MCP | TypeScript | A FHIR base URL. The README example is the public HAPI R4 endpoint, plus a terminology base URL. | fhir.read, fhir.search, and fhir.capabilities, plus terminology lookup, expand, and translate. | fhir.create and fhir.update. | Not described in the README. | MIT | |
| fhirHydrantfhirhydrant 0.17.3 | TypeScript | FHIR R4+ using SMART Backend Services (signed JWT). Resources and operations come from config and the server CapabilityStatement. | Search, read, vread, and history. Terminology lookup and named operations are optional. | Create, update, patch, and delete only when FHIR_WRITE_CAPABILITIES lists them. FHIR_WRITE_DRY_RUN can validate a write without sending it. | Not described as required. | Kopimi | |
| healsens-fhirmcp | Go | One configured FHIR R4 or R5 base URL, with a bearer token when the server requires one. | fhir_read, fhir_search, capability and structure lookups, and operations the README limits to read-only. | None. The README says the tool surface is read-only by design. | Not applicable. There are no write tools. | AGPL-3.0 | |
| health-record-mcp (archived) | TypeScript | SMART on FHIR. Tool calls query a record already saved in a local SQLite file. The README includes Epic sandbox brand configuration. GitHub marks the repository archived. | grep_record, query_record (SQL SELECT), and eval_record (JavaScript over the fetched record). | No write tool is listed. | Not applicable. No write tool is listed. | MIT | |
| LangCare MCP FHIR@langcare/langcare-mcp-fhir 2.5.0 | Go | Any FHIR R4 server. The README names Epic, Cerner, OpenEMR, and Google Cloud Healthcare API. | fhir_read and fhir_search for any R4 resource type. | fhir_create and fhir_update. | Not described as a server requirement. | MIT | |
| Last EHR@lastehr/mcp 0.5.2This site's MCP server | TypeScript | Medplum. This repository's local HAPI stack when FHIR_BACKEND=hapi. The public Epic sandbox, the public Oracle Health sandbox, and a generic SMART Backend Services server when LASTEHR_EXPERIMENTAL_FHIR_ADAPTERS=1 and LASTEHR_BACKEND is epic, oracle, or smart. | Four read tools. The section reader covers 23 patient-scoped sections: 25 of 27 US Core 9.0.0 resource types, plus Communication, Task, and AuditEvent. Medication and PractitionerRole are not sections. | Off by default. LASTEHR_MCP_WRITES=proposal adds creates for a note (Communication), a measurement or linked correction (Observation), and a follow-up task (Task). No update or delete tools. | Yes. Each write waits for an explicit human decision in a client that supports MCP elicitation. Clients that cannot show that prompt are not offered the write tools. | Apache-2.0 | |
| Medplum MCP | TypeScript | Medplum, using MEDPLUM_BASE_URL and a client id and secret. The README example is a local Medplum server. | Get and search tools for Patient, Practitioner, Organization, Encounter, Observation, MedicationRequest, Medication, and EpisodeOfCare, plus generalFhirSearch. | Create and update tools for those types. The README lists create and search for Medication, and does not list an update tool for Medication. | Not described in the README. | MIT | |
| Momentum FHIR MCP Server | Python | A FHIR server with OAuth2 client credentials. The README demo uses Medplum. LOINC and Pinecone are separate optional services. | Named tools for Patient, Observation, Condition, Medication, Immunization, Encounter, AllergyIntolerance, FamilyMemberHistory, and DocumentReference, plus request_generic_resource for other types. | The README says each FHIR resource tool supports create, read, update, and delete. | Not described in the README. | MIT | |
| PyMedplumpymedplum 0.6.0 | Python | Medplum, hosted or self-hosted, via MEDPLUM_CLIENT_ID and MEDPLUM_CLIENT_SECRET. The MCP entry point is pymedplum-mcp. | read, search, patient $everything, schema lookup, and terminology helpers. Write tools exist and stay blocked until writes are enabled. | create, update, patch, delete, conditional create, and other mutation tools when MEDPLUM_ENABLE_WRITES=true. | Not described as a required prompt. The MCP guide says review of tool calls belongs to the calling agent. | Apache-2.0 | |
| WSO2 FHIR MCP Serverfhir-mcp-server 0.11.0 | Python | Any FHIR base URL set as FHIR_SERVER_BASE_URL. The README demos use HAPI and the Epic sandbox. Auth is SMART-on-FHIR client credentials, a static access token for local stdio, or authorization disabled. | get_capabilities, search, and read, for a resource type the caller names. | create, update, and delete tools. | Not described in the README. | Apache-2.0 |
Sources
Each link below was requested on 2026-11-11. The table uses the README or guide at that URL, plus the GitHub repository API for license metadata and the default-branch commit date. Package links were checked against the public npm registry or the PyPI JSON API.
Azure AHDS FHIR MCP Server
Epic FHIR MCP Server
fhir-dsl MCP
fhir-mcp
FHIR-MCP
fhirHydrant
healsens-fhirmcp
health-record-mcp (archived)
LangCare MCP FHIR
Last EHR
Medplum MCP
Momentum FHIR MCP Server
PyMedplum
WSO2 FHIR MCP Server
Connect an agent
Questions about pointing Claude or Cursor at a FHIR server, Epic sandbox writes, human approval, and synthetic data are on the homepage FAQ. The Last EHR MCP guide is at /docs/mcp.