关于 health-os
health-os 是以 Postgres 为后端、优先本地运行的个人健康记录系统,供 MCP 客户端读取和更新健康数据。安全检查由确定性代码执行,新导入的化验结果须经明确批准才会成为记录。
主要功能
- 01记录化验、诊断、用药和饮食
- 02导入 Apple Health 导出数据及 Garmin 数据
- 03追踪趋势、个人基线和筛查日程
- 04执行确定性安全检查并发送提醒
- 05审核提取出的化验结果后再批准
- 06生成营养报告和就诊摘要
适用场景
- 01在本地数据库保存个人健康记录
- 02审核从报告中提取的化验结果
- 03长期追踪营养和健康趋势
- 04准备就诊摘要
MCP 相关
向 MCP 客户端提供 36 个读写工具及服务器指令。服务通过 stdio 通信,数据保存在用户自己的 Postgres 数据库中。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm -e DATABASE_URL -e READONLY_DATABASE_URL ghcr.io/andronaft/health-os:0.3.0DATABASE_URL密钥PostgreSQL 16 + pgvector connection string, e.g. postgresql+psycopg://health:[email protected]:5432/health_os. Run migrations and seed first (see README).READONLY_DATABASE_URL密钥Recommended: connection as the restricted health_readonly login (scripts/setup_readonly.py). Gives DB-level read isolation; sql_query runs only with it.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/andronaft/health-os:0.3.0stdio工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
health-os
以本地数据为先的个人健康记录,通过 MCP 提供服务。 您的化验结果、诊断、药物、可穿戴设备数据和饮食记录都存储在您自己的 Postgres 中;任何 MCP 客户端——无论运行本地模型还是云端助手——都可以通过受保护的工具读取和更新这些数据。危急值、用药安全规则和筛查 计划均由确定性代码处理,而非由大模型判断。
医疗免责声明。 这不是医疗器械,也不提供医疗建议。 危急值提醒和筛查提醒仅用于提示您联系医生—— 绝非诊断,也绝不能成为延误就医的理由。使用风险由您自行承担。
功能
- 化验结果 — 将 PDF 或照片传给您的 MCP 客户端;模型会提取数值, health-os 会规范化名称(uk/ru/en/拉丁语同义词)和单位,并将检查项目暂存为 待审核。只有经您批准后,数据才会被视为事实。
- 代码实现的安全保障 — 危急值会立即触发提醒(日志、macOS 通知、 可选的 Telegram);叙述性报告中的危急发现会被标记;对于药物相互作用 问题,会拒绝回答并建议咨询医生/药剂师(只运行确定性检查: 各种产品中的每日对乙酰氨基酚总量、化验前的生物素);危机工具会返回 固定回复和热线信息,不受模型影响。
- 趋势和分析 — Mann-Kendall 趋势、个人基线和异常、 按年龄限制使用的风险计算器、筛查日历、每周报告、就诊摘要。
- 饮食记录 — 每餐包含 41 种营养素档案、%RDA、缺乏/过量标记和餐食模板。
- 设备 — 导入 Apple Health 导出数据和 Garmin 数据。
- 36 个 MCP 工具 + 服务端说明 — 每次连接时都会向所有客户端发送安全规则; 详见 mcp_server/README.md。
一条命令即可试用
只需 Docker。启动一个临时数据库,其中包含虚构患者的数据——两年的化验结果 (LDL 缓慢上升)、血压、药物、饮食记录,以及一份等待批准的化验项目:
git clone https://github.com/andronaft/health-os && cd health-os
make demo # or: cd demo && docker compose up -d --build
将 MCP 客户端指向该服务:
{
"mcpServers": {
"health-os-demo": {
"command": "docker",
"args": ["run", "-i", "--rm", "--network", "health-os-demo",
"-e", "DATABASE_URL=postgresql+psycopg://health:demo@db:5432/health_os",
"-e", "READONLY_DATABASE_URL=postgresql+psycopg://health_readonly:demo_ro@db:5432/health_os",
"health-os:local"]
}
}
}
询问 “显示我的健康摘要”、“我的 LDL 是否呈上升趋势?”、“有哪些内容待审核?”、
“我在营养方面缺少什么?”。运行 make demo-down 即可全部移除。
安装并使用自己的数据
需要 Docker 和 Python 3.12+。
git clone https://github.com/andronaft/health-os && cd health-os
cp .env.example .env # set the passwords
docker compose up -d db # Postgres 16 + pgvector
python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/alembic upgrade head # schema
.venv/bin/python -m seed.load # marker catalog, synonyms, units, nutrients
.venv/bin/python -m seed.demo # optional: a fictional demo patient to play with
然后连接 MCP 客户端——LM Studio、Open WebUI、Ollama CLI 和 Claude 的配置见 mcp_server/README.md。可以试试:“显示我的健康摘要”、 “LDL 趋势”、“本周我在营养方面缺少什么?”。
本地模型: 服务端通过 stdio 使用标准 MCP,因此任何能运行本地模型的 MCP 客户端都可以使用它。迄今已验证:服务端本身搭配官方 MCP Python 客户端 (CI + Docker 演示)。尚未完成与本地模型的端到端验证——详见 #9;欢迎反馈测试结果。
工作原理
分阶段面板中的每一行最终都会变为 pending — 未经明确批准,任何内容都不会成为事实。目录无法归类的行会被保留,而不是丢弃:
未映射和待处理的行会显示在 list_pending_reviews 和健康摘要的“等待审核”区块中;名称学习完成后,下一次面板导入时会自动映射。
| 目录 | 内容 |
|---|---|
core/ | 配置、数据库、规范化、服务、去重、健康摘要 |
mcp_server/ | MCP 服务、读写工具 |
safety/ | 确定性安全规则和警报发送 |
analytics/ | 趋势、基线、计算器、筛查、营养、报告 |
ingestion/ | 提取架构、置信度评分、设备导入器、嵌入 |
migrations/ | Alembic 架构 |
seed/ | 参考目录 + 演示患者 |
evals/ | 红队场景(注入、隐藏的危急值、单位技巧) |
scripts/ | 备份/恢复(restic;install_launchd.sh 会在 macOS 上安排这些任务)、只读角色设置、导入器 |
隐私 / 本地优先
- 你的数据保留在自己的数据库中。 Postgres 在本地 Docker 中运行;
data/和.env位于 git 之外。health-os 本身不会向任何地方发送数据。 - 哪些数据会离开设备,取决于你连接的 MCP 客户端。 使用本地模型 (LM Studio、Open WebUI + Ollama 等)时,不会有数据离开设备。使用云端助手时,工具 返回的任何内容都会发送给相应服务提供商 — 请选用条款适合医疗数据的服务(不使用你的 数据进行训练,且保留期限为零或较短)。
- 目标是完全本地运行: 使用本地模型进行聊天和提取,使用本地嵌入进行搜索 (已通过 fastembed 支持)。云端客户端仍为可选项。
- 可选的警报渠道(Telegram)只会发送“检查你的健康系统”这类通用文本,不会发送具体数值。
- 加密磁盘(FileVault / LUKS / BitLocker)— 数据库文件静态存储时未加密。
- 切勿在问题、PR 或测试中使用真实医疗数据 — 只能使用合成数据。
测试
make test # everything (needs Postgres for the integration part)
make test-unit # pure unit tests — no database needed
make test-integration # only tests marked `integration`
集成测试绝不会接触正在使用的数据库:每次运行时,tests/conftest.py 都会在同一服务器上删除并重新创建
<POSTGRES_DB>_test(迁移 + 种子数据)。可通过 TEST_DATABASE_URL 覆盖(名称必须以 _test 结尾)。本地没有 Postgres 时会
跳过集成测试;CI 会设置 REQUIRE_DB=1,因此缺少数据库时测试会失败。
开发历程:PROGRESS.md。
许可证
AGPL-3.0-or-later。你可以使用、修改和分叉 health-os;如果分发该软件,或将修改后的版本 作为网络服务运行,则必须根据相同许可证发布源代码。
想在闭源或商业产品中使用它,同时不承担这些义务?作者提供单独的商业许可证 — 可通过 GitHub 联系(@andronaft)。
欢迎贡献 — 参见 CONTRIBUTING.md(其中包含一份简短的 CLA)。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。