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

VariableRequiredSecretDescription
FHIR_SERVER_BASE_URLYesNoBase URL of the FHIR Server (eg: https://hapi.fhir.org/baseR5)

Checks

CheckResultDetail
Source repository linkedPasshttps://github.com/wso2/fhir-mcp-server
Version pinnedPassEvery package has an explicit version
Secrets requestedInfoAsks for no secrets
Known package registryPassAll packages come from npm, PyPI, OCI, NuGet or MCPB
Namespace ownershipInfoName verified via GitHub account wso2
Registry text aimed at the AIPassDescription and settings contain no hidden characters or instructions to the AI
Code red flagsInfoPackage 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 toFHIR_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 settingsFHIR_SERVER_BASE_URL: target FHIR server
FHIR_SERVER_CLIENT_ID: FHIR authorization server (authorize + token endpoints)
FHIR_SERVER_CLIENT_SECRET: FHIR token endpoint only; not logged
FHIR_SERVER_ACCESS_TOKEN: FHIR server as a Bearer token on every request (overrides per-user OAuth tokens)
FHIR_SERVER_SCOPES: FHIR authorization server
FHIR_SERVER_DISABLE_AUTHORIZATION: local: turns off MCP auth
FHIR_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 machineNo 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 programsNone. No subprocess, eval or shell.
TelemetryNone.
Toolsget_capabilities, search, read, create, update, delete, get_user
Tool descriptionsclean. 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.

Popularity20 / 40

137 GitHub stars, 427 downloads last week, 0 Hacker News posts (0 points). Best two of the three, each on a log scale.

Activity23 / 25

Last push 2026-10-12, last release 2026-10-29, 22 commits in 90 days.

Issue health10 / 15

8 closed of 12 issues.

Our checks20 / 20

0 warnings, each costing a fifth.

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 nameio.github.wso2/fhir-mcp-server
PublisherGitHub account wso2
How the name is verifiedName verified via GitHub account wso2. The registry ties the name prefix to that account or domain; it does not check the code.
TypeLocal: runs on your machine from a package
Packagespypi fhir-mcp-server 0.10.0 (stdio)
Version0.10.0
Published
Last updated
Source repositoryhttps://github.com/wso2/fhir-mcp-server
Websitehttps://github.com/wso2/fhir-mcp-server
CategoryHealth & science (assigned by keyword rule, not by hand)

Related servers in Health & science