Epic MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| EPIC_MCP_HOME | No | Data folder. The default is ~/.epic-mcp. All local data (tokens.json, access_log.jsonl and certs/) lives there. | |
| EPIC_CLIENT_ID | No | The production client ID. | |
| EPIC_FHIR_BASE | No | Your health system's FHIR R4 base URL, from Epic's endpoint directory. By default, Epic MCP connects to Epic's sandbox, which has test patients only. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Reads the signed-in patient's own medication list from MyChart (Epic) via FHIR. Read-only. If a tool says the user is not signed in, call login, show the user the sign-in link, and after they finish call login_status. Medication info is not medical advice; suggest confirming changes with their care team or pharmacist.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| loginA | Start MyChart sign-in. Returns a link the user must open to sign in and approve access. |
| complete_loginA | Finish sign-in by passing the full URL the browser ended on (https://localhost:.../callback?code=...). |
| login_statusA | Report whether the user is signed in to MyChart and when the session expires. |
| logoutA | Delete the locally stored MyChart tokens. |
| get_medicationsA | Get the signed-in patient's medication list (prescriptions and outside records). |
| get_patientA | Get the signed-in patient's basic demographics (name, birth date) to confirm whose record this is. |
| get_access_logB | Show the local record of every time Epic MCP fetched health data (most recent last). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 7 tools
The auth lifecycle steps (login, complete_login, login_status, logout) are related but distinguishable via their descriptions, and the data tools (get_medications, get_patient) plus audit tool (get_access_log) are clearly separate. The main risk is an agent confusing login with complete_login when skimming names, though the descriptions resolve it.
All names use snake_case and are readable, with data tools following a get_noun pattern. Auth tools deviate (login, complete_login, login_status, logout) but the deviation is semantically sensible; login_status is the only name that doesn't fit a pure verb_noun shape.
Seven tools is well-scoped: four cover the necessary OAuth/MyChart sign-in lifecycle, two fetch patient data, and one provides an audit trail. Each tool has a clear reason to exist and nothing feels redundant.
The auth lifecycle and audit logging are complete, but for an Epic/MyChart patient-access server the data surface is very thin: only medications and basic demographics. Common FHIR resources such as lab results, conditions, allergies, immunizations, appointments, and messages are absent, so many plausible patient queries will dead-end.