FHIR MCP Server
io.github.wso2/fhir-mcp-server
About FHIR MCP Server
FHIR MCP Server is an MCP server published by the GitHub account wso2. MCP server providing seamless access to FHIR APIs for AI tools and healthcare applications
It runs on your own machine: your AI client starts it from the PyPI package fhir-mcp-server at version 0.10.0.
It asks for no keys or passwords.
It also needs FHIR_SERVER_BASE_URL set before it starts.
Version 0.10.0 was published on 31 March 2026, and the source code is public, so you can read it before installing.
Written from the registry entry. 7 automated checks on registry metadata: 4 pass, 0 warn, 0 fail, 3 info. How we check.
What it asks for
| Variable | Required | Secret | Description |
|---|---|---|---|
FHIR_SERVER_BASE_URL | Yes | No | Base URL of the FHIR Server (eg: https://hapi.fhir.org/baseR5) |
Checks
| Check | Result | Detail |
|---|---|---|
| Source repository linked | Pass | https://github.com/wso2/fhir-mcp-server |
| Version pinned | Pass | Every package has an explicit version |
| Secrets requested | Info | Asks for no secrets |
| Known package registry | Pass | All packages come from npm, PyPI, OCI, NuGet or MCPB |
| Namespace ownership | Info | Name verified via GitHub account wso2 |
| Registry text aimed at the AI | Pass | Description and settings contain no hidden characters or instructions to the AI |
| Code red flags | Info | Package could not be read (too large) |
Code review: Pass, with notes
We read all 1,741 lines in 8 files of fhir-mcp-server 0.10.0 on 2026-10-31, without running it.
Connects your AI to a FHIR health-records server you configure, so it can search, read, create, update and delete patient records. It sends data only to that FHIR server and its login service. Your OAuth tokens and client secret stay in memory and go nowhere else. Watch out: it can change and permanently delete medical records without a confirmation step. Debug logging writes tokens and patient data to the console, so leave the log level at INFO.
What we found
- Note create, update and delete write to or remove live health records. delete supports conditional deletes by searchParam (may remove several resources) and arbitrary operations such as $expunge (permanent purge). There is no confirmation step and no read-only mode in the server.
fhir_mcp_server/server.py:410-695 - Note At --log-level DEBUG the full token-endpoint response (access, refresh and ID tokens) is logged, and a malformed ID token is logged verbatim. Tool payloads and FHIR results (patient data) are also logged at DEBUG (server.py:466-467, 561-562). The default is INFO, so this only happens if the user turns on DEBUG.
fhir_mcp_server/oauth/common.py:125-127 + oauth/types.py:207-209 - Note With FHIR_SERVER_DISABLE_AUTHORIZATION=true the HTTP endpoint on localhost:8000 has no authentication. Combined with FHIR_SERVER_ACCESS_TOKEN, any local process can read and modify records with that token.
fhir_mcp_server/server.py:58-69,99-105,124-139 - Info Proper OAuth proxy: PKCE S256, random state, and MCP-side tokens are opaque random values mapped to upstream tokens in memory. The upstream token is never returned to the MCP client.
fhir_mcp_server/oauth/server_provider.py:75-116,166-215 - Info Quality bug: refresh exchange sends the RefreshToken object instead of its token string and uses 'scopes' instead of 'scope', so refreshing will likely fail and users must log in again.
fhir_mcp_server/oauth/server_provider.py:254-260 - Info Quality: a malformed debug log call passes results as a format argument; harmless.
fhir_mcp_server/server.py:292
| Talks to | FHIR_SERVER_BASE_URL (the user's FHIR server: /metadata, resource endpoints): FHIR searches, reads, creates, updates and deletes from tool arguments (health records), with the user's bearer token (only when a tool is called) FHIR_SERVER_BASE_URL/.well-known/smart-configuration and the authorization/token endpoints it lists: authorization code, PKCE verifier, FHIR_SERVER_CLIENT_ID and FHIR_SERVER_CLIENT_SECRET, refresh token (during the OAuth login flow and token exchange (when authorization is enabled, the default)) localhost:8000 (listens; FHIR_MCP_HOST/FHIR_MCP_PORT; default transport streamable-http): serves MCP plus OAuth endpoints and /oauth/callback; protected by OAuth unless FHIR_SERVER_DISABLE_AUTHORIZATION=true (the whole time the server runs) |
|---|---|
| Keys and settings | FHIR_SERVER_BASE_URL: target FHIR serverFHIR_SERVER_CLIENT_ID: FHIR authorization server (authorize + token endpoints)FHIR_SERVER_CLIENT_SECRET: FHIR token endpoint only; not loggedFHIR_SERVER_ACCESS_TOKEN: FHIR server as a Bearer token on every request (overrides per-user OAuth tokens)FHIR_SERVER_SCOPES: FHIR authorization serverFHIR_SERVER_DISABLE_AUTHORIZATION: local: turns off MCP authFHIR_MCP_HOST / FHIR_MCP_PORT / FHIR_MCP_SERVER_URL / FHIR_MCP_REQUEST_TIMEOUT: local listener config; server URL is used in the OAuth redirect_uri.env file in the working directory: read by pydantic-settings for all FHIR_* settings |
| Files on your machine | No file system reads or writes besides the optional .env file. OAuth clients, auth codes and tokens are held in memory only and lost on restart. Tool input builds request paths on the configured FHIR server only (type/id/operation), with no way to target another host. |
| Runs programs | None. No subprocess, eval or shell. |
| Telemetry | None. |
| Tools | get_capabilities, search, read, create, update, delete, get_user |
| Tool descriptions | clean. get_capabilities says it 'MUST always be invoked before' other operations. That is workflow guidance pointing to this server's own tool, not hidden or cross-server instructions. |
This covers the package's own code only, not the 9 packages it depends on (mcp, click, fhirpy, aiohttp, httpx, pydantic, pydantic-settings, starlette, typing_extensions). A new version drops this review until we read it again.
Popularity & health: 73 / 100
Worked out from public numbers and our own checks, not from user reviews or ratings. It says how used and how looked-after a server is, not whether it is safe.
59 forks, 38 merged pull requests. Sources: GitHub, npm, PyPI (pypistats.org) and Hacker News (Algolia), fetched 2026-10-31.
What people say
No Hacker News threads link to its source code.
Look further: search Reddit, search Hacker News, read its GitHub issues. These are not reviews we checked.
Facts
| Registry name | io.github.wso2/fhir-mcp-server |
|---|---|
| Publisher | GitHub account wso2 |
| How the name is verified | Name verified via GitHub account wso2. The registry ties the name prefix to that account or domain; it does not check the code. |
| Type | Local: runs on your machine from a package |
| Packages | pypi fhir-mcp-server 0.10.0 (stdio) |
| Version | 0.10.0 |
| Published | |
| Last updated | |
| Source repository | https://github.com/wso2/fhir-mcp-server |
| Website | https://github.com/wso2/fhir-mcp-server |
| Category | Health & science (assigned by keyword rule, not by hand) |
Related servers in Health & science
- mcp3/3Securely access and manage FHIR healthcare data stored in Medplum.
- K01 Synthetic Health Data3/3Privacy-preserving synthetic health data generation. FHIR R4/R5…
- costkits-mcp8/8Free hosted MCP server: US healthcare procedure cost estimates and…
- CareJobs.Now4/4Search 170,000+ open US healthcare jobs at 258 hospitals and health…
- ScrubShifts Healthcare Jobs4/4Live US nursing and allied-health jobs, updated daily. Search by…
- redacta-mcp7/7Keep patient identifiers out of AI agent context — a local privacy…