Listed from the MCP registry; nobody on Odel publishes it.
Lab results to LOINC codes and UCUM units, symptoms and diagnoses to ICPC-3. Offline, no API key.
Runs on your machine from its package; the steps are below.

At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx mirobody
MCP client config
{
"mcpServers": {
"mirobody": {
"command": "uvx",
"args": [
"mirobody"
]
}
}
}Mirror your body in data.
One standard, every source, one complete picture of you — building a lasting record to understand where your health is going.
This open-source edition keeps that record on your own machine: lab reports, wearables and genetic files flow into it, and your AI agent can query it over MCP.
▶ Live demo · Try one command · Open in Codespaces · 100% local
Three reports, three names for the same test. One trend, with the file behind every number.
| You want to | Start here | What you need |
|---|---|---|
| Standardize names and units, in a terminal or inside your AI agent | One command | uv; no model or API key |
| Try the full app in your browser | GitHub Codespaces | A GitHub account and your own model API key |
| Keep the app, models and records on your machine | 100% local with Docker | Docker with Compose; 16 GB memory; no API key |
| Keep the app and records on your machine, without Docker | No Docker | Debian or Ubuntu; PostgreSQL 16; Python 3.12; your own model API key |
| Use it on your own records with nothing to run | Try Mirobody in Theta Web, or in the Theta mobile app | An account |
With uv installed, paste this into your terminal:
uvx --python 3.12 mirobody resolve "LDL cholesterol" 血红蛋白 ヘモグロビン "Total Kolesterol" 血脂
No repository clone, Docker, model or API key. uv prepares Python and the package for you; the first run needs a network connection to download them. The resolver then works offline from the bundled vocabulary.
血红蛋白 and ヘモグロビン both resolve to 718-7. 血脂 stays unresolved: it names a category, not one test. The same engine standardizes names and units across the full app.
Give the same engine to your AI agent. In Claude Code:
claude mcp add mirobody -- uvx --python 3.12 mirobody mcp
Your agent can then standardize any name, reading, unit or complaint you paste, on your machine and without a key. Reading a whole report also needs mirobody[parse] and a model key. Other MCP clients take the same command.
→ Use the engine from Python or MCP
Run the web app in your browser with your own model API key. GitHub prepares the environment; you do not need to install Docker or Python on your computer.
you@mirobody.ai, code 111111, on the Email code tab. Ask "How has my cholesterol changed?" The demo holds 2,019 readings across your record and mom@mirobody.ai's, shared with you view-only.demo/upload/ on the Data page to see a new report join the record, or switch to mom's record and ask again.The app and its records run in GitHub's cloud; the model service receives the documents and questions it processes. Use the included synthetic data to explore. Codespaces has usage limits and billing; model usage is billed by your model provider. Stop the codespace when you finish. For complete control on your own machine, use the local route below.
The app, records and models all run on your own machine. No model API key needed. Docker with Compose starts the stack and llama.cpp, with a small answering model and a document reader:
git clone --depth 1 https://github.com/thetahealth/mirobody.git && cd mirobody
COMPOSE_PROFILES=local-cpu ./deploy.sh
Allow 16 GB of memory, at least 8 GB of it for Docker. No GPU is required; on Windows, run the commands in a WSL 2 terminal. The first start needs a network connection to download container images and model weights. If the registry is not reachable from your network, deploy.sh says so and retries through a mirror; DOCKER_MIRROR in .env names your own. After those downloads, document reading, standardization and answers run locally. CPU answers can take minutes; Mac, NVIDIA and Windows options explain how to use your GPU.
Open the app link the script prints. The local models are already selected; sign in with the same demo account above, ask a question or upload a sample. Which model to choose compares the local options.
Prefer Docker with a cloud model? Run ./deploy.sh without a local model profile, then paste your own model key into the printed setup link. The app and records stay on your host; the model service processes your documents and questions.
Chat calculations take the original queried data directly. A cloud model's code runs as JavaScript inside the app, with nothing to set up; a model on your own hardware computes in Python in a local Docker container when the app can reach a Docker daemon. Setup and data flow cover both. Query views provide their built-in statistics without either.
→ Self-host guide · Walkthrough · Deploy on a server
No container, and nothing pulled from a registry. On Debian or Ubuntu, PostgreSQL 16 with pgvector comes from the distribution's own packages and the app runs straight from the checkout. It is the same install the Codespaces path performs:
git clone --depth 1 https://github.com/thetahealth/mirobody.git && cd mirobody
scripts/install_native.sh # PostgreSQL, pgvector, the Python package, a .env
scripts/start_native.sh # the worker and the app on port 18060
Open the link it prints and sign in as you@mirobody.ai, code 111111: the demo record is seeded already. A model key from the printed setup link adds document extraction and answers. install_native.sh installs system packages with sudo and writes one sudoers rule for the postgres account, and says so as it runs.
The local models belong to the Docker path, so this one answers through a model service. Everything else matches the row above it in what stays on your machine: the records live in the PostgreSQL you just installed, and a name to a code never leaves the machine.
headache since last night, BP 150/95, no fever becomes a coded complaint and two coded readings; "no fever" is not logged as a fever.Mirobody does not diagnose or prescribe, and its answers are not medical advice.
| Stage | What it does | Where |
|---|---|---|
| ① Collect | Lab reports, devices, photos, genetic files and journal entries come in from every source; each reading keeps the file it came from. | collect/ |
| ② Standardize | A1c, HbA1c and Glycated Hemoglobin resolve to one code, units to one standard, offline: readings from scattered sources land as clean rows in one table. A name it cannot place stays unresolved. | engine/ · standardize/ |
| ③ Agent | Answers come from tools that query that table, not from the model's memory: trends, comparisons across labs and devices, a chart. Every number traces to its file, so you can check it instead of taking it on trust. | agent/ |
The model reads documents and reasons; the codes and units come from vocabularies bundled with the package, never from the model. How a reading is standardized, step by step · How a reading moves through the pipeline.
Joining a care circle shares nothing by itself. Each member decides whether others may view or edit their own record. A parent who never signs in can be managed by you until they claim the record and choose what you keep. See it in the walkthrough.
Where the app runs and where the model runs are separate choices. Mirobody does not report usage anywhere.
| Codespaces + a model key | Local Docker + a model key | 100% on this machine | |
|---|---|---|---|
| App and stored records | in your codespace on GitHub's cloud | on your machine | on your machine |
| Documents and questions sent for model processing | sent to your model vendor, under its terms | sent to your model vendor, under its terms | stay on your machine |
| A name to a code, a unit to UCUM (② Standardize) | in the codespace, from the bundled vocabulary | on your machine, with no network | on your machine, with no network |
| Model weights | managed by the model vendor | managed by the model vendor | downloaded once from Hugging Face |
The command-line resolver also runs on your machine without a model or network access after its initial download.
Device vendors see data only after you link one. Before this reaches a network you do not control, read SECURITY.md: it lists every address the server can call.
| You want | Start here |
|---|---|
| Your record in Claude Code, Codex, Cursor or Gemini CLI | In the running app, Settings → MCP link (valid for 10 days by default), then one line per client |
| The offline engine as tools in any MCP client, with no app | uvx --python 3.12 mirobody mcp over stdio (client setup) |
| Mirobody inside DeepSeek Harness | dsh-plugin-mirobody, a community plugin by zwbao: the offline engine and your record's read-only tools, with a Mirobody tab |
| Names and units resolved in your own code | pip install mirobody: offline, no key, numpy the only dependency (library guide) |
| Your coding agent taught the workflow | npx skills add thetahealth/mirobody --skill standardize-health-data (skills) |
| A new device provider or tool | Drop a file into mirobody/collect/providers/ or mirobody/agent/tools/ (CONTRIBUTING) |
| Try the app without deploying | Mirobody Web demo, using the same synthetic demo files |
Over MCP the stack serves tools scoped to the signed-in person: four read your record (readings, medications, genotypes, pharmacogenomics), three resolve names and units, and two search medical reference material when the deployment has a knowledge source.
The stdio server is published to the official MCP Registry as ai.thetahealth/mirobody with every release. Directories that read the registry list it too, such as mcprush and AddonAudit, which runs it in a sandbox. Each picks up a new version on its own schedule, so take the install line from this README.
After pip install mirobody, use the same engine from Python:
from mirobody.engine import resolve, resolve_reading
resolve("血红蛋白").loinc # '718-7' any language, one code
resolve_reading("total cholesterol", "5.0", "mmol/L").loinc # '14647-2' the unit picks the code...
resolve_reading("total cholesterol", "193", "mg/dL").loinc # '2093-3' ...mass, not moles
resolve("中性粒细胞百分比").loinc # '26511-6' Neutrophils/Leukocytes
resolve("血脂").resolved # False a category, not one test
| Claim | Check it |
|---|---|
| 347/347 on the tests an ordinary checkup prints, in English, Chinese, Japanese, Russian, Estonian and Turkish | test_engine_coverage.py prints the score |
| 63,416 LOINC 2.83 codes cut by rule and 1,023,273 names pointing at them, including LOINC's own 21 languages; report spellings the index misses are added one reviewed row at a time | fhir_loinc_bundle.NOTICE · resolver_overrides.tsv · How a reading is standardized |
| 331 UCUM units with dimensional analysis, and 902 catalogue members for device and laboratory indicators | Standardization · Device crosswalk |
| 23andMe, AncestryDNA, WeGene, MyHeritage and FamilyTreeDNA exports and VCF on GRCh37 and GRCh38 decode to the same 13 calls across 12 genes, tested on public 1000 Genomes samples shipped in the package | test_packaged_examples.py · Public genotype examples |
The package names its vocabulary: mirobody.BUNDLE_VERSION is loinc-2.83+2026.10.27-126ecba69782 | python -c "import mirobody; print(mirobody.BUNDLE_VERSION)" |
| Public health-agent benchmarks: ESL-Bench, MedHall-Bench, MedHarm-Bench | mirobody-eval · benchmarks/ |
Mirobody is the health data engine behind Theta, a live consumer health app on the web and mobile, with these users today:
The most useful contribution is a term the resolver gets wrong. Run mirobody resolve "<term>"; if the answer is wrong or empty, report it or send a fix with a test case. That is how the vocabulary grows into new languages: Russian panel and Estonian vitamin terms arrived in #88 and Turkish lab-report spellings in #140, each one row of resolver_overrides.tsv and one test case per term. CONTRIBUTING.md has the setup and the checks.
Built on HL7 FHIR, LOINC from the Regenstrief Institute, UCUM, ICPC-3 (WONCA), CPIC, llama.cpp and deepagents, with thanks. Terminology licences: LICENSE-3RD-PARTY.
If Mirobody helped you make sense of a report, a star helps the next person find it.
Documentation · Discussions · Roadmap · Changelog · Security · AGENTS.md
Apache 2.0 · © 2026 Theta Health