brasil-data-mcp 0.1.0 → 0.2.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/README.md CHANGED
@@ -1,12 +1,15 @@
1
1
  # brasil-data-mcp
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/brasil-data-mcp.svg)](https://www.npmjs.com/package/brasil-data-mcp)
4
+ [![npm downloads](https://img.shields.io/npm/dm/brasil-data-mcp.svg)](https://www.npmjs.com/package/brasil-data-mcp)
5
+ [![CI](https://github.com/alanpcf/brasil-data-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/alanpcf/brasil-data-mcp/actions/workflows/ci.yml)
4
6
  [![license](https://img.shields.io/npm/l/brasil-data-mcp.svg)](./LICENSE)
5
7
  [![node](https://img.shields.io/node/v/brasil-data-mcp.svg)](https://nodejs.org)
8
+ [![Glama MCP server](https://glama.ai/mcp/servers/alanpcf/brasil-data-mcp/badges/score.svg)](https://glama.ai/mcp/servers/alanpcf/brasil-data-mcp)
6
9
 
7
- > MCP server que expõe dados públicos brasileiros (CNPJ, CEP, bancos, feriados) como tools pra Claude Desktop, Claude Code, Cursor, Windsurf e qualquer cliente compatível com [Model Context Protocol](https://modelcontextprotocol.io).
10
+ > MCP server que expõe dados públicos brasileiros (CNPJ, CEP, bancos, feriados, DDD, ISBN, taxas econômicas, corretoras CVM) como tools pra Claude Desktop, Claude Code, Cursor, Windsurf e qualquer cliente compatível com [Model Context Protocol](https://modelcontextprotocol.io). Inclui também **prompts MCP** (workflows guiados).
8
11
  >
9
- > _MCP server exposing Brazilian public data (CNPJ, CEP, banks, holidays) as tools for Claude Desktop, Claude Code, Cursor, Windsurf and any MCP-compatible client._
12
+ > _MCP server exposing Brazilian public data (CNPJ, CEP, banks, holidays, area codes, ISBN, economic rates, CVM brokers) as tools for Claude Desktop, Claude Code, Cursor, Windsurf and any MCP-compatible client. Ships with MCP prompts for guided workflows._
10
13
 
11
14
  Powered by [BrasilAPI](https://brasilapi.com.br) — sem chave, sem auth, dados oficiais.
12
15
 
@@ -20,26 +23,44 @@ Conecte seu cliente de IA aos dados públicos brasileiros sem escrever uma linha
20
23
  - _"Esse CEP 01310-100 é em qual cidade?"_
21
24
  - _"Quem é o banco com código 341?"_
22
25
  - _"Quais os feriados nacionais de 2026?"_
26
+ - _"Quais cidades têm DDD 41?"_
27
+ - _"Me dá o livro do ISBN 9788532530802."_
28
+ - _"Qual a SELIC hoje?"_
29
+ - _"A corretora de CNPJ 02.332.886/0011-78 ainda tá ativa?"_
23
30
 
24
31
  O Claude (ou outro cliente MCP) chama a tool, retorna o JSON estruturado, e você lê a resposta em português direto na conversa.
25
32
 
26
- ### Tools disponíveis
33
+ ### Tools disponíveis (10)
27
34
 
28
- | Tool | O que faz |
29
- | --------------------- | ------------------------------------------------------------------------------- |
30
- | `consultar_cnpj` | Dados cadastrais de empresa: razão social, situação, endereço, sócios, CNAE |
31
- | `consultar_cep` | Endereço completo a partir de CEP (logradouro, bairro, cidade, UF, coordenadas) |
32
- | `consultar_banco` | Nome e ISPB de banco brasileiro pelo código COMPE (ex: 341 = Itaú, 260 = Nubank) |
33
- | `listar_bancos` | Lista completa de bancos brasileiros cadastrados no BACEN (~250 instituições) |
34
- | `consultar_feriados` | Feriados nacionais de um ano (datas, nome, tipo) — inclui Carnaval e Páscoa |
35
+ | Tool | O que faz |
36
+ | ---------------------- | ---------------------------------------------------------------------------------- |
37
+ | `consultar_cnpj` | Dados cadastrais de empresa: razão social, situação, endereço, sócios, CNAE |
38
+ | `consultar_cep` | Endereço completo a partir de CEP (logradouro, bairro, cidade, UF, coordenadas) |
39
+ | `consultar_banco` | Nome e ISPB de banco brasileiro pelo código COMPE (ex: 341 = Itaú, 260 = Nubank) |
40
+ | `listar_bancos` | Lista completa de bancos brasileiros cadastrados no BACEN (~250 instituições) |
41
+ | `consultar_feriados` | Feriados nacionais de um ano (datas, nome, tipo) — inclui Carnaval e Páscoa |
42
+ | `consultar_ddd` | Estado e cidades atendidas por um código DDD (ex: 11 = SP capital + região metro) |
43
+ | `consultar_isbn` | Metadados de livro pelo ISBN-10/13 (título, autor, editora, ano, idioma, páginas) |
44
+ | `consultar_taxa` | Valor atual de taxa econômica (SELIC, CDI, IPCA) em % ao ano |
45
+ | `listar_taxas` | Panorama com todas as taxas econômicas vigentes |
46
+ | `consultar_corretora` | Dados cadastrais de corretora de valores autorizada pela CVM (status, endereço) |
47
+
48
+ ### Prompts disponíveis (2)
49
+
50
+ Prompts MCP são **workflows guiados** que aparecem como atalho no Claude Desktop. Você seleciona, preenche o argumento e o LLM segue o roteiro pré-definido (chama tools, interpreta, responde).
51
+
52
+ | Prompt | O que faz |
53
+ | -------------------- | ---------------------------------------------------------------------------------------- |
54
+ | `analise-cnpj` | Recebe um CNPJ, consulta na Receita e produz análise estruturada (setor, idade, porte) |
55
+ | `panorama-economico` | Combina taxas vigentes + próximos feriados nacionais em um snapshot conciso |
35
56
 
36
57
  ---
37
58
 
38
59
  ## 🇺🇸 EN — What is it?
39
60
 
40
- Plug your AI client into Brazilian public data with zero code. Ask in natural language and the LLM picks the right tool, calls it, and answers you with structured data from official sources (Receita Federal, ViaCEP, BACEN).
61
+ Plug your AI client into Brazilian public data with zero code. Ask in natural language and the LLM picks the right tool, calls it, and answers you with structured data from official sources (Receita Federal, ViaCEP, BACEN, CVM, BrasilAPI).
41
62
 
42
- Currently ships with `consultar_cnpj`. CEP, banks and holidays are landing next.
63
+ 10 tools covering CNPJ, CEP, banks, holidays, area codes (DDD), ISBN, economic rates (SELIC/CDI/IPCA) and CVM brokers plus 2 MCP prompts (`analise-cnpj`, `panorama-economico`) for guided workflows.
43
64
 
44
65
  ---
45
66
 
@@ -122,8 +143,9 @@ Pra apontar seu cliente MCP pro build local em vez do pacote do npm:
122
143
 
123
144
  - [x] **Fase 1** — Esqueleto + cliente HTTP + `consultar_cnpj`
124
145
  - [x] **Fase 2** — `consultar_cep`, `consultar_banco`, `listar_bancos`, `consultar_feriados` + testes Vitest
125
- - [ ] **Fase 3** — CI (GitHub Actions), CONTRIBUTING.md, cobertura > 80%, publicação no npm
126
- - [ ] **Fase 4** — FIPE, DDD, ISBN, taxas (SELIC/CDI/IPCA), CVM, MCP prompts pra workflows
146
+ - [x] **Fase 3** — CI (GitHub Actions), `CONTRIBUTING.md`, cobertura 94%/85%, publicação no [npm](https://www.npmjs.com/package/brasil-data-mcp), listagem no [Glama](https://glama.ai/mcp/servers/alanpcf/brasil-data-mcp)
147
+ - [x] **Fase 4 (v0.2.0)** — `consultar_ddd`, `consultar_isbn`, `consultar_taxa` + `listar_taxas`, `consultar_corretora` (CVM) + MCP prompts (`analise-cnpj`, `panorama-economico`)
148
+ - [ ] **Próximo** — FIPE (aguardando upstream estabilizar, [BrasilAPI#805](https://github.com/BrasilAPI/BrasilAPI/issues/805)); Trusted Publishing (npm OIDC); mais prompts conforme demanda
127
149
 
128
150
  ---
129
151
 
package/dist/index.d.ts CHANGED
@@ -9,7 +9,8 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
9
  * 2. Registra cada tool via registerTool — o SDK deriva o JSON Schema do
10
10
  * schema Zod, então atendemos "validação dupla" (Zod runtime + JSON
11
11
  * Schema na definição) com uma única declaração por tool.
12
- * 3. Conecta no StdioServerTransport e fica em loop atendendo requisições.
12
+ * 3. Registra prompts (workflows) via registerPrompt.
13
+ * 4. Conecta no StdioServerTransport e fica em loop atendendo requisições.
13
14
  *
14
15
  * REGRA CRÍTICA: nunca escrever em stdout fora do protocolo. Logs em stderr
15
16
  * via console.error. console.log corrompe o canal MCP.
package/dist/index.js CHANGED
@@ -4,15 +4,93 @@
4
4
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
6
 
7
- // src/tools/banco.ts
7
+ // src/prompts/analise-cnpj.ts
8
8
  import { z } from "zod";
9
+ var analiseCnpjArgsSchema = {
10
+ cnpj: z.string().describe(
11
+ "CNPJ da empresa a analisar (com ou sem m\xE1scara). Ex: 33.000.167/0001-01"
12
+ )
13
+ };
14
+ var analiseCnpjPrompt = {
15
+ name: "analise-cnpj",
16
+ title: "Analisar empresa por CNPJ",
17
+ description: "Workflow guiado: consulta os dados cadastrais do CNPJ na Receita Federal e produz uma an\xE1lise interpretada \u2014 setor de atua\xE7\xE3o (CNAE principal), idade da empresa, situa\xE7\xE3o cadastral, porte, quadro societ\xE1rio e observa\xE7\xF5es relevantes.",
18
+ argsSchema: analiseCnpjArgsSchema
19
+ };
20
+ function analiseCnpjHandler(args) {
21
+ const cnpj = args.cnpj.trim();
22
+ return {
23
+ messages: [
24
+ {
25
+ role: "user",
26
+ content: {
27
+ type: "text",
28
+ text: [
29
+ `Fa\xE7a uma an\xE1lise completa da empresa de CNPJ ${cnpj}.`,
30
+ "",
31
+ "Passos:",
32
+ `1. Chame a tool consultar_cnpj com o CNPJ ${cnpj}.`,
33
+ "2. Com base nos dados retornados, produza uma an\xE1lise estruturada cobrindo:",
34
+ " - **Identifica\xE7\xE3o**: raz\xE3o social, nome fantasia.",
35
+ " - **Situa\xE7\xE3o cadastral**: ativa/baixada/suspensa, motivo se aplic\xE1vel, data.",
36
+ " - **Idade**: anos desde a abertura (calcule a partir da data de in\xEDcio).",
37
+ " - **Porte**: MEI/ME/EPP/Demais, capital social.",
38
+ " - **Atividade**: CNAE principal traduzido em linguagem simples + secund\xE1rios relevantes.",
39
+ " - **Localiza\xE7\xE3o**: cidade/UF.",
40
+ " - **Quadro societ\xE1rio (QSA)**: n\xFAmero de s\xF3cios, principais.",
41
+ " - **Observa\xE7\xF5es**: empresa Simples Nacional? MEI? Algo que chame aten\xE7\xE3o (situa\xE7\xE3o irregular, idade incomum, atividade restrita)?",
42
+ "",
43
+ "Seja objetivo. N\xE3o recomende decis\xF5es de neg\xF3cio \u2014 s\xF3 apresente os fatos extra\xEDdos."
44
+ ].join("\n")
45
+ }
46
+ }
47
+ ]
48
+ };
49
+ }
50
+
51
+ // src/prompts/panorama-economico.ts
52
+ var panoramaEconomicoPrompt = {
53
+ name: "panorama-economico",
54
+ title: "Panorama econ\xF4mico e de feriados",
55
+ description: "Workflow guiado: lista as taxas econ\xF4micas atuais (SELIC, CDI, IPCA) e os feriados nacionais do ano corrente, e produz um resumo conciso \xFAtil pra planejamento de curto prazo (pr\xF3ximos feriados, juros vigentes)."
56
+ // argsSchema omitido = prompt sem argumentos.
57
+ };
58
+ function panoramaEconomicoHandler() {
59
+ const anoCorrente = (/* @__PURE__ */ new Date()).getFullYear();
60
+ return {
61
+ messages: [
62
+ {
63
+ role: "user",
64
+ content: {
65
+ type: "text",
66
+ text: [
67
+ "Monte um panorama econ\xF4mico e de calend\xE1rio do Brasil no momento.",
68
+ "",
69
+ "Passos:",
70
+ "1. Chame a tool listar_taxas pra obter SELIC, CDI e IPCA atuais.",
71
+ `2. Chame a tool consultar_feriados com ano=${anoCorrente}.`,
72
+ "3. Produza um resumo curto cobrindo:",
73
+ " - **Taxas vigentes**: SELIC, CDI, IPCA (% ao ano), com uma frase de contexto cada (ex: 'SELIC \xE9 a taxa b\xE1sica de juros').",
74
+ " - **Pr\xF3ximos feriados**: a partir de hoje, liste os 3-5 pr\xF3ximos feriados nacionais com data e dia da semana.",
75
+ " - **Pontes em vista**: aponte feriados que caem em ter\xE7a/quinta (potencial emenda).",
76
+ "",
77
+ "Seja conciso. N\xE3o d\xEA recomenda\xE7\xE3o de investimento."
78
+ ].join("\n")
79
+ }
80
+ }
81
+ ]
82
+ };
83
+ }
84
+
85
+ // src/tools/banco.ts
86
+ import { z as z2 } from "zod";
9
87
 
10
88
  // src/clients/brasilapi.ts
11
89
  var BASE_URL = "https://brasilapi.com.br/api";
12
90
  var DEFAULT_TIMEOUT_MS = 1e4;
13
91
  var DEFAULT_TTL_MS = 24 * 60 * 60 * 1e3;
14
92
  var MAX_RETRIES = 3;
15
- var USER_AGENT = "brasil-data-mcp/0.1.0 (+https://github.com/alanpcf/brasil-data-mcp)";
93
+ var USER_AGENT = "brasil-data-mcp/0.2.0 (+https://github.com/alanpcf/brasil-data-mcp)";
16
94
  var BrasilApiError = class extends Error {
17
95
  constructor(message, status, path, body) {
18
96
  super(message);
@@ -136,8 +214,8 @@ function traduzirErroBrasilApi(err, mapa) {
136
214
  }
137
215
 
138
216
  // src/tools/banco.ts
139
- var consultarBancoSchema = z.object({
140
- codigo: z.union([z.string(), z.number()]).describe(
217
+ var consultarBancoSchema = z2.object({
218
+ codigo: z2.union([z2.string(), z2.number()]).describe(
141
219
  "C\xF3digo COMPE/Febraban do banco (1 a 4 d\xEDgitos). Aceita string ou n\xFAmero. Ex: 341 (Ita\xFA), 260 (Nubank), 237 (Bradesco)."
142
220
  )
143
221
  });
@@ -192,7 +270,7 @@ async function consultarBancoHandler(input) {
192
270
  };
193
271
  }
194
272
  }
195
- var listarBancosSchema = z.object({});
273
+ var listarBancosSchema = z2.object({});
196
274
  var listarBancosTool = {
197
275
  name: "listar_bancos",
198
276
  description: [
@@ -231,9 +309,9 @@ async function listarBancosHandler(_input) {
231
309
  }
232
310
 
233
311
  // src/tools/cep.ts
234
- import { z as z2 } from "zod";
235
- var consultarCepSchema = z2.object({
236
- cep: z2.string().describe(
312
+ import { z as z3 } from "zod";
313
+ var consultarCepSchema = z3.object({
314
+ cep: z3.string().describe(
237
315
  "CEP brasileiro com ou sem h\xEDfen. Aceita '01310-100' ou '01310100'. Deve ter 8 d\xEDgitos."
238
316
  )
239
317
  });
@@ -293,9 +371,21 @@ async function consultarCepHandler(input) {
293
371
  }
294
372
 
295
373
  // src/tools/cnpj.ts
296
- import { z as z3 } from "zod";
297
- var consultarCnpjSchema = z3.object({
298
- cnpj: z3.string().describe(
374
+ import { z as z4 } from "zod";
375
+
376
+ // src/utils/cnpj.ts
377
+ function limparCnpj(s) {
378
+ return s.replace(/\D/g, "");
379
+ }
380
+ function validarCnpj(s) {
381
+ if (!/^\d{14}$/.test(s)) return false;
382
+ if (/^(\d)\1{13}$/.test(s)) return false;
383
+ return true;
384
+ }
385
+
386
+ // src/tools/cnpj.ts
387
+ var consultarCnpjSchema = z4.object({
388
+ cnpj: z4.string().describe(
299
389
  "CNPJ da empresa, com ou sem m\xE1scara. Aceita '12.345.678/0001-90' ou '12345678000190'. Deve ter 14 d\xEDgitos."
300
390
  )
301
391
  });
@@ -317,14 +407,6 @@ var consultarCnpjTool = {
317
407
  ].join(" "),
318
408
  inputSchema: consultarCnpjSchema
319
409
  };
320
- function limparCnpj(s) {
321
- return s.replace(/\D/g, "");
322
- }
323
- function validarCnpj(s) {
324
- if (!/^\d{14}$/.test(s)) return false;
325
- if (/^(\d)\1{13}$/.test(s)) return false;
326
- return true;
327
- }
328
410
  async function consultarCnpjHandler(input) {
329
411
  const cnpjLimpo = limparCnpj(input.cnpj);
330
412
  if (!validarCnpj(cnpjLimpo)) {
@@ -366,10 +448,125 @@ async function consultarCnpjHandler(input) {
366
448
  }
367
449
  }
368
450
 
451
+ // src/tools/corretoras.ts
452
+ import { z as z5 } from "zod";
453
+ var consultarCorretoraSchema = z5.object({
454
+ cnpj: z5.string().describe(
455
+ "CNPJ da corretora, com ou sem m\xE1scara. 14 d\xEDgitos. Ex: '02.332.886/0011-78' (XP Investimentos)."
456
+ )
457
+ });
458
+ var consultarCorretoraTool = {
459
+ name: "consultar_corretora",
460
+ description: [
461
+ "Consulta dados cadastrais de uma corretora de valores autorizada pela CVM (Comiss\xE3o de Valores Mobili\xE1rios) via BrasilAPI.",
462
+ "",
463
+ "Retorna em JSON: CNPJ, nome social, nome comercial, status (em funcionamento, cancelada, etc), endere\xE7o completo, e-mail, telefone, data de in\xEDcio e patrim\xF4nio quando dispon\xEDvel.",
464
+ "",
465
+ "Use quando o usu\xE1rio fornecer um CNPJ e quiser saber se \xE9 uma corretora autorizada pela CVM, ou puxar os dados cadastrais.",
466
+ "",
467
+ "N\xC3O use para: empresas em geral (use consultar_cnpj), corretoras de seguros (CVM s\xF3 regula valores mobili\xE1rios), ou buscar por nome (a API s\xF3 aceita CNPJ)."
468
+ ].join(" "),
469
+ inputSchema: consultarCorretoraSchema
470
+ };
471
+ async function consultarCorretoraHandler(input) {
472
+ const cnpjLimpo = limparCnpj(input.cnpj);
473
+ if (!validarCnpj(cnpjLimpo)) {
474
+ return {
475
+ content: [
476
+ {
477
+ type: "text",
478
+ text: `CNPJ inv\xE1lido: '${input.cnpj}'. Deve conter 14 d\xEDgitos (com ou sem m\xE1scara) e n\xE3o pode ser uma sequ\xEAncia repetida.`
479
+ }
480
+ ],
481
+ isError: true
482
+ };
483
+ }
484
+ try {
485
+ const dados = await brasilApi.get(
486
+ `/cvm/corretoras/v1/${cnpjLimpo}`
487
+ );
488
+ return {
489
+ content: [{ type: "text", text: JSON.stringify(dados, null, 2) }]
490
+ };
491
+ } catch (err) {
492
+ return {
493
+ content: [
494
+ {
495
+ type: "text",
496
+ text: traduzirErroBrasilApi(err, {
497
+ notFound: `Corretora com CNPJ ${cnpjLimpo} n\xE3o encontrada no cadastro da CVM. Verifique se est\xE1 correto \u2014 s\xF3 corretoras de valores mobili\xE1rios autorizadas pela CVM aparecem aqui.`,
498
+ contextoErro: "Erro ao consultar corretora"
499
+ })
500
+ }
501
+ ],
502
+ isError: true
503
+ };
504
+ }
505
+ }
506
+
507
+ // src/tools/ddd.ts
508
+ import { z as z6 } from "zod";
509
+ var consultarDddSchema = z6.object({
510
+ ddd: z6.union([z6.string(), z6.number()]).describe(
511
+ "C\xF3digo DDD brasileiro (2 d\xEDgitos). Aceita string ou n\xFAmero. Ex: 11 (S\xE3o Paulo capital), 21 (Rio), 41 (Curitiba), 71 (Salvador)."
512
+ )
513
+ });
514
+ var consultarDddTool = {
515
+ name: "consultar_ddd",
516
+ description: [
517
+ "Lista as cidades atendidas por um c\xF3digo DDD brasileiro via BrasilAPI.",
518
+ "",
519
+ "Retorna em JSON: estado (UF) e lista de cidades que usam aquele DDD.",
520
+ "",
521
+ "Use quando o usu\xE1rio perguntar de onde \xE9 um DDD, quais cidades um DDD cobre, ou descobrir o estado de um n\xFAmero de telefone.",
522
+ "",
523
+ "N\xC3O use para: validar n\xFAmero de telefone completo, descobrir DDD a partir de cidade (a opera\xE7\xE3o s\xF3 \xE9 DDD \u2192 cidades), ou consultar DDDs internacionais."
524
+ ].join(" "),
525
+ inputSchema: consultarDddSchema
526
+ };
527
+ function normalizarDdd(ddd) {
528
+ const s = String(ddd).trim().replace(/\D/g, "");
529
+ if (!/^[1-9]\d$/.test(s)) return "";
530
+ return s;
531
+ }
532
+ async function consultarDddHandler(input) {
533
+ const ddd = normalizarDdd(input.ddd);
534
+ if (!ddd) {
535
+ return {
536
+ content: [
537
+ {
538
+ type: "text",
539
+ text: `DDD inv\xE1lido: '${input.ddd}'. Deve ter 2 d\xEDgitos, primeiro entre 1 e 9 (ex: 11, 21, 41).`
540
+ }
541
+ ],
542
+ isError: true
543
+ };
544
+ }
545
+ try {
546
+ const dados = await brasilApi.get(`/ddd/v1/${ddd}`);
547
+ return {
548
+ content: [{ type: "text", text: JSON.stringify(dados, null, 2) }]
549
+ };
550
+ } catch (err) {
551
+ return {
552
+ content: [
553
+ {
554
+ type: "text",
555
+ text: traduzirErroBrasilApi(err, {
556
+ notFound: `DDD ${ddd} n\xE3o encontrado no plano de numera\xE7\xE3o brasileiro.`,
557
+ contextoErro: "Erro ao consultar DDD"
558
+ })
559
+ }
560
+ ],
561
+ isError: true
562
+ };
563
+ }
564
+ }
565
+
369
566
  // src/tools/feriados.ts
370
- import { z as z4 } from "zod";
371
- var consultarFeriadosSchema = z4.object({
372
- ano: z4.number().int().describe(
567
+ import { z as z7 } from "zod";
568
+ var consultarFeriadosSchema = z7.object({
569
+ ano: z7.number().int().describe(
373
570
  "Ano dos feriados, 4 d\xEDgitos. Faixa aceita: 1900 a 2199. Ex: 2026."
374
571
  )
375
572
  });
@@ -422,8 +619,168 @@ async function consultarFeriadosHandler(input) {
422
619
  }
423
620
  }
424
621
 
622
+ // src/tools/isbn.ts
623
+ import { z as z8 } from "zod";
624
+ var consultarIsbnSchema = z8.object({
625
+ codigo: z8.string().describe(
626
+ "ISBN do livro, 10 ou 13 d\xEDgitos. Aceita com ou sem h\xEDfens. Ex: '978-85-325-3080-2' ou '9788532530802'."
627
+ )
628
+ });
629
+ var consultarIsbnTool = {
630
+ name: "consultar_isbn",
631
+ description: [
632
+ "Consulta metadados de um livro pelo ISBN via BrasilAPI (agrega CBL, Mercado Editorial, Open Library e Google Books).",
633
+ "",
634
+ "Retorna em JSON: t\xEDtulo, subt\xEDtulo, autores, editora, ano, idioma, n\xFAmero de p\xE1ginas, assunto/categoria, sinopse (quando dispon\xEDvel) e fonte do dado.",
635
+ "",
636
+ "Use quando o usu\xE1rio fornecer um ISBN e quiser saber sobre o livro (t\xEDtulo, autor, editora, ano).",
637
+ "",
638
+ "N\xC3O use para: buscar livro por t\xEDtulo ou autor (a opera\xE7\xE3o \xE9 s\xF3 ISBN \u2192 metadados), validar formato sem consultar (rejeite local se n\xE3o bater 10/13 d\xEDgitos), ou consultar pre\xE7o/disponibilidade. Aceita ISBN-10 e ISBN-13, com ou sem h\xEDfens."
639
+ ].join(" "),
640
+ inputSchema: consultarIsbnSchema
641
+ };
642
+ function limparIsbn(s) {
643
+ return s.replace(/[\s-]/g, "").toUpperCase();
644
+ }
645
+ function validarIsbn(s) {
646
+ if (/^\d{9}[\dX]$/.test(s)) return true;
647
+ if (/^\d{13}$/.test(s)) return true;
648
+ return false;
649
+ }
650
+ async function consultarIsbnHandler(input) {
651
+ const isbnLimpo = limparIsbn(input.codigo);
652
+ if (!validarIsbn(isbnLimpo)) {
653
+ return {
654
+ content: [
655
+ {
656
+ type: "text",
657
+ text: `ISBN inv\xE1lido: '${input.codigo}'. Deve ter 10 d\xEDgitos (\xFAltimo pode ser 'X') ou 13 d\xEDgitos. Aceita com ou sem h\xEDfens.`
658
+ }
659
+ ],
660
+ isError: true
661
+ };
662
+ }
663
+ try {
664
+ const dados = await brasilApi.get(`/isbn/v1/${isbnLimpo}`);
665
+ return {
666
+ content: [{ type: "text", text: JSON.stringify(dados, null, 2) }]
667
+ };
668
+ } catch (err) {
669
+ return {
670
+ content: [
671
+ {
672
+ type: "text",
673
+ text: traduzirErroBrasilApi(err, {
674
+ notFound: `ISBN ${isbnLimpo} n\xE3o encontrado nos provedores agregados (CBL, Mercado Editorial, Open Library, Google Books).`,
675
+ contextoErro: "Erro ao consultar ISBN"
676
+ })
677
+ }
678
+ ],
679
+ isError: true
680
+ };
681
+ }
682
+ }
683
+
684
+ // src/tools/taxas.ts
685
+ import { z as z9 } from "zod";
686
+ var TTL_TAXAS_MS = 60 * 60 * 1e3;
687
+ var consultarTaxaSchema = z9.object({
688
+ sigla: z9.string().describe(
689
+ "Sigla da taxa, case-insensitive. Aceita: 'Selic' (taxa b\xE1sica de juros), 'CDI' (Certificado de Dep\xF3sito Interbanc\xE1rio), 'IPCA' (infla\xE7\xE3o oficial)."
690
+ )
691
+ });
692
+ var consultarTaxaTool = {
693
+ name: "consultar_taxa",
694
+ description: [
695
+ "Consulta o valor atual de uma taxa econ\xF4mica brasileira (SELIC, CDI, IPCA) via BrasilAPI.",
696
+ "",
697
+ "Retorna em JSON: nome da taxa e valor atual (% ao ano).",
698
+ "",
699
+ "Use quando o usu\xE1rio perguntar 'qual a SELIC hoje?', 'CDI atual?', 'infla\xE7\xE3o do IPCA?' \u2014 qualquer pergunta sobre o valor corrente de uma taxa espec\xEDfica.",
700
+ "",
701
+ "N\xC3O use para: s\xE9rie hist\xF3rica (a API devolve s\xF3 o \xFAltimo valor), outras taxas al\xE9m de SELIC/CDI/IPCA, ou consultar d\xF3lar/bolsa (n\xE3o est\xE1 nesta API). Pra panorama com todas as 3 taxas use listar_taxas."
702
+ ].join(" "),
703
+ inputSchema: consultarTaxaSchema
704
+ };
705
+ var SIGLAS_VALIDAS = /* @__PURE__ */ new Set(["SELIC", "CDI", "IPCA"]);
706
+ function normalizarSigla(sigla) {
707
+ return sigla.trim().toUpperCase();
708
+ }
709
+ async function consultarTaxaHandler(input) {
710
+ const sigla = normalizarSigla(input.sigla);
711
+ if (!SIGLAS_VALIDAS.has(sigla)) {
712
+ return {
713
+ content: [
714
+ {
715
+ type: "text",
716
+ text: `Sigla inv\xE1lida: '${input.sigla}'. Use uma de: SELIC, CDI, IPCA.`
717
+ }
718
+ ],
719
+ isError: true
720
+ };
721
+ }
722
+ try {
723
+ const dados = await brasilApi.get(`/taxas/v1/${sigla}`, {
724
+ ttlMs: TTL_TAXAS_MS
725
+ });
726
+ return {
727
+ content: [{ type: "text", text: JSON.stringify(dados, null, 2) }]
728
+ };
729
+ } catch (err) {
730
+ return {
731
+ content: [
732
+ {
733
+ type: "text",
734
+ text: traduzirErroBrasilApi(err, {
735
+ notFound: `Taxa ${sigla} n\xE3o encontrada na BrasilAPI.`,
736
+ contextoErro: "Erro ao consultar taxa"
737
+ })
738
+ }
739
+ ],
740
+ isError: true
741
+ };
742
+ }
743
+ }
744
+ var listarTaxasSchema = z9.object({});
745
+ var listarTaxasTool = {
746
+ name: "listar_taxas",
747
+ description: [
748
+ "Lista TODAS as taxas econ\xF4micas brasileiras dispon\xEDveis na BrasilAPI (SELIC, CDI, IPCA) com seus valores atuais.",
749
+ "",
750
+ "Retorna em JSON um array com nome e valor (% ao ano) de cada taxa.",
751
+ "",
752
+ "Use quando o usu\xE1rio quiser um panorama econ\xF4mico, comparar SELIC vs CDI vs IPCA, ou n\xE3o souber a sigla espec\xEDfica.",
753
+ "",
754
+ "N\xC3O use quando o usu\xE1rio j\xE1 sabe qual taxa quer \u2014 use consultar_taxa que \xE9 semanticamente mais direto. Hoje s\xE3o s\xF3 3 taxas; o payload \xE9 pequeno."
755
+ ].join(" "),
756
+ inputSchema: listarTaxasSchema
757
+ };
758
+ async function listarTaxasHandler(_input) {
759
+ try {
760
+ const dados = await brasilApi.get("/taxas/v1", {
761
+ ttlMs: TTL_TAXAS_MS
762
+ });
763
+ return {
764
+ content: [{ type: "text", text: JSON.stringify(dados, null, 2) }]
765
+ };
766
+ } catch (err) {
767
+ return {
768
+ content: [
769
+ {
770
+ type: "text",
771
+ text: traduzirErroBrasilApi(err, {
772
+ notFound: "Lista de taxas n\xE3o dispon\xEDvel no momento.",
773
+ contextoErro: "Erro ao listar taxas"
774
+ })
775
+ }
776
+ ],
777
+ isError: true
778
+ };
779
+ }
780
+ }
781
+
425
782
  // src/index.ts
426
- var VERSION = "0.1.0";
783
+ var VERSION = "0.2.0";
427
784
  function wrapHandler(toolName, handler) {
428
785
  return async (input) => {
429
786
  try {
@@ -487,6 +844,63 @@ function createServer() {
487
844
  },
488
845
  wrapHandler(consultarFeriadosTool.name, consultarFeriadosHandler)
489
846
  );
847
+ server.registerTool(
848
+ consultarDddTool.name,
849
+ {
850
+ description: consultarDddTool.description,
851
+ inputSchema: consultarDddSchema.shape
852
+ },
853
+ wrapHandler(consultarDddTool.name, consultarDddHandler)
854
+ );
855
+ server.registerTool(
856
+ consultarIsbnTool.name,
857
+ {
858
+ description: consultarIsbnTool.description,
859
+ inputSchema: consultarIsbnSchema.shape
860
+ },
861
+ wrapHandler(consultarIsbnTool.name, consultarIsbnHandler)
862
+ );
863
+ server.registerTool(
864
+ consultarTaxaTool.name,
865
+ {
866
+ description: consultarTaxaTool.description,
867
+ inputSchema: consultarTaxaSchema.shape
868
+ },
869
+ wrapHandler(consultarTaxaTool.name, consultarTaxaHandler)
870
+ );
871
+ server.registerTool(
872
+ listarTaxasTool.name,
873
+ {
874
+ description: listarTaxasTool.description,
875
+ inputSchema: listarTaxasSchema.shape
876
+ },
877
+ wrapHandler(listarTaxasTool.name, listarTaxasHandler)
878
+ );
879
+ server.registerTool(
880
+ consultarCorretoraTool.name,
881
+ {
882
+ description: consultarCorretoraTool.description,
883
+ inputSchema: consultarCorretoraSchema.shape
884
+ },
885
+ wrapHandler(consultarCorretoraTool.name, consultarCorretoraHandler)
886
+ );
887
+ server.registerPrompt(
888
+ analiseCnpjPrompt.name,
889
+ {
890
+ title: analiseCnpjPrompt.title,
891
+ description: analiseCnpjPrompt.description,
892
+ argsSchema: analiseCnpjArgsSchema
893
+ },
894
+ analiseCnpjHandler
895
+ );
896
+ server.registerPrompt(
897
+ panoramaEconomicoPrompt.name,
898
+ {
899
+ title: panoramaEconomicoPrompt.title,
900
+ description: panoramaEconomicoPrompt.description
901
+ },
902
+ panoramaEconomicoHandler
903
+ );
490
904
  return server;
491
905
  }
492
906
  async function main() {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "brasil-data-mcp",
3
- "version": "0.1.0",
4
- "description": "MCP server providing access to Brazilian public data (CNPJ, CEP, banks, holidays) via BrasilAPI. For use with Claude Desktop, Claude Code, Cursor, and other MCP-compatible clients.",
3
+ "version": "0.2.0",
4
+ "description": "MCP server providing access to Brazilian public data (CNPJ, CEP, banks, holidays, DDD, ISBN, economic rates, CVM brokers) via BrasilAPI. Ships with MCP prompts for guided workflows. For use with Claude Desktop, Claude Code, Cursor, and other MCP-compatible clients.",
5
5
  "keywords": [
6
6
  "mcp",
7
7
  "model-context-protocol",
@@ -10,6 +10,12 @@
10
10
  "brazil",
11
11
  "cnpj",
12
12
  "cep",
13
+ "ddd",
14
+ "isbn",
15
+ "selic",
16
+ "cdi",
17
+ "ipca",
18
+ "cvm",
13
19
  "brasilapi",
14
20
  "ai-tools"
15
21
  ],