Skip to content

Connect Oracle Health to Claude: Sync Schedules and Care Plans

Learn how to connect Oracle Health to Claude using Truto's MCP server. A complete engineering guide to syncing clinical data, care plans, and FHIR resources.

Uday Gajavalli Uday Gajavalli · · 10 min read

If you need to connect Oracle Health to Claude to automate patient scheduling, analyze clinical care plans, or synthesize Fast Healthcare Interoperability Resources (FHIR) records, you need a Model Context Protocol (MCP) server. This server acts as the secure translation layer between Claude's tool-calling capabilities and the Oracle Health Millennium Platform REST APIs. 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 /connect-oracle-health-to-chatgpt-manage-patient-and-clinical-data/ or explore our broader architectural overview on /connect-oracle-health-to-ai-agents-automate-billing-and-ehr-exports/.

Giving a Large Language Model (LLM) read and write access to a sprawling Electronic Health Record (EHR) ecosystem like Oracle Health is an engineering challenge. You have to handle SMART on FHIR OAuth token lifecycles, map massive, deeply nested clinical JSON schemas to MCP tool definitions, and deal with Oracle's strict API pagination and concurrency rules. Every time the FHIR specification evolves or Oracle deprecates a resource, 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 Oracle Health, connect it natively to Claude, and execute complex clinical and administrative workflows using natural language.

The Engineering Reality of the Oracle 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. Oracle Health (formerly Cerner) uses a strict implementation of the FHIR standard.

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

Strict Optimistic Concurrency with ETags Oracle Health enforces strict data integrity rules using HTTP ETags. When you want to update a clinical record - such as modifying a patient's allergy intolerance or updating an appointment - you cannot simply send a PUT or PATCH request. You must first read the record to obtain its current ETag, and then include that exact value in the If-Match header of your update request. If another user or system modified the record in the intervening milliseconds, Oracle returns a 409 Conflict. An LLM cannot naturally intuit this workflow; your MCP server must enforce it. Truto handles this via the truto_if_match parameter, standardizing the concurrency pattern for the LLM.

Mutually Exclusive Search Parameters The Oracle Health search API aggressively protects database performance by rejecting broad queries. Endpoints like the Appointment or Patient search require highly specific parameter combinations. For example, when searching appointments, you must supply _id, patient, practitioner, or location. Furthermore, patient and practitioner are mutually exclusive and must be paired with a date parameter. If an AI agent attempts to run a broad query without understanding these constraints, the API will fail.

Asynchronous Bulk Data Operations For large analytical operations, Oracle Health relies on the Argonaut/SMART $export pattern. When you request a bulk export of patient data, the API does not return the data synchronously. Instead, it returns a 202 Accepted with a Content-Location header. The client must poll this URL using exponential backoff until the job finishes, at which point a manifest of NDJSON files is returned. LLMs cannot maintain a synchronous HTTP connection for 30 minutes while a job runs. Your MCP infrastructure must decouple the kick-off request from the polling and retrieval mechanisms.

Generating the Oracle Health MCP Server

Truto abstracts the authentication, schema mapping, and endpoint derivation away by dynamically generating MCP tools based on Oracle Health's documentation. You can generate this server via the Truto UI or programmatically via the API.

Method 1: Via the Truto UI

For teams who want a zero-code setup, you can generate the MCP server directly from the Truto dashboard.

  1. Navigate to the Integrated Accounts page in your Truto environment.
  2. Select your connected Oracle Health account.
  3. Click the MCP Servers tab.
  4. Click Create MCP Server.
  5. Select your desired configuration. You can filter the server to only expose read methods, or filter by tags (e.g., clinical, administrative).
  6. Copy the generated MCP server URL (e.g., https://api.truto.one/mcp/abc123xyz...).

Method 2: Via the Truto API

For platform engineers building AI features into their own applications, you can provision MCP servers programmatically. This ensures that every time a new hospital or clinic connects their Oracle Health instance to your application, an MCP server is instantly available for your AI agents.

Make a POST request to the /integrated-account/:id/mcp 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": "Oracle Health Clinical MCP",
    "config": {
      "methods": ["read", "write"],
      "tags": ["clinical", "patient_management"]
    },
    "expires_at": "2025-12-31T23:59:59Z"
  }'

The API responds with the server metadata and the secure URL:

{
  "id": "mcp_srv_987654",
  "name": "Oracle Health Clinical MCP",
  "config": {
    "methods": ["read", "write"],
    "tags": ["clinical", "patient_management"]
  },
  "expires_at": "2025-12-31T23:59:59Z",
  "url": "https://api.truto.one/mcp/secure_token_hash_here"
}

Keep this URL safe. It encodes the tenant routing and authentication required to interact with the specific Oracle Health instance.

Connecting the MCP Server to Claude

Once you have your Truto MCP URL, you can plug it into Claude. Claude acts as the reasoning engine, while the MCP server acts as the execution environment.

Method 1: Via the Claude UI

If you are using Claude Desktop or an enterprise workspace that supports visual connector management:

  1. Open Claude and navigate to Settings -> Integrations (or Connectors depending on your tier).
  2. Click Add MCP Server.
  3. Name the connection (e.g., "Oracle Health Prod").
  4. Paste the Truto MCP URL into the Server URL field.
  5. Click Add.

Claude will immediately ping the server, run the initialization handshake, and parse the available clinical tools.

(Note: If your team uses ChatGPT, the process is nearly identical: go to Settings -> Apps -> Advanced settings -> Developer mode, and add the URL under Custom Connectors).

Method 2: Via the claude_desktop_config.json File

For developers running local agents or configuring Claude Desktop manually, you can use the Server-Sent Events (SSE) transport provided by the official MCP SDK.

Open your Claude Desktop configuration file (located at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows) and add the following:

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

Restart Claude Desktop. The application will execute the npx command, establishing a persistent bridge to the Truto MCP server.

Hero Tools for Oracle Health

Truto automatically generates descriptive, snake_case tools based on the Oracle Health FHIR documentation. The schema tells Claude exactly which fields are required, which are optional, and how to format the data.

Here are the highest-leverage tools available for Oracle Health:

list_all_oracle_health_appointments

Search and retrieve scheduled appointments based on patient, practitioner, or location. Remember that Oracle Health requires a date parameter when filtering by patient or practitioner.

"Find all upcoming appointments for patient ID 554321 scheduled for tomorrow. Format the results into a table showing the appointment time, status, and the assigned practitioner."

get_single_oracle_health_care_plan_by_id

Retrieve a specific clinical care plan by its logical resource ID. This returns the intent, category, and lifecycle status of the patient's care strategy.

"Fetch the care plan with ID 998877. Summarize the clinical intent and list any achievement statuses associated with the active goals."

list_all_oracle_health_patients

Search for patient demographics. You can search by identifier, family name, given name, or birthdate. Oracle Health recommends using the :exact modifier for name searches to prevent massive payload returns.

"Search for a patient with the family name 'Smith' and given name 'John' born on 1980-05-15. Give me their logical resource ID and active status."

create_a_oracle_health_observation

Log a new clinical observation, such as vital signs, social history, or lab results. The body must contain standard FHIR Observation formatting.

"Log a new observation for patient 554321. The observation is a blood pressure reading taken today. Set the status to final and include the systolic and diastolic values in the component array."

update_a_oracle_health_appointment_by_id

Modify an existing appointment. This requires passing the current version ETag into the truto_if_match parameter to satisfy Oracle's concurrency rules.

"Update appointment ID 12345. Change the status to 'arrived'. Use ETag W/"2" for the truto_if_match parameter to ensure we are updating the correct version."

create_a_oracle_health_document_reference

Upload or reference a clinical note, pathology report, or cardiology reading. All provided dates must include a time component.

"Create a new document reference for patient 554321. The document is a clinical note from today's encounter. Set the docStatus to 'final' and include the base64 encoded text in the attachment payload."

For the complete tool inventory - including detailed JSON schemas for Immunizations, Medications, Financial Transactions, and Diagnostics - visit the Oracle Health integration page.

Workflows in Action

Exposing individual tools to Claude is only the beginning. The real power of MCP is how the LLM strings these tools together to execute multi-step clinical workflows automatically.

Workflow 1: Pre-Visit Chart Briefing

Physicians spend significant time reviewing patient history before an encounter. Claude can automate this chart review process.

"Look up the appointments for practitioner ID 1001 for today. For the first patient on the schedule, retrieve their demographic profile and their active care plan. Summarize their active goals and any recent clinical notes so I can prep for the visit."

Execution Steps:

  1. Claude calls list_all_oracle_health_appointments with the practitioner ID and today's date.
  2. Claude extracts the patient.reference from the first appointment result.
  3. Claude calls get_single_oracle_health_patient_by_id using the extracted patient ID to gather demographics.
  4. Claude calls list_all_oracle_health_care_plans passing the patient ID to retrieve active treatments.
  5. Claude calls list_all_oracle_health_document_references to pull the latest clinical notes.
  6. The LLM synthesizes the FHIR JSON into a concise, human-readable pre-visit briefing.
sequenceDiagram
  participant User as User
  participant Claude as Claude Desktop
  participant MCP as Truto MCP Server
  participant Oracle as Oracle Health API
  User->>Claude: "Prep me for the first patient today."
  Claude->>MCP: Call list_all_oracle_health_appointments
  MCP->>Oracle: GET /Appointment?practitioner=1001&date=today
  Oracle-->>MCP: FHIR Bundle (Appointments)
  MCP-->>Claude: JSON Array
  Claude->>MCP: Call get_single_oracle_health_patient_by_id
  MCP->>Oracle: GET /Patient/554321
  Oracle-->>MCP: FHIR Patient Resource
  MCP-->>Claude: JSON Object
  Claude->>MCP: Call list_all_oracle_health_care_plans
  MCP->>Oracle: GET /CarePlan?patient=554321
  Oracle-->>MCP: FHIR Bundle (CarePlans)
  MCP-->>Claude: JSON Array
  Claude-->>User: Delivers synthesized pre-visit briefing.

Workflow 2: Post-Visit Charting and Status Updates

After a visit, administrative statuses must be updated and clinical notes must be filed. Claude can handle the API orchestration.

"The visit with patient 554321 (appointment ID 12345) is complete. Mark the appointment status as 'fulfilled' (use ETag W/"1"). Then, log a new clinical note document reference stating that the patient reported feeling better and vitals were normal."

Execution Steps:

  1. Claude calls update_a_oracle_health_appointment_by_id, setting status to fulfilled and passing W/"1" into the truto_if_match property.
  2. The MCP server issues the RFC 6902 JSON Patch request to Oracle Health.
  3. Claude calls create_a_oracle_health_document_reference, structuring the FHIR DocumentReference payload with the patient ID, the current timestamp, and the clinical note content.
  4. The LLM confirms to the user that the chart is closed and the note is filed.

Handling API Rate Limits

When connecting AI agents to enterprise systems, rate limiting is a critical architectural consideration. Autonomous agents can rapidly generate dozens of API calls during complex reasoning loops, easily tripping Oracle Health's rate limits.

Truto normalizes upstream rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF specification. However, Truto does not retry, throttle, or apply backoff on rate limit errors. When Oracle Health returns an HTTP 429 Too Many Requests, Truto passes that error directly to the caller.

It is the responsibility of the caller (or your agentic framework, like LangChain or AutoGen) to inspect the standardized headers and implement appropriate exponential backoff and retry logic. Do not rely on the proxy layer to silently absorb rate limits, as this causes timeouts and context window exhaustion for the LLM.

Security and Access Control

Giving AI agents write access to patient health information requires strict guardrails. Truto's MCP servers are designed with Zero Trust principles and zero data retention.

When configuring an Oracle Health MCP server, you have deep control over what the model can do:

  • Method Filtering: Restrict the server to safe operations. By setting methods: ["read"], Claude can query patients and care plans but cannot update appointments or create observations.
  • Tag Filtering: Group tools by domain. You can restrict a server to only expose tools tagged as clinical or financial, ensuring the agent stays in its lane.
  • Requires API Token Auth: Enable require_api_token_auth to force the client to send a valid Truto API token in addition to the server URL. This prevents anonymous access if the MCP URL is ever leaked in logs.
  • Expiration: Set an expires_at datetime to create ephemeral MCP servers. Once the timestamp passes, the server self-destructs, ensuring temporary agent sessions cannot access Oracle Health indefinitely.

Managing Clinical APIs with AI

Connecting Oracle Health to Claude via a managed MCP server removes the heavy lifting of FHIR schema parsing, SMART on FHIR OAuth token management, and endpoint discovery. Instead of spending weeks building custom integration code to handle ETags and JSON Patches, your engineering team can focus on designing better clinical prompts and agentic workflows.

By leveraging Truto's dynamic tool generation, you ensure that as Oracle Health updates its APIs, your MCP server - and your AI agents - stay perfectly in sync.

FAQ

Does Truto automatically retry rate-limited Oracle Health API requests?
No. Truto passes HTTP 429 rate limit errors directly to the caller and normalizes the rate limit headers per the IETF spec. The calling framework is responsible for handling retries and backoff.
How does Truto handle Oracle Health's ETag concurrency requirements?
Truto exposes a `truto_if_match` parameter in the MCP tool schema. When Claude calls an update tool, it passes the current ETag into this parameter, which Truto maps to the required `If-Match` HTTP header.
Can I limit the MCP server to read-only clinical data?
Yes. When creating the MCP server via the Truto UI or API, you can configure method filters (e.g., `methods: ["read"]`) to prevent the LLM from making any POST, PUT, PATCH, or DELETE requests.
How do I securely pass my MCP server URL to Claude Desktop?
You can add the MCP URL via the Claude Desktop UI under Settings -> Integrations, or by manually adding an SSE connection to the `claude_desktop_config.json` file.

More from our Blog