IBGE (Instituto Brasileiro de Geografia e Estatística) MCP. Brazil's official statistics agency. Keyless public API.
Server has well-structured tool definitions with clear naming (verb_noun pattern) and comprehensive descriptions (avg 180 chars, within baseline 194). All 6 tools have input schemas with type declarations and parameter descriptions. However, output schemas are completely undocumented, LLMs cannot predict response structure for planning. Parameters lack enums where applicable (e.g., 'orderBy' should be enum ['nome', 'id']; 'sex' should be enum ['M', 'F']). No error handling guidance, no pagination support despite tools returning potentially large lists (list_states, list_municipalities, list_aggregates). Missing actionable error messages and recovery hints. Security is adequate (read-only operations, no secrets in params), but composition could be stronger, no batch operations, no chaining IDs in responses.
Pull official IBGE/SIDRA statistical series (inflation, GDP, population, etc.). Specify the aggregate table, variable, periods, and locality. Common examples: IPCA monthly inflation = aggregate "1737" variable "63"; population estimate = aggregate "6579" variable "9324". Returns time series keyed by period.
Browse the catalog of IBGE/SIDRA aggregate tables grouped by subject (inflation, agriculture, demographics, etc.). Use to discover aggregate ids to pass to aggregated_data. Optionally filter by research/subject acronym.
List municipalities for a given state (UF). Returns each municipality with its 7-digit IBGE id and name. e.g. uf="RJ" lists all municipalities in Rio de Janeiro.
List all 27 Brazilian states (UFs) with id, 2-letter sigla, name, and region (e.g. "SP" → São Paulo, Sudeste). Useful for resolving state names/codes before querying municipalities or regional data.
Look up a single municipality by its 7-digit IBGE code, returning full hierarchy (micro/mesoregion, state, region). e.g. code="3550308" → São Paulo (capital).
Output schemas completely undocumented. LLMs cannot predict response structure, field names, or types. Breaks downstream tool chaining and forces agents to guess at response shape.
Parameters with constrained values lack enum declarations. 'orderBy' accepts only 'nome' or 'id' but is free-form string; 'sex' accepts only 'M' or 'F' but is free-form. LLMs will hallucinate invalid values.
No pagination support. list_states (27 items), list_municipalities (up to 5,570 per state), and list_aggregates (potentially hundreds) return unbounded results. Large responses blow context windows and degrade LLM reasoning.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Brazilian census name statistics. Pass a first name to get its registration frequency by decade (since 1930), optionally filtered by sex or state. e.g. name="maria". Pass name="ranking" to get the top names instead.
No error handling guidance. Errors are raw HTTP status + text (e.g., '404 Not Found'). LLMs cannot determine if error is retryable, user-fixable, or fatal. No recovery hints.
aggregated_data parameter 'localities' requires manual bracket encoding (e.g., 'N1[all]'). Description mentions 'Brackets are auto-encoded' but code shows encodeURIComponent() which double-encodes. Confusing and error-prone.