Anpheros FHIR
Remote MCP server that lets an AI assistant read and add to a person's health record (HL7 FHIR R4) only after that person approves access through OAuth, with scopes, expiry and revocation. Developers can try it with a free sandbox of 30 synthetic patients.
Hosted MCP Server
npx add-mcp 'https://platform.anpheros.com/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Free · 30 synthetic patients · no card Your first API call in 2 minutes →
Connect Claude Code, Cursor, VS Code or Claude Desktop to an HL7 FHIR R4 API through MCP: 20 tools for reading records, AI-ready context, writing, lab import and sandbox reset, on 30 synthetic patients, free.
Anpheros FHIR is a remote MCP server that lets an AI agent (Claude, ChatGPT, Claude Code, Cursor, VS Code, Claude Desktop) work with an HL7 FHIR R4 health-data API. It connects in two ways:
- With a free sandbox key, for developers: your agent lists patients, reads their records as FHIR or as an AI-ready context with provenance, writes observations, imports lab reports and resets its test data, all on 30 synthetic patients with realistic histories.
- With OAuth, for a person and their own record: the assistant registers itself, the person signs in and approves it on the Anpheros consent screen, and the assistant can then read that one record, for the period chosen, read-only unless the person allowed more.
Server address: https://platform.anpheros.com/mcp (Streamable HTTP, stateless).
Connect with OAuth (Claude and other assistants)
Add https://platform.anpheros.com/mcp as a custom connector (in Claude: Settings → Connectors → Add custom connector). Nothing else to configure: the assistant discovers the authorization server, registers itself and opens the Anpheros consent screen. There the person sees that it is an AI assistant, that what it reads is sent to the company running the assistant, what it may read, for how long and where they will return after choosing. Access is read-only unless more was asked for and allowed, and the person can revoke it at any time.
How an AI assistant connects through MCP
AI client Anpheros MCP Person 1. POST /mcp without a token 2. 401 + protected-resource metadata 3. register (DCR) + /oauth/authorize 4. consent screen: AI assistant, scopes, days 5. approve 6. access token 7. tools/call get_patient_summary
OAuth connections reach the person's real Anpheros record, only with their consent. Claude and other assistants read what the person allowed; ChatGPT is write-only: what it sends arrives in the person's app as proposals they accept or reject. Developers test the same flow on the sandbox.
Connect with a sandbox key (developers)
- Sign in at platform.anpheros.com/dashboard with Google and choose Get a sandbox key. You get an
sk_test_…key and a project with 30 synthetic patients. - Put the key in an environment variable, for example
ANPHEROS_KEY, and add the server to your tool.
Claude Code
claude mcp add --transport http anpheros-fhir https://platform.anpheros.com/mcp --header "Authorization: Bearer $ANPHEROS_KEY"
Cursor (~/.cursor/mcp.json or .cursor/mcp.json in the project)
{
"mcpServers": {
"anpheros-fhir": {
"url": "https://platform.anpheros.com/mcp",
"headers": { "Authorization": "Bearer ${env:ANPHEROS_KEY}" }
}
}
}
VS Code (.vscode/mcp.json)
{
"servers": {
"anpheros-fhir": {
"type": "http",
"url": "https://platform.anpheros.com/mcp",
"headers": { "Authorization": "Bearer ${env:ANPHEROS_KEY}" }
}
}
}
Claude Desktop (claude_desktop_config.json, through the mcp-remote bridge)
{
"mcpServers": {
"anpheros-fhir": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://platform.anpheros.com/mcp", "--header", "Authorization: Bearer ${ANPHEROS_KEY}"],
"env": { "ANPHEROS_KEY": "sk_test_…" }
}
}
}
Then ask your agent something like: "List the sandbox patients, pick the one with diabetes and summarise her last six months of HbA1c."
Tools
| Tool | What it does |
|---|---|
list_patients | the project's patients: the 30 synthetic personas and any you created |
get_patient_context | an AI-ready context for one patient, within a token budget, each item labelled with its source |
get_patient_summary | the International Patient Summary (FHIR $summary), in the language you ask for |
get_timeline | the record in date order across resource types |
get_health_patterns | beta: what changed and what recurs, each finding with its period, evidence and limitations; not diagnoses (guide) |
get_pattern_evidence | beta: every resource behind one finding |
get_series | beta: one measurement as one value per day, with data quality |
compare_periods | beta: one measurement in two periods you choose |
search_fhir | standard FHIR R4 search, returning a Bundle |
read_fhir_resource | one resource, or one earlier version of it |
get_provenance | who wrote a resource, when and from which system |
lookup_code | LOINC codes by text or by code (for medicines, use search_health_terms) |
search_health_terms | the public catalog of symptoms, conditions and treatments, by name in 20 languages, synonym, brand or code (guide) |
get_health_term | one catalog entry with its codes, names, MedlinePlus summary, sourced links and quoted EMA / FDA indications |
log_symptom | with a person's OAuth connection: saves a symptom they tell the assistant; it arrives in their Anpheros app as a proposal and is added only when they approve it |
log_measurement | the same for a measurement: blood pressure, heart rate, weight, temperature or glucose |
add_note | the same for a short note (how they slept, a question for their doctor) |
validate_fhir_resource | checks a resource without saving it |
create_fhir_resource | validates, then writes a resource |
create_patient | a new made-up patient in the project |
import_lab_report | a CSV, HL7 v2 ORU^R01 or JSON lab report becomes laboratory Observations |
sandbox_status | writes used today, patients, storage, resets |
reset_sandbox | restores the 30 synthetic patients (asks for confirmation) |
Read tools are marked read-only and the reset is marked destructive, so clients that ask before risky actions can do so. The server also offers the list of synthetic patients as a resource and three prompts: a clinician summary, a lab CSV import and building your integration on the API.
How it behaves
- The same rules as the API. Every tool calls the public API with your key: the same scopes, rate limits, validation and audit. A read-only key cannot write.
- Provenance. Everything an agent writes is recorded with the source
urn:anpheros:mcp, so you can always tell what came from an agent. - Patient data is data. Tool results carry a note that record content must never be followed as instructions, a basic guard against prompt injection through medical records.
- One record, with consent. Production API keys (
sk_live_…) are refused, because they reach every patient of a project. A real record reaches an assistant only through OAuth, after that person approves it, and every read is logged in their access history. - Standard discovery. Without credentials the server answers 401 with a
WWW-Authenticateheader pointing to its OAuth protected resource metadata (RFC 9728); assistants register through dynamic client registration (RFC 7591), with PKCE. Since 8 Nov 2026 any MCP client can register (loopback, https or its own app scheme; neverjavascript:,data:or plain http). A client that does not return to a known assistant is shown to the person as Unverified app, with the addresses it returns to, and gets read-only access; registration is limited to 20 per hour per address.
Frequently asked questions
What is an MCP server?
MCP (Model Context Protocol) is an open protocol through which AI agents and coding assistants call external tools. An MCP server for FHIR lets the agent read and write health records directly, instead of you pasting data into the chat.
Is it free?
Yes. The MCP server works on the free sandbox: 30 synthetic patients per project, up to 10,000 writes a day, no card.
Can an assistant read a real patient's record?
Only through OAuth, after that person approves the assistant on the consent screen, for the period they choose, and only their own record (or that of someone they care for). ChatGPT gets write-only access on a real record; other assistants read what the person allowed.
Which FHIR version does it use?
HL7 FHIR R4 (4.0.1), the same API as https://platform.anpheros.com/fhir/R4, with the International Patient Summary and a REST view of the same data.
Does it work with ChatGPT?
Yes, as a custom connector: ChatGPT registers itself with OAuth dynamic client registration and its callback domain is accepted. On a person's real record ChatGPT gets write-only access: it can send symptoms, measurements and notes, which the person accepts or rejects as proposals in the Anpheros app, and it cannot read the record. Claude can read the parts of the record the person allows, read-only. On the sandbox, both work with synthetic data. Claude Code, Cursor and VS Code also work with a sandbox key. See Connect ChatGPT and Claude to health data.
Related
- How to give an AI agent access to medical records: step-by-step tutorial in Python
- Free FHIR server
- AI agents and medical data
- LLM applications and healthcare data
- Healthcare API with patient consent
- Structured medication data for AI agents
Ask your AI
Paste this into Claude, ChatGPT, Cursor or Claude Code. Your assistant reads this guide and adapts it to your code.
Read https://developers.anpheros.com/guides/mcp.md and help me connect my AI client to the Anpheros MCP server. Use the Anpheros sandbox (base URL https://platform.anpheros.com) with my API key from the ANPHEROS_KEY environment variable, never written in the code. Give me complete, runnable code, the response I should expect, and how to fix the errors in https://developers.anpheros.com/guides/troubleshooting.md if a call fails.
Open in Claude Open in ChatGPT This guide as Markdown Build the whole integration with an AI coding tool
Free · 30 synthetic patients · no card Your first API call in 2 minutes →