FHIR MCP Server

io.github.wso2由 GitHub 账号 wso2 发布v0.11.0更新于 Oct 29, 2026

MCP server providing seamless access to FHIR APIs for AI tools and healthcare applications

已验证STDIO仅桌面数据库开发者工具

概览

AI 生成的概览

把 AI 助手连接到 FHIR 医疗 API,使其能搜索、读取、创建、更新和删除临床资源。

可以做什么
  • 查看资源类型及其支持的搜索参数和自定义操作
  • 搜索并读取 FHIR 资源,可用 FHIRPath 表达式裁剪返回内容
  • 创建、更新和删除资源实例,并调用自定义操作
  • 查询当前已认证用户关联的 FHIR 个人资料
适用场景
当你使用 FHIR 服务器(公共 HAPI、Epic 沙箱、WSO2 FHIR Server 或自建服务器),并希望助手在开发和集成过程中浏览、查询或维护临床资源时适用。
运行要求
以本地 Python 包(Python 3.8+,uv/uvx)或 Docker 方式运行。需要一个可访问的 FHIR 服务器,并设置 FHIR_SERVER_BASE_URL 环境变量。默认启用授权,需提供 FHIR_SERVER_CLIENT_ID、FHIR_SERVER_CLIENT_SECRET 和 FHIR_SERVER_SCOPES,或在本地 stdio 模式下使用 FHIR_SERVER_ACCESS_TOKEN;设置 FHIR_SERVER_DISABLE_AUTHORIZATION=True 可关闭授权。需要能访问 FHIR 服务器的网络。
安装前请注意
该服务器可创建、更新和删除 FHIR 资源,助手操作可能修改或删除临床数据。它涉及 OAuth 客户端凭据(FHIR_SERVER_CLIENT_ID、FHIR_SERVER_CLIENT_SECRET)和访问令牌(FHIR_SERVER_ACCESS_TOKEN);README 提醒不要在服务器暴露于网络时使用访问令牌变量。患者数据会发送到所配置的 FHIR 服务器,关闭授权会使服务器对任何调用方开放。

安装

在 SourceWeft 中

  1. 打开 控制台中的 FHIR MCP Server,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

Model Context Protocol (MCP) Server for Fast Healthcare Interoperability Resources (FHIR) APIs

[License] [Get Support on Stack Overflow] [Join the community on Discord] [X] [Listed on Spark] [Install via Spark]

Table of Contents

Overview

The FHIR MCP Server is a Model Context Protocol (MCP) server that provides seamless integration with FHIR APIs. Designed for developers, integrators, and healthcare innovators, this server acts as a bridge between modern AI/LLM tools and healthcare data, making it easy to search, retrieve, and analyze clinical information.

Demo

Demo with HAPI FHIR server

This video showcases the MCP server's functionality when connected to a public HAPI FHIR server. This example showcases direct interaction with an open FHIR server that does not require an authorization flow.

https://github.com/user-attachments/assets/cc6ac87e-8329-4da4-a090-2d76564a3abf

Demo with EPIC Sandbox

This video showcases the MCP server's capabilities within the Epic EHR ecosystem. It demonstrates the complete OAuth 2.0 Authorization Code Grant flow.

https://github.com/user-attachments/assets/96b433f1-3e53-4564-8466-65ab48d521de

Core Features

  • MCP-compatible transport: Serves FHIR via stdio, SSE, or streamable HTTP

  • SMART-on-FHIR based authentication support: Securely authenticate with FHIR servers and clients

  • Response Filtering using FHIRPath: Filter resources and bundles returned by read and search operations using custom FHIRPath expressions to retrieve only the fields needed for the task, reducing payload sizes.

  • Tool integration: Integratable with any MCP client such as VS Code, Claude Desktop, and MCP Inspector

Prerequisites

  • Python 3.8+
  • uv (for dependency management)
  • An accessible FHIR API server.

Installation

You can use the FHIR MCP Server by installing our Python package, or by cloning this repository.

Installing using PyPI Package

  1. Configure Environment Variables:

    To run the server, you must set FHIR_SERVER_BASE_URL.

    • To enable authorization: Set FHIR_SERVER_BASE_URL, FHIR_SERVER_CLIENT_ID, FHIR_SERVER_CLIENT_SECRET, and FHIR_SERVER_SCOPES. Authorization is enabled by default.
    • To disable authorization: Set FHIR_SERVER_DISABLE_AUTHORIZATION to True.

    By default, the MCP server runs on http://localhost:8000, and you can customize the host and port using FHIR_MCP_HOST and FHIR_MCP_PORT.

    You can set these by exporting them as environment variables like below or by creating a .env file (referencing .env.example).

    bash
    export FHIR_SERVER_BASE_URL=""export FHIR_SERVER_CLIENT_ID=""export FHIR_SERVER_CLIENT_SECRET=""export FHIR_SERVER_SCOPES=""
    export FHIR_MCP_HOST="localhost"export FHIR_MCP_PORT="8000"
  2. Install the PyPI package and run the server

    bash
    uvx fhir-mcp-server

Installing from Source

  1. Clone the repository:

    bash
    git clone <repository_url>cd <repository_directory>
  2. Create a virtual environment and install dependencies:

    bash
    uv venvsource .venv/bin/activateuv pip sync requirements.txt

    Or with pip:

    bash
    python -m venv .venvsource .venv/bin/activatepip install -r requirements.txt
  3. Configure Environment Variables: Copy the example file and customize if needed:

    bash
    cp .env.example .env
  4. Run the server:

    bash
    uv run fhir-mcp-server

Installing using Docker

Running the MCP Server with Docker

You can run the MCP server using Docker for a consistent, isolated environment.

Note on Authorization: When running the MCP server locally via Docker or Docker Compose, authorization should be disabled by setting the environment variable, FHIR_SERVER_DISABLE_AUTHORIZATION=True . This would be fixed in the future releases.

  1. Build the Docker Image or pull the docker image from the container registry:

    • Build from source:
      bash
      docker build -t fhir-mcp-server .
    • Pull from GitHub Container Registry:
      bash
      docker pull ghcr.io/wso2/fhir-mcp-server:latest
      latest is built from the main branch. To use a release, pull its version tag instead, for example ghcr.io/wso2/fhir-mcp-server:0.11.0.
  2. Configure Environment Variables

    Copy the example environment file and edit as needed:

    bash
    cp .env.example .env# Edit .env to set your FHIR server, client credentials, etc.

    Alternatively, you can pass environment variables directly with -e flags or use Docker secrets for sensitive values. See the Configuration section for details on available environment variables.

  3. Run the Container

    bash
    docker run --env-file .env -p 8000:8000 ghcr.io/wso2/fhir-mcp-server:latest

    This will start the server and expose it on port 8000. Adjust the port mapping as needed.

Using Docker Compose with WSO2 FHIR Server

For a quick setup that includes both the FHIR MCP server and the WSO2 FHIR Server (with PostgreSQL), use the provided docker-compose.yml. This sets up an instant development environment for testing FHIR operations.

  1. Prerequisites:

    • Docker and Docker Compose installed.
  2. Set the Database Credentials:

    Copy the example environment file and set DB_PASSWORD in .env. If you already have a .env, add the DB_USER, DB_PASSWORD and DB_NAME lines from .env.example to it instead.

    bash
    cp .env.example .env

    Docker Compose reads .env automatically. DB_USER and DB_NAME default to postgres if not set. .env is excluded from Git; use a secrets manager for production deployments.

  3. Run the Stack:

    bash
    docker compose up -d

    This command will:

  4. Access the Services:

    docker compose down removes the database data; use docker compose stop to keep it between runs.

  5. Configure Additional Environment Variables:

    If you need to customize OAuth or other settings, adjust the env variables in the docker-compose.yml. The compose file sets basic configuration; refer to the Configuration section for full options.

Configuring any FHIR Server

To use a different FHIR server, run the FHIR MCP server container with FHIR_SERVER_BASE_URL pointing to that server. The example below uses the HAPI FHIR server. Stop the default stack first if it's already running (docker compose down), as both use ports 8000 and 8080.

  1. Create a network and start the HAPI FHIR server:

    bash
    docker network create fhir-networkdocker run -d --name hapi-fhir-server --network fhir-network -p 127.0.0.1:8080:8080 docker.io/hapiproject/hapi:v8.4.0-2

    HAPI FHIR listens on http://localhost:8080/fhir. This uses its built-in database, so data is lost when the container is removed.

  2. Build and run the FHIR MCP server container:

    bash
    docker build -t fhir-mcp-server .docker run -d --name fhir-mcp-server-hapi --network fhir-network -p 127.0.0.1:8000:8000      -e FHIR_SERVER_BASE_URL=http://hapi-fhir-server:8080/fhir      -e FHIR_MCP_HOST=0.0.0.0      -e FHIR_SERVER_DISABLE_AUTHORIZATION=True      fhir-mcp-server

    The FHIR MCP server listens on http://localhost:8000.

  3. Stop and clean up:

    bash
    docker rm -f fhir-mcp-server-hapi hapi-fhir-serverdocker network rm fhir-network

For any other FHIR server, set FHIR_SERVER_BASE_URL to its base URL. If the FHIR server runs on your host rather than in Docker, use http://host.docker.internal:<port>/... instead of localhost. On Linux, also add --add-host=host.docker.internal:host-gateway to the docker run command, and make sure the FHIR server listens on an address reachable from containers (for example 0.0.0.0, not only 127.0.0.1).

Integration with MCP Clients

The FHIR MCP Server is designed for seamless integration with various MCP clients.

VS Code

[Install in VS Code] [Install in VS Code Insiders]

Add the following JSON block to your MCP configuration file in VS Code (> V1.104). You can do this by pressing Ctrl + Shift + P and typing MCP: Open User Configuration.

Streamable HTTPSTDIOSSE
json
"servers": {    "fhir": {        "type": "http",        "url": "http://localhost:8000/mcp",    }}
json
"servers": {    "fhir": {        "command": "uv",        "args": [            "--directory",            "/path/to/fhir-mcp-server",            "run",            "fhir-mcp-server",            "--transport",            "stdio"        ],        "env": {            "FHIR_SERVER_ACCESS_TOKEN": "Your FHIR Access Token"        }    }}
json
"servers": {    "fhir": {        "type": "sse",        "url": "http://localhost:8000/sse",    }}

Claude Desktop

Add the following JSON block to your Claude Desktop settings to connect to your local MCP server.

  • Launch the Claude Desktop app, click on the Claude menu in the top bar, and select "Settings…".
  • In the Settings pane, click “Developer” in the left sidebar. Then click "Edit Config". This will open your configuration file in your file system. If it doesn’t exist yet, Claude will create one automatically at:
    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Open the claude_desktop_config.json file in any text editor. Replace its contents with the following JSON block to register the MCP server:
Streamable HTTPSTDIOSSE
json
{    "mcpServers": {        "fhir": {            "command": "npx",            "args": [                "-y",                "mcp-remote",                "http://localhost:8000/mcp"            ]        }    }}
json
{    "mcpServers": {        "fhir": {            "command": "uv",            "args": [                "--directory",                "/path/to/fhir-mcp-server",                "run",                "fhir-mcp-server",                "--transport",                "stdio"            ],            "env": {                "FHIR_SERVER_ACCESS_TOKEN": "Your FHIR Access Token"            }        }    }}
json
{    "mcpServers": {        "fhir": {            "command": "npx",            "args": [                "-y",                "mcp-remote",                "http://localhost:8000/sse"            ]        }    }}

MCP Inspector

Follow these steps to get the MCP Inspector up and running:

  • Open a terminal and run the following command:

    npx -y @modelcontextprotocol/inspector

  • In the MCP Inspector interface:

Streamable HTTPSTDIOSSE
  • Transport Type: Streamable HTTP
  • URL: http://localhost:8000/mcp
  • Transport Type: STDIO
  • Command: uv
  • Arguments: --directory /path/to/fhir-mcp-server run fhir-mcp-server --transport stdio
  • Transport Type: SSE
  • URL: http://localhost:8000/sse

Make sure your MCP server is already running and listening on the above endpoint.

Once connected, MCP Inspector will allow you to visualize tool invocations, inspect request/response payloads, and debug your tool implementations easily.

Configuration

CLI Options

You can customize the behavior of the MCP server using the following command-line flags:

  • --transport

    • Description: Specifies the transport protocol used by the MCP server to communicate with clients.
    • Accepted values: stdio, sse, streamable-http
    • Default: streamable-http
  • --log-level

    • Description: Sets the logging verbosity level for the server.
    • Accepted values: DEBUG, INFO, WARN, ERROR (case-insensitive)
    • Default: INFO
  • --help

    • Description: Displays a help message with available server options and exits.
    • Usage: Automatically provided by the command-line interface.

Sample Usages:

shell
uv run fhir-mcp-server --transport streamable-http --log-level DEBUGuv run fhir-mcp-server --help

Environment Variables

MCP Server Configurations:

  • FHIR_MCP_HOST: The hostname or IP address the MCP server should bind to (e.g., localhost for local-only access, or 0.0.0.0 for all interfaces).
  • FHIR_MCP_PORT: The port on which the MCP server will listen for incoming client requests (e.g., 8000).
  • FHIR_MCP_SERVER_URL: If set, this value will be used as the server's base URL instead of generating it from host and port. Useful for custom URL configurations or when behind a proxy.
  • FHIR_MCP_REQUEST_TIMEOUT: Timeout duration in seconds for requests from the MCP server to the FHIR server (default: 30).

MCP Server OAuth2 with FHIR server Configuration (MCP Client ↔ MCP Server): These variables configure the MCP client's secure connection to the MCP server, using the OAuth2 authorization code grant flow with a FHIR server.

  • FHIR_SERVER_CLIENT_ID: The OAuth2 client ID used to authorize MCP clients with the FHIR server.
  • FHIR_SERVER_DISABLE_AUTHORIZATION: If set to True, disables authorization checks on the MCP server, allowing connections to publicly accessible FHIR servers.
  • FHIR_SERVER_CLIENT_SECRET: The client secret corresponding to the FHIR client ID. Used during token exchange.
  • FHIR_SERVER_BASE_URL: The base URL of the FHIR server (e.g., https://hapi.fhir.org/baseR4). This is used to generate tool URIs and to route FHIR requests.
  • FHIR_SERVER_SCOPES: A space-separated list of OAuth2 scopes to request from the FHIR authorization server (e.g., user/Patient.read user/Observation.read). Add fhirUser openid to enable retrieval of user context for the get_user tool. If these two scopes are not configured, the get_user tool returns an empty result because the ID token lacks the user's FHIR resource reference.
  • FHIR_SERVER_ACCESS_TOKEN: The access token to use for authenticating requests to the FHIR server. If this variable is set, the server will bypass the OAuth2 authorization flow and use this token directly for all requests.

[!NOTE] FHIR_SERVER_ACCESS_TOKEN is intended for local stdio mode deployments only, as a convenience to bypass interactive OAuth authentication. Do not use this variable when the MCP server is exposed over a network or the public internet.

Tools

  • get_capabilities: Retrieves metadata about a specified FHIR resource type, including its supported search parameters and custom operations.

    • type: The FHIR resource type name (e.g., "Patient", "Observation", "Encounter")
  • search: Executes a standard FHIR search interaction on a given resource type, returning a bundle or list of matching resources.

    • type: The FHIR resource type name (e.g., "MedicationRequest", "Condition", "Procedure").
    • searchParam: A mapping of FHIR search parameter names to their desired values (e.g., {"family":"Simpson","birthdate":"1956-05-12"}).
    • response_filter_fhirpaths: (Optional) An array of FHIRPath expressions (e.g., ["Patient.name", "Patient.birthDate", "Bundle.link.where(relation='next').url"]) to apply to the resources in the response bundle.
  • read: Performs a FHIR "read" interaction to retrieve a single resource instance by its type and resource ID, optionally refining the response with search parameters or custom operations.

    • type: The FHIR resource type name (e.g., "DiagnosticReport", "AllergyIntolerance", "Immunization").
    • id: The logical ID of a specific FHIR resource instance.
    • searchParam: A mapping of FHIR search parameter names to their desired values (e.g., {"device-name":"glucometer"}).
    • operation: The name of a custom FHIR operation or extended query defined for the resource (e.g., "$everything").
    • response_filter_fhirpaths: (Optional) An array of FHIRPath expressions (e.g., ["Patient.name", "Observation.valueQuantity"]) to filter the returned single resource (or entries when using custom operations like $everything).
  • create: Executes a FHIR "create" interaction to persist a new resource of the specified type.

    • type: The FHIR resource type name (e.g., "Device", "CarePlan", "Goal").
    • payload: A JSON object representing the full FHIR resource body to be created.
    • searchParam: A mapping of FHIR search parameter names to their desired values (e.g., {"address-city":"Boston"}).
    • operation: The name of a custom FHIR operation or extended query defined for the resource (e.g., "$evaluate").
  • update: Performs a FHIR "update" interaction by replacing an existing resource instance's content with the provided payload.

    • type: The FHIR resource type name (e.g., "Location", "Organization", "Coverage").
    • id: The logical ID of a specific FHIR resource instance.
    • payload: The complete JSON representation of the FHIR resource, containing all required elements and any optional data.
    • searchParam: A mapping of FHIR search parameter names to their desired values (e.g., {"patient":"Patient/54321","relationship":"father"}).
    • operation: The name of a custom FHIR operation or extended query defined for the resource (e.g., "$lastn").
  • delete: Execute a FHIR "delete" interaction on a specific resource instance.

    • type: The FHIR resource type name (e.g., "ServiceRequest", "Appointment", "HealthcareService").
    • id: The logical ID of a specific FHIR resource instance.
    • searchParam: A mapping of FHIR search parameter names to their desired values (e.g., {"category":"laboratory","issued:"2025-05-01"}).
    • operation: The name of a custom FHIR operation or extended query defined for the resource (e.g., "$expand").
  • get_user: Retrieves the currently authenticated user's FHIR resource (for example the linked Patient resource) and returns a concise profile containing available demographic fields such as id, name, and birthDate.

Development & Testing

Installing Development Dependencies

To run tests and contribute to development, install the test dependencies:

Using pip:

bash
# Install project in development mode with test dependenciespip install -e '.[test]'
# Or install from requirements filepip install -r requirements-dev.txt

Using uv:

bash
# Install development dependenciesuv sync --dev

Running Tests

The project includes a comprehensive test suite covering all major functionality:

bash
# Simple test runnerpython run_tests.py
# Or direct pytest usagePYTHONPATH=src python -m pytest tests/ -v --cov=src/fhir_mcp_server

Using pytest:

bash
pytest tests/

This will discover and run all tests in the tests/ directory.

Test Features:

  • 100+ tests with comprehensive coverage
  • Full async/await support using pytest-asyncio
  • Complete mocking of HTTP requests and external dependencies
  • Coverage reporting with terminal and HTML output
  • Fast execution with no real network calls

The test suite includes:

  • Unit tests: Core functionality testing
  • Integration tests: Component interaction validation
  • Edge case coverage: Error handling and validation scenarios
  • Mocked OAuth flows: Realistic authentication testing

Coverage reports are generated in htmlcov/index.html for detailed analysis.

来源:README.md,提交 794a669

工具

0
SourceWeft 曾在隔离沙箱中以无凭据方式启动该软件包一次,以列出其工具,但未能完成:软件包安装失败。

版本历史

2
  1. v0.11.0最新Oct 29, 2026
  2. v0.10.0Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分