FHIR chart tools for MCP: read-only by default, with elicitation-gated, human-approved writes.
Connect Runs on your machine
claude mcp add last-ehr -e MEDPLUM_ACCESS_TOKEN=<MEDPLUM_ACCESS_TOKEN> -e MEDPLUM_CLIENT_ID=<MEDPLUM_CLIENT_ID> -e MEDPLUM_CLIENT_SECRET=<MEDPLUM_CLIENT_SECRET> -e MEDPLUM_BASE_URL=<MEDPLUM_BASE_URL> -e LASTEHR_BACKEND=<LASTEHR_BACKEND> -e LASTEHR_EXPERIMENTAL_FHIR_ADAPTERS=<LASTEHR_EXPERIMENTAL_FHIR_ADAPTERS> -e LASTEHR_CLIENT_ID=<LASTEHR_CLIENT_ID> -e LASTEHR_PRIVATE_KEY=<LASTEHR_PRIVATE_KEY> -e LASTEHR_PRIVATE_KEY_PATH=<LASTEHR_PRIVATE_KEY_PATH> -e LASTEHR_KEY_ID=<LASTEHR_KEY_ID> -e LASTEHR_JWKS_URL=<LASTEHR_JWKS_URL> -e LASTEHR_SCOPES=<LASTEHR_SCOPES> -e LASTEHR_FHIR_BASE_URL=<LASTEHR_FHIR_BASE_URL> -e LASTEHR_TOKEN_URL=<LASTEHR_TOKEN_URL> -e LASTEHR_ENCOUNTER=<LASTEHR_ENCOUNTER> -e LASTEHR_PERFORMER=<LASTEHR_PERFORMER> -- npx -y @lastehr/[email protected]
{
"mcpServers": {
"last-ehr": {
"command": "npx",
"args": [
"-y",
"@lastehr/[email protected]"
],
"env": {
"MEDPLUM_ACCESS_TOKEN": "<MEDPLUM_ACCESS_TOKEN>",
"MEDPLUM_CLIENT_ID": "<MEDPLUM_CLIENT_ID>",
"MEDPLUM_CLIENT_SECRET": "<MEDPLUM_CLIENT_SECRET>",
"MEDPLUM_BASE_URL": "<MEDPLUM_BASE_URL>",
"LASTEHR_BACKEND": "<LASTEHR_BACKEND>",
"LASTEHR_EXPERIMENTAL_FHIR_ADAPTERS": "<LASTEHR_EXPERIMENTAL_FHIR_ADAPTERS>",
"LASTEHR_CLIENT_ID": "<LASTEHR_CLIENT_ID>",
"LASTEHR_PRIVATE_KEY": "<LASTEHR_PRIVATE_KEY>",
"LASTEHR_PRIVATE_KEY_PATH": "<LASTEHR_PRIVATE_KEY_PATH>",
"LASTEHR_KEY_ID": "<LASTEHR_KEY_ID>",
"LASTEHR_JWKS_URL": "<LASTEHR_JWKS_URL>",
"LASTEHR_SCOPES": "<LASTEHR_SCOPES>",
"LASTEHR_FHIR_BASE_URL": "<LASTEHR_FHIR_BASE_URL>",
"LASTEHR_TOKEN_URL": "<LASTEHR_TOKEN_URL>",
"LASTEHR_ENCOUNTER": "<LASTEHR_ENCOUNTER>",
"LASTEHR_PERFORMER": "<LASTEHR_PERFORMER>"
}
}
}
}
{
"mcpServers": {
"last-ehr": {
"command": "npx",
"args": [
"-y",
"@lastehr/[email protected]"
],
"env": {
"MEDPLUM_ACCESS_TOKEN": "<MEDPLUM_ACCESS_TOKEN>",
"MEDPLUM_CLIENT_ID": "<MEDPLUM_CLIENT_ID>",
"MEDPLUM_CLIENT_SECRET": "<MEDPLUM_CLIENT_SECRET>",
"MEDPLUM_BASE_URL": "<MEDPLUM_BASE_URL>",
"LASTEHR_BACKEND": "<LASTEHR_BACKEND>",
"LASTEHR_EXPERIMENTAL_FHIR_ADAPTERS": "<LASTEHR_EXPERIMENTAL_FHIR_ADAPTERS>",
"LASTEHR_CLIENT_ID": "<LASTEHR_CLIENT_ID>",
"LASTEHR_PRIVATE_KEY": "<LASTEHR_PRIVATE_KEY>",
"LASTEHR_PRIVATE_KEY_PATH": "<LASTEHR_PRIVATE_KEY_PATH>",
"LASTEHR_KEY_ID": "<LASTEHR_KEY_ID>",
"LASTEHR_JWKS_URL": "<LASTEHR_JWKS_URL>",
"LASTEHR_SCOPES": "<LASTEHR_SCOPES>",
"LASTEHR_FHIR_BASE_URL": "<LASTEHR_FHIR_BASE_URL>",
"LASTEHR_TOKEN_URL": "<LASTEHR_TOKEN_URL>",
"LASTEHR_ENCOUNTER": "<LASTEHR_ENCOUNTER>",
"LASTEHR_PERFORMER": "<LASTEHR_PERFORMER>"
}
}
}
}
{
"servers": {
"last-ehr": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@lastehr/[email protected]"
],
"env": {
"MEDPLUM_ACCESS_TOKEN": "<MEDPLUM_ACCESS_TOKEN>",
"MEDPLUM_CLIENT_ID": "<MEDPLUM_CLIENT_ID>",
"MEDPLUM_CLIENT_SECRET": "<MEDPLUM_CLIENT_SECRET>",
"MEDPLUM_BASE_URL": "<MEDPLUM_BASE_URL>",
"LASTEHR_BACKEND": "<LASTEHR_BACKEND>",
"LASTEHR_EXPERIMENTAL_FHIR_ADAPTERS": "<LASTEHR_EXPERIMENTAL_FHIR_ADAPTERS>",
"LASTEHR_CLIENT_ID": "<LASTEHR_CLIENT_ID>",
"LASTEHR_PRIVATE_KEY": "<LASTEHR_PRIVATE_KEY>",
"LASTEHR_PRIVATE_KEY_PATH": "<LASTEHR_PRIVATE_KEY_PATH>",
"LASTEHR_KEY_ID": "<LASTEHR_KEY_ID>",
"LASTEHR_JWKS_URL": "<LASTEHR_JWKS_URL>",
"LASTEHR_SCOPES": "<LASTEHR_SCOPES>",
"LASTEHR_FHIR_BASE_URL": "<LASTEHR_FHIR_BASE_URL>",
"LASTEHR_TOKEN_URL": "<LASTEHR_TOKEN_URL>",
"LASTEHR_ENCOUNTER": "<LASTEHR_ENCOUNTER>",
"LASTEHR_PERFORMER": "<LASTEHR_PERFORMER>"
}
}
}
}
Replace the values in angle brackets with your own. Keys stay on your machine; we never see them.
Tools
This server runs locally, so its tools are listed by your MCP client once it starts.
Environment variables
| Name | Description |
|---|---|
MEDPLUM_ACCESS_TOKENOptional, secret | FHIR chart tools over Medplum or a local HAPI stack: read-only by default, with an opt-in elicitation-gated write profile (human-approved per action). |
MEDPLUM_CLIENT_IDOptional | FHIR chart tools over Medplum or a local HAPI stack: read-only by default, with an opt-in elicitation-gated write profile (human-approved per action). |
MEDPLUM_CLIENT_SECRETOptional, secret | FHIR chart tools over Medplum or a local HAPI stack: read-only by default, with an opt-in elicitation-gated write profile (human-approved per action). |
MEDPLUM_BASE_URLOptional | FHIR chart tools over Medplum or a local HAPI stack: read-only by default, with an opt-in elicitation-gated write profile (human-approved per action). |
LASTEHR_BACKENDOptional | epic, oracle, or smart. Requires LASTEHR_EXPERIMENTAL_FHIR_ADAPTERS=1. Sandbox writes are approval-gated and persist because those sandboxes do not support delete. |
LASTEHR_EXPERIMENTAL_FHIR_ADAPTERSOptional | Set to 1 to enable LASTEHR_BACKEND epic, oracle, or smart. |
LASTEHR_CLIENT_IDOptional | SMART Backend Services client id. Not a secret. |
LASTEHR_PRIVATE_KEYOptional, secret | PKCS#8 PEM for SMART private_key_jwt. Never log it. |
LASTEHR_PRIVATE_KEY_PATHOptional | Path to the PKCS#8 PEM. Alternative to LASTEHR_PRIVATE_KEY. |
LASTEHR_KEY_IDOptional | JWT kid. Must match the public JWKS. |
LASTEHR_JWKS_URLOptional | https URL of the public JWKS. doctor checks that LASTEHR_KEY_ID is present. Optional. |
LASTEHR_SCOPESOptional | Space-delimited SMART scopes. Required for Oracle. Omit for Epic unless overriding the app registration. |
LASTEHR_FHIR_BASE_URLOptional | FHIR base URL. Epic and Oracle default to their public sandboxes when unset. |
LASTEHR_TOKEN_URLOptional | SMART token URL. Epic and Oracle default to their public sandboxes when unset. |
LASTEHR_ENCOUNTEROptional | Encounter/{id} added to Epic observations when the tool call omits encounter. |
LASTEHR_PERFORMEROptional | Practitioner/{id} filed as legal authenticator on Oracle observations. |
Details
| Package | @lastehr/[email protected] (NPM, stdio) |
| First published | 12 Nov 2026 |
| Last updated | 12 Nov 2026 |
| Registry name | io.github.cbetz/last-ehr |
More other servers See all
Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.
