Read-only Medplum chart search and patient context for MCP clients.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Read the chart broadly. Write only what a human approved. Last EHR is the agent layer for a headless FHIR EHR. It does three things, and the write protocol is only one of them.
It reads the chart broadly. 25 of US Core 9.0.0's 27 readable resource types, across 23 patient-scoped sections, following references so authors, encounters, and provenance stop being dead pointers. Counted in the open, with the ceiling published rather than implied, in FHIR coverage.
It is built so the agent cannot fake an absence. "She has never had a flu shot" is the answer a chart agent must never invent, so a read reports when its window was capped, when a reference lookup was refused, and when a code filter matched nothing in a section that does hold records. Filters that a section cannot apply are refused with the legal values instead of silently dropped. These are safety-boundary tests, not best-effort behavior.
Every write is a proposal. Show the exact resource, require an explicit human decision, commit exactly what was reviewed, and record what created it. That half is a small protocol, Approval-Gated Agent Writes on FHIR (v0.1 draft): Proposal β Decision β Commit β Audit. Two implementations run here, a web approval card and MCP elicitation-gated write tools, plus a conformance suite that checks implementations with its own FHIR reads. Independent implementations and criticism are invited.
Five FHIR backends sit behind one interface. This repository is the reference implementation: bring your own FHIR backend and model key for a real agent (Medplum for the authenticated path, or any verified adapter for synthetic evaluation), or start with the zero-key local synthetic walkthrough.
Last EHR is a layer, not an EHR. It runs on top of a headless FHIR backend (Medplum for authenticated use; HAPI FHIR, Firely Server, Aidbox, or Oystehr for synthetic evaluation) and talks to it over the FHIR API. It is not the system of record, stores no PHI of its own, and never bundles or forks the backend.
Status: early / alpha. APIs, structure, and scope will change. Use synthetic data only. Β· License: Apache-2.0
Try the live demo: no sign-up, synthetic data, and every write goes through the approval gate.

| Goal | Start here |
|---|---|
| See the approval loop now | Try the live synthetic-data demo: no sign-up. |
| Read the protocol | Approval-Gated Agent Writes on FHIR, v0.1 draft |
| See exactly what the agent can reach in FHIR | FHIR coverage: counted against US Core, ceiling included |
| Test an MCP (stdio) implementation of the protocol | npx @lastehr/agent-write-conformance β see the conformance guide |
| Give an MCP client bounded chart tools β read-only by default, opt-in approved writes (Medplum, or the local HAPI stack) | npx -y @lastehr/mcp init --client claude-code |
| Try fixture MCP locally without FHIR credentials or a provider API key | npm run mcp:demo -- --client claude-code |
| Prove the synthetic web-agent workflow locally | npm run eval |
| Inspect the complete flow locally with no account or model key | npm run demo:local |
Find patients named Smith.Record a heart rate of 72 bpm for Maria Garcia.For MCP, @lastehr/mcp is deliberately a separate surface that is
read-only by default (search_patients, show_patient_info,
read_chart_section, and read_document β the same bounded chart reads the
web agent gets), with one opt-in: elicitation-gated write proposals a human
approves per action.
Configure a least-privilege Medplum token before connecting it to a real
project; full setup is in the
MCP guide and the Official MCP Registry listing.
Want to inspect the read surface before configuring Medplum? From a
checkout, npm run mcp:demo starts the included local HAPI stack, resets the
four synthetic fixture charts, and prints a Claude Code/Cursor configuration.
That checkout-only MCP Local Lab needs no FHIR/Medplum credentials or
model-provider API key of its own and is restricted to fixture patients. Your
MCP client still uses its normal account and may send those synthetic results
to its model provider. It is not the published package, generic HAPI support,
or a path for PHI.
For a deterministic safety-mechanics check, npm run eval creates a separate
synthetic target, proves the proposal/approval and denial paths, verifies chart
association, cleans up, and writes a scrubbed report. It is not a clinical,
authorization, or compliance certification; see the evaluation guide.
Project = tenant, ProjectMembership = user, AccessPolicy = RBAC). Last EHR doesn't reimplement any of that, and writes are bounded by your AccessPolicy.Last EHR is Medplum-supported for authenticated deployments and includes a
local, no-auth HAPI FHIR mode for synthetic-data evaluation. Firely
Server (FHIR_BACKEND=firely), Aidbox (FHIR_BACKEND=aidbox), and
Oystehr (FHIR_BACKEND=oystehr) are verified synthetic-evaluation
adapters: each passed both contract harnesses and the
FHIR Agent Safety Eval against a disposable synthetic
target. Other FHIR R4 backends need an adapter before they are
supported. See the full support matrix for the web,
SMART, MCP, auth, and evaluation boundaries before choosing a path.
Self-hosted demos can offer a backend picker (swap the EHR under the
live agent, per session) and an "under the hood" panel streaming the
agent's FHIR operations β both off by default; see the support matrix for
the eligibility rules and npm run check:backends for preflight.
Next.js 15 (App Router) + React 19. The agent lives in app/api/chat/route.ts (streamText + FHIR tools); the FHIR calls go through a small backend interface (lib/fhir/backend.ts) with five built-in adapters: Medplum (hosted or self-hosted, token-authenticated), plus local HAPI FHIR, Firely Server, Aidbox, and Oystehr for synthetic evaluation (docs/support.md). The interface is four methods plus contract notes, so an adapter for another headless EHR is a small, well-scoped contribution. See docs/adapters.md and the roadmap.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/last-ehr-medplum)<a href="https://allmcps.com/mcp/last-ehr-medplum"><img src="https://allmcps.com/api/badge/last-ehr-medplum?style=directory" alt="Last EHR β Medplum on AllMCPs" /></a>