health-os

Mantén tu historial de salud personal en tu propio Postgres local y permite que cualquier cliente MCP (incluidos modelos locales) trabaje con él: organiza y aprueba resultados de laboratorio desde PDFs, sigue tendencias, medicamentos, diagnósticos, wearables y un registro de alimentos con un perfil de 41 nutrientes. Las reglas de seguridad son código determinista, no juicio de LLM: alertas de valores críticos, datos de laboratorio pendientes hasta su aprobación, rechazo por interacciones farmacológicas y un protocolo de crisis.

Documentación

health-os

tests

Registro de salud personal local-first, expuesto a través de MCP. Tus análisis de laboratorio, diagnósticos, medicamentos, datos de dispositivos portátiles y registro de alimentos viven en tu propio Postgres; cualquier cliente MCP — ya sea uno que ejecute un modelo local o un asistente en la nube — puede leerlos y actualizarlos mediante herramientas protegidas. Los valores críticos, las reglas de seguridad de medicamentos y los calendarios de cribado son código determinista, no juicio de un LLM.

An MCP session with the demo patient: LDL trend and the pending-review queue

Aviso médico. Esto no es un dispositivo médico y no proporciona asesoramiento médico. Las alertas de valores críticos y los recordatorios de cribado son solo una señal para contactar a un médico — nunca un diagnóstico y nunca una razón para retrasar la atención. Úsalo bajo tu propio riesgo.

Qué hace

  • Resultados de laboratorio — sube un PDF o una foto a tu cliente MCP; el modelo extrae los valores, health-os normaliza los nombres (sinónimos uk/ru/en/Latin) y las unidades, y prepara el panel como pendiente. Nada cuenta como hecho hasta que lo apruebes.
  • Red de seguridad en código — los valores críticos alertan de inmediato (registro, notificación de macOS, Telegram opcional); los hallazgos críticos en informes narrativos se marcan; las preguntas sobre interacciones de medicamentos se rechazan y se redirigen a un médico/farmacéutico (solo se ejecutan comprobaciones deterministas: paracetamol diario total entre productos, biotina antes de análisis de laboratorio); una herramienta de crisis devuelve una respuesta fija con líneas de ayuda, independiente del modelo.
  • Tendencias y análisis — tendencias de Mann-Kendall, líneas base personales y anomalías, calculadoras de riesgo por edad, un calendario de cribado, un informe semanal, un resumen para la visita al médico.
  • Registro de alimentos — comidas con un perfil de 41 nutrientes, %RDA, indicadores de deficiencia/exceso, plantillas de comidas.
  • Dispositivos — exportación de Apple Health e importación de Garmin.
  • 28 herramientas MCP + instrucciones del servidor — las reglas de seguridad se envían a cada cliente al conectarse; consulta mcp_server/README.md.

Pruébalo con un solo comando

Solo se necesita Docker. Inicia una base de datos desechable con un paciente ficticio — dos años de análisis (LDL aumentando gradualmente), presión arterial, medicamentos, un registro de alimentos y un panel de laboratorio pendiente de aprobación:

git clone https://github.com/andronaft/health-os && cd health-os/demo
docker compose up -d --build

Apunta tu cliente MCP hacia él:

{
  "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",
               "health-os:local"]
    }
  }
}

Pregunta "muestra mi resumen de salud", "¿mi LDL está en tendencia al alza?", "¿qué está pendiente de revisión?", "¿qué me falta nutricionalmente?". Elimínalo todo con docker compose down -v.

Instalación para tus propios datos

Requiere Docker y 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

Luego conecta un cliente MCP — la configuración para LM Studio, Open WebUI, Ollama CLI y Claude está en mcp_server/README.md. Prueba: "muestra mi resumen de salud", "tendencia de LDL", "¿qué me falta nutricionalmente esta semana?".

Modelos locales: el servidor habla MCP estándar a través de stdio, por lo que cualquier cliente MCP que ejecute un modelo local puede usarlo. Verificado hasta ahora: el propio servidor con el cliente Python MCP oficial (CI + la demo de Docker). Aún no verificado de extremo a extremo con un modelo local — consulta #9; se agradecen informes.

Cómo funciona

MCP client (local or cloud model)
        │ stdio
   mcp_server/  ── read tools ──▶ approved views (read-only role, 5s timeout, row limits)
        │        ── write tools ─▶ core/services: normalize → status → critical rules → pending
        │
   safety/    critical values, narrative flags, interactions, crisis, alerts
   analytics/ trends, baselines, calculators, screening, nutrition, weekly report
        │
   PostgreSQL 16 + pgvector  ◀── ingestion/ (Apple Health, Garmin, embeddings)
DirectorioQué contiene
core/configuración, BD, normalización, servicios, deduplicación, resumen de salud
mcp_server/servidor MCP, herramientas de lectura y escritura
safety/reglas de seguridad deterministas y entrega de alertas
analytics/tendencias, líneas base, calculadoras, cribado, nutrición, informes
ingestion/esquema de extracción, puntuación de confianza, importadores de dispositivos, embeddings
migrations/esquema de Alembic
seed/catálogo de referencia + el paciente de demostración
evals/escenarios de red team (inyecciones, valores críticos ocultos, trucos de unidades)
scripts/copia de seguridad/restauración (restic + launchd), configuración de rol de solo lectura, importadores

Privacidad / local-first

  • Tus datos permanecen en tu propia base de datos. Postgres se ejecuta localmente en Docker; data/ y .env están fuera de git. health-os no envía nada a ningún lugar por sí mismo.
  • Lo que sale de la máquina depende del cliente MCP que conectes. Con un modelo local (LM Studio, Open WebUI + Ollama, …) nada sale. Con un asistente en la nube, lo que devuelven las herramientas se envía a ese proveedor — usa uno cuyos términos se adapten a datos médicos (sin entrenamiento con tus datos, retención cero o corta).
  • El objetivo es totalmente local: modelos locales para chat y extracción, embeddings locales para búsqueda (ya compatible a través de fastembed). Los clientes en la nube siguen siendo opcionales.
  • El canal de alertas opcional (Telegram) envía solo un texto genérico "revisa tu sistema de salud", nunca valores.
  • Cifra el disco (FileVault / LUKS / BitLocker) — los archivos de la base de datos están en texto plano en reposo.
  • Nunca pongas datos médicos reales en issues, PRs o pruebas — solo datos sintéticos.

Pruebas

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`

Las pruebas de integración nunca tocan la base de datos de trabajo: tests/conftest.py elimina y recrea <POSTGRES_DB>_test en el mismo servidor (migraciones + datos iniciales) en cada ejecución. Anula con TEST_DATABASE_URL (el nombre debe terminar en _test). Sin Postgres, las pruebas de integración se omiten localmente; CI establece REQUIRE_DB=1 para que fallen en su lugar.

Historial de desarrollo: PROGRESS.md.

Licencia

AGPL-3.0-o-posterior. Puedes usar, modificar y bifurcar health-os; si lo distribuyes o ejecutas una versión modificada como servicio de red, debes publicar tu código fuente bajo la misma licencia.

¿Quieres usarlo en un producto de código cerrado o comercial sin esas obligaciones? Una licencia comercial separada está disponible del autor — contacta a través de GitHub (@andronaft).

Las contribuciones son bienvenidas — consulta CONTRIBUTING.md (incluye un CLA breve).