Skip to main content
Glama

flaviometro-mcp

Servidor MCP (Model Context Protocol) local para consultar, direto do seu assistente de IA, os dados públicos do Flaviômetro, o site que acompanha ao vivo quais deputados, senadores, governadores e prefeitos do PL e aliados falam do Flávio Bolsonaro nas redes sociais.

Com ele você pergunta em português ao Claude (ou a outro cliente MCP) coisas como "quais senadores eleitos ainda não citaram o Flávio?" e recebe a resposta calculada em cima dos dados mais recentes do site.

WARNING

Projeto não oficial. Este repositório não tem nenhuma ligação com o Flaviômetro, seus autores, o PL, o Flávio Bolsonaro ou qualquer campanha. Ele não é mantido, endossado nem revisado pelo site.

Este projeto também não tem ligação com o TSE nem com o OpenCNPJ, usados pela ferramenta contato_campanha.

O Flaviômetro não oferece uma API pública. Este servidor lê o mesmo arquivo JSON que o navegador baixa ao abrir o site. Se o site mudar o formato, o servidor pode parar de funcionar sem aviso. Os números e classificações são do Flaviômetro; este projeto só os organiza.


Sumário


Related MCP server: mcp-brasil

O que dá para fazer

  • Ver o panorama geral: quantos políticos monitorados pediram voto, quantos só citaram, quantos postaram sem citar e quantos não postaram nada.

  • Filtrar políticos por nome, estado, cargo, partido, situação eleitoral e município.

  • Descobrir quem ficou em silêncio (postou no período, mas não falou do Flávio).

  • Abrir a ficha de um político: redes monitoradas, números por rede e os posts mais recentes em que citou o Flávio.

  • Listar e buscar posts por rede, período, texto da legenda ou trecho falado em vídeo.

  • Montar rankings por posts, pedidos de voto, visualizações ou interações.

  • Agregar os números por estado, partido, cargo, rede social ou dia.

  • Obter o contato da campanha de um candidato de 2026: o CNPJ de campanha (TSE) e o e-mail, telefone e endereço registrados na Receita Federal (via OpenCNPJ).

Ferramentas disponíveis

Ferramenta

Para que serve

Principais parâmetros

resumo_geral

Panorama do período, geral e por cargo

desde, ate

buscar_politicos

Lista políticos com filtros e status em relação ao Flávio

nome, uf, cargo, partido, situacao, municipio, status, ordenar_por, limite

detalhes_politico

Ficha completa de um político e seus posts recentes

politico (nome ou código sq), posts, incluir_posts_sem_citacao

listar_posts

Posts captados, com filtros e ordenação

filtros de político, rede, nivel_minimo, somente_fala_em_video, texto, desde, ate, ordenar_por, limite

ranking

Quem mais citou o Flávio segundo uma métrica

metrica, filtros de político, desde, ate, limite

estatisticas_agrupadas

Números agregados por grupo

agrupar_por (uf, partido, cargo, situacao, rede, dia)

contato_campanha

CNPJ de campanha (TSE) e e-mail/endereço registrados na Receita (OpenCNPJ)

politico (nome ou código sq)

legenda

Explica os códigos e a metodologia

—

atualizar_dados

Força novo download, ignorando o cache

—

Datas aceitam AAAA-MM-DD (interpretadas no horário de Brasília) ou ISO 8601 completo.

Requisitos

  • Node.js 20.18.1 ou mais recente (testado no 22)

  • Um cliente compatível com MCP: Claude Desktop, Claude Code, OpenCode, Cursor, VS Code, etc.

Instalação

git clone <url-deste-repositorio> flaviometro-mcp
cd flaviometro-mcp
npm install
npm run build

Isso gera o servidor em dist/index.js. Anote o caminho absoluto desse arquivo, ele vai na configuração do cliente. Para descobrir:

echo "$(pwd)/dist/index.js"

Configurando no seu cliente MCP

O servidor usa transporte stdio: o cliente inicia o processo e conversa com ele pela entrada e saída padrão. Não há porta nem servidor web.

Claude Code

claude mcp add flaviometro -- node /caminho/absoluto/flaviometro-mcp/dist/index.js

Confira com claude mcp list, ou digite /mcp dentro de uma sessão.

Em todos os exemplos abaixo, troque /caminho/absoluto/flaviometro-mcp/dist/index.js pelo caminho que você anotou na instalação. Caminhos relativos e ~ não funcionam.

Claude Desktop

  1. Abra o Claude Desktop e vá em Configurações → Desenvolvedor → Editar configuração. Isso abre (ou cria) o arquivo:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

  2. Adicione o servidor dentro de mcpServers. Se o arquivo já tiver outros servidores, inclua só a entrada flaviometro:

    {
      "mcpServers": {
        "flaviometro": {
          "command": "node",
          "args": ["/caminho/absoluto/flaviometro-mcp/dist/index.js"]
        }
      }
    }

    No Windows, escape as barras: "C:\\Users\\voce\\flaviometro-mcp\\dist\\index.js".

  3. Feche o Claude Desktop por completo (no macOS, Cmd+Q; só fechar a janela não basta) e abra de novo.

  4. Na caixa de mensagem, clique no ícone de ferramentas/conectores: o flaviometro deve aparecer com as 9 ferramentas. Na primeira vez que uma for usada, o Claude pede sua permissão.

Não apareceu? Em Configurações → Desenvolvedor o servidor aparece com o status e um botão para ver os logs. O erro mais comum é node não ser encontrado: nesse caso, use o caminho completo do Node em command (descubra com which node no macOS/Linux ou where node no Windows).

OpenCode

O OpenCode lê os servidores MCP da chave mcp do arquivo de configuração. Escolha onde colocar:

  • Global (vale para todos os projetos): ~/.config/opencode/opencode.json

  • Só em um projeto: opencode.json na raiz do projeto

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "flaviometro": {
      "type": "local",
      "command": ["node", "/caminho/absoluto/flaviometro-mcp/dist/index.js"],
      "enabled": true
    }
  }
}

Repare que, diferente dos outros clientes, no OpenCode o command é uma lista com o executável e os argumentos juntos. Variáveis de ambiente vão na chave environment:

"flaviometro": {
  "type": "local",
  "command": ["node", "/caminho/absoluto/flaviometro-mcp/dist/index.js"],
  "enabled": true,
  "environment": { "FLAVIOMETRO_CACHE_TTL_SEGUNDOS": "600" }
}

Se o arquivo já existir, junte a chave mcp com o que já estiver lá. Depois, reinicie o OpenCode e confira com:

opencode mcp list

O primeiro carregamento baixa alguns megabytes do site. Se o OpenCode reclamar de tempo esgotado ao listar as ferramentas, adicione "timeout": 20000 na entrada do servidor.

Cursor

O Cursor lê os servidores de um arquivo mcp.json:

  • Global (vale para todos os projetos): ~/.cursor/mcp.json

  • Só em um projeto: .cursor/mcp.json na raiz do projeto

{
  "mcpServers": {
    "flaviometro": {
      "type": "stdio",
      "command": "node",
      "args": ["/caminho/absoluto/flaviometro-mcp/dist/index.js"]
    }
  }
}

Variáveis de ambiente vão na chave env, como no Claude Desktop.

Depois de salvar:

  1. Abra as configurações do Cursor na área de MCP e confira se o flaviometro aparece com a chave ligada. Servidores desligados não carregam nem aparecem no chat.

  2. No chat em modo Agent, faça uma pergunta como "me dá um resumo do Flaviômetro". O Cursor pede confirmação antes de rodar cada ferramenta.

Deu erro? Abra o painel Output (Cmd+Shift+U no macOS, Ctrl+Shift+U no Windows/Linux) e escolha MCP Logs na lista. Ali aparecem a inicialização do servidor, as chamadas e os erros.

Outros clientes

Qualquer cliente que aceite servidores MCP via stdio funciona com o mesmo par command + args. No VS Code, por exemplo, o arquivo é .vscode/mcp.json e a chave é servers no lugar de mcpServers.

Testando sem cliente

O MCP Inspector abre uma interface web para chamar as ferramentas na mão:

npm run inspector

Exemplos de perguntas

Depois de configurado, é só conversar normalmente:

  • "Me dá um resumo do Flaviômetro de hoje."

  • "Quais senadores eleitos em 2026 postaram nos últimos dias mas não citaram o Flávio?"

  • "Ranking dos 10 deputados federais de SP que mais pediram voto para o Flávio."

  • "Como está o deputado Fulano de Tal? Mostra os últimos posts dele citando o Flávio."

  • "Compara os partidos: qual tem a maior proporção de políticos que já citaram o Flávio?"

  • "Quais vídeos mencionam o Flávio só na fala, e não na legenda? Traz os trechos."

  • "Quantos posts pedindo voto saíram por dia desde 08/10?"

  • "Quais prefeitos do Rio de Janeiro já pediram voto?"

  • "Qual é o e-mail da campanha do candidato Fulano de Tal?"

Variáveis de ambiente

Todas são opcionais.

Variável

Padrão

Descrição

FLAVIOMETRO_CACHE_TTL_SEGUNDOS

300

Por quanto tempo os dados ficam em cache na memória antes de novo download

FLAVIOMETRO_BASE_URL

https://flaviometro.com

Endereço base do site (útil para testes ou espelhos)

FLAVIOMETRO_VERSAO

—

Valor de ?v= usado no feed caso não seja possível lê-lo da página

FLAVIOMETRO_TSE_CACHE_HORAS

6

Por quanto tempo as bases do TSE e as consultas ao OpenCNPJ ficam em cache

FLAVIOMETRO_OPENCNPJ_URL

https://api.opencnpj.org

Endereço da API do OpenCNPJ

FLAVIOMETRO_PROXY

—

Proxy usado para acessar o site (veja Usando um proxy)

HTTPS_PROXY / HTTP_PROXY / NO_PROXY

—

Variáveis de proxy padrão do sistema, usadas se FLAVIOMETRO_PROXY não estiver definida

Exemplo no Claude Desktop:

{
  "mcpServers": {
    "flaviometro": {
      "command": "node",
      "args": ["/caminho/absoluto/flaviometro-mcp/dist/index.js"],
      "env": { "FLAVIOMETRO_CACHE_TTL_SEGUNDOS": "600" }
    }
  }
}

Usando um proxy

O proxy vale para todas as conexões do servidor: Flaviômetro, TSE e OpenCNPJ.

Se você está atrás de um proxy corporativo, quer sair por outro IP ou passar o tráfego por um túnel SSH, o servidor pode acessar o Flaviômetro por um proxy HTTP, HTTPS ou SOCKS5.

Ordem de prioridade

  1. FLAVIOMETRO_PROXY: se estiver definida, vale ela e só ela.

  2. HTTPS_PROXY / HTTP_PROXY (maiúsculas ou minúsculas): as variáveis padrão do sistema, respeitando NO_PROXY.

  3. Nenhuma das duas: conexão direta.

Para ignorar o proxy do sistema só neste servidor, use FLAVIOMETRO_PROXY=desligado.

Formatos aceitos

Tipo

Exemplo

HTTP

http://proxy.empresa.com.br:3128

HTTP com usuário e senha

http://usuario:senha@proxy.empresa.com.br:3128

HTTPS (conexão TLS até o proxy)

https://proxy.empresa.com.br:443

SOCKS5

socks5://127.0.0.1:1080

SOCKS5 com usuário e senha

socks5://usuario:senha@127.0.0.1:1080

Desativar

desligado

Caracteres especiais no usuário ou na senha (@, :, /, #...) precisam estar codificados em URL. Por exemplo, p@ss vira p%40ss.

Exemplos de configuração

Claude Desktop / Cursor (chave env):

{
  "mcpServers": {
    "flaviometro": {
      "command": "node",
      "args": ["/caminho/absoluto/flaviometro-mcp/dist/index.js"],
      "env": { "FLAVIOMETRO_PROXY": "http://usuario:senha@proxy.empresa.com.br:3128" }
    }
  }
}

OpenCode (chave environment):

"flaviometro": {
  "type": "local",
  "command": ["node", "/caminho/absoluto/flaviometro-mcp/dist/index.js"],
  "enabled": true,
  "environment": { "FLAVIOMETRO_PROXY": "socks5://127.0.0.1:1080" }
}

Claude Code:

claude mcp add flaviometro -e FLAVIOMETRO_PROXY=http://proxy.empresa.com.br:3128 \
  -- node /caminho/absoluto/flaviometro-mcp/dist/index.js

Túnel SSH como proxy SOCKS5: abra o túnel num terminal e aponte o servidor para ele.

ssh -D 1080 -N usuario@seu-servidor.com
# e use FLAVIOMETRO_PROXY=socks5://127.0.0.1:1080

Conferindo se o proxy está em uso

  • A ferramenta atualizar_dados mostra no campo proxy qual configuração está ativa. Usuário e senha aparecem mascarados (http://***@host:3128).

  • A mesma informação sai no log de inicialização do servidor (stderr), visível nos logs do seu cliente MCP.

  • Se o proxy estiver fora do ar ou mal configurado, as ferramentas respondem com o erro detalhado (por exemplo, Não consegui acessar https://flaviometro.com/ via proxy HTTP http://127.0.0.1:3128: connect ECONNREFUSED) em vez de travar.

O suporte a SOCKS5 vem do undici e ainda é marcado como experimental por lá. Por isso aparece um ExperimentalWarning no log. É só um aviso e não afeta o funcionamento. Proxies com autenticação NTLM/Kerberos não são suportados diretamente; nesses casos, use um intermediário local como o Px ou o CNTLM.

De onde vêm os dados

O servidor faz duas requisições, as mesmas que o navegador faz ao abrir o site:

  1. https://flaviometro.com/: a página inicial traz embutido o cadastro dos políticos monitorados (window.ELEITOS: nome, cargo, UF, partido, número, votos, redes) e a versão atual do site (window.VERSAO).

  2. https://flaviometro.com/dados/feed.json?v=<versão>: um JSON de alguns megabytes com todos os posts monitorados no período, já classificados pelo site.

O cadastro é lido como dado: o servidor recorta o objeto do HTML e o converte para JSON, sem executar nenhum JavaScript da página.

Os dados ficam em memória pelo tempo do cache (5 minutos por padrão). Chamadas seguidas não geram novos downloads. Se um download falhar e já houver dados em cache, o servidor responde com o cache anterior.

┌──────────────┐  stdio  ┌──────────────────┐  HTTPS  ┌──────────────────────┐
│ Cliente MCP  │ ──────▶ │  flaviometro-mcp │ ──────▶ │ flaviometro.com      │
│ (Claude etc.)│ ◀────── │  cache + análise │ ◀────── │  /  e  /dados/feed   │
└──────────────┘         └──────────────────┘         └──────────────────────┘

Contato da campanha (TSE + OpenCNPJ)

A ferramenta contato_campanha cruza três fontes públicas para chegar ao contato oficial da campanha de um candidato:

Flaviômetro            TSE (dados abertos)                    OpenCNPJ (Receita Federal)
sq do candidato ──▶ cadastro de candidatos 2026 ──▶ CNPJ ──▶ e-mail, telefone, endereço
                    + CNPJs de campanha 2026
  1. Cadastro de candidatos 2026 (consulta_cand_2026.zip, no Portal de Dados Abertos do TSE): pelo sq, o servidor encontra o nome completo, o cargo, a coligação e o resultado.

  2. CNPJs de campanha 2026 (CNPJ_campanha_2026.zip, no dataset de prestação de contas): todo candidato recebe um CNPJ de campanha com a razão social ELEICAO 2026 <NOME COMPLETO> <CARGO>. Como esse arquivo não traz o sq, o vínculo é feito pelo nome completo + cargo.

  3. OpenCNPJ: com o CNPJ, a API pública e gratuita do OpenCNPJ devolve o cadastro na Receita Federal, com o e-mail que a campanha informou.

Exemplo de resposta (resumida, com dados fictícios):

{
  "candidato": {
    "nome_completo": "FULANO DE TAL DA SILVA",
    "cargo": "DEPUTADO FEDERAL",
    "uf": "SP",
    "resultado": "ELEITO",
    "link_divulgacandcontas": "https://divulgacandcontas.tse.jus.br/divulga/#/candidato/SUDESTE/SP/20322002026/250000000000/2026/SP"
  },
  "campanha": {
    "cnpj": "00.000.000/0001-00",
    "vinculo": "exata",
    "situacao_cadastral": "Ativa",
    "email": "contato@exemplo.com.br",
    "endereco": "RUA EXEMPLO, 100, CENTRO, SAO PAULO/SP, CEP 01000-000"
  }
}

Como o vínculo é feito. O campo vinculo diz quão confiável é o casamento entre candidato e CNPJ:

  • exata: nome completo e cargo idênticos nos dois arquivos do TSE (é o caso de 988 dos 1.000 candidatos de 2026 monitorados pelo Flaviômetro).

  • aproximada (nome parecido, mesma UF): os dois arquivos do TSE grafam o nome de jeitos diferentes ("THYAGO" e "TYAGO", "SILVA COSTA" e "SILVA DA COSTA"). O servidor procura nomes parecidos no mesmo cargo e só aceita se a UF do CNPJ na Receita bater com a do candidato. A resposta mostra a razão social encontrada para você conferir.

O que não é coberto:

  • Prefeitos e senadores em mandato: não disputaram 2026, então não têm CNPJ de campanha nas bases de 2026.

  • Dados pessoais: o cadastro do TSE também traz CPF, título de eleitor e data de nascimento. O servidor descarta esses campos na leitura; eles nunca chegam ao modelo.

  • Página do DivulgaCandContas: o link é montado para você abrir no navegador, mas o servidor não lê essa página. O TSE bloqueia acesso automatizado a ela (HTTP 403), por isso o servidor usa os arquivos de dados abertos. O código de eleição do link (20322002026) é o do 1º turno; para candidatos do 2º turno a página pode ser outra.

NOTE

O e-mail e o telefone são os que a campanhainformou à Receita Federal ao registrar o CNPJ. Muitas vezes são do contador, do escritório de advocacia ou da equipe, não do candidato. Telefones vêm vazios com frequência.

Na primeira chamada, o servidor baixa cerca de 6 MB do TSE, o que leva alguns segundos. Depois disso, as bases ficam em cache por 6 horas (configurável).

Glossário dos códigos

Nível de citação de cada post (campo flavio no feed):

Valor

Significado

0

Não citou o Flávio

1

Citou o Flávio pelo nome, @, hashtag ou o 22 como voto

2

Pediu voto no Flávio ("vote 22", "dia 25 é Flávio"...)

Vídeos também contam pelo que é falado. Nesses casos o post vem marcado como citado_na_fala_do_video e traz o trecho_transcrito.

Cargos: gov governador(a) · sen senador(a) · fed deputado(a) federal · est deputado(a) estadual · pref prefeito(a)

Situação: eleito eleito(a) em 2026 · 2t disputa o 2º turno · mandato em mandato (não disputou em 2026)

Redes: ig Instagram · fb Facebook · x X/Twitter · th Threads · yt YouTube · tt TikTok · kw Kwai · tg Telegram

sq: código sequencial do candidato no TSE, usado como identificador único de cada político.

Limitações conhecidas

  • Depende da estrutura do site. Se o Flaviômetro mudar o HTML ou o formato do feed, o servidor quebra até ser ajustado.

  • A classificação é do site. Se um post foi classificado errado lá, ele aparece errado aqui. Este projeto não reclassifica nada.

  • Janela limitada. O feed só cobre um período recente (informado em feed_cobre_desde no resumo_geral), não o histórico completo.

  • Posts sem citação vêm resumidos. Para posts de nível 0, o feed só informa que existiram (data e rede), sem texto, link ou métricas.

  • Métricas incompletas. Visualizações, curtidas e compartilhamentos dependem do que cada rede expõe e podem vir null.

  • Números podem divergir do site. O site aplica filtros visuais próprios (e agrupa versões do mesmo conteúdo publicado em várias redes). Aqui cada post conta individualmente.

  • Vínculo com o CNPJ por nome. O arquivo de CNPJs do TSE não traz o código do candidato. Homônimos no mesmo cargo são desempatados pela UF, e vínculos aproximados vêm sinalizados.

  • Campo cobertura. O feed traz um par de datas por político cujo significado exato não é documentado. Ele aparece como cobertura_informada_pelo_feed e deve ser tratado como indicativo.

Desenvolvimento

npm run dev        # recompila a cada alteração
npm run build      # compila para dist/
npm run inspector  # abre o MCP Inspector apontando para dist/index.js

Estrutura:

src/
├── index.ts    # registro das ferramentas MCP e transporte stdio
├── fonte.ts    # download (com suporte a proxy), extração do cadastro e cache
├── analise.ts  # agregações, filtros, rótulos e formatação em pt-BR
└── tse.ts      # bases do TSE, vínculo candidato ↔ CNPJ e consulta ao OpenCNPJ

Logs vão para stderr, já que stdout é reservado ao protocolo MCP.

Uso responsável

  • O servidor é feito para uso pessoal e local. Ele baixa o feed no máximo uma vez a cada intervalo de cache e se identifica com um User-Agent próprio. Evite reduzir o cache a valores muito baixos.

  • O site marca suas páginas como noindex. Respeite a infraestrutura de quem mantém o Flaviômetro e não use este projeto para raspagem em massa nem para republicar os dados como se fossem seus.

  • Ao divulgar números obtidos por aqui, cite o Flaviômetro como fonte e deixe claro que a extração foi feita por uma ferramenta não oficial.

  • Os dados tratam de figuras públicas e posts públicos, mas use o bom senso: confira no post original antes de afirmar qualquer coisa sobre alguém.

  • Os contatos de campanha são dados públicos, mas continuam protegidos pela LGPD. Use para contato legítimo (imprensa, pesquisa, fiscalização) e não para envio em massa, spam ou montagem de listas. A ferramenta consulta um candidato por vez de propósito.

  • O OpenCNPJ é um projeto gratuito e sem fins lucrativos, feito para consultas pontuais. Não use este servidor para varrer CNPJs em lote.

Licença

MIT. Vale para o código deste repositório, não para os dados do Flaviômetro, do TSE ou do OpenCNPJ, que pertencem aos seus respectivos responsáveis.

Available Tools

9 tools
atualizar_dadosAtualizar dadosA

Força um novo download do feed do Flaviômetro, ignorando o cache local.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full behavioral burden. It does disclose the key trait — that it bypasses the local cache and forces a network download — which tells the agent results may differ from cached reads. It omits whether this mutates only local state or also hits the remote service, whether it can fail/rate-limit, and how long it may take.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the operative verb ('Força um novo download') front-loaded and the cache-bypass qualifier trailing it. Nothing is wasted and nothing needs reordering.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool this is close to sufficient, but there is no output schema and no annotations, so the description should say what happens after the refresh — whether it returns the fresh data, only an acknowledgement, or requires a follow-up call to resumo_geral/listar_posts. That omission leaves the agent guessing about next steps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema has no properties, so there is no parameter semantics to document. The baseline of 4 applies; the description correctly implies no inputs are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and target: force a fresh download of the Flaviômetro feed, bypassing the local cache. That is far more concrete than the generic name/title 'Atualizar dados', so the description does the differentiating work. It doesn't name a sibling, which keeps it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Using it implicitly means 'I want fresh data rather than cached data', and that condition is conveyed by 'ignorando o cache local'. However, there is no explicit when-to-use/when-not guidance, no mention of cost or latency that would deter an agent from calling it before every read, and no pointer to the sibling read tools that consume the refreshed feed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buscar_politicosBuscar políticosA

Lista políticos monitorados com filtros (nome, UF, cargo, partido, situação, município) e pelo comportamento em relação ao Flávio (pediu voto, citou, não citou, sem posts). Útil para perguntas como 'quais deputados federais do PL de SP não citaram o Flávio?'.

NameRequiredDescriptionDefault
ufNoSigla do estado, ex.: SP
ateNoFim do período (AAAA-MM-DD ou ISO 8601, horário de Brasília)
nomeNoParte do nome (sem diferenciar acentos/maiúsculas) ou o código sq exato
cargoNogov = governador(a), sen = senador(a), fed = deputado(a) federal, est = deputado(a) estadual, pref = prefeito(a)
desdeNoInício do período (AAAA-MM-DD ou ISO 8601, horário de Brasília)
limiteNo
statusNopediu_voto = pediu voto ao menos uma vez; citou = citou mas nunca pediu voto; nao_citou = postou no período sem citar; sem_posts = nenhum post captado
partidoNoSigla do partido, ex.: PL, NOVO, UNIÃO
situacaoNoeleito = eleito(a) em 2026, 2t = disputa o 2º turno, mandato = em mandato (não disputou em 2026)
municipioNoMunicípio (só se aplica a prefeitos)
ordenar_porNoCritério de ordenação (numéricos em ordem decrescente)nome

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. 'Lista' implies a read-only operation and the description explains the semantics of the behavior dimension, but it says nothing about result volume, pagination/limite behavior, or what an empty result means.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste: capability first, then a concrete example. The example earns its place by tying filters to a realistic query.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, all-optional filter tool with no output schema and no annotations, the description conveys what can be filtered and what the behavior codes mean at a high level. What remains uncovered (result shape, pagination beyond 'limite', behavior with zero matches) is minor but not fully absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 91%, so nearly every parameter's meaning is already documented in the schema. The description repeats the filter list (nome, UF, cargo, partido, situação, município) and the four behavior categories without adding syntax, defaults, or interaction rules beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lista políticos monitorados') and enumerates the filter dimensions, including the distinctive behavior filter relative to Flávio. The scope is unambiguous and clearly different from a detail or ranking tool, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The example question ('quais deputados federais do PL de SP não citaram o Flávio?') gives concrete usage context that maps directly onto the filters, so an agent knows when this tool fits. It stops short of stating exclusions or naming alternatives like detalhes_politico or ranking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

contato_campanhaContato da campanha (TSE + Receita)A

Busca o CNPJ de campanha de um candidato de 2026 nos dados abertos do TSE e consulta esse CNPJ no OpenCNPJ (base da Receita Federal) para obter o e-mail, telefone e endereço registrados pela campanha. Também traz coligação, resultado e o link da página do candidato no DivulgaCandContas. Funciona para quem disputou 2026 (governadores, senadores e deputados); não cobre prefeitos nem senadores em mandato. Consulta um político por vez.

NameRequiredDescriptionDefault
politicoYesNome (ou parte dele) ou código sq do candidato

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the load and does well: it discloses the two external data sources, the exact fields returned, the coverage boundary, and the one-at-a-time constraint. It omits failure behavior — what happens when the candidate is not found in TSE or the CNPJ is missing from OpenCNPJ (error vs. partial result) — which matters for a chained lookup.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main action is front-loaded in the first sentence, followed by the supplementary payload, scope limits, and cardinality constraint. Efficient overall, though the scope sentence ('não cobre prefeitos nem senadores em mandato') sits slightly at odds with the earlier mention of senadores and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, no-output-schema lookup, the description explains both sources and enumerates the returned fields, so an agent knows what it will get. The remaining gap is behavior on missing or ambiguous matches, which is the one thing an agent cannot infer here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already explains that 'politico' accepts a name, partial name, or sq code. The description only adds the constraint that only one politician can be queried per call; it adds nothing about matching behavior for partial names or ambiguity resolution.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete two-step operation: fetch the candidate's 2026 campaign CNPJ from TSE open data, then look that CNPJ up in OpenCNPJ (Receita Federal) for email, phone and address. It also names the extra payload (coligação, resultado, DivulgaCandContas link), which makes it clearly distinct from generic siblings like buscar_politicos or detalhes_politico.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit applicability and exclusions: works for 2026 governor/senator/deputy candidates, does not cover mayors or sitting senators, and handles one politician per call. It never names an alternative sibling (e.g. detalhes_politico) for the excluded cases, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detalhes_politicoDetalhes de um políticoB

Ficha completa de um político: cargo, partido, votos, redes monitoradas, janela de cobertura, estatísticas por rede e os posts mais recentes em que citou o Flávio.

NameRequiredDescriptionDefault
postsNoQuantos posts recentes citando o Flávio incluir
politicoYesNome (ou parte dele) ou código sq
incluir_posts_sem_citacaoNoInclui também posts que não citam o Flávio

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the burden here. It does meaningfully disclose the return payload (which stands in for the missing output schema), but it says nothing about read-only behavior, pagination, error handling for an unmatched 'politico', or the cost of setting a high posts value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with no filler, and the core concept ('Ficha completa de um político') is front-loaded. The trailing enumeration of fields is a dense list, but each item is informative rather than redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the field enumeration is the main thing that makes this callable, and it covers the payload well; the three input parameters are fully documented in the schema. The remaining gap is edge-case behavior (not found, ambiguous name), which the description leaves unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines all three parameters, including the posts default/max of 100 and incluir_posts_sem_citacao. The description only hints at the posts parameter via 'os posts mais recentes em que citou o Flávio' and adds nothing about name matching or the sq code.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

It clearly says this returns a complete profile ('ficha completa') of a politician and enumerates exactly what the profile contains: cargo, partido, votos, redes monitoradas, janela de cobertura, estatísticas por rede, posts recentes. That makes the purpose readable without the schema, but the description never contrasts it with siblings like buscar_politicos (search), listar_posts or estatisticas_agrupadas, which could partly overlap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool instead of buscar_politicos, listar_posts or estatisticas_agrupadas. An agent must infer that this is the 'one politician, all details' call, and nothing says what to do if the name is ambiguous or the politician is not found.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

estatisticas_agrupadasEstatísticas agrupadasB

Agrega os números por estado, partido, cargo, rede social ou dia: quantos políticos citaram/pediram voto e quantos posts citando o Flávio houve em cada grupo.

NameRequiredDescriptionDefault
ufNoSigla do estado, ex.: SP
ateNoFim do período (AAAA-MM-DD ou ISO 8601, horário de Brasília)
nomeNoParte do nome (sem diferenciar acentos/maiúsculas) ou o código sq exato
cargoNogov = governador(a), sen = senador(a), fed = deputado(a) federal, est = deputado(a) estadual, pref = prefeito(a)
desdeNoInício do período (AAAA-MM-DD ou ISO 8601, horário de Brasília)
partidoNoSigla do partido, ex.: PL, NOVO, UNIÃO
situacaoNoeleito = eleito(a) em 2026, 2t = disputa o 2º turno, mandato = em mandato (não disputou em 2026)
municipioNoMunicípio (só se aplica a prefeitos)
agrupar_porYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the aggregation semantics and the two metrics counted per group, but it does not explicitly state that the operation is read-only, nor does it describe permissions, side effects, or output structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is a single front-loaded sentence with no wasted words. It efficiently states the aggregation behavior and the metrics before listing grouping dimensions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter aggregation tool with no annotations and no output schema, the description is adequate but incomplete. It explains the core aggregation and metrics, but it lacks usage guidance versus siblings and does not describe the return shape beyond raw counts per group.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high at 89%, so the schema already documents most parameters. The description maps several grouping choices (state, party, office, social network, day), but it omits the situacao grouping option and does not explain the filter parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: it aggregates counts by group and names the metrics (politicians who cited/requested vote and posts citing Flávio). It is clear what the tool computes, but it does not explicitly distinguish itself from siblings such as ranking or resumo_geral.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives like ranking or resumo_geral. The grouping dimensions imply a grouped-statistics use case, but the description provides no exclusions or routing advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

legendaLegenda dos códigosA

Explica os códigos usados nos dados (cargos, situações, redes, níveis de citação) e a metodologia.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses the content categories covered (cargos, situações, redes, níveis de citação) and methodology, but does not describe the return format or whether the response is text, structured data, or exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that lists the relevant code types and methodology without filler. Every element contributes to understanding the tool's scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, zero-parameter explanatory tool with no output schema, the description is nearly complete: it says what codes and methodology are explained. It could be slightly richer by indicating the return format, but the essential scope is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter semantics are not a concern. The baseline for zero-parameter tools is 4, and the description appropriately does not need to explain inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Explica') and resource ('códigos usados nos dados... e a metodologia'), making clear it is an explanatory/metadata tool. It does not explicitly name or contrast with sibling tools, but its purpose is distinct from data-retrieval siblings like buscar_politicos or ranking.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for understanding codes and methodology, but it gives no explicit guidance on when to use it versus alternatives or prerequisites. No when/when-not conditions or sibling references are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listar_postsListar postsB

Lista posts captados pelo Flaviômetro com filtros por político, rede, nível de citação, período e texto. Por padrão traz só posts que citam o Flávio, do mais recente para o mais antigo.

NameRequiredDescriptionDefault
ufNoSigla do estado, ex.: SP
ateNoFim do período (AAAA-MM-DD ou ISO 8601, horário de Brasília)
nomeNoParte do nome (sem diferenciar acentos/maiúsculas) ou o código sq exato
redeNoig = Instagram, fb = Facebook, x = X/Twitter, th = Threads, yt = YouTube, tt = TikTok, kw = Kwai, tg = Telegram
cargoNogov = governador(a), sen = senador(a), fed = deputado(a) federal, est = deputado(a) estadual, pref = prefeito(a)
desdeNoInício do período (AAAA-MM-DD ou ISO 8601, horário de Brasília)
textoNoBusca no texto da legenda e no trecho transcrito
limiteNo
partidoNoSigla do partido, ex.: PL, NOVO, UNIÃO
situacaoNoeleito = eleito(a) em 2026, 2t = disputa o 2º turno, mandato = em mandato (não disputou em 2026)
municipioNoMunicípio (só se aplica a prefeitos)
ordenar_porNorecentes
nivel_minimoNo0 = todos os posts, 1 = citou o Flávio, 2 = só pedidos de voto
somente_fala_em_videoNoSó posts em que a citação foi detectada na fala do vídeo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose two important behavioral facts beyond the schema: results are silently limited to posts citing Flávio by default, and default ordering is newest-first. That is genuinely useful for a read tool that would otherwise appear to return everything. However, pagination, result-set size limits, and the returned record shape are not mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, and the default-scope caveat is placed prominently. Slightly more could be front-loaded, but it is efficient and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter read tool with no annotations and no output schema, the description covers the most critical surprise (default filtering to Flávio citations) but leaves out what a post record contains and how to page through results. The schema carries most of the parameter burden, so this is adequate without being complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 86%, so the schema already documents nearly every parameter including enums and defaults; baseline is 3. The description's mention of filter categories (político, rede, nível de citação, período, texto) only restates what the schema shows in more detail, adding no new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lista posts captados pelo Flaviômetro') plus the filter axes it supports, which is enough to distinguish it from siblings like ranking or estatisticas_agrupadas that also deal with posts/politicians. It does not explicitly name a sibling, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case (browsing individual posts with filters) and clarifies the default scope, but never says when to prefer this over ranking, estatisticas_agrupadas, or detalhes_politico. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rankingRanking de políticosB

Ranking dos políticos que mais citaram o Flávio segundo uma métrica (posts citando, pedidos de voto, views ou interações dos posts citando). Aceita os mesmos filtros de buscar_politicos.

NameRequiredDescriptionDefault
ufNoSigla do estado, ex.: SP
ateNoFim do período (AAAA-MM-DD ou ISO 8601, horário de Brasília)
nomeNoParte do nome (sem diferenciar acentos/maiúsculas) ou o código sq exato
cargoNogov = governador(a), sen = senador(a), fed = deputado(a) federal, est = deputado(a) estadual, pref = prefeito(a)
desdeNoInício do período (AAAA-MM-DD ou ISO 8601, horário de Brasília)
limiteNo
metricaNoposts_citando
partidoNoSigla do partido, ex.: PL, NOVO, UNIÃO
situacaoNoeleito = eleito(a) em 2026, 2t = disputa o 2º turno, mandato = em mandato (não disputou em 2026)
municipioNoMunicípio (só se aplica a prefeitos)

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden and largely fails to. It never confirms this is a read-only operation, never states sort direction, tie-breaking, or pagination behavior, and gives no indication of the response shape despite there being no output schema. The only behavioral hint ('que mais citaram') implies descending order but leaves it unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with what the ranking measures, with the metric list and filter pointer following. No filler. Slightly terse to the point of omitting needed information, but nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with no annotations and no output schema, the description covers the 'what' adequately but not the 'what comes back'. An agent knows it gets a ranking of politicians by a chosen metric, but not the fields per entry (position, metric value, name, party) or ordering guarantees. This is minimum viable rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so most parameters (uf, desde, ate, nome, cargo, partido, situacao, municipio) are already documented in the schema, and metrica's four values are in the schema enum. The description adds no per-parameter meaning beyond repeating the metric names. Baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — ranks politicians by how much they cited Flávio — and enumerates the four metrics that define the ranking, so the agent knows exactly what the output orders. It also references the buscar_politicos filter set, which separates it from the plain search sibling. It does not differentiate itself from estatisticas_agrupadas, which is the closest ambiguous alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Aceita os mesmos filtros de buscar_politicos" gives useful context about the filter model but is a schema hint, not usage guidance. There is no statement of when to pick ranking over buscar_politicos or estatisticas_agrupadas, nor any exclusion. Usage is only implied by the word 'Ranking'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resumo_geralResumo geralA

Panorama do Flaviômetro: quantos políticos monitorados citaram o Flávio, quantos pediram voto, quantos ficaram em silêncio, totais de posts e quebra por cargo. Use como ponto de partida.

NameRequiredDescriptionDefault
ateNoFim do período (AAAA-MM-DD ou ISO 8601, horário de Brasília)
desdeNoInício do período (AAAA-MM-DD ou ISO 8601, horário de Brasília)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does disclose the shape of the returned metrics in prose, which is valuable since there is no output schema, but it says nothing about the read-only nature, permission requirements, aggregation basis, or how the silent/cited classifications are determined.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first front-loads exactly what the panorama contains, the second gives the usage cue. No filler and nothing redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter, read-only aggregate with no output schema, the description successfully conveys what comes back and when to reach for it. The main residual gap is the total silence on the optional date-range filter, which an agent might not realize applies to this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — both 'desde' and 'ate' are documented in the schema with format and timezone (horário de Brasília). The description never mentions the period filter, so it adds nothing beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description enumerates concretely what the tool returns: counts of monitored politicians who cited Flávio, asked for votes, or stayed silent, plus post totals and a breakdown by office. That is a specific, differentiated role versus detail-oriented siblings such as detalhes_politico or listar_posts. It stops short of an explicit verb+resource framing (it is a noun phrase, 'Panorama do Flaviômetro'), so it is clear but not exemplary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use como ponto de partida' gives a clear contextual instruction: call this first, then drill down with the more specific siblings. There are no explicit exclusions or named alternatives, but the positioning as an entry point is unambiguous for an agent orienting itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.1.0
    • First observedatualizar_dados
    • First observedbuscar_politicos
    • First observedcontato_campanha
    • First observeddetalhes_politico
    • First observedestatisticas_agrupadas
    • First observedlegenda
    • First observedlistar_posts
    • First observedranking
    • First observedresumo_geral

TDQS

A3.5/5.0

Scored across 9 tools

Disambiguation4/5

Most tools target clearly different outputs: overview dashboard, filtered politician search, single-politician detail, post listing, ranking, grouped aggregation, and a campaign-contact lookup. The main soft overlaps are resumo_geral vs estatisticas_agrupadas (both aggregate numbers) and ranking vs buscar_politicos (ranking explicitly reuses the same filters), but descriptions make the distinction between a fixed panorama, a configurable aggregation, and an ordered list reasonably clear.

Naming Consistency3/5

All names are snake_case in Portuguese, which is consistent, but the conventions mix: verb_noun (buscar_politicos, atualizar_dados, listar_posts) alongside bare nouns (resumo_geral, ranking, legenda, contato_campanha, estatisticas_agrupadas) and noun_noun (detalhes_politico). Still readable and predictable enough to guess intent.

Tool Count4/5

Nine tools is a good size for a monitoring/analytics server, with each analysis angle (overview, search, detail, posts, ranking, grouped stats) earning its place. Minor ding for atualizar_dados being a maintenance-only tool and contato_campanha belonging to a distinct TSE/OpenCNPJ domain.

Completeness4/5

The read-only analytics surface is well covered: summary, filtered search, per-politician detail, post listing, ranking, grouped aggregation, code glossary, and a data refresh. Gaps are minor, such as no per-politician time-series/evolution tool and no direct post-detail or comparison operation, but agents can work around these with existing filters.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    Not graded
    maintenance
    Enables interaction with the Brazilian Chamber of Deputies Open Data API, providing access to information about legislators, legislative proposals, voting records, events, committees, and parliamentary activities through 57 typed and validated tools.
    63
    -
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Connects AI agents to 28 Brazilian public APIs, providing over 200 tools to access data on economy, legislation, transparency, and the judiciary. It enables complex queries and cross-referencing of government datasets like IBGE, the Central Bank, and the National Congress through natural language.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to query Brazilian Senate data including senators, bills, voting records, committees, and plenary sessions through natural language.
    10 npm
    6
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables lookup of Brazilian public data including companies (CNPJ), postal codes (CEP), banking, economy, geography, and more through 15 tools and 2 guided prompts, powered by BrasilAPI with no API key required.
    15
    MIT