Senado BR MCP Server

Brazilian Federal Senate open data over MCP — 90 tools across the legislative process, Senate administration (CEAPS expenses, payroll, contracts) and the e-Cidadania portal. Cloudflare Workers, Streamable HTTP, no auth. Responses in pt-BR.

Documentation

senado-br-mcp (Cloudflare Workers)

smithery badge LobeHub License: MIT Tools MCP Cloudflare Workers

A public, hosted MCP server for Brazilian Senate open data, running on Cloudflare Workers (Streamable HTTP). It is already deployed and open access — just point your MCP client at the hosted endpoint; no installation, no account, no API key required.

Provides 65 tools (plus 4 prompts and 5 resources) organized into 19 groups covering the legislative domain (senators, bills, votes, committees, plenary sessions and results, presidential vetoes, party-bloc voting orientation, legislative processes, reference data, citizen participation via e-Cidadania, speeches and stenographic transcripts, blocs and leadership, federal legislation, committee voting) and the administrative domain (CEAPS parliamentary quota expenses, housing allowance, civil servants and payroll, overtime, interns, procurement contracts, biddings, outsourced staff, petty-cash funds, budget execution and own revenues). Connects to three sources: the legislative open data API, the administrative open data API and the e-Cidadania portal.

v2.1.0: all tools that consumed endpoints marked deprecated upstream (the legacy /materia/* family and /senador/{codigo}/votacoes) were migrated to the v3 /processo and /votacao APIs, keeping tool names and output keys stable.

v2.2.0: adds the administrative domain (groups O, P, Q, R — 16 tools) consuming adm.senado.gov.br. Large datasets (CEAPS ≈ 10 MB/year, payroll ≈ 5.5 MB/month) are fetched once, cached, and filtered/aggregated inside the Worker — tools never return raw dumps.

v2.3.0: every tool now declares MCP annotations (readOnlyHint, openWorldHint) and a structured-output schema; canonical endpoint moved to the custom domain https://senado.sidneybissoli.com/mcp (the *.workers.dev URL still works as a fallback).

v3.0.0: consolidated 90 → 65 tools by merging near-duplicate tools into enum/secao/tipo parameters (e.g. reference tables → senado_tabelas_referencia; per-process sub-resources → senado_processo_detalhe; senado_mesa with a casa param; senado_search_votacoes absorbing the recent-votes/list tools). Breaking change: several tool names were removed or renamed.

v3.1.0: adds the MCP prompts capability (4 reusable pt-BR workflow templates — CEAPS expenses, bill tracking, senator votes, e-Cidadania overview) and the resources capability (5 static context docs: usage guide, tool catalog, glossary, and the tipos-matéria / UFs reference tables). Ships a LICENSE file (MIT).

Use it (hosted — no setup)

This is a remote, hosted, open-access server. To use it, point any MCP client at the Streamable HTTP endpoint — no install, no account, no API key, no configuration:

https://senado.sidneybissoli.com/mcp

Install (any client)

For clients that launch MCP servers as a command — and for one-command setup — use the mcp-remote bridge. No build, no config, no key:

npx -y mcp-remote https://senado.sidneybissoli.com/mcp
  • One-click (LobeHub): open the server page and click Install.
  • Native remote URL (Claude Desktop/Code and other Streamable-HTTP clients): see Connecting MCP Clients.

Everything below Architecture (Prerequisites, Setup, Deploy) is only for optionally self-hosting your own instance — it is not required to use this public server.

Architecture

  • Runtime: Cloudflare Workers (ESM)
  • Transport: Streamable HTTP (MCP spec 2025-03-26) via createMcpHandler from agents/mcp
  • Protocol: MCP over JSON-RPC — single /mcp endpoint handles POST, GET, DELETE
  • SDK: @modelcontextprotocol/sdk 1.26.0+ (per-request McpServer instances)
  • Validation: Zod schemas for all tool inputs
  • Caching: 2-layer (L0 memory + L1 Cache API) with SHA-256 keying
  • e-Cidadania store: D1 database refreshed by a Cron Trigger (every 2h) — list tools read from D1 with a live-scrape fallback and a staleness flag; detail tools stay live with write-through (see e-Cidadania)
  • Rate limiting: Token bucket — global (8 req/s) + per-client (2 req/s)
  • Upstream throttle: Max 6 concurrent requests, 10s timeout, retry with exponential backoff
  • Auth: Optional Bearer token (set the API_KEY secret; open access when unset). Constant-time comparison.
  • Observability: Structured JSON logging + in-memory counters exposed at /metrics
  • Tests: Vitest unit tests for parsers, helpers, cache, throttle, and auth

Self-hosting (optional)

Not needed to use the server — it is already hosted at https://senado.sidneybissoli.com/mcp (open access). Follow this section only if you want to run your own private instance.

Prerequisites

Setup

1. Install dependencies

npm install

2. Create KV namespace

# Create the KV namespace
wrangler kv namespace create CACHE_KV

# Note the ID from the output, e.g.:
# { binding = "CACHE_KV", id = "abc123..." }

3. Configure wrangler.toml

Replace the placeholder KV namespace ID:

[[kv_namespaces]]
binding = "CACHE_KV"
id = "YOUR_KV_NAMESPACE_ID_HERE"

Optionally set ALLOWED_ORIGIN to restrict CORS:

[vars]
ALLOWED_ORIGIN = "https://your-app.example.com"

The e-Cidadania pipeline needs a D1 database and a Cron Trigger (both already declared in wrangler.toml — replace the database ID):

[[d1_databases]]
binding = "ECIDADANIA_DB"
database_name = "senado-ecidadania"
database_id = "YOUR_D1_DATABASE_ID_HERE"

[triggers]
crons = ["0 */2 * * *"]

Create the database (paste the returned ID above) and apply the schema:

npx wrangler d1 create senado-ecidadania
npx wrangler d1 migrations apply senado-ecidadania --remote

The list tools fall back to live scraping when D1 is empty, so the server works before the first Cron run.

4. (Optional) Enable authentication

wrangler secret put API_KEY
# Clients must then send: Authorization: Bearer <key>
# When API_KEY is not set, the server is open access.

5. Local development

npm run dev
# Dev server runs locally on port 8787 (local only).
# The public MCP endpoint is https://senado.sidneybissoli.com/mcp

6. Tests and typecheck

npm test             # run all tests once
npm run test:watch   # watch mode
npm run typecheck    # tsc --noEmit

7. Deploy

npm run deploy
# Serves at https://senado.sidneybissoli.com (custom domain) and
# https://senado-br-mcp.sidneybissoli.workers.dev (workers.dev fallback)

Endpoints

PathMethodsDescription
/mcpPOST, GET, DELETE, OPTIONSMCP Streamable HTTP endpoint (managed by createMcpHandler)
/healthGETHealth check — returns ok (always public)
/metricsGETJSON counters: requests, tool calls, cache hits/misses, upstream calls/retries/errors, auth failures (always public)

MCP Request Examples

All requests go to POST /mcp with JSON-RPC 2.0 format.

List available tools

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list"
}

Call a tool — List senators from SP

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "senado_listar_senadores",
    "arguments": {
      "uf": "SP",
      "emExercicio": true
    }
  }
}

Call a tool — Search bills by keyword

{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "senado_buscar_materias",
    "arguments": {
      "palavraChave": "inteligência artificial",
      "tramitando": true
    }
  }
}

Call a tool — Get recent plenary votes

{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tools/call",
  "params": {
    "name": "senado_search_votacoes",
    "arguments": {
      "dias": 7
    }
  }
}

Call a tool — Most popular citizen ideas

{
  "jsonrpc": "2.0",
  "id": 5,
  "method": "tools/call",
  "params": {
    "name": "senado_ecidadania_listar_ideias",
    "arguments": {
      "ordenarPor": "apoios",
      "ordem": "desc",
      "status": "aberta"
    }
  }
}

Upstream API Endpoints

The server consumes two classes of upstream endpoints from the Senado API:

Legacy endpoints (.json suffix, PascalCase responses)

Used by Groups A, E, F, H, I, J, K, L, M, N. The .json suffix is appended automatically by upstream.ts. None of these is marked deprecated upstream.

Upstream pathUsed by
/senador/lista/atualsenado_listar_senadores
/senador/lista/legislatura/{legislatura}senado_listar_senadores (param legislatura)
/senador/{codigo}senado_obter_senador
/senador/{codigo}/licencas, /comissoes, /cargos, /historicoAcademico, /filiacoes, /profissaosenado_senador_historico (tipo enum)
/senador/afastadossenado_senadores_afastados
/senador/{codigo}/apartessenado_discursos_senador (tipo=apartes)
/comissao/lista/colegiadossenado_listar_comissoes (+ sigla-to-code resolution)
/comissao/{codigo}senado_obter_comissao (secao=resumo; numeric code, not sigla)
/composicao/comissao/{codigo}senado_obter_comissao (secao=membros)
/comissao/agenda/{data}senado_agenda_comissoes
/comissao/agenda/{dataInicio}/{dataFim}senado_reunioes_comissao
/comissao/reuniao/{codigoReuniao}senado_reuniao_comissao
/comissao/cpi/{sigla}/requerimentossenado_requerimentos_cpi (empty body = no requests)
/materia/distribuicao/autoria, /distribuicao/relatoria/{sigla}senado_distribuicao_materias
/plenario/agenda/dia/{data}, /agenda/mes/{data}, /agenda/cn/...senado_agenda_plenario
/plenario/resultado/{data}, /resultado/cn/{data}, /resultado/mes/{data}senado_resultado_plenario
/plenario/resultado/veto/{codigo} (+ /materia/, /dispositivo/)senado_resultado_veto
/plenario/votacao/orientacaoBancada/{data} (+ período)senado_orientacao_bancada
/plenario/encontro/{codigo} (+ /pauta, /resultado, /resumo)senado_encontro_plenario
/plenario/tiposSessao, /lista/tiposComparecimento, /lista/legislaturassenado_tabelas_plenario
/materia/vetos/{ano}, /vetos/aposrcn, /vetos/antesrcn, /vetos/encerradossenado_vetos
/taquigrafia/notas/{sessao|reuniao}/{id}senado_notas_taquigraficas
/taquigrafia/videos/{sessao|reuniao}/{id}senado_videos_taquigrafia
/senador/{codigo}/discursossenado_discursos_senador
/plenario/lista/discursos/{dataInicio}/{dataFim}senado_discursos_plenario
/discurso/texto-integral/{codigo}senado_discurso_texto (plain text, fetched directly)
/senador/lista/tiposUsoPalavrasenado_tabelas_referencia (tabela=tipos-uso-palavra)
/composicao/lista/blocossenado_listar_blocos
/composicao/bloco/{codigo}senado_obter_bloco
/composicao/liderancasenado_liderancas
/composicao/mesaSFsenado_mesa (casa=senado)
/composicao/mesaCNsenado_mesa (casa=congresso)
/orcamento/listasenado_orcamento_parlamentar (tipo=emendas)
/orcamento/oficiossenado_orcamento_parlamentar (tipo=oficios)
/legislacao/listasenado_buscar_legislacao
/legislacao/{codigo}senado_obter_legislacao
/legislacao/tiposNormasenado_tabelas_referencia (tabela=tipos-norma)
/votacaoComissao/comissao/{sigla}senado_votacao_comissao (por=comissao)
/votacaoComissao/parlamentar/{codigo}senado_votacao_comissao (por=senador)
/votacaoComissao/materia/{sigla}/{numero}/{ano}senado_votacao_comissao (por=materia)
/autor/lista/atualsenado_autores_atuais

v3 endpoints (flat JSON arrays/objects, camelCase)

Used by Groups B, C, D. Dates must be in ISO format (YYYY-MM-DD) — tools accept YYYYMMDD and convert. The codigoMateria query param bridges legacy matéria codes to v3 processes.

Upstream pathUsed by
/votacaosenado_obter_votacao, senado_search_votacoes, senado_votos_materia, senado_votacoes_senador
/processosenado_search_processos, senado_buscar_materias
/processo/{id}senado_obter_processo, senado_obter_materia (secao=detalhe/tramitacao)
/processo/documentosenado_obter_materia (secao=textos)
/processo/emendasenado_processo_detalhe (secao=emendas)
/processo/relatoriasenado_processo_detalhe (secao=relatorias), senado_obter_materia (rapporteur)
/processo/prazosenado_processo_detalhe (secao=prazos)
/processo/{siglas,assuntos,classes,destinos,entes,tipos-*}senado_tabelas_processo (12 reference tables)

Administrative API (adm.senado.gov.br/adm-dadosabertos, flat snake_case JSON)

Used by Groups O, P, Q, R via admFetch (no .json suffix; HTTP 404 treated as empty collection). Base URL configurable via SENADO_ADM_BASE_URL.

Upstream pathUsed by
/api/v1/senadores/despesas_ceaps/{ano}senado_ceaps (~10 MB/year, cached + aggregated in-Worker)
/api/v1/senadores/{auxilio-moradia,escritorios,aposentados}senado_senadores_admin (tipo enum)
/api/v1/servidores/servidores/{ativos,efetivos,comissionados,inativos}senado_servidores
/api/v1/servidores/remuneracoes/{ano}/{mes}senado_remuneracoes_servidores (~5.5 MB/month)
/api/v1/servidores/horas-extras/{ano}/{mes}senado_horas_extras
/api/v1/servidores/quantitativos/*, /previsao-aposentadoria, /api/v1/senadores/quantitativos/senadoressenado_pessoal_tabelas (quantitativos)
/api/v1/servidores/{estagiarios,pensionistas,lotacoes,cargos}senado_pessoal_tabelas (listas nominais)
/api/v1/contratacoes/contratos (+ /{id}/aditivos)senado_contratos, senado_contratacao_detalhe
/api/v1/contratacoes/{tipo}/{id}/{itens,pagamentos,garantias}senado_contratacao_detalhe
/api/v1/contratacoes/licitacoessenado_licitacoes
/api/v1/contratacoes/terceirizadossenado_terceirizados
/api/v1/contratacoes/empresassenado_empresas_contratadas (~13 MB, requires filter)
/api/v1/contratacoes/{atas_registro_preco,notas_empenho,menores_aprendizes}senado_contratacoes_lista
/api/v1/supridos/{ano} (+ atosConcessao, empenhos, movimentacoes, transacoes)senado_suprimento_fundos
senado.gov.br/bi-arqs/Arquimedes/Financeiro/{Despesa,Receitas}SenadoDadosAbertos.jsonsenado_execucao_orcamentaria (daily JSON feeds, Brazilian decimal strings normalized)

e-Cidadania (D1-backed, Cron-refreshed)

The e-Cidadania list data (consultas, ideias, eventos) is persisted in a D1 database and refreshed by a Cron Trigger (0 */2 * * *) instead of being scraped on every call. The scheduled job (src/scraper/pipeline.ts) scrapes the internal REST highlight endpoints (restcolecaomaismateria, restcolecaomaisideia, restcolecaomaisaudiencia — the top ~5 per entity, not the full corpus; these endpoints have no pagination), then:

  • upserts ecidadania_current (one row per item — what the tools read),
  • appends ecidadania_history only when an item's content_hash changes (time-series-ready),
  • records each run in ecidadania_scrape_runs.

An anomaly guard (src/scraper/anomaly.ts) ensures a failed or anomalous run (zero rows, or fewer than ECIDADANIA_ANOMALY_MIN_PCT% of the last good run) never overwrites the last good state.

The list / analysis tools (listar_*, consultas_analise, sugerir_tema_enquete) read from D1 via resolveList (src/scraper/store.ts): D1-first, with a graceful live-scrape fallback when D1 is empty or stale (older than ECIDADANIA_STALE_MAX_MIN minutes). Every list response carries an additive meta (fonte, lastScrapedAt, possivelDesatualizacao) so callers always see the data's real age and never get stale data silently.

The detail tools (obter_*) stay live (HTML scraped with CSS-class-targeted regex) for freshness, and write their richer payload through to ecidadania_detalhe fire-and-forget (deduped by content_hash), so detail history accrues without adding latency to the response.

The list endpoints track the portal's highlighted collections (a few items per entity) plus their time series — not the complete e-Cidadania corpus. Full-corpus ingestion via the paginated /pesquisa* HTML pages is a separate, deferred effort.

Caching

Layer architecture

LayerStorageScopeTTL rangePurpose
L0In-memory MapPer-isolate30-300sUltra-fast, eliminates redundant requests within a Worker isolate
L1Cloudflare Cache API (caches.default)Per-colo (PoP)60-600sShared across requests at the same edge location
L2KV (optional)GlobalVariableReserved for rare, low-write data

Cache categories

CategoryL0 TTLL1 TTLUsed for
STATIC300s600sLegislation types, static reference
SEMI_STATIC120s300sParty list, UF list, committee details
DYNAMIC30s60sAgendas, recent votes, meeting lists
ON_DEMAND30s120sSpecific bill/senator/vote lookups

POST caching approach

MCP uses POST for all tools/call requests. Caching POST responses is not natively supported by the Cache API, which requires GET requests. The solution:

  1. Hash parameters — Tool name + sorted parameters are hashed with SHA-256
  2. Synthetic GET key — A synthetic URL https://senado-br-mcp.internal/__cache/{tool}/{hash} is constructed
  3. Cache API match/put — The synthetic GET URL is used with caches.default.match() and caches.default.put(), allowing standard Cache API operations on POST-originated data

This caching happens at the tool level (inside each tool's callback), not at the MCP transport level.

Tool Inventory

Group H — Reference/Metadata (1 tool)

ToolDescription
senado_tabelas_referenciaTabelas de referência via tabela enum: tipos-materia, partidos, ufs, legislatura-atual, tipos-norma, tipos-uso-palavra

Group A — Senators (5 tools)

ToolDescription
senado_listar_senadoresLista senadores em exercício/por legislatura, com filtros nome (busca parcial sem acento), uf e partido
senado_obter_senadorDetalhe biográfico de um senador: bio, mandatos, partido, contato
senado_votacoes_senadorComo um senador votou em cada matéria (via v3 /votacao)
senado_senador_historicoHistórico funcional via tipo enum: licencas, comissoes, cargos, historico-academico, filiacoes, profissoes
senado_senadores_afastadosSenadores atualmente afastados (fora de exercício)

Group B — Bills/Matters (2 tools, v3 backend)

ToolDescription
senado_buscar_materiasBusca matérias por tipo, número, ano, palavra-chave, autor ou tramitação (via v3 /processo)
senado_obter_materiaDados de uma matéria via secao enum: detalhe (situação/relator), tramitacao (histórico) ou textos (documentos)

Group C — Processes (5 tools)

ToolDescription
senado_search_processosBusca processos legislativos (complementar à busca de matérias)
senado_obter_processoDetalhes completos de um processo legislativo específico
senado_processo_detalheAspecto de um processo via secao enum: emendas, relatorias ou prazos
senado_autores_atuaisParlamentares autores de processos em tramitação, ordenados por produção
senado_tabelas_processo12 tabelas de referência (siglas, assuntos, classes, tipos-*) via tabela enum

Group D — Votes (3 tools)

ToolDescription
senado_obter_votacaoDetalhes de uma votação com votos nominais. Aceita codigoVotacao (codigoSessao da sessão plenária).
senado_votos_materiaVotações de uma matéria (via v3 /votacao?codigoMateria), com votos nominais opcionais
senado_search_votacoesBusca/listagem flexível de votações do plenário por dias, período, processo, matéria ou senador

Group E — Committees (7 tools)

ToolDescription
senado_listar_comissoesLista comissões (colegiados) ativas, filtráveis por tipo
senado_obter_comissaoDados de uma comissão via secao enum: resumo (mesa/totais) ou membros (composição). Resolve sigla para código internamente.
senado_reunioes_comissaoReuniões de uma comissão num período (lida com intervalos entre anos)
senado_agenda_comissoesAgenda de reuniões de todas as comissões numa data
senado_reuniao_comissaoDetalhe completo de uma reunião: partes, itens, convidados, resultados, links pauta/ata
senado_requerimentos_cpiRequerimentos protocolados numa CPI em atividade, paginados
senado_distribuicao_materiasEstatísticas de carga por senador numa comissão: autoria ou relatoria

Group F — Plenary (7 tools)

ToolDescription
senado_agenda_plenarioPlenary schedule — by day, month or Congress (escopo dia/mes/cn)
senado_resultado_plenarioSession results: items deliberated, opinions, outcomes (SF/CN/month)
senado_orientacao_bancadaParty leadership voting instructions per vote, with tallies
senado_vetosPresidential vetoes by year or tramitation status
senado_resultado_vetoNominal veto vote results (by veto, vetoed bill or device)
senado_encontro_plenarioLegislative session detail, agenda items, results or summary
senado_tabelas_plenarioSession types, attendance types, legislatures list

Group G — e-Cidadania (8 tools)

ToolDescription
senado_ecidadania_listar_consultasConsultas públicas com votação sim/não dos cidadãos
senado_ecidadania_obter_consultaDetalhe de uma consulta: votos, autor, relator, comentários
senado_ecidadania_consultas_analiseAnalisa consultas via modo enum: consenso (alta concordância) ou polarizada (~50/50)
senado_ecidadania_listar_ideiasIdeias legislativas de cidadãos; ranking das mais apoiadas via ordenarPor: apoios
senado_ecidadania_obter_ideiaDetalhe de uma ideia: texto, apoios, status de conversão em projeto
senado_ecidadania_listar_eventosEventos interativos (audiências, sabatinas, lives); ranking dos mais comentados via ordenarPor
senado_ecidadania_obter_eventoDetalhe de um evento: pauta, convidados, link de vídeo
senado_ecidadania_sugerir_tema_enqueteSugere temas para enquete mensal a partir de critérios configuráveis

Group I — Speeches (3 tools)

ToolDescription
senado_discursos_senadorPronunciamentos de um senador via tipo enum: discursos (próprios) ou apartes (intervenções)
senado_discursos_plenarioTodos os discursos em plenário num intervalo de datas
senado_discurso_textoTexto integral de um pronunciamento/discurso específico

Group J — Blocs & Leadership (4 tools)

ToolDescription
senado_listar_blocosBlocos parlamentares do Senado e seus partidos membros
senado_obter_blocoDetalhes de um bloco parlamentar específico
senado_liderancasLideranças do Senado/Congresso (líderes, vice-líderes), filtráveis
senado_mesaMembros da Mesa Diretora via casa enum: senado (Mesa do SF) ou congresso (Mesa do CN)

Group K — Budget (1 tool)

ToolDescription
senado_orcamento_parlamentarDados de emendas orçamentárias via tipo enum: emendas (lotes) ou oficios (ofícios de apoio)

Group L — Federal Law (2 tools)

ToolDescription
senado_buscar_legislacaoBusca normas jurídicas federais por tipo, número, ano ou data (ao menos um obrigatório)
senado_obter_legislacaoDetalhes de uma norma jurídica federal específica

Group M — Committee Voting (1 tool)

ToolDescription
senado_votacao_comissaoVotações em comissões via por enum: comissao, senador ou materia; período opcional

Group N — Taquigrafia (2 tools)

ToolDescription
senado_notas_taquigraficasOfficial transcripts of plenary sessions or committee meetings — summary mode with excerpts, full-text mode paginated in blocks, speaker filter
senado_videos_taquigrafiaVideo/audio units per session or meeting, with speaker and media links

Group O — Senadores/Administrativo (2 tools)

ToolDescription
senado_ceapsCEAPS parliamentary quota expenses by year — aggregated by senator, expense type, month or supplier, or itemized detail; filters by senator/month/type/supplier
senado_senadores_adminDados administrativos dos senadores via tipo enum: auxilio-moradia, escritorios-apoio ou aposentados

Group P — Servidores / Gestão de Pessoas (4 tools)

ToolDescription
senado_servidoresCivil servants by status (active/effective/commissioned/inactive), filterable by name, unit, position
senado_remuneracoes_servidoresMonthly payroll — summary by payroll type or per-person composition with computed gross
senado_horas_extrasOvertime payments by month with totals
senado_pessoal_tabelasTabelas de pessoal via tabela enum: quantitativos (pessoal, cargos-funcoes, previsao-aposentadoria, senadores) e listas (estagiarios, pensionistas, lotacoes, cargos)

Group Q — Contratações (6 tools)

ToolDescription
senado_contratosContracts with server-side filters: supplier, CNPJ, year, number, object, labor
senado_contratacao_detalheItems, payments, guarantees, amendments or activations of a contract/ata/empenho
senado_licitacoesBiddings by number or object text
senado_terceirizadosOutsourced collaborators by name, company or unit
senado_empresas_contratadasCompanies contracting with the Senate (requires name/CNPJ filter)
senado_contratacoes_listaPrice-registration atas, commitment notes, young apprentices

Group R — Suprimento de Fundos (1 tool)

ToolDescription
senado_suprimento_fundosPetty-cash advances by year: recipients, concession acts, commitments, movements, card transactions

Group S — Orçamento do Senado (1 tool)

ToolDescription
senado_execucao_orcamentariaBudget execution since 2013 (allocation, committed/settled/paid) and own revenues since 2012 (forecast vs collected) — aggregated by year, action, expense group, source or revenue origin

Total: 65 tools

Prompts (4)

Reusable pt-BR workflow templates (MCP prompts capability), defined in src/prompts.ts:

PromptArgsWhat it guides
senado_gastos_senadorsenador, anoResolve o senador e agrega/detalha despesas CEAPS.
senado_tramitacao_materiasigla, numero, anoObtém situação atual + histórico de tramitação da matéria.
senado_votos_senadorsenador, periodo?Lista os votos nominais do senador no período.
senado_panorama_ecidadaniaConsolida consultas (consenso/polarização), ideias e eventos populares.

Resources (5)

Static context documents/tables (MCP resources capability), defined in src/resources.ts:

URITypeContent
senado://guiamarkdownVisão geral e qual ferramenta usar por objetivo.
senado://catalogomarkdownAs 65 ferramentas agrupadas por domínio.
senado://glossariomarkdownSiglas e termos do Senado (PEC, CEAPS, CCJ, RCN…).
senado://tabelas/tipos-materiajsonTipos de proposição (sigla/nome/descrição).
senado://tabelas/ufsjsonAs 27 unidades federativas.

Project Structure

src/
├── index.ts              # Worker entrypoint (fetch handler + scheduled/Cron handler)
├── server.ts             # McpServer factory (creates per-request instance)
├── auth.ts               # Optional Bearer token auth (constant-time compare)
├── metrics.ts            # In-memory counters served at /metrics
├── types.ts              # Env, cache categories, safeguard constants
├── cache/
│   ├── l0-memory.ts      # In-memory Map cache with TTL + LRU eviction
│   ├── l1-cache-api.ts   # Cloudflare Cache API wrapper (synthetic GET keys)
│   └── manager.ts        # Cache orchestrator (L0 → L1 → upstream)
├── throttle/
│   ├── token-bucket.ts   # Token bucket rate limiter (global + per-client)
│   └── upstream.ts       # Upstream fetch with concurrency limit, retry, timeout
├── scraper/
│   ├── ecidadania.ts     # Isolated e-Cidadania scraper (REST lists + regex HTML detail)
│   ├── pipeline.ts       # Cron sync: scrape → upsert current + append-on-change history
│   ├── anomaly.ts        # Run classification (anomalous run never overwrites current)
│   └── store.ts          # D1 reads (resolveList + staleness) + detail write-through
├── instrument.ts         # Per-tool call telemetry (in-memory + Analytics Engine)
├── utils/
│   ├── logger.ts         # Structured JSON logging
│   └── validation.ts     # toolResult, toolError, errorFrom, buildParams, ensureArray helpers
└── tools/
    ├── referencia.ts        # Group H — 1 reference/metadata tool
    ├── senadores.ts         # Group A — 5 senator tools
    ├── materias.ts          # Group B — 2 bill/matter tools (v3 backend)
    ├── processos.ts         # Group C — 5 process tools
    ├── votacoes.ts          # Group D — 3 vote tools
    ├── comissoes.ts         # Group E — 7 committee tools
    ├── plenario.ts          # Group F — 7 plenary tools
    ├── ecidadania.ts        # Group G — 8 e-Cidadania tools (read from D1; see scraper/)
    ├── discursos.ts         # Group I — 3 speech tools
    ├── composicao.ts        # Group J — 4 bloc/leadership tools
    ├── orcamento.ts         # Group K — 1 budget tool
    ├── legislacao.ts        # Group L — 2 federal law tools
    ├── votacao-comissao.ts  # Group M — 1 committee voting tool
    ├── taquigrafia.ts       # Group N — 2 stenographic record tools
    ├── senadores-admin.ts   # Group O — 2 admin senator tools (CEAPS, housing)
    ├── servidores.ts        # Group P — 4 personnel tools
    ├── contratacoes.ts      # Group Q — 6 procurement tools
    ├── supridos.ts          # Group R — 1 petty-cash tool
    └── orcamento-senado.ts  # Group S — 1 budget execution tool
migrations/               # D1 schema (0001 tables, 0002 indexes) for the e-Cidadania pipeline
tests/                    # Vitest unit tests mirroring src/ (parsers, cache, throttle, auth, scraper,
                          # pipeline/anomaly/store, plus e-Cidadania contract tests over real fixtures)

Environment Variables

VariableRequiredDefaultDescription
SENADO_BASE_URLNohttps://legis.senado.leg.br/dadosabertosLegislative API base URL
SENADO_ADM_BASE_URLNohttps://adm.senado.gov.br/adm-dadosabertosAdministrative API base URL
ALLOWED_ORIGINNo*CORS allowed origin
API_KEYNo (secret)When set, requires Authorization: Bearer <key> on all requests except /health, /metrics, and CORS preflight
CACHE_KVYes (binding)KV namespace for L2 cache
ECIDADANIA_DBYes (binding)D1 database for the e-Cidadania pipeline (list persistence + history)
ECIDADANIA_STALE_MAX_MINNo360Minutes before D1-backed e-Cidadania reads flag possible staleness and fall back to live
ECIDADANIA_ANOMALY_MIN_PCTNo50A Cron run returning fewer than this % of the last good run's rows is anomalous and won't overwrite current
SENADO_ANALYTICSNo (binding)Analytics Engine dataset for per-tool call telemetry

Connecting MCP Clients

This is a remote server (Streamable HTTP, no install, open access) — point any MCP client at https://senado.sidneybissoli.com/mcp. Besides 65 tools, it exposes prompts (ready-made pt-BR workflows: senado_gastos_senador, senado_tramitacao_materia, senado_votos_senador, senado_panorama_ecidadania) and resources (senado://guia, senado://catalogo, senado://glossario, senado://tabelas/tipos-materia, senado://tabelas/ufs).

One-click (LobeHub)

Install from the LobeHub marketplace — open the server page and click Install (it pre-fills the remote endpoint, no config needed).

Claude Desktop / Claude Code

Add to your MCP configuration:

{
  "mcpServers": {
    "senado-br": {
      "url": "https://senado.sidneybissoli.com/mcp"
    }
  }
}

For command-based clients (or any client without native remote support), use the mcp-remote bridge:

{
  "mcpServers": {
    "senado-br": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://senado.sidneybissoli.com/mcp"]
    }
  }
}

MCP Inspector

npx @modelcontextprotocol/inspector https://senado.sidneybissoli.com/mcp

License

MIT

Credits

Icon: "Amanhecer no Congresso Nacional" — photograph of the Brazilian National Congress, used under a Creative Commons license. (If you are the author, open an issue so we can add full attribution / the license link.)