# MCP Compras.gov.br (remote · mcp-compras.up.railway.app)

Preços, atas, contratos e sanções das APIs públicas de compras do governo brasileiro

- Trust score: 23/100 (low)
- Change this week: −63
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `mcp-compras.up.railway.app`: 23/100 (this document), [markdown](https://verifymcp.io/servers/opedrosoares-mcp-compras/mcp-compras.md), [page](https://verifymcp.io/servers/opedrosoares-mcp-compras/mcp-compras)
- pypi · `compras-mcp`: 0/100, [markdown](https://verifymcp.io/servers/opedrosoares-mcp-compras/compras-mcp.md), [page](https://verifymcp.io/servers/opedrosoares-mcp-compras/compras-mcp)

## Channel facts

- Endpoint: `https://mcp-compras.up.railway.app/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.4.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 11/100
  - TLS not yet verified: we couldn't open a connection to check the certificate.
  - Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS not yet verified: we couldn't read the response headers to check for it.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 0/100
  - Transport check failed: declared streamable-http, but we couldn't connect to verify it.
- **Schema Quality & AI Usability**: 0/100
  - Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 0/100
  - Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Tool Safety**: 0/100
  - Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Capabilities**: 0/100
  - Capabilities not yet verified: we couldn't read the endpoint's capabilities.

**Unverified: 5 categories.** Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

## Install

### How do I install the MCP Compras.gov.br server?

MCP Compras.gov.br is a hosted endpoint at https://mcp-compras.up.railway.app/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http opedrosoares-mcp-compras 'https://mcp-compras.up.railway.app/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "opedrosoares-mcp-compras": {
      "url": "https://mcp-compras.up.railway.app/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "opedrosoares-mcp-compras": {
      "type": "http",
      "url": "https://mcp-compras.up.railway.app/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.opedrosoares-mcp-compras]
url = "https://mcp-compras.up.railway.app/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "opedrosoares-mcp-compras": {
      "type": "remote",
      "url": "https://mcp-compras.up.railway.app/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add opedrosoares-mcp-compras --url 'https://mcp-compras.up.railway.app/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  opedrosoares-mcp-compras:
    url: "https://mcp-compras.up.railway.app/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "opedrosoares-mcp-compras": {
      "Transport": "http",
      "Url": "https://mcp-compras.up.railway.app/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add opedrosoares-mcp-compras -t streamable-http -u 'https://mcp-compras.up.railway.app/mcp'
```

### Other

```json
{
  "mcpServers": {
    "opedrosoares-mcp-compras": {
      "type": "http",
      "url": "https://mcp-compras.up.railway.app/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 23, 0)

- [security regression] Endpoint reachability: not serving MCP → unreachable
- [security regression] TLS certificate: pass → unverified
- [security regression] HSTS header: fail → unverified
- [security] Transport: Transport check failed: declared streamable-http, but we couldn't connect to verify it.

### 2026-11-03 (score 23, −63)

- [security regression] Endpoint reachability: reachable → not serving MCP
- [security regression] Tool safety: pass → unverified
- [security regression] Authorization: partial → unverified
- [security regression] Stability: pass → unverified
- [security regression] Transport: pass → fail
- [functional regression] Capabilities: pass → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Tool coverage: 100 → unverified

### 2026-10-10 (score 86, +2)

- [security] Stability: 0.90 → pass

### 2026-10-03 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-28 (score 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-25 (score 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-08 (score 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-09-07 (score 0)

First indexed and scored.

## MCP tools (100)

### `compras_aggregate_contratacoes_por_periodo` (~374 tokens)

Série temporal de contratações no PNCP por bucket.

\**Modo `count` (recomendado para tendência)**: 1 chamada por bucket
lendo apenas `totalRegistros`. Janelas grandes (até 5 anos) são viáveis.

\**Modo `valor_*`**: varre todas as páginas de cada bucket para somar.
Mais lento; limita-se a `MAX_PAGES_PER_BUCKET=25` páginas (× 500 itens =
12.500 registros máx por bucket). Sinaliza `truncado=true` quando bate
o teto.

Concurrency interna: 4 calls simultâneas. Cache 30 min.

Input parameters:

- `codigo_modalidade` (integer, required): Modalidade PNCP a agregar. Comuns: 6=Pregão Eletrônico, 8=Dispensa, 9=Inexigibilidade, 4=Concorrência Eletrônica.
- `data_final` (string, required): Data final da janela de agregação (YYYY-MM-DD).
- `data_inicial` (string, required): Data inicial da janela de agregação (YYYY-MM-DD).
- `esfera`: Filtro de esfera (federal/estadual/municipal/distrital). Só tem efeito no modo 'valor_*' (precisa varrer páginas).
- `granularidade` (string): Tamanho de cada bucket da série: 'dia', 'semana', 'mes' ou 'ano'.
- `metrica` (string): Métrica a calcular: 'count' (rápido, 1 call por bucket), 'valor_estimado' ou 'valor_homologado' (paginado, mais lento). Use 'count' para tendência pura; só ative valores quando necessário.
- `uf`: UF opcional.

### `compras_comparar_periodos_contratacoes` (~373 tokens)

Compara dois períodos lado a lado para a mesma modalidade.

Wrapper sobre `compras_aggregate_contratacoes_por_periodo` chamado duas
vezes (granularidade='ano' implícita — soma todo o período em 1 bucket).

Retorna totais de A e B + delta absoluto + delta percentual.

Caso de uso típico: _"Houve antecipação de licitações em Jun/2024 (ano
eleitoral) comparado a Jun/2025?"_ Ou _"As dispensas em Dez/2024 foram
maiores que Dez/2023 no mesmo órgão?"_.

Input parameters:

- `codigo_modalidade` (integer, required): Modalidade PNCP a comparar. Comuns: 6=Pregão Eletrônico, 8=Dispensa, 4=Concorrência Eletrônica.
- `esfera`: Esfera federativa. Requer métrica de valor (modo paginado).
- `label_a` (string): Rótulo amigável do período A (ex.: 'Jun/2024').
- `label_b` (string): Rótulo amigável do período B (ex.: 'Jun/2025').
- `metrica` (string): Métrica a comparar: 'count' (rápido) ou 'valor_estimado' / 'valor_homologado' (paginado).
- `periodo_a_fim` (string, required): Data final do período A (YYYY-MM-DD).
- `periodo_a_inicio` (string, required): Data inicial do período A (YYYY-MM-DD).
- `periodo_b_fim` (string, required): Data final do período B (YYYY-MM-DD).
- `periodo_b_inicio` (string, required): Data inicial do período B (YYYY-MM-DD).
- `uf`: UF opcional.

### `compras_arp_listar` (~315 tokens)

Lista Atas de Registro de Preço (ARPs) por janela de início de vigência.

Endpoint Dados Abertos `/modulo-arp/1_consultarARP`. O upstream exige
janela `dataVigenciaInicialMin/Max` (≤ 365 dias). Para listar atas
próximas do vencimento, use `compras_arp_por_fim_vigencia`.

Cache 15 min.

Input parameters:

- `codigo_modalidade_compra`: Filtra por modalidade da compra que originou a ata.
- `codigo_unidade_gerenciadora`: Filtra ARPs pela UASG gerenciadora (5-6 dígitos).
- `data_vigencia_inicial_max` (string, required): Data MÁXIMA do início da vigência da ata (YYYY-MM-DD). Obrigatório. Janela max ≤ 365 dias a partir de data_vigencia_inicial_min.
- `data_vigencia_inicial_min` (string, required): Data MÍNIMA do início da vigência da ata (YYYY-MM-DD). Obrigatório. A janela entre min e max deve ser de no máximo 365 dias.
- `numero_ata_registro_preco`: Filtra por número da ata (ex.: '00001/2024').
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_arp_consultar` (~263 tokens)

Consulta uma ARP específica pelo identificador PNCP.

Endpoint Dados Abertos `/modulo-arp/1.1_consultarARP_Id`. Devolve o
cabeçalho completo da ata (vigência, modalidade, gerenciadora, valores).

Quando o `numero_controle_pncp_ata` vem no formato de **compra** (sem
o sufixo `-NNNNNN` que numera a ata), a tool detecta e devolve
diagnóstico explícito em vez de propagar `encontrada=false` silencioso.

Cache 15 min.

Input parameters:

- `numero_controle_pncp_ata` (string, required): Identificador PNCP da **ata** (formato `cnpj14-1-sequencial/ano-NNNNNN`, onde NNNNNN numera a ata dentro da compra — compras SRP multi-fornecedor geram várias atas). Exemplo: `00394452000103-1-004729…

### `compras_arp_por_fim_vigencia` (~196 tokens)

Lista ARPs cuja vigência termina dentro do intervalo informado.

Endpoint Dados Abertos `/modulo-arp/1.2_consultarARP_FimVigencia`.
Permite ao gestor identificar atas próximas do vencimento.

Cache 15 min.

Input parameters:

- `codigo_unidade_gerenciadora`: UASG gerenciadora (opcional).
- `data_vigencia_final_max` (string, required): Data MÁXIMA de fim de vigência (YYYY-MM-DD). Obrigatório.
- `data_vigencia_final_min` (string, required): Data MÍNIMA de fim de vigência (YYYY-MM-DD). Obrigatório. Janela max ≤ 365 dias.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_arp_buscar_por_objeto` (~524 tokens)

Busca ARPs vigentes cujo `objeto` contém uma palavra-chave.

Resolve a limitação do endpoint `/modulo-arp/1.2_consultarARP_FimVigencia`,
que não aceita filtro por texto: pagina internamente até `max_paginas_varridas`
e filtra client-side por presença de `palavra_chave` (case-insensitive,
com normalização de acentos). Curto-circuita quando atinge `max_resultados`.

O servidor faz o trabalho que antes era pedido ao LLM — sem isso, o
roteiro `oportunidades_carona_arp` esbarrava em 169k ARPs vigentes e
339 páginas. Achado da bateria A v0.3.5.

\**Limitação conhecida**: o schema upstream de ARP **não traz UF** no
item — só `nomeOrgao` e `nomeUnidadeGerenciadora`. Para filtrar por
UF, cruze os matches com `compras_uasg_consultar` usando
\`codigoUnidadeGerenciadora` e compare `unidade.uf`. Não tentamos esse
cruzamento aqui para manter a tool barata e previsível.

Output:
    {
      "resultado": [<ARPs que casaram>],
      "total_examinadas": int,
      "matches": int,
      "paginas_varridas": int,
      "curto_circuitou": bool,
      "_filtro_objeto": {...}
    }

Cache 15 min por (palavra_chave + janela + caps).

Input parameters:

- `data_vigencia_final_max` (string, required): Limite máximo do fim de vigência (YYYY-MM-DD).
- `data_vigencia_final_min` (string, required): Limite mínimo do fim de vigência (YYYY-MM-DD). Tipicamente hoje para 'apenas vigentes'.
- `max_paginas_varridas` (integer): Quantas páginas do upstream serão varridas para encontrar matches (proteção de latência). Default 10 × 500 itens = até 5.000 ARPs examinadas. Cap em 50.
- `max_resultados` (integer): Quantos matches no máximo retornar (curto-circuita a varredura).
- `palavra_chave` (string, required): Termo a procurar no campo `objetoCompra` das ARPs (case-insensitive, com normalização básica de acentos). Exemplos: 'notebook', 'uniformes', 'limpeza'.

### `compras_arp_itens_listar` (~253 tokens)

Lista itens de ARPs na janela de vigência informada.

Endpoint Dados Abertos `/modulo-arp/2_consultarARPItem`. O upstream
exige `dataVigenciaInicialMin/Max` (janela ≤365 dias). Use filtros
opcionais para localizar atas com um item específico.

Cache 15 min.

Input parameters:

- `codigo_item`: Filtra por código CATMAT ou CATSER.
- `codigo_unidade_gerenciadora`: UASG gerenciadora (opcional).
- `data_vigencia_inicial_max` (string, required): Data máxima de início de vigência (YYYY-MM-DD).
- `data_vigencia_inicial_min` (string, required): Data mínima de início de vigência (YYYY-MM-DD).
- `ni_fornecedor`: CPF/CNPJ do fornecedor (apenas dígitos).
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `tipo_item`: Tipo do item: 'M' (material) ou 'S' (serviço).

### `compras_arp_unidades_item` (~206 tokens)

Lista UGs participantes (potenciais caronas) de um item da ARP.

Endpoint Dados Abertos `/modulo-arp/3_consultarUnidadesItem`. Determina
quais unidades podem usar a ata como carona (adesão).
Cache 15 min.

Input parameters:

- `numero_ata` (string, required): Número simples da ata (ex.: '00001/2024'). Distinto do `numeroControlePncpAta` — use o campo retornado em `compras_arp_listar` ou `compras_arp_itens_listar`.
- `numero_item` (integer, required): Número do item dentro da ata.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `unidade_gerenciadora` (integer, required): Código da UASG gerenciadora da ata.

### `compras_arp_saldo_item` (~331 tokens)

Devolve o **saldo** (quantidade ainda disponível) por item da ARP.

Endpoint Dados Abertos `/modulo-arp/4_consultarEmpenhosSaldoItem`.
\**Crítico para adesão**: a ata pode estar vigente mas com saldo
zerado. Sem saldo, não há como aderir.

\**Estrutura do payload**: o upstream retorna **1 linha por
(numeroItem, unidade, tipo)** — onde `tipo` pode ser `GERENCIADORA`,
\`PARTICIPANTE` etc. O mesmo `numeroItem` aparece várias vezes quando
há múltiplas unidades alocadas (carona ou rateio). **Não é
duplicação** — são alocações distintas dentro da mesma ata.

Para evitar confusão (achado bateria A v0.3.5), além do `resultado`
cru, anexamos `resumo_por_item`: dicionário agregando por
\`numeroItem` com soma das quantidades registradas/empenhadas e
saldo total — pronto para decisão de adesão.

Cache 15 min (saldo muda ao longo do dia).

Input parameters:

- `numero_ata` (string, required): Número simples da ata (ex.: '00001/2024').
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `unidade_gerenciadora` (integer, required): Código da UASG gerenciadora da ata.

### `compras_arp_adesoes_item` (~180 tokens)

Lista adesões (caronas) já realizadas a uma ARP.

Endpoint Dados Abertos `/modulo-arp/5_consultarAdesoesItem`. Mostra
quem aderiu e com que quantidade — indica nível de demanda e quanto
ainda resta no limite legal de adesões.

Cache 15 min.

Input parameters:

- `numero_ata` (string, required): Número simples da ata (ex.: '00001/2024').
- `numero_item` (integer, required): Número do item dentro da ata.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `unidade_gerenciadora` (integer, required): Código da UASG gerenciadora da ata.

### `compras_pncp_atas_listar` (~141 tokens)

Lista atas registradas no PNCP no período (federal + estadual + municipal).

Endpoint PNCP `/v1/atas`. Permite encontrar atas de qualquer ente da
federação — mais amplo que Dados Abertos (só federal SISG).

Cache 15 min.

Input parameters:

- `cnpj_orgao`: CNPJ do órgão (14 dígitos).
- `data_final` (string, required): Data final (YYYY-MM-DD).
- `data_inicial` (string, required): Data inicial (YYYY-MM-DD).
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.

### `compras_catmat_listar_grupos` (~151 tokens)

Lista os grupos do CATMAT (Catálogo de Materiais).

Grupos são o nível mais alto da hierarquia CATMAT (ex.: 10=ARMAMENTO,
11=MATERIAIS BÉLICOS NUCLEARES). Use esta tool para enquadrar a
contratação no grupo correto antes de descer para classes/PDM/itens.

Cache de 24h: os grupos mudam muito raramente. Total atual ~79 grupos.

Input parameters:

- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_catmat_listar_classes` (~141 tokens)

Lista as classes do CATMAT, opcionalmente filtradas por grupo.

Classes são o segundo nível da hierarquia (ex.: dentro do grupo 71
Mobiliário, a classe 7110 é "Mobiliário de escritório").

Cache de 24h.

Input parameters:

- `codigo_grupo`: Restringe a classes pertencentes a este grupo CATMAT. Se omitido, lista classes de todos os grupos.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_catmat_consultar` (~115 tokens)

Consulta detalhes de um item CATMAT específico pelo código.

Devolve nome do item, PDM, grupo, classe, características, NCM e
unidades de fornecimento. Útil para confirmar o código antes de
fazer pesquisa de preços ou listar contratações similares.

Cache de 24h.

Input parameters:

- `codigo_item` (integer, required): Código numérico do item no CATMAT (Catálogo de Materiais). Inteiro de 4 a 8 dígitos. Exemplo: 460789.

### `compras_catmat_listar_pdms` (~415 tokens)

Lista os PDMs (Padrão Descritivo de Material) do CATMAT.

Endpoint `/modulo-material/3_consultarPdmMaterial`. É o terceiro nível da
hierarquia do catálogo: grupo → classe → **PDM** → item.

O PDM é o que dá nome à família do material ("CADEIRA ESCRITÓRIO",
"MICROCOMPUTADOR"), enquanto o item é uma variação específica dela. Como a
API não faz busca por substring, descer até o PDM é a forma prática de
localizar o material certo antes de pedir os itens.

Uma classe devolve suas dezenas de PDMs nomeados em **uma** chamada — a
classe 7110 (Mobiliário de escritório) tem 98 PDMs. A alternativa seria
varrer milhares de itens e deduplicar `codigoPdm` client-side.

\**Isto é navegação hierárquica, não busca**: o endpoint não tem filtro
textual. Combine com `compras_catmat_listar_grupos` e
\`compras_catmat_listar_classes` para descer a hierarquia, e depois passe o
\`codigo_pdm` para `compras_catmat_buscar`.

Cache 24h.

Input parameters:

- `apenas_ativos`: Se `true`, só PDMs com status ativo no catálogo.
- `codigo_classe`: Código da classe CATMAT (4 dígitos). É o recorte mais útil: uma classe devolve suas dezenas de PDMs em uma única chamada.
- `codigo_grupo`: Código do grupo CATMAT (2 dígitos) para listar seus PDMs.
- `codigo_pdm`: Código de um PDM específico.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_catmat_buscar` (~563 tokens)

Busca itens CATMAT.

\**⚠️ Não existe busca por substring nesta API.** O contrato do
\`/modulo-material/4_consultarItemMaterial` oferece `descricaoItem`, que é
\**match exato**: `descricaoItem='CADEIRA'` devolve zero registros, embora o
catálogo tenha milhares de itens começando por "CADEIRA ESCRITÓRIO...".
Não é um filtro degradado — é um filtro de igualdade, e o termo livre que o
usuário digita quase nunca casa com a descrição inteira do item.

Por isso o `termo` **não** é enviado ao upstream: mandá-lo faria a chamada
retornar o universo inteiro (~340 mil itens) sem nenhum aviso. Ele é usado
para ordenar e marcar os resultados do recorte estrutural, e a filtragem
real vem de `codigo_grupo`, `codigo_classe` e `codigo_pdm`.

\**Workflow recomendado**:
1\. `compras_catmat_listar_grupos()` → escolher o grupo (ex.: 71=Mobiliários).
2\. `compras_catmat_listar_classes(codigo_grupo=71)` → a classe (ex.: 7110).
3\. `compras_catmat_listar_pdms(codigo_classe=7110)` → o PDM do material.
4\. `compras_catmat_buscar(termo='cadeira', codigo_pdm=...)`.

Esta tool emite `_aviso_filtro` no payload quando o recorte informado é
largo demais para ser útil.

Cache 24h por (termo + filtros + página).

Input parameters:

- `codigo_classe`: Filtro estrutural por classe CATMAT (4 dígitos). Use em conjunto com `codigo_grupo` para focar a busca.
- `codigo_grupo`: Filtro estrutural por grupo CATMAT (1-99). **FORTEMENTE RECOMENDADO** porque o filtro textual upstream está quebrado (veja docstring). Obtenha o código em `compras_catmat_listar_grupos`.
- `codigo_pdm`: Filtro estrutural por PDM (Padrão Descritivo de Material). É o recorte mais preciso do CATMAT: agrupa as variações de um mesmo material. Obtenha o código em `compras_catmat_listar_pdms`.
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.
- `termo` (string, required): Termo de busca textual (descrição do material/serviço). Aceita fragmento — a API faz match parcial. Ex.: 'cadeira ergonomica'.

### `compras_catser_listar_secoes` (~124 tokens)

Lista as seções do CATSER (Catálogo de Serviços).

Seções são o nível mais alto da hierarquia CATSER (baseada no CPC ONU).
Use para enquadrar a contratação de serviços em uma seção antes de
descer para divisões/grupos/classes/itens.

Cache de 24h.

Input parameters:

- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_catser_listar_classes` (~95 tokens)

Lista as classes CATSER, opcionalmente filtradas por grupo.

Cache de 24h.

Input parameters:

- `codigo_grupo`: Restringe a classes do grupo CATSER informado.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_catser_consultar` (~108 tokens)

Consulta detalhes de um item CATSER pelo código.

Devolve nome do serviço, descrição, seção/divisão/grupo/classe e
unidades de medida. Use para confirmar o código antes de pesquisar
preços ou contratações similares.

Cache de 24h.

Input parameters:

- `codigo_item` (integer, required): Código numérico do item no CATSER (Catálogo de Serviços). Inteiro de 4 a 6 dígitos. Exemplo: 27332.

### `compras_pesquisar_precos_para_etp` (~305 tokens)

Agrega preços praticados aplicando metodologia IN SEGES/ME 65/2021.

Composição: percorre `compras_pesquisar_preco_material` ou `_servico`
em até `max_paginas`, agrega os valores unitários e calcula:
mediana, média, desvio padrão, mínimo, máximo, quartis (Q1, Q3) e
descarte de outliers por IQR (1.5×IQR — Tukey).

Saída pronta para colagem em ETP: lista detalhada + sumário estatístico
\+ amostra recomendada (sem outliers). Cache 10 min.

Input parameters:

- `codigo_item_catalogo` (integer, required): Código CATMAT (material) ou CATSER (serviço).
- `max_paginas` (integer): Número máximo de páginas a percorrer ao agregar. Cada página tem 500 registros. Default 5 (até 2500 contratações). Aumente para amostras maiores.
- `periodo_meses` (integer): Janela de pesquisa em meses contados de hoje para trás. Default 12 (prazo recomendado pela IN SEGES/ME 65/2021 art. 5).
- `tipo` (string, required): Tipo do item: 'material' (consulta CATMAT) ou 'servico' (consulta CATSER).
- `uf`: Filtro opcional por UF (ex.: 'DF').

### `compras_checar_sancoes_fornecedor` (~144 tokens)

Consolida sanções de um fornecedor (CEIS + CNEP + CEPIM + leniência + impedimentos).

Composição: chama em paralelo as listas do Portal da Transparência e os
impedimentos do Comprasnet. Retorna um veredito booleano + lista
consolidada de sanções ativas.

Levanta `ComprasAuthError` se `TRANSPARENCIA_API_KEY` não estiver configurada.
Sempre use antes de homologar pregões/contratos. Cache 10 min.

Input parameters:

- `cnpj` (string, required): CNPJ do fornecedor (14 dígitos, com ou sem pontuação).

### `compras_montar_dossie_arp` (~426 tokens)

Dossiê completo de uma ARP em uma chamada.

Composição: cabeçalho via `/modulo-arp/1.1` (id PNCP) e — se `numero_item`
informado — saldo (4), adesões (5) e unidades participantes (3) em
paralelo. Os 3 últimos endpoints usam a chave composta
\`numeroAta + unidadeGerenciadora`.

Os 3 IDs vêm naturalmente do retorno de `compras_arp_listar` ou
\`compras_arp_itens_listar` (campos: `numeroControlePncpAta`,
\`numeroAta`, `unidadeGerenciadora`, `numeroItem`). Cache 10 min.

Quando `numero_controle_pncp_ata` vem no formato de **compra** (sem
sufixo `-NNNNNN`), devolvemos diagnóstico explícito antes de bater
no upstream — caminho que retornava `cabecalho: null` silencioso.

Input parameters:

- `numero_ata` (string, required): Número simples da ata (ex.: '00001/2024'). Usado nos endpoints de saldo, adesões e unidades participantes.
- `numero_controle_pncp_ata` (string, required): Identificador PNCP completo da **ata** (formato `cnpj14-1-sequencial/ano-NNNNNN`, com sufixo numerando a ata SRP dentro da compra). Ex.: `00394452000103-1-004729/2024-000006`. NÃO confundir com ID de…
- `numero_item`: Número do item dentro da ata. Se informado, traz também saldo, adesões e unidades participantes daquele item. Se omitido, apenas o cabeçalho é consultado.
- `unidade_gerenciadora` (integer, required): Código UASG da unidade gerenciadora da ata.

### `compras_buscar_contratacoes_similares` (~358 tokens)

Federa Dados Abertos + PNCP buscando contratações similares.

Composição: consulta os **itens** de contratações 14.133 no Dados Abertos
(`/modulo-contratacoes/2_`, filtrando por `codItemCatalogo` e só itens com
resultado) + publicações PNCP do período, deduplica pelo número de controle
PNCP e devolve os `max_resultados` mais recentes. Insumo para mapear
benchmarks de outros órgãos.

O recorte por CATMAT/CATSER vale para a perna Dados Abertos. A perna PNCP é
best-effort por modalidade e não aceita filtro por item de catálogo — por
isso `amostra_dados_abertos` e `amostra_pncp` vêm separadas no payload.

\**Atenção latência**: chama o PNCP em 3 modalidades (Pregão, Dispensa,
Concorrência) em paralelo. Cada chamada PNCP costuma levar 30-60s — o
tempo total da composta tende a 60-90s quando o cache está frio. Com
Redis configurado as chamadas seguintes voltam em <1s.

Input parameters:

- `codigo_catmat`: Código CATMAT do item. Mutuamente exclusivo com codigo_catser.
- `codigo_catser`: Código CATSER do serviço. Mutuamente exclusivo com codigo_catmat.
- `max_resultados` (integer): Máximo de contratações similares a retornar (deduplicadas).
- `periodo_meses` (integer): Janela de busca em meses contados de hoje para trás.
- `uf`: Filtro opcional por UF.

### `compras_perfil_fornecedor_completo` (~340 tokens)

Perfil consolidado do fornecedor (cadastro + Receita + sanções + impedimentos).

Composição em paralelo:
\- **cadastro**: Dados Abertos `/modulo-fornecedor/1_consultarFornecedor`
  pelo CNPJ (razão social, CNAE, porte, natureza jurídica);
\- **receita_federal**: BrasilAPI / MinhaReceita — QSA, capital social,
  atividades secundárias, data de início, situação cadastral (RF).
  Provider configurável via `CNPJ_PROVIDER` (default `brasilapi`);
\- **sanções**: Portal da Transparência (CEIS+CNEP+CEPIM) pelo CNPJ;
\- **impedimentos Comprasnet**: `/api/comprasnet/compras/impedimentos`.

\**Não inclui lista de contratos** porque os endpoints upstream
\`/modulo-contratos/1` (Dados Abertos) e `/v1/contratos` (PNCP) exigem
\`codigoOrgao` como filtro obrigatório — não é possível listar contratos
de um fornecedor sem saber em qual órgão ele tem contrato. Se você já
souber o órgão, use `compras_contratos_listar(codigo_orgao=X, ni_fornecedor=Y, ...)`.

Sanções dependem de `TRANSPARENCIA_API_KEY` — se não configurada ou se
o WAF da CGU bloquear, o bloco retorna aviso e o restante segue.

Cache 10 min.

Input parameters:

- `cnpj` (string, required): CNPJ do fornecedor (14 dígitos, com ou sem pontuação).

### `compras_contratacoes_14133_listar` (~696 tokens)

Lista contratações da Lei 14.133 publicadas no PNCP (via Dados Abertos).

Endpoint `/modulo-contratacoes/1_consultarContratacoes_PNCP_14133`.
Cobre pregões eletrônicos, dispensas, inexigibilidades e demais
modalidades da Nova Lei de Licitações no governo federal.

\**Atenção semântica**: o filtro `codigo_modalidade_dados_abertos` usa a
tabela de modalidade do SIASG/Dados Abertos, NÃO o cheat sheet PNCP de
\`compras_pncp_modalidades`. Os payloads retornam ambos os campos
(`codigoModalidade` do Dados Abertos e `modalidadeIdPncp` do PNCP) — use
\`modalidadeNome` para o nome amigável.

Cache 15 min.

Input parameters:

- `amparo_legal`: Código do amparo legal no PNCP (campo `amparoLegalCodigoPncp`). Ex.: 18 = Lei 14.133/2021, Art. 75, I (dispensa por valor).
- `cnpj_orgao`: CNPJ do órgão (14 dígitos, com ou sem pontuação).
- `codigo_ibge_municipio`: Código IBGE do município da unidade compradora (7 dígitos).
- `codigo_modalidade_dados_abertos`: Código de modalidade na tabela do **Dados Abertos / SIASG** (NÃO é o cheat sheet do PNCP). Equivalências confirmadas em 2026-05 por sweep empírico do endpoint:   3 = Concorrência Eletrônica (PNCP=4)…
- `codigo_orgao_pncp`: Código do órgão **no espaço de códigos interno do PNCP** — é o campo `codigoOrgao` que vem no payload desta mesma tool, e só ele. **Não é o código SIASG** de `compras_orgao_listar`/`compras_orgao_con…
- `codigo_uasg`: Código UASG do órgão licitante.
- `data_final_publicacao`: Data final de publicação (YYYY-MM-DD).
- `data_inicial_publicacao`: Data inicial de publicação (YYYY-MM-DD).
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.
- `uf`: Sigla da UF da unidade compradora (2 letras, ex.: 'SP', 'MS').

### `compras_contratacoes_14133_consultar` (~301 tokens)

Consulta uma contratação 14.133 pelo identificador.

Endpoint `/modulo-contratacoes/1.1_consultarContratacoes_PNCP_14133_Id`.
Devolve detalhes completos: objeto, valor estimado, modalidade,
instrumento convocatório, status no PNCP.

Aceita os dois identificadores do PNCP. Use `tipo_identificador='idCompra'`
com o campo `idCompra` das listagens, ou `'numeroControlePNCPCompra'` com o
número de controle que aparece no edital (ex.: `10673078000120-1-000021/2025`).

Cache 15 min.

Input parameters:

- `id_contratacao` (string, required): Identificador da contratação. Aceita dois formatos, conforme `tipo_identificador`: o `idCompra` (17 dígitos, campo `idCompra` das listagens, ex.: '15813206001272025') ou o número de controle PNCP (al…
- `tipo_identificador` (string): Qual identificador está sendo passado em `id_contratacao`: 'idCompra' (padrão) ou 'numeroControlePNCPCompra'. O upstream rejeita qualquer outro valor com HTTP 500.

### `compras_contratacoes_14133_itens_listar` (~684 tokens)

Lista itens de contratações 14.133 incluídos no período.

Endpoint `/modulo-contratacoes/2_consultarItensContratacoes_PNCP_14133`.

\**Uso principal — pesquisa de preço por item.** Com `cod_item_catalogo`
(CATMAT/CATSER) cada linha traz, junto, `quantidade`,
\`valorUnitarioEstimado`, `valorUnitarioResultado`, `valorTotalResultado`,
\`nomeFornecedor` e `unidadeMedida` — ou seja, estimado *versus* homologado
por item, insumo direto do mapa de preços do ETP.

\**Higiene da amostra**: passe `tem_resultado=True` (ou `situacao_item='2'`,
Homologado) antes de calcular média ou mediana. Item deserto, fracassado ou
cancelado não é preço praticado.

Sem nenhum filtro além das datas, a resposta é "tudo que o Brasil incluiu no
PNCP nessa janela" — quase sempre grande demais para ser útil.

Cache 15 min.

Input parameters:

- `cnpj_cpf_fornecedor`: CNPJ ou CPF do fornecedor vencedor do item (só dígitos).
- `cnpj_orgao`: CNPJ do órgão comprador (14 dígitos, com ou sem pontuação).
- `cod_item_catalogo`: Código do item no catálogo (CATMAT para material, CATSER para serviço). É o filtro que transforma esta tool em pesquisa de preço: devolve, na mesma linha, quantidade, valor unitário estimado e valor…
- `codigo_classe`: Código da classe do catálogo. Vem nulo em boa parte dos serviços — nesses casos use `codigo_grupo`.
- `codigo_grupo`: Código do grupo do catálogo. Recorte por família quando o código exato do item ainda não é conhecido.
- `codigo_uasg`: Código da UASG compradora (6 dígitos).
- `data_final_inclusao` (string, required): Data final de inclusão dos itens no PNCP (YYYY-MM-DD).
- `data_inicial_inclusao` (string, required): Data inicial de inclusão dos itens no PNCP (YYYY-MM-DD).
- `material_ou_servico`: 'M' para material, 'S' para serviço.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `situacao_item`: Situação do item da compra. '2' = Homologado, '4' = Cancelado. Filtre por '2' antes de calcular qualquer estatística de preço.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `tem_resultado`: Se `true`, só itens que tiveram vencedor — filtro aplicado pelo upstream. Use para pesquisa de preço: item deserto ou fracassado não é preço praticado e não pode entrar na média do ETP. Se `false`, o…

### `compras_contratacoes_14133_itens_por_contratacao` (~271 tokens)

Lista itens de uma contratação 14.133 específica.

Endpoint `/modulo-contratacoes/2.1_consultarItensContratacoes_PNCP_14133_Id`.
Aceita `idCompra` ou número de controle PNCP, conforme `tipo_identificador`.

Input parameters:

- `id_contratacao` (string, required): Identificador da contratação. Aceita dois formatos, conforme `tipo_identificador`: o `idCompra` (17 dígitos, campo `idCompra` das listagens, ex.: '15813206001272025') ou o número de controle PNCP (al…
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `tipo_identificador` (string): Qual identificador está sendo passado em `id_contratacao`: 'idCompra' (padrão) ou 'numeroControlePNCPCompra'. O upstream rejeita qualquer outro valor com HTTP 500.

### `compras_contratacoes_14133_resultados_listar` (~536 tokens)

Lista resultados (homologações) de itens 14.133 no período.

Endpoint `/modulo-contratacoes/3_consultarResultadoItensContratacoes_PNCP_14133`.
Devolve fornecedor vencedor, valor adjudicado e quantitativo homologado —
fonte primária de preço praticado para o ETP.

\**Due diligence de fornecedor**: `ni_fornecedor` (CNPJ/CPF) levanta tudo que
um fornecedor ganhou na janela.

\**Auditoria por materialidade**: `valor_total_min` monta a fila de
homologações acima de um patamar — combine com uma janela curta, já que o
filtro de data é obrigatório.

Para recortar por item de catálogo, use
\`compras_contratacoes_14133_itens_listar(cod_item_catalogo=...)`: esta rota
\**não** oferece filtro por CATMAT/CATSER.

Cache 15 min.

Input parameters:

- `cnpj_orgao`: CNPJ do órgão comprador (14 dígitos, com ou sem pontuação).
- `codigo_uasg`: Código da UASG compradora (6 dígitos).
- `data_final_resultado` (string, required): Data final do resultado/homologação (YYYY-MM-DD).
- `data_inicial_resultado` (string, required): Data inicial do resultado/homologação (YYYY-MM-DD).
- `ni_fornecedor`: Número de identificação do fornecedor vencedor (CNPJ ou CPF, só dígitos). Use para levantar tudo que um fornecedor ganhou no período.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `porte_fornecedor`: Código do porte do fornecedor (ex.: 1=ME, 2=EPP, 3=Demais). Preenchimento irregular na origem — trate ausência como desconhecido.
- `situacao_resultado`: Código da situação do resultado. 1 = Informado. Use para descartar resultado cancelado antes de calcular média ou mediana de preço.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `valor_total_max`: Valor total homologado máximo (R$).
- `valor_total_min`: Valor total homologado mínimo (R$). Combinado com a janela de datas, monta fila de auditoria por materialidade.
- `valor_unitario_max`: Valor unitário homologado máximo (R$).
- `valor_unitario_min`: Valor unitário homologado mínimo (R$).

### `compras_contratacoes_14133_resultados_por_contratacao` (~271 tokens)

Lista resultados (homologações) de uma contratação 14.133 específica.

Endpoint `/modulo-contratacoes/3.1_consultarResultadoItensContratacoes...`.
Aceita `idCompra` ou número de controle PNCP, conforme `tipo_identificador`.

Input parameters:

- `id_contratacao` (string, required): Identificador da contratação. Aceita dois formatos, conforme `tipo_identificador`: o `idCompra` (17 dígitos, campo `idCompra` das listagens, ex.: '15813206001272025') ou o número de controle PNCP (al…
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `tipo_identificador` (string): Qual identificador está sendo passado em `id_contratacao`: 'idCompra' (padrão) ou 'numeroControlePNCPCompra'. O upstream rejeita qualquer outro valor com HTTP 500.

### `compras_legado_licitacoes_listar` (~278 tokens)

Lista licitações do regime legado (Lei 8.666/93).

Endpoint `/modulo-legado/1_consultarLicitacao`. **Bug upstream
confirmado**: o filtro `uasg`, embora documentado no swagger oficial,
retorna HTTP 400 ("Erro ao efetuar a consulta") porque o atributo não
existe no modelo Hibernate da view (`TbVwLicitacao`). Por isso este
parâmetro foi removido da assinatura.

Workaround se você precisar filtrar por UASG: liste sem filtro, depois
filtre client-side pelo campo `uasg` do resultado.

Input parameters:

- `data_publicacao_final` (string, required): Data final de publicação (YYYY-MM-DD). Obrigatório no upstream.
- `data_publicacao_inicial` (string, required): Data inicial de publicação (YYYY-MM-DD). Obrigatório no upstream.
- `modalidade`: Código de modalidade SIASG (opcional).
- `numero_aviso`: Número do aviso (opcional).
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `pertence14133`: Filtrar somente processos vinculados à Lei 14.133.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_legado_licitacao_consultar` (~94 tokens)

Consulta uma licitação legado pelo id_compra.

Endpoint `/modulo-legado/1.1_consultarLicitacao_Id`. Upstream exige
\`id_compra` (string), não um `id` numérico.

Input parameters:

- `id_compra` (string, required): ID da compra no SIASG (string, retornado em `compras_legado_licitacoes_listar`).

### `compras_legado_itens_licitacao_listar` (~220 tokens)

Lista itens de licitações legado (`/modulo-legado/2_consultarItemLicitacao`).

Upstream exige `modalidade` obrigatório. Filtros opcionais: `uasg`,
\`numero_aviso`, `codigo_item_material/servico`, `cnpj_fornecedor`.

Input parameters:

- `cnpj_fornecedor`: CNPJ do fornecedor (opcional).
- `codigo_item_material`: Código CATMAT (opcional).
- `codigo_item_servico`: Código CATSER (opcional).
- `modalidade` (integer, required): Código de modalidade SIASG (obrigatório). Ex.: 5=Pregão, 6=Dispensa.
- `numero_aviso`: Número do aviso (opcional).
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `uasg`: Código UASG (opcional).

### `compras_legado_pregoes_listar` (~288 tokens)

Lista pregões eletrônicos do regime legado.

Endpoint `/modulo-legado/3_consultarPregoes`. **Bug upstream
confirmado**: os filtros `co_uasg` e `co_orgao`, embora documentados
no swagger, retornam HTTP 400 com erro Hibernate
\`Could not resolve attribute 'TbVwPregaoId.coUasg'` porque os atributos
não existem no modelo da view. Por isso ambos foram removidos da
assinatura.

Workaround para filtrar por UASG: chame sem filtro e filtre client-side
pelos campos `coUasg`/`coOrgao` do resultado.

Input parameters:

- `ds_tipo_pregao_compra`: Tipo do pregão de compra (string upstream).
- `dt_data_edital_final` (string, required): Data final do edital (YYYY-MM-DD). Obrigatório.
- `dt_data_edital_inicial` (string, required): Data inicial do edital (YYYY-MM-DD). Obrigatório.
- `numero`: Número do pregão (opcional).
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `pertence14133`: Filtrar pregões vinculados à Lei 14.133.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_legado_compras_sem_licitacao` (~238 tokens)

Lista compras sem licitação (dispensa/inexigibilidade) do regime legado.

Endpoint `/modulo-legado/5_consultarComprasSemLicitacao`. **Upstream
exige `dt_ano_aviso`** (ano inteiro, ex.: 2024) — não janela de datas.

Input parameters:

- `co_modalidade_licitacao`: Código da modalidade SIASG.
- `co_orgao`: Código do órgão (opcional).
- `co_orgao_superior`: Código do órgão superior (opcional).
- `co_uasg`: Código UASG (opcional).
- `dt_ano_aviso` (integer, required): Ano do aviso (ex.: 2024). Obrigatório no upstream.
- `nu_aviso_licitacao`: Número do aviso de licitação.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `pertence14133`: Vincula à Lei 14.133.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_legado_rdc_listar` (~240 tokens)

Lista contratações pelo RDC (Regime Diferenciado de Contratações).

Endpoint `/modulo-legado/7_consultarRdc`. **Upstream usa
\`data_publicacao_min/max`** (note `min`/`max`, não `inicial`/`final`).
RDC foi usado principalmente para obras dos megaeventos e da Copa —
relevância residual hoje.

Input parameters:

- `data_publicacao_max` (string, required): Data MÁXIMA de publicação (YYYY-MM-DD). Obrigatório.
- `data_publicacao_min` (string, required): Data MÍNIMA de publicação (YYYY-MM-DD). Obrigatório.
- `modalidade`: Código de modalidade.
- `orgao`: Código do órgão (opcional).
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `uasg`: Código UASG (opcional).
- `uf_uasg`: UF da UASG (sigla, ex.: 'DF').

### `compras_legado_itens_pregao_listar` (~543 tokens)

Lista itens de pregões do regime legado (Lei 8.666), com a cadeia de preço.

Endpoints `/modulo-legado/4_consultarItensPregoes` (por período de
homologação) e `/modulo-legado/4.1_consultarItensPregoes_Id` (quando
\`id_compra` é informado).

\**É a única fonte, em todo o MCP, da cadeia completa de formação de preço
por item**: `valor_estimado_item` → `menor_lance` → `valor_negociado` →
\`valor_homologado_item`. Serve para medir o desconto real obtido em certame
e para instruir negociação.

Traz também `situacao_item`, que revela itens desertos e fracassados —
invisíveis para quem só olha preço homologado, e relevantes para justificar
revisão de estimativa.

Informe `id_compra` **ou** o par de datas de homologação. As duas datas
precisam ser diferentes entre si (restrição do upstream).

Série histórica: use para contratações anteriores à Lei 14.133. Para 2022 em
diante, prefira `compras_contratacoes_14133_itens_listar`.

Cache 15 min.

Input parameters:

- `codigo_uasg`: Código da UASG que realizou o pregão (só na busca por período).
- `data_homologacao_final`: Data final de homologação dos itens (YYYY-MM-DD). Obrigatória quando `id_compra` não é informado.
- `data_homologacao_inicial`: Data inicial de homologação dos itens (YYYY-MM-DD). Obrigatória quando `id_compra` não é informado.
- `decreto_7174`: Filtra itens sujeitos ao Decreto 7.174/2010 (bens e serviços de informática).
- `id_compra`: Identificador do pregão, para trazer só os itens dele. É a concatenação zero-padded de UASG(6) + modalidade(2) + número(5) + ano(4) — ex.: '38916105000152022'. Também é o campo `id_compra` devolvido…
- `id_compra_item`: Identificador de um item específico dentro do pregão.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_legado_itens_sem_licitacao_listar` (~446 tokens)

Lista itens de contratações diretas do regime legado (dispensa/inexigibilidade).

Endpoints `/modulo-legado/6_consultarCompraItensSemLicitacao` (por ano do
aviso) e `/modulo-legado/6.1_consultarItensComprasSemLicitacao_Id` (quando
\`id_compra` é informado).

\**É o único caminho para contratação direta em nível de item no período
anterior ao PNCP (2019-2021)** — justamente a janela das dispensas
emergenciais da pandemia, para a qual as rotas da Lei 14.133 retornam vazio.
Traz `vr_estimado`, fornecedor vencedor e a descrição detalhada do item.

Informe `id_compra` **ou** `ano_aviso`.

CPF de fornecedor pessoa física vem mascarado por padrão (LGPD).

Cache 15 min.

Input parameters:

- `ano_aviso`: Ano do aviso da contratação direta. Obrigatório quando `id_compra` não é informado. Cobertura útil principalmente entre 2019 e 2021, período anterior ao PNCP — para 2022 em diante prefira `compras_co…
- `codigo_conjunto_materiais`: Código do conjunto de materiais (CATMAT legado).
- `codigo_modalidade`: Código da modalidade legada (dispensa, inexigibilidade).
- `codigo_orgao`: Código do órgão contratante.
- `codigo_servico`: Código do serviço (CATSER legado).
- `codigo_uasg`: Código da UASG contratante.
- `cpf_cnpj_fornecedor`: CPF ou CNPJ do fornecedor vencedor (só dígitos).
- `id_compra`: Identificador da compra, para trazer só os itens dela.
- `id_compra_item`: Identificador de um item específico dentro da compra.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contratos_listar` (~321 tokens)

Lista contratos federais (Dados Abertos /modulo-contratos/1).

O upstream exige `codigoOrgao` + janela `dataVigenciaInicialMin/Max`
(≤ 365 dias). Para sub-recursos detalhados (garantias, faturas,
ocorrências), use `compras_contrato_*` que consulta o Comprasnet.

Cache 15 min.

Input parameters:

- `codigo_modalidade_compra`: Modalidade da compra que originou o contrato.
- `codigo_orgao` (integer, required): Código do órgão (obrigatório no upstream). Use `compras_orgao_listar` para descobrir.
- `codigo_unidade_gestora`: Filtra pela UASG gestora do contrato.
- `data_vigencia_inicial_max` (string, required): Data MÁXIMA de início de vigência (YYYY-MM-DD).
- `data_vigencia_inicial_min` (string, required): Data MÍNIMA de início de vigência do contrato (YYYY-MM-DD). Janela max ≤ 365 dias até data_vigencia_inicial_max.
- `ni_fornecedor`: CPF/CNPJ do fornecedor (apenas dígitos). Opcional.
- `numero_contrato`: Filtra por número do contrato (ex.: '00031/2015').
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contratos_consultar` (~164 tokens)

Consulta um contrato no Dados Abertos (endpoint 1.1).

O upstream exige `codigo + tipo`. Tipos aceitos pela API:
\`idCompra` e `numeroControlePncpContrato`.

Cache 15 min.

Input parameters:

- `codigo` (string, required): Identificador do contrato no upstream — interpretação depende de `tipo`. Para tipo='idCompra' é o id da compra (string numérica). Para tipo='numeroControlePncpContrato' é o número de controle PNCP co…
- `tipo` (string): Como interpretar `codigo`: 'idCompra' (id interno da compra) ou 'numeroControlePncpContrato' (identificador PNCP).

### `compras_contratos_listar_por_fim_vigencia` (~208 tokens)

Lista contratos com vencimento na janela informada (endpoint 1.2).

Inventário do que precisa renovar. Upstream exige `codigoOrgao` +
\`dataVigenciaFinalMin/Max` (≤ 365 dias). Cache 15 min.

Input parameters:

- `codigo_orgao` (integer, required): Código do órgão (obrigatório).
- `codigo_unidade_gestora`: UASG gestora (opcional).
- `data_vigencia_final_max` (string, required): Data MÁXIMA de fim de vigência (YYYY-MM-DD).
- `data_vigencia_final_min` (string, required): Data MÍNIMA de fim de vigência (YYYY-MM-DD). Janela ≤ 365 dias.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contratos_itens_listar` (~211 tokens)

Lista itens de contratos (endpoint 2).

Upstream exige `codigoOrgao + dataVigenciaInicialMin/Max`. Cache 15 min.

Input parameters:

- `codigo_item`: Código CATMAT ou CATSER (opcional).
- `codigo_orgao` (integer, required): Código do órgão (obrigatório).
- `data_vigencia_inicial_max` (string, required): Data máxima de início de vigência (YYYY-MM-DD).
- `data_vigencia_inicial_min` (string, required): Data mínima de início de vigência (YYYY-MM-DD). Janela ≤ 365 dias.
- `ni_fornecedor`: CPF/CNPJ do fornecedor.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `tipo_item`: Tipo do item: 'M' (material) ou 'S' (serviço).

### `compras_contratos_item_consultar` (~325 tokens)

Lista os itens de um contrato específico, pelo identificador.

Endpoint `/modulo-contratos/2.1_consultarContratosItem_Id`.

Use quando você já tem o contrato em mãos e quer só os itens dele.
\`compras_contratos_itens_listar` exige órgão mais janela de vigência e
devolve os itens de todos os contratos do recorte — chegar a um contrato
específico por ali significa paginar centenas de linhas irrelevantes.

O `codigo` aceita o `idCompra` numérico (padrão) ou o número de controle
PNCP do contrato, conforme `tipo_identificador`. Qualquer outro valor de
tipo faz o upstream devolver HTTP 500.

\**Atenção ao somar valores**: pode haver mais de uma linha por item, uma
por versão/alteração contratual. Confira o campo de exclusão antes de
agregar.

Cache 15 min.

Input parameters:

- `codigo` (string, required): Identificador do contrato: o `idCompra` numérico ou o número de controle PNCP do contrato, conforme `tipo_identificador`.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `tipo_identificador` (string): Qual identificador está em `codigo`: 'idCompra' (padrão) ou 'numeroControlePncpContrato'. Outro valor devolve HTTP 500.

### `compras_contrato_comprasnet_consultar` (~103 tokens)

Consulta detalhe completo de um contrato no Comprasnet (/api/contrato/id/{id}).

Devolve contrato com sub-recursos embutidos. CPFs mascarados por LGPD.
Cache 15 min.

Input parameters:

- `id_contrato` (integer, required): ID interno do contrato no Comprasnet (pode ser diferente do id no Dados Abertos). Obtenha em `compras_contrato_comprasnet_por_uasg`.

### `compras_contrato_comprasnet_por_uasg` (~214 tokens)

Lista contratos de uma UASG no Comprasnet.

\**Atenção**: o upstream `/api/contrato/ug/{uasg}` não suporta paginação —
devolve a lista completa em uma resposta única (pode passar de 1 MB). Esta
tool fatia o resultado client-side conforme `pagina + tamanho_pagina` para
evitar inundar o LLM.

Cache 15 min do payload completo; fatiamento por chamada é barato.

Input parameters:

- `ativos` (boolean): Se True (padrão), lista apenas contratos ativos. Set False para incluir inativos via /api/contrato/inativo/ug/{uasg}.
- `codigo_uasg` (integer, required): Código UASG (5-6 dígitos).
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contrato_historico_aditivos` (~108 tokens)

Lista aditivos do contrato (/api/contrato/{id}/historico).

Paginação client-side (upstream não pagina). Cache 15 min do payload completo.

Input parameters:

- `id_contrato` (integer, required): ID do contrato no Comprasnet.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contrato_garantias` (~100 tokens)

Lista garantias contratuais (/api/contrato/{id}/garantias).

Paginação client-side. Cache 15 min.

Input parameters:

- `id_contrato` (integer, required): ID do contrato no Comprasnet.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contrato_faturas` (~155 tokens)

Lista NFs/faturas (/api/contrato/{id}/faturas).

Paginação client-side. Cache 15 min. **Atenção LGPD**: o campo
\`infcomplementar` (texto livre) pode conter nome de servidor + matrícula
SIAPE não estruturados — o mascaramento LGPD só cobre CPFs em campos
nominais (cpf, niResponsavel, etc.).

Input parameters:

- `id_contrato` (integer, required): ID do contrato no Comprasnet.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contrato_ocorrencias` (~110 tokens)

Lista ocorrências/penalidades (/api/contrato/{id}/ocorrencias).

Indicador-chave da confiabilidade do fornecedor. Paginação client-side.
Cache 15 min.

Input parameters:

- `id_contrato` (integer, required): ID do contrato no Comprasnet.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contrato_responsaveis` (~116 tokens)

Lista fiscais/gestores (/api/contrato/{id}/responsaveis).

CPFs mascarados por LGPD (`123.***.***-45`). Paginação client-side. Cache 15 min.

Input parameters:

- `id_contrato` (integer, required): ID do contrato no Comprasnet.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contrato_empenhos` (~99 tokens)

Lista empenhos do contrato (/api/contrato/{id}/empenhos).

Paginação client-side. Cache 15 min.

Input parameters:

- `id_contrato` (integer, required): ID do contrato no Comprasnet.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contrato_publicacoes` (~97 tokens)

Lista publicações DOU (/api/contrato/{id}/publicacoes).

Paginação client-side. Cache 15 min.

Input parameters:

- `id_contrato` (integer, required): ID do contrato no Comprasnet.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_contrato_cronograma` (~107 tokens)

Lista cronograma financeiro (/api/contrato/{id}/cronograma).

Paginação client-side — alguns contratos têm 200+ entradas mensais.
Cache 15 min.

Input parameters:

- `id_contrato` (integer, required): ID do contrato no Comprasnet.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_listar_prompts` (~172 tokens)

Lista os MCP Prompts disponíveis com nome, descrição e argumentos.

Tools de descoberta para clientes (como o Claude.ai web) que ainda
não expõem UI para prompts. Em Claude Desktop / Cursor / MCP Inspector,
prompts aparecem em UI dedicada — esta tool é um caminho alternativo,
não substituto.

Use depois `compras_obter_prompt(nome, argumentos)` para renderizar
um prompt específico.

Retorno:
    {
      "total": int,
      "prompts": [
        {
          "nome": str,
          "descricao": str,
          "tags": [str, ...],
          "argumentos": [
            {"nome": str, "descricao": str | None, "obrigatorio": bool},
            ...
          ]
        },
        ...
      ]
    }

### `compras_obter_prompt` (~267 tokens)

Renderiza um MCP Prompt e devolve o texto pronto.

O texto retornado é o conteúdo da `PromptMessage[0]` — tipicamente um
roteiro que orienta o LLM a executar um fluxo usando as tools deste
servidor. Depois de obter o texto, o LLM normalmente segue as
instruções dele, chamando outras tools conforme indicado.

Retorno:
    {
      "nome": str,
      "texto": str,  # conteúdo renderizado pronto para usar
      "argumentos_usados": dict,
    }

Se o prompt não existir ou faltar argumento obrigatório, retorna
\`_erro` com diagnóstico em vez de propagar exception.

Input parameters:

- `argumentos`: Mapa de argumentos exigidos pelo prompt. Os nomes e tipos vêm de `compras_listar_prompts`. Ex.: {"cnpj_orgao": "00394460000141", "ano": 2025, "sequencial": 12345}.
- `nome` (string, required): Nome do prompt a renderizar. Use `compras_listar_prompts` para descobrir nomes disponíveis. Exemplos: `analisar_contratacao_pncp`, `dossie_due_diligence_fornecedor`, `oportunidades_carona_arp`.

### `compras_listar_resources` (~151 tokens)

Lista os MCP Resources disponíveis com URI, nome e mime-type.

Tools de descoberta para clientes que não expõem UI de attachment de
resources (como o Claude.ai web). Em Claude Desktop / Cursor / MCP
Inspector, resources aparecem em picker dedicado.

Resources contêm dados de referência estáticos (tabelas de domínio,
glossário, metadados do servidor). Use `compras_obter_resource(uri)`
para ler o conteúdo.

Retorno:
    {
      "total": int,
      "resources": [
        {"uri": str, "nome": str, "descricao": str, "mime_type": str, "tags": [str,...]},
        ...
      ]
    }

### `compras_obter_resource` (~158 tokens)

Lê o conteúdo de um MCP Resource pela URI.

Retorna o conteúdo bruto (texto/JSON-string conforme o mime-type
registrado) e os metadados do resource.

Retorno:
    {
      "uri": str,
      "nome": str,
      "mime_type": str,
      "conteudo": str,
    }

Se a URI não existir, retorna `_erro` em vez de propagar exception.

Input parameters:

- `uri` (string, required): URI do resource. Use `compras_listar_resources` para descobrir URIs disponíveis. Exemplos: `compras://referencia/modalidades-pncp`, `compras://glossario/lei-14133`, `compras://meta/escopo`.

### `compras_fornecedor_cnpj_receita` (~232 tokens)

Dados públicos do CNPJ na Receita Federal (via BrasilAPI/MinhaReceita).

Retorna razão social, nome fantasia, situação cadastral, CNAE primário e
secundários, QSA (sócios), capital social, natureza jurídica, porte,
endereço e datas de início de atividade e da situação cadastral.

\**Quando usar**: complemento do `compras_perfil_fornecedor_completo`
para due diligence (avaliar porte, sócios, CNAEs vs objeto da licitação).
Os dados são da Receita; este MCP **não** consulta sanções aqui — para
isso use as tools de sanção (CEIS/CNEP/CEPIM/CEAF).

Cache 24h. Em caso de 404 ou erro upstream, retorna `encontrado=false`
com diagnóstico em `_erro` em vez de propagar exception.

Input parameters:

- `cnpj` (string, required): CNPJ a consultar (14 dígitos, com ou sem pontuação). Usa BrasilAPI por padrão; trocável via env `CNPJ_PROVIDER=minhareceita`.

### `compras_fornecedor_consultar` (~92 tokens)

Consulta cadastro de um fornecedor pelo CNPJ ou CPF.

Endpoint Dados Abertos `/modulo-fornecedor/1_consultarFornecedor`.
Devolve razão social, CNAE, porte da empresa, natureza jurídica.

Cache 1h.

Input parameters:

- `cnpj_cpf` (string, required): CNPJ (14 dígitos) ou CPF (11 dígitos) do fornecedor, com ou sem pontuação.

### `compras_fornecedor_listar` (~233 tokens)

Lista fornecedores no Compras.gov.br com filtros estruturais.

Endpoint Dados Abertos `/modulo-fornecedor/1_consultarFornecedor`. Use
para mapear fornecedores potenciais por porte/CNAE — ex.: levantar
todas as MEs com CNAE de TI.

Cache 1h.

Input parameters:

- `ativo` (boolean): True (default) para listar apenas ativos, False para apenas inativos.
- `cnpj`: Filtrar por CNPJ (14 dígitos).
- `codigo_cnae`: Código CNAE para filtrar por atividade.
- `cpf`: Filtrar por CPF (11 dígitos).
- `natureza_juridica`: Código da natureza jurídica.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `porte_empresa`: Código de porte da empresa (1=ME, 2=EPP, 3=Demais). Consulte os códigos no manual do Compras.gov.br.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_fornecedor_impedimentos_por_itens` (~139 tokens)

Consulta impedimentos no Comprasnet por lista de itens (CATMAT/CATSER).

Endpoint `POST /api/comprasnet/compras/impedimentos`. Retorna fornecedores
impedidos de participar de contratações dos itens informados (sanções
aplicadas no SICAF). Essencial antes de homologar pregões eletrônicos.

Cache 1h.

Input parameters:

- `codigos_catmat`: Lista de códigos CATMAT (materiais) a verificar. Use junto com codigos_catser ou separadamente.
- `codigos_catser`: Lista de códigos CATSER (serviços).

### `compras_fornecedor_contratos_por_item` (~108 tokens)

Lista contratos e empenhos por itens (CATMAT/CATSER) no Comprasnet.

Endpoint `POST /api/comprasnet/contratosempenhos`. Útil para descobrir
quem fornece esses itens hoje no governo (potenciais participantes em
novos certames).

Cache 1h.

Input parameters:

- `codigos_catmat`: Códigos CATMAT a buscar.
- `codigos_catser`: Códigos CATSER a buscar.

### `compras_indicadores_consolidados` (~150 tokens)

Métricas operacionais consolidadas da API Dados Abertos.

Endpoint `/modulo-indicadores/1_consultarIndicadoresConsolidados`.
Retorna: total de serviços disponíveis, total de requisições no
período, percentual de sucesso, latência média (ms), volume total
e médio de download (GB). Útil para diagnóstico/observabilidade,
\**não** para indicadores de mercado público (ver docstring do módulo).

Cache 1h.

Input parameters:

- `pagina` (integer): Página (1-based). Padrão 1.
- `tamanho_pagina` (integer): Registros por página (default 50, máximo 500).

### `compras_indicadores_por_periodo` (~159 tokens)

Métricas operacionais da API por período (ano/mês).

Endpoint Dados Abertos `/modulo-indicadores/2_consultarIndicadoresPorPeriodo`.
Retorna métricas de USO da API (requisições, latência, downloads),
não dados de compras. Útil para análise temporal de disponibilidade
do upstream.

Cache 1h.

Input parameters:

- `ano` (integer, required): Ano de referência dos indicadores (4 dígitos).
- `mes`: Mês (1-12). Se omitido, agrega o ano inteiro. Se informado, filtra apenas o mês especificado.
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.

### `compras_uasg_listar` (~579 tokens)

Lista UASGs (Unidades Administrativas de Serviços Gerais) do governo.

\**✅ Restaurada em 2026-08-05.** Da v0.2.x até a v0.3.12 esta tool
devolvia "endpoint indisponível" e a documentação atribuía o 404 a um
bug de roteamento da SEGES. O diagnóstico estava errado: faltava o
parâmetro obrigatório `statusUasg`, e esta API responde **404** (não
400\) quando um obrigatório não vem. Enviando o parâmetro, a rota
devolve 200 com ~22 mil UASGs ativas.

O filtro `ativo` alimenta `statusUasg`; quando não informado, a tool
assume `True` (ativas), que é o caso de uso dominante.

\**Paginação**: o upstream ignora `tamanho_pagina` nesta rota e devolve
páginas fixas de 500 registros — `_total_paginas` reflete a paginação
real do servidor, não o tamanho pedido.

\**`codigo_orgao` corrigido em 2026-09-07.** O filtro era enviado como
\`codigoOrgao`, chave que esta rota não declara: a resposta vinha com as
22 mil UASGs do país, sem aviso, como se o órgão não tivesse recorte
nenhum. Agora a tool resolve o código para o CNPJ do órgão e filtra por
\`cnpjCpfOrgao` — órgão 26246 (UFSC) devolve 3 UASGs. Custa uma chamada
extra a `/modulo-uasg/2_consultarOrgao`.

Duas ressalvas, ambas tratadas aqui: **CNPJ não identifica órgão** (599
dos 11.957 órgãos ativos compartilham CNPJ com outro — as 7 unidades do
CNPJ da Polícia Federal devolviam 110 UASGs, das quais só 8 do órgão
pedido), então o resultado é reduzido client-side pelo `codigoOrgao` de
cada UASG; e **39 órgãos não têm CNPJ próprio** (o upstream grava `"0"`),
caso em que a tool devolve lista vazia com `_aviso_filtro` em vez de um
recorte falso.

Cache 24h.

Input parameters:

- `ativo`: True para apenas UASGs ativas, False para inativas, None para ambas.
- `codigo_orgao`: Filtra UASGs subordinadas a este código de órgão.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_uasg_consultar` (~166 tokens)

Consulta uma UASG específica pelo código.

Devolve nome, sigla, CNPJ vinculado, órgão superior e endereço.
Útil para resolver `codigo_uasg` antes de consultas filtradas.

\**✅ Restaurada em 2026-08-05** — ver `compras_uasg_listar` para o
diagnóstico do 404 que afetava toda a família `/modulo-uasg/*`.

Busca primeiro entre as ativas; se não achar, repete entre as inativas
(o upstream exige `statusUasg` e não aceita "ambas"), devolvendo
\`ativa: false` para UASGs extintas.

Cache 24h.

Input parameters:

- `codigo_uasg` (integer, required): Código numérico da UASG.

### `compras_orgao_listar` (~413 tokens)

Lista órgãos cadastrados no Compras.gov.br.

Endpoint Dados Abertos `/modulo-uasg/2_consultarOrgao`. Inclui órgãos
do SISG (Sistema de Serviços Gerais), com código numérico, nome,
esfera, poder e CNPJ.

\**✅ Restaurada em 2026-08-05**: faltava o parâmetro obrigatório
\`statusOrgao` — mesma causa do 404 em `compras_uasg_listar`.

\**`nome`, `esfera` e `poder` são aplicados aqui, client-side.** Nenhum
dos três consta do contrato desta rota, e esta API ignora chave
desconhecida em silêncio — mandá-los devolvia os ~11,9 mil órgãos
ativos com cara de resultado filtrado (reconfirmado em 2026-09-07 com
parâmetro de controle). Desde 2026-09-07 eles não são mais enviados: o
recorte é feito sobre a página trazida, e o payload traz
\`_filtro_client_side` dizendo quantos sobraram. Consequência prática:
o filtro só enxerga a página atual, então varra as páginas ou use
\`codigo_orgao` em `compras_orgao_consultar` quando souber o código.

Cache 24h.

Input parameters:

- `esfera`: Esfera administrativa: 'F' (federal), 'E' (estadual), 'M' (municipal). Dados Abertos cobre majoritariamente federal.
- `nome`: Filtro textual pelo nome do órgão (match parcial).
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `poder`: Poder: 'E' (Executivo), 'L' (Legislativo), 'J' (Judiciário).
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_orgao_consultar` (~61 tokens)

Consulta um órgão específico pelo código.

Devolve nome, sigla, CNPJ, esfera, poder e quantitativos.
Cache 24h.

Input parameters:

- `codigo_orgao` (integer, required): Código numérico do órgão (4-6 dígitos).

### `compras_pncp_orgao_unidades` (~192 tokens)

Lista unidades administrativas de um órgão no PNCP.

Endpoint PNCP `/v1/orgaos/{cnpj}/unidades`. Útil para descobrir códigos
de unidade antes de filtrar contratações/contratos do órgão.

Cobre estados e municípios (não só federal). Cache 24h.

\**Tratamento de 404**: nem todo CNPJ está indexado no PNCP. Em vez de
levantar exception, esta tool retorna `_erro_upstream` informativo
com lista de alternativas (mesmo padrão das tools `compras_uasg_*` /
\`compras_orgao_*` quando o `/modulo-uasg/*` retorna 404).

Input parameters:

- `cnpj` (string, required): CNPJ do órgão (14 dígitos, com ou sem pontuação). Exemplo: 00394460000141 (Presidência da República).

### `compras_uasg_buscar` (~438 tokens)

Busca UASGs por trecho do nome (match parcial, ignora acento e caixa).

\**✅ Restaurada em 2026-08-05, com busca local.** Duas correções:

1\. A rota exige `statusUasg`; sem ele devolvia 404 (mesma causa de
   \`compras_uasg_listar`).
2\. O parâmetro `nome` **não existe** no contrato da rota e era
   ignorado pelo upstream — enviá-lo devolvia o universo inteiro
   (~22 mil UASGs) como se fossem resultados de busca. Corrigir só o
   item 1 teria trocado um erro visível (404) por um erro silencioso,
   que é pior: o analista receberia "TCU - SECRETARIA DE INFORMATICA"
   como 1º resultado de qualquer termo.

Como não há filtro textual upstream, a busca é feita **localmente**:
a tool varre as páginas da rota (500 registros cada, ~8s no universo
completo), filtra por `termo` e pagina o resultado filtrado. O varrido
fica em cache por 24h, então só a primeira busca do dia paga o custo.

O payload informa `_busca_local`, `_paginas_varridas` e
\`_universo_varrido` — se a varredura for truncada, isso fica explícito
em vez de virar silêncio.

Cache 24h.

Input parameters:

- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.
- `termo` (string, required): Trecho do nome da UASG (match literal, ignora acento e caixa). Ex.: 'aquaviarios', 'tribunal regional', 'exercito'. Siglas raramente funcionam — os nomes vêm por extenso no cadastro ('AGÊNCIA NACIONA…

### `compras_pesquisar_preco_material` (~545 tokens)

Pesquisa preços praticados em compras de material (CATMAT) pelo governo.

Endpoint Dados Abertos: `/modulo-pesquisa-preco/1_consultarMaterial`.
Para visão consolidada estatística (média/mediana no padrão IN 65/2021),
use a tool composta `compras_pesquisar_precos_para_etp`.

Cada item da resposta traz `precoUnitario`, `quantidade`, `dataCompra`,
\`niFornecedor`/`nomeFornecedor` e a UASG compradora — é **esta** a tool
que devolve valor unitário para material. A `compras_detalhar_preco_material`
NÃO devolve preço (ver a docstring dela).

\**⚠️ Quebra upstream corrigida em 2026-08-05**: entre ~2026-07 e
2026-08-05 esta tool respondia "Recurso nao encontrado" (HTTP 404). A
SEGES trocou a assinatura de query da rota sem versionar: o parâmetro
\`codigoItemCatalogo` foi substituído pelo par `tipo` (enum
\`codigoItemCatalogo` | `codigoPdm`) + `codigo`. Como a API responde
\**404** — e não 400 — a parâmetros obrigatórios ausentes, a quebra se
disfarçou de "rota removida". A rota nunca saiu do swagger oficial.
Corrigido na v0.3.13; a assinatura de `compras_pesquisar_preco_servico`
(rota 3) não mudou.

Se voltar a devolver 404, a tool não levanta exception: devolve
\`_erro_upstream` com diagnóstico e alternativas.

Cache 10 min.

Input parameters:

- `codigo_item_catalogo` (integer, required): Código CATMAT do material. Inteiro 4-8 dígitos. Ex.: 460789.
- `codigo_municipio`: Código IBGE do município (7 dígitos). Filtro mais fino que UF.
- `codigo_uasg`: Código da UASG compradora (filtro mais específico ainda).
- `data_fim`: Data final da compra (YYYY-MM-DD). Quando omitida, a API usa a data atual.
- `data_inicio`: Data inicial da compra (YYYY-MM-DD). Quando omitida, a API usa o início do ano corrente.
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.
- `uf`: Sigla da UF (ex.: 'DF'). Filtra compras realizadas pelo órgão da UF.

### `compras_detalhar_preco_material` (~444 tokens)

Lista as compras individuais de um item CATMAT — **sem valor de preço**.

Endpoint: `/modulo-pesquisa-preco/2_consultarMaterialDetalhe`.

\**⚠️ Esta tool não devolve preço.** Até a v0.3.12 a docstring prometia
"valor unitário homologado"; auditoria de 2026-08-05 mostrou que o DTO
upstream (`FtPesqPrecoCompraMaterialDetalheDTO`) tem exatamente 7 campos
e nenhum deles é valor:

    idCompra, idItemCompra, numeroItemCompra, codigoItemCatalogo,
    objetoCompra, descricaoDetalhadaItem, dataAtualizacaoFato

Confirmado nos dois sentidos: chamada crua ao upstream (fora da camada
do MCP) devolve as mesmas 7 chaves, e o contrato OpenAPI oficial
declara as mesmas 7. Ou seja: **não somos nós que filtramos** — o campo
nunca existiu nesta rota. A rota 4 (serviço detalhe) tem DTO idêntico.

\**Para preço unitário de material use `compras_pesquisar_preco_material`**,
que devolve `precoUnitario`, `quantidade`, `dataCompra` e fornecedor por
compra — é a fonte correta para a amostragem da IN SEGES/ME 65/2021.

Use esta tool apenas para: descrição detalhada do item como comprado,
objeto da compra e rastreio do `idCompra` para cruzar com outras bases.

Cache 10 min.

Input parameters:

- `codigo_item_catalogo` (integer, required): Código CATMAT do material. Inteiro 4-8 dígitos. Ex.: 460789.
- `data_fim`: Data final da compra (YYYY-MM-DD). Quando omitida, a API usa a data atual.
- `data_inicio`: Data inicial da compra (YYYY-MM-DD). Quando omitida, a API usa o início do ano corrente.
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.

### `compras_pesquisar_preco_servico` (~204 tokens)

Pesquisa preços praticados em compras de serviço (CATSER).

Endpoint: `/modulo-pesquisa-preco/3_consultarServico`. Para visão
consolidada (mediana, média, desvio no padrão IN 65/2021), use a tool
composta `compras_pesquisar_precos_para_etp` com tipo='servico'.

Input parameters:

- `codigo_item_catalogo` (integer, required): Código CATSER do serviço. Inteiro 4-6 dígitos. Ex.: 27332.
- `codigo_municipio`: Código IBGE do município.
- `codigo_uasg`: Código UASG.
- `data_fim`: Data final (YYYY-MM-DD).
- `data_inicio`: Data inicial (YYYY-MM-DD).
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.
- `uf`: Sigla da UF.

### `compras_detalhar_preco_servico` (~244 tokens)

Lista as compras individuais de um serviço CATSER — **sem valor de preço**.

Endpoint: `/modulo-pesquisa-preco/4_consultarServicoDetalhe`.

\**⚠️ Esta tool não devolve preço** (verificado 2026-08-05): o DTO
upstream é idêntico ao da rota 2 — idCompra, idItemCompra,
numeroItemCompra, codigoItemCatalogo, objetoCompra,
descricaoDetalhadaItem, dataAtualizacaoFato. Nenhum campo de valor.

\**Para preço unitário de serviço use `compras_pesquisar_preco_servico`**,
que devolve `precoUnitario` e fornecedor por compra.

Cache 10 min.

Input parameters:

- `codigo_item_catalogo` (integer, required): Código CATSER do serviço. Inteiro 4-6 dígitos. Ex.: 27332.
- `data_fim`: Data final (YYYY-MM-DD).
- `data_inicio`: Data inicial (YYYY-MM-DD).
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.

### `compras_pgc_listar` (~174 tokens)

Lista itens de PGC (Plano de Gestão de Contratações) do governo federal.

Endpoint Dados Abertos `/modulo-pgc/1_consultarPgcDetalhe`. Cada linha
representa um item planejado: descrição, quantidade, valor unitário
estimado, mês previsto de início e categoria de item.

Cache 1h.

Input parameters:

- `ano` (integer, required): Ano do PGC. Os PGCs do governo federal começam a aparecer a partir de 2020.
- `codigo_orgao`: Código do órgão (filtra os PGCs desse órgão).
- `codigo_uasg`: Código UASG (filtro mais específico que codigo_orgao).
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.

### `compras_pgc_por_catalogo` (~293 tokens)

Lista todos os PGCs que incluem determinado item de catálogo (CATMAT/CATSER).

Endpoint Dados Abertos `/modulo-pgc/2_consultarPgcDetalheCatalogo`.
Útil para responder: "Quais órgãos planejaram comprar esse item este ano?
Em que quantidade?". Insumo para ETP e benchmarking de quantitativos.

\**Corrigida em 2026-09-07.** A tool mandava `tipo=M`/`tipo=S` e o enum
upstream é `[Material, Servico]` — **toda** chamada devolvia HTTP 500
("Failed to convert ... EnumPgcDetalheCatalogo ... for value [M]"). A
interface `M`/`S` foi mantida e a tradução passou a ser feita aqui.
Mesma classe de defeito do `tipo=C` das tools de contratações.

Cache 1h.

Input parameters:

- `ano` (integer, required): Ano do PCA/PGC.
- `codigo_item` (integer, required): Código do item no catálogo (CATMAT se tipo='M', CATSER se tipo='S').
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.
- `tipo` (string, required): 'M' para CATMAT (material) ou 'S' para CATSER (serviço).

### `compras_pgc_agregacao` (~162 tokens)

Resumo agregado do PGC de um órgão num ano (totais por categoria).

Endpoint Dados Abertos `/modulo-pgc/3_consultarPgcAgregacao`. Retorna
contagens e valores totais por categoria/grupo, útil para diagnóstico
rápido do volume planejado pelo órgão.

Cache 1h.

Input parameters:

- `ano` (integer, required): Ano do PGC.
- `codigo_orgao` (integer, required): Código do órgão (obrigatório nesta consulta — é a chave da agregação).
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_pgc_listar_csv` (~146 tokens)

Versão CSV de `compras_pgc_listar` (mesmo dataset, formato planilha).

Endpoint `/modulo-pgc/1.1_consultarPgcDetalhe_CSV`. Útil para colar no
ETP ou planilhar localmente. Retorna o CSV no campo `csv` da resposta.

Input parameters:

- `ano` (integer, required): Ano do PGC. Os PGCs do governo federal começam a aparecer a partir de 2020.
- `codigo_orgao`: Código do órgão (filtra os PGCs desse órgão).
- `codigo_uasg`: Código UASG (filtro mais específico que codigo_orgao).

### `compras_pncp_pca_listar` (~221 tokens)

Lista PCAs (Planos Anuais de Contratações) no PNCP.

Endpoint PNCP `/v1/pca/`. Diferente do PGC, o PCA da Lei 14.133 cobre
federais + estaduais + municipais. Filtra por categoria do item
(`codigo_classificacao_superior` é obrigatório no upstream).

Cache 1h.

Input parameters:

- `ano` (integer, required): Ano do PCA (Lei 14.133).
- `cnpj_orgao`: CNPJ do órgão (filtra PCAs desse órgão; 14 dígitos).
- `codigo_classificacao_superior` (integer, required): Código da classificação superior do item no catálogo. Obrigatório no endpoint PNCP. Para CATMAT use o código do grupo; para CATSER use o código da seção. Veja `compras_catmat_listar_grupos` ou `compr…
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.

### `compras_pncp_pca_atualizacao` (~127 tokens)

Lista PCAs atualizados num período (PNCP).

Endpoint PNCP `/v1/pca/atualizacao`. Útil para monitoramento: descobrir
quais órgãos revisaram seu PCA recentemente.

Cache 1h.

Input parameters:

- `data_final` (string, required): Data final do período (YYYY-MM-DD). Janela máxima ~30 dias.
- `data_inicial` (string, required): Data inicial do período de atualização (YYYY-MM-DD).
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.

### `compras_pncp_pca_por_usuario` (~140 tokens)

Lista PCAs vinculados a um usuário/sistema integrador específico.

Endpoint PNCP `/v1/pca/usuario`. Uso menos comum — geralmente o
analista prefere `compras_pncp_pca_listar` com `cnpj_orgao`.

Cache 1h.

Input parameters:

- `ano` (integer, required): Ano do PCA.
- `id_usuario` (integer, required): ID interno de usuário/sistema integrador do PNCP. Obtido na documentação interna do órgão; raramente usado por analistas.
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.

### `compras_pncp_pca_por_classificacao_superior` (~141 tokens)

Lista itens de PCA filtrados por categoria superior do item.

Endpoint PNCP `/v1/pca/` com `codigoClassificacaoSuperior`. Permite
agregar planejamentos por categoria (ex.: todos os itens de TI
planejados para o ano).

Cache 1h.

Input parameters:

- `ano` (integer, required): Ano do PCA.
- `codigo_classificacao_superior` (integer, required): Código de classificação superior do item (categoria pai). Veja a tabela de classificação no manual do PNCP.
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.

### `compras_pncp_contratacoes_publicacao` (~380 tokens)

Lista contratações publicadas no PNCP no período.

Endpoint `/v1/contratacoes/publicacao`. Cobre todos os entes da
federação. Modalidades comuns: 6=Pregão Eletrônico, 8=Dispensa,
9=Inexigibilidade, 4=Concorrência Eletrônica.

O filtro `esfera` (federal/estadual/municipal/distrital) é aplicado
client-side sobre a página retornada. Janela máxima por consulta: ~30
dias. Cache 15 min.

Input parameters:

- `cnpj_orgao`: CNPJ do órgão (14 dígitos).
- `codigo_modalidade` (integer, required): Código da modalidade (obrigatório no PNCP). Códigos comuns: 1=Leilão Eletrônico, 4=Concorrência Eletrônica, 6=Pregão Eletrônico, 8=Dispensa, 9=Inexigibilidade, 13=Concurso.
- `codigo_municipio_ibge`: Código IBGE do município (7 dígitos).
- `data_final` (string, required): Data final de publicação (YYYY-MM-DD).
- `data_inicial` (string, required): Data inicial de publicação (YYYY-MM-DD).
- `esfera`: Filtro opcional de esfera federativa (`federal`, `estadual`, `municipal` ou `distrital`). Aplicado client-side sobre a página retornada — útil para recortar a lista, mas note que `_total_registros` c…
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página (PNCP mínimo 10).
- `uf`: Sigla da UF.

### `compras_pncp_contratacoes_proposta` (~217 tokens)

Lista contratações com prazo de proposta aberto no PNCP.

Endpoint `/v1/contratacoes/proposta`. Útil para mapear oportunidades
abertas para fornecedores ou para identificar contratações em curso
em órgãos similares. Filtro `esfera` opcional client-side.

Cache 15 min.

Input parameters:

- `codigo_modalidade` (integer, required): Código da modalidade (ver PNCPListarContratacoesInput).
- `data_final` (string, required): Data limite para propostas (YYYY-MM-DD).
- `esfera`: Filtro opcional de esfera federativa (`federal`, `estadual`, `municipal` ou `distrital`). Aplicado client-side sobre a página retornada — útil para recortar a lista, mas note que `_total_registros` c…
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página.
- `uf`: Sigla da UF.

### `compras_pncp_contratacoes_atualizacao` (~282 tokens)

Lista contratações alteradas no período (PNCP).

Endpoint `/v1/contratacoes/atualizacao`. Útil para monitoramento:
descobrir editais que sofreram retificações/republicações. Aceita
filtro `esfera` client-side.

Cache 15 min.

Input parameters:

- `codigo_modalidade` (integer, required): Código da modalidade (obrigatório no PNCP). Códigos comuns: 1=Leilão Eletrônico, 4=Concorrência Eletrônica, 6=Pregão Eletrônico, 8=Dispensa, 9=Inexigibilidade, 13=Concurso.
- `data_final` (string, required): Data final de atualização (YYYY-MM-DD).
- `data_inicial` (string, required): Data inicial de atualização (YYYY-MM-DD).
- `esfera`: Filtro opcional de esfera federativa (`federal`, `estadual`, `municipal` ou `distrital`). Aplicado client-side sobre a página retornada — útil para recortar a lista, mas note que `_total_registros` c…
- `pagina` (integer): Página (1-based).
- `tamanho_pagina` (integer): Registros por página (PNCP mínimo 10).

### `compras_pncp_contratacao_por_orgao` (~120 tokens)

Consulta uma contratação específica pelo CNPJ + ano + sequencial.

Endpoint `/v1/orgaos/{cnpj}/compras/{ano}/{sequencial}`. Devolve
cabeçalho completo da contratação.

Cache 15 min.

Input parameters:

- `ano` (integer, required): Ano da contratação (4 dígitos).
- `cnpj` (string, required): CNPJ do órgão (14 dígitos, com ou sem pontuação).
- `sequencial` (integer, required): Sequencial da contratação dentro do órgão e ano.

### `compras_pncp_contratacao_itens` (~129 tokens)

Lista itens de uma contratação no PNCP.

Endpoint `/v1/orgaos/{cnpj}/compras/{ano}/{sequencial}/itens`.
Cache 15 min.

Input parameters:

- `ano` (integer, required): Ano da contratação.
- `cnpj` (string, required): CNPJ do órgão.
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `sequencial` (integer, required): Sequencial da contratação.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_pncp_contratacao_item_resultados` (~111 tokens)

Lista resultados (vencedores) de um item específico de contratação no PNCP.

Endpoint `/v1/orgaos/{cnpj}/compras/{ano}/{sequencial}/itens/{n}/resultados`.
Cache 15 min.

Input parameters:

- `ano` (integer, required): Ano da contratação.
- `cnpj` (string, required): CNPJ do órgão.
- `numero_item` (integer, required): Número do item dentro da contratação.
- `sequencial` (integer, required): Sequencial.

### `compras_pncp_contratos_listar` (~131 tokens)

Lista contratos publicados no PNCP no período.

Endpoint `/v1/contratos`. Cache 15 min.

Input parameters:

- `cnpj_orgao`: CNPJ do órgão (14 dígitos).
- `data_final` (string, required): Data final (YYYY-MM-DD).
- `data_inicial` (string, required): Data inicial de publicação do contrato (YYYY-MM-DD).
- `pagina` (integer): Página de resultados (1-based). Padrão 1.
- `tamanho_pagina` (integer): Quantidade de registros por página. Padrão 50, máximo 500.

### `compras_pncp_contrato_por_orgao` (~82 tokens)

Consulta um contrato específico no PNCP.

Endpoint `/v1/orgaos/{cnpj}/contratos/{ano}/{sequencial}`. Cache 15 min.

Input parameters:

- `ano` (integer, required): Ano do contrato.
- `cnpj` (string, required): CNPJ do órgão.
- `sequencial` (integer, required): Sequencial do contrato.

### `compras_pncp_modalidades` (~169 tokens)

Cheat sheet local: códigos de modalidade de contratação do PNCP.

Tool local (não chama upstream). Fonte: tabela oficial PNCP (Lei 14.133).

\**ATENÇÃO — duas tabelas em circulação no ecossistema Compras**:
\- `codigo` aqui (PNCP) é o usado em TODAS as tools `compras_pncp_*` e
  em `modalidadeIdPncp` no payload de retorno.
\- O Dados Abertos / SIASG usa uma enumeração diferente em
  \`compras_contratacoes_14133_listar(codigo_modalidade_dados_abertos)`:
  campo `equivalente_dados_abertos` abaixo, ou None se a modalidade
  não estiver disponível naquele endpoint.

### `compras_pncp_contratacao_arquivos` (~273 tokens)

Lista os ARQUIVOS anexos de uma contratação no PNCP (Edital, TR, ETP...).

Endpoint `/v1/orgaos/{cnpj}/compras/{ano}/{sequencial}/arquivos` da API
pública de arquivos do PNCP (host `/api/pncp`, sem chave — diferente de
\`/api/consulta`, que exige `chave-api-dadosabertos` e não expõe anexos).

Cada item traz `url` (download direto do PDF/ZIP), `sequencialDocumento`,
\`titulo`, `tipoDocumentoNome` (Edital, Termo de Referência, Projeto
Básico, Estudo Técnico Preliminar...). Atenção: o arquivo do Edital vem
frequentemente como ZIP (por vezes ZIP dentro de ZIP) contendo o TR.
Baixe com GET simples na `url` — não é necessário navegador.

Cache 15 min.

Input parameters:

- `ano` (integer, required): Ano da contratação (4 dígitos).
- `cnpj` (string, required): CNPJ do órgão (14 dígitos, com ou sem pontuação).
- `sequencial` (integer, required): Sequencial da contratação, SEM zeros à esquerda (ex.: 2101, não 002101).

### `compras_pncp_ata_arquivos` (~256 tokens)

Lista os ARQUIVOS de uma Ata de Registro de Preços no PNCP (ata + aditivos).

Endpoint `/v1/orgaos/{cnpj}/compras/{anoCompra}/{sequencialCompra}/atas/{sequencialAta}/arquivos`
da API pública de arquivos do PNCP (`/api/pncp`, sem chave).

Aditivos de reequilíbrio/prorrogação aparecem como documentos adicionais
do tipo `Ata de Registro de Preços` — diferencie por `titulo` e
\`dataPublicacaoPncp`. Download: GET simples na `url` de cada item.

Cache 15 min.

Input parameters:

- `ano_compra` (integer, required): Ano da COMPRA que originou a ata.
- `cnpj` (string, required): CNPJ do órgão (14 dígitos, com ou sem pontuação).
- `sequencial_ata` (integer, required): Sequencial da ATA dentro da compra (1-based). É o sufixo numérico de `numeroControlePncpAta` (ex.: `...-000004/2024` → 4).
- `sequencial_compra` (integer, required): Sequencial da compra, SEM zeros à esquerda.

### `compras_sancao_ceis` (~147 tokens)

Consulta CEIS — Cadastro de Empresas Inidôneas e Suspensas.

Endpoint `/api-de-dados/ceis`. Empresas com sanção ativa não podem
contratar com a administração pública. Use **sempre** antes de
homologar pregões e contratos.

Cache 1h.

Input parameters:

- `cnpj`: CNPJ do fornecedor (14 dígitos, com ou sem pontuação).
- `nome`: Nome (razão social/fantasia) do sancionado para busca textual.
- `orgao_sancionador`: Sigla do órgão sancionador (ex.: 'TCU').
- `pagina` (integer): Página (1-based).

### `compras_sancao_cnep` (~117 tokens)

Consulta CNEP — Cadastro Nacional de Empresas Punidas (Lei Anticorrupção).

Endpoint `/api-de-dados/cnep`. Empresas punidas pela Lei 12.846/2013
(Lei Anticorrupção). Indicador de risco de integridade.

Cache 1h.

Input parameters:

- `cnpj`: CNPJ do fornecedor (14 dígitos, com ou sem pontuação).
- `nome`: Nome do sancionado.
- `pagina` (integer): Página (1-based).

### `compras_sancao_ceaf` (~123 tokens)

Consulta CEAF — Cadastro de Expulsões da Administração Federal.

Endpoint `/api-de-dados/ceaf`. Servidores expulsos do serviço público
federal. Útil quando se identifica responsável/preposto suspeito.

CPFs mascarados por LGPD (`123.***.***-45`). Cache 1h.

Input parameters:

- `cpf`: CPF do servidor (11 dígitos, com ou sem pontuação).
- `nome`: Nome do servidor expulso (busca textual).
- `pagina` (integer): Página (1-based).

### `compras_sancao_cepim` (~104 tokens)

Consulta CEPIM — Entidades Privadas Sem Fins Lucrativos Impedidas.

Endpoint `/api-de-dados/cepim`. Aplicável a contratações via convênios
e termos de fomento com OSCs.

Cache 1h.

Input parameters:

- `cnpj`: CNPJ da entidade (14 dígitos).
- `nome`: Nome da entidade (busca textual).
- `pagina` (integer): Página (1-based).

### `compras_sancao_acordos_leniencia` (~103 tokens)

Lista acordos de leniência firmados com a CGU.

Endpoint `/api-de-dados/acordos-leniencia`. Empresas com acordo ativo
estão sob compromisso de compliance reforçado — informação útil para
análise de risco em contratações de alto valor.

Cache 1h.

Input parameters:

- `cnpj`: CNPJ do sancionado (14 dígitos).
- `pagina` (integer): Página (1-based).

### `compras_versao` (~82 tokens)

Healthcheck/diagnóstico do MCP. Retorna versão, fontes upstream e
estado de configurações sensíveis (sem expor valores).

Útil para confirmar que o servidor está respondendo, qual a versão
instalada, quais APIs estão acessíveis e se a chave da Transparência
foi configurada (necessária para tools de sanções).

### `compras_healthcheck` (~581 tokens)

Diz, em ~30 segundos, o que está de pé neste servidor **agora**.

Estende `compras_versao`: além de versão e configuração, dispara um
probe paralelo (timeout curto) contra as rotas upstream reais e
devolve a situação por módulo funcional.

Por que existe: em 04/08/2026 a tool de pesquisa de preço de material
estava quebrada havia semanas e ninguém sabia — a SEGES trocou a
assinatura da rota sem versionar. A descoberta veio de um analista
tentando usar a ferramenta. Antes de uma demonstração ou de instruir
processo, rode isto: o objetivo é que a descoberta aconteça aqui, não
no palco.

Args:
    profundidade: `basico` responde só versão/config (instantâneo);
        `rotas` (padrão) executa o probe upstream.
    modulo: restringe o probe a um módulo (ex.: `pesquisa_preco`,
        `atas`, `pncp`). Sem isso, testa todos.

Situação por módulo:
    - `ok`: todas as rotas responderam com os campos esperados.
    - `degradado`: alguma rota caiu, ou respondeu 200 **sem** os campos
      do contrato (ex.: rota de preço sem `precoUnitario`) — o modo de
      falha silencioso que só o contrato de campos pega.
    - `fora`: todas as rotas testáveis do módulo falharam.
    - `pulado`: faltou credencial (ex.: TRANSPARENCIA_API_KEY).

Rota que estoura o relógio é reexecutada em série antes de virar
\`fora`: com dezenas de rotas em paralelo, uma rota apenas lenta seria
reportada como quebrada. Quando passa na segunda tentativa, o campo
\`problemas` do módulo registra "lenta sob carga" em vez de escondê-lo.

O campo `pronto_para_uso` é o resumo honesto: `False` quando existe
qualquer módulo fora ou degradado.

Input parameters:

- `modulo`: Restringe o probe a um módulo funcional: 'pesquisa_preco', 'catalogo', 'organizacoes', 'atas', 'contratacoes', 'contratos', 'fornecedores', 'indicadores', 'legado', 'planejamento', 'pncp', 'sancoes',…
- `profundidade` (string): 'rotas' (padrão) testa as rotas upstream reais em paralelo e devolve situação por módulo (ok/degradado/fora) em ~30s. 'basico' devolve só versão e configuração, sem tocar a rede.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/opedrosoares-mcp-compras/mcp-compras#diagnostics

## Score history

- 2026-11-05: 23
- 2026-11-04: 23
- 2026-11-03: 23
- 2026-11-02: 86
- 2026-11-01: 86
- 2026-10-31: 86
- 2026-10-30: 86
- 2026-10-29: 86
- 2026-10-28: 86
- 2026-10-27: 86
- 2026-10-26: 86
- 2026-10-25: 86
- 2026-10-24: 86
- 2026-10-23: 86
- 2026-10-22: 86
- 2026-10-21: 86
- 2026-10-20: 86
- 2026-10-19: 86
- 2026-10-18: 86
- 2026-10-17: 86
- 2026-10-16: 86
- 2026-10-15: 86
- 2026-10-14: 86
- 2026-10-13: 86
- 2026-10-12: 86
- 2026-10-10: 86
- 2026-10-04: 84
- 2026-10-03: 84
- 2026-10-02: 83
- 2026-10-01: 83

## Common questions

### What is the MCP Compras.gov.br server?

MCP Compras.gov.br is listed in the public MCP registry as io.github.opedrosoares/mcp-compras. Preços, atas, contratos e sanções das APIs públicas de compras do governo brasileiro. This page covers its hosted endpoint (https://mcp-compras.up.railway.app/mcp).

### Is the MCP Compras.gov.br server safe to use?

MCP Compras.gov.br scores 23 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the MCP Compras.gov.br server expose?

MCP Compras.gov.br exposes 100 tools: compras_aggregate_contratacoes_por_periodo, compras_comparar_periodos_contratacoes, compras_arp_listar, compras_arp_consultar, compras_arp_por_fim_vigencia, and 95 more. Their descriptions and schemas cost roughly 23,943 tokens of context every time the server is loaded.

### Does the MCP Compras.gov.br server require authentication?

Its publisher declares no required credentials for MCP Compras.gov.br. We have not been able to confirm that against the live endpoint, and a server can require authorisation without declaring it here.

### Is the MCP Compras.gov.br server still maintained?

MCP Compras.gov.br is still listed in the MCP registry, though our most recent checks did not reach this channel. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What did VerifyMCP test on the MCP Compras.gov.br server?

VerifyMCP ran 3 checks on MCP Compras.gov.br, covering HTTPS, DNSSEC and Transport. 8 items could not be completed, a gap on our side rather than a finding about MCP Compras.gov.br: TLS certificate, Authorization, HSTS header, Schema quality and 4 more. 5 categories score 0 for that reason, because we only credit what we can confirm. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- Remote endpoint: https://mcp-compras.up.railway.app/mcp
- Changelog RSS feed: https://verifymcp.io/servers/opedrosoares-mcp-compras/mcp-compras.xml
- Changelog JSON feed: https://verifymcp.io/servers/opedrosoares-mcp-compras/mcp-compras/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/opedrosoares-mcp-compras/mcp-compras.json
- HTML version of this page: https://verifymcp.io/servers/opedrosoares-mcp-compras/mcp-compras
