REST · MCP · FHIR R4 · SELF-HOSTED

Build clinical AI on a PHI proxy.

De-identify inside your own infrastructure, call any model, re-identify on return — and write results back to the EHR over FHIR. All 18 Safe Harbor identifiers stripped, deterministically and auditably. No BAA with a model vendor.

deidentify.sh
$ curl localhost:8080/api/deidentify \
    -d '{"text": "Jane Doe, K+ 6.1, call (415) 555-0132"}'

{
  "text": "[NAME_1], K+ 6.1, call [PHONE_1]",
  "session": "sess_8f2…"  # key never leaves your infra
}

$ curl localhost:8080/api/fhir/ServiceRequest \
    -H "X-Session: sess_8f2…" -d @order.json
→ 201 Created · written to the EHR, signed by the clinician
Deploys in your cloud, over Docker
AWSMicrosoft AzureGoogle CloudDocker

Every surface you'd want

One proxy. Six ways in.

REST API

HTTP

POST /api/deidentify · /api/reidentify · /api/fhir/deidentify. JSON in, JSON out. Any language, any framework.

Native MCP server

MCP

First-class Model Context Protocol support so Claude Desktop, Claude Code, and any MCP-compatible host can call the proxy as a tool.

FHIR R4 client

FHIR R4

Read structured resources — Patient, Condition, Observation, MedicationRequest, DocumentReference — straight from Epic, Oracle Health, athenahealth, or eClinicalWorks.

FHIR write-back

CREATE

Create DocumentReference notes and PDFs, ServiceRequest and MedicationRequest orders, Condition problems, Communication, and Task — gated on clinician signature, written immediately.

CDR persistent context

CDR

A built-in FHIR Clinical Data Repository keeps a full longitudinal record per patient, so every call has the whole chart — not just the latest payload.

Reversible tokenization

De-id

PHI becomes deterministic tokens ([NAME_1], [DATE_1], …). The session key lives only in your infra — re-identify after the model responds.

API reference

Four endpoints. Infinite clinical context.

Authenticate with an API key. Every endpoint returns JSON. All FHIR resources are de-identified in-flight before the response leaves the proxy.

proxy · endpoints

# clinical text de-identification

POST /api/deidentify

POST /api/reidentify

# FHIR R4 resources (de-identified)

POST /api/fhir/deidentify

POST /api/fhir/reidentify

# session management

GET /api/session

DELETE /api/session

# health

GET /health

docker · quick start

# pull and run in your environment

docker pull ghcr.io/1putt-health/medscrub-proxy

# configure your EHR credentials

cp .env.example .env

# start the stack

docker compose up -d

# proxy running at localhost:3001

500 free credits · no credit card required

Ship past the CISO

Compliance you can read, not just claim.

The de-identification is documented, deterministic code — not a black-box classifier. Your security team can audit exactly what gets removed and why.

No PHI leaves your infra

The proxy runs in your environment. PHI is stripped and the session key never travels to a model API.

No BAA with a model vendor

The model only sees de-identified data, so you are not disclosing PHI to it — no Business Associate Agreement required.

All 18 Safe Harbor identifiers removed

Names, dates, MRNs, SSNs, addresses, phones, and every other 45 CFR §164.514(b)(2) identifier — stripped on every request.

Deterministic, auditable de-id

Documented code, not a black-box ML classifier. Read exactly what gets removed and why.

First call in five minutes.

docker compose up, grab a key, and de-identify your first payload. 500 free credits on sign-up.