ibge-br-mcp 4.1.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -40,7 +40,7 @@ ranking all 5,570 municipalities in a single call.
40
40
 
41
41
  ## Features
42
42
 
43
- - **21 specialized tools** covering all major IBGE data domains
43
+ - **23 tools** covering all major IBGE data domains — 21 `ibge_*` data tools plus `search`/`fetch` for ChatGPT Deep Research
44
44
  - **Provenance block on every response** — source, canonical URL, reference
45
45
  period, real extraction timestamp, ready-to-use citation, and legal regime
46
46
  (see [Data provenance](#data-provenance))
@@ -52,6 +52,8 @@ ranking all 5,570 municipalities in a single call.
52
52
  - **Standardized error handling** with helpful suggestions
53
53
  - **Full TypeScript support** with strict typing
54
54
 
55
+ 📖 **Article (in Portuguese):** [Como achar a tabela certa no SIDRA — e como saber que é a certa](docs/artigo-sidra-tabela-certa.pt-BR.md) — finding the right SIDRA table, the metadata that settles it, a full worked example on 2022 Census data, and the four traps that cost the most. Also published on the site, in Portuguese and English: [sidneybissoli.com](https://sidneybissoli.com/en/blog/posts/sidra-tabela-certa/).
56
+
55
57
  ## Data provenance
56
58
 
57
59
  Since v3.3.0 every successful tool response carries a **provenance block**
@@ -140,9 +142,17 @@ aggregates are computed server-side from the raw IBGE values.
140
142
  | `ibge_noticias` | IBGE news and press releases |
141
143
  | `ibge_calendario` | IBGE release and collection calendar |
142
144
 
145
+ ### ChatGPT Deep Research
146
+ | Tool | Description |
147
+ |:-----|:------------|
148
+ | `search` | Searches the IBGE catalog (SIDRA tables, municipalities, known indicators) — OpenAI Deep Research contract |
149
+ | `fetch` | Returns one catalog document (table metadata, municipality hierarchy + population, indicator series) with its public URL for citation |
150
+
151
+ The two are the only tools without the `ibge_` prefix: their names are fixed by the OpenAI contract. For data queries keep using the `ibge_*` tools.
152
+
143
153
  ## Which tool should I use?
144
154
 
145
- With 21 tools, several can touch the same topic. Quick guide for the common overlaps:
155
+ With 23 tools, several can touch the same topic. Quick guide for the common overlaps:
146
156
 
147
157
  ### Population & demographics
148
158
 
@@ -186,7 +196,7 @@ Discover → inspect → query: `ibge_pesquisas` / `ibge_sidra_tabelas` (find a
186
196
 
187
197
  ### Prerequisites
188
198
 
189
- - Node.js 18.x or higher
199
+ - Node.js 22.x or higher (`engines.node`)
190
200
  - npm or yarn
191
201
 
192
202
  ### From npm (recommended)
@@ -252,6 +262,16 @@ Or if installed from source:
252
262
  }
253
263
  ```
254
264
 
265
+ ### ChatGPT (Deep Research)
266
+
267
+ ChatGPT deep research (and company knowledge, and research workflows over the Responses API) only uses an MCP server that exposes exactly `search` and `fetch` — this server does, on top of the `ibge_*` tools. Point the connector at the hosted endpoint, no key required:
268
+
269
+ ```
270
+ https://ibge.sidneybissoli.com/mcp
271
+ ```
272
+
273
+ `search` ranks the query against SIDRA tables, municipalities and the known indicators and returns `{ id, title, url }`; `fetch` returns the document as readable Markdown with the canonical public URL (sidra.ibge.gov.br or cidades.ibge.gov.br), which is what ChatGPT cites. Both carry the same provenance block as every other tool. In ChatGPT's developer mode (Settings → Security and login → Developer mode) any tool is callable — the `ibge_*` tools remain the ones to use for data.
274
+
255
275
  ## Tool Usage Examples
256
276
 
257
277
  ### ibge_estados
package/README.pt-BR.md CHANGED
@@ -40,7 +40,7 @@ entre elas ranquear os 5.570 municípios numa chamada só.
40
40
 
41
41
  ## Recursos
42
42
 
43
- - **21 ferramentas especializadas** cobrindo todos os principais domínios de dados do IBGE
43
+ - **23 ferramentas** cobrindo todos os principais domínios de dados do IBGE — 21 `ibge_*` de dados mais `search`/`fetch` para o Deep Research do ChatGPT
44
44
  - **Resources de referência & prompts de análise** (catálogos MCP + templates prontos)
45
45
  - **565 testes automatizados** — 88% de cobertura geral, 92% nas tools
46
46
  - **Cache automático** com TTL configurável para performance otimizada
@@ -49,6 +49,33 @@ entre elas ranquear os 5.570 municípios numa chamada só.
49
49
  - **Tratamento de erros padronizado** com sugestões úteis
50
50
  - **Suporte completo a TypeScript** com tipagem estrita
51
51
 
52
+ 📖 **Artigo:** [Como achar a tabela certa no SIDRA — e como saber que é a certa](docs/artigo-sidra-tabela-certa.pt-BR.md) — os três passos da busca, os metadados que decidem, um exemplo completo com dado de 2022 e as quatro armadilhas que mais custam caro. Também publicado no site: [sidneybissoli.com](https://sidneybissoli.com/blog/posts/sidra-tabela-certa/).
53
+
54
+ ## Procedência dos dados
55
+
56
+ Desde a v3.3.0 toda resposta bem-sucedida carrega um **bloco de procedência**
57
+ ([contrato do portfólio v1.0](https://www.npmjs.com/package/@sbissoli/mcp-provenance)),
58
+ de modo que cada número é citavel, auditável e reproduzível. O bloco sai por
59
+ três canais:
60
+
61
+ 1. `structuredContent.provenance` (analisável, visível ao modelo) — exatamente
62
+ seis chaves: `source` (a API do IBGE consultada), `source_url` (URL canônica
63
+ que reproduz a consulta), `data_vintage` (período de referência quando a
64
+ fonte publica um; `null` caso contrário), `retrieved_at` (o instante REAL da
65
+ extração na origem, preservado através do cache, horário de Brasília),
66
+ `citation` ("Fonte: IBGE — [pesquisa/tabela], [URL], extraído em [data].") e
67
+ `license` — mais `attribution`, a lista canônica de URLs de origem.
68
+ 2. `_meta` sob `br.com.sidneybissoli.ibge/provenance` e `.../attribution`
69
+ (espelho fora de banda para auditoria/UI, custo zero em tokens do modelo).
70
+ 3. Um rodapé de texto compacto anexado ao Markdown, para clientes só-texto.
71
+
72
+ As APIs do IBGE não declaram licença própria; o regime jurídico é o arcabouço
73
+ brasileiro de dados abertos — Lei 12.527/2011 (LAI) e Decreto 8.777/2016
74
+ (reuso irrestrito, uso livre, obrigação limitada a creditar a fonte). Respostas
75
+ em modo estatístico (`estatisticas=true`) e `ibge_comparar` vêm marcadas como
76
+ `derived`, com nota explicativa no bloco canônico, porque os agregados são
77
+ calculados no servidor a partir dos valores brutos do IBGE.
78
+
52
79
  ## Ferramentas Disponíveis
53
80
 
54
81
  ### Localidades e Geografia
@@ -112,9 +139,17 @@ entre elas ranquear os 5.570 municípios numa chamada só.
112
139
  | `ibge_noticias` | Notícias e releases do IBGE |
113
140
  | `ibge_calendario` | Calendário de divulgações e coletas do IBGE |
114
141
 
142
+ ### Deep Research do ChatGPT
143
+ | Ferramenta | Descrição |
144
+ |:-----------|:----------|
145
+ | `search` | Busca no catálogo do IBGE (tabelas SIDRA, municípios, indicadores conhecidos) — contrato Deep Research da OpenAI |
146
+ | `fetch` | Devolve um documento do catálogo (metadados da tabela, hierarquia + população do município, série do indicador) com a URL pública para citação |
147
+
148
+ As duas são as únicas ferramentas sem o prefixo `ibge_`: os nomes são fixados pelo contrato da OpenAI. Para consultar dados, continue usando as `ibge_*`.
149
+
115
150
  ## Qual ferramenta usar?
116
151
 
117
- Com 21 ferramentas, várias podem tocar no mesmo assunto. Guia rápido para as sobreposições comuns:
152
+ Com 23 ferramentas, várias podem tocar no mesmo assunto. Guia rápido para as sobreposições comuns:
118
153
 
119
154
  ### População e demografia
120
155
 
@@ -158,7 +193,7 @@ Descobrir → inspecionar → consultar: `ibge_pesquisas` / `ibge_sidra_tabelas`
158
193
 
159
194
  ### Pré-requisitos
160
195
 
161
- - Node.js 18.x ou superior
196
+ - Node.js 22.x ou superior (`engines.node`)
162
197
  - npm ou yarn
163
198
 
164
199
  ### Via npm (recomendado)
@@ -224,6 +259,16 @@ Ou se instalado a partir do código-fonte:
224
259
  }
225
260
  ```
226
261
 
262
+ ### ChatGPT (Deep Research)
263
+
264
+ O Deep Research do ChatGPT (e o Company Knowledge, e os workflows de pesquisa da API Responses) só usa um servidor MCP que exponha exatamente `search` e `fetch` — este servidor expõe as duas, além das `ibge_*`. Aponte o conector para o endpoint hospedado, sem chave:
265
+
266
+ ```
267
+ https://ibge.sidneybissoli.com/mcp
268
+ ```
269
+
270
+ `search` ranqueia a consulta contra tabelas SIDRA, municípios e indicadores conhecidos e devolve `{ id, title, url }`; `fetch` devolve o documento em Markdown legível com a URL pública canônica (sidra.ibge.gov.br ou cidades.ibge.gov.br), que é o que o ChatGPT cita. As duas carregam o mesmo bloco de proveniência das demais ferramentas. No modo desenvolvedor do ChatGPT (Configurações → Segurança e login → Modo desenvolvedor) qualquer ferramenta pode ser chamada — para dados, as `ibge_*` continuam sendo as certas.
271
+
227
272
  ## Exemplos de Uso das Ferramentas
228
273
 
229
274
  ### ibge_estados
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,8BAA8B,CAAC;AAmF/E,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAC9C,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AACnE,eAAO,MAAM,cAAc,QAAc,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,QAYpB,CAAC;AAgBb;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAsBxC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAgyB/E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,8BAA8B,CAAC;AAuF/E,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAC9C,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AACnE,eAAO,MAAM,cAAc,QAAc,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,QAYpB,CAAC;AAgBb;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAsBxC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAgzB/E"}
package/dist/server.js CHANGED
@@ -2,6 +2,7 @@ import { McpServer } from "@modelcontextprotocol/server";
2
2
  // Version sourced from package.json (single source of truth — avoids drift).
3
3
  // Node ESM reads it via the import attribute; esbuild inlines it for the Worker build.
4
4
  import pkg from "../package.json" with { type: "json" };
5
+ import { registerDeepResearchTools } from "@sbissoli/mcp-search";
5
6
  import { toMcpResult } from "./structured.js";
6
7
  import { comProveniencia } from "./provenance.js";
7
8
  import { estadosSchema, estadosOutputSchema, ibgeEstados, municipiosSchema, municipiosOutputSchema, ibgeMunicipios, localidadeSchema, localidadeOutputSchema, ibgeLocalidade, sidraSchema, sidraOutputSchema, ibgeSidra, nomesSchema, nomesOutputSchema, ibgeNomes, noticiasSchema, noticiasOutputSchema, ibgeNoticias, sidraTabelasSchema, sidraTabelasOutputSchema, ibgeSidraTabelas, sidraMetadadosSchema, sidraMetadadosOutputSchema, ibgeSidraMetadados, malhasSchema, malhasOutputSchema, ibgeMalhas, pesquisasSchema, pesquisasOutputSchema, ibgePesquisas, censoSchema, censoOutputSchema, ibgeCenso,
@@ -12,7 +13,7 @@ calendarioSchema, calendarioOutputSchema, ibgeCalendario, compararSchema, compar
12
13
  // Phase 3 tools (v1.6.0)
13
14
  malhasTemaSchema, malhasTemaOutputSchema, ibgeMalhasTema, vizinhosSchema, vizinhosOutputSchema, ibgeVizinhos, datasaudeSchema, datasaudeOutputSchema, ibgeDatasaude,
14
15
  // Phase 4 tools (v1.9.0)
15
- paisesSchema, paisesOutputSchema, ibgePaises, cidadesSchema, cidadesOutputSchema, ibgeCidades, } from "./tools/index.js";
16
+ paisesSchema, paisesOutputSchema, ibgePaises, cidadesSchema, cidadesOutputSchema, ibgeCidades, DEEP_RESEARCH_LIMIT, searchParaFabrica, fetchParaFabrica, } from "./tools/index.js";
16
17
  import { registerResources } from "./resources.js";
17
18
  import { registerPrompts } from "./prompts.js";
18
19
  import { announceServedVersions } from "./discover.js";
@@ -784,6 +785,21 @@ Behavior: read-only and idempotent — a live GET against the public IBGE APIs (
784
785
  outputSchema: comProveniencia(cidadesOutputSchema),
785
786
  annotations: READ_ONLY,
786
787
  }, handle("ibge_cidades", ibgeCidades));
788
+ // `search` + `fetch` — the ChatGPT Deep Research contract (v4.3.0). The only
789
+ // tools without the `ibge_` prefix (names fixed by OpenAI). Contract, envelope
790
+ // and descriptions come from the portfolio package; the IBGE index and the
791
+ // document text come from `src/tools/deep-research.ts`. Same annotations,
792
+ // provenance channels and usage telemetry as the tools above.
793
+ registerDeepResearchTools(server, {
794
+ search: searchParaFabrica,
795
+ fetch: fetchParaFabrica,
796
+ corpus: "IBGE (Brazilian official statistics: SIDRA tables, municipalities, known indicators)",
797
+ richTools: "the `ibge_*` tools (`ibge_sidra`, `ibge_cidades`, `ibge_indicadores`, `ibge_comparar`…)",
798
+ limit: DEEP_RESEARCH_LIMIT,
799
+ annotations: READ_ONLY,
800
+ extendOutputSchema: comProveniencia,
801
+ ...(record !== undefined ? { record } : {}),
802
+ });
787
803
  // Reference catalogs (roadmap 1.6) and analysis templates
788
804
  registerResources(server);
789
805
  registerPrompts(server);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -57,4 +57,20 @@ export declare function sidraRecords(data: Record<string, string>[]): SidraRecor
57
57
  * mistaken filter never blanks out the result).
58
58
  */
59
59
  export declare function selectSidraColumns(data: Record<string, string>[], campos?: string): Record<string, string>[];
60
+ /**
61
+ * Columns whose values are identifiers, not quantities: SIDRA's "(Código)"
62
+ * twins and the period columns (Ano, Mês, Trimestre, Semestre, Período — the
63
+ * same family `extrairPeriodoSidra` reads). Formatting these as numbers is
64
+ * what turned "2026" into "2.026" and "3106200" into "3.106.200" in the
65
+ * Markdown of four tools (found on 2026-09-02 through the Deep Research
66
+ * document of a municipality).
67
+ */
68
+ export declare function colunaIdentificadora(coluna: string): boolean;
69
+ /**
70
+ * One SIDRA cell for the Markdown table: quantities get the pt-BR thousands
71
+ * separator (values of 4+ characters, as before), identifiers and periods
72
+ * stay verbatim, empty stays "-". Shared by every SIDRA-backed table renderer
73
+ * — the rule lives here so the four tools cannot drift again.
74
+ */
75
+ export declare function formatarCelulaSidra(coluna: string, valor: string | undefined): string;
60
76
  //# sourceMappingURL=structured.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"structured.d.ts","sourceRoot":"","sources":["../src/structured.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAwBxE;AAED,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IACpC,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,YAAY,CAmBzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAC9B,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CA8B1B"}
1
+ {"version":3,"file":"structured.d.ts","sourceRoot":"","sources":["../src/structured.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAGnE,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAwBxE;AAED,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IACpC,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,YAAY,CAmBzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAC9B,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CA8B1B;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKrF"}
@@ -9,6 +9,7 @@
9
9
  * `toMcpResult`.
10
10
  */
11
11
  import { normalizeText } from "./config.js";
12
+ import { formatNumber } from "./utils/index.js";
12
13
  import { ATTRIBUTION_META_KEY, PROVENANCE_META_KEY, projetarProveniencia, rodapeProveniencia, } from "./provenance.js";
13
14
  /**
14
15
  * Converts a tool's `StructuredToolResult` into the MCP `CallToolResult`.
@@ -98,4 +99,30 @@ export function selectSidraColumns(data, campos) {
98
99
  return filtered;
99
100
  });
100
101
  }
102
+ /**
103
+ * Columns whose values are identifiers, not quantities: SIDRA's "(Código)"
104
+ * twins and the period columns (Ano, Mês, Trimestre, Semestre, Período — the
105
+ * same family `extrairPeriodoSidra` reads). Formatting these as numbers is
106
+ * what turned "2026" into "2.026" and "3106200" into "3.106.200" in the
107
+ * Markdown of four tools (found on 2026-09-02 through the Deep Research
108
+ * document of a municipality).
109
+ */
110
+ export function colunaIdentificadora(coluna) {
111
+ return /\(c[oó]digo\)\s*$/i.test(coluna) || /^(ano|trimestre|m[eê]s|semestre|per[ií]odo)\b/i.test(coluna);
112
+ }
113
+ /**
114
+ * One SIDRA cell for the Markdown table: quantities get the pt-BR thousands
115
+ * separator (values of 4+ characters, as before), identifiers and periods
116
+ * stay verbatim, empty stays "-". Shared by every SIDRA-backed table renderer
117
+ * — the rule lives here so the four tools cannot drift again.
118
+ */
119
+ export function formatarCelulaSidra(coluna, valor) {
120
+ if (!valor)
121
+ return "-";
122
+ if (colunaIdentificadora(coluna))
123
+ return valor;
124
+ if (!isNaN(Number(valor)) && valor.length > 3)
125
+ return formatNumber(Number(valor));
126
+ return valor;
127
+ }
101
128
  //# sourceMappingURL=structured.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"structured.js","sourceRoot":"","sources":["../src/structured.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"structured.js","sourceRoot":"","sources":["../src/structured.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,24 @@
1
1
  import { z } from "zod";
2
2
  import { type StructuredToolResult } from "../structured.js";
3
+ /**
4
+ * Tema → tabela SIDRA. EXPORTADO para que `tests/censo-mapa-de-tabelas.test.ts`
5
+ * prove, contra o catálogo oficial do Censo, que cada código daqui é mesmo do
6
+ * Censo Demográfico e mesmo do assunto que a `descricao` promete.
7
+ *
8
+ * POR QUE ISSO PRECISA SER PROVADO. Em 2026-08-31 uma varredura contra a API de
9
+ * Agregados achou **13 das 41 tabelas deste mapa fora do Censo Demográfico**:
10
+ * `saneamento`/2022 apontava para uma tabela da PNAD Contínua sobre renda em
11
+ * domicílios com TV por assinatura; `fecundidade`/2010, para o INPC;
12
+ * `rendimento`/2000, para o Censo Agropecuário; `quilombolas`/2022, para uso de
13
+ * Internet. A tool respondia normalmente, com a `descricao` escrita à mão no
14
+ * cabeçalho — ou seja, devolvia dado de outra pesquisa sob um rótulo que
15
+ * mentia. Nada quebrava: código e descrição moram lado a lado e nunca foram
16
+ * confrontados com a fonte.
17
+ */
18
+ export declare const CENSO_TABELAS: Record<string, Record<string, {
19
+ tabela: string;
20
+ descricao: string;
21
+ }>>;
3
22
  export declare const censoSchema: z.ZodObject<{
4
23
  ano: z.ZodOptional<z.ZodEnum<{
5
24
  1970: "1970";
@@ -1 +1 @@
1
- {"version":3,"file":"censo.d.ts","sourceRoot":"","sources":["../../src/tools/censo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,OAAO,EAAE,KAAK,oBAAoB,EAAoC,MAAM,kBAAkB,CAAC;AA2J/F,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DtB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAErD,gFAAgF;AAChF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW5B,CAAC;AAOH;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA8LhF"}
1
+ {"version":3,"file":"censo.d.ts","sourceRoot":"","sources":["../../src/tools/censo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,OAAO,EACL,KAAK,oBAAoB,EAI1B,MAAM,kBAAkB,CAAC;AAoB1B;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAChC,MAAM,EACN,MAAM,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAyLtD,CAAC;AAuBF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DtB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAErD,gFAAgF;AAChF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW5B,CAAC;AAOH;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA8LhF"}
@@ -2,16 +2,31 @@ import { z } from "zod";
2
2
  import { IBGE_API } from "../types.js";
3
3
  import { cacheKey, CACHE_TTL, cachedFetch } from "../cache.js";
4
4
  import { withMetrics } from "../metrics.js";
5
- import { createMarkdownTable, formatNumber } from "../utils/index.js";
5
+ import { createMarkdownTable } from "../utils/index.js";
6
6
  import { parseHttpError, ValidationErrors } from "../errors.js";
7
7
  import { territorialLevelHint, territorialLevelList } from "../config.js";
8
- import { sidraRecords, selectSidraColumns } from "../structured.js";
8
+ import { sidraRecords, selectSidraColumns, formatarCelulaSidra, } from "../structured.js";
9
9
  import { extrairPeriodoSidra, NOTA_DERIVACAO_ESTATISTICAS, provenienciaIbge, } from "../provenance.js";
10
10
  import { agruparPorParam, estatisticasBlocoSchema, estatisticasParam, estatisticasSidra, topNParam, TOP_N_DEFAULT, } from "../stats.js";
11
11
  // Census data is published by SIDRA down to the municipality level.
12
12
  const CENSO_NIVEIS = ["1", "2", "3", "6"];
13
13
  // Mapping of census data themes to SIDRA tables
14
- const CENSO_TABELAS = {
14
+ /**
15
+ * Tema → tabela SIDRA. EXPORTADO para que `tests/censo-mapa-de-tabelas.test.ts`
16
+ * prove, contra o catálogo oficial do Censo, que cada código daqui é mesmo do
17
+ * Censo Demográfico e mesmo do assunto que a `descricao` promete.
18
+ *
19
+ * POR QUE ISSO PRECISA SER PROVADO. Em 2026-08-31 uma varredura contra a API de
20
+ * Agregados achou **13 das 41 tabelas deste mapa fora do Censo Demográfico**:
21
+ * `saneamento`/2022 apontava para uma tabela da PNAD Contínua sobre renda em
22
+ * domicílios com TV por assinatura; `fecundidade`/2010, para o INPC;
23
+ * `rendimento`/2000, para o Censo Agropecuário; `quilombolas`/2022, para uso de
24
+ * Internet. A tool respondia normalmente, com a `descricao` escrita à mão no
25
+ * cabeçalho — ou seja, devolvia dado de outra pesquisa sob um rótulo que
26
+ * mentia. Nada quebrava: código e descrição moram lado a lado e nunca foram
27
+ * confrontados com a fonte.
28
+ */
29
+ export const CENSO_TABELAS = {
15
30
  // População
16
31
  populacao: {
17
32
  "1970-2010": {
@@ -36,22 +51,28 @@ const CENSO_TABELAS = {
36
51
  tabela: "204",
37
52
  descricao: "População de 5 anos ou mais por alfabetização e idade",
38
53
  },
39
- "2000": {
40
- tabela: "752",
41
- descricao: "População de 5 anos ou mais por alfabetização, sexo e idade",
42
- },
54
+ // 2000 não tem entrada: a tabela 752, que estava aqui, não é do Censo
55
+ // Demográfico. Sem substituta conferida, é melhor não ter tema para o ano
56
+ // do que servir outra pesquisa com este rótulo.
43
57
  "2010": {
44
58
  tabela: "1383",
45
- descricao: "População de 5 anos ou mais por alfabetização e grupos de idade",
59
+ descricao: "Taxa de alfabetização das pessoas de 10 anos ou mais por sexo",
46
60
  },
47
61
  "2022": { tabela: "9543", descricao: "Taxa de alfabetização por idade, cor/raça e sexo" },
48
62
  },
49
63
  // Domicílios
50
64
  domicilios: {
51
- "2000": { tabela: "753", descricao: "Domicílios por tipo e situação" },
52
- "2010": { tabela: "3164", descricao: "Domicílios por tipo, situação e número de moradores" },
53
- "2022": { tabela: "4711", descricao: "Domicílios - primeiros resultados" },
54
- "2022-detalhado": { tabela: "9605", descricao: "Domicílios particulares permanentes" },
65
+ "2000": {
66
+ tabela: "1310",
67
+ descricao: "Domicílios recenseados, por espécie e situação do domicílio",
68
+ },
69
+ "2010": {
70
+ tabela: "1310",
71
+ descricao: "Domicílios recenseados, por espécie e situação do domicílio",
72
+ },
73
+ "2022": { tabela: "4711", descricao: "Domicílios recenseados, por espécie" },
74
+ // "2022-detalhado" não existe mais: apontava para a 9605, que é a tabela de
75
+ // COR OU RAÇA — o mesmo código que o tema cor_raca usa, e corretamente.
55
76
  },
56
77
  // Idade e sexo
57
78
  idade_sexo: {
@@ -73,18 +94,38 @@ const CENSO_TABELAS = {
73
94
  },
74
95
  // Rendimento
75
96
  rendimento: {
76
- "2000": { tabela: "857", descricao: "Rendimento médio mensal" },
77
- "2010": { tabela: "3548", descricao: "Rendimento nominal mensal per capita" },
97
+ // 2000 não tem entrada: a 857, que estava aqui, é do Censo AGROPECUÁRIO.
98
+ "2010": {
99
+ tabela: "3548",
100
+ descricao: "Rendimento nominal médio e mediano das pessoas de 10 anos ou mais",
101
+ },
102
+ "2022": {
103
+ tabela: "10293",
104
+ // Só nível Brasil (N1) na origem — pedir UF ou município devolve erro do
105
+ // SIDRA, que é o comportamento honesto.
106
+ descricao: "Distribuição da massa de rendimento nominal mensal domiciliar per capita",
107
+ },
78
108
  },
79
109
  // Migração
80
110
  migracao: {
81
111
  "2000": { tabela: "631", descricao: "População por lugar de nascimento" },
82
- "2010": { tabela: "1505", descricao: "Emigrantes internacionais" },
112
+ "2010": {
113
+ tabela: "1505",
114
+ descricao: "População residente por naturalidade em relação ao município e à UF",
115
+ },
83
116
  },
84
117
  // Educação
85
118
  educacao: {
86
- "2000": { tabela: "706", descricao: "População por nível de instrução" },
87
- "2010": { tabela: "3540", descricao: "População por nível de instrução e sexo" },
119
+ // 2000 não tem entrada: a 706, que estava aqui, é das Estatísticas do
120
+ // Registro Civil (nascidos vivos).
121
+ "2010": {
122
+ tabela: "3540",
123
+ descricao: "Pessoas de 10 anos ou mais por nível de instrução",
124
+ },
125
+ "2022": {
126
+ tabela: "10061",
127
+ descricao: "Pessoas de 18 anos ou mais por nível de instrução, idade, sexo e cor ou raça",
128
+ },
88
129
  },
89
130
  // Trabalho
90
131
  trabalho: {
@@ -93,35 +134,80 @@ const CENSO_TABELAS = {
93
134
  },
94
135
  // Indígenas (novo)
95
136
  indigenas: {
96
- "2010": { tabela: "3451", descricao: "População indígena por etnia e localização" },
97
- "2022": { tabela: "9587", descricao: "População indígena por etnia, sexo e idade" },
98
- "2022-terras": { tabela: "9588", descricao: "População indígena em terras indígenas" },
137
+ "2010": {
138
+ tabela: "3452",
139
+ descricao: "Pessoas indígenas por situação e localização do domicílio, sexo e idade",
140
+ },
141
+ "2022": {
142
+ tabela: "10395",
143
+ descricao: "Pessoas indígenas por sexo e grupos de idade, segundo etnia, povo ou grupo",
144
+ },
145
+ "2022-terras": {
146
+ tabela: "10396",
147
+ descricao: "Pessoas indígenas residentes em Terras Indígenas, por sexo, idade e etnia",
148
+ },
99
149
  },
100
150
  // Quilombolas (novo)
101
151
  quilombolas: {
102
- "2022": { tabela: "9674", descricao: "População quilombola por sexo e idade" },
103
- "2022-territorios": { tabela: "9675", descricao: "População em territórios quilombolas" },
152
+ "2022": {
153
+ tabela: "10089",
154
+ descricao: "População residente, total e quilombola, por sexo e grupos de idade",
155
+ },
156
+ "2022-territorios": {
157
+ tabela: "10090",
158
+ descricao: "População, total e quilombola, residente em Territórios Quilombolas",
159
+ },
104
160
  },
105
161
  // Saneamento (novo)
106
162
  saneamento: {
107
- "2000": { tabela: "764", descricao: "Domicílios por forma de abastecimento de água" },
108
- "2010": { tabela: "3218", descricao: "Domicílios por tipo de saneamento" },
109
- "2022": { tabela: "9696", descricao: "Domicílios por abastecimento de água e esgotamento" },
163
+ "2000": {
164
+ tabela: "1453",
165
+ descricao: "Domicílios particulares permanentes por esgotamento sanitário e abastecimento de água",
166
+ },
167
+ "2010": {
168
+ tabela: "3218",
169
+ descricao: "Domicílios particulares permanentes por forma de abastecimento de água",
170
+ },
171
+ "2022": {
172
+ tabela: "6803",
173
+ descricao: "Domicílios particulares permanentes ocupados por ligação à rede de esgoto",
174
+ },
110
175
  },
111
176
  // Deficiência (novo)
112
177
  deficiencia: {
113
- "2000": { tabela: "2649", descricao: "Pessoas com deficiência por tipo" },
114
- "2010": { tabela: "3426", descricao: "População com deficiência por tipo e grau" },
178
+ // 2000 não tem entrada: a 2649, que estava aqui, é da Pesquisa Anual de
179
+ // Serviços (transportes).
180
+ "2010": {
181
+ tabela: "3426",
182
+ descricao: "População residente por tipo de deficiência, segundo sexo e cor ou raça",
183
+ },
184
+ "2022": {
185
+ tabela: "10125",
186
+ descricao: "Pessoas de 2 anos ou mais, total e com deficiência, por sexo e grupos de idade",
187
+ },
115
188
  },
116
189
  // Nupcialidade/Estado civil (novo)
117
190
  nupcialidade: {
118
- "2000": { tabela: "594", descricao: "Pessoas de 10 anos ou mais por estado civil" },
119
- "2010": { tabela: "1488", descricao: "Pessoas por estado civil e sexo" },
191
+ "2000": {
192
+ tabela: "1624",
193
+ descricao: "Pessoas de 10 anos ou mais de idade por sexo e estado civil",
194
+ },
195
+ "2010": {
196
+ tabela: "1541",
197
+ descricao: "Pessoas de 10 anos ou mais de idade, por estado civil",
198
+ },
120
199
  },
121
200
  // Fecundidade (novo)
122
201
  fecundidade: {
123
- "2000": { tabela: "2443", descricao: "Mulheres por número de filhos nascidos vivos" },
124
- "2010": { tabela: "1691", descricao: "Taxa de fecundidade" },
202
+ // 2000 não tem entrada: a 2443, que estava aqui, é de FAMÍLIAS por tipo.
203
+ "2010": {
204
+ tabela: "10075",
205
+ descricao: "Mulheres de 12 anos ou mais por número de filhos tidos nascidos vivos",
206
+ },
207
+ "2022": {
208
+ tabela: "10075",
209
+ descricao: "Mulheres de 12 anos ou mais por número de filhos tidos nascidos vivos",
210
+ },
125
211
  },
126
212
  };
127
213
  // Available themes
@@ -400,13 +486,7 @@ function formatCensoTable(data) {
400
486
  // Limit to first 30 rows
401
487
  const displayRows = dataRows.slice(0, 30);
402
488
  const headers = columns.map((col) => headerRow[col] || col);
403
- const rows = displayRows.map((row) => columns.map((col) => {
404
- const value = row[col];
405
- if (value && !isNaN(Number(value)) && value.length > 3) {
406
- return formatNumber(Number(value));
407
- }
408
- return value || "-";
409
- }));
489
+ const rows = displayRows.map((row) => columns.map((col) => formatarCelulaSidra(headerRow[col] || col, row[col])));
410
490
  let output = createMarkdownTable(headers, rows);
411
491
  if (dataRows.length > 30) {
412
492
  output += `\n_Mostrando 30 de ${dataRows.length} registros._\n`;