# Epic MCP connector

The Epic connector brings appointments, allergies, care plans, care teams, accounts, claims and patient communications into Claude, ChatGPT, Cursor and the Elaichi Agent, where each person works inside their own Epic access with every call logged.

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

## Facts

| | |
| --- | --- |
| Application | Epic |
| Category | Healthcare |
| AI tools | 143 |
| 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 Epic is connected

- List today's appointments and flag any patient with a documented allergy.
- Who is on the care team for the patient on account 48213?
- Summarize the adverse events recorded this week.

## Connect Epic in Elaichi

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

1. Open Connections, choose Add connection, and pick Epic.
2. Optionally set Share with, then press Connect.
3. Supply your own Epic app, then approve. Epic 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 Epic tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Epic 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.

## Epic 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.

## Epic 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 Epic 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 Epic 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 Epic through Elaichi

### See the day's appointments at a glance

Scheduling. Ask for today's Epic appointments, pull up a single visit to confirm the time and provider, and answer a patient's phone call without clicking through the schedule.

### Check allergies before a visit starts

Nursing. Review a patient's recorded allergy intolerances in Epic before they are roomed, and record a newly reported allergy so it is on the chart before the clinician walks in.

### Review adverse events across the unit

Patient safety. List the adverse events recorded in Epic this week, open any one of them for the detail, and prepare the summary for the safety huddle.

### Find out who is on a care team

Care coordination. Search Epic care teams for a patient, read the current care plan, and know exactly who to call about a discharge or a follow-up.

### Look up an account or a claim

Revenue cycle. Pull a patient account or a specific claim from Epic to answer a billing question while the caller is still on the line.

### Log a communication to the record

Health information. Record a call, a letter or a message as an Epic communication so the patient record shows what was said and when, and list past communications when a question comes back.

## Elaichi vs Zapier MCP vs Composio for Epic

All three can connect Epic 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 Epic tools | Allow or restrict single Epic 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 Epic 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 Epic to Claude?

First, register an OAuth application inside Epic and bring its client ID and secret into Elaichi once, when you connect Epic. After that, each person signs in through Epic's own login page and never handles the secret themselves. Then open Claude, go to Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp as the endpoint. Claude asks you to sign in to Elaichi and Epic is ready to use.

### Does Epic work with ChatGPT and Cursor as well as Claude?

Yes. Once Epic is connected in Elaichi, the same endpoint, https://api.elaichi.ai/mcp, works in Claude, ChatGPT, Cursor, any other MCP client and the Elaichi Agent. You connect Epic once and every client uses that one connection.

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

It can list and open appointments, allergy intolerances, adverse events, care plans, care teams, accounts, claims, documents and communications in Epic, and it can record a new allergy, a new communication or a body structure note. The AI client does not see a list of every Epic action; it searches for the right one and runs it, so short concrete asks like "list today's appointments" work better than long sentences. Anything you ask for runs inside your own Epic access.

### Does connecting Epic give the AI access to every patient chart?

No. Every call to Epic runs as the person who signed in, so the AI sees only the patients, departments and records that person could already open in Epic. Elaichi can narrow that further by hiding actions or whole areas, but it never widens what Epic itself allows.

### Can my team share one Epic connection?

Yes. One person registers the Epic OAuth application and connects it in Elaichi, then shares it with a team, and nobody else ever handles the client ID or secret. Each person still signs in to Epic as themselves, so the audit log names the actual nurse, scheduler or biller behind every call.

### Can I stop an agent from changing things in Epic?

Yes. Restrictions in Elaichi apply per action, so you can allow reading Epic appointments and care plans while blocking the creation of allergies or communications. 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 Epic connection when someone leaves?

Offboarding that person in Elaichi ends their Epic access through every AI client at once. A shared Epic connection keeps working for everyone else on the team. If you ever want to remove Epic completely, disconnecting it once in Elaichi removes it from Claude, ChatGPT, Cursor and every other client at the same time.

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

Yes. Epic 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 Epic?

Yes. Both let Claude, ChatGPT or Cursor use Epic. 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 Epic call.

### How is Elaichi different from Composio for Epic?

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 Epic: one address, restrictions per role or user, and $15 per user per month. Both have role permissions and a log of every call.

## All 143 Epic tools

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

- **Get single Epic account by ID** (Get). Get a single Account (premium billing) from Epic by its FHIR id. Returns the FHIR R4 Account resource. Returns: resourceType, id, identifier, name, status, type, and more. Required: id.
- **List all Epic accounts** (List). Search Accounts in Epic. Returns the matching FHIR R4 Account resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, identifier, name, status, type, and more. Required: none strictly; see the search rules above.
- **Get single Epic adverse event by ID** (Get). Get a single AdverseEvent from Epic by its FHIR id. Returns the FHIR R4 AdverseEvent resource. Returns: resourceType, id, actuality, adverse-event-comments, adverse-event-expected, adverse-event-resolved-date, and more. Required: id.
- **List all Epic adverse events** (List). Search AdverseEvents in Epic. Returns the matching FHIR R4 AdverseEvent resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, actuality, adverse-event-comments, adverse-event-expected, adverse-event-resolved-date, and more. Required: none strictly; see the search rules above.
- **Get single Epic allergy intolerance by ID** (Get). Get a single AllergyIntolerance from Epic by its FHIR id. Returns the FHIR R4 AllergyIntolerance resource. Returns: resourceType, id, category, clinicalStatus, code, criticality, and more. Required: id.
- **List all Epic allergy intolerances** (List). Search AllergyIntolerances in Epic. Returns the matching FHIR R4 AllergyIntolerance resources from the search Bundle. Epic needs patient. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, category, clinicalStatus, code, criticality, and more. Required: patient.
- **Create a Epic allergy intolerance** (Create). Create an AllergyIntolerance in Epic from a FHIR R4 AllergyIntolerance JSON body. Returns the created resource when Epic honors Prefer: return=representation; otherwise the new id is only in the Location header.
Returns: resourceType, id, category, clinicalStatus, code, and more. Required: resourceType, patient.
- **Get single Epic appointment by ID** (Get). Get a single Appointment from Epic by its FHIR id. Returns the FHIR R4 Appointment resource. Returns: resourceType, id, _status, appointmentType, comment, created, and more. Required: id.
- **List all Epic appointments** (List). Search Appointments in Epic. Returns the matching FHIR R4 Appointment resources from the search Bundle. Epic needs patient. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, _status, appointmentType, comment, created, and more. Required: none strictly; see the search rules above.
- **Get single Epic binary by ID** (Get). Get a single Binary document from Epic by its FHIR id. Returns the FHIR R4 Binary resource. The default response is the FHIR Binary resource with the file as base64 in data. Returns: resourceType, id, contentType, data, and more. Required: id.
- **List all Epic binaries** (List). Search Binary documents in Epic. Returns the matching FHIR R4 Binary resources from the search Bundle. Look up one document with _id. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, contentType, data, and more. Required: none strictly; see the search rules above.
- **Get single Epic body structure by ID** (Get). Get a single BodyStructure from Epic by its FHIR id. Returns the FHIR R4 BodyStructure resource. Returns: resourceType, id, active, dental-tooth-eruption-status, location, morphology, and more. Required: id.
- **List all Epic body structures** (List). Search BodyStructures in Epic. Returns the matching FHIR R4 BodyStructure resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, active, dental-tooth-eruption-status, location, morphology, and more. Required: none strictly; see the search rules above.
- **Create a Epic body structure** (Create). Create a BodyStructure in Epic from a FHIR R4 BodyStructure JSON body. Returns the created resource when Epic honors Prefer: return=representation; otherwise the new id is only in the Location header.
Returns: resourceType, id, active, dental-tooth-eruption-status, location, and more. Required: resourceType, patient.
- **Update a Epic body structure by ID** (Update). Update a BodyStructure in Epic by FHIR id with a full FHIR R4 BodyStructure JSON body (PUT). Epic supports this only for the sub-APIs listed in its specification.
Returns: resourceType, id, active, dental-tooth-eruption-status, location, and more. Required: id, resourceType, patient.
- **Get single Epic care plan by ID** (Get). Get a single CarePlan from Epic by its FHIR id. Returns the FHIR R4 CarePlan resource. Returns: resourceType, id, _created, _description, _id, _implicitRules, and more. Required: id.
- **List all Epic care plans** (List). Search CarePlans in Epic. Returns the matching FHIR R4 CarePlan resources from the search Bundle. Epic needs patient (or subject) plus category. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, _created, _description, _id, _implicitRules, and more. Required: none strictly; see the search rules above.
- **Get single Epic care team by ID** (Get). Get a single CareTeam from Epic by its FHIR id. Returns the FHIR R4 CareTeam resource. Returns: resourceType, id, category, participant, status, subject, and more. Required: id.
- **List all Epic care teams** (List). Search CareTeams in Epic. Returns the matching FHIR R4 CareTeam resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, category, participant, status, subject, and more. Required: none strictly; see the search rules above.
- **Epic care teams search** (Search). Search CareTeams in Epic with an HTTP POST form body instead of a query string (the FHIR _search interaction), for searches too long for a URL. Returns the matching FHIR R4 CareTeam resources from the search Bundle. Epic needs patient or subject for most clinical searches.
Returns: resourceType, id, category, participant, status, subject, and more. Required: none strictly; see the search rules above.
- **Get single Epic claim by ID** (Get). Get a single Claim from Epic by its FHIR id. Returns the FHIR R4 Claim resource. Returns: resourceType, id, admissiondate, careTeam, diagnosis, dischargedate, and more. Required: id.
- **Get single Epic communication by ID** (Get). Get a single Communication from Epic by its FHIR id. Returns the FHIR R4 Communication resource. Returns: resourceType, id, basedOn, encounter, inResponseTo, partOf, and more. Required: id.
- **List all Epic communications** (List). Search Communications in Epic. Returns the matching FHIR R4 Communication resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, basedOn, encounter, inResponseTo, partOf, and more. Required: none strictly; see the search rules above.
- **Create a Epic communication** (Create). Create a Communication in Epic from a FHIR R4 Communication JSON body. Returns the created resource when Epic honors Prefer: return=representation; otherwise the new id is only in the Location header.
Returns: resourceType, id, basedOn, encounter, inResponseTo, and more. Required: resourceType, basedOn, encounter, payload, recipient, sender, sent, status, subject.
- **Get single Epic condition by ID** (Get). Get a single Condition from Epic by its FHIR id. Returns the FHIR R4 Condition resource. Returns: resourceType, id, abatementDateTime, category, clinicalStatus, code, and more. Required: id.
- **List all Epic conditions** (List). Search Conditions in Epic. Returns the matching FHIR R4 Condition resources from the search Bundle. Epic needs patient or subject (or encounter for encounter diagnoses and infections); filter by category for problems, encounter diagnoses, health concerns and others. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, abatementDateTime, category, clinicalStatus, code, and more. Required: none strictly; see the search rules above.
- **Epic conditions search** (Search). Search Conditions in Epic with an HTTP POST form body instead of a query string (the FHIR _search interaction), for searches too long for a URL. Returns the matching FHIR R4 Condition resources from the search Bundle. Epic needs patient or subject (or encounter for encounter diagnoses and infections); filter by category for problems, encounter diagnoses, health concerns and others.
Returns: resourceType, id, abatementDateTime, category, clinicalStatus, code, and more. Required: none strictly; see the search rules above.
- **Create a Epic condition** (Create). Create a Condition in Epic from a FHIR R4 Condition JSON body. Returns the created resource when Epic honors Prefer: return=representation; otherwise the new id is only in the Location header.
Returns: resourceType, id, abatementDateTime, category, clinicalStatus, and more. Required: resourceType, code, onsetPeriod, subject.
- **Get single Epic consent by ID** (Get). Get a single Consent from Epic by its FHIR id. Returns the FHIR R4 Consent resource. Returns: resourceType, id, category, comment, dateTime, identifier, and more. Required: id.
- **List all Epic consents** (List). Search Consents in Epic. Returns the matching FHIR R4 Consent resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, category, comment, dateTime, identifier, and more. Required: none strictly; see the search rules above.
- **Epic consents search** (Search). Search Consents in Epic with an HTTP POST form body instead of a query string (the FHIR _search interaction), for searches too long for a URL. Returns the matching FHIR R4 Consent resources from the search Bundle. Epic needs patient or subject for most clinical searches.
Returns: resourceType, id, category, comment, dateTime, identifier, and more. Required: none strictly; see the search rules above.
- **Get single Epic contract by ID** (Get). Get a single Contract from Epic by its FHIR id. Returns the FHIR R4 Contract resource. Returns: resourceType, id, meta, and more. Required: id.
- **List all Epic contracts** (List). Search Contracts in Epic. Returns the matching FHIR R4 Contract resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, meta, and more. Required: none strictly; see the search rules above.
- **Get single Epic coverage by ID** (Get). Get a single Coverage from Epic by its FHIR id. Returns the FHIR R4 Coverage resource. Returns: resourceType, id, beneficiary, class, contained, dependent, and more. Required: id.
- **List all Epic coverages** (List). Search Coverages in Epic. Returns the matching FHIR R4 Coverage resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, beneficiary, class, contained, dependent, and more. Required: none strictly; see the search rules above.
- **Get single Epic device by ID** (Get). Get a single Device from Epic by its FHIR id. Returns the FHIR R4 Device resource. Returns: resourceType, id, contact, deviceName, distinctIdentifier, expirationDate, and more. Required: id.
- **List all Epic devices** (List). Search Devices in Epic. Returns the matching FHIR R4 Device resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, contact, deviceName, distinctIdentifier, expirationDate, and more. Required: none strictly; see the search rules above.
- **Get single Epic device request by ID** (Get). Get a single DeviceRequest from Epic by its FHIR id. Returns the FHIR R4 DeviceRequest resource. Returns: resourceType, id, authoredOn, basedOn, codeCodeableConcept, encounter, and more. Required: id.
- **List all Epic device requests** (List). Search DeviceRequests in Epic. Returns the matching FHIR R4 DeviceRequest resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, authoredOn, basedOn, codeCodeableConcept, encounter, and more. Required: patient.
- **Get single Epic device use statement by ID** (Get). Get a single DeviceUseStatement from Epic by its FHIR id. Returns the FHIR R4 DeviceUseStatement resource. Returns: resourceType, id, bodySite, device, HealthcareProvider, HealthProfessional, and more. Required: id.
- **List all Epic device use statements** (List). Search DeviceUseStatements in Epic. Returns the matching FHIR R4 DeviceUseStatement resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, bodySite, device, HealthcareProvider, HealthProfessional, and more. Required: patient.
- **Get single Epic diagnostic report by ID** (Get). Get a single DiagnosticReport from Epic by its FHIR id. Returns the FHIR R4 DiagnosticReport resource. Returns: resourceType, id, basedOn, category, code, conclusionCode, and more. Required: id.
- **List all Epic diagnostic reports** (List). Search DiagnosticReports in Epic. Returns the matching FHIR R4 DiagnosticReport resources from the search Bundle. Epic needs patient or subject for most clinical searches. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, basedOn, category, code, conclusionCode, and more. Required: none strictly; see the search rules above.
- **Get single Epic document reference by ID** (Get). Get a single DocumentReference from Epic by its FHIR id. Returns the FHIR R4 DocumentReference resource. Returns: resourceType, id, authenticator, author, category, content, and more. Required: id.
- **List all Epic document references** (List). Search DocumentReferences in Epic. Returns the matching FHIR R4 DocumentReference resources from the search Bundle. Epic needs patient or subject (some sub-APIs also accept encounter); filter by category and type for clinical notes, CCDAs, results and others. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, authenticator, author, category, content, and more. Required: none strictly; see the search rules above.
- **Epic document references search** (Search). Search DocumentReferences in Epic with an HTTP POST form body instead of a query string (the FHIR _search interaction), for searches too long for a URL. Returns the matching FHIR R4 DocumentReference resources from the search Bundle. Epic needs patient or subject (some sub-APIs also accept encounter); filter by category and type for clinical notes, CCDAs, results and others.
Returns: resourceType, id, authenticator, author, category, content, and more. Required: none strictly; see the search rules above.
- **Create a Epic document reference** (Create). Create a DocumentReference in Epic from a FHIR R4 DocumentReference JSON body. Returns the created resource when Epic honors Prefer: return=representation; otherwise the new id is only in the Location header.
Returns: resourceType, id, authenticator, author, category, and more. Required: resourceType.
- **Update a Epic document reference by ID** (Update). Update a DocumentReference in Epic by FHIR id with a full FHIR R4 DocumentReference JSON body (PUT). Epic supports this only for the sub-APIs listed in its specification.
Returns: resourceType, id, authenticator, author, category, and more. Required: id, resourceType.
- **Get single Epic encounter by ID** (Get). Get a single Encounter from Epic by its FHIR id. Returns the FHIR R4 Encounter resource. Returns: resourceType, id, account, class, diagnosis, episodeOfCare, and more. Required: id.
- **List all Epic encounters** (List). Search Encounters in Epic. Returns the matching FHIR R4 Encounter resources from the search Bundle. Epic needs patient or subject. Page size is set with limit (sent as _count, 1 to 999); pages follow the Bundle next link.
Returns: resourceType, id, account, class, diagnosis, episodeOfCare, and more. Required: none strictly; see the search rules above.
- ...and 93 more tools. Call `tools/list` via the MCP endpoint, or see the full catalog via the API, for the complete set.
