# Oracle Health MCP connector

The Oracle Health connector brings patients, appointments, observations, charge items and care goals into Claude, ChatGPT, Cursor and the Elaichi Agent, so each person works with Oracle Health records inside their own access, with every call logged.

Source: https://elaichi.ai/connectors/oraclehealth/

## Facts

| | |
| --- | --- |
| Application | Oracle Health |
| Category | Healthcare |
| AI tools | 128 |
| Authentication | Connects over OAuth |
| Bring your own OAuth app | Yes |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. Connected tools are never listed one by one, however few there are. The endpoint advertises `search_tools` and `execute_tool` instead |

## What you can ask once Oracle Health is connected

- Show tomorrow's appointments for the cardiology clinic
- Which patients have care goals with no progress this month?
- List charge items on yesterday's visits missing an insurance plan

## Connect Oracle Health in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick Oracle Health.
2. Optionally set Share with, then press Connect.
3. Supply your own Oracle Health app, then approve. Oracle Health needs an OAuth app you register yourself, so bring its client ID and secret. One person does this once for the organization.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which Oracle Health tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Oracle Health MCP connector for Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## Oracle Health MCP connector for ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web today. The plugin directory lives at chatgpt.com/plugins.

## Oracle Health MCP connector for Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Connect Oracle Health to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Every scope the client asks for starts ticked except "Delete data and remove access", which you tick yourself. Calling a Oracle Health tool needs "Run your connected tools". Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Think hard before granting Delete, which reaches into connected apps and cannot be undone.

## What teams do with Oracle Health through Elaichi

### Book the follow-up before the patient leaves

Front desk. Ask for the next open slot, create the appointment in Oracle Health, and move it later if the patient calls back. The schedule stays current without opening a second screen.

### See which goals are still open

Care coordination. Pull a patient's care goals from Oracle Health and ask which ones have no progress logged. Then record the outreach as a communication so the next coordinator knows it happened.

### Check charge items before the claim goes out

Billing. List the charge items on a visit, compare them with the patient's insurance plan, and correct a line in Oracle Health when a modifier is missing.

### Register a new patient from the intake form

Registration. Create the patient in Oracle Health with the details from the form, then update the record when the address or phone number changes at check-in.

### Record the reading as soon as it is taken

Nursing. Update a blood pressure or weight observation in Oracle Health from a plain sentence, and confirm the latest value for a patient before the clinician walks in.

### Log every outreach call in one place

Care management. After a call with a patient or family member, create the communication in Oracle Health with who was reached and what was agreed, so the chart tells the whole story.

## Elaichi vs Zapier MCP vs Composio for Oracle Health

All three can connect Oracle Health to an AI assistant, and all three have admin controls. They differ in where access lives and how you pay.

| What to check | Elaichi | Zapier MCP | Composio |
| --- | --- | --- | --- |
| Where the AI connects | One address for the whole organization. Endpoint: https://api.elaichi.ai/mcp | A server per member, created at sign-in. | An MCP endpoint per team, or an SDK. |
| Control over Oracle Health tools | Allow or restrict single Oracle Health tools, per role or user. | App and action restrictions on the account. | Role permissions, down to the action. |
| Record of calls | One audit entry per Oracle Health call. | A History tab of tool calls. | A log of every tool call. |
| Single sign-on | SAML or OIDC, plus SCIM, on Gold. | SAML on Enterprise. | SAML and OIDC on Enterprise. |
| Price | $15 per user per month. | 2 tasks per successful call. | Billed per tool call. |

Sources: Zapier MCP [docs](https://docs.zapier.com/mcp/get-started/quickstart), [security](https://docs.zapier.com/mcp/manage/security), [usage](https://docs.zapier.com/mcp/features/usage); Composio [docs](https://docs.composio.dev/docs/composio-connect), [gateway](https://composio.dev/mcp-gateway), [enterprise](https://composio.dev/enterprise), [pricing](https://composio.dev/pricing). Checked September 2026.

Longer take: [Zapier MCP alternative](/blog/zapier-mcp-alternative/) and [when you don't need an MCP gateway](/blog/when-you-dont-need-an-mcp-gateway/).

## Frequently asked questions

### How do I connect Oracle Health to Claude?

Connect Oracle Health in Elaichi first. Oracle Health requires an OAuth application registered on its own side, so one person brings that client ID and secret into Elaichi once, then signs in to Oracle Health as themselves. After that, open Claude, go to Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp. Nobody else on the team has to generate a client ID or secret, they simply sign in.

### Does Oracle Health work with ChatGPT and Cursor as well as Claude?

Yes. Once Oracle Health is connected in Elaichi, the same endpoint, https://api.elaichi.ai/mcp, works in Claude, ChatGPT, Cursor, any MCP client and the Elaichi Agent. You connect Oracle Health once and every client picks it up.

### What can an AI agent actually do with my Oracle Health data?

With Oracle Health connected, you can ask who is on tomorrow's schedule, book or move an appointment, look up a patient, register a new one, update an observation, log a communication, check a patient's insurance plan and review charge items on a visit. Short, specific asks such as "move Mrs. Rivera's 2pm to Thursday" work better than long paragraphs.

### Does connecting Oracle Health give the AI access to every patient record?

No. Every call into Oracle Health runs as the person who signed in, so the AI can only reach the patients, appointments and charge items that person could already open in Oracle Health. Elaichi can narrow that further with restrictions, and it can never widen it beyond what Oracle Health itself allows.

### Can my team share one Oracle Health connection?

Yes. One person connects Oracle Health in Elaichi and shares it with a team, and nobody else ever handles the client secret or sees a credential. Each teammate still signs in as themselves, so the audit log names the actual person behind every appointment booked or observation changed in Oracle Health.

### Can I stop an agent from deleting or changing things in Oracle Health?

This connector does not delete anything in Oracle Health at all. For changes, restrictions in Elaichi work per action, so you can allow reading patients and appointments while blocking creating or updating them. A restricted action is left out of the AI client's list entirely and cannot be called, whatever the prompt says.

### What happens to an Oracle Health connection when someone leaves?

Offboarding a person in Elaichi ends their access to Oracle Health through every client at once. A shared Oracle Health connection keeps working for everyone else on the team. If you want it gone entirely, disconnecting Oracle Health once in Elaichi removes it from Claude, ChatGPT, Cursor and every other client.

### Does the Oracle Health MCP connector work with Gemini, Codex, Claude Code or other MCP clients?

Yes. Oracle Health is reached over the same MCP endpoint every client uses, so anything that speaks MCP can call it — Gemini, Codex, Claude Code, Windsurf, Cline, Zed and OpenCode among them — alongside Claude, ChatGPT, Cursor, and the Elaichi Agent. The tools on offer and the access behind them are identical whichever client asks. Only the setup screen differs.

### Is Elaichi an alternative to Zapier MCP for Oracle Health?

Yes. Both let Claude, ChatGPT or Cursor use Oracle Health. Zapier MCP fits a team that already automates in Zapier, since each person signs in and acts as themselves in that account. Elaichi fits when IT wants one address for the whole company, per-tool rules by role, and a record of every Oracle Health call.

### How is Elaichi different from Composio for Oracle Health?

Composio gives AI agents tools and sign-in handling across 1,000+ apps, for developers building agents or people using an assistant, billed per tool call. Elaichi gives a company's own people governed access to Oracle Health: one address, restrictions per role or user, and $15 per user per month. Both have role permissions and a log of every call.

## All 128 Oracle Health tools

Every tool below is callable through https://api.elaichi.ai/mcp once Oracle Health is connected, subject to the toolbox it is in and the restrictions on the caller.

- **Get single Oracle Health goal by ID** (Get). Get a single goal by its logical resource ID in Oracle Health.
Returns: resourceType, id, meta, text, lifecycleStatus, achievementStatus, category, and more. Required: id.
- **List all Oracle Health goals** (List). List Oracle Health goals that match supplied filters. Requires either _id or patient; _id may not be combined with patient or target-date.
Returns: resourceType, id, meta, text, lifecycleStatus, achievementStatus, category, and more. Required: none strictly; see the search rules above.
- **List all Oracle Health people** (List). List Oracle Health Millennium Platform persons matching the supplied query parameters. Requires one of: _id (logical resource ID) or identifier (system|code).
Returns: resourceType, id, meta, text, identifier, name, telecom, and more. Required: none strictly; see the search rules above.
- **Get single Oracle Health person by ID** (Get). Get an Oracle Health Millennium Platform person by id (the logical resource ID). If the person record was combined into another record, an inactive entry with a link to the current person entry is returned.
Returns: resourceType, id, meta, text, identifier, name, telecom, and more. Required: id.
- **List all Oracle Health appointments** (List). List Oracle Health appointments matching search filters, sorted by start date ascending. Supply at least one of _id, patient, practitioner, or location; patient, practitioner, and location are mutually exclusive and require date or -date-or-req-period.
Returns: resourceType, id, meta, text, extension, status, cancelationReason, and more. Required: none strictly; see the search rules above.
- **Create a Oracle Health appointment** (Create). Create an Oracle Health appointment. Proposed appointments also need serviceType and requestedPeriod; booked ones need slot. Unsupported body fields are ignored.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, status, participant, participant.actor, participant.status.
- **Get single Oracle Health appointment by ID** (Get). Get a single Oracle Health appointment by id.
Returns: resourceType, id, meta, text, extension, status, cancelationReason, and more. Required: id.
- **Update a Oracle Health appointment by ID** (Update). Patch an existing Oracle Health appointment with RFC 6902 JSON Patch operations on /status, /slot, /reasonCode, /cancelationReason, /comment, /patient-status, /extension, and Video Visit link paths.
Send the current version of the record in truto_if_match (Truto sends it as the If-Match header); a stale version returns 409. Oracle answers with an empty body. The new version of the record is in the ETag response header. Required: id.
- **Get single Oracle Health communication by ID** (Get). Get a single communication in Oracle Health by its communication ID.
Returns: resourceType, id, meta, text, extension, inResponseTo, status, and more. Required: id.
- **Update a Oracle Health communication by ID** (Update). Update a communication in Oracle Health. Only the replace operation on /extension (the email-status extension) is documented.
Oracle answers with an empty body. The new version of the record is in the ETag response header. Required: id.
- **List all Oracle Health communications** (List). List communications in Oracle Health matching the supplied filters; communication content is returned through the Binary resource via each record's payload. Use _id alone, or category together with recipient, received, and -email-status. At most 1000 elements are returned.
Returns: resourceType, id, meta, text, extension, inResponseTo, status, and more. Required: none strictly; see the search rules above.
- **Create a Oracle Health communication** (Create). Create a communication in Oracle Health.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, status, category, recipient, sender, payload.
- **List all Oracle Health insurance plans** (List). List insurance plans in Oracle Health Millennium that match the supplied filters. Requires exactly one of _id or owned-by; they are mutually exclusive.
Returns: resourceType, id, text, status, type, name, period, and more. Required: none strictly; see the search rules above.
- **Get single Oracle Health insurance plan by ID** (Get). Get a single insurance plan in Oracle Health Millennium by its logical resource id.
Returns: resourceType, id, text, status, type, name, period, and more. Required: id.
- **List all Oracle Health patients** (List). Search patients in Oracle Health. Supply _id, or at least one of identifier, family, given, name, birthdate, address-postalcode, phone or email; gender only works together with another parameter. Searching by given needs family. The name, family and given parameters accept the :exact modifier and match current names only; Oracle advises using :exact and not combining family or given with name. A search that matches more than 1000 patients fails with 422.
Returns: resourceType, id, meta, text, extension, identifier, active, and more. Required: none strictly; see the search rules above.
- **Create a Oracle Health patient** (Create). Create a new patient in Oracle Health by posting a FHIR Patient resource as application/fhir+json.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, identifier, name, name.family, name.use.
- **Get single Oracle Health patient by ID** (Get). Get one patient by id. The Patient.animal modifier element and direct secure email are not returned.
Returns: resourceType, id, meta, text, extension, identifier, active, and more. Required: id.
- **Update a Oracle Health patient by ID** (Update). Patch a patient with an RFC 6902 JSON Patch array.
Send the current version of the record in truto_if_match (Truto sends it as the If-Match header); a stale version returns 409. Oracle answers with an empty body. The new version of the record is in the ETag response header. Required: id.
- **Get single Oracle Health charge item by ID** (Get). Get a single charge item in Oracle Health by id.
Returns: resourceType, id, meta, text, extension, status, code, and more. Required: id.
- **List all Oracle Health charge items** (List). List charge items in Oracle Health that meet supplied query parameters. Requires exactly one of _id, context, or account; when using context or account, -status must be set to billable.
Returns: resourceType, id, meta, text, extension, status, code, and more. Required: none strictly; see the search rules above.
- **Create a Oracle Health charge item modification** (Create). Create a modified charge item in Oracle Health by modifying an existing charge item via the FHIR $modify operation.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, parameter, transactionId, chargeItem, status, subject, context, code, replacing.
- **Create a Oracle Health charge item creation** (Create). Create a charge event in Oracle Health that can result in the creation of one or more charge items.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, parameter, transactionId, status, subject, context, occurrenceDateTime, quantity, code.
- **Get single Oracle Health observation by ID** (Get). Get one observation by id (laboratory, imaging, vital signs or social history).
Returns: resourceType, id, meta, text, identifier, status, category, and more. Required: id.
- **Update a Oracle Health observation by ID** (Update). Update an observation in Oracle Health by id (PUT). Send the current version in the If-Match header. The body must repeat the id. Only laboratory, imaging and vital-signs observations are supported, and the patient and category cannot change. Vital-signs observations also need their identifier, which cannot be modified.
Oracle answers with an empty body. The new version of the record is in the ETag response header. Required: id, resourceType, status, category, code, subject, effectiveDateTime.
- **List all Oracle Health observations** (List). List observations matching the supplied FHIR search filters (laboratory, imaging, vitals, and social history). Requires one of _id, patient, or subject; results are sorted by effective date/time descending and _count caps pages at 200.
Returns: resourceType, id, meta, text, identifier, status, category, and more. Required: none strictly; see the search rules above.
- **Create a Oracle Health observation** (Create). Create a new observation in Oracle Health (e.g. a new blood pressure reading). Requires a body with resourceType set to Observation; modifier fields cause the transaction to fail, and components are only honored for blood pressure and pulse oximetry profiles.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, status, category, code, subject, effectiveDateTime.
- **List all Oracle Health allergy intolerances** (List). List allergy intolerances in Oracle Health that meet the supplied search parameters. Supply one of patient or _id; _id may not be combined with other parameters except _revinclude.
Returns: resourceType, id, meta, text, clinicalStatus, verificationStatus, type, and more. Required: none strictly; see the search rules above.
- **Create a Oracle Health allergy intolerance** (Create). Create a new allergy intolerance in Oracle Health. Only supported body fields are accepted; unsupported fields are ignored.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, clinicalStatus, code, patient.
- **Get single Oracle Health allergy intolerance by ID** (Get). Get an individual allergy intolerance in Oracle Health by its associated ID.
Returns: resourceType, id, meta, text, clinicalStatus, verificationStatus, type, and more. Required: id.
- **Update a Oracle Health allergy intolerance by ID** (Update). Update an allergy intolerance in Oracle Health by id. Missing body fields are interpreted as nulling out or removing data from the resource.
Send the current version of the record in truto_if_match (Truto sends it as the If-Match header); a stale version returns 409. Oracle answers with an empty body. The new version of the record is in the ETag response header. Required: id, resourceType, code, patient.
- **List all Oracle Health capability statements** (List). Get the FHIR CapabilityStatement of this Oracle Health domain: the resource types and interactions it supports. No parameters are needed, and Oracle needs no authorization for it.
Returns: resourceType, url, name, title, status, date, publisher, and more. Required: none strictly; see the search rules above.
- **List all Oracle Health smart configurations** (List). Get the well-known SMART configuration of this Oracle Health domain: the authorization, token, revocation, management and introspection endpoints. No parameters are needed, and Oracle needs no authorization for it.
Returns: authorization_endpoint, token_endpoint, revocation_endpoint, management_endpoint, introspection_endpoint. Required: none strictly; see the search rules above.
- **Get single Oracle Health encounter by ID** (Get). Get a single Oracle Health encounter by id.
Returns: resourceType, id, meta, text, extension, identifier, status, and more. Required: id.
- **Update a Oracle Health encounter by ID** (Update). Patch an Oracle Health encounter by id using JSON Patch operations on /period/start, /period/end, /type, /extension, or /extension/-.
Send the current version of the record in truto_if_match (Truto sends it as the If-Match header); a stale version returns 409. Oracle answers with an empty body. The new version of the record is in the ETag response header. Required: id.
- **List all Oracle Health encounters** (List). List Oracle Health encounters matching the supplied filters, sorted newest-first by period start. One of _id, patient, subject, account, or identifier is required; when using patient, _count and status are also required.
Returns: resourceType, id, meta, text, extension, identifier, status, and more. Required: none strictly; see the search rules above.
- **Create a Oracle Health encounter** (Create). Create an encounter in Oracle Health.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, status, serviceProvider, location.
- **Get single Oracle Health condition by ID** (Get). Get a single condition in Oracle Health by its id.
Returns: resourceType, id, meta, text, clinicalStatus, verificationStatus, category, and more. Required: id.
- **Update a Oracle Health condition by ID** (Update). Update a condition in Oracle Health by id (PUT). The body must repeat the id. A field missing from the body is removed from the record. Only the problem-list-item and encounter-diagnosis categories are supported.
Send the current version of the record in truto_if_match (Truto sends it as the If-Match header); a stale version returns 409. Oracle answers with an empty body. The new version of the record is in the ETag response header. Required: id, resourceType, category, code, subject.
- **List all Oracle Health conditions** (List). Search conditions in Oracle Health. Supply at least one of _id, patient or subject. _revinclude=Provenance:target adds the Provenance entries of the matches (with _id or patient).
Returns: resourceType, id, meta, text, clinicalStatus, verificationStatus, category, and more. Required: none strictly; see the search rules above.
- **Create a Oracle Health condition** (Create). Create a new condition in Oracle Health.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, category, code, subject.
- **Create a Oracle Health financial transaction** (Create). Create a financial transaction in Oracle Health. Requires a FinancialTransactionCreate FHIR request body; only fields in the vendor's supported list are accepted - unsupported fields are ignored or can cause errors.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, identifier, code.
- **List all Oracle Health practitioners** (List). List practitioners in Oracle Health that match the supplied search parameters. Requires one of _id, identifier, family, name, or active.
Returns: resourceType, id, meta, text, extension, identifier, active, and more. Required: none strictly; see the search rules above.
- **Create a Oracle Health practitioner** (Create). Create a practitioner in Oracle Health to be referenced by other resources; not used for user provisioning.
Oracle answers with an empty body. The id of the new record is the last segment of the Location response header, and the new version is in the ETag header. Required: resourceType, name, name.family, name.given.
- **Get single Oracle Health practitioner by ID** (Get). Get a practitioner in Oracle Health by the logical resource ID.
Returns: resourceType, id, meta, text, extension, identifier, active, and more. Required: id.
- **List all Oracle Health slots** (List). List Oracle Health slots that match the supplied search parameters. At least one of _id, service-type, schedule.actor, or -location must be supplied, and start is required when using the latter three; only free, bookable slots are returned unless _id is used.
Returns: resourceType, id, meta, text, extension, serviceType, schedule, and more. Required: none strictly; see the search rules above.
- **Get single Oracle Health slot by ID** (Get). Get a single Oracle Health slot by its id.
Returns: resourceType, id, meta, text, extension, serviceType, schedule, and more. Required: id.
- **Update a Oracle Health slot by ID** (Update). Patch an existing Oracle Health slot by id using a JSON Patch (RFC 6902) array; only the replace operation on /status is supported, with value free or busy-tentative.
Send the current version of the record in truto_if_match (Truto sends it as the If-Match header); a stale version returns 409. Oracle answers with an empty body. The new version of the record is in the ETag response header. Required: id.
- **Get single Oracle Health document reference by ID** (Get). Get a document reference by id in Oracle Health Millennium. Read is supported for clinical-note, cardiology, radiology, microbiology, and pathology charted documents and clinical-note staged documents.
Returns: resourceType, id, meta, text, identifier, status, docStatus, and more. Required: id.
- **Update a Oracle Health document reference by ID** (Update). Update a document reference in Oracle Health Millennium by id. All provided dates must have a time component.
Send the current version of the record in truto_if_match (Truto sends it as the If-Match header); a stale version returns 409. Oracle answers with an empty body. The new version of the record is in the ETag response header. Required: id, resourceType, status, docStatus, subject, author, content, content.attachment, context, context.period.
- **List all Oracle Health document references** (List). List Oracle Health document references matching query filters. Requires either patient or _id; _count defaults to 10 and caps results at 100.
Returns: resourceType, id, meta, text, identifier, status, docStatus, and more. Required: none strictly; see the search rules above.
- ...and 78 more tools. Call `tools/list` via the MCP endpoint, or see the full catalog via the API, for the complete set.
