Skip to main content
Glama
maheshbalan

FHIR MCP Server

by maheshbalan

Contact us Visit Momentum MIT License

πŸ“‹ 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_resource tool which retrieves basic patient information

  • utilization of the request_condition_resource tool to answer the question whether any of the previously diagnosed diseases may cause symptoms that the patient is currently complaining about

  • utilization of the request_medication_resource, request_encounter_resource, request_generic_resource tools 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

    πŸ‘‰ uv Installation Guide

  • 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.

    πŸ‘‰ Create Pinecone Account

  • 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.

    πŸ‘‰Create LOINC Account

Installation & Setup

  1. Clone the repository:

    git clone https://github.com/the-momentum/fhir-mcp-server
    cd fhir-mcp-server
  2. Set up environment variables:

    cp config/.env.example config/.env

    Edit the config/.env file with your credentials and configuration. See Environment Variables

  3. Install Dependencies

    For Docker-based execution run:

    make build

    For uv-based execution run:

    make uv
  4. Update 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 installation

  • uv

    Firstly, get uv path from terminal:

    • Windows:

      (Get-Command uv).Path
    • MacOS/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)

  1. 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.py

This script will:

  1. Check for MASTER_KEY in config/.env and generate one if needed

  2. Automatically encrypt all sensitive values (LOINC_PASSWORD, FHIR_SERVER_CLIENT_SECRET, PINECONE_API_KEY)

  3. Update your .env file with encrypted values

  4. Skip empty variables and already encrypted values

  1. 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.py

    Put that key as a MASTER_KEY environment variable in .env.

  2. 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"
  3. 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 server

  • LOINC_PASSWORD - LOINC account password

  • PINECONE_API_KEY - Pinecone API key for vector search

Environment Variables

Variable

Description

Example Value

Encryption

MASTER_KEY

Master encryption key

gAAAAABl...

Required

FHIR_SERVER_HOST

FHIR API host URL

https://api.medplum.com

No

FHIR_BASE_URL

FHIR base path

/fhir/R4

No

FHIR_SERVER_CLIENT_ID

OAuth2 client ID for FHIR

019720e7...

No

FHIR_SERVER_CLIENT_SECRET

OAuth2 client secret for FHIR

gAAAAABl...

Yes

LOINC_ENDPOINT

LOINC API search endpoint

https://loinc.regenstrief.org/searchapi/loincs

No

LOINC_USERNAME

LOINC account username

loinc-user

No

LOINC_PASSWORD

LOINC account password

gAAAAABl...

Yes

PINECONE_API_KEY

Pinecone API key

gAAAAABl...

Yes

EMBEDDING_MODEL

Hugging Face embedding model name

NeuML/pubmedbert-base-embeddings

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

request_patient_resource

Patient

Manage patient demographic and administrative information

request_observation_resource

Observation

Handle clinical measurements and assessments

request_condition_resource

Condition

Manage patient problems and diagnoses

request_medication_resource

Medication

Handle medication information and orders

request_immunization_resource

Immunization

Manage vaccination records

request_encounter_resource

Encounter

Handle patient visits and interactions

request_allergy_intolerance_resource

AllergyIntolerance

Manage patient allergy information

request_family_member_history_resource

FamilyMemberHistory

Handle family health history

request_generic_resource

Any FHIR Resource

Operate on any FHIR resource not covered by specific tools

Document Management Tools

Tool

Description

request_document_reference_resource

Manage FHIR DocumentReference resources

add_document_to_pinecone

Ingests documents into the vector database for semantic search

search_pinecone

Performs semantic search across indexed documents using vector embeddings

LOINC Terminology Tools

Tool

Description

get_loinc_codes

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 tools
add_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose3/5

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.

Usage Guidelines4/5

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:

  1. Analyze returned codes for semantic relevance to the search query

  2. Balance clinical popularity with semantic matching

  3. Select codes that best match the intended observation

Strategy:

  1. Start with default parameters (max_codes=5, max_fetch=50)

  2. Check if result contains "Error" key in first element

  3. 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.

  4. 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.

  5. If "No LOINC codes found": Try alternative search terms or report failure.

  6. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_codesNo
max_fetchNo
component_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
top_kNo
fhir_document_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

A3.9/5.0
Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that enables querying FHIR healthcare data using natural language, allowing doctors to retrieve patient information, medications, observations, and other healthcare records.
    1
  • F
    license
    Not graded
    quality
    D
    maintenance
    A comprehensive MCP server that bridges AI applications with FHIR healthcare data systems, enabling patient data access, clinical data retrieval, and data quality assessment.
    4

Latest Blog Posts

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