NestDaddy

Last EHR — Medplum

io.github.cbetz/last-ehr · v0.5.4

FHIR chart tools for MCP: read-only by default, with elicitation-gated, human-approved writes.

Connect Runs on your machine

Terminal
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]
claude_desktop_config.json
{
  "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>"
      }
    }
  }
}
~/.cursor/mcp.json
{
  "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>"
      }
    }
  }
}
.vscode/mcp.json
{
  "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

NameDescription
MEDPLUM_ACCESS_TOKEN
Optional, 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_ID
Optional
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_SECRET
Optional, 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_URL
Optional
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_BACKEND
Optional
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_ADAPTERS
Optional
Set to 1 to enable LASTEHR_BACKEND epic, oracle, or smart.
LASTEHR_CLIENT_ID
Optional
SMART Backend Services client id. Not a secret.
LASTEHR_PRIVATE_KEY
Optional, secret
PKCS#8 PEM for SMART private_key_jwt. Never log it.
LASTEHR_PRIVATE_KEY_PATH
Optional
Path to the PKCS#8 PEM. Alternative to LASTEHR_PRIVATE_KEY.
LASTEHR_KEY_ID
Optional
JWT kid. Must match the public JWKS.
LASTEHR_JWKS_URL
Optional
https URL of the public JWKS. doctor checks that LASTEHR_KEY_ID is present. Optional.
LASTEHR_SCOPES
Optional
Space-delimited SMART scopes. Required for Oracle. Omit for Epic unless overriding the app registration.
LASTEHR_FHIR_BASE_URL
Optional
FHIR base URL. Epic and Oracle default to their public sandboxes when unset.
LASTEHR_TOKEN_URL
Optional
SMART token URL. Epic and Oracle default to their public sandboxes when unset.
LASTEHR_ENCOUNTER
Optional
Encounter/{id} added to Epic observations when the tool call omits encounter.
LASTEHR_PERFORMER
Optional
Practitioner/{id} filed as legal authenticator on Oracle observations.

Details

Package@lastehr/[email protected] (NPM, stdio)
First published12 Nov 2026
Last updated12 Nov 2026
Registry nameio.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.