FHIR MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@FHIR MCP Serversearch for patient John Doe"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Patient - Demographics and patient information
AllergyIntolerance - Patient allergy and intolerance records
Condition - Medical conditions and diagnoses
Procedure - Medical procedures performed
Encounter - Patient encounters and visits
DiagnosticReport - Diagnostic reports and results
Observation - Clinical observations (vital signs, lab results)
Immunization - Immunization records
MedicationRequest - Medication prescriptions and requests
Appointment - Scheduled appointments
Installation
Prerequisites
Python 3.13 or higher
uvpackage manager (recommended) orpip
Setup
Clone the repository:
git clone <repository-url>
cd fhir-mcp-serverInstall dependencies using
uv:
uv syncOr using pip:
pip install -e .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_tokenThe .env file should contain:
FHIR_CLIENT_ID: Your OAuth2 client ID from the FHIR server providerFHIR_CLIENT_SECRET: Your OAuth2 client secret from the FHIR server providerFHIR_BASE_URL: The base URL of your FHIR R4 server endpointFHIR_TENANT_ID: (Optional) Your tenant ID, defaults to Oracle Cerner sandboxFHIR_SCOPE: (Optional) OAuth2 scopes, defaults to all supported resourcesFHIR_REQUEST_TIMEOUT: (Optional) Request timeout in seconds, default is 60
Configuration
Environment Variables
Variable | Description | Required | Default |
| OAuth2 client ID for authentication | Yes | None |
| OAuth2 client secret for authentication | Yes | None |
| Base URL of the FHIR server | No |
|
| Tenant ID for your FHIR server instance | No |
|
| OAuth2 token endpoint URL | No | Auto-generated from tenant ID |
| OAuth2 scopes (space-separated) | No | All supported resources |
| Request timeout in seconds | No |
|
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:
Create a CernerCare Account
Sign up at Oracle Cerner Code Console
Complete the account registration process
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
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
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 resourcessystem/Observation.rs- Read access to observation resourcessystem/Condition.rs- Read access to condition resourcessystem/Procedure.rs- Read access to procedure resourcessystem/Encounter.rs- Read access to encounter resourcessystem/DiagnosticReport.rs- Read access to diagnostic reportssystem/AllergyIntolerance.rs- Read access to allergy informationsystem/Immunization.rs- Read access to immunization recordssystem/MedicationRequest.rs- Read access to medication requestssystem/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/tokenDefault 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.pyOr if using uv:
uv run python fhir-mcp-server.pyUsing 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 IDsearch_patients_by_name- Search patients by given/family namesearch_patients_by_identifier- Search by identifier (MRN, SSN, etc.)search_patients_by_birthdate- Search by birth datesearch_patients_by_phone- Search by phone numbersearch_patients_by_email- Search by email addresssearch_patients_by_address- Search by address components
Clinical Data Tools
get_allergy_by_id/get_patient_allergies- Allergy informationget_condition_by_id/get_patient_conditions- Medical conditionsget_procedure_by_id/get_patient_procedures- Proceduresget_observation_by_id/get_patient_observations- Observationsget_patient_vital_signs- Vital signs specificallyget_patient_lab_results- Laboratory resultsget_immunization_by_id/get_patient_immunizations- Immunizations
Diagnostic & Medication Tools
get_diagnostic_report_by_id/get_patient_diagnostic_reports- Diagnostic reportsget_medication_request_by_id/get_patient_medication_requests- Medications
Encounter & Appointment Tools
get_encounter_by_id/get_patient_encounters- Patient encountersget_appointment_by_id/get_patient_appointments- Appointmentssearch_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 syncYour 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.jsonVerify 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_TIMEOUTin your.envfile or Claude Desktop configDefault is 60 seconds, try 120 or higher for slow servers
Security Considerations
Credential Management:
Never commit your
.envfile or credentials to version controlStore
FHIR_CLIENT_IDandFHIR_CLIENT_SECRETsecurelyUse 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 examplesAdding New FHIR Resources
To add support for additional FHIR resources:
Add a new tool function decorated with
@mcp.tool()Use the
make_fhir_request()helper functionFollow the existing pattern for parameters and return types
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
Built with FastMCP
Implements FHIR R4 standard
Designed for Oracle Millennium Platform APIs
Available Tools
29 toolsget_allergy_by_idB
Retrieve a specific allergy intolerance by ID.
Args: allergy_id: The FHIR AllergyIntolerance ID
Returns: Dictionary containing the allergy intolerance information
| Name | Required | Description | Default |
|---|---|---|---|
| allergy_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| appointment_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| condition_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| encounter_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| immunization_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| medication_request_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| observation_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| clinical_status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| date | No | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| clinical_status | No | ||
| category | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| category | No | ||
| date | No | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| date | No | ||
| status | No | ||
| encounter_class | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| date | No | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| status | No | ||
| intent | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| category | No | ||
| code | No | ||
| date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| date | No | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | ||
| date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| procedure_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| postal_code | No | ||
| city | No | ||
| state | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| birthdate | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| identifier_type | Yes | ||
| identifier_value | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| given_name | No | ||
| family_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| phone_number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
29 tool updates
v0.1.0- First observed
get_allergy_by_id - First observed
get_appointment_by_id - First observed
get_condition_by_id - First observed
get_diagnostic_report_by_id - First observed
get_encounter_by_id - First observed
get_fhir_capability_statement - First observed
get_immunization_by_id - First observed
get_medication_request_by_id - First observed
get_observation_by_id - First observed
get_patient_allergies - First observed
get_patient_appointments - First observed
get_patient_by_id - First observed
get_patient_conditions - First observed
get_patient_diagnostic_reports - First observed
get_patient_encounters - First observed
get_patient_immunizations - First observed
get_patient_lab_results - First observed
get_patient_medication_requests - First observed
get_patient_observations - First observed
get_patient_procedures - First observed
get_patient_vital_signs - First observed
get_procedure_by_id - First observed
search_appointments_by_date - First observed
search_patients_by_address - First observed
search_patients_by_birthdate - First observed
search_patients_by_email - First observed
search_patients_by_identifier - First observed
search_patients_by_name - First observed
search_patients_by_phone
TDQS
Scored across 29 tools
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.
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.
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.
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
Related MCP Connectors
- mcpOAuthcom.medplum
Securely access and manage FHIR healthcare data stored in Medplum.
Read and write patients, facilities, medical documents, and consolidated FHIR records in Metriport.
Privacy-preserving synthetic health data generation. FHIR R4/R5 compliant.
Hosted MCP server for the Healthie EHR & telehealth API: patients, appointments, charting, tasks.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables LLM-based agents to interact with FHIR healthcare data through natural language prompts, providing full CRUD operations on FHIR resources, document processing, and semantic search capabilities.1399MIT
- AlicenseNot gradedqualityNot gradedmaintenanceEnables seamless integration with FHIR APIs for healthcare applications, allowing users to search, retrieve, create, update, and analyze clinical information through natural language interactions. Supports SMART-on-FHIR authentication and works with various healthcare systems like EPIC and HAPI FHIR servers.Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables 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
- FlicenseAqualityDmaintenanceProvides read/write access to any FHIR-compliant healthcare API with built-in validation, supporting resource management, search operations, and granular permissions through natural language.51-