MCP FHIR Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP FHIR Serversearch for patients named John Smith born after 1990"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP FHIR Server
A generic MCP server providing read/write access to any FHIR-compliant API with built-in validation.
This server works with any FHIR server, not just Zus Health. For Zus-specific features (like getting UPIDs), see the Zus Extensions section below.
Features
Core FHIR Features
FHIR resource validation using consolidated FHIR schemas
Create and update resources (POST/PUT)
Read resources by type and ID
Search resources with query parameters
Granular permissions via environment configuration
Bearer token authentication
Custom HTTP headers for multi-tenant or vendor-specific requirements
Detailed error messages for debugging and LLM-based correction
Zus Health Extensions (Optional)
Zus UPID lookup - Get Universal Patient IDs from Zus FHIR servers
Intelligent name matching - Find best patient match when multiple results exist
Builder ID support - Multi-tenant access via
Zus-Accountheader
Related MCP server: FHIR MCP Server
Installation
Prerequisites
Python 3.13+
uv (recommended) or pip
Setup
# Clone the repository
git clone <repository-url>
cd mcp-fhir
# Install dependencies (production only)
uv sync
# For development (includes test tools, linter, etc.)
uv sync --extra dev
# Or with pip
pip install -e .Note: The make commands will automatically install development dependencies when needed, so you can also just run make test directly after cloning.
Configuration
Environment File
The server can load environment variables from a file using the --env-file command line flag:
# Load environment variables from a specific file
uv run fastmcp run server.py --env-file /path/to/your/.env
# Or for development
uv run fastmcp dev server.py --env-file /path/to/your/.envIf no --env-file flag is provided, the server will use system environment variables only.
Create a .env file:
cp .env.example .envEnvironment Variables
Variable | Default | Description |
|
| FHIR server base URL |
|
| Enable GET operations |
|
| Enable POST/PUT/PATCH/DELETE operations |
| (empty) | Bearer token for authentication |
| (empty) | Comma-separated HTTP methods (overrides READ/WRITE) |
Permission Model
Option 1: Simple Read/Write (default)
FHIR_ALLOW_READ=true # Enables GET
FHIR_ALLOW_WRITE=true # Enables POST, PUT, PATCH, DELETEOption 2: Granular Methods (takes precedence)
FHIR_ALLOWED_METHODS=GET,POST # Only read and createExamples:
GET- Read-onlyPOST,PUT- Create and update only (no reads)GET,POST- Read and create (no updates)GET,POST,PUT- Full access
Running
Development
# Using make (recommended)
make dev
# Or directly
uv run fastmcp dev server.pyProduction
# Using make (recommended)
make run
# Or directly
uv run fastmcp run server.pyClaude Desktop Integration
Edit your Claude Desktop config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"fhir": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/mcp-fhir",
"run",
"fastmcp",
"run",
"server.py",
"--env-file",
"/absolute/path/to/mcp-fhir/.env"
]
}
}
}Alternative: You can also set environment variables directly in the config:
{
"mcpServers": {
"fhir": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/mcp-fhir",
"run",
"fastmcp",
"run",
"server.py"
],
"env": {
"FHIR_BASE_URL": "https://your-fhir-server.com/fhir",
"FHIR_ALLOW_READ": "true",
"FHIR_ALLOW_WRITE": "true",
"FHIR_AUTH_TOKEN": "your-token-here"
}
}
}
}Restart Claude Desktop after editing.
Tools
Core FHIR Tools
These tools work with any FHIR-compliant server:
write_fhir_resource
Create or update a FHIR resource.
Parameters:
resource(object): FHIR resource JSONcustom_headers(object, optional): Custom HTTP headers for the requestFor Zus servers:
{"Zus-Account": "builder-id"}for multi-tenant accessFor other servers: Any vendor-specific headers your FHIR server requires
Behavior:
Validates resource against FHIR schema
Uses POST if no
idfield (create), PUT ifidexists (update)Returns validation errors for correction if invalid
Returns server response on success (if
FHIR_ALLOW_READ=true)
Example:
{
"resourceType": "Patient",
"name": [{"family": "Smith", "given": ["John"]}],
"gender": "male"
}Note: If validation schema fails to load, validation is skipped (server-side validation still applies).
read_fhir_resource
Read a resource by type and ID.
Parameters:
resource_type(string): e.g., "Patient", "Observation"resource_id(string): Resource IDcustom_headers(object, optional): Custom HTTP headers for the request
Returns: JSON resource or error message
search_fhir_resources
Search resources with query parameters.
Parameters:
resource_type(string): Resource type to searchsearch_params(object, optional): Query parametersExample:
{"name": "Smith", "gender": "female"}
custom_headers(object, optional): Custom HTTP headers for the request
Returns: FHIR Bundle with matching resources
get_fhir_config
View current configuration.
Returns: Configuration summary including base URL, permissions, and allowed methods.
Zus Health Extensions
These tools are specific to Zus Health FHIR servers and will not work with other FHIR implementations.
get_patient_zus_upid
Get the Zus UPID (Universal Patient ID) for a Patient resource from Zus FHIR server.
Parameters:
first_name(string): Patient's first namelast_name(string): Patient's last namebuilder_id(string, optional): Zus builder ID to filter the search
Behavior:
Searches for Patient resources using
nameparameter (concatenated first and last name)Optionally filters by Zus
builderIDparameter if providedExtracts Zus UPID from Patient's identifiers with system
https://zusapi.com/fhir/identifier/universal-idWhen multiple patients are found, uses intelligent name matching to find the best match
Returns the Zus UPID value or appropriate error message
Example usage:
get_patient_zus_upid("John", "Smith")
get_patient_zus_upid("John", "Smith", "builder-123")Response formats:
Single patient found:
Zus UPID: zus-upid-12345Multiple patients with good name match:
Zus UPID: zus-upid-12345 (Best match: John Smith)+ other matches if anyMultiple patients with no clear match: Lists all found patients with their Zus UPIDs
No patients found:
Error: No Patient found with name 'John Smith'No Zus UPID:
Error: No Zus UPID found for Patient(s) with name 'John Smith'
Name Matching Logic:
Exact name matches get highest priority (score 1.0)
Partial matches (e.g., "John" matching "Johnny") get medium priority (score 0.7 for given name)
Family name matches are weighted more heavily than given name matches
Partial matches are permissive: shorter names can match longer ones (e.g., "John" matches "Johnny")
If the best match has a score ≥ 0.5, it's returned as the primary result
Other decent matches (score ≥ 0.3) are listed as alternatives
Technical Details
HTTP Headers
All requests include:
Content-Type: application/fhir+json
Accept: application/fhir+json
Authorization: Bearer {token} (if FHIR_AUTH_TOKEN set)Custom Headers:
You can provide additional custom headers via the custom_headers parameter in any tool. This is useful for:
Multi-tenant systems (e.g., Zus's
Zus-Accountheader)Vendor-specific authentication or routing headers
Any other FHIR server-specific requirements
Example (Zus):
{"Zus-Account": "builder-123"}Timeouts
All requests timeout after 30 seconds.
Error Handling
The server returns detailed errors for:
Code | Description |
400 | Invalid request/validation error |
401 | Authentication failed |
403 | Insufficient permissions |
404 | Resource or endpoint not found |
422 | Business rule violation |
Timeout | Connection timeout (30s) |
Errors include full server response when available for debugging.
Validation
Resources are validated using the fhir-validator library before submission:
Checks FHIR spec compliance
Validates required fields and data types
Verifies resource structure
If validation schema loading fails at startup, a warning is logged and validation is bypassed (server-side validation still occurs).
Development
Testing
# Run tests (automatically installs dev dependencies if needed)
make test
# With coverage
make test-cov
# Watch mode
make test-watchOr directly:
uv run pytest
uv run pytest --cov=. --cov-report=term-missingNote: All make commands automatically install development dependencies when needed, so new developers can simply run make test after cloning the repository.
Code Quality
make lint # Run linter (automatically installs dev dependencies)
make format # Format code (automatically installs dev dependencies)
make check # Lint + format check (automatically installs dev dependencies)Project Structure
mcp-fhir/
├── server.py # Generic MCP FHIR server implementation
├── zus_extensions.py # Zus Health-specific tools (optional)
├── fhir_validator.py # FHIR validation logic
├── pyproject.toml # Dependencies
├── .env.example # Example configuration
└── tests/ # Test suiteArchitecture
The server is designed with modularity in mind:
server.py: Contains generic FHIR operations that work with any FHIR server
zus_extensions.py: Contains Zus Health-specific functionality (UPID lookup, etc.)
Generic tools accept
custom_headersfor flexibility with different FHIR vendorsZus tools use
builder_idfor Zus-specific multi-tenancy
This separation allows you to:
Use the generic tools with any FHIR server
Add your own vendor-specific extensions by following the zus_extensions.py pattern
Keep the core FHIR functionality clean and standards-compliant
License
[Add license information]
Contributing
[Add contribution guidelines]
Available Tools
5 toolsget_fhir_configB
Get the current FHIR server configuration.
Returns: Current configuration settings
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool returns configuration settings, but lacks details on permissions needed, rate limits, error handling, or whether it's a read-only operation. For a tool with no annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded, stating the purpose in the first sentence and the return in the second. There's no wasted text, but the structure could be slightly improved by integrating the return statement more seamlessly or adding minimal context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 0 parameters, 100% schema coverage, and an output schema exists, the description is adequate but minimal. It explains what the tool does and what it returns, but lacks context on usage, behavioral traits, or how it fits with siblings, making it incomplete for optimal agent understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so the schema fully documents the lack of inputs. The description doesn't need to add parameter details, but it implicitly confirms no parameters are required by not mentioning any. This meets the baseline for zero-parameter tools, though it could briefly note the absence of inputs for clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Get') and resource ('current FHIR server configuration'), making it immediately understandable. However, it doesn't differentiate this tool from its siblings (like 'read_fhir_resource' or 'search_fhir_resources'), which might also retrieve configuration-related data, so it doesn't reach the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention any context, prerequisites, or exclusions, such as whether this is for administrative settings versus patient data access, leaving the agent to infer usage from tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_patient_zus_upidA
Get the Zus UPID (Universal Patient ID) for a Patient resource from Zus FHIR server.
This is a Zus-specific tool for working with Zus Health's FHIR API. Searches for a Patient by first and last name, optionally filtered by builderID, then extracts the Zus UPID from the Patient's identifiers.
Args: first_name: Patient's first name last_name: Patient's last name builder_id: Optional Zus builder ID (string) to filter the search
Returns: The Zus UPID value or an error message if not found
| Name | Required | Description | Default |
|---|---|---|---|
| first_name | Yes | ||
| last_name | Yes | ||
| builder_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool searches for a Patient and extracts the UPID, and mentions it returns 'an error message if not found.' However, it lacks details on authentication needs, rate limits, or what specific error messages might be returned, leaving behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose, followed by context, parameters, and returns. Every sentence adds value: the first states the purpose, the second provides context, the third explains the search logic, and the last two detail parameters and returns, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, no annotations, but with an output schema), the description is fairly complete. It covers purpose, context, parameters, and return behavior. However, it could improve by addressing authentication or error specifics, though the output schema may handle return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning by explaining each parameter's purpose: 'first_name: Patient's first name', 'last_name: Patient's last name', and 'builder_id: Optional Zus builder ID (string) to filter the search.' This clarifies semantics beyond the bare schema, though it doesn't detail format constraints or examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get the Zus UPID (Universal Patient ID) for a Patient resource from Zus FHIR server.' It specifies the exact action (get), resource (Zus UPID), and distinguishes it from siblings by focusing on extracting UPIDs rather than general FHIR operations like read_fhir_resource or search_fhir_resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: 'This is a Zus-specific tool for working with Zus Health's FHIR API' and 'Searches for a Patient by first and last name.' It implies usage for Zus-specific UPID extraction but doesn't explicitly state when not to use it or name alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fhir_resourceA
Read a FHIR resource by type and ID from the FHIR server.
Args: resource_type: The FHIR resource type (e.g., "Patient", "Observation") resource_id: The ID of the resource to read custom_headers: Optional dictionary of custom HTTP headers to include in the request. For Zus servers, use {"Zus-Account": "builder-id"} for multi-tenant access.
Returns: The FHIR resource as JSON or an error message
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | Yes | ||
| resource_id | Yes | ||
| custom_headers | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the tool reads resources (non-destructive) and mentions error handling ('or an error message'), but lacks details on authentication needs, rate limits, or server-specific behaviors beyond the Zus headers example. It adds some context but is incomplete for a mutation-free read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose statement, parameter explanations, and return information. It uses bullet-like formatting under 'Args:' and 'Returns:' for readability. Some minor verbosity exists (e.g., repeating 'FHIR' could be trimmed), but overall it's efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (returns JSON), the description needn't detail return values. It covers the core purpose, parameters, and a key usage note (Zus headers). For a read operation with no annotations, it provides adequate context, though it could benefit from more behavioral details like error types or access requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains all three parameters: 'resource_type' with examples ('Patient', 'Observation'), 'resource_id' as the target ID, and 'custom_headers' with a specific use case for Zus servers. This adds meaningful semantics beyond the bare schema, though it doesn't cover all possible header formats or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Read a FHIR resource') with the target ('by type and ID from the FHIR server'), distinguishing it from sibling tools like 'search_fhir_resources' (which searches) and 'write_fhir_resource' (which writes). The verb+resource combination is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving specific resources by type and ID, but does not explicitly state when to use this versus alternatives like 'search_fhir_resources' for broader queries or 'get_patient_zus_upid' for patient-specific IDs. No exclusions or prerequisites are mentioned, leaving usage context somewhat open-ended.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_fhir_resourcesB
Search for FHIR resources using query parameters.
Args: resource_type: The FHIR resource type to search (e.g., "Patient", "Observation") search_params: Optional dictionary of search parameters (e.g., {"name": "Smith", "gender": "female"}) custom_headers: Optional dictionary of custom HTTP headers to include in the request. For Zus servers, use {"Zus-Account": "builder-id"} for multi-tenant access.
Returns: A FHIR Bundle containing matching resources or an error message
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | Yes | ||
| search_params | No | ||
| custom_headers | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions the return type ('A FHIR Bundle containing matching resources or an error message') and a specific use case for 'custom_headers' in Zus servers, but does not cover critical aspects like authentication requirements, rate limits, error handling details, or whether this is a read-only operation. This leaves significant gaps for an agent to understand behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded, starting with the core purpose. It uses a structured format with 'Args:' and 'Returns:' sections, making it easy to parse. While efficient, the 'custom_headers' explanation is slightly verbose but adds necessary context, so it earns its place without significant waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (3 parameters, 0% schema coverage, no annotations, but with an output schema), the description is partially complete. It covers parameter basics and return values, but lacks details on authentication, error scenarios, and behavioral constraints. The output schema likely handles return structure, reducing the need for description there, but overall gaps remain for safe and effective tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning by explaining each parameter: 'resource_type' with examples ('Patient', 'Observation'), 'search_params' as an optional dictionary with examples, and 'custom_headers' with a specific use case. However, it does not fully detail all possible values, constraints, or formats beyond basic examples, leaving some ambiguity for the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search for FHIR resources using query parameters.' It specifies the verb ('search') and resource ('FHIR resources'), making it understandable. However, it does not explicitly differentiate from sibling tools like 'read_fhir_resource' or 'write_fhir_resource', which could involve similar resources but different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through examples (e.g., searching for 'Patient' or 'Observation'), but does not explicitly state when to use this tool versus alternatives like 'read_fhir_resource' for specific resource retrieval. It provides context for 'custom_headers' in multi-tenant scenarios, but lacks clear guidance on exclusions or prerequisites for general use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_fhir_resourceA
Write a FHIR resource to the FHIR server.
This tool:
Validates the FHIR resource using fhir-validator
Determines the appropriate endpoint based on resource type
POSTs or PUTs the resource to the FHIR server
Returns validation errors or server errors for correction
Args: resource: A FHIR resource as a JSON object (dict) custom_headers: Optional dictionary of custom HTTP headers to include in the request. For Zus servers, use {"Zus-Account": "builder-id"} for multi-tenant access.
Returns: A status message indicating success or detailed error information
| Name | Required | Description | Default |
|---|---|---|---|
| resource | Yes | ||
| custom_headers | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well by detailing steps like validation, endpoint determination, and error handling. It discloses behavioral traits such as validation using fhir-validator and handling of errors, which are beyond basic functionality. However, it misses some details like rate limits or authentication requirements, preventing a perfect score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullet points and sections for Args and Returns, making it easy to scan. It's appropriately sized with no redundant information, but the bullet points could be more concise, and some sentences are slightly verbose (e.g., 'Returns validation errors or server errors for correction').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (write operation with validation and custom headers), no annotations, and an output schema present, the description is mostly complete. It covers purpose, steps, parameters, and returns, but could benefit from more details on error types or success conditions, especially since the output schema exists but isn't described in the text.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning by explaining that 'resource' is a FHIR resource as a JSON object and 'custom_headers' is optional with a specific example for Zus servers. This provides practical context beyond the schema's basic types, though it could elaborate more on resource structure or header constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool writes a FHIR resource to a FHIR server, specifying the action (write) and resource (FHIR resource). It distinguishes from sibling tools like read_fhir_resource and search_fhir_resources by focusing on creation/update. However, it doesn't explicitly differentiate from potential siblings like update_fhir_resource or create_fhir_resource if they existed, keeping it at 4 instead of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for writing FHIR resources, with a note about Zus servers for multi-tenant access, suggesting context-specific application. However, it lacks explicit guidance on when to use this tool versus alternatives (e.g., no mention of when to use POST vs. PUT or how it differs from sibling tools like read_fhir_resource). The guidance is present but not comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, but get_fhir_config overlaps slightly with general FHIR operations as it's a configuration tool rather than a core FHIR resource operation. The other tools (read, search, write, get_patient_zus_upid) are clearly differentiated by their specific actions and targets.
Tools follow a consistent verb_noun pattern (get_fhir_config, read_fhir_resource, search_fhir_resources, write_fhir_resource), with get_patient_zus_upid being a minor deviation due to its Zus-specific naming. Overall, the naming is predictable and readable.
Five tools is reasonable for a FHIR server, covering core operations like read, search, and write, plus configuration and a Zus-specific utility. It's slightly thin for full FHIR coverage but well-scoped for basic interactions.
The toolset covers read, search, and write operations, but lacks update and delete for full CRUD lifecycle management. The inclusion of get_fhir_config and a Zus-specific tool adds utility, but the absence of update/delete operations is a notable gap for FHIR resource management.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Securely access and manage FHIR healthcare data stored in Medplum.
Read and write patients, facilities, medical documents, and consolidated FHIR records in Metriport.
Guardrailed FHIR access for AI agents: PHI redaction, audit trail, step-up auth, tenant isolation
Privacy-preserving synthetic health data generation. FHIR R4/R5 compliant.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables LLM-based agents to interact with FHIR healthcare data through natural language prompts, providing full CRUD operations on FHIR resources, document processing, and semantic search capabilities.1398MIT
- -licenseNot gradedqualityNot gradedmaintenanceEnables seamless integration with FHIR APIs for healthcare applications, allowing users to search, retrieve, create, update, and analyze clinical information through natural language interactions. Supports SMART-on-FHIR authentication and works with various healthcare systems like EPIC and HAPI FHIR servers.
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to securely interact with FHIR healthcare servers and HL7 terminology services. Provides comprehensive healthcare data operations with built-in PHI protection, audit logging, and SMART on FHIR authentication.MIT
- AlicenseAqualityCmaintenanceProvides seamless integration with FHIR APIs, enabling AI/LLM tools to search, retrieve, and analyze clinical healthcare data with support for SMART-on-FHIR authentication and multiple transport protocols.7134Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mrosata/mcp-fhir'
If you have feedback or need assistance with the MCP directory API, please join our Discord server