IBGE Brasil MCP Server
[npm version]
[npm downloads]
[node]
[MCP Registry]
[LobeHub]
[smithery badge]
[ibge-br-mcp MCP server]
[CI]
[Coverage]
[GitHub stars]
[GitHub Sponsors]
[License: MIT]
Live, exact Brazilian public data for your AI assistant — with provenance, not guesswork.
Ask an LLM "what was Belo Horizonte's population in the 2022 Census?" and you get a plausible number from its training data: maybe right, maybe outdated, with no source. ibge-br-mcp instead has your assistant query the official IBGE APIs in real time — returning the exact figure together with the table and period it came from.
🇧🇷 Leia em Português
This server implements the Model Context Protocol (MCP) to give AI assistants live, structured access to Brazil's public geographic, demographic, economic, and health data — sourced from the IBGE APIs (including health indicators served through IBGE's SIDRA system).
See it in action
Ask your assistant, in English or Portuguese:
- "What was Belo Horizonte's population in the 2022 Census?" →
ibge_cidades / ibge_censo
- "List the municipalities of Espírito Santo." →
ibge_municipios
- "Compare GDP across the Southeast state capitals." →
ibge_comparar
The answers come live from the official IBGE APIs — exact figures with the table and period they came from, not numbers guessed from training data.
Want to see a whole analysis rather than a single answer? The
end-to-end demo works one real question — which state grew
most between the 2010 and 2022 Censuses, and what drove it — from first call to
conclusion, with every figure as it came back. The
practical examples are seven shorter recipes, including
ranking all 5,570 municipalities in a single call.
Features
- 23 tools covering all major IBGE data domains — 21
ibge_* data tools plus search/fetch for ChatGPT Deep Research
- Provenance block on every response — source, canonical URL, reference
period, real extraction timestamp, ready-to-use citation, and legal regime
(see Data provenance)
- Reference resources & analysis prompts (MCP catalogs + ready-made templates)
- 565 automated tests — 88% overall coverage, 92% across the tools
- Automatic caching with configurable TTL for optimal performance
- Retry mechanism with exponential backoff for network resilience
- Comprehensive validation for all input parameters
- Standardized error handling with helpful suggestions
- Full TypeScript support with strict typing
📖 Article (in Portuguese): Como achar a tabela certa no SIDRA — e como saber que é a certa — 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.
🔌 Tutorial: Querying SIDRA through MCP in Claude and ChatGPT — how to connect this server in claude.ai, Claude Desktop, Claude Code, ChatGPT (developer mode and Deep Research), Cursor, VS Code and Gemini CLI, then one real query end to end with the provenance block it returns. Em português.
Data provenance
Since v3.3.0 every successful tool response carries a provenance block
(portfolio contract v1.0),
so each number is citable, auditable, and reproducible. The block is emitted on
three channels:
structuredContent.provenance (parseable, visible to the model) — exactly
six keys: source (the IBGE API queried), source_url (canonical URL that
reproduces the query), data_vintage (reference period when the source
exposes one; null otherwise), retrieved_at (the REAL upstream extraction
instant, preserved across cache hits, Brasília time), citation
("Fonte: IBGE — [pesquisa/tabela], [URL], extraído em [data]."), and
license — plus attribution, the canonical list of source URLs.
_meta under br.com.sidneybissoli.ibge/provenance and .../attribution
(out-of-band mirror for audit/UI, zero model tokens).
- A compact text footer appended to the Markdown, for text-only clients.
The IBGE APIs declare no license of their own; the legal regime is Brazil's
open-data framework — Lei 12.527/2011 (LAI) and Decreto 8.777/2016
(unrestricted reuse, free use, obligation limited to crediting the source).
Statistics-mode responses (estatisticas=true) and ibge_comparar are marked
derived with an explanatory note in the canonical block, since the
aggregates are computed server-side from the raw IBGE values.
What each number is, and which version of it. A SIDRA value says neither
its period nor whether it is a monthly change, a year-to-date or 12-month
accumulation, an index or a level — the record's period column and its
Variável label do, and each ibge_indicadores entry is pinned to the one
variable its name promises (since 5.7.0; before, nine of them mixed every
variable of the table). data_vintage is ordered by the SIDRA period code, so
a January–December request reads "janeiro 2024–dezembro 2024". Every value is
the version SIDRA publishes at retrieved_at: IBGE revises published figures
(quarterly GDP, PNAD reweighting, PIM/PMC/PMS) and keeps no earlier version.
Available Tools
Localities & Geography
Statistical Data (SIDRA)
Economic & Social Indicators
Municipal Data (Cidades@)
International Data
Demographics
Classifications
Maps & Geographic Meshes
Health
News & Calendar
ChatGPT Deep Research
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.
Which tool should I use?
With 23 tools, several can touch the same topic. Quick guide for the common overlaps:
Population & demographics
Economic indicators
Localities & codes
SIDRA workflow
Discover → inspect → query: ibge_pesquisas / ibge_sidra_tabelas (find a table) → ibge_sidra_metadados (its structure) → ibge_sidra (query). For common data, the wrappers above (ibge_censo, ibge_indicadores, ibge_comparar, ibge_cidades) are usually easier.
Ask in your words, not the IBGE's
The IBGE names its tables in official statistical Portuguese, and ibge_sidra_tabelas matched
your words against the table name as a plain substring, accents included — so populacao
(no tilde, as anyone types it) returned nothing at all, and so did the everyday word for a
concept the IBGE names differently. Measured over the 9,336 tables of the Aggregates API
(2026-09-16), fixed since 5.1.0: both sides are normalised, every word must match (AND), and
the everyday word is expanded to the IBGE's own — the response says so in notas_vocabulario,
and zero results come with a way out.
Only measured pairs enter the table (src/vocabulario.ts, counts in the header): the word you ask
with absent from the catalogue, the IBGE's word present. What the IBGE does not publish as an
aggregate stays out and still returns zero — turismo, aposentadoria, frota — because an alias
for data that does not exist promises what the source does not have. The same table feeds the
Deep Research search index, which gets the everyday word as a keyword of the table whose name
carries the IBGE's word.
Maps (meshes)
Installation
Prerequisites
- Node.js 22.x or higher (
engines.node)
- npm or yarn
From npm (recommended)
From source
Configuration
Remote endpoint (nothing to install)
The server is also hosted, with the same tools, over Streamable HTTP and without a key:
It works with any client that accepts a remote MCP server — a custom connector in claude.ai (Settings → Connectors → Add custom connector), claude mcp add --transport http ibge https://ibge.sidneybissoli.com/mcp in Claude Code, an app in ChatGPT, the mcp.json of Cursor and VS Code. The step-by-step for each client is in the tutorial. The sections below cover the local form, via npx.
Claude Desktop
Add to your Claude Desktop configuration file (claude_desktop_config.json):
Or if installed from source:
Claude Code
ChatGPT (Deep Research)
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:
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.
Tool Usage Examples
ibge_estados
List all Brazilian states.
ibge_municipios
List Brazilian municipalities.
ibge_cidades
Query municipal indicators (similar to Cidades@ portal).
Available indicators: populacao, area, densidade, pib_per_capita, idh, escolarizacao, mortalidade, salario_medio, receitas, despesas
ibge_paises
Query international country data.
Regions: americas, europa, africa, asia, oceania
ibge_sidra
Query SIDRA tables (IBGE's Automatic Recovery System).
Common tables:
Territorial levels:
Statistics mode (also on ibge_censo, ibge_indicadores, ibge_datasaude):
for largest/smallest/mean/median/distribution/ranking questions, pass
estatisticas=true — the server computes the full distribution (min/max/mean/
median/std-dev/labeled percentiles) over all rows before pagination and
returns top/bottom rankings (topN, default 10). agruparPor="<column label>" ranks groups by descending sum, each with its own mini-distribution.
ibge_censo
Query Census data (1970-2022).
Available themes: populacao, alfabetizacao, domicilios, idade_sexo, religiao, cor_raca, rendimento, migracao, educacao, trabalho
ibge_indicadores
Query economic and social indicators.
Available indicators:
ibge_nomes
Query name frequency and rankings.
ibge_malhas
Get geographic meshes (maps).
Resolution levels:
ibge_datasaude
Query Brazilian health indicators served through IBGE's SIDRA (some originally produced by DataSUS, e.g. mortality and births).
Available indicators: mortalidade_infantil, esperanca_vida, nascidos_vivos, obitos, fecundidade, saneamento_agua, saneamento_esgoto, plano_saude
APIs Used
IBGE APIs
- Localities:
servicodados.ibge.gov.br/api/v1/localidades
- Names:
servicodados.ibge.gov.br/api/v2/censos/nomes
- Aggregates/SIDRA:
servicodados.ibge.gov.br/api/v3/agregados (SIDRA tables are read here with view=flat; apisidra.ibge.gov.br has been behind a browser-only Cloudflare challenge since 2026-09-15)
- Meshes:
servicodados.ibge.gov.br/api/v3/malhas
- News:
servicodados.ibge.gov.br/api/v3/noticias
- Population:
servicodados.ibge.gov.br/api/v1/projecoes/populacao
- CNAE:
servicodados.ibge.gov.br/api/v2/cnae
- Calendar:
servicodados.ibge.gov.br/api/v3/calendario
- Countries:
servicodados.ibge.gov.br/api/v1/paises
- Research:
servicodados.ibge.gov.br/api/v1/pesquisas
Development
Project Structure
Testing
The project includes a comprehensive test suite with 565 tests covering:
- Validation functions
- Retry mechanism
- Formatting utilities
- Error handling
- Cache operations
- Integration tests with mocks
Quality Assurance
This project maintains high code quality standards:
- 565 automated tests covering validation, caching, retry logic, formatting, and integrations
- 88% overall test coverage — cache and validation modules above 97%
- ESLint for code linting with zero warnings
- Prettier for consistent code formatting
- TypeScript strict mode for type safety
- Automated CI/CD via GitHub Actions
Run tests locally:
Surface fingerprint, checkable from the registry
Every release publishes, in its MCP Registry entry,
the sha256 of the surface this version serves (initialize, tools, resources, prompts) and which
methods answer without a credential. A surface change without a version bump fails the build;
the fingerprint in the registry lets a client check the same thing on its own side. Canonical
form and procedure: SPEC.md of @sbissoli/mcp-surface.
To check it yourself (Node 18+, no dependencies):
License
MIT
Author
Sidney da Silva Pereira Bissoli
References