Atlas / MCP servers / robertoecf / OpenFinData

OpenFinDataSAFE

mcp/robertoecf/openfindata

Dados Financeiros Abertos — infraestrutura open source para dados financeiros públicos do Brasil via API REST, MCP, CLI e Python.

Verdict
SAFE
Grade
B
Trust score
89 /100
Exposed tools
10 10r · 0w · 0d
Transport
—
License
MIT
Stars
10
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Infraestrutura open source para consultar dados financeiros públicos do Brasil em Python, REST, CLI e MCP.

[](https://github.com/robertoecf/openfindata/actions/workflows/ci.yml) [](LICENSE)

O que é

O projeto agrega fontes públicas brasileiras em uma camada única e auditável para analistas, desenvolvedores, pesquisadores e agentes:

  • biblioteca Python assíncrona;
  • API REST com Swagger e ReDoc;
  • CLI findata;
  • servidor MCP em /mcp;
  • registro local para resolver CNPJ, ticker e nome.

As fontes principais não exigem chaves de API e os testes unitários não acessam a rede. O slug de distribuição é openfindata; o pacote importável e a CLI continuam sendo findata.

Instalação

pip install openfindata

Para desenvolvimento local:

git clone https://github.com/robertoecf/openfindata.git
cd openfindata
pip install -e '.[dev]'
bash scripts/git/install-hooks.sh

Uso rápido

CLI

findata bcb get selic -n 10
findata bcb ptax
findata cvm search Petrobras
findata b3 quote PETR4
findata registry lookup 33000167000101
findata serve

Python

import asyncio

from findata.registry import lookup
from findata.sources.bcb import sgs


async def main() -> None:
selic = await sgs.get_series_by_name("selic", n=5)
print(selic)

entity = await lookup("PETR4")
print(entity.entities[0])


asyncio.run(main())

REST e MCP

findata serve
curl 'http://localhost:8000/bcb/series/name/selic?n=5'
curl 'http://localhost:8000/registry/lookup?q=PETR4'
Read from source at commit f8b80405fd4eOBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add openfindata-mcp -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "openfindata-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ]
    }
  }
}
03

Exposed tools (10)

10 read · 0 write · 0 destructive.

ToolRiskDescription
bcb_focusread
bcb_ptaxread
bcb_seriesread
cvm_fundread
ibge_indicatorread
ibge_ipca_breakdownread
ipea_searchread
ipea_seriesread
openfinance_directoryread
tesouro_siconfiread
04

Trust audit

SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
declared (6 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (15)

MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
deploy/docker-compose.charlie-mcp.yml:7
#   # then cloudflared points at http://127.0.0.1:8001
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/DEPLOY_CHARLIE_MCP.md:44
curl -sS http://127.0.0.1:8001/health
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/DEPLOY_CHARLIE_MCP.md:56
| Ingress | `http://127.0.0.1:8001` |
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/DEPLOY_CHARLIE_MCP.md:122
-X POST http://127.0.0.1:8001/mcp \
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/DEPLOY_CHARLIE_MCP.md:129
http://127.0.0.1:8001/stats
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/test_b3_cotahist_indices.py:238
decoded = json.loads(base64.b64decode(encoded).decode("utf-8"))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/test_b3_cotahist_indices.py:360
decoded = json.loads(base64.b64decode(encoded).decode("utf-8"))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/test_b3_listed_funds.py:46
return json.loads(base64.b64decode(encoded).decode("utf-8"))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/test_b3_listed_funds.py:65
decoded = json.loads(base64.b64decode(encoded).decode("utf-8"))
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
workers/mcp/package.json
@cloudflare/workers-types, @modelcontextprotocol/server, agents, wrangler, zod
Why it matters. 5 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/SOURCES_WITH_AUTH.md:59
- Token endpoint: `POST /oauth/access-token` (não `/oauth/token`).
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOInventory / provenance · inv.oversize · CWE-1104
src/findata/data/registry.sqlite
src/findata/data/registry.sqlite
Why it matters. 29822976 bytes not read
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/DEPLOY_PUBLIC.md:68
cat > deploy/.env <<EOF
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/SOURCES_WITH_AUTH.md:126
| **BNDES Open Banking** | API key | Issue ou PR |
Why it matters. asks the agent to read credentials
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
docs/DEPLOY_PUBLIC.md:128
curl -L https://pkg.cloudflare.com/install.sh | sudo bash

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha f8b80405fd4efull audit observations/trust-audit/mcp-server/robertoecf__openfindata.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10f8b80405fd4eSAFEB89first audit
06

Questions

What is the OpenFinData MCP server?

Dados Financeiros Abertos — infraestrutura open source para dados financeiros públicos do Brasil via API REST, MCP, CLI e Python.

What tools does OpenFinData expose?

10 in total: 10 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is OpenFinData safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.

What credentials does OpenFinData need?

No credential environment variables were found in its source, so it appears to need none.

How current is this page?

The grade is for one exact copy of the source (f8b80405fd4e), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement