@mcpassure/mcp-anvisa-bulario 0.0.1 → 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.
- package/LICENSE +21 -0
- package/README.en.md +196 -0
- package/README.md +192 -5
- package/dist/bootstrap.d.ts +11 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +120 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cache/sqlite-cache.d.ts +13 -0
- package/dist/cache/sqlite-cache.d.ts.map +1 -0
- package/dist/cache/sqlite-cache.js +58 -0
- package/dist/cache/sqlite-cache.js.map +1 -0
- package/dist/cache/types.d.ts +17 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +7 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -0
- package/dist/db/dataset.d.ts +15 -0
- package/dist/db/dataset.d.ts.map +1 -0
- package/dist/db/dataset.js +168 -0
- package/dist/db/dataset.js.map +1 -0
- package/dist/db/schema.d.ts +11 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +48 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/domain/repository.d.ts +53 -0
- package/dist/domain/repository.d.ts.map +1 -0
- package/dist/domain/repository.js +68 -0
- package/dist/domain/repository.js.map +1 -0
- package/dist/domain/types.d.ts +2 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +2 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/handlers.d.ts +24 -0
- package/dist/prompts/handlers.d.ts.map +1 -0
- package/dist/prompts/handlers.js +267 -0
- package/dist/prompts/handlers.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +35 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/schemas.d.ts +22 -0
- package/dist/prompts/schemas.d.ts.map +1 -0
- package/dist/prompts/schemas.js +15 -0
- package/dist/prompts/schemas.js.map +1 -0
- package/dist/resources/handlers.d.ts +5 -0
- package/dist/resources/handlers.d.ts.map +1 -0
- package/dist/resources/handlers.js +145 -0
- package/dist/resources/handlers.js.map +1 -0
- package/dist/resources/index.d.ts +4 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +48 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/schemas/tools.d.ts +134 -0
- package/dist/schemas/tools.d.ts.map +1 -0
- package/dist/schemas/tools.js +106 -0
- package/dist/schemas/tools.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +25 -0
- package/dist/server.js.map +1 -0
- package/dist/sources/anvisa-api.d.ts +25 -0
- package/dist/sources/anvisa-api.d.ts.map +1 -0
- package/dist/sources/anvisa-api.js +153 -0
- package/dist/sources/anvisa-api.js.map +1 -0
- package/dist/sources/anvisa-dados-abertos.d.ts +12 -0
- package/dist/sources/anvisa-dados-abertos.d.ts.map +1 -0
- package/dist/sources/anvisa-dados-abertos.js +27 -0
- package/dist/sources/anvisa-dados-abertos.js.map +1 -0
- package/dist/sources/anvisa-portal.d.ts +12 -0
- package/dist/sources/anvisa-portal.d.ts.map +1 -0
- package/dist/sources/anvisa-portal.js +27 -0
- package/dist/sources/anvisa-portal.js.map +1 -0
- package/dist/sources/types.d.ts +56 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +2 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/tools/buscar-por-classe-terapeutica.d.ts +4 -0
- package/dist/tools/buscar-por-classe-terapeutica.d.ts.map +1 -0
- package/dist/tools/buscar-por-classe-terapeutica.js +30 -0
- package/dist/tools/buscar-por-classe-terapeutica.js.map +1 -0
- package/dist/tools/buscar-por-nome.d.ts +4 -0
- package/dist/tools/buscar-por-nome.d.ts.map +1 -0
- package/dist/tools/buscar-por-nome.js +25 -0
- package/dist/tools/buscar-por-nome.js.map +1 -0
- package/dist/tools/buscar-por-principio-ativo.d.ts +4 -0
- package/dist/tools/buscar-por-principio-ativo.d.ts.map +1 -0
- package/dist/tools/buscar-por-principio-ativo.js +25 -0
- package/dist/tools/buscar-por-principio-ativo.js.map +1 -0
- package/dist/tools/consultar-bula.d.ts +14 -0
- package/dist/tools/consultar-bula.d.ts.map +1 -0
- package/dist/tools/consultar-bula.js +60 -0
- package/dist/tools/consultar-bula.js.map +1 -0
- package/dist/tools/filtrar-por-tarja.d.ts +4 -0
- package/dist/tools/filtrar-por-tarja.d.ts.map +1 -0
- package/dist/tools/filtrar-por-tarja.js +29 -0
- package/dist/tools/filtrar-por-tarja.js.map +1 -0
- package/dist/tools/listar-apresentacoes.d.ts +11 -0
- package/dist/tools/listar-apresentacoes.d.ts.map +1 -0
- package/dist/tools/listar-apresentacoes.js +52 -0
- package/dist/tools/listar-apresentacoes.js.map +1 -0
- package/dist/tools/shared.d.ts +106 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +74 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/utils/backoff.d.ts +8 -0
- package/dist/utils/backoff.d.ts.map +1 -0
- package/dist/utils/backoff.js +37 -0
- package/dist/utils/backoff.js.map +1 -0
- package/dist/utils/http.d.ts +24 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +23 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/meta.d.ts +8 -0
- package/dist/utils/meta.d.ts.map +1 -0
- package/dist/utils/meta.js +13 -0
- package/dist/utils/meta.js.map +1 -0
- package/dist/utils/playwright-http.d.ts +2 -0
- package/dist/utils/playwright-http.d.ts.map +1 -0
- package/dist/utils/playwright-http.js +4 -0
- package/dist/utils/playwright-http.js.map +1 -0
- package/package.json +68 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACjE,MAAM,MAAM,4BAA4B,GAAG,YAAY,GAAG;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AACrF,MAAM,MAAM,+BAA+B,GAAG,YAAY,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC;AAC3F,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,GAAG;IACpD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACvE,sBAAsB,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC3F,yBAAyB,CAAC,MAAM,EAAE,+BAA+B,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACjG,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACzE,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC/D,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/D,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxD;;;OAGG;IACH,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { IBularioRepository } from "../domain/repository.js";
|
|
3
|
+
export declare function registerBuscarPorClasseTerapeutica(server: McpServer, repository: IBularioRepository): void;
|
|
4
|
+
//# sourceMappingURL=buscar-por-classe-terapeutica.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buscar-por-classe-terapeutica.d.ts","sourceRoot":"","sources":["../../src/tools/buscar-por-classe-terapeutica.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAOlE,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,kBAAkB,GAC7B,IAAI,CA8BN"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BuscarPorClasseTerapeuticaInputSchema, MedicamentoListaOutputSchema, } from "../schemas/tools.js";
|
|
2
|
+
import { TOOL_ANNOTATIONS, toErrorResult, toListResult } from "./shared.js";
|
|
3
|
+
export function registerBuscarPorClasseTerapeutica(server, repository) {
|
|
4
|
+
server.registerTool("buscar_por_classe_terapeutica", {
|
|
5
|
+
title: "Buscar Medicamento por Classe Terapêutica",
|
|
6
|
+
description: "Busca medicamentos no Bulário Eletrônico da ANVISA pela classe terapêutica " +
|
|
7
|
+
"(ex: antibiótico, analgésico, anti-hipertensivo). " +
|
|
8
|
+
"Retorna lista paginada de medicamentos da classe especificada.",
|
|
9
|
+
inputSchema: BuscarPorClasseTerapeuticaInputSchema,
|
|
10
|
+
outputSchema: MedicamentoListaOutputSchema,
|
|
11
|
+
annotations: TOOL_ANNOTATIONS,
|
|
12
|
+
}, async (args) => {
|
|
13
|
+
const { classeTerapeutica, pagina = 1, count = 10 } = args;
|
|
14
|
+
try {
|
|
15
|
+
const result = await repository.searchByClasseTerapeutica({
|
|
16
|
+
classeTerapeutica,
|
|
17
|
+
pagina,
|
|
18
|
+
count,
|
|
19
|
+
});
|
|
20
|
+
return toListResult({
|
|
21
|
+
data: { total: result.data.length, pagina, medicamentos: result.data },
|
|
22
|
+
_meta: result._meta,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
return toErrorResult(err);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=buscar-por-classe-terapeutica.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buscar-por-classe-terapeutica.js","sourceRoot":"","sources":["../../src/tools/buscar-por-classe-terapeutica.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,qCAAqC,EACrC,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,kCAAkC,CAChD,MAAiB,EACjB,UAA8B;IAE9B,MAAM,CAAC,YAAY,CACjB,+BAA+B,EAC/B;QACE,KAAK,EAAE,2CAA2C;QAClD,WAAW,EACT,6EAA6E;YAC7E,oDAAoD;YACpD,gEAAgE;QAClE,WAAW,EAAE,qCAAqC;QAClD,YAAY,EAAE,4BAA4B;QAC1C,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,yBAAyB,CAAC;gBACxD,iBAAiB;gBACjB,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;YACH,OAAO,YAAY,CAAC;gBAClB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE;gBACtE,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { IBularioRepository } from "../domain/repository.js";
|
|
3
|
+
export declare function registerBuscarPorNome(server: McpServer, repository: IBularioRepository): void;
|
|
4
|
+
//# sourceMappingURL=buscar-por-nome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buscar-por-nome.d.ts","sourceRoot":"","sources":["../../src/tools/buscar-por-nome.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,CAyB7F"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BuscarPorNomeInputSchema, MedicamentoListaOutputSchema } from "../schemas/tools.js";
|
|
2
|
+
import { TOOL_ANNOTATIONS, toErrorResult, toListResult } from "./shared.js";
|
|
3
|
+
export function registerBuscarPorNome(server, repository) {
|
|
4
|
+
server.registerTool("buscar_por_nome", {
|
|
5
|
+
title: "Buscar Medicamento por Nome Comercial",
|
|
6
|
+
description: "Busca medicamentos no Bulário Eletrônico da ANVISA pelo nome comercial. " +
|
|
7
|
+
"Retorna lista paginada com número de processo, empresa e links de bula.",
|
|
8
|
+
inputSchema: BuscarPorNomeInputSchema,
|
|
9
|
+
outputSchema: MedicamentoListaOutputSchema,
|
|
10
|
+
annotations: TOOL_ANNOTATIONS,
|
|
11
|
+
}, async (args) => {
|
|
12
|
+
const { nome, pagina = 1, count = 10 } = args;
|
|
13
|
+
try {
|
|
14
|
+
const result = await repository.searchByName({ nome, pagina, count });
|
|
15
|
+
return toListResult({
|
|
16
|
+
data: { total: result.data.length, pagina, medicamentos: result.data },
|
|
17
|
+
_meta: result._meta,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return toErrorResult(err);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=buscar-por-nome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buscar-por-nome.js","sourceRoot":"","sources":["../../src/tools/buscar-por-nome.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,UAA8B;IACrF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,uCAAuC;QAC9C,WAAW,EACT,0EAA0E;YAC1E,yEAAyE;QAC3E,WAAW,EAAE,wBAAwB;QACrC,YAAY,EAAE,4BAA4B;QAC1C,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACtE,OAAO,YAAY,CAAC;gBAClB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE;gBACtE,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { IBularioRepository } from "../domain/repository.js";
|
|
3
|
+
export declare function registerBuscarPorPrincipioAtivo(server: McpServer, repository: IBularioRepository): void;
|
|
4
|
+
//# sourceMappingURL=buscar-por-principio-ativo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buscar-por-principio-ativo.d.ts","sourceRoot":"","sources":["../../src/tools/buscar-por-principio-ativo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAOlE,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,kBAAkB,GAC7B,IAAI,CAyBN"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BuscarPorPrincipioAtivoInputSchema, MedicamentoListaOutputSchema, } from "../schemas/tools.js";
|
|
2
|
+
import { TOOL_ANNOTATIONS, toErrorResult, toListResult } from "./shared.js";
|
|
3
|
+
export function registerBuscarPorPrincipioAtivo(server, repository) {
|
|
4
|
+
server.registerTool("buscar_por_principio_ativo", {
|
|
5
|
+
title: "Buscar Medicamento por Princípio Ativo",
|
|
6
|
+
description: "Busca medicamentos no Bulário Eletrônico da ANVISA pelo princípio ativo (DCB/DCI). " +
|
|
7
|
+
"Retorna lista paginada de medicamentos que contêm o princípio ativo especificado.",
|
|
8
|
+
inputSchema: BuscarPorPrincipioAtivoInputSchema,
|
|
9
|
+
outputSchema: MedicamentoListaOutputSchema,
|
|
10
|
+
annotations: TOOL_ANNOTATIONS,
|
|
11
|
+
}, async (args) => {
|
|
12
|
+
const { principioAtivo, pagina = 1, count = 10 } = args;
|
|
13
|
+
try {
|
|
14
|
+
const result = await repository.searchByPrincipalAtivo({ principioAtivo, pagina, count });
|
|
15
|
+
return toListResult({
|
|
16
|
+
data: { total: result.data.length, pagina, medicamentos: result.data },
|
|
17
|
+
_meta: result._meta,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return toErrorResult(err);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=buscar-por-principio-ativo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buscar-por-principio-ativo.js","sourceRoot":"","sources":["../../src/tools/buscar-por-principio-ativo.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,kCAAkC,EAClC,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,+BAA+B,CAC7C,MAAiB,EACjB,UAA8B;IAE9B,MAAM,CAAC,YAAY,CACjB,4BAA4B,EAC5B;QACE,KAAK,EAAE,wCAAwC;QAC/C,WAAW,EACT,qFAAqF;YACrF,mFAAmF;QACrF,WAAW,EAAE,kCAAkC;QAC/C,YAAY,EAAE,4BAA4B;QAC1C,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,sBAAsB,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1F,OAAO,YAAY,CAAC;gBAClB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE;gBACtE,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
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
|
+
*/
|
|
13
|
+
export declare function registerConsultarBula(server: McpServer, repository: IBularioRepository): void;
|
|
14
|
+
//# sourceMappingURL=consultar-bula.d.ts.map
|
|
@@ -0,0 +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;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAqD7F"}
|
|
@@ -0,0 +1,60 @@
|
|
|
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
|
+
*/
|
|
13
|
+
export function registerConsultarBula(server, repository) {
|
|
14
|
+
server.registerTool("consultar_bula", {
|
|
15
|
+
title: "Consultar Bula de Medicamento",
|
|
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. " +
|
|
21
|
+
"Requer o numProcesso obtido via busca de medicamentos.",
|
|
22
|
+
inputSchema: ConsultarBulaInputSchema,
|
|
23
|
+
annotations: TOOL_ANNOTATIONS,
|
|
24
|
+
}, async (args) => {
|
|
25
|
+
const { numProcesso } = args;
|
|
26
|
+
try {
|
|
27
|
+
const detalhesResult = await repository.getDetalhes(numProcesso);
|
|
28
|
+
const det = detalhesResult.data;
|
|
29
|
+
const output = {
|
|
30
|
+
data: {
|
|
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.",
|
|
43
|
+
},
|
|
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
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
return toErrorResult(err);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=consultar-bula.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { IBularioRepository } from "../domain/repository.js";
|
|
3
|
+
export declare function registerFiltrarPorTarja(server: McpServer, repository: IBularioRepository): void;
|
|
4
|
+
//# sourceMappingURL=filtrar-por-tarja.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filtrar-por-tarja.d.ts","sourceRoot":"","sources":["../../src/tools/filtrar-por-tarja.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI,CA6B/F"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { FiltrarPorTarjaInputSchema, MedicamentoListaOutputSchema } from "../schemas/tools.js";
|
|
2
|
+
import { TOOL_ANNOTATIONS, toErrorResult, toListResult } from "./shared.js";
|
|
3
|
+
export function registerFiltrarPorTarja(server, repository) {
|
|
4
|
+
server.registerTool("filtrar_por_tarja", {
|
|
5
|
+
title: "Filtrar Medicamentos por Tarja",
|
|
6
|
+
description: "Lista medicamentos filtrados pelo tipo de tarja. " +
|
|
7
|
+
"LIVRE: venda sem receita. " +
|
|
8
|
+
"VERMELHA: requer receita médica simples (retenção). " +
|
|
9
|
+
"PRETA: controle especial (psicotrópicos, entorpecentes). " +
|
|
10
|
+
"Nota: a API da ANVISA não expõe filtro direto por tarja na listagem; " +
|
|
11
|
+
"use consultar_bula para confirmar a tarja de um medicamento específico.",
|
|
12
|
+
inputSchema: FiltrarPorTarjaInputSchema,
|
|
13
|
+
outputSchema: MedicamentoListaOutputSchema,
|
|
14
|
+
annotations: TOOL_ANNOTATIONS,
|
|
15
|
+
}, async (args) => {
|
|
16
|
+
const { tarja, pagina = 1, count = 10 } = args;
|
|
17
|
+
try {
|
|
18
|
+
const result = await repository.searchByTarja({ tarja, pagina, count });
|
|
19
|
+
return toListResult({
|
|
20
|
+
data: { total: result.data.length, pagina, medicamentos: result.data },
|
|
21
|
+
_meta: result._meta,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
return toErrorResult(err);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=filtrar-por-tarja.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filtrar-por-tarja.js","sourceRoot":"","sources":["../../src/tools/filtrar-por-tarja.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,UAA8B;IACvF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,gCAAgC;QACvC,WAAW,EACT,mDAAmD;YACnD,4BAA4B;YAC5B,sDAAsD;YACtD,2DAA2D;YAC3D,uEAAuE;YACvE,yEAAyE;QAC3E,WAAW,EAAE,0BAA0B;QACvC,YAAY,EAAE,4BAA4B;QAC1C,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACxE,OAAO,YAAY,CAAC;gBAClB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE;gBACtE,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
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
|
+
*/
|
|
10
|
+
export declare function registerListarApresentacoes(server: McpServer, repository: IBularioRepository): void;
|
|
11
|
+
//# sourceMappingURL=listar-apresentacoes.d.ts.map
|
|
@@ -0,0 +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;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,kBAAkB,GAC7B,IAAI,CAgDN"}
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
*/
|
|
10
|
+
export function registerListarApresentacoes(server, repository) {
|
|
11
|
+
server.registerTool("listar_apresentacoes", {
|
|
12
|
+
title: "Listar Apresentações de Medicamento",
|
|
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. " +
|
|
17
|
+
"Requer o numProcesso obtido via busca de medicamentos.",
|
|
18
|
+
inputSchema: ListarApresentacoesInputSchema,
|
|
19
|
+
annotations: TOOL_ANNOTATIONS,
|
|
20
|
+
}, async (args) => {
|
|
21
|
+
const { numProcesso } = args;
|
|
22
|
+
try {
|
|
23
|
+
const [detalhesResult, apresentacoesResult] = await Promise.all([
|
|
24
|
+
repository.getDetalhes(numProcesso),
|
|
25
|
+
repository.getApresentacoes(numProcesso),
|
|
26
|
+
]);
|
|
27
|
+
const output = {
|
|
28
|
+
data: {
|
|
29
|
+
numProcesso,
|
|
30
|
+
nomeProduto: detalhesResult.data.nomeProduto,
|
|
31
|
+
empresa: detalhesResult.data.empresa,
|
|
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.",
|
|
35
|
+
},
|
|
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
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
return toErrorResult(err);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=listar-apresentacoes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { ApresentacoesOutput, BulaOutput, MedicamentoListaOutput } from "../schemas/tools.js";
|
|
2
|
+
export declare const TOOL_ANNOTATIONS: {
|
|
3
|
+
readonly readOnlyHint: true;
|
|
4
|
+
readonly idempotentHint: true;
|
|
5
|
+
readonly destructiveHint: false;
|
|
6
|
+
readonly openWorldHint: false;
|
|
7
|
+
};
|
|
8
|
+
export declare const DISCLAIMER = "Dados informativos. N\u00E3o substitui consulta oficial ANVISA ou avalia\u00E7\u00E3o por profissional de sa\u00FAde habilitado.";
|
|
9
|
+
export declare function toListResult(output: MedicamentoListaOutput): {
|
|
10
|
+
content: {
|
|
11
|
+
type: "text";
|
|
12
|
+
text: string;
|
|
13
|
+
}[];
|
|
14
|
+
structuredContent: {
|
|
15
|
+
data: {
|
|
16
|
+
total: number;
|
|
17
|
+
pagina: number;
|
|
18
|
+
medicamentos: {
|
|
19
|
+
numProcesso: string;
|
|
20
|
+
nomeProduto: string;
|
|
21
|
+
empresa: string;
|
|
22
|
+
idBulaPacienteProtegido?: string | undefined;
|
|
23
|
+
idBulaProfissionalProtegido?: string | undefined;
|
|
24
|
+
dataAtualizacao?: string | undefined;
|
|
25
|
+
}[];
|
|
26
|
+
};
|
|
27
|
+
_meta: {
|
|
28
|
+
defasagem_dias: number;
|
|
29
|
+
status: "ok" | "stale";
|
|
30
|
+
terminologia: string;
|
|
31
|
+
versao: string;
|
|
32
|
+
data_da_base: string;
|
|
33
|
+
fonte: string;
|
|
34
|
+
modo: string;
|
|
35
|
+
};
|
|
36
|
+
disclaimer: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
export declare function toBulaResult(output: BulaOutput): {
|
|
40
|
+
content: {
|
|
41
|
+
type: "text";
|
|
42
|
+
text: string;
|
|
43
|
+
}[];
|
|
44
|
+
structuredContent: {
|
|
45
|
+
data: {
|
|
46
|
+
numProcesso: string;
|
|
47
|
+
nomeProduto: string;
|
|
48
|
+
empresa: string;
|
|
49
|
+
tarja?: "LIVRE" | "VERMELHA" | "PRETA" | undefined;
|
|
50
|
+
classesTerapeuticas?: string[] | undefined;
|
|
51
|
+
principioAtivo?: string | undefined;
|
|
52
|
+
bulaPaciente?: {
|
|
53
|
+
id: string;
|
|
54
|
+
urlPdf?: string | undefined;
|
|
55
|
+
} | undefined;
|
|
56
|
+
bulaProfissional?: {
|
|
57
|
+
id: string;
|
|
58
|
+
urlPdf?: string | undefined;
|
|
59
|
+
} | undefined;
|
|
60
|
+
};
|
|
61
|
+
_meta: {
|
|
62
|
+
defasagem_dias: number;
|
|
63
|
+
status: "ok" | "stale";
|
|
64
|
+
terminologia: string;
|
|
65
|
+
versao: string;
|
|
66
|
+
data_da_base: string;
|
|
67
|
+
fonte: string;
|
|
68
|
+
modo: string;
|
|
69
|
+
};
|
|
70
|
+
disclaimer: string;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
export declare function toApresentacoesResult(output: ApresentacoesOutput): {
|
|
74
|
+
content: {
|
|
75
|
+
type: "text";
|
|
76
|
+
text: string;
|
|
77
|
+
}[];
|
|
78
|
+
structuredContent: {
|
|
79
|
+
data: {
|
|
80
|
+
numProcesso: string;
|
|
81
|
+
nomeProduto: string;
|
|
82
|
+
empresa: string;
|
|
83
|
+
apresentacoes: {
|
|
84
|
+
descricao: string;
|
|
85
|
+
}[];
|
|
86
|
+
};
|
|
87
|
+
_meta: {
|
|
88
|
+
defasagem_dias: number;
|
|
89
|
+
status: "ok" | "stale";
|
|
90
|
+
terminologia: string;
|
|
91
|
+
versao: string;
|
|
92
|
+
data_da_base: string;
|
|
93
|
+
fonte: string;
|
|
94
|
+
modo: string;
|
|
95
|
+
};
|
|
96
|
+
disclaimer: string;
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
export declare function toErrorResult(err: unknown): {
|
|
100
|
+
content: {
|
|
101
|
+
type: "text";
|
|
102
|
+
text: string;
|
|
103
|
+
}[];
|
|
104
|
+
isError: true;
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +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,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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export const TOOL_ANNOTATIONS = {
|
|
2
|
+
readOnlyHint: true,
|
|
3
|
+
idempotentHint: true,
|
|
4
|
+
destructiveHint: false,
|
|
5
|
+
openWorldHint: false,
|
|
6
|
+
};
|
|
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
|
+
}
|
|
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
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
content: [{ type: "text", text: JSON.stringify(structuredContent, null, 2) }],
|
|
32
|
+
structuredContent,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
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
|
+
};
|
|
46
|
+
return {
|
|
47
|
+
content: [{ type: "text", text: JSON.stringify(structuredContent, null, 2) }],
|
|
48
|
+
structuredContent,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
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
|
+
};
|
|
62
|
+
return {
|
|
63
|
+
content: [{ type: "text", text: JSON.stringify(structuredContent, null, 2) }],
|
|
64
|
+
structuredContent,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function toErrorResult(err) {
|
|
68
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
69
|
+
return {
|
|
70
|
+
content: [{ type: "text", text: `Erro ao consultar base ANVISA: ${message}` }],
|
|
71
|
+
isError: true,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare class SourceAuthError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class MaxRetriesExceededError extends Error {
|
|
5
|
+
constructor(url: string, retries: number, cause?: Error);
|
|
6
|
+
}
|
|
7
|
+
export declare function withBackoff<T>(fn: () => Promise<T>, maxRetries: number, baseDelayMs: number, url: string): Promise<T>;
|
|
8
|
+
//# sourceMappingURL=backoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../src/utils/backoff.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAKxD;AAMD,wBAAsB,WAAW,CAAC,CAAC,EACjC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,CAAC,CAAC,CAuBZ"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export class SourceAuthError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = "SourceAuthError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class MaxRetriesExceededError extends Error {
|
|
8
|
+
constructor(url, retries, cause) {
|
|
9
|
+
super(`Max retries (${retries}) exceeded for ${url}: ${cause?.message}`);
|
|
10
|
+
this.name = "MaxRetriesExceededError";
|
|
11
|
+
this.cause = cause;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function jitter(baseMs) {
|
|
15
|
+
return Math.floor(Math.random() * baseMs);
|
|
16
|
+
}
|
|
17
|
+
export async function withBackoff(fn, maxRetries, baseDelayMs, url) {
|
|
18
|
+
let lastError;
|
|
19
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
20
|
+
try {
|
|
21
|
+
return await fn();
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
25
|
+
if (error instanceof SourceAuthError) {
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
lastError = error;
|
|
29
|
+
if (attempt < maxRetries) {
|
|
30
|
+
const delay = baseDelayMs * 2 ** (attempt - 1) + jitter(baseDelayMs);
|
|
31
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
throw new MaxRetriesExceededError(url, maxRetries, lastError);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=backoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.js","sourceRoot":"","sources":["../../src/utils/backoff.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,GAAW,EAAE,OAAe,EAAE,KAAa;QACrD,KAAK,CAAC,gBAAgB,OAAO,kBAAkB,GAAG,KAAK,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,SAAS,MAAM,CAAC,MAAc;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAoB,EACpB,UAAkB,EAClB,WAAmB,EACnB,GAAW;IAEX,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAElE,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;gBACrC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,SAAS,GAAG,KAAK,CAAC;YAElB,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;gBACrE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,uBAAuB,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* http.ts — stub (v2.0)
|
|
3
|
+
*
|
|
4
|
+
* O HttpClient baseado em Playwright foi removido em v2.0.
|
|
5
|
+
* A fonte de dados agora é o CSV dados.anvisa.gov.br via SQLite local.
|
|
6
|
+
*
|
|
7
|
+
* Este arquivo existe apenas para backward compatibility de imports.
|
|
8
|
+
* Será removido em v2.1.
|
|
9
|
+
*/
|
|
10
|
+
export interface HttpGet {
|
|
11
|
+
get(path: string, params?: Record<string, string>): Promise<unknown>;
|
|
12
|
+
close?(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* HttpClient stub — removido em v2.0.
|
|
16
|
+
* Mantido apenas para evitar erros de import em código legado.
|
|
17
|
+
* @deprecated Use BularioDatasetSource em vez de HttpClient.
|
|
18
|
+
*/
|
|
19
|
+
export declare class HttpClient implements HttpGet {
|
|
20
|
+
constructor(..._args: any[]);
|
|
21
|
+
get(_path: string, _params?: Record<string, string>): Promise<unknown>;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,OAAO;IACtB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED;;;;GAIG;AACH,qBAAa,UAAW,YAAW,OAAO;gBAE5B,GAAG,KAAK,EAAE,GAAG,EAAE;IAE3B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAMhE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAC7B"}
|