Skip to main content
Glama
README.md
# 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

B3.2/5.0

Scored across 3 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness3/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues