Skip to content

Connect Elation Health to Claude: Manage Clinical Orders & Schedules

Learn how to build a secure Elation Health MCP server to give Claude AI agents read and write access to clinical orders, patient scheduling, and billing.

Riya Sethi Riya Sethi · · 9 min read
Connect Elation Health to Claude: Manage Clinical Orders & Schedules

If your clinical operations team needs to connect Elation Health to Claude to automate patient scheduling, manage clinical orders, or retrieve encounter notes, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's JSON-RPC tool calls and Elation Health's REST API. You can either build and maintain this infrastructure yourself, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL.

If your team uses ChatGPT, check out our guide on connecting Elation Health to ChatGPT or explore our broader architectural overview on connecting Elation Health to AI Agents.

Giving a Large Language Model (LLM) read and write access to an Electronic Health Record (EHR) system like Elation Health is an engineering challenge with zero margin for error. You have to handle secure token lifecycles, map massive healthcare schemas to MCP tool definitions, and deal with Elation's strict domain rules around clinical associations. Every time Elation updates a resource schema or deprecates an endpoint, you have to update your server code, redeploy, and test the integration.

This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Elation Health, connect it natively to Claude Desktop, and execute complex clinical workflows using natural language.

The Engineering Reality of the Elation Health API

A custom MCP server is a self-hosted integration layer. While the open MCP standard provides a predictable way for models to discover tools, the reality of implementing it against specialized healthcare APIs is painful. Elation Health is built to manage complex physician-patient relationships, rigid clinical documentation, and strict billing codes.

If you decide to build a custom Elation Health MCP server, here are the specific integration challenges you will face:

Complex Record Associations and Required Keys Elation Health does not allow isolated record creation. Almost every write operation requires explicitly linking associated entities. For example, you cannot just create an appointment; you must pass a valid patient ID, physician ID, and practice ID. An LLM has no inherent context of your organization's internal primary keys. Your agent architecture must be designed to first search for the patient and physician, extract their numerical IDs, and then pass those specific IDs into the create payload.

Legacy vs. EN2.1 Note Schemas Clinical documentation in Elation has evolved. When fetching or updating visit notes, you will encounter two distinct structures: legacy notes and EN2.1 sections-based notes. The legacy /notes_v1/ endpoint expects a different payload structure than the newer /notes/ endpoint. If an LLM attempts to update an EN2.1 note using the legacy schema, the API will reject it with a 400 error. The tools exposed to Claude must clearly guide the model to use the correct endpoint based on the note's underlying schema version.

Rate Limits and 429 Passthrough Like any robust B2B platform, Elation enforces API rate limits. When a limit is breached, the API returns an HTTP 429 error. It is critical to understand that Truto does not absorb, retry, or throttle these requests. When the upstream API returns a 429, Truto passes that error directly back to the MCP caller. Truto normalizes the upstream rate limit information into standardized IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller (your AI agent framework or Claude client) is entirely responsible for reading these headers and implementing backoff and retry logic.

How to Create the Elation Health MCP Server

Truto handles the heavy lifting of authentication, schema normalization, and dynamic tool generation. Once you have authenticated an Elation Health account (an "Integrated Account" in Truto), you can generate an MCP server URL in seconds.

Each MCP server is cryptographically tied to a single connected Elation Health tenant. You can create this server via the Truto UI or programmatically via the REST API.

Method 1: Via the Truto UI

For teams who prefer a visual setup, generating an MCP server takes three clicks:

  1. Log into your Truto dashboard and navigate to the Integrated Accounts page.
  2. Select your connected Elation Health account.
  3. Click the MCP Servers tab.
  4. Click Create MCP Server.
  5. Select your desired configuration (e.g., name, method filters, tag filters, expiration).
  6. Copy the generated MCP server URL (e.g., https://api.truto.one/mcp/a1b2c3d4...).

Method 2: Via the Truto API

For platform engineers who want to provision MCP servers dynamically - such as generating a dedicated server when a new clinic is onboarded - you can use Truto's REST API.

Send an authenticated POST request to the MCP generation endpoint.

curl -X POST https://api.truto.one/integrated-account/{integrated_account_id}/mcp \
  -H "Authorization: Bearer YOUR_TRUTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Elation Clinical Ops Agent",
    "config": {
      "methods": ["read", "write"]
    }
  }'

The response will contain the securely hashed url that your LLM client needs to connect.

{
  "id": "mcp_8a9b0c1d",
  "name": "Elation Clinical Ops Agent",
  "config": {
    "methods": ["read", "write"]
  },
  "expires_at": null,
  "url": "https://api.truto.one/mcp/a1b2c3d4e5f67890"
}

How to Connect the MCP Server to Claude

Once you have the Elation Health MCP URL, connecting it to Claude requires zero additional coding. The URL encapsulates the target account, the authorized tools, and the authentication context.

Method 1: Via the Claude UI (Desktop)

If you are using Claude Desktop (or equivalent settings in ChatGPT via custom connectors):

  1. Open Claude Desktop and go to Settings.
  2. Navigate to Integrations -> Add MCP Server (in ChatGPT this is under Settings -> Apps -> Advanced settings -> Developer mode -> Custom connectors).
  3. Enter a name for the connection (e.g., "Elation Health").
  4. Paste the Truto MCP URL into the Server URL field.
  5. Click Add.

Claude will immediately perform an MCP initialization handshake, discover the available Elation Health tools, and make them available in your chat context.

Method 2: Via Manual Config File (Claude Desktop)

If you prefer to configure Claude Desktop manually via its JSON configuration file, you can utilize the @modelcontextprotocol/server-sse proxy package to bridge Truto's HTTP endpoint.

Locate your claude_desktop_config.json file (typically located at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows).

Add the Truto server configuration:

{
  "mcpServers": {
    "elation-health": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "https://api.truto.one/mcp/a1b2c3d4e5f67890"
      ]
    }
  }
}

Restart Claude Desktop. The "plug" icon will appear, indicating that the Elation Health tools are successfully registered.

Elation Health Hero Tools for Claude

Truto dynamically derives MCP tools directly from Elation Health's API schema. The tool names are standardized into descriptive snake_case formats. Here are 6 high-leverage hero tools that transform Claude into a capable clinical assistant.

1. list_all_elation_health_patients

Description: Returns a paginated list of patients. This is almost always the first tool Claude must call to resolve a natural language name to a specific Elation patient_id. Contextual notes: This tool accepts query parameters to filter by name or DOB. Pagination limit is inherited from the caller, max 100.

"Search our patient database for John Smith born in 1985 and return his internal patient ID."

2. create_a_elation_health_appointment

Description: Creates a new appointment on the schedule. Contextual notes: Claude must provide valid IDs for patient, physician, and practice, along with a valid scheduled_date in ISO format.

"Schedule a follow-up appointment for patient ID 12345 with Dr. Evans (physician ID 88) at the downtown clinic (practice ID 12) for next Tuesday at 10:00 AM."

3. create_a_elation_health_lab_order

Description: Generates a new lab order for a patient. Contextual notes: This requires document_date, ordering_physician, patient, and practice. Claude can look up the required IDs before executing this tool.

"Draft a new comprehensive metabolic panel lab order for Sarah Connor. Her patient ID is 992. Order it under Dr. Evans at practice 12 with today's date."

4. get_single_elation_health_note_by_id

Description: Retrieves a specific visit note. This fetches a note without creating a snapshot, bypassing concurrent conflict resolution blocks for read-only checks. Contextual notes: Requires the specific id of the note. For legacy notes, use get_single_elation_health_notes_v_1_by_id instead.

"Retrieve the contents of visit note ID 77653 and summarize the physician's assessment and plan for the patient."

5. create_a_elation_health_caregap

Description: Creates a new care gap record under the Care Gaps API subsystem. Contextual notes: Required fields include quality_program, definition_id, patient_id, practice_id, created_date, and status. This is vital for population health tracking.

"Log an open care gap for patient 12345 regarding the annual diabetic retinal exam (definition ID 44) under the Medicare Advantage quality program."

6. list_all_elation_health_physician_availabilities

Description: Gets the availabilities for a specified physician. Contextual notes: Requires physician_id. Essential for AI scheduling agents to ensure they don't double-book providers.

"Check the availability schedule for Dr. Evans (physician ID 88) for the upcoming week and list the open time slots."

To see the complete inventory of available tools, required payloads, and JSON schemas, check out the Elation Health integration page.

Workflows in Action

Exposing individual endpoints as tools is helpful, but the true power of MCP emerges when Claude chains these tools together to execute complex, multi-step clinical workflows.

Scenario 1: Pre-Visit Clinical Prep

User Prompt:

"Pull up the chart for Jane Doe. Find her primary physician's schedule, retrieve her most recent visit note, and see if she has any open care gaps we need to address today."

How Claude executes this:

  1. list_all_elation_health_patients: Claude searches for "Jane Doe" to retrieve her id and her assigned primary_physician ID.
  2. list_all_elation_health_physician_availabilities: Claude uses the physician ID to check today's schedule to confirm the appointment time.
  3. list_all_elation_health_notes: Claude queries the notes endpoint filtered by Jane Doe's patient ID to find the most recent encounter.
  4. list_all_elation_health_caregaps: Claude queries the Care Gaps API for the patient to check for open compliance items (e.g., overdue mammogram).

Result: The medical assistant receives a synthesized summary of Jane's last visit and a flagged alert about an outstanding preventative care gap, allowing them to prep the exam room accordingly.

sequenceDiagram
  participant User as Medical Assistant
  participant Claude as Claude Desktop
  participant Truto as Truto MCP
  participant Elation as Elation Health API
  
  User->>Claude: "Find Jane Doe, get her last note and open care gaps."
  
  Claude->>Truto: tools/call list_all_elation_health_patients (name="Jane Doe")
  Truto->>Elation: GET /patients?first_name=Jane&last_name=Doe
  Elation-->>Truto: Patient ID: 405, Physician ID: 12
  Truto-->>Claude: JSON patient data
  
  Claude->>Truto: tools/call list_all_elation_health_notes (patient=405)
  Truto->>Elation: GET /notes?patient=405
  Elation-->>Truto: Latest Note ID: 8892
  Truto-->>Claude: JSON note summary
  
  Claude->>Truto: tools/call list_all_elation_health_caregaps (patient_id=405)
  Truto->>Elation: GET /caregaps?patient_id=405
  Elation-->>Truto: 1 open gap (Retinal Exam)
  Truto-->>Claude: JSON gap data
  
  Claude->>User: "Jane's last visit covered HTN. She has one open gap: Retinal Exam."

Scenario 2: Post-Visit Order Routing

User Prompt:

"I just saw Michael Scott (ID: 554). Create a new lab order for a Lipid Panel and draft a new bill for a level 3 established patient visit (CPT 99213)."

How Claude executes this:

  1. create_a_elation_health_lab_order: Claude constructs the payload using the provided patient ID, infers the current date for document_date, and submits the request to Elation.
  2. create_a_elation_health_bill: Claude formulates the billing payload, attaching the patient ID, the practice ID (inferred from context or a previous lookup), and the requested cpts array.

Result: The provider saves 5 minutes of clicking through menus. The lab order is routed, and a draft bill is prepped for the billing team to review and release to the PMS.

Security and Access Control

When dealing with Electronic Health Records, security and scoping are paramount. Handing an LLM unrestricted access to a production EHR is dangerous. Truto provides several mechanisms to lock down your MCP servers:

  • Method Filtering: Restrict servers to specific operational categories. By passing config.methods: ["read"], Claude is physically prevented from invoking create, update, or delete operations, making the server perfectly safe for data extraction agents.
  • Tag Filtering: Limit the server's scope to specific API domains. You can configure an MCP server to only expose tools related to billing or scheduling, ensuring the LLM cannot accidentally query sensitive clinical notes.
  • Extra Authentication (require_api_token_auth): For shared environments, you can force the MCP client to pass a Truto API token in the Authorization header. This ensures that possession of the MCP URL alone is not enough to access patient data.
  • Automatic Expiration (expires_at): Ideal for contractors or temporary AI workflows. You can issue an MCP URL that automatically self-destructs at a specific ISO datetime, instantly revoking the LLM's access to the Elation Health instance.

Moving Fast in Health Tech

Building a reliable, compliant AI integration against a complex EHR like Elation Health traditionally requires months of reading docs, handling OAuth token refreshes, and mapping nested schemas.

By leveraging Truto's dynamic MCP generation, you skip the boilerplate entirely. You give your AI agents a standardized, strictly typed, and securely bounded interface to read and write clinical data. Stop building custom connectors and start building better healthcare workflows.

FAQ

Does Truto store patient data when Claude calls Elation Health?
No. Truto acts as a pass-through proxy. Tool payloads and responses are normalized in memory and routed directly between Claude and Elation Health. Truto operates on a zero-data-retention architecture, making it suitable for strict compliance requirements.
How does the Elation Health MCP server handle rate limits?
Truto does not absorb, throttle, or retry rate-limited requests. If Elation Health returns an HTTP 429, Truto passes that error directly to the caller (Claude). Truto normalizes the upstream rate limit information into standard IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). The caller is responsible for implementing any backoff or retry logic.
Can I restrict Claude to read-only access in Elation Health?
Yes. When creating the MCP server in Truto, you can use method filtering by passing 'methods': ['read']. This ensures the resulting MCP URL only exposes 'get' and 'list' operations, blocking Claude from creating or deleting clinical records.
Do I need a separate MCP server for each Elation Health clinic or practice?
Yes. Each MCP server URL is cryptographically tied to a single integrated account in Truto. If you are managing multiple clinics, you will generate and connect a distinct MCP server URL for each instance.

More from our Blog