health4ai

Apple HealthKit → seu próprio projeto Supabase + servidor MCP. App iOS com sincronização em segundo plano, ferramentas MCP para resumos de saúde, sono, VFC, treinos e coaching. Requer um projeto Supabase de sua propriedade.

Documentação

health4.ai — Apple Health × IA

health4.ai logo

Pergunte à sua IA sobre seu sono, VFC, recuperação e condicionamento físico — em linguagem natural.
App iOS gratuito · Seu próprio banco de dados · Funciona com qualquer cliente MCP

Website MIT License iOS 17+ Python 3.11+ FastMCP Your own Supabase project


O que ele faz

iPhone HealthKit → Your Supabase project → MCP server → Any AI

O Apple Health guarda anos de seus dados biométricos — estágios do sono, VFC, frequência cardíaca, treinos, VO₂ máx. e mais de 150 outras métricas. O health4.ai torna tudo isso consultável pelo Claude, ChatGPT, Cursor, Ollama ou qualquer cliente compatível com MCP por meio de ferramentas MCP criadas especificamente para isso.

Você controla os dados. Eles são sincronizados para um projeto Supabase que você cria e possui. O health4.ai não executa backend e nunca armazena nem tem acesso aos seus dados de saúde.


Por que ele existe

ProblemaSolução do health4.ai
A Apple não tem API de servidor HealthKit — todo acesso exige um app no dispositivoApp iOS nativo com sincronização em segundo plano via HKObserverQuery + BGTaskScheduler
O Health Auto Export só funciona na mesma rede Wi-FiSeus dados chegam ao Postgres — consultáveis por qualquer IA, de qualquer lugar
O conector Apple Health do claude.ai não alcança o Claude Code CLI nem o CursorMCP padrão (stdio) — um único bloco de configuração funciona em qualquer lugar
A maioria das soluções exige um serviço de nuvem gerenciadoTraga seu próprio projeto Supabase — o health4ai não executa servidor

Demonstração

Vídeo de demonstração em breve. Veja como é uma conversa típica:

You:     How was my recovery this week? Anything standing out?

Claude:  Your recovery this week was mixed but trending positive.
         • HRV averaged 58ms (Tue–Thu strong at 64–68ms; Monday low at 44ms after Saturday's long run)
         • Sleep averaged 7h 12m — Wednesday and Thursday were your best nights (7h 40m+)
         • Resting HR dropped from 54bpm Monday to 49bpm Friday — a good sign
         Recommendation: today looks like a solid day for a moderate-intensity session.

Início rápido

O health4ai precisa de um projeto Supabase que você possua. O app faz login com o Supabase Auth e grava por meio de uma Supabase Edge Function, portanto Postgres puro (Neon, um contêiner Docker local) não é um backend compatível. Tutorial completo: docs/SETUP.md.

1. Crie o esquema. Crie um projeto em supabase.com, abra o editor SQL e execute web/public/schema.sql (também em https://health4.ai/schema.sql). Ele é gerado a partir de supabase/bootstrap/: tabelas, segurança em nível de linha e permissões que negam acesso direto aos clientes. Não use supabase db push — as migrações numeradas não se aplicam a um projeto novo.

2. Implante a função de ingestão (requer a Supabase CLI):

git clone https://github.com/jefflitt1/health4ai.git
cd health4ai
supabase functions deploy healthkit-ingest --project-ref <your-project-ref> --no-verify-jwt

--no-verify-jwt é proposital: a função verifica o token do usuário conectado por conta própria e grava somente sob o ID desse usuário.

3. Crie seu usuário. No painel, Authentication → Users → adicione um usuário e copie o UID dele. O app faz login; ele não faz cadastro.

Em seguida, configure o servidor MCP (a partir do mesmo checkout):

cp mcp-server/.env.example mcp-server/.env

Edite mcp-server/.env:

DATABASE_URL=postgresql://...  # your project's pooler connection string (database password, not a key)
HEALTHKIT_USER_ID=...           # your Supabase Auth user's UID (see mcp-server/.env.example)

Adicione ao seu cliente de IA:

Claude Code / Claude Desktop
{
  "mcpServers": {
    "health4ai": {
      "command": "python",
      "args": ["/path/to/health4ai/mcp-server/main.py"],
      "env": {
        "DATABASE_URL": "postgresql://...",
        "HEALTHKIT_USER_ID": "<your auth user UID>"
      }
    }
  }
}
Cursor

Mesmo bloco → ~/.cursor/mcp.json

Ollama (modelo local)

Combine com mcphost ou mcp-client-for-ollama:

mcphost --model ollama/llama3.2 \
  --mcp-server "health4ai:python /path/to/health4ai/mcp-server/main.py"

O modelo roda no seu hardware e o servidor MCP roda localmente; seus dados de saúde são lidos do seu próprio projeto Supabase.

Instale o app iOS: conecte-o a esse projeto Supabase (URL do projeto + chave anônima), faça login como o usuário que você criou e toque em Iniciar sincronização. Para um beta privado no TestFlight, siga o guia de isolamento de testadores; nunca use o backend ou as credenciais de outra pessoa.


Ferramentas MCP

FerramentaO que ela responde
get_health_summaryVisão geral das principais métricas dos últimos N dias
get_sleepDetalhamento do sono por noite com estágios REM, Profundo e Leve. Uma fonte por noite: Oura > Apple Watch > Whoop > Garmin > Withings > qualquer outra fonte (incluindo iPhone) com mais registros de estágios
get_hrv_trendVFC diária (SDNN) com comparação contínua e tendência
get_daily_snapshotTudo registrado em uma data específica
get_workoutsTreinos recentes com tipo, duração, distância e calorias
query_metricSéries temporais brutas para qualquer tipo de métrica do HealthKit
get_long_term_trendAgregados mensais ao longo dos anos (níveis bruto e resumido)
get_coaching_briefStatus de recuperação, qualidade do sono (mesma regra de uma fonte por noite do get_sleep), carga de treino e marcadores de condicionamento físico
search_recordsEncontre dias em que uma métrica ultrapassou um limite
get_metric_statsLinha de base pessoal: mín/máx/média/percentis
compare_periodsCompare uma métrica entre dois intervalos de datas

Se uma métrica estiver vazia, leia data_status antes de acreditar nela

O iOS nunca informa a um app que uma permissão de Saúde foi negada. Um tipo que você não compartilhou retorna um resultado vazio, idêntico byte a byte a um dia em que você realmente não fez nada. Nada na API do HealthKit consegue distinguir os dois casos, então um assistente que lê um 0 simples dirá com confiança que você não deu nenhum passo.

As ferramentas que podem retornar um resultado vazio, portanto, anexam um bloco data_status:

  • never_recorded — esta métrica nunca produziu uma amostra para você. Para passos, frequência cardíaca, energia ativa ou distância percorrida, isso não é possível se os dados estivessem sendo compartilhados, então quase certamente não estão. Abra Saúde → Compartilhamento → Apps → health4ai, ative a métrica e execute novamente a importação na aba Início do app.
  • empty_window — nada no intervalo que você perguntou, mas a métrica tem dados em outros momentos. Uma lacuna real, não um problema de permissão.

Isso não é hipotético. Na conta do próprio autor, contagem de passos, frequência cardíaca, energia ativa e distância percorrida ficaram silenciosamente não compartilhadas por quase três meses enquanto todas as outras métricas sincronizavam normalmente, e o app exibia um "Concluído" verde o tempo todo.


Arquitetura

┌─────────────────────────────────────────────────────────────┐
│  iPhone                                                      │
│  HKObserverQuery + BGTaskScheduler                          │
│  → continuous background sync                               │
└──────────────────────────┬──────────────────────────────────┘
                           │ HTTPS → your healthkit-ingest Edge Function
                           ▼
┌─────────────────────────────────────────────────────────────┐
│  Your Supabase project (you own it)                         │
│  healthkit_metrics · healthkit_daily_summaries              │
│  row-level security on · no direct client access            │
└──────────────────────────┬──────────────────────────────────┘
                           │ Postgres connection (database password, from your machine)
                           ▼
┌─────────────────────────────────────────────────────────────┐
│  FastMCP server  (mcp-server/main.py)                       │
│  FastMCP tools · stdio transport                             │
└──────────────────────────┬──────────────────────────────────┘
                           │ MCP
                           ▼
              Claude · ChatGPT · Cursor · Ollama · any client

Níveis de dados: consultas nos últimos 30 dias retornam amostras brutas. Dias mais antigos usam uma linha pré-agregada de healthkit_daily_summaries quando ela existe e, caso contrário, são agregados por dia dentro do Postgres a partir das amostras brutas, então os resultados são completos independentemente de o resumidor já ter sido executado no seu projeto (em um projeto auto-hospedado novo, ele nunca foi). As respostas trazem um bloco tier informando quantos dias cada nível atendeu. Os dias do calendário seguem HEALTH4AI_TZ (padrão UTC; defina em mcp-server/.env).


Estrutura do repositório

health4ai/
├── ios/                         # Swift/SwiftUI iOS app (iOS 17+)
│   └── Health4AI/               # HealthKit sync engine, auth, settings
├── mcp-server/
│   ├── main.py                  # FastMCP server entry point
│   ├── tools.py                 # MCP tool implementations
│   └── .env.example             # Required environment variables
├── web/
│   ├── public/schema.sql        # Generated from supabase/bootstrap (Supabase only)
│   └── src/                     # Astro marketing site
├── scripts/
│   ├── import_health_export.py  # One-time XML backfill from Apple Health export
│   └── summarize_historical.py  # Backfill daily summaries table
└── docs/
    └── SETUP.md                 # Detailed setup guide

Privacidade

Seus dados de saúde vão diretamente do seu iPhone para o seu próprio projeto Supabase. O health4.ai nunca recebe, armazena ou tem acesso a eles. O servidor MCP roda localmente com suas próprias credenciais — seus dados nunca tocam nossa infraestrutura.

Consulte a Política de Privacidade para detalhes completos.


Contribuição

Licença MIT. Pull requests são bem-vindos.

Boas áreas para começar: agregações adicionais de métricas, suporte a múltiplos usuários com JWT/RLS, Android e mais guias de integração com clientes MCP.

Licença

MIT — consulte LICENSE.