@mcpassure/mcp-anvisa-bulario 0.1.0 → 2.0.0

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.
Files changed (41) hide show
  1. package/dist/bootstrap.d.ts +11 -0
  2. package/dist/bootstrap.d.ts.map +1 -0
  3. package/dist/bootstrap.js +120 -0
  4. package/dist/bootstrap.js.map +1 -0
  5. package/dist/config.d.ts +10 -7
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +11 -12
  8. package/dist/config.js.map +1 -1
  9. package/dist/db/dataset.d.ts +15 -0
  10. package/dist/db/dataset.d.ts.map +1 -0
  11. package/dist/db/dataset.js +168 -0
  12. package/dist/db/dataset.js.map +1 -0
  13. package/dist/db/schema.d.ts +11 -0
  14. package/dist/db/schema.d.ts.map +1 -0
  15. package/dist/db/schema.js +48 -0
  16. package/dist/db/schema.js.map +1 -0
  17. package/dist/domain/repository.d.ts +11 -5
  18. package/dist/domain/repository.d.ts.map +1 -1
  19. package/dist/domain/repository.js +38 -58
  20. package/dist/domain/repository.js.map +1 -1
  21. package/dist/index.js +15 -14
  22. package/dist/index.js.map +1 -1
  23. package/dist/schemas/tools.d.ts +4 -4
  24. package/dist/server.js +1 -1
  25. package/dist/tools/consultar-bula.d.ts +10 -0
  26. package/dist/tools/consultar-bula.d.ts.map +1 -1
  27. package/dist/tools/consultar-bula.js +41 -23
  28. package/dist/tools/consultar-bula.js.map +1 -1
  29. package/dist/tools/listar-apresentacoes.d.ts +7 -0
  30. package/dist/tools/listar-apresentacoes.d.ts.map +1 -1
  31. package/dist/tools/listar-apresentacoes.js +26 -8
  32. package/dist/tools/listar-apresentacoes.js.map +1 -1
  33. package/dist/tools/shared.d.ts +20 -11
  34. package/dist/tools/shared.d.ts.map +1 -1
  35. package/dist/tools/shared.js +50 -10
  36. package/dist/tools/shared.js.map +1 -1
  37. package/dist/utils/http.d.ts +12 -33
  38. package/dist/utils/http.d.ts.map +1 -1
  39. package/dist/utils/http.js +15 -167
  40. package/dist/utils/http.js.map +1 -1
  41. package/package.json +4 -4
@@ -1,4 +1,3 @@
1
- import { DEFAULT_TTLS } from "../cache/types.js";
2
1
  import { buildMeta } from "../utils/meta.js";
3
2
  export class AllSourcesFailedError extends Error {
4
3
  failures;
@@ -9,80 +8,61 @@ export class AllSourcesFailedError extends Error {
9
8
  this.failures = failures;
10
9
  }
11
10
  }
11
+ /**
12
+ * BularioRepository v2.0
13
+ *
14
+ * Accesses the ANVISA dataset directly via BularioDatasetSource (SQLite).
15
+ * The old multi-source + cache pattern is replaced by a single SQLite source.
16
+ * _meta.modo is always "cache_local" (data is pre-synced locally).
17
+ */
12
18
  export class BularioRepository {
13
- cache;
14
- sources;
19
+ source;
15
20
  degradedThresholdDays;
16
- constructor(cache, sources, degradedThresholdDays = 30) {
17
- this.cache = cache;
18
- this.sources = sources;
21
+ dataBase;
22
+ constructor(source, degradedThresholdDays = 7) {
23
+ this.source = source;
19
24
  this.degradedThresholdDays = degradedThresholdDays;
25
+ // Use current date as data_da_base — will be replaced by dataset_meta in a future version
26
+ this.dataBase = new Date().toISOString();
27
+ }
28
+ buildResponse(data) {
29
+ return {
30
+ data,
31
+ _meta: buildMeta({
32
+ dataBase: this.dataBase,
33
+ fonte: this.source.name,
34
+ modo: "cache_local",
35
+ degradedThresholdDays: this.degradedThresholdDays,
36
+ }),
37
+ };
20
38
  }
21
39
  async searchByName(params) {
22
- const key = `search:name:${params.nome.toLowerCase().trim()}:${params.pagina ?? 1}:${params.count ?? 10}`;
23
- return this._withCache(key, DEFAULT_TTLS.searchResults, (src) => src.searchByName(params));
40
+ const data = await this.source.searchByName(params);
41
+ return this.buildResponse(data);
24
42
  }
25
43
  async searchByPrincipalAtivo(params) {
26
- const key = `search:pa:${params.principioAtivo.toLowerCase().trim()}:${params.pagina ?? 1}:${params.count ?? 10}`;
27
- return this._withCache(key, DEFAULT_TTLS.searchResults, (src) => src.searchByPrincipalAtivo(params));
44
+ const data = await this.source.searchByPrincipalAtivo(params);
45
+ return this.buildResponse(data);
28
46
  }
29
47
  async searchByClasseTerapeutica(params) {
30
- const key = `search:ct:${params.classeTerapeutica.toLowerCase().trim()}:${params.pagina ?? 1}:${params.count ?? 10}`;
31
- return this._withCache(key, DEFAULT_TTLS.searchResults, (src) => src.searchByClasseTerapeutica(params));
48
+ const data = await this.source.searchByClasseTerapeutica(params);
49
+ return this.buildResponse(data);
32
50
  }
33
51
  async searchByTarja(params) {
34
- const key = `search:tarja:${params.tarja}:${params.pagina ?? 1}:${params.count ?? 10}`;
35
- return this._withCache(key, DEFAULT_TTLS.searchResults, (src) => src.searchByTarja(params));
52
+ const data = await this.source.searchByTarja(params);
53
+ return this.buildResponse(data);
36
54
  }
37
55
  async getDetalhes(numProcesso) {
38
- const key = `medicamento:${numProcesso}`;
39
- return this._withCache(key, DEFAULT_TTLS.medicamentoDetalhes, (src) => src.getDetalhes(numProcesso));
56
+ const data = await this.source.getDetalhes(numProcesso);
57
+ return this.buildResponse(data);
40
58
  }
41
59
  async getApresentacoes(numProcesso) {
42
- const key = `apresentacoes:${numProcesso}`;
43
- return this._withCache(key, DEFAULT_TTLS.medicamentoDetalhes, (src) => src.getApresentacoes(numProcesso));
60
+ const data = await this.source.getApresentacoes(numProcesso);
61
+ return this.buildResponse(data);
44
62
  }
45
63
  async getBulaLink(idBulaProtegido) {
46
- const key = `bula:link:${idBulaProtegido}`;
47
- return this._withCache(key, DEFAULT_TTLS.bulaLink, (src) => src.getBulaLink(idBulaProtegido));
48
- }
49
- async _withCache(key, ttlSeconds, fetch) {
50
- const cached = this.cache.get(key);
51
- if (cached) {
52
- return {
53
- data: cached.value,
54
- _meta: buildMeta({
55
- dataBase: cached.data_da_base,
56
- fonte: "cache_local",
57
- modo: "cache_local",
58
- degradedThresholdDays: this.degradedThresholdDays,
59
- }),
60
- };
61
- }
62
- const failures = [];
63
- for (const source of this.sources) {
64
- try {
65
- const data = await fetch(source);
66
- const dataBase = new Date().toISOString();
67
- this.cache.set(key, data, ttlSeconds, dataBase);
68
- return {
69
- data,
70
- _meta: buildMeta({
71
- dataBase,
72
- fonte: source.name,
73
- modo: "online",
74
- degradedThresholdDays: this.degradedThresholdDays,
75
- }),
76
- };
77
- }
78
- catch (err) {
79
- failures.push({
80
- source: source.name,
81
- error: err instanceof Error ? err : new Error(String(err)),
82
- });
83
- }
84
- }
85
- throw new AllSourcesFailedError(failures);
64
+ const data = await this.source.getBulaLink(idBulaProtegido);
65
+ return this.buildResponse(data);
86
66
  }
87
67
  }
88
68
  //# sourceMappingURL=repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/domain/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/domain/repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAe7C,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,QAAQ,CAA0C;IAE3D,YAAY,QAAiD;QAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,KAAK,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAgBD;;;;;;GAMG;AACH,MAAM,OAAO,iBAAiB;IAIT;IACA;IAJF,QAAQ,CAAS;IAElC,YACmB,MAAqB,EACrB,wBAAwB,CAAC;QADzB,WAAM,GAAN,MAAM,CAAe;QACrB,0BAAqB,GAArB,qBAAqB,CAAI;QAE1C,0FAA0F;QAC1F,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IAEO,aAAa,CAAI,IAAO;QAC9B,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,SAAS,CAAC;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACvB,IAAI,EAAE,aAAa;gBACnB,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;aAClD,CAAC;SACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,MAAoC;QAEpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,yBAAyB,CAC7B,MAAuC;QAEvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAA2B;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAmB;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,WAAmB;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,eAAuB;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACF"}
package/dist/index.js CHANGED
@@ -1,25 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
- import { SqliteCache } from "./cache/sqlite-cache.js";
4
- import { loadConfig } from "./config.js";
3
+ import { ensureDataset, getDbPath } from "./bootstrap.js";
4
+ import { BularioDatasetSource } from "./db/dataset.js";
5
5
  import { BularioRepository } from "./domain/repository.js";
6
6
  import { createServer } from "./server.js";
7
- import { AnvisaApiSource } from "./sources/anvisa-api.js";
8
7
  async function main() {
9
- const config = loadConfig();
10
- const cache = new SqliteCache(config.cachePath);
11
- const sources = [
12
- new AnvisaApiSource(config.anvisaBaseUrl, config.maxRetries, config.baseDelayMs, config.requestTimeoutMs),
13
- // v1.1+: new AnvisaDadosAbertosSource(config),
14
- // v1.2+: new AnvisaPortalBularioSource(config),
15
- ];
16
- const repository = new BularioRepository(cache, sources);
8
+ // Step 1: Ensure dataset is available (R2 bootstrap or local cache)
9
+ const bootstrapResult = await ensureDataset();
10
+ if (!bootstrapResult.ok) {
11
+ process.stderr.write(`[startup] ERRO: ${bootstrapResult.reason}\n` +
12
+ `Dica: Execute 'npm run sync' para popular o dataset local a partir do CSV da ANVISA.\n`);
13
+ process.exit(1);
14
+ }
15
+ process.stderr.write(`[startup] Dataset pronto (${bootstrapResult.action} v${bootstrapResult.version})\n`);
16
+ // Step 2: Open SQLite dataset
17
+ const dbPath = getDbPath();
18
+ const source = new BularioDatasetSource(dbPath);
19
+ const repository = new BularioRepository(source);
17
20
  const server = createServer(repository);
18
21
  const transport = new StdioServerTransport();
19
22
  async function shutdown() {
20
- // Fecha sources que têm recursos vivos (Playwright browser, etc.)
21
- await Promise.allSettled(sources.map((s) => s.close?.()));
22
- cache.close();
23
+ await source.close();
23
24
  process.exit(0);
24
25
  }
25
26
  process.on("SIGINT", () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,OAAO,GAAoB;QAC/B,IAAI,eAAe,CACjB,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,gBAAgB,CACxB;QACD,+CAA+C;QAC/C,gDAAgD;KACjD,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,KAAK,UAAU,QAAQ;QACrB,kEAAkE;QAClE,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1D,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,oEAAoE;IACpE,MAAM,eAAe,GAAG,MAAM,aAAa,EAAE,CAAC;IAE9C,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mBAAmB,eAAe,CAAC,MAAM,IAAI;YAC3C,wFAAwF,CAC3F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,eAAe,CAAC,MAAM,KAAK,eAAe,CAAC,OAAO,KAAK,CACrF,CAAC;IAEF,8BAA8B;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,KAAK,UAAU,QAAQ;QACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -38,8 +38,8 @@ export declare const MetaSchema: z.ZodObject<{
38
38
  online: "online";
39
39
  }>;
40
40
  status: z.ZodOptional<z.ZodEnum<{
41
- stale: "stale";
42
41
  ok: "ok";
42
+ stale: "stale";
43
43
  }>>;
44
44
  }, z.core.$strip>;
45
45
  export declare const MedicamentoListaOutputSchema: z.ZodObject<{
@@ -64,8 +64,8 @@ export declare const MedicamentoListaOutputSchema: z.ZodObject<{
64
64
  online: "online";
65
65
  }>;
66
66
  status: z.ZodOptional<z.ZodEnum<{
67
- stale: "stale";
68
67
  ok: "ok";
68
+ stale: "stale";
69
69
  }>>;
70
70
  }, z.core.$strip>;
71
71
  }, z.core.$strip>;
@@ -99,8 +99,8 @@ export declare const BulaOutputSchema: z.ZodObject<{
99
99
  online: "online";
100
100
  }>;
101
101
  status: z.ZodOptional<z.ZodEnum<{
102
- stale: "stale";
103
102
  ok: "ok";
103
+ stale: "stale";
104
104
  }>>;
105
105
  }, z.core.$strip>;
106
106
  }, z.core.$strip>;
@@ -122,8 +122,8 @@ export declare const ApresentacoesOutputSchema: z.ZodObject<{
122
122
  online: "online";
123
123
  }>;
124
124
  status: z.ZodOptional<z.ZodEnum<{
125
- stale: "stale";
126
125
  ok: "ok";
126
+ stale: "stale";
127
127
  }>>;
128
128
  }, z.core.$strip>;
129
129
  }, z.core.$strip>;
package/dist/server.js CHANGED
@@ -10,7 +10,7 @@ import { registerListarApresentacoes } from "./tools/listar-apresentacoes.js";
10
10
  export function createServer(repository) {
11
11
  const server = new McpServer({
12
12
  name: "mcpassure-anvisa-bulario",
13
- version: "1.0.0",
13
+ version: "2.0.0",
14
14
  });
15
15
  registerBuscarPorNome(server, repository);
16
16
  registerBuscarPorPrincipioAtivo(server, repository);
@@ -1,4 +1,14 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import type { IBularioRepository } from "../domain/repository.js";
3
+ /**
4
+ * consultar_bula — v2.0 limitation notice
5
+ *
6
+ * O texto completo de bula NÃO está disponível no CSV de dados abertos da ANVISA
7
+ * (DADOS_ABERTOS_MEDICAMENTOS.csv). Este endpoint retorna os metadados disponíveis
8
+ * do medicamento (classe terapêutica, princípio ativo, registro) e um aviso explicativo.
9
+ *
10
+ * O texto completo de bula está previsto para v2.1 via Worker Cloudflare que acessa
11
+ * a API bulario.anvisa.gov.br diretamente.
12
+ */
3
13
  export declare function registerConsultarBula(server: McpServer, repository: IBularioRepository): void;
4
14
  //# sourceMappingURL=consultar-bula.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"consultar-bula.d.ts","sourceRoot":"","sources":["../../src/tools/consultar-bula.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI,CA6C7F"}
1
+ {"version":3,"file":"consultar-bula.d.ts","sourceRoot":"","sources":["../../src/tools/consultar-bula.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAqD7F"}
@@ -1,38 +1,56 @@
1
- import { BulaOutputSchema, ConsultarBulaInputSchema } from "../schemas/tools.js";
2
- import { TOOL_ANNOTATIONS, toBulaResult, toErrorResult } from "./shared.js";
1
+ import { ConsultarBulaInputSchema } from "../schemas/tools.js";
2
+ import { TOOL_ANNOTATIONS, toErrorResult } from "./shared.js";
3
+ /**
4
+ * consultar_bula — v2.0 limitation notice
5
+ *
6
+ * O texto completo de bula NÃO está disponível no CSV de dados abertos da ANVISA
7
+ * (DADOS_ABERTOS_MEDICAMENTOS.csv). Este endpoint retorna os metadados disponíveis
8
+ * do medicamento (classe terapêutica, princípio ativo, registro) e um aviso explicativo.
9
+ *
10
+ * O texto completo de bula está previsto para v2.1 via Worker Cloudflare que acessa
11
+ * a API bulario.anvisa.gov.br diretamente.
12
+ */
3
13
  export function registerConsultarBula(server, repository) {
4
14
  server.registerTool("consultar_bula", {
5
15
  title: "Consultar Bula de Medicamento",
6
- description: "Retorna dados completos de um medicamento incluindo tarja, classe terapêutica, " +
7
- "princípio ativo e links para bula do paciente e do profissional de saúde (PDF). " +
16
+ description: "Retorna metadados disponíveis de um medicamento (classe terapêutica, " +
17
+ "princípio ativo, número de registro, situação). " +
18
+ "NOTA v2.0: O texto completo da bula e links PDF não estão disponíveis " +
19
+ "nesta versão (fonte CSV dados abertos ANVISA). " +
20
+ "Previsto para v2.1 via integração direta com bulario.anvisa.gov.br. " +
8
21
  "Requer o numProcesso obtido via busca de medicamentos.",
9
22
  inputSchema: ConsultarBulaInputSchema,
10
- outputSchema: BulaOutputSchema,
11
23
  annotations: TOOL_ANNOTATIONS,
12
24
  }, async (args) => {
13
25
  const { numProcesso } = args;
14
26
  try {
15
27
  const detalhesResult = await repository.getDetalhes(numProcesso);
16
- const detalhes = detalhesResult.data;
17
- const bulaPaciente = detalhes.idBulaPacienteProtegido
18
- ? (await repository.getBulaLink(detalhes.idBulaPacienteProtegido)).data
19
- : undefined;
20
- const bulaProfissional = detalhes.idBulaProfissionalProtegido
21
- ? (await repository.getBulaLink(detalhes.idBulaProfissionalProtegido)).data
22
- : undefined;
23
- return toBulaResult({
28
+ const det = detalhesResult.data;
29
+ const output = {
24
30
  data: {
25
- numProcesso: detalhes.numProcesso,
26
- nomeProduto: detalhes.nomeProduto,
27
- empresa: detalhes.empresa,
28
- tarja: detalhes.tarja,
29
- classesTerapeuticas: detalhes.classesTerapeuticas,
30
- principioAtivo: detalhes.principioAtivo,
31
- bulaPaciente,
32
- bulaProfissional,
31
+ numProcesso: det.numProcesso,
32
+ nomeProduto: det.nomeProduto,
33
+ empresa: det.empresa,
34
+ tarja: det.tarja,
35
+ classesTerapeuticas: det.classesTerapeuticas,
36
+ principioAtivo: det.principioAtivo,
37
+ numeroRegistro: det.numeroRegistro,
38
+ bulaPaciente: null,
39
+ bulaProfissional: null,
40
+ aviso_v2: "Texto completo de bula não disponível nesta versão (v2.0). " +
41
+ "Fonte: CSV dados.anvisa.gov.br não inclui bulas PDF. " +
42
+ "Previsto: v2.1 via Worker com acesso ao bulario.anvisa.gov.br.",
33
43
  },
34
- _meta: detalhesResult._meta,
35
- });
44
+ _meta: {
45
+ ...detalhesResult._meta,
46
+ terminologia: "Bulário ANVISA",
47
+ fonte: "ANVISA / dados.anvisa.gov.br",
48
+ },
49
+ };
50
+ return {
51
+ content: [{ type: "text", text: JSON.stringify(output, null, 2) }],
52
+ structuredContent: output,
53
+ };
36
54
  }
37
55
  catch (err) {
38
56
  return toErrorResult(err);
@@ -1 +1 @@
1
- {"version":3,"file":"consultar-bula.js","sourceRoot":"","sources":["../../src/tools/consultar-bula.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,UAA8B;IACrF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,+BAA+B;QACtC,WAAW,EACT,iFAAiF;YACjF,kFAAkF;YAClF,wDAAwD;QAC1D,WAAW,EAAE,wBAAwB;QACrC,YAAY,EAAE,gBAAgB;QAC9B,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC;YAErC,MAAM,YAAY,GAAG,QAAQ,CAAC,uBAAuB;gBACnD,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI;gBACvE,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,gBAAgB,GAAG,QAAQ,CAAC,2BAA2B;gBAC3D,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI;gBAC3E,CAAC,CAAC,SAAS,CAAC;YAEd,OAAO,YAAY,CAAC;gBAClB,IAAI,EAAE;oBACJ,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;oBACjD,cAAc,EAAE,QAAQ,CAAC,cAAc;oBACvC,YAAY;oBACZ,gBAAgB;iBACjB;gBACD,KAAK,EAAE,cAAc,CAAC,KAAK;aAC5B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"consultar-bula.js","sourceRoot":"","sources":["../../src/tools/consultar-bula.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,UAA8B;IACrF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,+BAA+B;QACtC,WAAW,EACT,uEAAuE;YACvE,kDAAkD;YAClD,wEAAwE;YACxE,iDAAiD;YACjD,sEAAsE;YACtE,wDAAwD;QAC1D,WAAW,EAAE,wBAAwB;QACrC,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACjE,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC;YAEhC,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE;oBACJ,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;oBAC5C,cAAc,EAAE,GAAG,CAAC,cAAc;oBAClC,cAAc,EAAE,GAAG,CAAC,cAAc;oBAClC,YAAY,EAAE,IAAI;oBAClB,gBAAgB,EAAE,IAAI;oBACtB,QAAQ,EACN,6DAA6D;wBAC7D,uDAAuD;wBACvD,gEAAgE;iBACnE;gBACD,KAAK,EAAE;oBACL,GAAG,cAAc,CAAC,KAAK;oBACvB,YAAY,EAAE,gBAAgB;oBAC9B,KAAK,EAAE,8BAA8B;iBACtC;aACF,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC3E,iBAAiB,EAAE,MAAM;aAC1B,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,11 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import type { IBularioRepository } from "../domain/repository.js";
3
+ /**
4
+ * listar_apresentacoes — v2.0 limitation notice
5
+ *
6
+ * O CSV de dados abertos da ANVISA não contém campo de apresentações farmacêuticas
7
+ * (concentração, forma farmacêutica, embalagem). Retorna informações de categoria,
8
+ * situação e princípio ativo disponíveis no dataset.
9
+ */
3
10
  export declare function registerListarApresentacoes(server: McpServer, repository: IBularioRepository): void;
4
11
  //# sourceMappingURL=listar-apresentacoes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"listar-apresentacoes.d.ts","sourceRoot":"","sources":["../../src/tools/listar-apresentacoes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,kBAAkB,GAC7B,IAAI,CAmCN"}
1
+ {"version":3,"file":"listar-apresentacoes.d.ts","sourceRoot":"","sources":["../../src/tools/listar-apresentacoes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,kBAAkB,GAC7B,IAAI,CAgDN"}
@@ -1,13 +1,21 @@
1
- import { ApresentacoesOutputSchema, ListarApresentacoesInputSchema } from "../schemas/tools.js";
2
- import { TOOL_ANNOTATIONS, toApresentacoesResult, toErrorResult } from "./shared.js";
1
+ import { ListarApresentacoesInputSchema } from "../schemas/tools.js";
2
+ import { TOOL_ANNOTATIONS, toErrorResult } from "./shared.js";
3
+ /**
4
+ * listar_apresentacoes — v2.0 limitation notice
5
+ *
6
+ * O CSV de dados abertos da ANVISA não contém campo de apresentações farmacêuticas
7
+ * (concentração, forma farmacêutica, embalagem). Retorna informações de categoria,
8
+ * situação e princípio ativo disponíveis no dataset.
9
+ */
3
10
  export function registerListarApresentacoes(server, repository) {
4
11
  server.registerTool("listar_apresentacoes", {
5
12
  title: "Listar Apresentações de Medicamento",
6
- description: "Lista as apresentações comerciais disponíveis de um medicamento " +
7
- "(concentrações, formas farmacêuticas, embalagens). " +
13
+ description: "Retorna informações disponíveis sobre um medicamento no dataset ANVISA dados abertos. " +
14
+ "NOTA v2.0: Apresentações farmacêuticas detalhadas (concentração, forma farmacêutica, " +
15
+ "embalagem) não estão disponíveis no CSV dados.anvisa.gov.br. " +
16
+ "Retorna categoria regulatória, situação de registro e princípio ativo. " +
8
17
  "Requer o numProcesso obtido via busca de medicamentos.",
9
18
  inputSchema: ListarApresentacoesInputSchema,
10
- outputSchema: ApresentacoesOutputSchema,
11
19
  annotations: TOOL_ANNOTATIONS,
12
20
  }, async (args) => {
13
21
  const { numProcesso } = args;
@@ -16,15 +24,25 @@ export function registerListarApresentacoes(server, repository) {
16
24
  repository.getDetalhes(numProcesso),
17
25
  repository.getApresentacoes(numProcesso),
18
26
  ]);
19
- return toApresentacoesResult({
27
+ const output = {
20
28
  data: {
21
29
  numProcesso,
22
30
  nomeProduto: detalhesResult.data.nomeProduto,
23
31
  empresa: detalhesResult.data.empresa,
24
32
  apresentacoes: apresentacoesResult.data,
33
+ aviso_v2: "Apresentações farmacêuticas detalhadas não disponíveis nesta versão (v2.0). " +
34
+ "Fonte: CSV dados.anvisa.gov.br não inclui concentração/forma farmacêutica/embalagem.",
25
35
  },
26
- _meta: detalhesResult._meta,
27
- });
36
+ _meta: {
37
+ ...detalhesResult._meta,
38
+ terminologia: "Bulário ANVISA",
39
+ fonte: "ANVISA / dados.anvisa.gov.br",
40
+ },
41
+ };
42
+ return {
43
+ content: [{ type: "text", text: JSON.stringify(output, null, 2) }],
44
+ structuredContent: output,
45
+ };
28
46
  }
29
47
  catch (err) {
30
48
  return toErrorResult(err);
@@ -1 +1 @@
1
- {"version":3,"file":"listar-apresentacoes.js","sourceRoot":"","sources":["../../src/tools/listar-apresentacoes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,UAAU,2BAA2B,CACzC,MAAiB,EACjB,UAA8B;IAE9B,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,qCAAqC;QAC5C,WAAW,EACT,kEAAkE;YAClE,qDAAqD;YACrD,wDAAwD;QAC1D,WAAW,EAAE,8BAA8B;QAC3C,YAAY,EAAE,yBAAyB;QACvC,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC9D,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC;gBACnC,UAAU,CAAC,gBAAgB,CAAC,WAAW,CAAC;aACzC,CAAC,CAAC;YAEH,OAAO,qBAAqB,CAAC;gBAC3B,IAAI,EAAE;oBACJ,WAAW;oBACX,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,WAAW;oBAC5C,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO;oBACpC,aAAa,EAAE,mBAAmB,CAAC,IAAI;iBACxC;gBACD,KAAK,EAAE,cAAc,CAAC,KAAK;aAC5B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"listar-apresentacoes.js","sourceRoot":"","sources":["../../src/tools/listar-apresentacoes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAiB,EACjB,UAA8B;IAE9B,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,qCAAqC;QAC5C,WAAW,EACT,wFAAwF;YACxF,uFAAuF;YACvF,+DAA+D;YAC/D,yEAAyE;YACzE,wDAAwD;QAC1D,WAAW,EAAE,8BAA8B;QAC3C,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC9D,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC;gBACnC,UAAU,CAAC,gBAAgB,CAAC,WAAW,CAAC;aACzC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE;oBACJ,WAAW;oBACX,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,WAAW;oBAC5C,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO;oBACpC,aAAa,EAAE,mBAAmB,CAAC,IAAI;oBACvC,QAAQ,EACN,8EAA8E;wBAC9E,sFAAsF;iBACzF;gBACD,KAAK,EAAE;oBACL,GAAG,cAAc,CAAC,KAAK;oBACvB,YAAY,EAAE,gBAAgB;oBAC9B,KAAK,EAAE,8BAA8B;iBACtC;aACF,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC3E,iBAAiB,EAAE,MAAM;aAC1B,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -3,9 +3,9 @@ export declare const TOOL_ANNOTATIONS: {
3
3
  readonly readOnlyHint: true;
4
4
  readonly idempotentHint: true;
5
5
  readonly destructiveHint: false;
6
- readonly openWorldHint: true;
6
+ readonly openWorldHint: false;
7
7
  };
8
- export declare const DISCLAIMER: string;
8
+ export declare const DISCLAIMER = "Dados informativos. N\u00E3o substitui consulta oficial ANVISA ou avalia\u00E7\u00E3o por profissional de sa\u00FAde habilitado.";
9
9
  export declare function toListResult(output: MedicamentoListaOutput): {
10
10
  content: {
11
11
  type: "text";
@@ -25,12 +25,15 @@ export declare function toListResult(output: MedicamentoListaOutput): {
25
25
  }[];
26
26
  };
27
27
  _meta: {
28
+ defasagem_dias: number;
29
+ status: "ok" | "stale";
30
+ terminologia: string;
31
+ versao: string;
28
32
  data_da_base: string;
29
33
  fonte: string;
30
- defasagem_dias: number;
31
- modo: "cache_local" | "online";
32
- status?: "stale" | "ok" | undefined;
34
+ modo: string;
33
35
  };
36
+ disclaimer: string;
34
37
  };
35
38
  };
36
39
  export declare function toBulaResult(output: BulaOutput): {
@@ -56,12 +59,15 @@ export declare function toBulaResult(output: BulaOutput): {
56
59
  } | undefined;
57
60
  };
58
61
  _meta: {
62
+ defasagem_dias: number;
63
+ status: "ok" | "stale";
64
+ terminologia: string;
65
+ versao: string;
59
66
  data_da_base: string;
60
67
  fonte: string;
61
- defasagem_dias: number;
62
- modo: "cache_local" | "online";
63
- status?: "stale" | "ok" | undefined;
68
+ modo: string;
64
69
  };
70
+ disclaimer: string;
65
71
  };
66
72
  };
67
73
  export declare function toApresentacoesResult(output: ApresentacoesOutput): {
@@ -79,12 +85,15 @@ export declare function toApresentacoesResult(output: ApresentacoesOutput): {
79
85
  }[];
80
86
  };
81
87
  _meta: {
88
+ defasagem_dias: number;
89
+ status: "ok" | "stale";
90
+ terminologia: string;
91
+ versao: string;
82
92
  data_da_base: string;
83
93
  fonte: string;
84
- defasagem_dias: number;
85
- modo: "cache_local" | "online";
86
- status?: "stale" | "ok" | undefined;
94
+ modo: string;
87
95
  };
96
+ disclaimer: string;
88
97
  };
89
98
  };
90
99
  export declare function toErrorResult(err: unknown): {
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEnG,eAAO,MAAM,gBAAgB;;;;;CAKnB,CAAC;AAEX,eAAO,MAAM,UAAU,QAEqE,CAAC;AAE7F,wBAAgB,YAAY,CAAC,MAAM,EAAE,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;EAK1D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK9C;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;EAKhE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO;;;;;;EAMzC"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEnG,eAAO,MAAM,gBAAgB;;;;;CAKnB,CAAC;AAEX,eAAO,MAAM,UAAU,qIACyF,CAAC;AAcjH,wBAAgB,YAAY,CAAC,MAAM,EAAE,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe1D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe9C;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;EAehE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO;;;;;;EAMzC"}
@@ -2,32 +2,72 @@ export const TOOL_ANNOTATIONS = {
2
2
  readOnlyHint: true,
3
3
  idempotentHint: true,
4
4
  destructiveHint: false,
5
- openWorldHint: true,
5
+ openWorldHint: false,
6
6
  };
7
- export const DISCLAIMER = "\n\n⚠️ Fonte de consulta farmacêutica oficial (ANVISA). " +
8
- "Não substitui avaliação, diagnóstico ou prescrição por profissional de saúde habilitado.";
7
+ export const DISCLAIMER = "Dados informativos. Não substitui consulta oficial ANVISA ou avaliação por profissional de saúde habilitado.";
8
+ function buildMeta(data_da_base) {
9
+ return {
10
+ terminologia: "Bulário ANVISA",
11
+ versao: "20260515",
12
+ data_da_base,
13
+ fonte: "ANVISA / dados.anvisa.gov.br",
14
+ defasagem_dias: 0,
15
+ modo: "cache_local",
16
+ status: "ok",
17
+ };
18
+ }
9
19
  export function toListResult(output) {
20
+ const meta = buildMeta(output._meta.data_da_base);
21
+ const structuredContent = {
22
+ data: output.data,
23
+ _meta: {
24
+ ...meta,
25
+ defasagem_dias: output._meta.defasagem_dias,
26
+ status: output._meta.status ?? "ok",
27
+ },
28
+ disclaimer: DISCLAIMER,
29
+ };
10
30
  return {
11
- content: [{ type: "text", text: JSON.stringify(output, null, 2) + DISCLAIMER }],
12
- structuredContent: output,
31
+ content: [{ type: "text", text: JSON.stringify(structuredContent, null, 2) }],
32
+ structuredContent,
13
33
  };
14
34
  }
15
35
  export function toBulaResult(output) {
36
+ const meta = buildMeta(output._meta.data_da_base);
37
+ const structuredContent = {
38
+ data: output.data,
39
+ _meta: {
40
+ ...meta,
41
+ defasagem_dias: output._meta.defasagem_dias,
42
+ status: output._meta.status ?? "ok",
43
+ },
44
+ disclaimer: DISCLAIMER,
45
+ };
16
46
  return {
17
- content: [{ type: "text", text: JSON.stringify(output, null, 2) + DISCLAIMER }],
18
- structuredContent: output,
47
+ content: [{ type: "text", text: JSON.stringify(structuredContent, null, 2) }],
48
+ structuredContent,
19
49
  };
20
50
  }
21
51
  export function toApresentacoesResult(output) {
52
+ const meta = buildMeta(output._meta.data_da_base);
53
+ const structuredContent = {
54
+ data: output.data,
55
+ _meta: {
56
+ ...meta,
57
+ defasagem_dias: output._meta.defasagem_dias,
58
+ status: output._meta.status ?? "ok",
59
+ },
60
+ disclaimer: DISCLAIMER,
61
+ };
22
62
  return {
23
- content: [{ type: "text", text: JSON.stringify(output, null, 2) + DISCLAIMER }],
24
- structuredContent: output,
63
+ content: [{ type: "text", text: JSON.stringify(structuredContent, null, 2) }],
64
+ structuredContent,
25
65
  };
26
66
  }
27
67
  export function toErrorResult(err) {
28
68
  const message = err instanceof Error ? err.message : String(err);
29
69
  return {
30
- content: [{ type: "text", text: `Erro ao consultar ANVISA: ${message}` }],
70
+ content: [{ type: "text", text: `Erro ao consultar base ANVISA: ${message}` }],
31
71
  isError: true,
32
72
  };
33
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,KAAK;IACtB,aAAa,EAAE,IAAI;CACX,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GACrB,0DAA0D;IAC1D,0FAA0F,CAAC;AAE7F,MAAM,UAAU,YAAY,CAAC,MAA8B;IACzD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC;QACxF,iBAAiB,EAAE,MAAM;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC7C,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC;QACxF,iBAAiB,EAAE,MAAM;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAA2B;IAC/D,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC;QACxF,iBAAiB,EAAE,MAAM;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,OAAO,EAAE,EAAE,CAAC;QAClF,OAAO,EAAE,IAAa;KACvB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"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"}