bcb-br-mcp 1.1.0 → 1.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 +256 -228
- package/README.pt-BR.md +388 -0
- package/dist/index.js +89 -786
- package/dist/index.js.map +1 -1
- package/dist/tools.d.ts +280 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +725 -0
- package/dist/tools.js.map +1 -0
- package/dist/worker.d.ts +20 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +236 -0
- package/dist/worker.js.map +1 -0
- package/package.json +5 -2
package/dist/index.js
CHANGED
|
@@ -9,829 +9,132 @@
|
|
|
9
9
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
10
10
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
11
11
|
import { z } from "zod";
|
|
12
|
-
|
|
13
|
-
const BCB_API_BASE = "https://api.bcb.gov.br/dados/serie/bcdata.sgs";
|
|
14
|
-
// Configuration
|
|
15
|
-
const CONFIG = {
|
|
16
|
-
TIMEOUT_MS: 30000, // 30 seconds timeout
|
|
17
|
-
MAX_RETRIES: 3, // Maximum retry attempts
|
|
18
|
-
RETRY_DELAY_MS: 1000, // Initial retry delay (doubles each attempt)
|
|
19
|
-
USER_AGENT: "bcb-br-mcp/1.1.0"
|
|
20
|
-
};
|
|
21
|
-
// Popular series catalog - Expanded with 150+ series
|
|
22
|
-
const SERIES_POPULARES = [
|
|
23
|
-
// ==================== JUROS E TAXAS ====================
|
|
24
|
-
// Selic
|
|
25
|
-
{ codigo: 11, nome: "Taxa de juros - Selic acumulada no mês", categoria: "Juros", periodicidade: "Mensal" },
|
|
26
|
-
{ codigo: 432, nome: "Taxa de juros - Selic anualizada base 252", categoria: "Juros", periodicidade: "Diária" },
|
|
27
|
-
{ codigo: 1178, nome: "Taxa de juros - Selic - Meta definida pelo Copom", categoria: "Juros", periodicidade: "Diária" },
|
|
28
|
-
{ codigo: 4189, nome: "Taxa de juros - Selic acumulada no mês anualizada", categoria: "Juros", periodicidade: "Mensal" },
|
|
29
|
-
{ codigo: 4390, nome: "Taxa de juros - Selic mensal", categoria: "Juros", periodicidade: "Mensal" },
|
|
30
|
-
// CDI
|
|
31
|
-
{ codigo: 12, nome: "Taxa de juros - CDI diária", categoria: "Juros", periodicidade: "Diária" },
|
|
32
|
-
{ codigo: 4389, nome: "Taxa de juros - CDI anualizada base 252", categoria: "Juros", periodicidade: "Diária" },
|
|
33
|
-
{ codigo: 4391, nome: "Taxa de juros - CDI acumulada no mês", categoria: "Juros", periodicidade: "Mensal" },
|
|
34
|
-
{ codigo: 4392, nome: "Taxa de juros - CDI acumulada no mês anualizada", categoria: "Juros", periodicidade: "Mensal" },
|
|
35
|
-
// TR e TJLP
|
|
36
|
-
{ codigo: 226, nome: "Taxa Referencial (TR) - diária", categoria: "Juros", periodicidade: "Diária" },
|
|
37
|
-
{ codigo: 7811, nome: "Taxa Referencial (TR) - mensal", categoria: "Juros", periodicidade: "Mensal" },
|
|
38
|
-
{ codigo: 7812, nome: "Taxa Referencial (TR) - anualizada", categoria: "Juros", periodicidade: "Mensal" },
|
|
39
|
-
{ codigo: 256, nome: "Taxa de Juros de Longo Prazo (TJLP)", categoria: "Juros", periodicidade: "Mensal" },
|
|
40
|
-
// Outras taxas de juros
|
|
41
|
-
{ codigo: 253, nome: "Taxa de juros - CDB pré-fixado - 30 dias", categoria: "Juros", periodicidade: "Diária" },
|
|
42
|
-
{ codigo: 14, nome: "Taxa de juros - Poupança", categoria: "Juros", periodicidade: "Mensal" },
|
|
43
|
-
// ==================== INFLAÇÃO ====================
|
|
44
|
-
// IPCA
|
|
45
|
-
{ codigo: 433, nome: "IPCA - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
46
|
-
{ codigo: 13522, nome: "IPCA - Variação acumulada em 12 meses", categoria: "Inflação", periodicidade: "Mensal" },
|
|
47
|
-
{ codigo: 7478, nome: "IPCA-15 - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
48
|
-
{ codigo: 7479, nome: "IPCA-15 - Variação acumulada em 12 meses", categoria: "Inflação", periodicidade: "Mensal" },
|
|
49
|
-
{ codigo: 10764, nome: "IPCA-E - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
50
|
-
{ codigo: 16121, nome: "IPCA - Núcleo por exclusão - EX0", categoria: "Inflação", periodicidade: "Mensal" },
|
|
51
|
-
{ codigo: 16122, nome: "IPCA - Núcleo de dupla ponderação", categoria: "Inflação", periodicidade: "Mensal" },
|
|
52
|
-
{ codigo: 11426, nome: "IPCA - Núcleo de médias aparadas com suavização", categoria: "Inflação", periodicidade: "Mensal" },
|
|
53
|
-
{ codigo: 11427, nome: "IPCA - Núcleo de médias aparadas sem suavização", categoria: "Inflação", periodicidade: "Mensal" },
|
|
54
|
-
{ codigo: 10841, nome: "IPCA - Alimentação e bebidas", categoria: "Inflação", periodicidade: "Mensal" },
|
|
55
|
-
{ codigo: 10842, nome: "IPCA - Habitação", categoria: "Inflação", periodicidade: "Mensal" },
|
|
56
|
-
{ codigo: 10843, nome: "IPCA - Artigos de residência", categoria: "Inflação", periodicidade: "Mensal" },
|
|
57
|
-
{ codigo: 10844, nome: "IPCA - Serviços", categoria: "Inflação", periodicidade: "Mensal" },
|
|
58
|
-
{ codigo: 10845, nome: "IPCA - Vestuário", categoria: "Inflação", periodicidade: "Mensal" },
|
|
59
|
-
{ codigo: 10846, nome: "IPCA - Transportes", categoria: "Inflação", periodicidade: "Mensal" },
|
|
60
|
-
{ codigo: 10847, nome: "IPCA - Saúde e cuidados pessoais", categoria: "Inflação", periodicidade: "Mensal" },
|
|
61
|
-
{ codigo: 10848, nome: "IPCA - Despesas pessoais", categoria: "Inflação", periodicidade: "Mensal" },
|
|
62
|
-
{ codigo: 10849, nome: "IPCA - Educação", categoria: "Inflação", periodicidade: "Mensal" },
|
|
63
|
-
{ codigo: 10850, nome: "IPCA - Comunicação", categoria: "Inflação", periodicidade: "Mensal" },
|
|
64
|
-
{ codigo: 4449, nome: "IPCA - Preços administrados", categoria: "Inflação", periodicidade: "Mensal" },
|
|
65
|
-
{ codigo: 11428, nome: "IPCA - Preços livres", categoria: "Inflação", periodicidade: "Mensal" },
|
|
66
|
-
// INPC
|
|
67
|
-
{ codigo: 188, nome: "INPC - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
68
|
-
{ codigo: 13523, nome: "INPC - Variação acumulada em 12 meses", categoria: "Inflação", periodicidade: "Mensal" },
|
|
69
|
-
// IGP
|
|
70
|
-
{ codigo: 189, nome: "IGP-M - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
71
|
-
{ codigo: 7447, nome: "IGP-10 - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
72
|
-
{ codigo: 7448, nome: "IGP-M - 1ª prévia", categoria: "Inflação", periodicidade: "Mensal" },
|
|
73
|
-
{ codigo: 7449, nome: "IGP-M - 2ª prévia", categoria: "Inflação", periodicidade: "Mensal" },
|
|
74
|
-
{ codigo: 190, nome: "IGP-DI - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
75
|
-
{ codigo: 7450, nome: "IPA-M - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
76
|
-
{ codigo: 225, nome: "IPA-DI - Geral - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
77
|
-
{ codigo: 7459, nome: "IPA-DI - Produtos industriais", categoria: "Inflação", periodicidade: "Mensal" },
|
|
78
|
-
{ codigo: 7460, nome: "IPA-DI - Produtos agrícolas", categoria: "Inflação", periodicidade: "Mensal" },
|
|
79
|
-
// Outros índices de preços
|
|
80
|
-
{ codigo: 191, nome: "IPC-DI - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
81
|
-
{ codigo: 193, nome: "IPC-Fipe - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
82
|
-
{ codigo: 17679, nome: "IPC-3i - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
83
|
-
{ codigo: 17680, nome: "IPC-C1 - Variação mensal", categoria: "Inflação", periodicidade: "Mensal" },
|
|
84
|
-
// ==================== CÂMBIO ====================
|
|
85
|
-
// Dólar
|
|
86
|
-
{ codigo: 1, nome: "Taxa de câmbio - Livre - Dólar americano (venda)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
87
|
-
{ codigo: 10813, nome: "Taxa de câmbio - Livre - Dólar americano (compra)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
88
|
-
{ codigo: 3698, nome: "Taxa de câmbio - PTAX - Dólar americano (venda)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
89
|
-
{ codigo: 3697, nome: "Taxa de câmbio - PTAX - Dólar americano (compra)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
90
|
-
{ codigo: 3695, nome: "Taxa de câmbio - PTAX - Dólar americano (média)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
91
|
-
// Euro
|
|
92
|
-
{ codigo: 21619, nome: "Taxa de câmbio - Euro (venda)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
93
|
-
{ codigo: 21620, nome: "Taxa de câmbio - Euro (compra)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
94
|
-
// Outras moedas
|
|
95
|
-
{ codigo: 21623, nome: "Taxa de câmbio - Libra Esterlina (venda)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
96
|
-
{ codigo: 21624, nome: "Taxa de câmbio - Libra Esterlina (compra)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
97
|
-
{ codigo: 21621, nome: "Taxa de câmbio - Iene (venda)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
98
|
-
{ codigo: 21622, nome: "Taxa de câmbio - Iene (compra)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
99
|
-
{ codigo: 21625, nome: "Taxa de câmbio - Franco Suíço (venda)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
100
|
-
{ codigo: 21626, nome: "Taxa de câmbio - Franco Suíço (compra)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
101
|
-
{ codigo: 21637, nome: "Taxa de câmbio - Peso Argentino (venda)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
102
|
-
{ codigo: 21638, nome: "Taxa de câmbio - Peso Argentino (compra)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
103
|
-
{ codigo: 21639, nome: "Taxa de câmbio - Yuan Chinês (venda)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
104
|
-
{ codigo: 21640, nome: "Taxa de câmbio - Yuan Chinês (compra)", categoria: "Câmbio", periodicidade: "Diária" },
|
|
105
|
-
// ==================== PIB E ATIVIDADE ECONÔMICA ====================
|
|
106
|
-
{ codigo: 4380, nome: "PIB mensal - Valores correntes (R$ milhões)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
107
|
-
{ codigo: 4381, nome: "PIB acumulado no ano - Valores correntes (R$ milhões)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
108
|
-
{ codigo: 4382, nome: "PIB acumulado dos últimos 12 meses - Valores correntes (R$ milhões)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
109
|
-
{ codigo: 4385, nome: "PIB mensal em US$ (milhões)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
110
|
-
{ codigo: 4386, nome: "PIB acumulado no ano em US$ (milhões)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
111
|
-
{ codigo: 7324, nome: "PIB anual em US$ (milhões)", categoria: "Atividade Econômica", periodicidade: "Anual" },
|
|
112
|
-
// IBC-Br
|
|
113
|
-
{ codigo: 24363, nome: "IBC-Br - Índice de Atividade Econômica (sem ajuste)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
114
|
-
{ codigo: 24364, nome: "IBC-Br - Índice de Atividade Econômica (com ajuste sazonal)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
115
|
-
{ codigo: 29601, nome: "IBC-Br - Agropecuária (sem ajuste)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
116
|
-
{ codigo: 29602, nome: "IBC-Br - Agropecuária (com ajuste sazonal)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
117
|
-
{ codigo: 29603, nome: "IBC-Br - Indústria (sem ajuste)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
118
|
-
{ codigo: 29604, nome: "IBC-Br - Indústria (com ajuste sazonal)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
119
|
-
{ codigo: 29605, nome: "IBC-Br - Serviços (sem ajuste)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
120
|
-
{ codigo: 29606, nome: "IBC-Br - Serviços (com ajuste sazonal)", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
121
|
-
// Contas Nacionais Trimestrais
|
|
122
|
-
{ codigo: 22099, nome: "PIB trimestral - Taxa de variação (%)", categoria: "Atividade Econômica", periodicidade: "Trimestral" },
|
|
123
|
-
{ codigo: 22103, nome: "Exportação de bens e serviços - Trimestral", categoria: "Atividade Econômica", periodicidade: "Trimestral" },
|
|
124
|
-
{ codigo: 22104, nome: "Importação de bens e serviços - Trimestral", categoria: "Atividade Econômica", periodicidade: "Trimestral" },
|
|
125
|
-
{ codigo: 22109, nome: "Consumo das famílias - Trimestral", categoria: "Atividade Econômica", periodicidade: "Trimestral" },
|
|
126
|
-
{ codigo: 22110, nome: "Consumo do governo - Trimestral", categoria: "Atividade Econômica", periodicidade: "Trimestral" },
|
|
127
|
-
{ codigo: 22111, nome: "Formação bruta de capital fixo - Trimestral", categoria: "Atividade Econômica", periodicidade: "Trimestral" },
|
|
128
|
-
// Produção Industrial
|
|
129
|
-
{ codigo: 21859, nome: "Produção industrial - Geral - Variação mensal", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
130
|
-
{ codigo: 21860, nome: "Produção industrial - Geral - Variação acum. 12 meses", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
131
|
-
{ codigo: 21862, nome: "Utilização da capacidade instalada - Indústria", categoria: "Atividade Econômica", periodicidade: "Mensal" },
|
|
132
|
-
// ==================== EMPREGO ====================
|
|
133
|
-
{ codigo: 24369, nome: "Taxa de desocupação - PNAD Contínua", categoria: "Emprego", periodicidade: "Mensal" },
|
|
134
|
-
{ codigo: 28763, nome: "Taxa de desocupação - PNAD Contínua - Trimestral", categoria: "Emprego", periodicidade: "Trimestral" },
|
|
135
|
-
{ codigo: 24370, nome: "Taxa de participação na força de trabalho", categoria: "Emprego", periodicidade: "Mensal" },
|
|
136
|
-
{ codigo: 24380, nome: "Rendimento médio real habitual - Todos os trabalhos", categoria: "Emprego", periodicidade: "Mensal" },
|
|
137
|
-
{ codigo: 24381, nome: "Massa de rendimento real habitual", categoria: "Emprego", periodicidade: "Mensal" },
|
|
138
|
-
{ codigo: 28785, nome: "Pessoal ocupado - Total (milhões)", categoria: "Emprego", periodicidade: "Mensal" },
|
|
139
|
-
{ codigo: 28561, nome: "CAGED - Saldo de empregos formais", categoria: "Emprego", periodicidade: "Mensal" },
|
|
140
|
-
// ==================== DÍVIDA PÚBLICA E FISCAL ====================
|
|
141
|
-
{ codigo: 4503, nome: "Dívida líquida do setor público (% PIB)", categoria: "Fiscal", periodicidade: "Mensal" },
|
|
142
|
-
{ codigo: 4513, nome: "Dívida bruta do governo geral (% PIB)", categoria: "Fiscal", periodicidade: "Mensal" },
|
|
143
|
-
{ codigo: 4505, nome: "Dívida líquida do governo federal (% PIB)", categoria: "Fiscal", periodicidade: "Mensal" },
|
|
144
|
-
{ codigo: 4536, nome: "Necessidade de financiamento - Setor público (% PIB)", categoria: "Fiscal", periodicidade: "Mensal" },
|
|
145
|
-
{ codigo: 4537, nome: "Resultado primário - Setor público (% PIB)", categoria: "Fiscal", periodicidade: "Mensal" },
|
|
146
|
-
{ codigo: 4538, nome: "Juros nominais - Setor público (% PIB)", categoria: "Fiscal", periodicidade: "Mensal" },
|
|
147
|
-
{ codigo: 4539, nome: "Resultado nominal - Setor público (% PIB)", categoria: "Fiscal", periodicidade: "Mensal" },
|
|
148
|
-
{ codigo: 5364, nome: "Receita total do governo central", categoria: "Fiscal", periodicidade: "Mensal" },
|
|
149
|
-
{ codigo: 5793, nome: "Despesa total do governo central", categoria: "Fiscal", periodicidade: "Mensal" },
|
|
150
|
-
// ==================== SETOR EXTERNO ====================
|
|
151
|
-
// Reservas Internacionais
|
|
152
|
-
{ codigo: 3546, nome: "Reservas internacionais - Conceito liquidez - Total", categoria: "Setor Externo", periodicidade: "Diária" },
|
|
153
|
-
{ codigo: 13621, nome: "Reservas internacionais - Conceito liquidez - Mensal", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
154
|
-
// Balança Comercial
|
|
155
|
-
{ codigo: 22707, nome: "Balança comercial - Saldo mensal (US$ milhões)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
156
|
-
{ codigo: 22708, nome: "Exportação de bens - Mensal (US$ milhões)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
157
|
-
{ codigo: 22709, nome: "Importação de bens - Mensal (US$ milhões)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
158
|
-
{ codigo: 22714, nome: "Balança comercial - Saldo acumulado 12 meses (US$ milhões)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
159
|
-
// Balanço de Pagamentos
|
|
160
|
-
{ codigo: 22701, nome: "Transações correntes - Saldo mensal (US$ milhões)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
161
|
-
{ codigo: 22704, nome: "Transações correntes - Saldo acumulado 12 meses (% PIB)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
162
|
-
{ codigo: 22715, nome: "Serviços - Saldo mensal (US$ milhões)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
163
|
-
{ codigo: 22716, nome: "Renda primária - Saldo mensal (US$ milhões)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
164
|
-
{ codigo: 22846, nome: "Investimento direto no país - Mensal (US$ milhões)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
165
|
-
{ codigo: 22885, nome: "Investimento em carteira - Mensal (US$ milhões)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
166
|
-
// Dívida Externa
|
|
167
|
-
{ codigo: 13690, nome: "Dívida externa total (US$ milhões)", categoria: "Setor Externo", periodicidade: "Mensal" },
|
|
168
|
-
// ==================== CRÉDITO ====================
|
|
169
|
-
// Saldo de crédito
|
|
170
|
-
{ codigo: 20539, nome: "Saldo da carteira de crédito - Total", categoria: "Crédito", periodicidade: "Mensal" },
|
|
171
|
-
{ codigo: 20540, nome: "Saldo da carteira de crédito - Pessoas físicas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
172
|
-
{ codigo: 20541, nome: "Saldo da carteira de crédito - Pessoas jurídicas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
173
|
-
{ codigo: 20542, nome: "Saldo de crédito com recursos livres - Total", categoria: "Crédito", periodicidade: "Mensal" },
|
|
174
|
-
{ codigo: 20570, nome: "Saldo de crédito com recursos livres - Pessoas físicas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
175
|
-
{ codigo: 20592, nome: "Saldo de crédito com recursos livres - Pessoas jurídicas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
176
|
-
{ codigo: 20615, nome: "Saldo de crédito com recursos direcionados - Total", categoria: "Crédito", periodicidade: "Mensal" },
|
|
177
|
-
// Concessões de crédito
|
|
178
|
-
{ codigo: 20631, nome: "Concessões de crédito - Total", categoria: "Crédito", periodicidade: "Mensal" },
|
|
179
|
-
{ codigo: 20665, nome: "Concessões de crédito - Cheque especial - Pessoas físicas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
180
|
-
// Taxa média de juros
|
|
181
|
-
{ codigo: 20714, nome: "Taxa média de juros - Crédito total", categoria: "Crédito", periodicidade: "Mensal" },
|
|
182
|
-
{ codigo: 20716, nome: "Taxa média de juros - Crédito pessoas físicas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
183
|
-
{ codigo: 20740, nome: "Taxa média de juros - Crédito recursos livres - PF", categoria: "Crédito", periodicidade: "Mensal" },
|
|
184
|
-
{ codigo: 20749, nome: "Taxa média de juros - Aquisição de veículos - PF", categoria: "Crédito", periodicidade: "Mensal" },
|
|
185
|
-
{ codigo: 20772, nome: "Taxa média de juros - Financiamento imobiliário - PF", categoria: "Crédito", periodicidade: "Mensal" },
|
|
186
|
-
{ codigo: 25497, nome: "Taxa média de juros - Financiamento imobiliário taxas de mercado", categoria: "Crédito", periodicidade: "Mensal" },
|
|
187
|
-
// Spread bancário
|
|
188
|
-
{ codigo: 20783, nome: "Spread médio - Crédito total", categoria: "Crédito", periodicidade: "Mensal" },
|
|
189
|
-
{ codigo: 20785, nome: "Spread médio - Crédito pessoas físicas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
190
|
-
{ codigo: 20786, nome: "Spread médio - Crédito pessoas jurídicas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
191
|
-
// Inadimplência
|
|
192
|
-
{ codigo: 21082, nome: "Inadimplência - Crédito total", categoria: "Crédito", periodicidade: "Mensal" },
|
|
193
|
-
{ codigo: 21084, nome: "Inadimplência - Crédito pessoas físicas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
194
|
-
{ codigo: 21085, nome: "Inadimplência - Crédito pessoas jurídicas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
195
|
-
{ codigo: 21128, nome: "Inadimplência - Cartão de crédito parcelado - PF", categoria: "Crédito", periodicidade: "Mensal" },
|
|
196
|
-
{ codigo: 21129, nome: "Inadimplência - Cartão de crédito total - PF", categoria: "Crédito", periodicidade: "Mensal" },
|
|
197
|
-
{ codigo: 13685, nome: "Inadimplência - Instituições financeiras privadas", categoria: "Crédito", periodicidade: "Mensal" },
|
|
198
|
-
// ==================== AGREGADOS MONETÁRIOS ====================
|
|
199
|
-
{ codigo: 1788, nome: "Base monetária - Saldo fim de período", categoria: "Agregados Monetários", periodicidade: "Mensal" },
|
|
200
|
-
{ codigo: 1833, nome: "Base monetária ampliada - M4 - Saldo fim de período", categoria: "Agregados Monetários", periodicidade: "Mensal" },
|
|
201
|
-
{ codigo: 27788, nome: "Meios de pagamento - M1 - Saldo fim de período", categoria: "Agregados Monetários", periodicidade: "Mensal" },
|
|
202
|
-
{ codigo: 27789, nome: "Meios de pagamento - M2 - Saldo fim de período", categoria: "Agregados Monetários", periodicidade: "Mensal" },
|
|
203
|
-
{ codigo: 27790, nome: "Meios de pagamento - M3 - Saldo fim de período", categoria: "Agregados Monetários", periodicidade: "Mensal" },
|
|
204
|
-
{ codigo: 27791, nome: "Meios de pagamento - M4 - Saldo fim de período", categoria: "Agregados Monetários", periodicidade: "Mensal" },
|
|
205
|
-
{ codigo: 27815, nome: "Multiplicador monetário - Base para M4", categoria: "Agregados Monetários", periodicidade: "Mensal" },
|
|
206
|
-
{ codigo: 7530, nome: "Multiplicador monetário - Média do mês", categoria: "Agregados Monetários", periodicidade: "Mensal" },
|
|
207
|
-
// ==================== POUPANÇA ====================
|
|
208
|
-
{ codigo: 25, nome: "Poupança - Rendimento no mês de referência", categoria: "Poupança", periodicidade: "Mensal" },
|
|
209
|
-
{ codigo: 195, nome: "Poupança - Saldo total", categoria: "Poupança", periodicidade: "Mensal" },
|
|
210
|
-
{ codigo: 7165, nome: "Poupança - Captação líquida", categoria: "Poupança", periodicidade: "Mensal" },
|
|
211
|
-
{ codigo: 7166, nome: "Poupança - Depósitos", categoria: "Poupança", periodicidade: "Mensal" },
|
|
212
|
-
{ codigo: 7167, nome: "Poupança - Retiradas", categoria: "Poupança", periodicidade: "Mensal" },
|
|
213
|
-
// ==================== ÍNDICES DE MERCADO ====================
|
|
214
|
-
{ codigo: 12466, nome: "IMA-B - Índice de Mercado ANBIMA (Base)", categoria: "Índices de Mercado", periodicidade: "Diária" },
|
|
215
|
-
{ codigo: 12467, nome: "IMA-B5 - Índice de Mercado ANBIMA (até 5 anos)", categoria: "Índices de Mercado", periodicidade: "Diária" },
|
|
216
|
-
{ codigo: 12468, nome: "IMA-B5+ - Índice de Mercado ANBIMA (acima 5 anos)", categoria: "Índices de Mercado", periodicidade: "Diária" },
|
|
217
|
-
{ codigo: 7832, nome: "Ibovespa - Índice mensal", categoria: "Índices de Mercado", periodicidade: "Mensal" },
|
|
218
|
-
// ==================== EXPECTATIVAS (Focus) ====================
|
|
219
|
-
{ codigo: 29033, nome: "Expectativa IPCA - Mediana - Ano corrente", categoria: "Expectativas", periodicidade: "Semanal" },
|
|
220
|
-
{ codigo: 29034, nome: "Expectativa IPCA - Mediana - Próximo ano", categoria: "Expectativas", periodicidade: "Semanal" },
|
|
221
|
-
{ codigo: 29035, nome: "Expectativa Selic - Mediana - Ano corrente", categoria: "Expectativas", periodicidade: "Semanal" },
|
|
222
|
-
{ codigo: 29036, nome: "Expectativa Selic - Mediana - Próximo ano", categoria: "Expectativas", periodicidade: "Semanal" },
|
|
223
|
-
{ codigo: 29037, nome: "Expectativa PIB - Mediana - Ano corrente", categoria: "Expectativas", periodicidade: "Semanal" },
|
|
224
|
-
{ codigo: 29038, nome: "Expectativa PIB - Mediana - Próximo ano", categoria: "Expectativas", periodicidade: "Semanal" },
|
|
225
|
-
{ codigo: 29039, nome: "Expectativa Câmbio - Mediana - Ano corrente", categoria: "Expectativas", periodicidade: "Semanal" },
|
|
226
|
-
{ codigo: 29040, nome: "Expectativa Câmbio - Mediana - Próximo ano", categoria: "Expectativas", periodicidade: "Semanal" }
|
|
227
|
-
];
|
|
228
|
-
// ==================== UTILITY FUNCTIONS ====================
|
|
229
|
-
/**
|
|
230
|
-
* Normalize string for comparison (remove accents, lowercase)
|
|
231
|
-
*/
|
|
232
|
-
function normalizeString(str) {
|
|
233
|
-
return str
|
|
234
|
-
.toLowerCase()
|
|
235
|
-
.normalize("NFD")
|
|
236
|
-
.replace(/[\u0300-\u036f]/g, "");
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Helper function to format date for API (dd/MM/yyyy)
|
|
240
|
-
*/
|
|
241
|
-
function formatDateForApi(dateStr) {
|
|
242
|
-
// Accept formats: yyyy-MM-dd, dd/MM/yyyy
|
|
243
|
-
if (dateStr.includes("-")) {
|
|
244
|
-
const [year, month, day] = dateStr.split("-");
|
|
245
|
-
return `${day}/${month}/${year}`;
|
|
246
|
-
}
|
|
247
|
-
return dateStr;
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Sleep function for retry delays
|
|
251
|
-
*/
|
|
252
|
-
function sleep(ms) {
|
|
253
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Fetch with timeout using AbortController
|
|
257
|
-
*/
|
|
258
|
-
async function fetchWithTimeout(url, timeoutMs) {
|
|
259
|
-
const controller = new AbortController();
|
|
260
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
261
|
-
try {
|
|
262
|
-
const response = await fetch(url, {
|
|
263
|
-
signal: controller.signal,
|
|
264
|
-
headers: {
|
|
265
|
-
"Accept": "application/json",
|
|
266
|
-
"User-Agent": CONFIG.USER_AGENT
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
return response;
|
|
270
|
-
}
|
|
271
|
-
finally {
|
|
272
|
-
clearTimeout(timeoutId);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Fetch from BCB API with retry and timeout
|
|
277
|
-
*/
|
|
278
|
-
async function fetchBcbApi(url) {
|
|
279
|
-
let lastError = null;
|
|
280
|
-
for (let attempt = 1; attempt <= CONFIG.MAX_RETRIES; attempt++) {
|
|
281
|
-
try {
|
|
282
|
-
const response = await fetchWithTimeout(url, CONFIG.TIMEOUT_MS);
|
|
283
|
-
if (!response.ok) {
|
|
284
|
-
if (response.status === 404) {
|
|
285
|
-
throw new Error(`Série não encontrada ou sem dados para o período solicitado`);
|
|
286
|
-
}
|
|
287
|
-
throw new Error(`Erro na API do BCB: ${response.status} ${response.statusText}`);
|
|
288
|
-
}
|
|
289
|
-
return response.json();
|
|
290
|
-
}
|
|
291
|
-
catch (error) {
|
|
292
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
293
|
-
// Don't retry on 404 (not found)
|
|
294
|
-
if (lastError.message.includes("não encontrada")) {
|
|
295
|
-
throw lastError;
|
|
296
|
-
}
|
|
297
|
-
// Check if it's a timeout/abort error
|
|
298
|
-
const isTimeout = lastError.name === "AbortError" ||
|
|
299
|
-
lastError.message.includes("aborted") ||
|
|
300
|
-
lastError.message.includes("timeout");
|
|
301
|
-
// Log retry attempt
|
|
302
|
-
if (attempt < CONFIG.MAX_RETRIES) {
|
|
303
|
-
const delayMs = CONFIG.RETRY_DELAY_MS * Math.pow(2, attempt - 1);
|
|
304
|
-
const reason = isTimeout ? "timeout" : "erro";
|
|
305
|
-
console.error(`Tentativa ${attempt}/${CONFIG.MAX_RETRIES} falhou (${reason}). Aguardando ${delayMs}ms...`);
|
|
306
|
-
await sleep(delayMs);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
throw new Error(`Falha após ${CONFIG.MAX_RETRIES} tentativas: ${lastError?.message || "Erro desconhecido"}`);
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Parse date string from BCB format (dd/MM/yyyy) to Date object
|
|
314
|
-
*/
|
|
315
|
-
function parseBcbDate(dateStr) {
|
|
316
|
-
const [day, month, year] = dateStr.split("/").map(Number);
|
|
317
|
-
return new Date(year, month - 1, day);
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Calculate percentage variation between two values
|
|
321
|
-
*/
|
|
322
|
-
function calculateVariation(valorInicial, valorFinal) {
|
|
323
|
-
if (valorInicial === 0)
|
|
324
|
-
return 0;
|
|
325
|
-
return ((valorFinal - valorInicial) / Math.abs(valorInicial)) * 100;
|
|
326
|
-
}
|
|
12
|
+
import { SERIES_POPULARES, handleSerieValores, handleSerieUltimos, handleSerieMetadados, handleSeriesPopulares, handleBuscarSerie, handleIndicadoresAtuais, handleVariacao, handleComparar } from "./tools.js";
|
|
327
13
|
// ==================== MCP SERVER ====================
|
|
328
14
|
// Create MCP server
|
|
329
15
|
const server = new McpServer({
|
|
330
16
|
name: "bcb-br-mcp",
|
|
331
|
-
version: "1.
|
|
17
|
+
version: "1.2.0"
|
|
332
18
|
});
|
|
333
19
|
// Tool: Get series values
|
|
334
20
|
server.tool("bcb_serie_valores", "Consulta valores de uma série temporal do BCB por código. Retorna dados históricos com data e valor.", {
|
|
335
21
|
codigo: z.number().describe("Código da série no SGS/BCB (ex: 433 para IPCA mensal, 11 para Selic)"),
|
|
336
22
|
dataInicial: z.string().optional().describe("Data inicial no formato yyyy-MM-dd ou dd/MM/yyyy (opcional)"),
|
|
337
23
|
dataFinal: z.string().optional().describe("Data final no formato yyyy-MM-dd ou dd/MM/yyyy (opcional)")
|
|
338
|
-
}, async (
|
|
339
|
-
try {
|
|
340
|
-
let url = `${BCB_API_BASE}.${codigo}/dados?formato=json`;
|
|
341
|
-
if (dataInicial) {
|
|
342
|
-
url += `&dataInicial=${formatDateForApi(dataInicial)}`;
|
|
343
|
-
}
|
|
344
|
-
if (dataFinal) {
|
|
345
|
-
url += `&dataFinal=${formatDateForApi(dataFinal)}`;
|
|
346
|
-
}
|
|
347
|
-
const data = await fetchBcbApi(url);
|
|
348
|
-
if (!Array.isArray(data) || data.length === 0) {
|
|
349
|
-
return {
|
|
350
|
-
content: [{
|
|
351
|
-
type: "text",
|
|
352
|
-
text: `Nenhum dado encontrado para a série ${codigo} no período solicitado.`
|
|
353
|
-
}]
|
|
354
|
-
};
|
|
355
|
-
}
|
|
356
|
-
// Find series info if available
|
|
357
|
-
const serieInfo = SERIES_POPULARES.find(s => s.codigo === codigo);
|
|
358
|
-
const result = {
|
|
359
|
-
serie: {
|
|
360
|
-
codigo,
|
|
361
|
-
nome: serieInfo?.nome || `Série ${codigo}`,
|
|
362
|
-
categoria: serieInfo?.categoria || "Desconhecida",
|
|
363
|
-
periodicidade: serieInfo?.periodicidade || "Desconhecida"
|
|
364
|
-
},
|
|
365
|
-
totalRegistros: data.length,
|
|
366
|
-
periodoInicial: data[0].data,
|
|
367
|
-
periodoFinal: data[data.length - 1].data,
|
|
368
|
-
dados: data.map(d => ({
|
|
369
|
-
data: d.data,
|
|
370
|
-
valor: parseFloat(d.valor)
|
|
371
|
-
}))
|
|
372
|
-
};
|
|
373
|
-
return {
|
|
374
|
-
content: [{
|
|
375
|
-
type: "text",
|
|
376
|
-
text: JSON.stringify(result, null, 2)
|
|
377
|
-
}]
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
catch (error) {
|
|
381
|
-
return {
|
|
382
|
-
content: [{
|
|
383
|
-
type: "text",
|
|
384
|
-
text: `Erro ao consultar série ${codigo}: ${error instanceof Error ? error.message : String(error)}`
|
|
385
|
-
}],
|
|
386
|
-
isError: true
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
});
|
|
24
|
+
}, async (args) => handleSerieValores(args));
|
|
390
25
|
// Tool: Get last N values
|
|
391
26
|
server.tool("bcb_serie_ultimos", "Obtém os últimos N valores de uma série temporal do BCB. Útil para consultar dados mais recentes.", {
|
|
392
27
|
codigo: z.number().describe("Código da série no SGS/BCB"),
|
|
393
28
|
quantidade: z.number().min(1).max(1000).default(10).describe("Quantidade de valores a retornar (1-1000, padrão: 10)")
|
|
394
|
-
}, async (
|
|
395
|
-
try {
|
|
396
|
-
const url = `${BCB_API_BASE}.${codigo}/dados/ultimos/${quantidade}?formato=json`;
|
|
397
|
-
const data = await fetchBcbApi(url);
|
|
398
|
-
if (!Array.isArray(data) || data.length === 0) {
|
|
399
|
-
return {
|
|
400
|
-
content: [{
|
|
401
|
-
type: "text",
|
|
402
|
-
text: `Nenhum dado encontrado para a série ${codigo}.`
|
|
403
|
-
}]
|
|
404
|
-
};
|
|
405
|
-
}
|
|
406
|
-
const serieInfo = SERIES_POPULARES.find(s => s.codigo === codigo);
|
|
407
|
-
const result = {
|
|
408
|
-
serie: {
|
|
409
|
-
codigo,
|
|
410
|
-
nome: serieInfo?.nome || `Série ${codigo}`,
|
|
411
|
-
categoria: serieInfo?.categoria || "Desconhecida",
|
|
412
|
-
periodicidade: serieInfo?.periodicidade || "Desconhecida"
|
|
413
|
-
},
|
|
414
|
-
totalRegistros: data.length,
|
|
415
|
-
dados: data.map(d => ({
|
|
416
|
-
data: d.data,
|
|
417
|
-
valor: parseFloat(d.valor)
|
|
418
|
-
}))
|
|
419
|
-
};
|
|
420
|
-
return {
|
|
421
|
-
content: [{
|
|
422
|
-
type: "text",
|
|
423
|
-
text: JSON.stringify(result, null, 2)
|
|
424
|
-
}]
|
|
425
|
-
};
|
|
426
|
-
}
|
|
427
|
-
catch (error) {
|
|
428
|
-
return {
|
|
429
|
-
content: [{
|
|
430
|
-
type: "text",
|
|
431
|
-
text: `Erro ao consultar últimos valores da série ${codigo}: ${error instanceof Error ? error.message : String(error)}`
|
|
432
|
-
}],
|
|
433
|
-
isError: true
|
|
434
|
-
};
|
|
435
|
-
}
|
|
436
|
-
});
|
|
29
|
+
}, async (args) => handleSerieUltimos(args));
|
|
437
30
|
// Tool: Get series metadata
|
|
438
31
|
server.tool("bcb_serie_metadados", "Obtém informações/metadados de uma série temporal do BCB. Retorna nome, periodicidade, categoria e outros detalhes.", {
|
|
439
32
|
codigo: z.number().describe("Código da série no SGS/BCB")
|
|
440
|
-
}, async (
|
|
441
|
-
try {
|
|
442
|
-
// Try to fetch metadata from API endpoint
|
|
443
|
-
const metadataUrl = `https://api.bcb.gov.br/dados/serie/bcdata.sgs.${codigo}/metadados?formato=json`;
|
|
444
|
-
try {
|
|
445
|
-
const metadata = await fetchBcbApi(metadataUrl);
|
|
446
|
-
const serieInfo = SERIES_POPULARES.find(s => s.codigo === codigo);
|
|
447
|
-
const result = {
|
|
448
|
-
codigo: metadata.codigo || codigo,
|
|
449
|
-
nome: metadata.nome || serieInfo?.nome || `Série ${codigo}`,
|
|
450
|
-
unidade: metadata.unidade || "Não informada",
|
|
451
|
-
periodicidade: metadata.periodicidade || serieInfo?.periodicidade || "Não informada",
|
|
452
|
-
fonte: metadata.fonte || "Banco Central do Brasil",
|
|
453
|
-
categoria: serieInfo?.categoria || "Não categorizada",
|
|
454
|
-
especial: metadata.especial || false,
|
|
455
|
-
urlConsulta: `${BCB_API_BASE}.${codigo}/dados?formato=json`,
|
|
456
|
-
urlUltimos10: `${BCB_API_BASE}.${codigo}/dados/ultimos/10?formato=json`
|
|
457
|
-
};
|
|
458
|
-
return {
|
|
459
|
-
content: [{
|
|
460
|
-
type: "text",
|
|
461
|
-
text: JSON.stringify(result, null, 2)
|
|
462
|
-
}]
|
|
463
|
-
};
|
|
464
|
-
}
|
|
465
|
-
catch {
|
|
466
|
-
// If metadata endpoint fails, try to get info from popular series or fetch sample data
|
|
467
|
-
const serieInfo = SERIES_POPULARES.find(s => s.codigo === codigo);
|
|
468
|
-
if (serieInfo) {
|
|
469
|
-
const result = {
|
|
470
|
-
codigo,
|
|
471
|
-
nome: serieInfo.nome,
|
|
472
|
-
periodicidade: serieInfo.periodicidade,
|
|
473
|
-
categoria: serieInfo.categoria,
|
|
474
|
-
fonte: "Banco Central do Brasil",
|
|
475
|
-
urlConsulta: `${BCB_API_BASE}.${codigo}/dados?formato=json`,
|
|
476
|
-
urlUltimos10: `${BCB_API_BASE}.${codigo}/dados/ultimos/10?formato=json`,
|
|
477
|
-
observacao: "Metadados obtidos do catálogo interno"
|
|
478
|
-
};
|
|
479
|
-
return {
|
|
480
|
-
content: [{
|
|
481
|
-
type: "text",
|
|
482
|
-
text: JSON.stringify(result, null, 2)
|
|
483
|
-
}]
|
|
484
|
-
};
|
|
485
|
-
}
|
|
486
|
-
// Try to verify if series exists by fetching last value
|
|
487
|
-
const url = `${BCB_API_BASE}.${codigo}/dados/ultimos/1?formato=json`;
|
|
488
|
-
const data = await fetchBcbApi(url);
|
|
489
|
-
if (Array.isArray(data) && data.length > 0) {
|
|
490
|
-
const result = {
|
|
491
|
-
codigo,
|
|
492
|
-
nome: `Série ${codigo}`,
|
|
493
|
-
ultimoValor: {
|
|
494
|
-
data: data[0].data,
|
|
495
|
-
valor: parseFloat(data[0].valor)
|
|
496
|
-
},
|
|
497
|
-
fonte: "Banco Central do Brasil",
|
|
498
|
-
urlConsulta: `${BCB_API_BASE}.${codigo}/dados?formato=json`,
|
|
499
|
-
observacao: "Série encontrada, mas metadados detalhados não disponíveis"
|
|
500
|
-
};
|
|
501
|
-
return {
|
|
502
|
-
content: [{
|
|
503
|
-
type: "text",
|
|
504
|
-
text: JSON.stringify(result, null, 2)
|
|
505
|
-
}]
|
|
506
|
-
};
|
|
507
|
-
}
|
|
508
|
-
throw new Error("Série não encontrada");
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
catch (error) {
|
|
512
|
-
return {
|
|
513
|
-
content: [{
|
|
514
|
-
type: "text",
|
|
515
|
-
text: `Erro ao consultar metadados da série ${codigo}: ${error instanceof Error ? error.message : String(error)}`
|
|
516
|
-
}],
|
|
517
|
-
isError: true
|
|
518
|
-
};
|
|
519
|
-
}
|
|
520
|
-
});
|
|
33
|
+
}, async (args) => handleSerieMetadados(args));
|
|
521
34
|
// Tool: List popular series
|
|
522
35
|
server.tool("bcb_series_populares", "Lista 150+ séries temporais do BCB com seus códigos. Inclui juros, inflação, câmbio, PIB, emprego, crédito e outros indicadores econômicos.", {
|
|
523
36
|
categoria: z.string().optional().describe("Filtrar por categoria: Juros, Inflação, Câmbio, Atividade Econômica, Emprego, Fiscal, Setor Externo, Crédito, Agregados Monetários, Poupança, Índices de Mercado, Expectativas")
|
|
524
|
-
}, async (
|
|
525
|
-
try {
|
|
526
|
-
let series = SERIES_POPULARES;
|
|
527
|
-
if (categoria) {
|
|
528
|
-
// Normalized search (accent-insensitive)
|
|
529
|
-
const categoriaNorm = normalizeString(categoria);
|
|
530
|
-
series = series.filter(s => normalizeString(s.categoria).includes(categoriaNorm));
|
|
531
|
-
}
|
|
532
|
-
// Group by category
|
|
533
|
-
const porCategoria = {};
|
|
534
|
-
for (const serie of series) {
|
|
535
|
-
if (!porCategoria[serie.categoria]) {
|
|
536
|
-
porCategoria[serie.categoria] = [];
|
|
537
|
-
}
|
|
538
|
-
porCategoria[serie.categoria].push(serie);
|
|
539
|
-
}
|
|
540
|
-
const result = {
|
|
541
|
-
totalSeries: series.length,
|
|
542
|
-
categorias: Object.keys(porCategoria).length,
|
|
543
|
-
series: categoria ? series : porCategoria,
|
|
544
|
-
observacao: "Use bcb_serie_valores ou bcb_serie_ultimos com o código para consultar os dados"
|
|
545
|
-
};
|
|
546
|
-
return {
|
|
547
|
-
content: [{
|
|
548
|
-
type: "text",
|
|
549
|
-
text: JSON.stringify(result, null, 2)
|
|
550
|
-
}]
|
|
551
|
-
};
|
|
552
|
-
}
|
|
553
|
-
catch (error) {
|
|
554
|
-
return {
|
|
555
|
-
content: [{
|
|
556
|
-
type: "text",
|
|
557
|
-
text: `Erro ao listar séries: ${error instanceof Error ? error.message : String(error)}`
|
|
558
|
-
}],
|
|
559
|
-
isError: true
|
|
560
|
-
};
|
|
561
|
-
}
|
|
562
|
-
});
|
|
37
|
+
}, async (args) => handleSeriesPopulares(args));
|
|
563
38
|
// Tool: Search series by name (with normalized search)
|
|
564
39
|
server.tool("bcb_buscar_serie", "Busca séries no catálogo interno por nome ou descrição. Aceita termos com ou sem acentos (ex: 'inflacao' encontra 'Inflação').", {
|
|
565
40
|
termo: z.string().min(2).describe("Termo de busca (mínimo 2 caracteres)")
|
|
566
|
-
}, async (
|
|
567
|
-
try {
|
|
568
|
-
const termoNorm = normalizeString(termo);
|
|
569
|
-
const encontradas = SERIES_POPULARES.filter(s => normalizeString(s.nome).includes(termoNorm) ||
|
|
570
|
-
normalizeString(s.categoria).includes(termoNorm));
|
|
571
|
-
if (encontradas.length === 0) {
|
|
572
|
-
return {
|
|
573
|
-
content: [{
|
|
574
|
-
type: "text",
|
|
575
|
-
text: JSON.stringify({
|
|
576
|
-
termo,
|
|
577
|
-
totalEncontradas: 0,
|
|
578
|
-
mensagem: "Nenhuma série encontrada no catálogo interno. Use o portal SGS do BCB para buscar outras séries: https://www3.bcb.gov.br/sgspub/",
|
|
579
|
-
sugestao: "Tente termos como: selic, ipca, dolar, cambio, pib, inflacao, credito, emprego"
|
|
580
|
-
}, null, 2)
|
|
581
|
-
}]
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
|
-
const result = {
|
|
585
|
-
termo,
|
|
586
|
-
totalEncontradas: encontradas.length,
|
|
587
|
-
series: encontradas
|
|
588
|
-
};
|
|
589
|
-
return {
|
|
590
|
-
content: [{
|
|
591
|
-
type: "text",
|
|
592
|
-
text: JSON.stringify(result, null, 2)
|
|
593
|
-
}]
|
|
594
|
-
};
|
|
595
|
-
}
|
|
596
|
-
catch (error) {
|
|
597
|
-
return {
|
|
598
|
-
content: [{
|
|
599
|
-
type: "text",
|
|
600
|
-
text: `Erro ao buscar séries: ${error instanceof Error ? error.message : String(error)}`
|
|
601
|
-
}],
|
|
602
|
-
isError: true
|
|
603
|
-
};
|
|
604
|
-
}
|
|
605
|
-
});
|
|
41
|
+
}, async (args) => handleBuscarSerie(args));
|
|
606
42
|
// Tool: Get current indicators (convenience)
|
|
607
|
-
server.tool("bcb_indicadores_atuais", "Obtém os valores mais recentes dos principais indicadores econômicos: Selic, IPCA, Dólar PTAX e IBC-Br.", {}, async () => {
|
|
608
|
-
try {
|
|
609
|
-
const indicadores = [
|
|
610
|
-
{ codigo: 432, nome: "Selic (a.a.)" },
|
|
611
|
-
{ codigo: 433, nome: "IPCA mensal (%)" },
|
|
612
|
-
{ codigo: 13522, nome: "IPCA 12 meses (%)" },
|
|
613
|
-
{ codigo: 3698, nome: "Dólar PTAX (venda)" },
|
|
614
|
-
{ codigo: 24364, nome: "IBC-Br" }
|
|
615
|
-
];
|
|
616
|
-
const resultados = await Promise.all(indicadores.map(async (ind) => {
|
|
617
|
-
try {
|
|
618
|
-
const url = `${BCB_API_BASE}.${ind.codigo}/dados/ultimos/1?formato=json`;
|
|
619
|
-
const data = await fetchBcbApi(url);
|
|
620
|
-
if (Array.isArray(data) && data.length > 0) {
|
|
621
|
-
return {
|
|
622
|
-
indicador: ind.nome,
|
|
623
|
-
codigo: ind.codigo,
|
|
624
|
-
data: data[0].data,
|
|
625
|
-
valor: parseFloat(data[0].valor)
|
|
626
|
-
};
|
|
627
|
-
}
|
|
628
|
-
return {
|
|
629
|
-
indicador: ind.nome,
|
|
630
|
-
codigo: ind.codigo,
|
|
631
|
-
erro: "Sem dados disponíveis"
|
|
632
|
-
};
|
|
633
|
-
}
|
|
634
|
-
catch (err) {
|
|
635
|
-
return {
|
|
636
|
-
indicador: ind.nome,
|
|
637
|
-
codigo: ind.codigo,
|
|
638
|
-
erro: err instanceof Error ? err.message : "Erro desconhecido"
|
|
639
|
-
};
|
|
640
|
-
}
|
|
641
|
-
}));
|
|
642
|
-
return {
|
|
643
|
-
content: [{
|
|
644
|
-
type: "text",
|
|
645
|
-
text: JSON.stringify({
|
|
646
|
-
consultadoEm: new Date().toISOString(),
|
|
647
|
-
indicadores: resultados
|
|
648
|
-
}, null, 2)
|
|
649
|
-
}]
|
|
650
|
-
};
|
|
651
|
-
}
|
|
652
|
-
catch (error) {
|
|
653
|
-
return {
|
|
654
|
-
content: [{
|
|
655
|
-
type: "text",
|
|
656
|
-
text: `Erro ao consultar indicadores: ${error instanceof Error ? error.message : String(error)}`
|
|
657
|
-
}],
|
|
658
|
-
isError: true
|
|
659
|
-
};
|
|
660
|
-
}
|
|
661
|
-
});
|
|
43
|
+
server.tool("bcb_indicadores_atuais", "Obtém os valores mais recentes dos principais indicadores econômicos: Selic, IPCA, Dólar PTAX e IBC-Br.", {}, async () => handleIndicadoresAtuais({}));
|
|
662
44
|
// Tool: Calculate percentage variation
|
|
663
45
|
server.tool("bcb_variacao", "Calcula a variação percentual de uma série entre duas datas ou nos últimos N períodos. Útil para análise de tendências.", {
|
|
664
46
|
codigo: z.number().describe("Código da série no SGS/BCB"),
|
|
665
47
|
dataInicial: z.string().optional().describe("Data inicial (yyyy-MM-dd ou dd/MM/yyyy). Se não informada, usa o primeiro valor disponível."),
|
|
666
48
|
dataFinal: z.string().optional().describe("Data final (yyyy-MM-dd ou dd/MM/yyyy). Se não informada, usa o último valor disponível."),
|
|
667
49
|
periodos: z.number().optional().describe("Alternativa: calcular variação dos últimos N períodos (ignora datas se informado)")
|
|
668
|
-
}, async (
|
|
669
|
-
try {
|
|
670
|
-
let data;
|
|
671
|
-
if (periodos && periodos > 1) {
|
|
672
|
-
// Fetch last N values
|
|
673
|
-
const url = `${BCB_API_BASE}.${codigo}/dados/ultimos/${periodos}?formato=json`;
|
|
674
|
-
data = await fetchBcbApi(url);
|
|
675
|
-
}
|
|
676
|
-
else {
|
|
677
|
-
// Fetch by date range
|
|
678
|
-
let url = `${BCB_API_BASE}.${codigo}/dados?formato=json`;
|
|
679
|
-
if (dataInicial) {
|
|
680
|
-
url += `&dataInicial=${formatDateForApi(dataInicial)}`;
|
|
681
|
-
}
|
|
682
|
-
if (dataFinal) {
|
|
683
|
-
url += `&dataFinal=${formatDateForApi(dataFinal)}`;
|
|
684
|
-
}
|
|
685
|
-
data = await fetchBcbApi(url);
|
|
686
|
-
}
|
|
687
|
-
if (!Array.isArray(data) || data.length < 2) {
|
|
688
|
-
return {
|
|
689
|
-
content: [{
|
|
690
|
-
type: "text",
|
|
691
|
-
text: `Dados insuficientes para calcular variação. São necessários pelo menos 2 valores.`
|
|
692
|
-
}]
|
|
693
|
-
};
|
|
694
|
-
}
|
|
695
|
-
const serieInfo = SERIES_POPULARES.find(s => s.codigo === codigo);
|
|
696
|
-
const valorInicial = parseFloat(data[0].valor);
|
|
697
|
-
const valorFinal = parseFloat(data[data.length - 1].valor);
|
|
698
|
-
const variacao = calculateVariation(valorInicial, valorFinal);
|
|
699
|
-
const diferencaAbsoluta = valorFinal - valorInicial;
|
|
700
|
-
// Calculate intermediate statistics
|
|
701
|
-
const valores = data.map(d => parseFloat(d.valor));
|
|
702
|
-
const maximo = Math.max(...valores);
|
|
703
|
-
const minimo = Math.min(...valores);
|
|
704
|
-
const media = valores.reduce((a, b) => a + b, 0) / valores.length;
|
|
705
|
-
const result = {
|
|
706
|
-
serie: {
|
|
707
|
-
codigo,
|
|
708
|
-
nome: serieInfo?.nome || `Série ${codigo}`,
|
|
709
|
-
categoria: serieInfo?.categoria || "Desconhecida"
|
|
710
|
-
},
|
|
711
|
-
periodo: {
|
|
712
|
-
dataInicial: data[0].data,
|
|
713
|
-
dataFinal: data[data.length - 1].data,
|
|
714
|
-
totalPeriodos: data.length
|
|
715
|
-
},
|
|
716
|
-
analise: {
|
|
717
|
-
valorInicial,
|
|
718
|
-
valorFinal,
|
|
719
|
-
diferencaAbsoluta: Number(diferencaAbsoluta.toFixed(4)),
|
|
720
|
-
variacaoPercentual: Number(variacao.toFixed(4)),
|
|
721
|
-
variacaoFormatada: `${variacao >= 0 ? "+" : ""}${variacao.toFixed(2)}%`
|
|
722
|
-
},
|
|
723
|
-
estatisticas: {
|
|
724
|
-
maximo: Number(maximo.toFixed(4)),
|
|
725
|
-
minimo: Number(minimo.toFixed(4)),
|
|
726
|
-
media: Number(media.toFixed(4)),
|
|
727
|
-
amplitude: Number((maximo - minimo).toFixed(4))
|
|
728
|
-
}
|
|
729
|
-
};
|
|
730
|
-
return {
|
|
731
|
-
content: [{
|
|
732
|
-
type: "text",
|
|
733
|
-
text: JSON.stringify(result, null, 2)
|
|
734
|
-
}]
|
|
735
|
-
};
|
|
736
|
-
}
|
|
737
|
-
catch (error) {
|
|
738
|
-
return {
|
|
739
|
-
content: [{
|
|
740
|
-
type: "text",
|
|
741
|
-
text: `Erro ao calcular variação: ${error instanceof Error ? error.message : String(error)}`
|
|
742
|
-
}],
|
|
743
|
-
isError: true
|
|
744
|
-
};
|
|
745
|
-
}
|
|
746
|
-
});
|
|
50
|
+
}, async (args) => handleVariacao(args));
|
|
747
51
|
// Tool: Compare multiple series
|
|
748
52
|
server.tool("bcb_comparar", "Compara 2 a 5 séries temporais no mesmo período. Útil para análise de correlação entre indicadores.", {
|
|
749
53
|
codigos: z.array(z.number()).min(2).max(5).describe("Array com 2 a 5 códigos de séries para comparar"),
|
|
750
54
|
dataInicial: z.string().describe("Data inicial (yyyy-MM-dd ou dd/MM/yyyy)"),
|
|
751
55
|
dataFinal: z.string().describe("Data final (yyyy-MM-dd ou dd/MM/yyyy)")
|
|
752
|
-
}, async (
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
totalRegistros: data.length,
|
|
778
|
-
valorInicial,
|
|
779
|
-
valorFinal,
|
|
780
|
-
variacaoPercentual: Number(variacao.toFixed(4)),
|
|
781
|
-
variacaoFormatada: `${variacao >= 0 ? "+" : ""}${variacao.toFixed(2)}%`,
|
|
782
|
-
maximo: Math.max(...valores),
|
|
783
|
-
minimo: Math.min(...valores),
|
|
784
|
-
media: Number((valores.reduce((a, b) => a + b, 0) / valores.length).toFixed(4))
|
|
785
|
-
};
|
|
786
|
-
}
|
|
787
|
-
catch (err) {
|
|
788
|
-
const serieInfo = SERIES_POPULARES.find(s => s.codigo === codigo);
|
|
789
|
-
return {
|
|
790
|
-
codigo,
|
|
791
|
-
nome: serieInfo?.nome || `Série ${codigo}`,
|
|
792
|
-
erro: err instanceof Error ? err.message : "Erro desconhecido"
|
|
793
|
-
};
|
|
56
|
+
}, async (args) => handleComparar(args));
|
|
57
|
+
// ==================== RESOURCES ====================
|
|
58
|
+
server.resource("series_populares", "bcb://series/populares", {
|
|
59
|
+
description: "Catálogo de 150+ séries econômicas populares do BCB organizadas por categoria",
|
|
60
|
+
mimeType: "application/json"
|
|
61
|
+
}, async () => ({
|
|
62
|
+
contents: [
|
|
63
|
+
{
|
|
64
|
+
uri: "bcb://series/populares",
|
|
65
|
+
mimeType: "application/json",
|
|
66
|
+
text: JSON.stringify(SERIES_POPULARES, null, 2)
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
}));
|
|
70
|
+
server.resource("categorias", "bcb://series/categorias", {
|
|
71
|
+
description: "Lista de categorias disponíveis no catálogo de séries do BCB",
|
|
72
|
+
mimeType: "application/json"
|
|
73
|
+
}, async () => {
|
|
74
|
+
const categorias = [...new Set(SERIES_POPULARES.map(s => s.categoria))].sort();
|
|
75
|
+
return {
|
|
76
|
+
contents: [
|
|
77
|
+
{
|
|
78
|
+
uri: "bcb://series/categorias",
|
|
79
|
+
mimeType: "application/json",
|
|
80
|
+
text: JSON.stringify(categorias, null, 2)
|
|
794
81
|
}
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
const seriesComDados = resultados.filter(r => !("erro" in r));
|
|
798
|
-
const seriesComErro = resultados.filter(r => "erro" in r);
|
|
799
|
-
const seriesOrdenadas = [...seriesComDados].sort((a, b) => {
|
|
800
|
-
const varA = "variacaoPercentual" in a && typeof a.variacaoPercentual === "number" ? a.variacaoPercentual : 0;
|
|
801
|
-
const varB = "variacaoPercentual" in b && typeof b.variacaoPercentual === "number" ? b.variacaoPercentual : 0;
|
|
802
|
-
return varB - varA;
|
|
803
|
-
});
|
|
804
|
-
const result = {
|
|
805
|
-
periodo: {
|
|
806
|
-
dataInicial: formatDateForApi(dataInicial),
|
|
807
|
-
dataFinal: formatDateForApi(dataFinal)
|
|
808
|
-
},
|
|
809
|
-
totalSeries: codigos.length,
|
|
810
|
-
seriesComDados: seriesComDados.length,
|
|
811
|
-
seriesComErro: seriesComErro.length,
|
|
812
|
-
ranking: seriesOrdenadas.map((s, i) => ({
|
|
813
|
-
posicao: i + 1,
|
|
814
|
-
...s
|
|
815
|
-
})),
|
|
816
|
-
erros: seriesComErro.length > 0 ? seriesComErro : undefined
|
|
817
|
-
};
|
|
818
|
-
return {
|
|
819
|
-
content: [{
|
|
820
|
-
type: "text",
|
|
821
|
-
text: JSON.stringify(result, null, 2)
|
|
822
|
-
}]
|
|
823
|
-
};
|
|
824
|
-
}
|
|
825
|
-
catch (error) {
|
|
826
|
-
return {
|
|
827
|
-
content: [{
|
|
828
|
-
type: "text",
|
|
829
|
-
text: `Erro ao comparar séries: ${error instanceof Error ? error.message : String(error)}`
|
|
830
|
-
}],
|
|
831
|
-
isError: true
|
|
832
|
-
};
|
|
833
|
-
}
|
|
82
|
+
]
|
|
83
|
+
};
|
|
834
84
|
});
|
|
85
|
+
server.resource("codigos_principais", "bcb://series/principais", {
|
|
86
|
+
description: "Códigos dos indicadores econômicos mais utilizados (Selic, IPCA, Dólar, PIB, etc.)",
|
|
87
|
+
mimeType: "application/json"
|
|
88
|
+
}, async () => ({
|
|
89
|
+
contents: [
|
|
90
|
+
{
|
|
91
|
+
uri: "bcb://series/principais",
|
|
92
|
+
mimeType: "application/json",
|
|
93
|
+
text: JSON.stringify({
|
|
94
|
+
juros: { selic_meta: 1178, selic_acumulada: 432, cdi: 4389, tr: 226 },
|
|
95
|
+
inflacao: { ipca_mensal: 433, ipca_12m: 13522, igpm: 189, inpc: 188 },
|
|
96
|
+
cambio: { dolar_venda: 1, dolar_ptax: 3698, euro: 21619 },
|
|
97
|
+
atividade: { pib_mensal: 4380, ibc_br: 24364 },
|
|
98
|
+
emprego: { desemprego: 24369, rendimento_medio: 24380 },
|
|
99
|
+
fiscal: { divida_bruta: 4513, divida_liquida: 4503, resultado_primario: 4537 }
|
|
100
|
+
}, null, 2)
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
}));
|
|
104
|
+
// ==================== PROMPTS ====================
|
|
105
|
+
server.prompt("indicadores_atuais", "Consulta os principais indicadores econômicos do Brasil (Selic, IPCA, Dólar, IBC-Br)", async () => ({
|
|
106
|
+
messages: [
|
|
107
|
+
{
|
|
108
|
+
role: "user",
|
|
109
|
+
content: {
|
|
110
|
+
type: "text",
|
|
111
|
+
text: "Consulte os indicadores econômicos atuais do Brasil usando a ferramenta bcb_indicadores_atuais e apresente os resultados de forma clara e organizada."
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}));
|
|
116
|
+
server.prompt("panorama_economico", "Gera um panorama completo da economia brasileira com os principais indicadores", async () => ({
|
|
117
|
+
messages: [
|
|
118
|
+
{
|
|
119
|
+
role: "user",
|
|
120
|
+
content: {
|
|
121
|
+
type: "text",
|
|
122
|
+
text: "Faça um panorama completo da economia brasileira. Use bcb_indicadores_atuais para obter Selic, IPCA, Dólar e IBC-Br. Depois use bcb_serie_ultimos para consultar os últimos 3 valores da taxa de desemprego (código 24369) e da dívida bruta (código 4513). Apresente tudo de forma organizada com análise breve."
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
}));
|
|
127
|
+
server.prompt("comparar_inflacao", "Compara os principais índices de inflação do Brasil (IPCA, IGP-M, INPC) nos últimos 12 meses", async () => ({
|
|
128
|
+
messages: [
|
|
129
|
+
{
|
|
130
|
+
role: "user",
|
|
131
|
+
content: {
|
|
132
|
+
type: "text",
|
|
133
|
+
text: "Compare os principais índices de inflação do Brasil nos últimos 12 meses. Use bcb_serie_ultimos com quantidade 12 para IPCA (código 433), IGP-M (código 189) e INPC (código 188). Apresente uma tabela comparativa e análise das tendências."
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
}));
|
|
835
138
|
// Start server
|
|
836
139
|
async function main() {
|
|
837
140
|
const transport = new StdioServerTransport();
|