mirobody

by thetahealthVerified

Your Data, Your AI — Health, Finance & More. Open Source, Privacy-First.

1,048
Stars
195
Forks
Python
Language
8/23/2026
Added
View on GitHubDownload ZIP

⚠️ Third-Party Software Notice

This skill is third-party open-source software developed and hosted independently on GitHub. SkillTip is an informational directory and does not control or maintain the underlying repository. Any security checks displayed are automated and limited in scope. Review the source code before installing.

Read the Terms of Service

Installation

Add to your Claude Code skills directory:

# Add to your Claude Code skills
git clone https://github.com/thetahealth/mirobody

Getting Started

Guides for using skills like mirobody.

Security Report

Verified

Last scanned: —

{
  "status": "PASSED",
  "issues": []
}

README.md

🚀 Mirobody

The AI-native health data engine — collect, standardize, and reason over labs, wearables & genomics.

License: Apache-2.0 Python 3.12+ PyPI Downloads Benchmarks arXiv Docs

📚 Documentation · 💬 Hosted chat — chat.mirobody.ai · 🔌 API platform — platform.mirobody.ai

English · 简体中文 · 繁體中文 · 日本語

Blood tests, wearables, genomics, imaging — all fragmented, all incompatible. Before AI can understand your health, someone has to unify these signals into a single standard AI can actually read. That is what this engine does.

From wearables to food photos — one standard format, ready for AI.

The engine does three things, and the codebase (and Contributing) is organized around exactly these three stages — the same C · S · A the documentation uses:

StageWhat it meansWhere
① CollectPull signals in: 3 device providers + a SQL source · 7 file formats · Apple Healthpulse/
② StandardizeOne standard: resolve any reading to canonical codes (LOINC · SNOMED CT · RxNorm), normalize units, land against FHIR-recognized code systemsindicator/
③ AnswersReason: agents read theoriginal documents through a virtual filesystem and answer with charts & citationsagent/

⚡ Try it in 60 seconds

Indicator resolution is the engine's front door and needs no key, no config and no network:

pip install mirobody
mirobody resolve "LDL cholesterol" 血红蛋白 ヘモグロビン "空腹血糖(GLU)" 血脂

Until 1.2.1 reaches PyPI, run this from a source checkout (git clone + git lfs pull + pip install -e ., as in Run the whole thing): the published 1.0.62 wheel is an empty shell — no CLI, and the resolver data files are 133-byte Git-LFS pointer stubs, so nothing resolves. Details in the CHANGELOG.

mirobody resolve: four languages landing on one LOINC code, fully offline

Real output, and the GIF is a build artifact — docs/demo/resolve.html rendered by scripts/make_demo_gifs.py, so it cannot drift away from the command it claims to show.

from mirobody.engine import resolve, resolve_reading

resolve("血红蛋白").loinc                                # '718-7'   any language, one code
resolve("total cholesterol").loinc                     # '2093-3'  [Mass/volume]
resolve_reading("total cholesterol", "5.0", "mmol/L")   # '14647-2' [Moles/volume]
resolve_reading("total cholesterol", "193", "mg/dL")    # '2093-3'  the unit picks the code
resolve("血脂").resolved                                 # False    a category, not an observation

Pass the value and the unit when you have them. LOINC encodes the unit and the result type into the identity, so the same name resolves to different codes — filing a mmol/L result under a mg/dL code is how one series quietly ends up holding two units. resolve abstains rather than guessing: "" is a gap worth a second look, "refused" is the answer. → Engine reference · Indicators


What the standardization layer provides

Standardization here is not a lookup table but a complete terminology-normalization system:

  • Concept graph: 440,961 nodes · 22,044,110 cross-vocabulary edges · 595,746 source ids distilled into canonical concepts (LOINC · SNOMED CT · RxNorm bridges).
  • 49,253 multilingual aliases (中文 22,578 · 日本語 16,809 · +5: de·es·fr·ko·ru). hemoglobin, 血红蛋白, 血紅素 and ヘモグロビン all land on LOINC 718-7.
  • 繁體中文 is two problems, handled as two. Script folding is mechanical (a shipped 3,336-character zh-Hant → zh-Hans table); vocabulary is not — Taiwan usage picks different words, and folding 血紅素 yields the HbA1c code. Those terms are curated under their Traditional spelling, and a curated row always beats a fold.
  • Units normalized to ~310 UCUM families, with dimensional analysis, a molar-mass bridge keyed by LOINC code, and an explicit refusal for % vs 10*9/L. 300 standard pulse indicators.
  • A second tier exists, and stays opt-in. Everything above is lexical, so it abstains on terms it does not know — an honest ceiling. Cosine recall (indicator/semantic.py) reaches past it but cannot abstain: for a term it has never seen it returns its nearest neighbour with the confidence of a correct answer, and no threshold separates the two. No matrix ships, so resolve() is unchanged until you point MIROBODY_SEMANTIC_INDEX at one — then use it to suggest a code a human confirms, never to mint an identity. → Semantic recall — the benchmark, the two axis gates, and why min_score is not a correctness threshold.
  • We measure the claim instead of asserting it. test_engine_coverage.py scores the offline resolver against the panels an ordinary checkup includes, written the way a report prints them, in English, 简体中文, 繁體中文 and 日本語 — plus the wearable vocabulary the platform API teaches. 211/211 today; it scored 32/94 the day it was written. It grades clinical correctness: answering 血红蛋白 with the HbA1c code is a failure, and 血脂 is required to resolve to nothing.
pytest mirobody/test_engine_coverage.py -s   # offline, about a second

Standardization · Architecture · Data flow


📊 Benchmarks — open and independently reproducible

Our health-AI benchmarks are the most-downloaded in their category on Hugging Face (4,000+ each):

BenchmarkWhat it measuresDownloads
ESL-BenchEvent-driven longitudinal health agents — 100 synthetic users, 10,000 queries, programmatic ground truth (arXiv:2604.02834)4,800+
MedHall-BenchMedical hallucination4,500+
MedHarm-BenchHarmful medical advice4,300+

Reproduce any of them with one command via mirobody-eval, which also seeds a deployment with synthetic (PHI-free) trajectories.


🚀 Run the whole thing

git clone https://github.com/thetahealth/mirobody.git && cd mirobody
git lfs pull          # the engine's data bundles; `resolve` needs them
./deploy.sh           # Postgres + pgvector, Redis, server, worker

Then open http://localhost:18060. The server prints the accounts it accepts at startup — the shipped one is caregiver@mirobody.ai, code 111111, named for the role it plays: you sign in as the caregiver and the record you read belongs to someone else.

No mail provider? You do not need one. The sign-in page opens on password, with email-code as a third tab:

curl -X POST localhost:18060/password/register -H 'Content-Type: application/json' \
     -d '{"email":"you@example.com","password":"at-least-8-chars"}'

One key runs everything. Set an OpenRouter key in OPENROUTER_API_KEY — for the Docker stack that means the .env file next to compose.yaml, then docker compose restart (that alone suffices: the app re-reads /app/.env; a shell export does not reach the containers) — and conversation, vision file parsing and semantic indicator search are all live — chat via Claude/GPT/DeepSeek, embeddings via the open-weights Qwen3-Embedding-8B (self-hostable: serve the same model behind any OpenAI-compatible /v1/embeddings and point OPENROUTER_BASE_URL at it).

If openrouter.ai is unreachable from your network (the case in mainland China), a DashScope key in DASHSCOPE_API_KEY is a drop-in replacement — chat via Qwen (DeepSeek/Kimi one uncomment away), vision via qwen3-vl, embeddings via text-embedding-v4.

No further configuration either way; direct provider keys (Google, OpenAI) remain supported — see config.yaml. → Docker deployment · Configuration · Local Python setup

👨‍👩‍👧 The whole engine, in four minutes

SEED_DEMO_DATA defaults to on, so the ① → ② → ③ chain is walkable the moment ./deploy.sh finishes — signing in and browsing the seeded record need no key; the upload extraction in part 2 and the questions after it ride the one key configured above. Four parts, each recorded against the running stack.

1 · Arrive. You sign in owning a thin record — a few weeks of self-tracked vitals and one unremarkable checkup, seeded as your own — and find one synthetic person sharing a thick one with you: Demo (synthetic), 244 indicators and 14,273 readings across two years, five documents the agent can read_file. Same question, two records: your HbA1c answers with one boring-normal value from data you own; hers answers with a two-year story from data you can only view. Isolation you can see, not just read about.

Your own account's indicators and an uploaded report, then switching to Demo's shared record and opening two years of HbA1c

Your own thin record next to hers — the thick one you can only view.

The switch in that diagram is a column, not a promise: care_circle_members.health_access, NOT NULL DEFAULT 0, on your own row. Being invited into a circle shares nothing — the member decides, and no other person's action can raise it. The check that reads it raises rather than returning a falsy value, so a route that forgets to look answers 403 instead of handing over a record. examples/06_care_circle_rules.py prints the whole decision table offline.

2 · ③ Answers, on someone else's record. Ask about her HbA1c and the agent finds the data itself, cross-references the lab draws against the sensor-derived series, and charts both — then tells you the improvement did not hold.

Asking about the shared record's HbA1c; the agent queries, charts lab and sensor series together, and reads the trend

lab-drawn HbA1c   7.2 % (2024-04)  →  6.5 % (2024-10)  →  6.6 % (2025-04)
                  only 3 lab draws in two years — the sensor eA1C has 104

3 · ① Collect + ② Standardize, on your own. mirobody/demo/lab_report_2025-10-15.pdf is a panel deliberately held out of the seed, so uploading it is not a no-op. Drop it on the Data page and twelve analytes come out with their values and units in seconds, each linking back to the page it was read from.

Dropping a lab-report PDF on the Data page; twelve analytes extracted, each linked to its source file

4 · ③ Answers, on what you just uploaded. Ask again, now about your own record. The agent reads the report through the virtual filesystem, flags all twelve results against their printed reference ranges — and says plainly that one date is not a trend.

Asking about your own just-uploaded panel; the agent reads the report and flags every result against its reference range

That contrast is the demo's point: two years of history buys a trend, one panel buys an interpretation. Both answers cite what they read.

Every value is synthetic — generated for ESL-Bench by mirobody-eval and vendored, so the seed needs no network and no key. Set SEED_DEMO_DATA=false for a deployment that will hold real data. What the extraction pass does not yet do with those twelve readings is written down in docs/roadmap.md rather than glossed over here.


🧩 Extend it

Five directory keys point at plugin roots; drop a file in and restart. Tools become both agent tools and MCP tools with no extra wiring.

You wantDrop it inDocs
A new toolmirobody/agent/tools/Adding tools
An Agent Skill (SKILL.md)mirobody/agent/skills/Skills
A whole agentmirobody/agent/Agents
A device providermirobody/pulse/providers/Provider integration
Someone else's MCP serverSettings → MCPMCP integration

Every tool the agent has is also served over MCP at /mcp, gated per user. → Built-in tools · MCP servers


🔌 Use it from your own code

SurfaceForDocs
pip install mirobodyResolution and file parsing, no serverEngine
HTTP APIYour app talking to a deploymentAPI overview · Data
MCPClaude, Cursor, or any MCP client reading a user's recordMCP servers
Backbone modeYour own agent, our data layerBackbone

Not sure which? → Choose your API


🏗️ Repository layout

mirobody/
├── pulse/       ① Collect     — providers, file parsing, aggregation
├── indicator/   ② Standardize — the resolver, units, concept graph (no DB, no network)
├── agent/       ③ Answers     — DeepAgent, tools, skills, chat
├── mcp/         the MCP server
├── user/        identity and the care circle — who may read whose record
├── schema/      the DDL, replayed at boot in dev
└── demo/        care-circle demo data

One rule, machine-enforced: indicator/ never imports the agent layer, so pip install mirobody is roughly 200 MB across ~90 packages, with no framework in sight — adding [agents] roughly triples it, to ~600 MB (fresh-venv measurements; exact figures vary by platform and installer). Two import-linter contracts hold the line, and lint-imports fails the build.

Architecture · CONTRIBUTING.md


📚 Documentation

For full documentation, see docs.mirobody.ai (English and Simplified Chinese).

Quickstart · Installation · Self-hostGetting it running
Indicators · Providers · File processingHow the three stages work
API reference · Streaming · Function callingBuilding against it
Contributing · SetupWorking on it

In-repo, for contributors

Each package carries a README.md saying what it is; long-form guides live in docs/. All of it is English, whichever README you arrived from.


🤝 Contributing

The highest-leverage contribution is a term the resolver gets wrong. Run mirobody resolve "<term>", and if the answer is wrong or empty add a row to resolver_overrides.tsv plus a case to test_engine_coverage.py — the coverage score is the review.

pip install -e '.[test]' && pytest -q && lint-imports

Contributing guide · CONTRIBUTING.md


📚 Docs · 💬 Chat · 🔌 Platform · 🧪 Eval

Apache 2.0 · © 2026 Theta Health

Frequently Asked Questions

What is mirobody?

mirobody is an open-source mcp servers skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by thetahealth. Your Data, Your AI — Health, Finance & More. Open Source, Privacy-First. It has 1,048 GitHub stars.

Is mirobody safe to use?

Yes. mirobody passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.

How do I install mirobody?

Clone the repository with "git clone https://github.com/thetahealth/mirobody" and add it to your Claude Code skills directory (see the Installation section above).

What programming language is mirobody written in?

mirobody is primarily written in Python. It is open-source under thetahealth on GitHub, so you can review or fork the full source.

Are there alternatives to mirobody?

Yes. SkillsLLM lists many other MCP Servers skills you can browse and compare side by side. Open the MCP Servers category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh mirobody against similar tools.

Comments (0)

No comments yet. Be the first to share your thoughts!

n8n

by n8n-io

12

Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.

201,88160,308TypeScript
MCP Serversapisai-tools
View details

Scrapling

by D4Vinci

🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!

75,9137,581Python
MCP Servers
View details

TrendRadar

by sansan0

⭐AI-driven public opinion & trend monitor with multi-platform aggregation, RSS, and smart alerts.🎯 告别信息过载,你的 AI 舆情监控助手与热点筛选工具!聚合多平台热点 + RSS 订阅,支持关键词精准筛选。AI 智能筛选新闻 + AI 翻译 + AI 分析简报直推手机,也支持接入 MCP 架构,赋能 AI 自然语言对话分析、情感洞察与趋势预测等。支持 Docker ,数据本地/云端自持。集成微信/飞书/钉钉/Telegram/邮件/ntfy/bark/slack 等渠道智能推送。

61,65224,883Python
MCP Servers
View details

context7

by upstash

Context7 Platform -- Up-to-date code documentation for LLMs and AI code editors

61,0602,938TypeScript
MCP Servers
View details

High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph — average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

39,9393,219C
MCP Servers
View details

Developers Also Liked

Based on votes and bookmarks from developers who liked this skill

ECC

by affaan-m

10

The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

242,21936,702JavaScript
AI Agentsai-agentsanthropicclaude-code
View details
15

An agentic skills framework & software development methodology that works.

234,96620,863Shell
AI Agentsai-agentsbrainstorming
View details

n8n

by n8n-io

12

Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.

201,88160,308TypeScript
MCP Serversapisai-tools
View details

The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

185,94028,768JavaScript
AI Agentsai-agentsanthropicclaude-code
View details

cc-switch

by farion1231

3

A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io

128,8688,826Rust
AI Agentsclaude-codeai-tools
View details