@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 +34 -8
- package/README.md +34 -8
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +23 -39
- package/dist/bootstrap.js.map +1 -1
- package/dist/index.js +0 -0
- package/package.json +23 -21
- package/dist/utils/playwright-http.d.ts +0 -2
- package/dist/utils/playwright-http.d.ts.map +0 -1
- package/dist/utils/playwright-http.js +0 -4
- package/dist/utils/playwright-http.js.map +0 -1
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
|
-
[](https://github.com/mcpassure/mcp-anvisa-bulario/actions)
|
|
12
11
|
[](https://www.npmjs.com/package/@mcpassure/mcp-anvisa-bulario)
|
|
13
12
|
[](LICENSE)
|
|
13
|
+
[](https://securityscorecards.dev/viewer/?uri=github.com/mcpassure/monorepo)
|
|
14
|
+
[](#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
|
-
|
|
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
|
-
[](https://github.com/mcpassure/mcp-anvisa-bulario/actions)
|
|
12
11
|
[](https://www.npmjs.com/package/@mcpassure/mcp-anvisa-bulario)
|
|
13
12
|
[](LICENSE)
|
|
13
|
+
[](https://securityscorecards.dev/viewer/?uri=github.com/mcpassure/monorepo)
|
|
14
|
+
[](#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
|
-
|
|
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.
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"
|
|
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
|
|
9
|
-
const
|
|
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(
|
|
25
|
-
const url = `${
|
|
26
|
-
const resp = await
|
|
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(
|
|
33
|
-
const url = `${
|
|
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 ${
|
|
37
|
-
const resp = await
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(`
|
|
66
|
+
log(`Sem acesso ao CDN (${reason}). Usando cache local.`);
|
|
86
67
|
return { ok: true, action: "skipped_offline", version: "stale" };
|
|
87
68
|
}
|
|
88
|
-
return {
|
|
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
|
|
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(
|
|
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
|
}
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
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.
|
|
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 +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 +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"}
|