@mcpassure/mcp-anvisa-bulario 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -8,9 +8,10 @@
8
8
 
9
9
  Enables AI agents (Claude, GPT, Copilot) to query drug leaflets (bulas), active ingredients, therapeutic classes, and other metadata for medications registered in Brazil, with structured responses and efficient caching.
10
10
 
11
- [![CI](https://github.com/mcpassure/mcp-anvisa-bulario/actions/workflows/ci.yml/badge.svg)](https://github.com/mcpassure/mcp-anvisa-bulario/actions)
12
11
  [![npm](https://img.shields.io/npm/v/@mcpassure/mcp-anvisa-bulario)](https://www.npmjs.com/package/@mcpassure/mcp-anvisa-bulario)
13
12
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
13
+ [![OSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/mcpassure/monorepo/badge)](https://securityscorecards.dev/viewer/?uri=github.com/mcpassure/monorepo)
14
+ [![SAFE-MCP](https://img.shields.io/badge/SAFE--MCP-mapped-green)](#safe-mcp-mapping)
14
15
 
15
16
  ---
16
17
 
@@ -89,13 +90,7 @@ Add to `claude_desktop_config.json`:
89
90
 
90
91
  ## Demo
91
92
 
92
- ![Demo](./.github/assets/demo.gif)
93
-
94
- To run locally:
95
-
96
- ```bash
97
- npm run demo
98
- ```
93
+ 🚧 Demo GIF coming soon.
99
94
 
100
95
  ---
101
96
 
@@ -194,3 +189,34 @@ Maintained by [MCPAssure Brasil](https://github.com/mcpassure). See [CONTRIBUTIN
194
189
  ---
195
190
 
196
191
  Part of the [MCPAssure](https://github.com/mcpassure) catalog — curated MCP examples for Brazilian healthcare.
192
+
193
+ ---
194
+
195
+ ## SAFE-MCP Mapping
196
+
197
+ Assessment against the SAFE-MCP framework (OpenSSF + LF + OpenID Foundation).
198
+
199
+ ### Mitigated attacks
200
+
201
+ | ID | Attack | Status | How we mitigate it |
202
+ |----|--------|--------|-------------------|
203
+ | SAFE-T001 | Tool Poisoning | ✓ Mitigated | Strict Zod schema; drug names validated before querying the database |
204
+ | SAFE-T002 | Indirect Prompt Injection | ✓ Mitigated | Structured output (`structuredContent`); ANVISA content is tabular, no executable markup |
205
+ | SAFE-T003 | Credential exposure | ✓ Mitigated | Public ANVISA data with no authentication; R2 only in server-side Worker |
206
+ | SAFE-T004 | Data exfiltration | ✓ Mitigated | Read-only on public drug data; no access to user data |
207
+ | SAFE-T005 | Resource exhaustion | ✓ Mitigated | Local SQLite cache (18MB); canary uses HEAD request or single header download |
208
+
209
+ ### NOT mitigated (honest declaration)
210
+
211
+ | ID | Attack | Why not mitigated |
212
+ |----|--------|------------------|
213
+ | SAFE-T010 | Supply-chain attack via npm | `pnpm audit` + Renovate; no SBOM generated yet |
214
+ | SAFE-T015 | Side-channel timing analysis | Not relevant for public tabular drug data |
215
+
216
+ ### Lethal Trifecta Declaration (Willison, 2025)
217
+
218
+ 1. **Private data access** — ✗ **Absent.** ANVISA Bulário is entirely public; no patient data is accessed.
219
+ 2. **Untrusted content exposure** — ⚠ **Partial.** Inputs validated by Zod; ANVISA data is governmental.
220
+ 3. **External communication capability** — ✗ **Absent.** MCP operates on local SQLite cache; no runtime external calls.
221
+
222
+ **Conclusion:** this MCP **does not combine all 3 factors simultaneously**. Local-first architecture eliminates the external communication factor.
package/README.md CHANGED
@@ -8,9 +8,10 @@
8
8
 
9
9
  Permite que agentes de IA (Claude, GPT, Copilot) consultem bulas, princípios ativos, classes terapêuticas e demais metadados de medicamentos registrados no Brasil com resposta estruturada e cache eficiente.
10
10
 
11
- [![CI](https://github.com/mcpassure/mcp-anvisa-bulario/actions/workflows/ci.yml/badge.svg)](https://github.com/mcpassure/mcp-anvisa-bulario/actions)
12
11
  [![npm](https://img.shields.io/npm/v/@mcpassure/mcp-anvisa-bulario)](https://www.npmjs.com/package/@mcpassure/mcp-anvisa-bulario)
13
12
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
13
+ [![OSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/mcpassure/monorepo/badge)](https://securityscorecards.dev/viewer/?uri=github.com/mcpassure/monorepo)
14
+ [![SAFE-MCP](https://img.shields.io/badge/SAFE--MCP-mapped-green)](#safe-mcp-mapping)
14
15
 
15
16
  ---
16
17
 
@@ -90,13 +91,7 @@ Adicione ao `claude_desktop_config.json`:
90
91
 
91
92
  ## Demo
92
93
 
93
- ![Demo](./.github/assets/demo.gif)
94
-
95
- Para rodar localmente:
96
-
97
- ```bash
98
- npm run demo
99
- ```
94
+ 🚧 Demo GIF em breve.
100
95
 
101
96
  ---
102
97
 
@@ -190,3 +185,34 @@ Mantido pela [MCPAssure Brasil](https://github.com/mcpassure). Consulte [CONTRIB
190
185
  ---
191
186
 
192
187
  Parte do catálogo [MCPAssure](https://github.com/mcpassure) — exemplos de curadoria de MCPs para saúde brasileira.
188
+
189
+ ---
190
+
191
+ ## SAFE-MCP Mapping
192
+
193
+ Avaliação contra o framework SAFE-MCP (OpenSSF + LF + OpenID Foundation).
194
+
195
+ ### Ataques mitigados
196
+
197
+ | ID | Ataque | Status | Como mitigamos |
198
+ |----|--------|--------|----------------|
199
+ | SAFE-T001 | Tool Poisoning | ✓ Mitigado | Schema Zod estrito; nomes de medicamentos validados antes de consultar banco |
200
+ | SAFE-T002 | Indirect Prompt Injection | ✓ Mitigado | Output estruturado (`structuredContent`); conteúdo ANVISA é tabular, sem markup executável |
201
+ | SAFE-T003 | Credential exposure | ✓ Mitigado | Dados públicos ANVISA sem autenticação; R2 apenas em Worker server-side |
202
+ | SAFE-T004 | Data exfiltration | ✓ Mitigado | Read-only sobre dados públicos de medicamentos; sem acesso a dados de usuário |
203
+ | SAFE-T005 | Resource exhaustion | ✓ Mitigado | Cache SQLite local (18MB); canary usa HEAD request ou download único de header |
204
+
205
+ ### Ataques NÃO mitigados (declaração honesta)
206
+
207
+ | ID | Ataque | Por que não mitigado |
208
+ |----|--------|---------------------|
209
+ | SAFE-T010 | Supply-chain attack via npm | `pnpm audit` + Renovate; sem SBOM gerado ainda |
210
+ | SAFE-T015 | Side-channel timing analysis | Não relevante para dados públicos tabelados de medicamentos |
211
+
212
+ ### Lethal Trifecta Declaration (Willison, 2025)
213
+
214
+ 1. **Acesso a dados privados** — ✗ **Ausente.** Bulário ANVISA é integralmente público; nenhum dado de paciente é acessado.
215
+ 2. **Exposição a conteúdo não-confiável** — ⚠ **Parcial.** Inputs validados por Zod; dados ANVISA são governamentais.
216
+ 3. **Capacidade de comunicação externa** — ✗ **Ausente.** MCP opera sobre banco SQLite local; sem chamadas em runtime.
217
+
218
+ **Conclusão:** este MCP **não combina os 3 fatores simultaneamente**. Arquitetura local-first elimina o fator de comunicação externa.
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAoCA,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAuDD,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,YAAY,GAAG,YAAY,GAAG,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACtF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC,CAwE9D"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAwCA,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAgDD,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,YAAY,GAAG,YAAY,GAAG,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACtF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC,CAkD9D"}
package/dist/bootstrap.js CHANGED
@@ -3,10 +3,12 @@ import { existsSync } from "node:fs";
3
3
  import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
4
4
  import { homedir } from "node:os";
5
5
  import { dirname, join } from "node:path";
6
- import { AwsClient } from "aws4fetch";
7
6
  const DATASET = "anvisa-bulario";
8
- const BUCKET = "mcpassure-datasets";
9
- const MANIFEST_KEY = `bulario/latest/manifest.json`;
7
+ const MANIFEST_KEY = "bulario/latest/manifest.json";
8
+ const ARTIFACT_KEY = "bulario/latest/bulario.db";
9
+ // URL pública do bucket R2 (sem credenciais para o usuário final).
10
+ // Sobreposta por MCPASSURE_CDN_BASE em desenvolvimento/testes.
11
+ const CDN_BASE = process.env.MCPASSURE_CDN_BASE ?? "https://pub-046c52795b9445cd9f5cc5cb21b9d59f.r2.dev";
10
12
  function getDataDir() {
11
13
  return process.platform === "win32"
12
14
  ? join(process.env.APPDATA ?? homedir(), "mcpassure", DATASET)
@@ -21,22 +23,22 @@ function getLocalManifestPath() {
21
23
  function log(msg) {
22
24
  process.stderr.write(`[bootstrap] ${msg}\n`);
23
25
  }
24
- async function fetchManifest(client, endpoint) {
25
- const url = `${endpoint}/${BUCKET}/${MANIFEST_KEY}`;
26
- const resp = await client.fetch(url);
26
+ async function fetchManifest() {
27
+ const url = `${CDN_BASE}/${MANIFEST_KEY}`;
28
+ const resp = await fetch(url, { signal: AbortSignal.timeout(30_000) });
27
29
  if (!resp.ok) {
28
30
  throw new Error(`HTTP ${resp.status} ao buscar manifest em ${url}`);
29
31
  }
30
32
  return (await resp.json());
31
33
  }
32
- async function downloadAndVerify(client, endpoint, manifest, targetPath) {
33
- const url = `${endpoint}/${manifest.artifact.bucket}/${manifest.artifact.key}`;
34
+ async function downloadAndVerify(manifest, targetPath) {
35
+ const url = `${CDN_BASE}/${ARTIFACT_KEY}`;
34
36
  const tmp = `${targetPath}.download`;
35
37
  await mkdir(dirname(targetPath), { recursive: true });
36
- log(`Baixando ${url} (${(manifest.artifact.size_bytes / 1024 / 1024).toFixed(1)} MB)...`);
37
- const resp = await client.fetch(url);
38
+ log(`Baixando ${(manifest.artifact.size_bytes / 1024 / 1024).toFixed(1)} MB...`);
39
+ const resp = await fetch(url, { signal: AbortSignal.timeout(120_000) });
38
40
  if (!resp.ok) {
39
- throw new Error(`HTTP ${resp.status} ao baixar artifact ${url}`);
41
+ throw new Error(`HTTP ${resp.status} ao baixar dataset`);
40
42
  }
41
43
  const buf = Buffer.from(await resp.arrayBuffer());
42
44
  if (buf.length !== manifest.artifact.size_bytes) {
@@ -44,48 +46,30 @@ async function downloadAndVerify(client, endpoint, manifest, targetPath) {
44
46
  }
45
47
  const hash = createHash("sha256").update(buf).digest("hex");
46
48
  if (hash.toLowerCase() !== manifest.artifact.sha256.toLowerCase()) {
47
- throw new Error(`Checksum SHA-256 não bate. Esperado ${manifest.artifact.sha256}, recebido ${hash}.`);
49
+ throw new Error(`Checksum SHA-256 não bate.`);
48
50
  }
49
51
  await writeFile(tmp, buf);
50
52
  await rename(tmp, targetPath);
51
- log(`Download concluído. SHA-256 validado.`);
53
+ log("Download concluído. SHA-256 validado.");
52
54
  }
53
55
  export async function ensureDataset() {
54
56
  const dbPath = getDbPath();
55
57
  const manifestPath = getLocalManifestPath();
56
58
  const dbExists = existsSync(dbPath);
57
- const accessKey = process.env.MCPASSURE_R2_ACCESS_KEY_ID;
58
- const secretKey = process.env.MCPASSURE_R2_SECRET_ACCESS_KEY;
59
- const endpoint = process.env.MCPASSURE_R2_ENDPOINT;
60
- if (!accessKey || !secretKey || !endpoint) {
61
- if (dbExists) {
62
- log("Credenciais R2 ausentes — usando cache local existente.");
63
- return { ok: true, action: "skipped_offline", version: "local" };
64
- }
65
- return {
66
- ok: false,
67
- reason: "Cache local inexistente e credenciais R2 ausentes. " +
68
- "Configure MCPASSURE_R2_ACCESS_KEY_ID, MCPASSURE_R2_SECRET_ACCESS_KEY e MCPASSURE_R2_ENDPOINT, " +
69
- "ou execute `npm run sync` para popular o dataset local.",
70
- };
71
- }
72
- const client = new AwsClient({
73
- accessKeyId: accessKey,
74
- secretAccessKey: secretKey,
75
- service: "s3",
76
- region: "auto",
77
- });
78
59
  let remoteManifest;
79
60
  try {
80
- remoteManifest = await fetchManifest(client, endpoint);
61
+ remoteManifest = await fetchManifest();
81
62
  }
82
63
  catch (err) {
83
64
  const reason = err instanceof Error ? err.message : String(err);
84
65
  if (dbExists) {
85
- log(`Falha ao buscar manifest remoto (${reason}). Usando cache local.`);
66
+ log(`Sem acesso ao CDN (${reason}). Usando cache local.`);
86
67
  return { ok: true, action: "skipped_offline", version: "stale" };
87
68
  }
88
- return { ok: false, reason: `Sem cache e sem rede: ${reason}` };
69
+ return {
70
+ ok: false,
71
+ reason: `Dataset não encontrado localmente e CDN inacessível: ${reason}`,
72
+ };
89
73
  }
90
74
  if (dbExists && existsSync(manifestPath)) {
91
75
  try {
@@ -93,14 +77,14 @@ export async function ensureDataset() {
93
77
  if (localManifest.version === remoteManifest.version) {
94
78
  return { ok: true, action: "up_to_date", version: localManifest.version };
95
79
  }
96
- log(`Versão local (${localManifest.version}) difere de remota (${remoteManifest.version}). Atualizando.`);
80
+ log(`Versão local (${localManifest.version}) difere da remota (${remoteManifest.version}). Atualizando.`);
97
81
  }
98
82
  catch {
99
83
  log("Manifest local corrompido. Re-baixando.");
100
84
  }
101
85
  }
102
86
  try {
103
- await downloadAndVerify(client, endpoint, remoteManifest, dbPath);
87
+ await downloadAndVerify(remoteManifest, dbPath);
104
88
  await writeFile(manifestPath, JSON.stringify(remoteManifest, null, 2));
105
89
  return { ok: true, action: "downloaded", version: remoteManifest.version };
106
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcpassure/mcp-anvisa-bulario",
3
- "version": "2.0.0",
3
+ "version": "2.1.1",
4
4
  "mcpName": "io.github.mcpassure/mcp-anvisa-bulario",
5
5
  "description": "MCP server para consulta do Bulário Eletrônico da ANVISA via CSV oficial",
6
6
  "license": "MIT",
@@ -32,24 +32,6 @@
32
32
  "README.md",
33
33
  "LICENSE"
34
34
  ],
35
- "scripts": {
36
- "build": "tsc -p tsconfig.build.json",
37
- "start": "node dist/index.js",
38
- "dev": "tsx src/index.ts",
39
- "test": "vitest run",
40
- "test:watch": "vitest",
41
- "test:integration": "tsx integration-tests/bin/run-all.ts",
42
- "test:integration:offline": "tsx integration-tests/bin/run-all.ts --offline",
43
- "lint": "biome check src tests evals integration-tests test-utils",
44
- "lint:fix": "biome check --write src tests evals integration-tests test-utils",
45
- "format": "biome format --write src tests evals integration-tests test-utils",
46
- "typecheck": "tsc --noEmit",
47
- "sync": "tsx src/scripts/sync.ts",
48
- "evals": "tsx evals/runner.ts",
49
- "canary": "tsx src/scripts/canary.ts",
50
- "demo": "tsx scripts/demo.ts",
51
- "prepublishOnly": "npm run lint && npm run typecheck && npm run test && npm run build"
52
- },
53
35
  "dependencies": {
54
36
  "@modelcontextprotocol/sdk": "^1.29.0",
55
37
  "aws4fetch": "^1.0.20",
@@ -62,9 +44,29 @@
62
44
  "@types/node": "^22.10.0",
63
45
  "tsx": "^4.21.0",
64
46
  "typescript": "^5.9.3",
65
- "vitest": "^4.1.6"
47
+ "vitest": "^4.1.6",
48
+ "@mcpassure/test-utils": "0.1.0"
66
49
  },
67
50
  "engines": {
68
51
  "node": ">=22.0.0"
52
+ },
53
+ "scripts": {
54
+ "build": "tsc -p tsconfig.build.json",
55
+ "start": "node dist/index.js",
56
+ "dev": "tsx src/index.ts",
57
+ "test": "vitest run --exclude tests/e2e",
58
+ "test:e2e": "vitest run tests/e2e",
59
+ "test:watch": "vitest",
60
+ "test:integration": "tsx integration-tests/bin/run-all.ts",
61
+ "test:integration:offline": "tsx integration-tests/bin/run-all.ts --offline",
62
+ "lint": "biome check src tests evals integration-tests test-utils",
63
+ "lint:fix": "biome check --write src tests evals integration-tests test-utils",
64
+ "format": "biome format --write src tests evals integration-tests test-utils",
65
+ "typecheck": "tsc --noEmit",
66
+ "sync": "tsx src/scripts/sync.ts",
67
+ "evals": "tsx evals/runner.ts",
68
+ "canary": "tsx src/scripts/canary.ts",
69
+ "schema:check": "tsx scripts/schema-check.ts",
70
+ "demo": "tsx scripts/demo.ts"
69
71
  }
70
- }
72
+ }
@@ -1,2 +0,0 @@
1
- export { HttpClient } from "./http.js";
2
- //# sourceMappingURL=playwright-http.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"playwright-http.d.ts","sourceRoot":"","sources":["../../src/utils/playwright-http.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -1,4 +0,0 @@
1
- // Consolidado em ./http.ts — este arquivo será removido na próxima limpeza.
2
- // Re-export pra manter qualquer import legacy funcionando temporariamente.
3
- export { HttpClient } from "./http.js";
4
- //# sourceMappingURL=playwright-http.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"playwright-http.js","sourceRoot":"","sources":["../../src/utils/playwright-http.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}