bcb-br-mcp 1.12.0 → 1.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/vocabulario.d.ts +12 -27
- package/dist/vocabulario.d.ts.map +1 -1
- package/dist/vocabulario.js +23 -87
- package/dist/vocabulario.js.map +1 -1
- package/package.json +2 -2
package/dist/vocabulario.d.ts
CHANGED
|
@@ -32,15 +32,12 @@
|
|
|
32
32
|
* (0 / 0), bolsa/ibovespa (0 / 0 — não é do BCB), pix (0 / 0 no índice por
|
|
33
33
|
* código), bitcoin, juro real, commodities/ic-br (0 / 0).
|
|
34
34
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* Mesma receita de `src/ilostat/vocabulary.ts` (ilo 0.6.0), `src/uis/vocabulary.ts`
|
|
42
|
-
* (uis 0.3.0), `src/vocabulario.ts` (ibge 5.1.0) e `src/clients/cid10-vocabulary.ts`
|
|
43
|
-
* (medical 1.12.0) — cinco servidores com ela: candidata a `@sbissoli/mcp-search`.
|
|
35
|
+
* A MECÂNICA (frases da tabela antes da quebra em palavras, stopwords do
|
|
36
|
+
* pt-BR fora do AND, singular sem caco, OR das grafias do BCB, a nota dita e
|
|
37
|
+
* a ponta inversa para o acervo de `search`) mora em `@sbissoli/mcp-search`
|
|
38
|
+
* desde a 0.5.0 — cinco servidores a carregavam em cópia; aqui fica só a
|
|
39
|
+
* tabela. Os nomes exportados são os de sempre (em português), para quem
|
|
40
|
+
* chama não mudar.
|
|
44
41
|
*/
|
|
45
42
|
export interface EntradaVocabulario {
|
|
46
43
|
/** Como o usuário escreve — normalizado (sem acento, minúsculo); pode ser frase. */
|
|
@@ -49,32 +46,20 @@ export interface EntradaVocabulario {
|
|
|
49
46
|
readonly fonte: readonly string[];
|
|
50
47
|
}
|
|
51
48
|
export declare const VOCABULARIO: readonly EntradaVocabulario[];
|
|
52
|
-
/** Sem acento, caixa baixa, espaços colapsados — o `normalizeString` do servidor, mais o colapso. */
|
|
53
|
-
export declare function normalizar(texto: string): string;
|
|
54
49
|
export interface TermoExpandido {
|
|
55
50
|
readonly termo: string;
|
|
56
51
|
readonly padroes: readonly string[];
|
|
57
52
|
/** A tabela (não a mera flexão de plural) mudou o que se procura. */
|
|
58
53
|
readonly traduzido: boolean;
|
|
59
54
|
}
|
|
60
|
-
/**
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* "corrente" e "basicos" entrariam no AND e matariam o resultado. O que sobra
|
|
64
|
-
* é quebrado em palavras, sem stopword, cada uma expandida.
|
|
65
|
-
*/
|
|
55
|
+
/** Sem acento, caixa baixa, espaços colapsados — o mesmo funil do ranking. */
|
|
56
|
+
export declare const normalizar: (text: string) => string;
|
|
57
|
+
/** A busca inteira, termo a termo (frases da tabela viram UM termo antes da quebra). */
|
|
66
58
|
export declare function expandirBusca(busca: string): TermoExpandido[];
|
|
67
|
-
/**
|
|
68
|
-
* A frase que conta ao chamador que a palavra dele não é a do BCB — sem isto a
|
|
69
|
-
* tradução é invisível e o resultado parece vir do que ele escreveu.
|
|
70
|
-
*/
|
|
59
|
+
/** A frase que conta ao chamador que a palavra dele não é a do BCB. */
|
|
71
60
|
export declare function notasDeVocabulario(expandidos: readonly TermoExpandido[]): string[];
|
|
72
61
|
/** Um texto (já normalizado) casa TODOS os termos expandidos? */
|
|
73
62
|
export declare function casaBusca(textoNormalizado: string, expandidos: readonly TermoExpandido[]): boolean;
|
|
74
|
-
/**
|
|
75
|
-
|
|
76
|
-
* série — keywords do acervo de `search`, que ranqueia por relevância em vez
|
|
77
|
-
* de casar substring.
|
|
78
|
-
*/
|
|
79
|
-
export declare function palavrasPerguntadas(nome: string): string[];
|
|
63
|
+
/** A ponta inversa: as palavras com que se PERGUNTA por este nome — keywords do acervo de `search`. */
|
|
64
|
+
export declare const palavrasPerguntadas: (name: string) => string[];
|
|
80
65
|
//# sourceMappingURL=vocabulario.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vocabulario.d.ts","sourceRoot":"","sources":["../src/vocabulario.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"vocabulario.d.ts","sourceRoot":"","sources":["../src/vocabulario.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAIH,MAAM,WAAW,kBAAkB;IACjC,oFAAoF;IACpF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,eAAO,MAAM,WAAW,EAAE,SAAS,kBAAkB,EAWpD,CAAC;AAQF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAKD,8EAA8E;AAC9E,eAAO,MAAM,UAAU,0BAAwB,CAAC;AAChD,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAE7D;AACD,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,EAAE,CAElF;AACD,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,cAAc,EAAE,GAAG,OAAO,CAElG;AACD,uGAAuG;AACvG,eAAO,MAAM,mBAAmB,4BAA4B,CAAC"}
|
package/dist/vocabulario.js
CHANGED
|
@@ -32,17 +32,14 @@
|
|
|
32
32
|
* (0 / 0), bolsa/ibovespa (0 / 0 — não é do BCB), pix (0 / 0 no índice por
|
|
33
33
|
* código), bitcoin, juro real, commodities/ic-br (0 / 0).
|
|
34
34
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* Mesma receita de `src/ilostat/vocabulary.ts` (ilo 0.6.0), `src/uis/vocabulary.ts`
|
|
42
|
-
* (uis 0.3.0), `src/vocabulario.ts` (ibge 5.1.0) e `src/clients/cid10-vocabulary.ts`
|
|
43
|
-
* (medical 1.12.0) — cinco servidores com ela: candidata a `@sbissoli/mcp-search`.
|
|
35
|
+
* A MECÂNICA (frases da tabela antes da quebra em palavras, stopwords do
|
|
36
|
+
* pt-BR fora do AND, singular sem caco, OR das grafias do BCB, a nota dita e
|
|
37
|
+
* a ponta inversa para o acervo de `search`) mora em `@sbissoli/mcp-search`
|
|
38
|
+
* desde a 0.5.0 — cinco servidores a carregavam em cópia; aqui fica só a
|
|
39
|
+
* tabela. Os nomes exportados são os de sempre (em português), para quem
|
|
40
|
+
* chama não mudar.
|
|
44
41
|
*/
|
|
45
|
-
import {
|
|
42
|
+
import { createVocabulary } from "@sbissoli/mcp-search";
|
|
46
43
|
export const VOCABULARIO = [
|
|
47
44
|
{ perguntado: "deficit", fonte: ["resultado primario", "resultado nominal"] },
|
|
48
45
|
{ perguntado: "superavit", fonte: ["resultado primario", "resultado nominal"] },
|
|
@@ -55,88 +52,27 @@ export const VOCABULARIO = [
|
|
|
55
52
|
{ perguntado: "investimento estrangeiro", fonte: ["investimento direto", "investimentos diretos"] },
|
|
56
53
|
{ perguntado: "conta corrente", fonte: ["transacoes correntes"] }
|
|
57
54
|
];
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
*/
|
|
68
|
-
const STOPWORDS = new Set([
|
|
69
|
-
"a", "o", "as", "os", "um", "uma", "de", "da", "do", "das", "dos", "e", "em", "no", "na", "nos", "nas",
|
|
70
|
-
"ao", "aos", "por", "para", "com", "sem", "que", "ou"
|
|
71
|
-
]);
|
|
72
|
-
/** Sem acento, caixa baixa, espaços colapsados — o `normalizeString` do servidor, mais o colapso. */
|
|
73
|
-
export function normalizar(texto) {
|
|
74
|
-
return normalizeString(texto).replace(/\s+/g, " ").trim();
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Forma singular de um termo já normalizado — a substring mais curta casa o
|
|
78
|
-
* plural também. Só as regras do português que não fabricam caco.
|
|
79
|
-
*/
|
|
80
|
-
function singulares(termo) {
|
|
81
|
-
if (termo.length > 4 && (termo.endsWith("oes") || termo.endsWith("aes")))
|
|
82
|
-
return [`${termo.slice(0, -3)}ao`];
|
|
83
|
-
if (termo.length > 4 && /(ais|eis|ois)$/.test(termo))
|
|
84
|
-
return [`${termo.slice(0, -2)}l`];
|
|
85
|
-
if (termo.length > 3 && termo.endsWith("s") && !termo.endsWith("ss"))
|
|
86
|
-
return [termo.slice(0, -1)];
|
|
87
|
-
return [];
|
|
88
|
-
}
|
|
89
|
-
function expandirUm(termo) {
|
|
90
|
-
const padroes = [termo, ...(POR_PERGUNTADO.get(termo) ?? []), ...singulares(termo).flatMap(s => [s, ...(POR_PERGUNTADO.get(s) ?? [])])];
|
|
91
|
-
const traduzido = POR_PERGUNTADO.has(termo) || singulares(termo).some(s => POR_PERGUNTADO.has(s));
|
|
92
|
-
return { termo, padroes: [...new Set(padroes)], traduzido };
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* A busca inteira, termo a termo. Uma frase da tabela ("conta corrente",
|
|
96
|
-
* "juros basicos") vira UM termo antes da quebra em palavras — senão
|
|
97
|
-
* "corrente" e "basicos" entrariam no AND e matariam o resultado. O que sobra
|
|
98
|
-
* é quebrado em palavras, sem stopword, cada uma expandida.
|
|
99
|
-
*/
|
|
55
|
+
const vocabulario = createVocabulary({
|
|
56
|
+
entries: VOCABULARIO.map(e => ({ asked: e.perguntado, source: e.fonte })),
|
|
57
|
+
locale: "pt-BR",
|
|
58
|
+
sourceName: "o BCB"
|
|
59
|
+
});
|
|
60
|
+
const emPortugues = (e) => ({ termo: e.term, padroes: e.patterns, traduzido: e.translated });
|
|
61
|
+
const emIngles = (e) => ({ term: e.termo, patterns: e.padroes, translated: e.traduzido });
|
|
62
|
+
/** Sem acento, caixa baixa, espaços colapsados — o mesmo funil do ranking. */
|
|
63
|
+
export const normalizar = vocabulario.normalize;
|
|
64
|
+
/** A busca inteira, termo a termo (frases da tabela viram UM termo antes da quebra). */
|
|
100
65
|
export function expandirBusca(busca) {
|
|
101
|
-
|
|
102
|
-
const saida = [];
|
|
103
|
-
for (const frase of FRASES) {
|
|
104
|
-
const agulha = ` ${frase} `;
|
|
105
|
-
if (resto.includes(agulha)) {
|
|
106
|
-
saida.push(expandirUm(frase));
|
|
107
|
-
resto = resto.replace(agulha, " ");
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
const palavras = resto.split(" ").filter(Boolean);
|
|
111
|
-
const ficam = palavras.filter(p => !STOPWORDS.has(p));
|
|
112
|
-
for (const p of ficam.length || saida.length ? ficam : palavras)
|
|
113
|
-
saida.push(expandirUm(p));
|
|
114
|
-
return saida;
|
|
66
|
+
return vocabulario.expandQuery(busca).map(emPortugues);
|
|
115
67
|
}
|
|
116
|
-
/**
|
|
117
|
-
* A frase que conta ao chamador que a palavra dele não é a do BCB — sem isto a
|
|
118
|
-
* tradução é invisível e o resultado parece vir do que ele escreveu.
|
|
119
|
-
*/
|
|
68
|
+
/** A frase que conta ao chamador que a palavra dele não é a do BCB. */
|
|
120
69
|
export function notasDeVocabulario(expandidos) {
|
|
121
|
-
return expandidos
|
|
122
|
-
.filter(e => e.traduzido)
|
|
123
|
-
.map(e => {
|
|
124
|
-
const outros = e.padroes.filter(p => p !== e.termo);
|
|
125
|
-
return `"${e.termo}" também foi buscado como ${outros.join(", ")} — a palavra que o BCB usa.`;
|
|
126
|
-
});
|
|
70
|
+
return vocabulario.vocabularyNotes(expandidos.map(emIngles));
|
|
127
71
|
}
|
|
128
72
|
/** Um texto (já normalizado) casa TODOS os termos expandidos? */
|
|
129
73
|
export function casaBusca(textoNormalizado, expandidos) {
|
|
130
|
-
return
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* A ponta inversa da tabela: as palavras com que se PERGUNTA por este nome de
|
|
134
|
-
* série — keywords do acervo de `search`, que ranqueia por relevância em vez
|
|
135
|
-
* de casar substring.
|
|
136
|
-
*/
|
|
137
|
-
export function palavrasPerguntadas(nome) {
|
|
138
|
-
const n = normalizar(nome);
|
|
139
|
-
const saida = VOCABULARIO.filter(e => e.fonte.some(f => n.includes(f))).map(e => e.perguntado);
|
|
140
|
-
return [...new Set(saida)];
|
|
74
|
+
return vocabulario.matchesQuery(textoNormalizado, expandidos.map(emIngles));
|
|
141
75
|
}
|
|
76
|
+
/** A ponta inversa: as palavras com que se PERGUNTA por este nome — keywords do acervo de `search`. */
|
|
77
|
+
export const palavrasPerguntadas = vocabulario.askedWordsFor;
|
|
142
78
|
//# sourceMappingURL=vocabulario.js.map
|
package/dist/vocabulario.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vocabulario.js","sourceRoot":"","sources":["../src/vocabulario.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"vocabulario.js","sourceRoot":"","sources":["../src/vocabulario.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,gBAAgB,EAAqB,MAAM,sBAAsB,CAAC;AAS3E,MAAM,CAAC,MAAM,WAAW,GAAkC;IACxD,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,EAAE;IAC7E,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,EAAE;IAC/E,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,EAAE;IAClD,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE;IACjD,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE;IAC/C,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE;IACpD,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE;IACjD,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE;IAC3C,EAAE,UAAU,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,EAAE;IACnG,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,sBAAsB,CAAC,EAAE;CAClE,CAAC;AAEF,MAAM,WAAW,GAAG,gBAAgB,CAAC;IACnC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,OAAO;IACf,UAAU,EAAE,OAAO;CACpB,CAAC,CAAC;AASH,MAAM,WAAW,GAAG,CAAC,CAAe,EAAkB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;AAC3H,MAAM,QAAQ,GAAG,CAAC,CAAiB,EAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AAExH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC;AAChD,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACzD,CAAC;AACD,uEAAuE;AACvE,MAAM,UAAU,kBAAkB,CAAC,UAAqC;IACtE,OAAO,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/D,CAAC;AACD,iEAAiE;AACjE,MAAM,UAAU,SAAS,CAAC,gBAAwB,EAAE,UAAqC;IACvF,OAAO,WAAW,CAAC,YAAY,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9E,CAAC;AACD,uGAAuG;AACvG,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC,aAAa,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bcb-br-mcp",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.1",
|
|
4
4
|
"mcpName": "io.github.SidneyBissoli/bcb-br-mcp",
|
|
5
5
|
"description": "MCP server for the Brazilian Central Bank (Banco Central do Brasil, BCB): SGS time series (Selic, IPCA, exchange rates, GDP and a curated catalogue of indicators), Focus market expectations, PTAX exchange rates and the Olinda open-data platform, with a provenance block on every response.",
|
|
6
6
|
"type": "module",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
66
66
|
"@sbissoli/mcp-provenance": "^0.1.0",
|
|
67
|
-
"@sbissoli/mcp-search": "^0.
|
|
67
|
+
"@sbissoli/mcp-search": "^0.5.0",
|
|
68
68
|
"@sbissoli/mcp-stats": "^0.3.0"
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|