gov.br APIs MCP

io.github.thalisantunes由 GitHub 账号 thalisantunes 发布v0.2.0更新于 Oct 26, 2026

A catalog-driven gateway over Brazilian government APIs, loading OpenAPI specs on demand.

已验证STDIO仅桌面开发者工具数据与分析

概览

AI 生成的概览

以目录驱动的网关,让助手通过一个本地服务器搜索、描述并调用巴西政府 API(IBGE、央行、众议院、Serpro 等)。

可以做什么
  • 按关键词、类别或状态搜索并列出内置的 116 个巴西政府 API 目录条目
  • 描述某个 API 条目,并在有 OpenAPI 规范时列出其操作及参数、请求与响应结构
  • 调用目录中的任意端点,可指定方法、查询参数、请求体和请求头,基址与认证由目录解析
  • 查询每个 API 需要哪些环境变量,以及当前是否可调用
  • 用本地 YAML 文件和额外允许的主机扩展或覆盖目录
适用场景
适合需要处理巴西公共数据或服务的场景,让助手无需为每个端点单独配置工具即可检索和查询。适用于透明度、立法、统计或金融数据研究,以及在具备相应凭据或合同后使用 Serpro 或半价票(meia-entrada)流程。
运行要求
以 stdio 在本地运行,通常通过 PyPI 的 uvx 或容器启动。多数公共层 API 无需密钥;其他需要环境变量,如 TRANSPARENCIA_API_KEY、DATAJUD_API_KEY、DADOSGOV_API_KEY、MEIAENTRADA_CODIGO_ACESSO 或 SERPRO_* 的 OAuth2 客户端 ID 与密钥对。变量须写入 MCP 客户端的 env 块,因为不会读取 .env 文件。需要访问允许列表内的 gov.br、leg.br 和 jus.br 主机。
安装前请注意
目录决定凭据被发送到哪里,因此只有在你信任某主机时才通过 GOVBR_EXTRA_ALLOWED_HOSTS 添加它,并把 GOVBR_CATALOG_DIR 视为可信输入。Serpro API 按调用计费,需商业合同。call_api 可发送 POST、PUT、PATCH 和 DELETE 请求,可能修改远端数据。标记为 pii 的条目会把 CPF、姓名、照片等个人数据写入对话记录,且 CIE 校验器无需任何凭据即可调用。

安装

在 SourceWeft 中

  1. 打开 控制台中的 gov.br APIs MCP,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

govbr-apis-mcp

[CI]

MCP server that turns Brazilian government APIs into Claude-callable tools through a catalog-driven gateway: instead of one tool per endpoint (hundreds — would blow up client context), five generic tools operate over a local YAML catalog of 116 APIs.

Only the entries that declare an openapi_url have a spec to load: today the Câmara dos Deputados and the Portal da Transparência, 2 of the 116. For those, describe_api loads the OpenAPI spec on demand. Every other callable entry (see the "Callable today?" column below) is reached through call_api alone, using the endpoints in its description and docs_url.

Catalog tiers

TierFileAccess modelCallable today?
publicsrc/govbr_apis_mcp/catalog_data/public.yamlFree — no auth or free API key (IBGE, Banco Central, Câmara, Senado, Portal da Transparência, DataJud, Ipeadata, dados.gov.br…)Yes
serprosrc/govbr_apis_mcp/catalog_data/serpro.yamlSerpro commercial (loja.serpro.gov.br) — OAuth2 client credentials per contracted API, paid per callWith a Serpro contract: set the SERPRO_* variables
meia-entradasrc/govbr_apis_mcp/catalog_data/meia_entrada.yamlEligibility sources for half-price tickets (student CIE, ID Jovem, PcD, e-MEC) — see docs/meia-entrada.md and the POCCIE yes (DNE and FESN); the rest is manual
conectasrc/govbr_apis_mcp/catalog_data/conecta.yamlConecta gov.br — restricted to public-sector entities; 95 APIs indexed as stubs for discoveryNot yet (adhesion pending)

The Conecta tier exists so the catalog reflects the whole landscape now, and becomes callable later by filling in base_url + credentials — the OAuth2 client-credentials flow is already implemented (Serpro uses the same one).

Tools

  • search_catalog(query, category?) — accent-insensitive keyword search; reports total matches and whether the list was truncated.
  • list_apis(category?, status?, limit?) — enumerate entries, callable ones first (by the catalog's status, not by whether your credentials are set; filter it: ~95 Conecta stubs otherwise dominate the output).
  • describe_api(api_id, path?, method?) — catalog metadata + OpenAPI operation list; with path, parameter/request/response schemas ($refs inlined, depth-limited). Reads OpenAPI 3 and Swagger 2.0, as JSON or YAML.
  • call_api(api_id, path, method?, query?, body?, headers?) — invoke an endpoint; base URL and auth resolved from the catalog entry.
    • method is GET, HEAD, POST, PUT, PATCH, DELETE or OPTIONS; anything else returns an error with allowed_methods. A body is accepted only with POST, PUT and PATCH.
    • path is relative to the base_url. . and .. segments (after up to three rounds of percent-decoding, with \ read as / and ; parameters removed) and any path that leaves the base_url prefix are rejected. So is a # (a fragment is never sent; write a literal one as %23) or a control character.
    • A query string embedded in path is merged with query; a key in query replaces the embedded one, and a list value repeats the key.
    • Caller headers are matched case-insensitively, with _ equal to -. Authorization, Proxy-Authorization, Host, Cookie and Accept-Encoding, plus connection, proxy, forwarding and method-override headers, are dropped and reported in ignored_headers (the full list is in server.py). The managed credential is applied last and always wins. A header with an invalid name or value is not ignored: it fails the call with an error.
    • Method, body, headers and path are validated before any OAuth2 token is requested, and invalid input comes back as {"error": ...}.
    • A 3xx is not followed: the response carries its location (redacted, resolved against the requested URL). Response bodies are cut at 60,000 characters.
  • credentials_status(api_id?) — which env vars each API needs and whether they're set, plus callable: whether call_api would accept the entry right now (available and unstable entries; requires_contract ones only once their env vars are set).

POC: meia-entrada de estudante

Fluxo funcional ponta a ponta (código da CIE → decisão de elegibilidade), incluindo modo demo sem credencial: poc/README.md.

Install

bash
python3 -m venv .venv.venv/bin/pip install -e '.[dev]'.venv/bin/pytest

Register in Claude Code (.mcp.json or claude mcp add):

json
{  "mcpServers": {    "govbr-apis": {      "command": "/path/to/govbr-apis-mcp/.venv/bin/govbr-apis-mcp",      "env": {        "TRANSPARENCIA_API_KEY": "...",        "DATAJUD_API_KEY": "..."      }    }  }}

From PyPI: uvx govbr-apis-mcp (set "command": "uvx" and "args": ["govbr-apis-mcp"] in the entry above; no checkout needed). Each release is published to PyPI and to the MCP Registry automatically (publish.yml).

Or run it in a container. The server speaks stdio, so keep -i:

bash
docker build -t govbr-apis-mcp . && docker run -i --rm -e TRANSPARENCIA_API_KEY=... govbr-apis-mcp

Credentials

All secrets come from env vars declared per entry in the catalog (auth_config). Nothing is stored in the repo. .env.example lists the variables. Entries with a free key carry a signup_url; Serpro credentials come with the contract, at loja.serpro.gov.br. credentials_status reports readiness.

The server does not read .env files, and MCP clients start it with a minimal environment, so an export in your shell may never reach it. Put the variables in the client's env block (the example above, or claude mcp add -e KEY=value). For a container, copy .env.example to a git-ignored file such as .env.local, fill in the copy and pass it with docker run --env-file .env.local. Never put real values in .env.example: it is versioned.

API keys (the value together with any prefix) are stripped of surrounding whitespace and must be printable ASCII; otherwise the call fails with credential in <VAR> contains invalid characters, without echoing the value. OAuth2 client ids and secrets are only stripped: they travel base64-encoded, so any text works. The access token the endpoint returns must be printable ASCII too. When the token endpoint fails, the call returns an error and the token_url, with neither the response body nor any secret.

Auth profiles: none, api_key (static header, optional value prefix — e.g. DataJud's APIKey <key>), oauth2_client_credentials (token endpoint + id/secret, in-memory token cache; used by Serpro today, by Conecta after adhesion).

Extending the catalog

Add an entry to a YAML file in src/govbr_apis_mcp/catalog_data/. The directory is package data, so the wheel, uvx and the Docker image all carry the catalog. Minimum fields: id, name, provider, category, status, auth. Add openapi_url when the API publishes a spec — describe_api then works with zero code. Regenerate the Conecta tier with .venv/bin/python scripts/scrape_conecta.py. It leaves the file alone when the page yields no APIs, an id the catalog would reject, or fewer than half the current entries (--force overrides only the last check).

Entries are validated on load: ids must be filename-safe, URLs must be https on an allowlisted host (*.gov.br, *.leg.br, *.jus.br plus a few named hosts), and a hostname may only contain [a-z0-9.-] (write internationalized names in punycode). This is a security boundary, not style — the catalog decides where your credentials are sent. Add a host with GOVBR_EXTRA_ALLOWED_HOSTS only if you trust it with them; the same hostname rule applies to it.

To override entries without forking (e.g. filling in Conecta base URLs after adhesion), point GOVBR_EXTRA_CATALOG_DIR at a directory of .yaml or .yml files whose same-id entries win. A directory that does not exist or holds no entries is an error, and so is an id repeated inside it; an empty value counts as unset. GOVBR_CATALOG_DIR replaces the base catalog entirely and should be treated as trusted input.

Development

bash
python3 -m venv .venv.venv/bin/pip install -e '.[dev]'.venv/bin/ruff check ..venv/bin/ruff format --check ..venv/bin/pytest

CI runs ruff on Python 3.12 and the test suite on 3.11–3.14, then builds the wheel and loads the catalog from a clean install.

Security notes

  • Responses are never written to disk. Only OpenAPI specs are cached, in $XDG_CACHE_HOME/govbr-apis-mcp/ (or ~/.cache/govbr-apis-mcp/) for 24 hours, under a file name derived from sha256(api_id + "\n" + openapi_url): never the id itself, and a changed openapi_url never serves the old spec. OAuth2 tokens live in memory only.
  • call_api does not follow redirects — credentialed requests cannot be steered to another host by a 3xx; the response carries the (redacted) location instead. It always sends Accept-Encoding: identity, so a server has no reason to compress. The 60,000-character cut counts decoded text, though: a server that compresses anyway can still inflate a small chunk before the cut (an accepted risk; see the roadmap).
  • Cookies an API sets are never stored or sent back, so one API cannot plant a cookie that another would receive.
  • Spec fetches follow redirects only by hand: at most 5 hops, and every URL (the first and each Location) must be https on an allowlisted host before it is requested. The body is capped at 5 MiB, JSON and YAML are accepted (YAML with aliases, including merge keys that rely on them, is refused), and the document must carry openapi or swagger. A compressed response is refused and the whole download has a 60-second deadline; both come back as spec_error.
  • The httpx and httpcore loggers stay at WARNING, so httpx logs no request URL (query string included).
  • Entries flagged pii: true return personal data (CPF, name, photo) into the client transcript. Today: meiaentrada-cie-validador, fesn-cie-validador (callable without any credential: whoever holds a use code gets the holder's data) and the three Serpro entries.

Roadmap

  • Conecta adhesion as a public-sector entity → fill gateway base URLs + credentials
  • Per-API OpenAPI URLs for Conecta entries (linked from each detail page)
  • Serpro trial-mode toggle (call -trial base URLs with the published demo token)
  • Per-call cost guard for paid Serpro APIs
  • Bounded decompression for compressed upstream responses
  • Pleito à SNJ para a API conecta-id-jovem (admite instituição privada)
  • Fallback documental para CIE fora da base DNE (DCEs e entidades estaduais)

License

MIT - see LICENSE.

来源:README.md,提交 c4957f2

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.2.0最新Oct 19, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分