Skip to main content
Glama
sdesani

FHIR MCP Server

by sdesani

FHIR MCP Server

A Model Context Protocol (MCP) server for interacting with FHIR APIs, specifically designed for Oracle Millennium Platform APIs. This server provides comprehensive tools for accessing various FHIR resources including Patient records, Clinical data, and Administrative information.

Features

  • OAuth2 Authentication: Secure API access using bearer token authentication

  • Comprehensive FHIR Resources: Support for 10+ FHIR resource types

  • Patient Search: Multiple search capabilities (name, identifier, birthdate, phone, email, address)

  • Clinical Data: Access to allergies, conditions, procedures, observations, and immunizations

  • Medications & Diagnostics: Retrieve medication requests and diagnostic reports

  • Appointments & Encounters: Manage patient appointments and clinical encounters

  • Asynchronous Operations: Efficient async/await implementation for better performance

Related MCP server: FHIR MCP Server

Supported FHIR Resources

  1. Patient - Demographics and patient information

  2. AllergyIntolerance - Patient allergy and intolerance records

  3. Condition - Medical conditions and diagnoses

  4. Procedure - Medical procedures performed

  5. Encounter - Patient encounters and visits

  6. DiagnosticReport - Diagnostic reports and results

  7. Observation - Clinical observations (vital signs, lab results)

  8. Immunization - Immunization records

  9. MedicationRequest - Medication prescriptions and requests

  10. Appointment - Scheduled appointments

Installation

Prerequisites

  • Python 3.13 or higher

  • uv package manager (recommended) or pip

Setup

  1. Clone the repository:

git clone <repository-url>
cd fhir-mcp-server
  1. Install dependencies using uv:

uv sync

Or using pip:

pip install -e .
  1. Configure environment variables:

Create a .env file in the project directory and set your FHIR server details:

FHIR_BASE_URL=https://your-fhir-server.com/r4
OAUTH_BEARER_TOKEN=your_oauth2_bearer_token

The .env file should contain:

  • FHIR_CLIENT_ID: Your OAuth2 client ID from the FHIR server provider

  • FHIR_CLIENT_SECRET: Your OAuth2 client secret from the FHIR server provider

  • FHIR_BASE_URL: The base URL of your FHIR R4 server endpoint

  • FHIR_TENANT_ID: (Optional) Your tenant ID, defaults to Oracle Cerner sandbox

  • FHIR_SCOPE: (Optional) OAuth2 scopes, defaults to all supported resources

  • FHIR_REQUEST_TIMEOUT: (Optional) Request timeout in seconds, default is 60

Configuration

Environment Variables

Variable

Description

Required

Default

FHIR_CLIENT_ID

OAuth2 client ID for authentication

Yes

None

FHIR_CLIENT_SECRET

OAuth2 client secret for authentication

Yes

None

FHIR_BASE_URL

Base URL of the FHIR server

No

https://fhir-ehr.cerner.com/r4

FHIR_TENANT_ID

Tenant ID for your FHIR server instance

No

ec2458f2-1e24-41c8-b71b-0e701af7583d

FHIR_TOKEN_ENDPOINT

OAuth2 token endpoint URL

No

Auto-generated from tenant ID

FHIR_SCOPE

OAuth2 scopes (space-separated)

No

All supported resources

FHIR_REQUEST_TIMEOUT

Request timeout in seconds

No

60.0

OAuth2 Authentication

This server uses OAuth 2.0 Client Credentials flow for system-to-system authentication, following Oracle Cerner's SMART Backend Services specification.

Application Registration

Before using this server, you must register your application with Oracle Cerner to obtain client credentials:

  1. Create a CernerCare Account

  2. Register Your Application

    • Log in to the Code Console

    • Navigate to "My Applications" and click "Register New Application"

    • Choose application type:

      • System - For backend services and automated systems

      • Confidential - For applications that can securely store credentials

    • Provide application details:

      • Application name

      • Description

      • Redirect URIs (not required for client credentials flow)

    • Complete the registration process

  3. Obtain Credentials

    • After registration, you'll receive:

      • Client ID - Your application's unique identifier

      • Client Secret - Managed through Cerner Central system accounts

    • Store these credentials securely

  4. Configure FHIR Scopes

    Note: Scope format varies based on type of token requested. Below scopes format are for SMART V2 Token:

    Request the following system-level scopes for your application (SMART v1 format):

    • system/Patient.rs - Read access to patient resources

    • system/Observation.rs - Read access to observation resources

    • system/Condition.rs - Read access to condition resources

    • system/Procedure.rs - Read access to procedure resources

    • system/Encounter.rs - Read access to encounter resources

    • system/DiagnosticReport.rs - Read access to diagnostic reports

    • system/AllergyIntolerance.rs - Read access to allergy information

    • system/Immunization.rs - Read access to immunization records

    • system/MedicationRequest.rs - Read access to medication requests

    • system/Appointment.rs - Read access to appointments

Token Endpoint

The server automatically manages OAuth 2.0 tokens using Oracle Cerner's token endpoint:

https://authorization.cerner.com/tenants/{TENANT_ID}/hosts/fhir-ehr.cerner.com/protocols/oauth2/profiles/smart-v1/token

Default tenant ID: ec2458f2-1e24-41c8-b71b-0e701af7583d (Oracle Cerner Sandbox)

Automatic Token Management

The server automatically:

  • Requests access tokens using client credentials on first API call

  • Caches tokens until expiry

  • Refreshes tokens automatically when needed (with 5-minute buffer before expiry)

  • Handles token errors gracefully

Additional Resources

For more information about Oracle Cerner's authorization framework:

Usage

Running the Server

Run the MCP server using:

python fhir-mcp-server.py

Or if using uv:

uv run python fhir-mcp-server.py

Using with Claude Desktop or Cursor

For Claude Desktop:

Add the following configuration to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "fhir": {
      "command": "uv",
      "args": [
        "run",
        "--with",
        "fastmcp",
        "fastmcp",
        "run",
        "/absolute/path/to/fhir-mcp-server/fhir-mcp-server.py"
      ],
      "env": {
        "FHIR_CLIENT_ID": "your_client_id",
        "FHIR_CLIENT_SECRET": "your_client_secret",
        "FHIR_BASE_URL": "https://fhir-ehr.cerner.com/r4",
        "FHIR_TENANT_ID": "your_tenant_id"
      }
    }
  }
}

Important: Replace /absolute/path/to/fhir-mcp-server/fhir-mcp-server.py with the actual full path to the script!

For Cursor IDE:

Add the same configuration to Cursor's MCP settings. See QUICKSTART.md for detailed Cursor-specific instructions including:

  • Where to find Cursor's MCP configuration

  • UI-based setup options

  • Cursor-specific troubleshooting

Available Tools

Patient Tools

  • get_patient_by_id - Retrieve a patient by ID

  • search_patients_by_name - Search patients by given/family name

  • search_patients_by_identifier - Search by identifier (MRN, SSN, etc.)

  • search_patients_by_birthdate - Search by birth date

  • search_patients_by_phone - Search by phone number

  • search_patients_by_email - Search by email address

  • search_patients_by_address - Search by address components

Clinical Data Tools

  • get_allergy_by_id / get_patient_allergies - Allergy information

  • get_condition_by_id / get_patient_conditions - Medical conditions

  • get_procedure_by_id / get_patient_procedures - Procedures

  • get_observation_by_id / get_patient_observations - Observations

  • get_patient_vital_signs - Vital signs specifically

  • get_patient_lab_results - Laboratory results

  • get_immunization_by_id / get_patient_immunizations - Immunizations

Diagnostic & Medication Tools

  • get_diagnostic_report_by_id / get_patient_diagnostic_reports - Diagnostic reports

  • get_medication_request_by_id / get_patient_medication_requests - Medications

Encounter & Appointment Tools

  • get_encounter_by_id / get_patient_encounters - Patient encounters

  • get_appointment_by_id / get_patient_appointments - Appointments

  • search_appointments_by_date - Search appointments by date

Utility Tools

  • get_fhir_capability_statement - Get FHIR server capabilities

Example Usage

Example 1: Search for a Patient

# Search for patients by name
result = await search_patients_by_name(
    given_name="John",
    family_name="Doe"
)

Example 2: Get Patient's Medical History

# Get patient's conditions
conditions = await get_patient_conditions(
    patient_id="12345",
    clinical_status="active"
)

# Get patient's allergies
allergies = await get_patient_allergies(
    patient_id="12345"
)

# Get patient's vital signs
vitals = await get_patient_vital_signs(
    patient_id="12345",
    date="2024-01-01"
)

Example 3: Retrieve Appointments

# Get upcoming appointments for a patient
appointments = await get_patient_appointments(
    patient_id="12345",
    status="booked",
    date="ge2024-01-01"  # Greater than or equal to date
)

API Reference Documentation

This server implements tools based on the following Oracle Millennium Platform API documentation:

FHIR Standards

This server follows the FHIR R4 specification for resource structures and search parameters.

Error Handling

The server will raise HTTP exceptions for:

  • Authentication failures (401 Unauthorized)

  • Missing resources (404 Not Found)

  • Server errors (500 Internal Server Error)

  • Invalid requests (400 Bad Request)

All exceptions include detailed error messages from the FHIR server response.

Troubleshooting

ModuleNotFoundError: No module named 'httpx' (or other dependencies)

Problem: Claude Desktop shows ModuleNotFoundError when trying to load the MCP server.

Solution: Make sure you've installed dependencies first:

cd /Users/sdesani/Work/fhir-mcp-server
uv sync

Your Claude Desktop config should use the fastmcp run pattern:

{
  "command": "uv",
  "args": [
    "run",
    "--with",
    "fastmcp",
    "fastmcp",
    "run",
    "/absolute/path/to/fhir-mcp-server/fhir-mcp-server.py"
  ]
}

This uses uv run --with fastmcp to dynamically install FastMCP, then runs your script which will use the installed dependencies from your project's .venv.

Other Common Issues

Server not appearing in Claude Desktop:

  • Restart Claude Desktop after updating the config

  • Check for JSON syntax errors in claude_desktop_config.json

  • Verify the file path is absolute (starts with /)

401 Unauthorized errors:

  • Verify your OAuth token is valid and not expired

  • Check the token has the correct scopes/permissions

Timeout errors:

  • Increase FHIR_REQUEST_TIMEOUT in your .env file or Claude Desktop config

  • Default is 60 seconds, try 120 or higher for slow servers

Security Considerations

  • Credential Management:

    • Never commit your .env file or credentials to version control

    • Store FHIR_CLIENT_ID and FHIR_CLIENT_SECRET securely

    • Use environment variables or secure credential management systems

    • Rotate credentials regularly according to your organization's security policies

  • OAuth 2.0 Security:

    • The server uses OAuth 2.0 Client Credentials flow for secure system-to-system authentication

    • Tokens are automatically cached and refreshed

    • Follow the Application Registration steps to obtain valid credentials

  • HTTPS Only: Always use HTTPS endpoints for production FHIR servers

  • Scope Management:

    • Request only the minimum required scopes for your application

    • Review and update scopes as your application requirements change

    • See Application Registration for available scopes

  • PHI Protection:

    • Be mindful that FHIR resources contain Protected Health Information (PHI)

    • Ensure compliance with healthcare data privacy regulations (HIPAA, GDPR, etc.)

    • Implement appropriate access controls and audit logging

    • Follow your organization's data handling policies

  • SMART Compliance:

    • This server follows the SMART Backend Services specification

    • Ensures secure healthcare application integration

Development

Project Structure

fhir-mcp-server/
├── fhir-mcp-server.py   # MCP server implementation
├── pyproject.toml       # Project dependencies and metadata
├── .env                 # Your local configuration (not committed)
├── .gitignore          # Git ignore rules
├── README.md           # This file
├── QUICKSTART.md       # Quick start guide
└── EXAMPLES.md         # Usage examples

Adding New FHIR Resources

To add support for additional FHIR resources:

  1. Add a new tool function decorated with @mcp.tool()

  2. Use the make_fhir_request() helper function

  3. Follow the existing pattern for parameters and return types

  4. Update this README with the new tool information

Testing

Test the server by running it and connecting through an MCP client like Cursor or using the MCP Inspector tool.

License

[Add your license information here]

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Support

For issues related to:

  • FHIR Server: Contact your FHIR server administrator

  • Oracle Millennium Platform: Refer to Oracle documentation

  • This MCP Server: Open an issue in this repository

Additional Documentation

  • QUICKSTART.md - Quick start guide with setup instructions for Claude Desktop and Cursor

  • EXAMPLES.md - Comprehensive usage examples

Acknowledgments

Available Tools

29 tools
get_allergy_by_idB

Retrieve a specific allergy intolerance by ID.

Args: allergy_id: The FHIR AllergyIntolerance ID

Returns: Dictionary containing the allergy intolerance information

ParametersJSON Schema
NameRequiredDescriptionDefault
allergy_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, and the description does not disclose behavioral traits such as read-only nature, authentication needs, error handling, or side effects. It only states the action and return type.

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 very concise with two sentences and an Args/Returns block. Every sentence adds value without redundancy.

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?

For a simple get-by-id operation, the description covers the basics. However, it omits error conditions (e.g., missing ID) and lacks behavioral transparency. The presence of an output schema partially compensates.

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 parameter 'allergy_id' is minimally described as 'The FHIR AllergyIntolerance ID', adding context beyond the schema (which only specifies type string). However, it lacks details on format or validation.

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 retrieves a specific allergy intolerance by ID, using a specific verb and resource. It is distinguishable from sibling tools like get_patient_allergies and other get_by_id functions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., get_patient_allergies). The description lacks context on prerequisites or scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_appointment_by_idB

Retrieve a specific appointment by ID.

Args: appointment_id: The FHIR Appointment ID

Returns: Dictionary containing the appointment information

ParametersJSON Schema
NameRequiredDescriptionDefault
appointment_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It states the tool retrieves an appointment but does not disclose any behavioral traits like error handling, authentication requirements, or rate limits. The description is insufficient for a complete behavioral understanding.

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 short and front-loaded, using a clear sentence followed by bullet points for args and returns. It is efficient, though the args and returns sections could be more integrated.

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 has an output schema, so the description does not need to detail return structure extensively, but it mentions 'Dictionary containing the appointment information'. Despite many sibling tools, the description does not help distinguish when to use this one, and there is no mention of error scenarios. It is adequate for a simple retrieval.

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?

With 0% schema description coverage, the description adds meaning by labeling the parameter as 'The FHIR Appointment ID'. This clarifies the expected value beyond the schema's type string. However, it is minimal and does not specify format or constraints.

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 'Retrieve a specific appointment by ID', which specifies the verb (retrieve) and resource (appointment by ID). It is distinct from siblings like get_patient_appointments which retrieves all appointments for a patient.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide any guidance on when to use this tool versus alternatives such as search_appointments_by_date or get_patient_appointments. It only describes what the tool does, leaving the agent without context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_condition_by_idB

Retrieve a specific condition by ID.

Args: condition_id: The FHIR Condition ID

Returns: Dictionary containing the condition information

ParametersJSON Schema
NameRequiredDescriptionDefault
condition_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description bears full responsibility for behavioral disclosure. It only states that the tool retrieves a condition and returns a dictionary, but does not mention error handling, permissions, rate limits, or side effects. As a read operation, it's likely safe, but this is not explicitly stated.

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 extremely concise with only two sentences and a structured docstring. Every part is necessary and contributes to understanding. No redundant information.

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 simple with one parameter and an output schema, so the description is mostly adequate. However, it lacks usage guidelines and behavioral details, which are important for comprehensive understanding. The presence of an output schema reduces the need to describe returns, but other gaps remain.

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 adds the term 'FHIR Condition ID' to the parameter, providing context beyond the schema's bare type 'string'. However, schema description coverage is 0%, so the description partially compensates but does not specify format or constraints. Baseline is 3 given the low 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 clearly states the verb 'Retrieve' and the resource 'a specific condition by ID', making the tool's purpose unambiguous. It is distinct from sibling tools like 'get_patient_conditions' which list conditions, and other get_by_id tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as 'get_patient_conditions' or other get_by_id tools. There is no mention of prerequisites or context for using the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_diagnostic_report_by_idB

Retrieve a specific diagnostic report by ID.

Args: report_id: The FHIR DiagnosticReport ID

Returns: Dictionary containing the diagnostic report information

ParametersJSON Schema
NameRequiredDescriptionDefault
report_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/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 only states 'Retrieve', lacking details about authentication, rate limits, data completeness, or error states. For a simple get-by-id, more context would improve transparency.

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 very brief, consisting of a single sentence plus parameter/returns docs. It is concise and front-loaded, but could be slightly more structured by separating the main purpose from parameter details.

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?

Given the simple input schema (one required parameter) and existence of output schema, the description is minimally adequate. However, it omits context about prerequisites, error scenarios, or typical usage patterns, leaving some gaps for an AI agent.

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?

Schema description coverage is 0%, and the description adds only 'The FHIR DiagnosticReport ID' for the report_id parameter. This provides slight clarification but does not fully compensate for the lack of schema descriptions.

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 verb 'Retrieve' and the resource 'specific diagnostic report', with the identifier 'by ID'. This distinguishes it from sibling tools that retrieve other FHIR resources by ID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., search_patients_* or get_patient_diagnostic_reports). The description does not include when-not or alternative suggestions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_encounter_by_idB

Retrieve a specific encounter by ID.

Args: encounter_id: The FHIR Encounter ID

Returns: Dictionary containing the encounter information

ParametersJSON Schema
NameRequiredDescriptionDefault
encounter_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It only states basic retrieval without disclosing permissions, error handling, or response details beyond a generic 'dictionary'.

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?

Description is brief but structured with Args and Returns sections. No unnecessary words.

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?

Given the tool's simplicity (single parameter, output schema exists), the description is adequate but lacks completeness on edge cases, auth requirements, and expected output structure. Output schema compensates partially.

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?

Single parameter with 0% schema coverage. Description adds 'The FHIR Encounter ID' to clarify the parameter's nature, but does not provide format constraints or additional context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the purpose: 'Retrieve a specific encounter by ID.' It uses a specific verb and resource, but does not differentiate from sibling tools like get_condition_by_id, which use the same pattern.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., get_patient_encounters). Description lacks context for appropriate use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_fhir_capability_statementA

Retrieve the FHIR server's capability statement (metadata). This provides information about the server's capabilities and supported resources.

Returns: Dictionary containing the FHIR server capabilities

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description discloses that the tool is a retrieval operation returning a dictionary. It is straightforward and non-destructive, though it lacks details on authentication or rate limits, which are less critical for a simple read.

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 brief at two sentences, but the 'Returns:' line is redundant given the presence of an output schema. Otherwise, it is well-structured and front-loaded.

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 zero-parameter tool with an output schema, the description provides sufficient context about the purpose and return type. No additional information is necessary.

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 input schema has no parameters, and the schema description coverage is 100%. The description does not need to add parameter details; the baseline score of 4 is appropriate.

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 that the tool retrieves the FHIR server's capability statement (metadata), which is distinct from sibling tools that fetch individual resources like patient or condition data.

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 implies usage for obtaining server capabilities and supported resources. It does not explicitly list alternatives or exclusions, but the context is clear given the sibling tools are all resource-specific fetches.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_immunization_by_idA

Retrieve a specific immunization by ID.

Args: immunization_id: The FHIR Immunization ID

Returns: Dictionary containing the immunization information

ParametersJSON Schema
NameRequiredDescriptionDefault
immunization_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It only says 'Retrieve,' implying a read operation, but does not mention authentication needs, error handling, or any side effects. This minimal disclosure is insufficient for a tool with no annotation support.

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 extremely concise with no wasted words. It includes an args and returns section in a structured, readable format.

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?

Given the tool's low complexity (single parameter, read operation, output schema present), the description is complete. It specifies the input and indicates a dictionary return, with the output schema providing further detail.

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?

Schema description coverage is 0%, so the description must compensate. It adds meaning by describing 'immunization_id' as 'The FHIR Immunization ID,' clarifying the parameter format beyond the schema's type-only definition.

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 'Retrieve a specific immunization by ID,' which provides a specific verb and resource. It distinguishes from sibling tools like get_patient_immunizations or other get_by_id tools for different FHIR resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage is implied: when you have a specific immunization ID. However, there is no explicit guidance on when to use this vs listing tools (e.g., get_patient_immunizations) or exclusion of alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_medication_request_by_idA

Retrieve a specific medication request by ID.

Args: medication_request_id: The FHIR MedicationRequest ID

Returns: Dictionary containing the medication request information

ParametersJSON Schema
NameRequiredDescriptionDefault
medication_request_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description bears full burden for behavioral disclosure. It only states it retrieves and returns a dictionary, omitting critical details like error handling (e.g., 404 if not found), authorization requirements, or response format beyond 'dictionary'. This is minimal transparency.

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 extremely concise: two sentences plus structured Args/Returns. It is front-loaded with the action, and every word earns its place with no redundancy.

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?

Given the tool's simplicity (one required parameter, output schema exists), the description covers the basic function. However, it lacks guidance on error handling, preconditions, or relation to sibling tools. With no annotations, more detail would be beneficial for a complete understanding.

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 schema has 0% description coverage for the parameter, but the description adds 'The FHIR MedicationRequest ID', which provides context beyond the schema's bare type 'string'. This helps distinguish from other resource IDs.

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 'Retrieve a specific medication request by ID', specifying the verb and resource. It distinguishes from siblings by naming the specific FHIR resource (medication request) and retrieval method (by ID).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a specific medication request ID is available, but it does not explicitly state when to use this tool versus alternatives (e.g., search_patients_medication_requests for multiple results). No exclusions or when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_observation_by_idB

Retrieve a specific observation by ID.

Args: observation_id: The FHIR Observation ID

Returns: Dictionary containing the observation information

ParametersJSON Schema
NameRequiredDescriptionDefault
observation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It only mentions return type but no behavioral traits like read-only, auth, or rate limits.

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 concise, using a clear docstring format with Args and Returns sections. Every sentence is necessary and no fluff.

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?

For a simple retrieval tool with one parameter and an output schema, the description is mostly adequate. It could mention that the observation is from a specific patient, but not strictly required.

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?

Schema description coverage is 0%, so description must add meaning. It explains 'observation_id' as 'The FHIR Observation ID', adding some context, but lacks format details.

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 'Retrieve a specific observation by ID', using a specific verb and resource. It distinguishes from siblings which retrieve different FHIR resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives or prerequisites. With many sibling tools, this is a missed opportunity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_allergiesA

Retrieve allergies for a specific patient.

Args: patient_id: The FHIR patient ID clinical_status: Optional filter by clinical status (active, inactive, resolved)

Returns: Dictionary containing the patient's allergies

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
clinical_statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral disclosure burden. The description only states 'Retrieve' which implies read-only, but lacks details on authentication needs, error handling, or response behavior (e.g., empty list vs error).

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 concise and front-loaded with the main purpose. The Args/Returns section is structured but could be slightly more terse without losing clarity.

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 simplicity and the presence of an output schema, the description adequately covers the purpose and parameters. It notes the return type as a dictionary, though it does not describe possible error responses.

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?

Schema description coverage is 0%, but the description adds value by listing possible values for clinical_status (active, inactive, resolved) and clarifying its purpose as an optional filter. This compensates for the schema's lack of enumeration.

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 'Retrieve allergies for a specific patient,' specifying the verb, resource, and patient scope. It distinguishes from the sibling 'get_allergy_by_id' which retrieves a single allergy by ID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool vs alternatives like 'get_allergy_by_id'. The description implies it is for a patient's full allergy list but does not mention exclusions or specific contexts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_appointmentsA

Retrieve appointments for a specific patient.

Args: patient_id: The FHIR patient ID date: Optional filter by date (YYYY-MM-DD format, automatically formatted with time component) status: Optional filter by status (proposed, pending, booked, arrived, fulfilled, cancelled)

Returns: Dictionary containing the patient's appointments

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
dateNo
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries full burden. It explains parameters and return type but lacks disclosure of behavioral traits like read-only nature, authentication, or side effects. The return type is mentioned but not detailed.

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 short and front-loaded, stating the purpose first, then clearly listing arguments and return type. Every sentence is informative and no wasted words.

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?

Given the tool's simplicity (3 params, 1 required) and presence of an output schema, the description adequately covers input and output. It provides necessary details for usage without missing critical information.

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?

Schema description coverage is 0%, so the description must add meaning. It explains patient_id as FHIR ID, date format with automatic time component, and status with allowed values. This adds significant value beyond the plain 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 it retrieves appointments for a specific patient, using a specific verb and resource. It distinguishes itself from siblings like get_appointment_by_id (single appointment) and search_appointments_by_date (date-based across patients).

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 implies use when needing all appointments for a patient with optional filters. However, it does not explicitly state when to use alternatives or when not to use the tool, though sibling names provide context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_by_idA

Retrieve a specific patient by their FHIR patient ID.

Args: patient_id: The FHIR patient ID to retrieve

Returns: Dictionary containing the patient information

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states it retrieves a patient, implying a read-only operation. With no annotations, it fails to disclose error handling (e.g., if ID not found), authentication needs, or rate limits. For a simple lookup, this is acceptable but not exemplary.

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 concise: two sentences plus labeled Args/Returns sections. The core purpose is front-loaded in the first sentence. No redundant information.

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 one parameter and is a simple retrieval. The description covers input and output (with output schema presumably detailing the return structure). However, it lacks information on error states or prerequisites, but for a get-by-id tool this is nearly complete.

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 input schema has no description for patient_id (0% coverage). The tool description adds the semantic that it is a FHIR patient ID, which is valuable context beyond the schema. However, it lacks format details (e.g., expected length or pattern).

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 verb 'Retrieve', the resource 'patient', and the method 'by their FHIR patient ID'. This specifically differentiates it from sibling tools that retrieve other resources by ID (e.g., get_allergy_by_id) or search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when you have a FHIR patient ID, but does not explicitly state when not to use or mention alternatives like search_patients_by_name. The context is clear but lacks exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_conditionsA

Retrieve conditions for a specific patient.

Args: patient_id: The FHIR patient ID clinical_status: Optional filter by clinical status (active, inactive, resolved) category: Optional filter by category (problem-list-item, encounter-diagnosis)

Returns: Dictionary containing the patient's conditions

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
clinical_statusNo
categoryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Mentions optional filters and return type, but lacks details on pagination, error handling, or authentication requirements.

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?

Very concise: one-sentence purpose, then well-structured args and return. No unnecessary words.

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?

Covers purpose, params, and return type sufficiently for a simple read tool. However, could mention if multiple conditions are returned as a list or array; but since output schema exists, this is acceptable.

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?

Schema description coverage is 0%, so description provides all parameter meaning: explains patient_id as FHIR ID, and lists possible values for clinical_status and category, adding significant value over the schema alone.

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?

Clearly states 'Retrieve conditions for a specific patient', which is specific and distinguishes from sibling 'get_condition_by_id' which retrieves a single condition by ID.

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?

Implies usage context by specifying patient_id as required and showing optional filters; but does not explicitly state when to use this vs alternatives like 'get_condition_by_id'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_diagnostic_reportsB

Retrieve diagnostic reports for a specific patient.

Args: patient_id: The FHIR patient ID category: Optional filter by category (LAB, RAD, etc.) date: Optional filter by date (YYYY-MM-DD format or date range) status: Optional filter by status (registered, partial, final, corrected)

Returns: Dictionary containing the patient's diagnostic reports

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
categoryNo
dateNo
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It only states 'Retrieve' and 'Returns dictionary', but omits side effects, permissions, rate limits, or behavior when no results. No mention of read-only nature or potential pagination.

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?

Single sentence with bulleted parameter list; no fluff. Purpose is front-loaded. Every sentence serves a purpose.

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?

Given no output schema and no annotations, the description provides basic parameter info but no return structure details or edge cases. Adequate for simple use but incomplete for complex scenarios.

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?

Schema coverage is 0%, but the description adds brief semantics for each parameter (e.g., FHIR patient ID, category examples, date format). However, it lacks exhaustive value lists or format details, providing marginal improvement over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves diagnostic reports for a specific patient, with a specific verb and resource. However, it does not distinguish from sibling tools like get_diagnostic_report_by_id or get_patient_lab_results.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., get_diagnostic_report_by_id for single report, get_patient_lab_results for lab results). No when-not-to-use advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_encountersA

Retrieve encounters for a specific patient.

Args: patient_id: The FHIR patient ID date: Optional filter by date (YYYY-MM-DD format or date range) status: Optional filter by status (planned, arrived, in-progress, finished) encounter_class: Optional filter by class (ambulatory, emergency, inpatient)

Returns: Dictionary containing the patient's encounters

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
dateNo
statusNo
encounter_classNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/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 states the tool returns a dictionary of encounters but does not disclose behavioral traits such as pagination, ordering, or potential performance implications for large datasets. As a read operation, lack of side effects is assumed but not confirmed.

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 concise and structured with Args and Returns sections. The purpose is front-loaded in the first sentence. It efficiently conveys necessary information without extra verbosity.

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 has an output schema (not shown) and parameters are well documented, the description covers the essential aspects. It could mention default behavior for filter parameters, but overall it is complete for a retrieval tool.

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?

With 0% schema description coverage, the description effectively adds meaning to each parameter: patient_id is identified as the FHIR patient ID, date is specified with format and optional range, status and encounter_class list valid values. This compensates for the schema's lack of description.

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 retrieves encounters for a specific patient, using a specific verb and resource. It distinguishes from sibling tools like get_encounter_by_id which retrieves a single encounter, while this retrieves all encounters for a patient.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for retrieving patient encounters with optional filters, but does not explicitly state when to use this tool versus alternatives like search functions or other patient-specific tools. No exclusions or alternative guidance provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_immunizationsA

Retrieve immunizations for a specific patient.

Args: patient_id: The FHIR patient ID date: Optional filter by date (YYYY-MM-DD format or date range) status: Optional filter by status (completed, not-done)

Returns: Dictionary containing the patient's immunizations

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
dateNo
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must cover behavioral traits. It describes parameters and return type but does not disclose pagination, error handling, or what happens if the patient is not found. It is adequate but not thorough.

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 concise, structured with Args and Returns sections, and front-loads the main purpose. Every sentence adds value with no wasted words.

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?

For a simple retrieval tool with an output schema, the description covers parameters and return type. It could mention that results are a list of immunizations, but overall it is sufficiently complete.

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?

Schema coverage is 0%, so the description compensates by explaining patient_id as FHIR ID, date with format hint, and status with example values. It adds meaning beyond the schema, though date range is not fully specified.

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 retrieves immunizations for a specific patient, using a specific verb and resource. It distinguishes from siblings like get_immunization_by_id, which retrieves a single immunization by ID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives like get_immunization_by_id, nor does it provide when-not-to-use guidance. Usage is implied from the name and parameter description but lacks proactive differentiation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_lab_resultsC

Retrieve laboratory observations for a specific patient.

Args: patient_id: The FHIR patient ID date: Optional filter by date (YYYY-MM-DD format or date range)

Returns: Dictionary containing the patient's lab results

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden but only discloses that it is a retrieval operation. No mention of auth, rate limits, pagination, or behavior for missing data. Lacks depth for safe agent invocation.

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 concise and well-structured with a clear docstring format (Args/Returns). Every sentence contributes meaning, and the formatting enhances readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of selecting among many sibling tools and the absence of annotations, the description is incomplete. It lacks behavioral traits, usage guidance, and sufficient param detail to fully support invocation.

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?

Schema description coverage is 0%, so the description must compensate. It adds value for the 'date' parameter by specifying format (YYYY-MM-DD) and optional nature, but 'patient_id' is only described as 'The FHIR patient ID', which adds little beyond the parameter name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves laboratory observations for a specific patient, differentiating it from general observations or vital signs. However, it could be more precise by specifying the FHIR category.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus siblings like get_patient_observations or get_patient_vital_signs. The description implies usage for lab results but lacks explicit when-to-use or when-not-to-use instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_medication_requestsA

Retrieve medication requests for a specific patient.

Args: patient_id: The FHIR patient ID status: Optional filter by status (active, completed, cancelled) intent: Optional filter by intent (order, plan, proposal)

Returns: Dictionary containing the patient's medication requests

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
statusNo
intentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It clearly states that the tool returns a dictionary of medication requests, which is adequate for a read-only retrieval. However, it does not mention potential limitations like pagination, error handling, or authorization requirements, which would enhance transparency.

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 efficient, using a docstring format with clear sections for Args and Returns. Every sentence adds value; there is no redundant information. It is appropriately front-loaded with the purpose statement.

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 simplicity (3 parameters, 1 required, output schema exists), the description covers the essential information: what it does, parameters, and return type. It lacks details on possible error responses or integration with FHIR specifics, but overall it is sufficiently complete for its complexity.

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?

Schema description coverage is 0%, so the description must add meaning. It describes 'patient_id' as the FHIR patient ID, 'status' as optional filter with example values (active, completed, cancelled), and 'intent' similarly (order, plan, proposal). This adds sufficient context beyond the schema's type-only 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 uses a specific verb 'Retrieve' and clearly identifies the resource 'medication requests for a specific patient'. It distinguishes from sibling 'get_medication_request_by_id' which retrieves a single request, while this tool lists all requests for a patient.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing medication requests per patient with optional filters, but does not explicitly state when to use this tool versus alternatives like 'get_medication_request_by_id' for single requests or other patient-specific list tools. No 'when not to use' guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_observationsA

Retrieve observations for a specific patient.

Args: patient_id: The FHIR patient ID category: Optional filter by category (vital-signs, laboratory, etc.) code: Optional filter by observation code (LOINC code) date: Optional filter by date (YYYY-MM-DD format or date range)

Returns: Dictionary containing the patient's observations

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
categoryNo
codeNo
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It states retrieval and returns a dictionary, but omits potential issues like pagination, rate limits, or if results are complete. The read-only nature is inferred but not explicitly stated. Missing details about what happens if patient not found.

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 concise, using a clear Args/Returns structure. Every sentence adds value. No superfluous text. Front-loaded with purpose.

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 complexity (many sibling tools, optional filters) and presence of output schema (alleviating need to describe returns in detail), the description is fairly complete. Could mention if results are paginated or limited, but overall adequate.

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?

Schema description coverage is 0%, but description adds significant meaning: category 'vital-signs, laboratory, etc.', code 'LOINC code', date 'YYYY-MM-DD format or date range', patient_id 'FHIR patient ID'. This goes beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Retrieve observations for a specific patient' with a specific verb and resource. It lists parameters that imply filtering. However, it does not explicitly differentiate from sibling tools like get_patient_vital_signs or get_patient_lab_results, which could be seen as subsets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides optional filters but no guidance on when to use this tool versus the many specialized siblings (e.g., get_patient_vital_signs vs. using category filter). No when-not or alternative tool mentions, and no prerequisites stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_proceduresA

Retrieve procedures for a specific patient.

Args: patient_id: The FHIR patient ID date: Optional filter by date (YYYY-MM-DD format or date range) status: Optional filter by status (preparation, in-progress, completed)

Returns: Dictionary containing the patient's procedures

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
dateNo
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the burden. It mentions optional filters and return type but does not disclose behavior for missing patients, pagination, or authentication requirements. Adequate but not thorough.

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?

Docstring format with Args and Returns sections is clean and structured. Every sentence adds value; no fluff or repetition.

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?

Given the tool's simplicity (3 params, read operation), the description covers purpose and parameters but lacks usage guidance and edge-case behavior. Output schema exists, so return details are likely covered externally. Adequate but incomplete.

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?

Schema coverage is 0%, so description adds meaning: patient_id is a FHIR ID, date is optional with format hint, status with example values. This compensates well, though more detail on date range syntax would improve.

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 retrieves procedures for a specific patient, using a specific verb ('Retrieve') and resource ('procedures'). It distinguishes from siblings like get_procedure_by_id by focusing on patient-level retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like get_procedure_by_id or other get_patient_* tools. The description implies usage for patient procedures but lacks when-not-to-use or exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_patient_vital_signsA

Retrieve vital signs observations for a specific patient.

Args: patient_id: The FHIR patient ID date: Optional filter by date (YYYY-MM-DD format or date range)

Returns: Dictionary containing the patient's vital signs

ParametersJSON Schema
NameRequiredDescriptionDefault
patient_idYes
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description only indicates it returns a dictionary with vital signs. Omits behavioral aspects like error handling, empty results, or any side effects.

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?

Concise and structured with clear sections for args and returns. No extraneous text.

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?

Covers parameters and return type, but lacks details on pagination, result ordering, or how vital signs differ from general observations, especially given many siblings.

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?

With 0% schema description coverage, the description adds meaningful context: explains patient_id as FHIR ID and date format as YYYY-MM-DD or range, which is not in 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?

Clearly states the verb (retrieve), resource (vital signs observations), and scope (a specific patient). Distinguishes from siblings like get_patient_observations (broader) and get_observation_by_id (single observation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides parameter descriptions but no explicit guidance on when to use this tool over alternatives, such as differentiating from other patient-specific retrieval tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_procedure_by_idC

Retrieve a specific procedure by ID.

Args: procedure_id: The FHIR Procedure ID

Returns: Dictionary containing the procedure information

ParametersJSON Schema
NameRequiredDescriptionDefault
procedure_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description must provide behavioral context. It only states 'Retrieve a specific procedure' without disclosing side effects, error behavior, or whether it returns a full resource, subset, or summary.

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 very short and to the point, with no wasted words. The structure (purpose, args, returns) is clear but could be expanded without losing conciseness.

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?

For a simple retrieval tool with an output schema, the description adequately states its purpose and parameter. However, with no annotations and many siblings, it omits behavioral details like idempotency, rate limits, or typical usage scenarios.

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 has 0% description coverage for the parameter. The description adds 'The FHIR Procedure ID', which provides minimal context (FHIR, Procedure) but does not specify format, constraints, or examples. Given the low schema coverage, the description should compensate more.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb (Retrieve), resource (procedure), and identifier (by ID). It is specific and unambiguous. However, it does not distinguish this tool from other get_*_by_id siblings, relying on the name for uniqueness.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like get_patient_procedures or search tools. The description lacks any context about prerequisites or use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_appointments_by_dateA

Search for appointments by date.

Args: date: Appointment date (YYYY-MM-DD format, automatically formatted with time component) status: Optional filter by status (proposed, pending, booked, arrived, fulfilled, cancelled)

Returns: Dictionary containing the appointments

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/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 full behavioral disclosure. It clearly indicates a read operation ('Search') and returns a dictionary. There are no hidden side effects or permissions mentioned, which is acceptable for a simple search tool.

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 heading-like opening line followed by parameter and return documentation. It is reasonably concise, though the parameter descriptions could be more terse (e.g., 'date: Appointment date (YYYY-MM-DD)') without losing clarity.

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?

For a relatively simple tool with two parameters and a clear search purpose, the description covers the essential aspects: purpose, parameter formats, optional filtering, and return type. The sibling tool list shows this tool's niche, and the description adequately differentiates it.

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 input schema has 0% description coverage, so the description must compensate. It explains the date parameter format (YYYY-MM-DD) and lists valid status values, adding meaningful context beyond the schema. The description could be slightly more precise about the date format but is adequate.

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 'Search for appointments by date', specifying the verb (search), resource (appointments), and scope (by date). This distinguishes it from sibling tools like get_appointment_by_id (single appointment) and get_patient_appointments (patient-specific).

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 context: searching appointments by date with an optional status filter. It documents the date format and allowed status values, helping the agent decide when to use this tool. However, it does not explicitly state when not to use it or mention alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_patients_by_addressB

Search for patients by address components.

Args: postal_code: Patient's postal/ZIP code city: Patient's city state: Patient's state

Returns: Dictionary containing the search results

ParametersJSON Schema
NameRequiredDescriptionDefault
postal_codeNo
cityNo
stateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden but only states it returns a dictionary; it does not disclose whether matches are exact, fuzzy, or how multiple parameters are combined (AND/OR).

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 concise with a front-loaded header and structured Args/Returns sections. No superfluous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the optional parameters and output schema, the description lacks details on search behavior (e.g., matching logic, result ordering). Output schema existence reduces need for return format, but behavioral details are missing.

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 clear semantic labels for each parameter (postal_code, city, state) beyond the schema's empty documentation, though it does not explain how they interact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Search' and resource 'patients by address components,' distinguishing it from sibling tools like search_patients_by_name or search_patients_by_birthdate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., other search tools). There is no mention of prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_patients_by_birthdateA

Search for patients by birth date.

Args: birthdate: Patient's birth date in YYYY-MM-DD format

Returns: Dictionary containing the search results

ParametersJSON Schema
NameRequiredDescriptionDefault
birthdateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose behavioral traits such as read-only nature, authentication requirements, or whether it returns multiple results. The description only states what it does, not how it behaves.

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 brief and includes a clear args and returns section, making it easy to parse. It is efficient but could be slightly more structured with a summary line.

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?

Given the existence of an output schema, the description is minimally adequate. However, it lacks details on the nature of the return (e.g., multiple patients, pagination) and does not clarify if it supports partial or exact matches, leaving gaps for a search tool.

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 value by specifying the expected format for the birthdate parameter ('YYYY-MM-DD') beyond the input schema, which only defines it as a string. With 0% schema description coverage, this compensation is significant.

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 'Search for patients by birth date' with a specific verb and resource, and it is easily distinguishable from sibling tools that search by other criteria or retrieve by ID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that this tool should be used when you have a birthdate to search by, but it lacks explicit guidance on when to use it versus alternatives, and no when-not or exclusion criteria are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_patients_by_emailB

Search for patients by email address.

Args: email: Patient's email address

Returns: Dictionary containing the search results

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It only mentions 'returns a dictionary' but omits details like case sensitivity, partial matching, empty results handling, or authentication requirements.

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 concise and follows a docstring format with Args and Returns, no redundant information.

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 simple, and an output schema exists, so return structure is covered. However, missing behavioral details and usage guidance leave it incomplete for an agent.

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?

Schema coverage is 0%, and the description adds little beyond the parameter name—just 'Patient's email address.' No format, validation, or constraints are specified.

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 'Search for patients by email address,' which is a specific verb-resource combination and distinguishes it from sibling tools that search by other criteria.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives (e.g., search_patients_by_name) is provided. The description only implies that it is for email-based searches.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_patients_by_identifierA

Search for patients by identifier (e.g., MRN, SSN).

Args: identifier_type: Type of identifier (e.g., "MR", "SS") identifier_value: The identifier value to search for

Returns: Dictionary containing the search results

ParametersJSON Schema
NameRequiredDescriptionDefault
identifier_typeYes
identifier_valueYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It indicates a safe read operation, but does not disclose any limitations, behavior on missing results, or case sensitivity. The description is basic and leaves some behavioral aspects unspecified.

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 concise and well-structured: a one-sentence purpose followed by clear Args and Returns sections. No superfluous information; every sentence serves a purpose.

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 presence of an output schema, the description need not detail return structure. It covers the key inputs and basic behavior. Some ambiguity remains about identifier types (e.g., whether other codes besides 'MR' and 'SS' are valid), but overall it is sufficiently complete for a simple search tool.

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 schema has 0% description coverage, but the description compensates by explaining both parameters with examples (e.g., 'MR', 'SS' for identifier_type). It adds meaningful context beyond the bare schema, though it could mention accepted formats or restrictions.

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's purpose: 'Search for patients by identifier' with concrete examples (MRN, SSN). This verb+resource+method formulation effectively distinguishes it from sibling search tools like search_patients_by_name or search_patients_by_address.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when an identifier like MRN or SSN is available, but does not explicitly state when not to use it or mention alternatives. Compared to siblings, the purpose is clear, but explicit usage guidance is lacking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_patients_by_nameC

Search for patients by name using FHIR search parameters.

Args: given_name: Patient's given (first) name family_name: Patient's family (last) name

Returns: Dictionary containing the search results

ParametersJSON Schema
NameRequiredDescriptionDefault
given_nameNo
family_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It only states it 'searches' and returns a dictionary, omitting details like search behavior (partial math, case sensitivity), pagination, or safety (read-only nature).

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 very short and uses a structured Args/Returns format. Every sentence adds value, but it could be slightly more detailed without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of patient search and many sibling tools, the description is incomplete. It does not explain result structure (beyond 'dictionary'), search behavior, or how it differs from other search_patients_by_* tools. An output schema exists, but the description still needs to clarify the search semantics.

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?

Schema coverage is 0%, so the description must add meaning. It gives one-line descriptions for given_name and family_name, which clarifies their purpose beyond the schema. However, it does not specify constraints like minimum length or character sets.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it searches for patients by name using FHIR search parameters, which is a specific verb and resource. However, it does not differentiate from sibling tools like search_patients_by_address or search_patients_by_birthdate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description lacks any mention of use cases, prerequisites, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_patients_by_phoneC

Search for patients by phone number.

Args: phone_number: Patient's phone number

Returns: Dictionary containing the search results

ParametersJSON Schema
NameRequiredDescriptionDefault
phone_numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility. It fails to disclose whether the search is exact or fuzzy, whether it returns multiple matches, or any limitations on phone number format. The minimal description lacks behavioral detail.

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 short, consisting of one sentence and a structured Args/Returns section. While not verbose, it omits crucial details and could be better organized to include more actionable information.

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?

Given the simplicity of the tool (single parameter, search operation) and the presence of an output schema, the description is minimally adequate. However, it lacks completeness regarding search behavior and result format, which could be expected for a search tool.

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 one parameter with no description. The description adds 'Patient's phone number', which only slightly clarifies the parameter's meaning. It does not provide format expectations, examples, or constraints, so the added value is limited.

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's function: 'Search for patients by phone number.' It uses a specific verb and resource, distinguishing it from sibling tools that search by other attributes (e.g., name, email, address).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance on when to use this tool versus alternatives. It does not mention that it should be used when a patient's phone number is known, nor does it exclude scenarios like partial matches or international formats. Contextual cues from siblings are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 29 tool updatesv0.1.0
    • First observedget_allergy_by_id
    • First observedget_appointment_by_id
    • First observedget_condition_by_id
    • First observedget_diagnostic_report_by_id
    • First observedget_encounter_by_id
    • First observedget_fhir_capability_statement
    • First observedget_immunization_by_id
    • First observedget_medication_request_by_id
    • First observedget_observation_by_id
    • First observedget_patient_allergies
    • First observedget_patient_appointments
    • First observedget_patient_by_id
    • First observedget_patient_conditions
    • First observedget_patient_diagnostic_reports
    • First observedget_patient_encounters
    • First observedget_patient_immunizations
    • First observedget_patient_lab_results
    • First observedget_patient_medication_requests
    • First observedget_patient_observations
    • First observedget_patient_procedures
    • First observedget_patient_vital_signs
    • First observedget_procedure_by_id
    • First observedsearch_appointments_by_date
    • First observedsearch_patients_by_address
    • First observedsearch_patients_by_birthdate
    • First observedsearch_patients_by_email
    • First observedsearch_patients_by_identifier
    • First observedsearch_patients_by_name
    • First observedsearch_patients_by_phone

TDQS

A3.7/5.0

Scored across 29 tools

Disambiguation4/5

Most tools target distinct resources, with clear patterns like get_<resource>_by_id and get_patient_<resource>. However, there is potential overlap between get_patient_lab_results, get_patient_vital_signs, and get_patient_observations, as lab results and vital signs are subsets of observations. Descriptions help distinguish them, but an agent could still be confused.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case. get_ and search_ prefixes are used appropriately, and resource names are pluralized uniformly. No mixed conventions or irregular naming.

Tool Count5/5

With 29 tools, the server covers a wide range of FHIR resources and search capabilities without being overwhelming. The count is well-scoped for a FHIR client, providing both individual resource retrieval by ID and patient-centric queries, plus a capability statement.

Completeness4/5

The tool set covers the most common FHIR resources and operations (read, search by patient) effectively. Minor gaps exist, such as missing direct access to Medication or Practitioner resources, but these are not critical for a patient-centric server. Overall, it provides a complete surface for typical use cases.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables LLM-based agents to interact with FHIR healthcare data through natural language prompts, providing full CRUD operations on FHIR resources, document processing, and semantic search capabilities.
    13
    99
    MIT
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables seamless integration with FHIR APIs for healthcare applications, allowing users to search, retrieve, create, update, and analyze clinical information through natural language interactions. Supports SMART-on-FHIR authentication and works with various healthcare systems like EPIC and HAPI FHIR servers.
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables LLMs to securely interact with FHIR healthcare servers and HL7 terminology services. Provides comprehensive healthcare data operations with built-in PHI protection, audit logging, and SMART on FHIR authentication.
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Provides read/write access to any FHIR-compliant healthcare API with built-in validation, supporting resource management, search operations, and granular permissions through natural language.
    5
    1
    -