FHIR MCP Server – helping you expose any FHIR Server or API as a MCP Server.
FHIR MCP server exists for a simple reason — assistants are far more useful when they can act on FHIR directly instead of describing what you should do. FHIR MCP Server – helping you expose any FHIR Server or API as a MCP Server.
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.
Installation goes through your MCP client rather than a global install: point it at @modelcontextprotocol/inspector on npm and it is fetched when the client starts. The copy-paste blocks for Claude Desktop, Claude Code and Cursor are further down this page.
Once FHIR is connected, these are the calls the assistant has available:
get_capabilities — Retrieves metadata about a specified FHIR resource type, including its supported search parameters and custom operationstype — 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 resourcessearchParam — 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 theread — Performs a FHIR "read" interaction to retrieve a single resource instance by its type and resource ID, optionally refining the response with searchoperation — The name of a custom FHIR operation or extended query defined for the resource (e.g., "$everything")create — Executes a FHIR "create" interaction to persist a new resource of the specified typepayload — A JSON object representing the full FHIR resource body to be createdupdate — Performs a FHIR "update" interaction by replacing an existing resource instance's content with the provided payloaddelete — Execute a FHIR "delete" interaction on a specific resource instanceget_user — Retrieves the currently authenticated user's FHIR resource (for example the linked Patient resource) and returns a concise profile containingYou will need 8 environment variables: FHIR_SERVER_ACCESS_TOKEN, FHIR_SERVER_BASE_URL, FHIR_SERVER_CLIENT_ID, FHIR_SERVER_CLIENT_SECRET, FHIR_SERVER_SCOPES, FHIR_MCP_HOST, FHIR_MCP_PORT, FHIR_MCP_SERVER_URL. The server will not start without them, which is usually why the tools fail to appear on a first run. Keep credentials in your client's env block or a secrets manager rather than in a file you might commit.
Among the developer tooling options, the useful question is rarely "what can it do" but "what does it cost you to run" — permissions, credentials, and how much of your context its toolset consumes. FHIR's toolset — get_capabilities, type, search and 9 more — is a fair guide to whether it matches your workflow.
SyncDev reviews every entry in this directory against the project's own documentation before publishing, and revisits them as servers change.
| Tool | What it does |
|---|---|
| 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. |
| 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. |
| operation | The name of a custom FHIR operation or extended query defined for the resource (e.g., "$everything"). |
| create | Executes a FHIR "create" interaction to persist a new resource of the specified type. |
| payload | A JSON object representing the full FHIR resource body to be created. |
| update | Performs a FHIR "update" interaction by replacing an existing resource instance's content with the provided payload. |
| delete | Execute a FHIR "delete" interaction on a specific resource instance. |
| 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. |
{
"mcpServers": {
"fhir": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://localhost:8000/mcp"
]
}
}
}Configuration as documented by the project. Restart the client after saving.
| Variable | Description | Required |
|---|---|---|
| FHIR_SERVER_ACCESS_TOKEN | Credential the server authenticates with. | Yes |
| FHIR_SERVER_BASE_URL | Endpoint or connection string the server talks to. | Yes |
| FHIR_SERVER_CLIENT_ID | Configuration value read at startup. | Optional |
| FHIR_SERVER_CLIENT_SECRET | Credential the server authenticates with. | Yes |
| FHIR_SERVER_SCOPES | Configuration value read at startup. | Optional |
| FHIR_MCP_HOST | Endpoint or connection string the server talks to. | Optional |
| FHIR_MCP_PORT | Configuration value read at startup. | Optional |
| FHIR_MCP_SERVER_URL | Endpoint or connection string the server talks to. | Yes |
Kill hallucinated APIs — version-accurate, up-to-date library documentation injected straight into context.
Microsoft's official browser automation server — drive a real browser through the accessibility tree, no screenshots needed.
GitHub's official server — repos, issues, pull requests, Actions and code security, straight from your assistant.
Issue tracking at the speed of conversation — Linear's official hosted server with OAuth and zero install.
Local repository surgery — status, diffs, commits, branches and history for any repo on disk.
Timezone sanity for AI — current time anywhere and correct conversions, without the model doing date math.