FHIR MCP 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., "@FHIR MCP Serversearch for patients with type 2 diabetes and list their recent HbA1c results"
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.
π Table of Contents
Related MCP server: FHIR MCP Server
π About The Project
FHIR MCP Server implements a complete Model Context Protocol (MCP) server, designed to facilitate seamless interaction between LLM-based agents and a FHIR-compliant backend. It provides a standardized interface that enables full CRUD operations on FHIR resources through a comprehensive suite of tools - accessible from MCP-compatible clients such as Claude Desktop, allowing users to query and manipulate clinical data using natural-language prompts.
β¨ Key Features
π FastMCP Framework: Built on FastMCP for high-performance MCP server capabilities
π₯ FHIR Resource Management: Full CRUD operations for all major FHIR resources
π Intelligent Document Processing: AI-powered document ingestion and chunking for multiple formats including TXT, CSV, JSON, and PDF
π Semantic Search: Advanced document search using vector embeddings (via Pinecone)
π§ RAG-Ready: Retrieval-Augmented Generation pipeline with context-aware document queries
π Secure Authentication: OAuth2 token management for FHIR API integration
π LOINC Integration: Standardized medical terminology lookup and validation
π³ Container Ready: Docker support for easy deployment and scaling
π§ Configurable: Extensive
.env-based configuration options
ποΈ Architecture
The server is built with a modular architecture:
MCP Tools: Dedicated tools for selected FHIR resource types, with others handled by a generic tool
Fhir Server Client: Handles FHIR API communication and authentication (OAuth2 and more planned)
RAG Services: Embedding-based document processing and semantic retrieval
Vector Store: Pinecone integration for similarity-based search
LOINC Client: Integration with LOINC API for terminology resolution and validation
π‘ Demo
This demo shows how Claude uses the fhir-mcp-server to communicate with a FHIR server (in this case Medplum) to answer questions. You will see, among other things:
utilization of the
request_patient_resourcetool which retrieves basic patient informationutilization of the
request_condition_resourcetool to answer the question whether any of the previously diagnosed diseases may cause symptoms that the patient is currently complaining aboututilization of the
request_medication_resource,request_encounter_resource,request_generic_resourcetools to answer the question whether the patient has already received any treatment for hypertension
You can observe how Claude automatically selects the tools worth using to answer the question based on the user's query.
https://github.com/user-attachments/assets/3a3a8ed3-f881-447d-af03-5f24432a2cdd
Here you can observe how Claude first uses the tool searching for LOINC codes for the lipid panel specific codes, but not finding any related observations in FHIR server, it repeats the search for individual biomarkers that make up such a panel.
https://github.com/user-attachments/assets/2fb39801-d5d6-4461-bedd-9f58ab4d52ec
Developers working with FHIR often need to generate specific test data to validate FHIR server functionality, such as search capabilities and data relationships. While you can use Synthea to generate synthetic data and then manually import the resulting bundles to your server, fhir-mcp-server streamlines this process by allowing you to generate and deploy test data directly through Claude.
This eliminates the typical workflow of running synthea separately, downloading bundles, and manually importing them to your FHIR server. Instead, you can create targeted test scenarios, generate appropriate synthetic data, and populate your server all within Claude's interface.
https://github.com/user-attachments/assets/d87da1d8-6401-4a9e-a6f0-50ba23396e12
Note: fhir-mcp-server was not designed with this use case in mind, so as you'll see in the demo, it doesn't work perfectly - what can be observed, however, is how well the LLM handles using trial and error to correct any wrong choices.
π Getting Started
Follow these steps to set up FHIR MCP Server in your environment.
Prerequisites
Docker (recommended) or uv: For dependency management
FHIR Server Account: Access to FHIR API (e.g. Medplum)
Pinecone API key (required for document search): Enables vector-based search over processed documents. Without it, semantic retrieval features will be unavailable.
LOINC Account (optional): Enables retrieval of the latest LOINC codes from the official API. Without it, the system relies on static or language model-inferred codes, which may be outdated or imprecise.
Installation & Setup
Clone the repository:
git clone https://github.com/the-momentum/fhir-mcp-server cd fhir-mcp-serverSet up environment variables:
cp config/.env.example config/.envEdit the
config/.envfile with your credentials and configuration. See Environment VariablesInstall Dependencies
For Docker-based execution run:
make buildFor uv-based execution run:
make uvUpdate the MCP Client configuration
e.g. Claude Desktop -> edit
claude_desktop_config.json
Docker
{ "mcpServers": { "docker-mcp-server": { "command": "docker", "args": [ "run", "-i", "--rm", "--init", "--name", "fhir-mcp-server", "--mount", // optional - volume for reload "type=bind,source=<your-project-path>/app,target=/root_project/app", // optional - volume for reload "--mount", "type=bind,source=<your-project-path>/config/.env,target=/root_project/config/.env", "-e", "TRANSPORT_MODE=stdio", // Set transport mode: stdio, http, or https "mcp-server:latest" ] } } }Make sure to replace
<your-project-path>with the actual path to your installationuv
Firstly, get uv path from terminal:
Windows:
(Get-Command uv).PathMacOS/Linux:
which uv
Then, update config file:
{ "mcpServers": { "uv-mcp-server": { "command": "uv", "args": [ "run", "--frozen", "--directory", "<your-project-path>", "start" ], "env": { "PATH": "<uv-bin-folder-path>" } } } }Make sure to replace with the actual uv path (to bin folder)
Restart MCP Client
After completing all of the above steps, restart the MCP Client to apply the changes. In some cases, you may need to terminate all related processes using Task Manager or your system's process manager. This ensures that:
The updated configuration is properly loaded
Environment variables are correctly applied
The FHIR MCP client initializes with the correct settings
π§ Configuration
π Security & Encryption
The FHIR MCP Server includes built-in encryption infrastructure to protect sensitive configuration values. Sensitive fields like API keys and passwords are automatically encrypted and decrypted at runtime.
You are allowed to store passwords as a plain text, but if you want to have them encrypted, follow the instruction below.
Setting Up Encryption
For most users, use the automated setup script:
# uv method
uv run scripts/cryptography/setup_encryption.py
# docker method
docker exec fhir-mcp-server uv run scripts/cryptography/setup_encryption.pyThis script will:
Check for
MASTER_KEYinconfig/.envand generate one if neededAutomatically encrypt all sensitive values (
LOINC_PASSWORD,FHIR_SERVER_CLIENT_SECRET,PINECONE_API_KEY)Update your
.envfile with encrypted valuesSkip empty variables and already encrypted values
Generate a Master Key:
# uv method uv run scripts/cryptography/generate_master_key.py # docker method docker exec fhir-mcp-server uv run scripts/cryptography/generate_master_key.pyPut that key as a MASTER_KEY environment variable in .env.
Encrypt Sensitive Values:
# uv method uv run scripts/cryptography/encrypt_setting.py "your_secret_value" # docker method docker exec fhir-mcp-server uv run scripts/cryptography/encrypt_setting.py "your_secret_value"Decrypt Values (for verification):
# uv method uv run scripts/cryptography/decrypt_setting.py "encrypted_value" # docker method docker exec fhir-mcp-server uv run scripts/cryptography/decrypt_setting.py "encrypted_value"
Encrypted Configuration Fields
The following fields are automatically encrypted when using EncryptedField:
FHIR_SERVER_CLIENT_SECRET- OAuth2 client secret for FHIR serverLOINC_PASSWORD- LOINC account passwordPINECONE_API_KEY- Pinecone API key for vector search
Environment Variables
Variable | Description | Example Value | Encryption |
MASTER_KEY | Master encryption key |
| Required |
FHIR_SERVER_HOST | FHIR API host URL |
| No |
FHIR_BASE_URL | FHIR base path |
| No |
FHIR_SERVER_CLIENT_ID | OAuth2 client ID for FHIR |
| No |
FHIR_SERVER_CLIENT_SECRET | OAuth2 client secret for FHIR |
| Yes |
LOINC_ENDPOINT | LOINC API search endpoint |
| No |
LOINC_USERNAME | LOINC account username |
| No |
LOINC_PASSWORD | LOINC account password |
| Yes |
PINECONE_API_KEY | Pinecone API key |
| Yes |
EMBEDDING_MODEL | Hugging Face embedding model name |
| No |
π οΈ MCP Tools
The FHIR MCP Server provides a comprehensive set of tools for interacting with FHIR resources and document management:
FHIR Resource Tools
Tool | Resource Type | Description |
| Patient | Manage patient demographic and administrative information |
| Observation | Handle clinical measurements and assessments |
| Condition | Manage patient problems and diagnoses |
| Medication | Handle medication information and orders |
| Immunization | Manage vaccination records |
| Encounter | Handle patient visits and interactions |
| AllergyIntolerance | Manage patient allergy information |
| FamilyMemberHistory | Handle family health history |
| Any FHIR Resource | Operate on any FHIR resource not covered by specific tools |
Document Management Tools
Tool | Description |
| Manage FHIR DocumentReference resources |
| Ingests documents into the vector database for semantic search |
| Performs semantic search across indexed documents using vector embeddings |
LOINC Terminology Tools
Tool | Description |
| Retrieves standardized LOINC codes for medical observations and laboratory tests |
Tool Features
Full Resource Management: All FHIR resource tools support Create, Read, Update, and Delete operations
Data Validation: Tools enforce FHIR resource validation and prevent data corruption
Error Handling: Comprehensive error responses with detailed failure information
Security: OAuth2 authentication and proper access control for all operations
Semantic Search: AI-powered document search using vector embeddings
Multi-format Support: Document ingestion supports TXT, PDF, CSV, and JSON formats
πΊοΈ Roadmap
We're continuously enhancing FHIR MCP Server with new capabilities. Here's what's on the horizon:
Extended Authentication Options: In addition to OAuth2 (already supported), we plan to add support for other authentication methods for connecting to FHIR servers
Expanded File Format Support for RAG: Extend document ingestion capabilities to support additional formats
Table-Aware Document Chunking: Improve the document chunking pipeline by detecting tables in documents and treating them as separate, atomic chunks.
OCR Support for Scanned Documents: Implement Optical Character Recognition capabilities to enable extraction of text from scanned PDFs and image files before chunking and indexing
Have a suggestion? We'd love to hear from you! Contact us or contribute directly.
π₯ Contributors
π License
Distributed under the MIT License. See MIT License for more information.
Available Tools
13 toolsadd_document_to_pineconeB
IMPORTANT: Always inform the user at the beginning of your response that this search operation may take some time because the embedding model will be loaded into cache. Adds a document to the Pinecone vector index for the specified FHIR DocumentReference ID.
This tool should be used to ingest new documents into the Pinecone index.
Rules: - If you cannot determine the format of the document fitting the format from the list, provide the format as None. - After adding the document, the Pinecone index may take up to 1 minute to update before the document is searchable.
Args: url (str): The URL of the document to be added. fhir_document_id (str): The ID of the FHIR DocumentReference resource corresponding to the document. format (literal | None): The format of the document.
Returns: str: Confirmation message that the document was added or already exists. PineconeError: Error object with a message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| document | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It mentions that the embedding model is loaded into cache (causing delay), that the index may take up to 1 minute to update, and describes the return values. This provides substantial insight beyond the schema, though the 'search operation' wording slightly tarnishes clarity.
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 organized into sections (IMPORTANT note, description, rules, args, returns) but is verbose. The opening note is long and confusing, and the phrase 'This tool should be used to ingest new documents' is somewhat redundant. The overall structure is usable but not concise or tightly 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?
The description covers the main purpose, usage, latency expectations, index update behavior, and return values. It lacks mention of prerequisites (e.g., FHIR DocumentReference existence) but is otherwise fairly complete for a document ingestion tool. The combination of annotations being absent and the output schema not being shown increases the usefulness of the provided Returns section.
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 schema has a single required 'document' object with nested fields (url, fhir_document_id, format), but the description's Args section lists 'url', 'fhir_document_id', and 'format' as if they were top-level parameters. This misrepresents the input structure and could lead the agent to pass arguments incorrectly. The description does add value by explaining each field, but the structural mismatch is a significant issue.
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 main sentence 'Adds a document to the Pinecone vector index for the specified FHIR DocumentReference ID' clearly states the verb and resource. However, the opening IMPORTANT note refers to 'this search operation', which is misleading since the tool is for adding documents, not searching. This contradicts the tool's name and confuses the agent's understanding of what the tool does.
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 explicitly states 'This tool should be used to ingest new documents into the Pinecone index', giving clear usage context. It also provides a rule about setting format to None when unknown. However, it does not explicitly mention when not to use this tool or alternatives like search_pinecone, though the distinction is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_loinc_codesA
Get the most relevant LOINC codes for a given observation name.
The function automatically:
Filters for STATUS="ACTIVE" codes only
Sorts by COMMON_TEST_RANK (lower rank = more commonly used)
Returns codes in popularity order (most common first)
Your job is to:
Analyze returned codes for semantic relevance to the search query
Balance clinical popularity with semantic matching
Select codes that best match the intended observation
Strategy:
Start with default parameters (max_codes=5, max_fetch=50)
Check if result contains "Error" key in first element
If "Authentication failed" or "Authorization" error:
STOP using this tool immediately.
Do not retry with different parameters.
Report the authentication error to the user.
Suggest they check their LOINC API credentials.
Ask the user if they want to use your knowledge to find a LOINC code and wait for the confirmation. Add warning that this may cause wrong results.
If "No active LOINC codes found in current fetch":
Increase max_fetch progressively (50β100β200βRecordsFound).
Keep trying until max_fetch >= RecordsFound or you find active codes.
If "No LOINC codes found": Try alternative search terms or report failure.
If you get codes but they don't semantically match your query:
Increase max_codes to see more options.
Look for better matches in COMPONENT, SHORTNAME, LONG_COMMON_NAME fields.
Rules:
Function returns codes sorted by popularity - YOU decide which are most relevant.
Don't automatically pick the first (most common) codes.
Prioritize semantic relevance: exact matches in COMPONENT > SHORTNAME > partial matches.
Balance popularity with relevance (very rare codes might not be clinically useful).
Keep increasing max_fetch until you exhaust all available records (max_fetch >= RecordsFound).
Increase max_codes only when you need more options to find better semantic matches.
Args: component_name: The name of the observation to get the LOINC code for (i.e. "glucose"). max_codes: The maximum number of LOINC codes to return. max_fetch: The maximum number of LOINC codes to fetch from the API. Returns: LOINC codes sorted by popularity - you must select the most semantically relevant ones.
| Name | Required | Description | Default |
|---|---|---|---|
| max_codes | No | ||
| max_fetch | No | ||
| component_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must reveal behavior. It discloses automatic STATUS='ACTIVE' filtering, COMMON_TEST_RANK sorting, popularity ordering, error key behavior, and authentication failure handling. This is rich and transparent.
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 lengthy and contains some redundancy (e.g., 'Don't automatically pick the first' appears in both Strategy and Rules). However, it is structured with headings and front-loaded with the core purpose. The length is mostly justified by the tool's complexity, but minor trimming would improve clarity.
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?
For a tool with no annotations and a multi-step usage pattern, the description covers purpose, behavior, error handling, parameter adjustment, and agent decision-making. It even discusses how to interpret results and select codes, making it complete for the intended use.
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 only names and defaults; the description adds meaning via an Args section: component_name example, max_codes as 'maximum number to return', max_fetch as 'maximum number to fetch from API'. It also explains how parameters interact (increase max_fetch progressively), fully compensating for 0% schema coverage.
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 opens with a clear, specific statement: 'Get the most relevant LOINC codes for a given observation name.' This identifies the verb, resource, and purpose. It further elaborates on automatic filtering and sorting, distinguishing it from sibling FHIR resource tools.
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?
Provides extensive guidance: a step-by-step strategy for selecting codes, handling errors, adjusting parameters, and when to suggest using the agent's own knowledge. It explicitly states when to stop (authentication errors) and suggests alternatives, exceeding the minimum for usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_allergy_intolerance_resourceA
Makes an HTTP request to the FHIR server. Use this tool to perform CRUD operations only on the FHIR AllergyIntolerance resource. Rules: - When creating or updating an allergy intolerance, use only the data explicitly provided by the user. - Do not guess, auto-fill, or assume any missing data. - When deleting an allergy intolerance, ask the user for confirmation with details of the allergy intolerance and wait for the user's confirmation. - Provide links to the app (not api) allergy intolerance resource in the final response.
Args: method: HTTP method (GET, POST, PUT, DELETE) path: Resource path (e.g., "/AllergyIntolerance", "/AllergyIntolerance?patient=Patient/123") body: Optional JSON data for POST/PUT requests)
Returns: JSON response from the FHIR server
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does a good job: it discloses the HTTP/CRUD nature, instructs to use only user-provided data, requires confirmation before deletion, and mentions providing links. It stops short of discussing authentication or error behavior, but covers important side-effect-related rules.
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 sections for purpose, rules, args, and returns. It is slightly lengthy due to operational rules, but each sentence adds meaningful guidance and none is redundant.
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 CRUD nature and absence of annotations, the description covers key usage constraints and return type. The lack of explicit auth notes and the args/schema mismatch are minor gaps, but overall it provides enough context for safe use.
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 description lists method, path, and body with examples and notes body is optional, which adds some value. However, it presents them as direct args while the actual input schema requires a single 'request' wrapper object, which could mislead an agent about the invocation structure. The schema also already provides descriptions for these nested properties.
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 it makes HTTP requests for CRUD operations specifically on the FHIR AllergyIntolerance resource, using a specific verb ('Makes an HTTP request') and resource. The name and sibling tools confirm distinct resource-specific purpose, so it is well differentiated.
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?
It explicitly says 'Use this tool to perform CRUD operations only on the FHIR AllergyIntolerance resource,' which provides clear scope and exclusion. It also includes operational rules (e.g., confirmation before delete, no auto-filling data), but does not explicitly name alternative tools for other resource types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_condition_resourceA
Makes an HTTP request to the FHIR server. Use this tool to perform CRUD operations only on the FHIR Condition resource. Rules: - When creating or updating a condition, use only the data explicitly provided by the user. - Do not guess, auto-fill, or assume any missing data. - When deleting a condition, ask the user for confirmation with details of the condition and wait for the user's confirmation. - Provide links to the app (not api) condition resource in the final response.
Args: method: HTTP method (GET, POST, PUT, DELETE) path: Resource path (e.g., "/Condition", "/Condition?patient=Patient/123") body: Optional JSON data for POST/PUT requests)
Returns: JSON response from the FHIR server
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
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 of behavioral disclosure. It specifies that only user-provided data should be used, not to guess or auto-fill missing data, to ask for confirmation before deleting, and to provide app links rather than api links. These are critical safety and usage behaviors beyond basic CRUD.
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 purpose statement, bullet-point rules, and an Args list. It is somewhat long but every section contributes value. The main purpose is front-loaded, making it easy for an agent to quickly understand the tool's function.
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?
The description provides a solid overview of the tool's purpose, parameters, return value, and special rules. It could include more about response format or error handling, but for a FHIR CRUD tool, the given information is sufficient for basic invocation. The presence of an output schema reduces the need for detailed return descriptions.
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 description includes an Args section that lists method, path, and body with examples and constraints, such as body being optional for POST/PUT. Although the schema provides some descriptions for these inner fields, the outer 'request' parameter is not self-explanatory, and the description's explicit examples add meaningful context beyond the schema.
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 makes HTTP requests and is specifically for CRUD operations on the FHIR Condition resource. This distinguishes it from sibling tools like request_patient_resource, which target other 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 explicitly says to use it 'only on the FHIR Condition resource', giving clear when-to-use guidance. It also provides operational rules for create/update/delete. However, it does not directly name alternative tools for other resources, though the 'only on' phrasing implies when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_document_reference_resourceA
Makes an HTTP request to the FHIR server. Use this tool to perform CRUD operations only on the FHIR DocumentReference resource. Rules: - When creating or updating a document reference, use only the data explicitly provided by the user. - Do not guess, auto-fill, or assume any missing data. - When deleting a document reference, ask the user for confirmation with details of the document and wait for the user's confirmation. - Provide links to the app (not api) document reference resource in the final response.
Args: method: HTTP method (GET, POST, PUT, DELETE) path: Resource path (e.g., "/DocumentReference", "/DocumentReference?patient=Patient/123") body: Optional JSON data for POST/PUT requests
Returns: JSON response from the FHIR server
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behavioral rules: not to guess missing data, ask for deletion confirmation, and provide app links. These are valuable beyond the schema. However, it does not mention error handling or response structure, but the output schema covers the latter.
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 structured with a brief intro, a clear 'Rules:' section, and an Args list. It is concise but includes necessary behavioral rules. Every sentence adds value, though the opening sentence is slightly redundant with the second.
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?
The description covers purpose, usage rules, parameters, and return value. It is complete for a CRUD tool with clear resource constraints, and the presence of an output schema reduces the need to describe return details. Minor gaps include authentication or pagination, but these are likely handled elsewhere.
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 description adds meaning beyond the schema by giving a concrete path example ('/DocumentReference?patient=Patient/123') and clarifying that body is for POST/PUT. The schema itself has basic descriptions, but the description's Args section enhances understanding. Despite low schema description coverage, the description compensates adequately.
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 performs CRUD operations specifically on the FHIR DocumentReference resource, distinguishing it from sibling resource-specific tools like request_patient_resource. It uses a specific verb ('Makes an HTTP request') and resource scope ('only on the FHIR DocumentReference resource').
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 explicitly states when to use the tool (for CRUD on DocumentReference) and provides rules: use only provided data, require confirmation for deletion, and return app links. This gives clear usage context and exclusions, even though it does not name alternatives explicitly, the 'only' suffices to differentiate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_encounter_resourceA
Makes an HTTP request to the FHIR server. Use this tool to perform CRUD operations only on the FHIR Encounter resource. Rules: - When creating or updating an encounter, use only the data explicitly provided by the user. - Do not guess, auto-fill, or assume any missing data. - When deleting an encounter, ask the user for confirmation with details of the encounter and wait for the user's confirmation. - Provide links to the app (not api) encounter resource in the final response.
Args: method: HTTP method (GET, POST, PUT, DELETE) path: Resource path (e.g., "/Encounter", "/Encounter?patient=Patient/123") body: Optional JSON data for POST/PUT requests)
Returns: JSON response from the FHIR server
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It includes important rules: requiring explicit user data for create/update, confirmation for delete, and providing app (not api) links. It also states the return type. While it doesn't elaborate on side effects or error handling, the given rules cover key behavioral expectations.
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 Rules, Args, and Returns sections, and it front-loads the purpose. Some redundancy exists (e.g., 'use only data explicitly provided' and 'Do not guess' are similar), but the overall length is appropriate for the tool's complexity.
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?
The description covers purpose, usage rules, and return type, which is useful. However, it fails to explain the required 'request' wrapper parameter, making the invocation structure unclear. Given the nested schema and output schema present, this omission impacts completeness for correct 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?
The description lists 'method', 'path', and 'body' as direct arguments, but the input schema defines a single required 'request' object containing these fields. This omission is misleading and could cause an agent to construct arguments incorrectly. The description does provide examples for path and clarifies body usage, but the missing wrapper structure is a critical gap.
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 makes HTTP requests to the FHIR server and performs CRUD operations specifically on the Encounter resource. The phrase 'only on the FHIR Encounter resource' differentiates it from sibling tools for other 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 explicitly states when to use the tool ('to perform CRUD operations only on the FHIR Encounter resource') and provides operation-specific rules (e.g., confirm before delete, use only user-provided data for create/update). However, it does not explicitly mention alternatives or when not to use it beyond the resource restriction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_family_member_history_resourceA
Makes an HTTP request to the FHIR server. Use this tool to perform CRUD operations only on the FHIR FamilyMemberHistory resource. Rules: - When creating or updating a family member history, use only the data explicitly provided by the user. - Do not guess, auto-fill, or assume any missing data. - When deleting a family member history, ask the user for confirmation with details of the family member history and wait for the user's confirmation. - Provide links to the app (not api) family member history resource in the final response.
Args: method: HTTP method (GET, POST, PUT, DELETE) path: Resource path (e.g., "/FamilyMemberHistory", "/FamilyMemberHistory?patient=Patient/123") body: Optional JSON data for POST/PUT requests)
Returns: JSON response from the FHIR server
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
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 transparency burden. It discloses important behaviors: no auto-fill of missing data, mandatory user confirmation for deletions, and the requirement to return app links. However, it omits details like authentication, error handling, or rate limits, so it is not fully comprehensive.
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 structured with a brief opening, a rules list, and an args section. It is longer than average but every sentence adds useful information. The rules are clear and easy to follow, though the args section could be more concise by matching the schema hierarchy.
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?
The description covers the tool's resource scope, core behaviors, and return format, which is good. However, the mismatch between the described arguments and the actual nested schema is a significant gap. It lacks a concrete example of a full JSON request object, making end-to-end invocation less certain.
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 schema's top-level parameter 'request' has no description (0% coverage), so the description must compensate. It lists method, path, and body with examples and says body is optional, which adds value. However, it presents them as flat arguments, not nested under 'request', which contradicts the actual schema structure and could mislead an agent into constructing an invalid invocation.
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 makes an HTTP request to the FHIR server and limits usage to CRUD operations on the FamilyMemberHistory resource. The phrase 'only on the FHIR FamilyMemberHistory resource' explicitly distinguishes it from sibling resource-specific tools.
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 explicit usage rules: it is for CRUD on FamilyMemberHistory, and it gives specific behavioral guidance (e.g., use only user-provided data, do not guess, ask confirmation before delete, provide app links). This clearly states when to use and when to confirm, though it does not name alternatives beyond the resource scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_generic_resourceA
Makes an HTTP request to the FHIR server. Use this tool to perform CRUD operations on any FHIR resource ONLY if the other tools are not applicable.
Rules: - When creating or updating a resource, use only the data explicitly provided by the user. - Do not guess, auto-fill, or assume any missing data. - When deleting a resource, ask the user for confirmation with details of the resource and wait for the user's confirmation. - Provide links to the app (not api) resource in the final response.
Args: method: HTTP method (GET, POST, PUT, DELETE) path: Resource path body: Optional JSON data for POST/PUT requests)
Returns: JSON response from the FHIR server
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It goes beyond basic HTTP request semantics by stating that missing data must not be guessed, deletion requires user confirmation, and final responses must include app links rather than API links. These are useful behavioral constraints. It does not cover error handling or authorization, but the provided rules are substantial.
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: a purpose sentence, a usage condition, concise numbered rules, an Args section, and a Returns line. It is front-loaded with the most important information and avoids fluff. The Args section duplicates some schema content but is acceptable for a generic tool.
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?
The tool is a generic FHIR CRUD operation, and the description covers purpose, scope, safety rules, parameters, and return type. An output schema exists, so return details are already structured. It lacks error handling details and concrete resource path examples, but for a fallback generic tool, the description is reasonably complete.
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 top-level schema parameter 'request' has no description (0% coverage), so the description must compensate. The 'Args' section lists method, path, and body with brief explanations, and clarifies that body is optional for POST/PUT. However, this adds little beyond the nested schema's existing field descriptions, and it does not explain path formatting or provide examples. It is adequate but not rich.
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 'Makes an HTTP request to the FHIR server' and explicitly says it performs 'CRUD operations on any FHIR resource'. It distinguishes from siblings by adding 'ONLY if the other tools are not applicable', which positions it as a fallback for any resource not covered by specific tools.
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 gives explicit when-to-use guidance: 'Use this tool ... ONLY if the other tools are not applicable'. It also provides practical rules for deletion (ask for confirmation) and data integrity (do not guess or auto-fill). It does not name the specific alternative sibling tools, so it is slightly less explicit than the high standard, but the conditional is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_immunization_resourceA
Makes an HTTP request to the FHIR server. Use this tool to perform CRUD operations only on the FHIR Immunization resource. Rules: - When creating or updating an immunization, use only the data explicitly provided by the user. - Do not guess, auto-fill, or assume any missing data. - When deleting an immunization, ask the user for confirmation with details of the immunization and wait for the user's confirmation. - Provide links to the app (not api) immunization resource in the final response.
Args: method: HTTP method (GET, POST, PUT, DELETE) path: Resource path (e.g., "/Immunization", "/Immunization?patient=Patient/123") body: Optional JSON data for POST/PUT requests)
Returns: JSON response from the FHIR server
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
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. It discloses critical behaviors: do not guess or auto-fill missing data, require confirmation before deletion, and provide app links rather than API links. It does not cover auth or error behavior, but the key safety-relevant behaviors are well documented.
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-organized with a purpose statement, a rules list, and an Args section. The rules are detailed but each adds operational value, so the length is justified.
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?
The tool has an output schema, and the description covers resource scope, CRUD operations, data fidelity, and deletion confirmation. For a resource-specific CRUD tool with multiple siblings, this is fairly complete, though it omits authentication requirements and explicit handling of the request-wrapping parameter structure.
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 Args section gives useful examples for path (e.g., '/Immunization?patient=Patient/123') and clarifies body usage for POST/PUT. However, it lists method/path/body as top-level arguments and fails to mention the required 'request' wrapper object from the schema, which could lead to incorrect invocation.
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 explicitly states it makes HTTP requests and 'perform[s] CRUD operations only on the FHIR Immunization resource,' using a specific verb and resource. This clearly distinguishes it from sibling tools like request_patient_resource or request_generic_resource.
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 clearly states when to use the tool: for CRUD operations on the Immunization resource only. It also provides operational rules around creating/updating (use only provided data) and deleting (require user confirmation), but it does not explicitly name alternative tools for non-Immunization resources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_medication_resourceA
Makes an HTTP request to the FHIR server. Use this tool to perform CRUD operations only on the FHIR Medication resource. Rules: - When creating or updating a medication, use only the data explicitly provided by the user. - Do not guess, auto-fill, or assume any missing data. - When deleting a medication, ask the user for confirmation with details of the medication and wait for the user's confirmation. - Provide links to the app (not api) medication resource in the final response.
Args: method: HTTP method (GET, POST, PUT, DELETE) path: Resource path (e.g., "/Medication", "/Medication?code=aspirin") body: Optional JSON data for POST/PUT requests)
Returns: JSON response from the FHIR server
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It reveals critical behaviors: not auto-filling missing data during create/update, requiring user confirmation before deletion, and returning app links instead of API links. These are non-obvious behaviors that an agent must know to invoke the tool safely and correctly.
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 opening statement, a rules list, and an Args section. It is slightly longer than necessary but every sentence provides value, and the formatting improves scannability.
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?
The description covers purpose, usage rules, parameter semantics, and return type. It lacks explicit error-handling or edge-case information, but given that an output schema exists and the tool is straightforward CRUD, it is sufficiently complete for an agent to invoke it correctly in most scenarios.
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?
Although the input schema contains descriptions, the context signal reports 0% schema description coverage. The description compensates by providing an Args section with examples for path ('/Medication', '/Medication?code=aspirin') and clarifying that body is optional for POST/PUT. This adds practical meaning beyond the schema's bare definitions.
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 it makes HTTP requests to the FHIR server and explicitly limits usage to CRUD operations on the Medication resource. This differentiates it from sibling resource-specific tools such as request_patient_resource, making the purpose unmistakable.
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 explicitly says 'Use this tool to perform CRUD operations only on the FHIR Medication resource,' which is a direct usage directive. It also provides conditional rules: do not guess data for create/update, ask for confirmation before delete, and provide app links in responses. These guidelines clearly indicate when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_observation_resourceA
Makes an HTTP request to the FHIR server. Use this tool to perform CRUD operations only on the FHIR Observation resource. Rules: - When creating or updating an observation, use only the data explicitly provided by the user. - Do not guess, auto-fill, or assume any missing data. - When deleting an observation, ask the user for confirmation with details of the observation and wait for the user's confirmation. - Provide links to the app (not api) observation resource in the final response.
Args: method: HTTP method (GET, POST, PUT, DELETE) path: Resource path (e.g., "/Observation", "/Observation?subject=Patient/123") body: Optional JSON data for POST/PUT requests)
Returns: JSON response from the FHIR server
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosure. It explains important behaviors: no auto-filling missing data, delete confirmation requirement, and providing app links. It stops short of discussing authentication, error handling, or the direct HTTP proxy nature, but covers the most safety-relevant aspects.
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-organized: purpose, rules, args, return. It is front-loaded with the key purpose and every section adds value. No redundant or filler content.
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?
The description provides a good overall picture, including CRUD constraints and return type, but the input structure mismatch means an agent cannot reliably invoke it without inspecting the schema closely. Given the tool's simplicity and available output schema, this is a moderate gap rather than severe incompleteness.
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 description lists method, path, and body as if they were top-level arguments, but the input schema expects a single 'request' object containing these fields. This mismatch could mislead an agent into constructing an invalid request. The description does add useful examples and constraints for the nested fields, but the missing wrapper is a critical gap.
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 makes HTTP requests to a FHIR server and is specifically for CRUD operations on the Observation resource. It distinguishes itself from sibling tools by naming the resource type and explicitly limiting scope to Observation.
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?
It provides explicit guidance on when to use the tool ('only on the FHIR Observation resource'), and gives concrete behavioral rules such as using only user-provided data and asking confirmation before deletion. It does not name alternatives explicitly, but the resource-specific scoping makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_patient_resourceA
Makes an HTTP request to the FHIR server. Use this tool to perform CRUD operations only on the FHIR Patient resource. Rules: - When creating or updating a patient, use only the data explicitly provided by the user. - Do not guess, auto-fill, or assume any missing data. - When deleting a patient, ask the user for confirmation with details of the patient and wait for the user's confirmation. - Provide links to the app (not api) patient resource in the final response.
Args: method: HTTP method (GET, POST, PUT, DELETE) path: Resource path (e.g., "/Patient", "/Patient?name=John%20Doe") body: Optional JSON data for POST/PUT requests)
Returns: JSON response from the FHIR server
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
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 of behavioral disclosure. It adds meaningful context around data integrity (no guessing/auto-filling), deletion confirmation, and response linking. However, it does not cover auth requirements, error handling, or rate limits, so it is not fully comprehensive.
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 has a clear structure: purpose, rules, args, and return value. It is somewhat verbose but every rule adds useful behavioral guidance. The front-loaded purpose makes it easy to scan.
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?
The tool is resource-specific and the description covers key CRUD safety rules and return type. However, it omits the nested request parameter structure, authentication/error behavior, and lacks a detailed output schema. Given the complexity of a generic FHIR request tool, this is a moderate gap.
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 defines a single required 'request' object containing method, path, and body, but the description lists 'method', 'path', and 'body' as top-level Args without mentioning the 'request' wrapper. This mismatch can mislead an agent into constructing an invalid call. The schema descriptions are minimal, and the description adds only path examples, not enough to compensate for the confusing structure.
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 it makes HTTP requests to the FHIR server and restricts usage to CRUD operations on the FHIR Patient resource only. This specific verb+resource combination distinguishes it from sibling tools like request_observation_resource or request_medication_resource.
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 usage rules: do not auto-fill data when creating/updating, require confirmation before deletion, and provide app links in responses. It also explicitly scopes the tool to Patient only, which serves as an exclusion for other resources, but it does not name alternative tools explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_pineconeA
IMPORTANT: Always inform the user at the beginning of your response that this search operation may take some time because the embedding model will be loaded into cache. Searches the Pinecone vector index for information related to the given document by FHIR DocumentReference ID.
Use this tool when the user requests information from the documents, notes, etc.
Rules: - Firstly, prepare fhir_document_id by running the appropriate tool. - If the error message "Document does not exist in Pinecone index" is returned, automatically trigger the 'add_document_to_pinecone' tool to add the missing document to the index. - Translate the user's query into the language of the document before performing the search. - Base all answers strictly on the content found in the Pinecone index documents. - If the user's question is unrelated to the indexed documents, respond that the information is not available in the documents. - If the query is unclear or ambiguous, ask the user to clarify or provide more details. - You can modify the query to make it more specific and relevant to the document.
Args: query (str): The user's search query. fhir_document_id (str): The ID of the FHIR DocumentReference resource to search within - it is the same as the FHIR ID of the document. top_k (int, optional): The maximum number of search results to return. Defaults to 10.
Returns: list[PineconeSearchResponse]: List of search results matching the query. PineconeError: Error object with a message if the search fails.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| top_k | No | ||
| fhir_document_id | Yes |
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 embedding model loading delay and instructs to warn the user, auto-triggering of add_document_to_pinecone on missing document, query translation, strict answer grounding, and clarification handling. This is rich behavioral context beyond a simple search 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 an IMPORTANT note and bulleted rules. Every sentence serves a purposeβcovering user warnings, usage context, prerequisites, error handling, and query processing rules. It is appropriately sized for the tool's complexity.
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?
The description covers all three parameters, return type (list of PineconeSearchResponse), error handling, and the full workflow from preparation to answer generation. It is self-sufficient even without annotations or explicit output schema detail.
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 Args section explains each parameter with meaning and default: query is the user's search query, fhir_document_id matches the FHIR DocumentReference ID, and top_k defaults to 10. Since schema description coverage is 0%, this parameter detail is essential and fully compensates.
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 action: 'Searches the Pinecone vector index for information related to the given document by FHIR DocumentReference ID.' This specifies the verb, resource, and scope, and differentiates from sibling tools like add_document_to_pinecone and resource requesters.
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?
It explicitly says when to use the tool ('when the user requests information from the documents, notes'), provides prerequisites (prepare fhir_document_id by running the appropriate tool), and describes when not to use it (unrelated questions). It also names the alternative add_document_to_pinecone for error handling, making the usage guidance comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each request_<resource>_resource tool targets a distinct FHIR resource type, and the Pinecone/LOINC tools have clear separate purposes. However, the many similar request_resource wrappers could lead to accidental selection of the wrong resource, and request_generic_resource may be confused with the specific ones.
The dominant request_<resource>_resource pattern is consistent, but get_loinc_codes, add_document_to_pinecone, and search_pinecone deviate with different verb styles, creating a mixed naming convention. This is readable but not fully predictable.
13 tools is well-scoped for a FHIR MCP server, covering common clinical resources plus LOINC lookup and document search. Each tool has a clear purpose and the count is neither too thin nor overwhelming.
The server covers a broad set of FHIR resources (Patient, Observation, Medication, Condition, AllergyIntolerance, Encounter, Immunization, DocumentReference, FamilyMemberHistory) and provides a generic fallback for any other resource. Minor gaps exist (no dedicated cross-resource search or batch operations) but agents can work around them.
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
Hosted MCP server for the Healthie EHR & telehealth API: patients, appointments, charting, tasks.
Hosted MCP server exposing US hospital procedure cost data to AI assistants
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Hosted MCP server for Cliniko β patients, appointments, availability, and invoices for AI agents.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA comprehensive MCP server that bridges AI applications with FHIR healthcare data systems, enabling patient data access, clinical data retrieval, and data quality assessment.4
- AlicenseNot gradedqualityDmaintenanceAn MCP server that brings AI-powered search and conversation to your FHIR clinical documents.1MIT

LangCare MCP FHIR Serverofficial
AlicenseNot gradedqualityDmaintenanceEnterprise-grade MCP Server for FHIR-based EMRs. Enables AI agents to read, search, create, and update any FHIR R4 resource across major EHR systems like EPIC, Cerner, and OpenEMR.14753MIT
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/maheshbalan/fhir-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server