Entrega as duas ferramentas que o Deep Research do ChatGPT exige — search e
fetch, no contrato literal da OpenAI — sobre o catálogo do IBGE, e conserta
um defeito de formatação que o documento de município expôs em quatro tools.
Added
searchefetch(contrato Deep Research do ChatGPT). ChatGPT deep
research, company knowledge e os workflows de pesquisa da API Responses só
usam um servidor MCP que exponha exatamente essas duas tools, com esse
formato:search(query)→{ results: [{ id, title, url }] },
fetch(id)→{ id, title, text, url, metadata }, o objeto em
structuredContente serializado emcontent[0].text(um bloco só — o
rodapé de proveniência fica fora do texto, porque a doc descreve
content[0].textcomo o objeto). São as ÚNICAS tools sem o prefixoibge_
(nomes fixados pela OpenAI;tests/evals/fixtures.test.tsabre a exceção
por allowlist explícita). Contrato, envelope, ranking e registro vêm do
pacote novo do portfólio@sbissoli/mcp-search; o adapter IBGE é
src/tools/deep-research.ts: índice em memória (construído no primeiro
uso, refeito a cada 24 h) com todas as tabelas SIDRA (sidra:<cod>, url
sidra.ibge.gov.br/tabela), os 5.570 municípios (mun:<cod7>, url do
panorama no Cidades@) e os indicadores conhecidos deibge_indicadores
(ind:<chave>).fetchrenderiza com as tools reais — metadados da tabela
(ibge_sidra_metadados), hierarquia + população estimada (ibge_localidadeibge_sidra6579) e série do indicador (ibge_indicadores) — e reutiliza
o bloco de proveniência delas nos canaisstructuredContente_meta.
Título pt-BR, description em inglês dizendo que existem para o contrato e
apontando para asibge_*, mesmas annotations somente-leitura e mesma
telemetria. Superfície: 23 tools (deriva contra o baseline 4.2.0 = só as
duas). Medido em 02/09: índice de 14.886 documentos construído em ~770 ms na
primeira chamada, buscas seguintes em <10 ms;fetchde tabela ~150 ms, de
município ~340 ms, de indicador ~150 ms.
- Casos de contrato (
tests/output-contract.test.ts, 7 pares/casos com mock
despachado por URL — o índice faz dois GETs em paralelo) e de proveniência
(tests/provenance-wiring.test.ts) para as duas.
Changed
- O documento de município do
fetchNÃO é o panorama do Cidades@
(ibge_cidades): medido em 02/09, a API do Cidades@ levou de 24 s a mais de
60 s por chamada, e o Deep Research busca documentos em série. O documento
traz a hierarquia e a última estimativa de população e apontaibge_cidades
para o panorama completo. A lentidão do panorama fica registrada como achado
(não é desta release). tests/provenance-wiring.test.tsdeixou de pinar "21": a lista de casos é
confrontada com otools/listdo servidor vivo — tool nova sem caso reprova,
em vez de deixar um buraco silencioso na cobertura.- Contagens nos textos públicos (README en/pt,
server.json, landing do
Worker) atualizadas para 23 pelo teste que as deriva;worker/README.md
dizia "22 tools" (errado desde sempre) e perdeu a contagem.
Fixed
- Códigos e anos formatados como número nas tabelas Markdown de quatro
tools (ibge_sidra,ibge_censo,ibge_datasaude,ibge_indicadores):
a mesma heurística copiada — "célula numérica com mais de 3 caracteres ganha
separador de milhar" — transformavaAno 2026em2.026eMunicípio (Código) 3106200em3.106.200. Achado ao ler o documento de município do
Deep Research. Regra única emstructured.ts(formatarCelulaSidra): as
colunas gêmeas "(Código)" e a família de período (Ano, Mês, Trimestre,
Semestre, Período — a mesma queextrairPeriodoSidralê) ficam como estão;
quantidades seguem formatadas. OstructuredContentnunca foi afetado.