radar-cnpj-mcp
An MCP server and CLI that finds Brazilian companies by CNAE activity code and region. It uses the open CNPJ data published by Receita Federal, imported into a local DuckDB database.
Why it's held
Tells the agent to hide things from the user.
What it can touch
| files | write, including ~/.local/share/radar-cnpj-mcp/radar.duckdb |
|---|---|
| network | arquivos.receitafederal.gov.br, example.gov.br |
| shell | runs commands |
| secrets | none found |
What it actually does
Downloads the monthly CNPJ ZIP files from the public Receita Federal WebDAV share (arquivos.receitafederal.gov.br). It imports the requested states into a local DuckDB file and strips CPF-shaped numbers from free-text fields. It exposes read-only search, count and analytics tools, plus a CSV export confined to an export folder. A 'baixar_dados' tool starts the download as a detached background Node process that re-runs the same CLI and writes progress to a status JSON file. The SQL is parameterized. There is no telemetry, no credential access, no hidden instructions and no persistence beyond that one-shot background download.
What the check found
highTells the agent to hide things from the user
Instructions to keep the user in the dark are a hallmark of malicious skills.
src/data/analytics.ts:394 /** Without a state, a repeated name would silently add up different cities. */
mediumContains invisible characters
Zero-width and other invisible characters can hide words or split them so filters and reviewers miss them.
src/data/repository.ts:251 out.write(`⟦U+FEFF⟧${CSV_COLUMNS.join(';')}\r\n`);
mediumContains invisible characters
Zero-width and other invisible characters can hide words or split them so filters and reviewers miss them.
test/repository.test.ts:270 expect(lines[0]?.startsWith('⟦U+FEFF⟧cnpj;razao_social;')).toBe(true);
mediumPersonal contact data of MEIs returned by default
Search, detail and export return phone numbers and e-mails of sole proprietors (MEIs) unless the agent explicitly asks to hide them. This data is public Receita Federal data and the README discloses the issue and gives LGPD guidance. Still, bulk export of up to 200,000 rows of contacts that may belong to individuals is a privacy risk users should know about. CPFs are actively stripped from free-text fields.
src/domain/filters.ts:85 .default(false)
src/domain/filters.ts:87 'Ocultar telefone e e-mail de MEIs, que costumam ser os da própria pessoa física. Use ao compartilhar os resultados.',
src/mcp/tools.ts:14 const MAX_EXPORT_ROWS = 200_000;
Keep an eye on it
This check is of one commit. Watch radar-cnpj-mcp and we'll email you if a later commit changes what it can touch.
About this check
Checked November 3, 2026 at commit 1b8f6e711205, 56 files. Rules for known red flags, then two Claude reviews, one of them told to assume the author is malicious. A later commit hasn't been checked. How checks work.