mcp-saude-brasil
# mcp-saude-brasil
**Servidor MCP de dados abertos de saúde bucal do Brasil (Conselho Federal de Odontologia) — com o que cada base não responde declarado na resposta.**
Três tools que não mentem, em vez de trinta que não sabem.
---
## O problema que este servidor resolve
O CFO publica quantos dentistas, clínicas e laboratórios existem por UF e por localidade. A
primeira soma costuma dar errado **em silêncio**:
> Cada CRO lista também dentistas **inscritos nele com endereço em outra UF** (o CRO-SP lista
> 2.227 assim). Somar a lista de um CRO como se fosse a UF, ou usar UF + cidade como chave sem o
> CRO, sobrescreve linhas e **apaga metade dos dados sem erro** — 240 mil dentistas em vez de 472 mil.
Este servidor guarda o CRO de inscrição em cada linha e agrega pelo **município do endereço**
(código IBGE), somando todos os CROs.
E declara o que não responde: o **CNES não serve para contar consultórios odontológicos** —
"consultório isolado" reúne todas as profissões de saúde e não há campo que marque odontologia.
Este servidor não finge que serve.
## A garantia
Toda resposta segue o **phi-data-contract v0.1**: `data` + `provenance` (fonte e data de coleta)
+ `caveats` (os defeitos que se aplicam àquela consulta, com evidência e data de verificação) +
`cannot_answer` (o que a pergunta pediu e a fonte não responde).
## Instalação
Requer **Node ≥ 22.5** (SQLite embutido — zero dependências nativas).
```bash
npm install && npm run build
npm run db:build # lê as estatísticas públicas do CFO (1 GET + 27 POST) e monta o SQLite
```
**Nada é redistribuído** — a base é construída na sua máquina, sempre da fonte.
```json
{
"mcpServers": {
"saude": {
"command": "node",
"args": ["--experimental-sqlite", "/caminho/mcp-saude-brasil/dist/index.js"],
"env": { "SAUDE_LANG": "pt" }
}
}
}
```
## As tools
| Tool | O que faz |
|---|---|
| `saude_dentistas_municipio` | Cirurgiões-dentistas ativos por município do endereço, somando todos os CROs. Aceita código IBGE de 7 ou DATASUS de 6 dígitos, ou uma UF inteira. Informa quantos são inscritos em outro CRO. |
| `saude_uf` | Todas as categorias do CFO por UF: dentistas (CD), clínicas registradas no CRO (EPAO), laboratórios de prótese (LB), técnicos e auxiliares (TPD, TSB, ASB, APD), empresas de produtos odontológicos (ECIPO). |
| `saude_data_caveats` | As armadilhas conhecidas, com evidência, mais o relatório do build (localidades não casadas, casadas por aproximação, divergência município × UF). |
## Os caveats
| id | Severidade | Corrigido? |
|---|---|---|
| `cro_inscricao_nao_e_endereco` | crítico | ✅ CRO na chave; agregação pelo endereço |
| `cnes_sem_marca_odontologica` | crítico | — declarado; o servidor não usa o CNES para isso |
| `soma_municipal_menor_que_uf` | aviso | — Brasil: 472.500 na soma municipal vs 473.588 no total por UF |
| `inscrito_nao_e_atuante` | aviso | — é densidade de inscrições, não censo de consultórios |
| `distritos_e_grafias` | info | ✅ distritos somados ao município-sede; grafias casadas por aproximação na mesma UF |
## Fontes
CFO — [Quantidade geral de entidades e profissionais ativos](https://website.cfo.org.br/estatisticas/quantidade-geral-de-entidades-e-profissionais-ativos/)
e [Dados estatísticos por localidade](https://website.cfo.org.br/dados-estatisticos-de-profissionais-e-entidades-ativas-por-localidade/).
IBGE — API de Localidades (código de município).
```bash
npm test
```
MIT · Autor: **Luis Delfin** · parte da rede de servidores MCP de dados públicos de [Phi AI](https://phiai.io)
---
# English
**MCP server for Brazil's open dental-health data (Federal Council of Dentistry, CFO) — with what each source cannot answer declared in the response.**
## The problem
Each regional council (CRO) also lists dentists **registered with it but addressed in another
state**. Summing a CRO list as if it were the state, or keying by state + city without the CRO,
overwrites rows and **silently wipes half the data** (240k dentists instead of 472k). This server
keeps the registering CRO on every row and aggregates by the **address municipality** (IBGE code)
across all CROs.
It also states what it won't do: **CNES cannot count dental practices** — its "isolated practice"
type groups every health profession and no field flags dentistry.
## Guarantee
Every response follows **phi-data-contract v0.1**: `data` + `provenance` + `caveats` (with
evidence and verification date) + `cannot_answer`.
## Install
Node ≥ 22.5. `npm install && npm run build && npm run db:build`. Nothing is redistributed —
the database is built on your machine from the source. Set `SAUDE_LANG=en` for English caveats.
## Tools
- `saude_dentistas_municipio` — active dentists by address municipality (IBGE 7-digit or DATASUS 6-digit code, or a whole state).
- `saude_uf` — every CFO category by state (dentists, CRO-registered clinics, prosthesis labs, technicians, dental-product companies).
- `saude_data_caveats` — known pitfalls with evidence, plus the build report.
MIT · Author: **Luis Delfin** · part of [Phi AI](https://phiai.io)'s network of public-data MCP servers.
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: one for municipality-level dentist counts, one for UF-level all categories, and one for data caveats/explanation. There is no overlap or ambiguity between them.
All tool names share the 'saude_' prefix and use lowercase snake_case, which is consistent. 'saude_uf' is slightly terser than the others, but the pattern is still predictable and readable.
Three tools is a reasonable count for a narrowly focused server on Brazilian dental data. Each tool serves a distinct purpose, though one is more informational than a data query.
The server covers municipality-level dentists and UF-level all categories, but lacks municipality-level data for other categories (e.g., clinics, labs) and national-level aggregates. The caveats tool adds context but does not fill these data gaps.