opf-br-mcp 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +34 -10
  2. package/dist/index.js +185 -112
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -21,6 +21,10 @@ acesso token-eficiente às regras do Open Finance Brasil.
21
21
  | `payments-common-rules` | Confluence público OFB (Serviços - SV) | Conteúdo comum aos produtos de Iniciação de Pagamentos (atores, Idempotência, Como Assinar o Payload, Convenções de data/fuso, Polling) — item por seção |
22
22
  | `payments-implementation-guides` | Confluence público OFB (Serviços - SV) | Guias de Implementação (Pix Automático, Agendamento Recorrente, Transferências Inteligentes, Liquidação de QR Codes) — item por seção |
23
23
  | `consents-v3-openapi` | GitHub Pages openbanking-brasil.github.io | Spec OpenAPI 3.3.1 da API de Consentimentos (Dados Cadastrais e Transacionais) |
24
+ | `resources-v3-openapi` | GitHub Pages openbanking-brasil.github.io | Spec OpenAPI 3.1.0 da API de Recursos (`GET /resources`: status dos recursos compartilhados) |
25
+ | `resources-v3-business-rules` | Confluence público OFB (Dados - DC) | Regras de negócio da API de Recursos 3.1.0 (Informações Gerais, Orientações) — item por seção |
26
+ | `accounts-v2-openapi` | GitHub Pages openbanking-brasil.github.io | Spec OpenAPI 2.4.2 da API de Contas (listagem, saldos, transações, limites de cheque especial) |
27
+ | `accounts-v2-business-rules` | Confluence público OFB (Dados - DC) | Regras de negócio da API de Contas 2.4.2 (Informações Gerais, Orientações — contraparte/IN BCB nº 371) — item por seção |
24
28
  | `pcm-openapi` | GitHub OpenBanking-Brasil/pcm-specs | Spec OpenAPI da PCM (reportes, hybrid-flow, opendata, consents/stock, credit-portabilities, payments/status) |
25
29
  | `pcm-business-rules` | Confluence público OFB | Regras de negócio da PCM (Reporte, Processamento, Divergências, Especificação Técnica, Manual de Integração) — item por seção |
26
30
  | `jornada-otimizada` | Confluence público OFB | Regras da Jornada Otimizada (Orientações Gerais, Transferências Inteligentes, Jornada sem Redirecionamento) — item por seção |
@@ -32,13 +36,25 @@ acesso token-eficiente às regras do Open Finance Brasil.
32
36
 
33
37
  ## Tools
34
38
 
35
- - `list_domains()` — descoberta: domínios, filtros e estado do cache
39
+ - `list_domains()` — descoberta: domínios, filtros, versão da spec de origem e estado do cache
36
40
  - `search(domain, query?, filters?, limit?, offset?)` — busca filtrada, retorno compacto
37
41
  - `get_item(domain, id)` — registro completo
38
42
  - `refresh(domain?)` — força re-extração das fontes
39
43
 
40
44
  Fluxo recomendado para o agente: `list_domains` → `search` → `get_item`.
41
45
 
46
+ ### Qual versão estou usando?
47
+
48
+ `list_domains` devolve `server: { name, version }` junto do catálogo, então o
49
+ agente descobre a versão do server na mesma chamada com que descobre os domínios.
50
+ Cada domínio que embrulha uma spec traz também o seu `specVersion`.
51
+
52
+ Pela linha de comando:
53
+
54
+ ```bash
55
+ npx opf-br-mcp --version
56
+ ```
57
+
42
58
  Domínios marcados como `live` (ex.: `portal`) consultam a fonte a cada chamada:
43
59
  não têm cache nem `refresh`, e `search` exige `query`. Quando um `search` em
44
60
  domínio comum retorna 0 resultados, a resposta inclui um `hint` sugerindo o
@@ -52,20 +68,28 @@ bem na janela de contexto de um agente, e despejá-la desperdiça tokens. A solu
52
68
  apenas o mínimo necessário em cada etapa do funil:
53
69
 
54
70
  1. **`list_domains`** — catálogo barato: quais domínios e filtros existem.
55
- 2. **`search`** — índice **pesquisável e resumido**. Cada resultado traz só
56
- `id`, `path`, `method`, `summary`/`name` e `required`; o nó pesado da spec
57
- (`detail`) é removido do resumo, e o retorno ainda é compactado (omite `null`
58
- e arrays vazios).
71
+ 2. **`search`** — índice **pesquisável e resumido**. Cada resultado traz só os
72
+ campos leves (`id`, `type`, `path`, `method`, `summary`/`name`, `required`,
73
+ `in`); o nó pesado da spec (`detail`) e a lista `refs` são removidos do
74
+ resumo, e o retorno ainda é compactado (omite `null` e arrays vazios).
59
75
  3. **`get_item`** — só aqui o nó integral da spec é entregue, e apenas para o
60
76
  `id` que o agente escolheu.
61
77
 
62
78
  Como o Swagger/OpenAPI vira dados pesquisáveis: o parser "achata" a spec em itens
63
79
  com `id` estável — um por endpoint (`type: operation`, ex.
64
- `payments-v4:POST /pix/payments`) e um por schema (`type: schema`, ex.
65
- `payments-v4:schema:PixPayment`). O JSON completo de cada nó fica retido em
66
- `detail` até um `get_item` explícito. Os `id`s não são adivinháveis: sempre vêm
67
- de um `search`. Assim o agente localiza o endpoint/schema certo pagando poucos
68
- tokens e só "paga" o payload integral quando pede um item nomeado.
80
+ `payments-v4:POST /pix/payments`) e um por component reutilizável: `type: schema`
81
+ (`payments-v4:schema:PixPayment`), `type: response` (`webhook:response:202Webhook`),
82
+ `type: parameter` (`webhook:parameter:xWebhookInteractionId`) e `type: header`
83
+ (`payments:header:X-V`). O JSON completo de
84
+ cada nó fica retido em `detail` até um `get_item` explícito. Os `id`s não são
85
+ adivinháveis: sempre vêm de um `search`. Assim o agente localiza o endpoint/schema
86
+ certo pagando poucos tokens e só "paga" o payload integral quando pede um item nomeado.
87
+
88
+ Os `$ref` não são expandidos em linha (medimos 3–7x mais tokens por operação):
89
+ em vez disso, o `get_item` de um item traz `refs` com os `id`s dos components que
90
+ ele referencia — todos resolvíveis por `get_item`. Resolver
91
+ `responses.202.$ref: '#/components/responses/202Webhook'` é uma chamada a mais,
92
+ não uma ida ao YAML da fonte.
69
93
 
70
94
  Dados: extraídos das fontes públicas na primeira consulta (lazy), cache em
71
95
  `~/.cache/opf-br-mcp/` com TTL de 72h. Sem rede, serve cache expirado com aviso.
package/dist/index.js CHANGED
@@ -46,7 +46,7 @@ function isFresh(entry, ttlHours, now = /* @__PURE__ */ new Date()) {
46
46
  }
47
47
 
48
48
  // src/core/version.ts
49
- var PACKAGE_VERSION = "0.6.1";
49
+ var PACKAGE_VERSION = "0.8.0";
50
50
 
51
51
  // src/core/data.ts
52
52
  async function getDomainData(domain, force = false, ctx) {
@@ -352,6 +352,33 @@ var pcmDomain = {
352
352
  // src/domains/_openapi/parser.ts
353
353
  import { parse } from "yaml";
354
354
  var HTTP_METHODS = ["get", "post", "put", "patch", "delete"];
355
+ var COMPONENT_KINDS = {
356
+ schemas: "schema",
357
+ responses: "response",
358
+ parameters: "parameter",
359
+ headers: "header"
360
+ };
361
+ var REF_PATTERN = /^#\/components\/(schemas|responses|parameters|headers)\/(.+)$/;
362
+ function collectRefs(node, specName, out) {
363
+ if (Array.isArray(node)) {
364
+ for (const child of node) collectRefs(child, specName, out);
365
+ return;
366
+ }
367
+ if (node === null || typeof node !== "object") return;
368
+ for (const [key, value] of Object.entries(node)) {
369
+ if (key === "$ref" && typeof value === "string") {
370
+ const match = REF_PATTERN.exec(value);
371
+ if (match) out.add(`${specName}:${COMPONENT_KINDS[match[1]]}:${match[2]}`);
372
+ continue;
373
+ }
374
+ collectRefs(value, specName, out);
375
+ }
376
+ }
377
+ function refsOf(node, specName) {
378
+ const out = /* @__PURE__ */ new Set();
379
+ collectRefs(node, specName, out);
380
+ return [...out];
381
+ }
355
382
  function parseOpenApiSpec(yamlText, specName) {
356
383
  const spec = parse(yamlText);
357
384
  const items = [];
@@ -367,26 +394,38 @@ function parseOpenApiSpec(yamlText, specName) {
367
394
  summary: op.summary ?? null,
368
395
  description: op.description ?? null,
369
396
  tags: op.tags ?? [],
397
+ refs: refsOf(op, specName),
370
398
  detail: op
371
399
  });
372
400
  }
373
401
  }
374
- for (const [name, schema] of Object.entries(spec.components?.schemas ?? {})) {
375
- items.push({
376
- id: `${specName}:schema:${name}`,
377
- type: "schema",
378
- name,
379
- description: schema.description ?? null,
380
- required: schema.required ?? [],
381
- detail: schema
382
- });
402
+ for (const [section, kind] of Object.entries(COMPONENT_KINDS)) {
403
+ for (const [name, node] of Object.entries(spec.components?.[section] ?? {})) {
404
+ items.push({
405
+ id: `${specName}:${kind}:${name}`,
406
+ type: kind,
407
+ name,
408
+ description: node.description ?? null,
409
+ ...kind === "schema" ? { required: node.required ?? [] } : {},
410
+ ...kind === "header" ? { required: node.required ?? null } : {},
411
+ // Em parameters a chave do componente (usada no $ref) difere do nome real
412
+ // do header/query; `paramName` e `in` preservam o nome usado na requisição.
413
+ ...kind === "parameter" ? { paramName: node.name ?? null, in: node.in ?? null, required: node.required ?? null } : {},
414
+ refs: refsOf(node, specName),
415
+ detail: node
416
+ });
417
+ }
418
+ }
419
+ const ids = new Set(items.map((i) => i.id));
420
+ for (const item of items) {
421
+ item.refs = item.refs.filter((ref) => ref !== item.id && ids.has(ref));
383
422
  }
384
423
  return items;
385
424
  }
386
425
 
387
426
  // src/domains/_openapi/domain.ts
388
427
  function summarize(item) {
389
- const { detail: _detail, ...rest } = item;
428
+ const { detail: _detail, refs: _refs, ...rest } = item;
390
429
  return rest;
391
430
  }
392
431
  function createOpenApiDomain(config) {
@@ -394,11 +433,24 @@ function createOpenApiDomain(config) {
394
433
  id: config.id,
395
434
  title: config.title,
396
435
  description: config.description,
436
+ specVersion: config.specVersion,
397
437
  ttlHours: 72,
398
438
  filters: [
399
439
  { name: "path", description: `Substring no path do endpoint (ex.: ${config.pathExample})` },
400
440
  { name: "method", description: "Verbo HTTP exato (ex.: POST)" },
401
- { name: "schema", description: "Substring no nome do schema (case-insensitive)" }
441
+ { name: "schema", description: "Substring no nome do schema (case-insensitive)" },
442
+ {
443
+ name: "response",
444
+ description: "Substring no nome do components.responses, a chave usada no $ref (ex.: 202Webhook)"
445
+ },
446
+ {
447
+ name: "parameter",
448
+ description: "Substring no nome do components.parameters, a chave usada no $ref (ex.: xFapiInteractionId)"
449
+ },
450
+ {
451
+ name: "header",
452
+ description: "Substring no nome do components.headers, a chave usada no $ref (ex.: X-V)"
453
+ }
402
454
  ],
403
455
  async extract(ctx) {
404
456
  if (ctx?.signal?.aborted) throw new Error("Extra\xE7\xE3o cancelada pelo cliente");
@@ -414,13 +466,17 @@ function createOpenApiDomain(config) {
414
466
  search(data, query, filters = {}) {
415
467
  const path = filters.path ? normalize(filters.path) : void 0;
416
468
  const method = filters.method?.toUpperCase();
417
- const schema = filters.schema ? normalize(filters.schema) : void 0;
418
469
  return data.items.filter((item) => {
419
470
  if (path && !normalize(String(item.path ?? "")).includes(path)) return false;
420
471
  if (method && item.method !== method) return false;
421
- if (schema && !normalize(String(item.name ?? "")).includes(schema)) return false;
472
+ for (const type of ["schema", "response", "parameter", "header"]) {
473
+ const name = filters[type];
474
+ if (!name) continue;
475
+ if (item.type !== type) return false;
476
+ if (!normalize(String(item.name ?? "")).includes(normalize(name))) return false;
477
+ }
422
478
  if (query?.trim()) {
423
- const haystack = [item.path, item.summary, item.description, item.name].map((v) => String(v ?? "")).join(" ");
479
+ const haystack = [item.path, item.summary, item.description, item.name, item.paramName].map((v) => String(v ?? "")).join(" ");
424
480
  if (!matchesQuery(haystack, query)) return false;
425
481
  }
426
482
  return true;
@@ -436,7 +492,7 @@ function createOpenApiDomain(config) {
436
492
  var paymentsConfig = {
437
493
  id: "payments-v4-openapi",
438
494
  title: "API de Pagamentos \u2014 spec OpenAPI 4.1.0",
439
- description: "Spec OpenAPI oficial da API de Inicia\xE7\xE3o de Pagamentos (Pix) do Open Finance Brasil, vers\xE3o 4. Mesma fam\xEDlia da payments-v5-openapi (major mais recente); escolha o dom\xEDnio pela vers\xE3o que seu caso usa. Itens type=operation (endpoints, um por m\xE9todo+path) e type=schema (payloads). search devolve resumos; use get_item para o n\xF3 completo da spec.",
495
+ description: "Spec OpenAPI oficial da API de Inicia\xE7\xE3o de Pagamentos (Pix) do Open Finance Brasil, vers\xE3o 4. Mesma fam\xEDlia da payments-v5-openapi (major mais recente); escolha o dom\xEDnio pela vers\xE3o que seu caso usa. Itens type=operation (endpoints, um por m\xE9todo+path), type=schema (payloads) e os components reutiliz\xE1veis alvos dos $ref: type=response e type=parameter. search devolve resumos; use get_item para o n\xF3 completo da spec \u2014 nas opera\xE7\xF5es o campo `refs` traz os ids dos components referenciados, prontos para get_item.",
440
496
  pathExample: "/pix/payments",
441
497
  specName: "payments",
442
498
  specVersion: "4.1.0",
@@ -451,7 +507,7 @@ var paymentsDomain = createOpenApiDomain(paymentsConfig);
451
507
  var paymentsV5Config = {
452
508
  id: "payments-v5-openapi",
453
509
  title: "API de Pagamentos \u2014 spec OpenAPI 5.0.0",
454
- description: "Spec OpenAPI oficial da API de Inicia\xE7\xE3o de Pagamentos (Pix) do Open Finance Brasil, vers\xE3o 5 (major mais recente). Mesma fam\xEDlia da payments-v4-openapi; escolha o dom\xEDnio pela vers\xE3o que seu caso usa. Itens type=operation (endpoints, um por m\xE9todo+path) e type=schema (payloads). search devolve resumos; use get_item para o n\xF3 completo da spec.",
510
+ description: "Spec OpenAPI oficial da API de Inicia\xE7\xE3o de Pagamentos (Pix) do Open Finance Brasil, vers\xE3o 5 (major mais recente). Mesma fam\xEDlia da payments-v4-openapi; escolha o dom\xEDnio pela vers\xE3o que seu caso usa. Itens type=operation (endpoints, um por m\xE9todo+path), type=schema (payloads) e os components reutiliz\xE1veis alvos dos $ref: type=response, type=parameter e type=header. search devolve resumos; use get_item para o n\xF3 completo da spec \u2014 nas opera\xE7\xF5es o campo `refs` traz os ids dos components referenciados, prontos para get_item.",
455
511
  pathExample: "/pix/payments",
456
512
  specName: "payments",
457
513
  specVersion: "5.0.0",
@@ -534,6 +590,7 @@ function createConfluenceSectionsDomain(config) {
534
590
  id: config.id,
535
591
  title: config.title,
536
592
  description: config.description,
593
+ specVersion: config.specVersion,
537
594
  ttlHours: 72,
538
595
  filters: [
539
596
  { name: "page", description: "Substring no t\xEDtulo da p\xE1gina Confluence" },
@@ -582,6 +639,7 @@ function createConfluenceSectionsDomain(config) {
582
639
  var paymentsV5BusinessRulesConfig = {
583
640
  id: "payments-v5-business-rules",
584
641
  title: "API de Pagamentos v5 \u2014 Regras de neg\xF3cio (SV)",
642
+ specVersion: "5.0.0",
585
643
  description: "Regras de neg\xF3cio da API de Inicia\xE7\xE3o de Pagamentos (Pix) vers\xE3o 5.0.0 do Open Finance Brasil, extra\xEDdas das p\xE1ginas Confluence de Servi\xE7os (SV): Informa\xE7\xF5es Gerais (vis\xE3o geral dos endpoints e dicion\xE1rio de dados), Escopo da API (formas de inicia\xE7\xE3o suportadas: Pix imediato, agendado, agendado recorrente, QR Code est\xE1tico/din\xE2mico, Pix Saque, Pix Troco, Pix Composto), M\xE1quina de Estados (status do consentimento e do pagamento), Diagrama de Sequ\xEAncia, Valida\xE7\xE3o de informa\xE7\xF5es no DICT e Adapta\xE7\xF5es para consultas de recursos entre 4.0.1 e 5.0.0. Complementa payments-v5-openapi, que traz a spec (endpoints e schemas) da mesma vers\xE3o. Conte\xFAdo que vale para todos os produtos de inicia\xE7\xE3o (idempot\xEAncia, assinatura de payload, polling, formatos de data) est\xE1 em payments-common-rules. Cada item \xE9 uma se\xE7\xE3o (heading) da p\xE1gina. search devolve um snippet do conte\xFAdo; use get_item para o texto completo da se\xE7\xE3o.",
586
644
  confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
587
645
  interRequestDelayMs: 2e3,
@@ -603,7 +661,7 @@ var paymentsV5BusinessRulesDomain = createConfluenceSectionsDomain(paymentsV5Bus
603
661
  var enrollmentsV2Config = {
604
662
  id: "enrollments-v2-openapi",
605
663
  title: "API de V\xEDnculo de Dispositivo (Enrollments) \u2014 spec OpenAPI 2.3.0",
606
- description: "Spec OpenAPI oficial da API de Enrollments (V\xEDnculo de Dispositivo) do Open Finance Brasil, vers\xE3o 2. Cobre o pagamento sem redirecionamento: v\xEDnculo de dispositivos (FIDO), autoriza\xE7\xE3o de consentimentos e Pix Autom\xE1tico. Endpoints /enrollments, /consents/{consentId}/authorise e /recurring-consents/{recurringConsentId}/authorise. Itens type=operation (endpoints, um por m\xE9todo+path) e type=schema (payloads). search devolve resumos; use get_item para o n\xF3 completo da spec.",
664
+ description: "Spec OpenAPI oficial da API de Enrollments (V\xEDnculo de Dispositivo) do Open Finance Brasil, vers\xE3o 2. Cobre o pagamento sem redirecionamento: v\xEDnculo de dispositivos (FIDO), autoriza\xE7\xE3o de consentimentos e Pix Autom\xE1tico. Endpoints /enrollments, /consents/{consentId}/authorise e /recurring-consents/{recurringConsentId}/authorise. Itens type=operation (endpoints, um por m\xE9todo+path), type=schema (payloads) e os components reutiliz\xE1veis alvos dos $ref: type=response, type=parameter e type=header. search devolve resumos; use get_item para o n\xF3 completo da spec \u2014 nas opera\xE7\xF5es o campo `refs` traz os ids dos components referenciados, prontos para get_item.",
607
665
  pathExample: "/enrollments",
608
666
  specName: "enrollments",
609
667
  specVersion: "2.3.0",
@@ -618,6 +676,7 @@ var enrollmentsV2Domain = createOpenApiDomain(enrollmentsV2Config);
618
676
  var enrollmentsV2BusinessRulesConfig = {
619
677
  id: "enrollments-v2-business-rules",
620
678
  title: "API de V\xEDnculo de Dispositivo v2 \u2014 Regras de neg\xF3cio (SV)",
679
+ specVersion: "2.2.0",
621
680
  description: "Regras de neg\xF3cio da API de V\xEDnculo de Dispositivo (Enrollments / Jornada Sem Redirecionamento) vers\xE3o 2.2.0 do Open Finance Brasil, extra\xEDdas das p\xE1ginas Confluence de Servi\xE7os (SV): Informa\xE7\xF5es Gerais, M\xE1quina de estados (vincula\xE7\xE3o de conta, autoriza\xE7\xE3o de consentimento e do consentimento recorrente), Edi\xE7\xE3o do v\xEDnculo de dispositivo (campos edit\xE1veis e condi\xE7\xF5es) e FAQ - JSR (perguntas e respostas por categoria). Complementa enrollments-v2-openapi, que traz a spec (endpoints e schemas) do mesmo major \u2014 hoje na 2.3.0, enquanto estas p\xE1ginas do Confluence ainda s\xE3o as da 2.2.0. Cada item \xE9 uma se\xE7\xE3o (heading) da p\xE1gina. search devolve um snippet do conte\xFAdo; use get_item para o texto completo da se\xE7\xE3o.",
622
681
  confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
623
682
  interRequestDelayMs: 2e3,
@@ -639,7 +698,7 @@ var enrollmentsV2BusinessRulesDomain = createConfluenceSectionsDomain(
639
698
  var automaticPaymentsV2Config = {
640
699
  id: "automatic-payments-v2-openapi",
641
700
  title: "API de Pagamentos Autom\xE1ticos (Automatic Payments) \u2014 spec OpenAPI 2.2.0",
642
- description: "Spec OpenAPI oficial da API de Automatic Payments do Open Finance Brasil, vers\xE3o 2. Cobre a inicia\xE7\xE3o de pagamentos autom\xE1ticos (Pix Autom\xE1tico e Transfer\xEAncias Inteligentes) mediante consentimento recorrente. Endpoints /recurring-consents (cria\xE7\xE3o, consulta e edi\xE7\xE3o/revoga\xE7\xE3o) e /pix/recurring-payments (cria\xE7\xE3o, retry, consulta e cancelamento); scope recurring-payments. Itens type=operation (endpoints, um por m\xE9todo+path) e type=schema (payloads). search devolve resumos; use get_item para o n\xF3 completo da spec.",
701
+ description: "Spec OpenAPI oficial da API de Automatic Payments do Open Finance Brasil, vers\xE3o 2. Cobre a inicia\xE7\xE3o de pagamentos autom\xE1ticos (Pix Autom\xE1tico e Transfer\xEAncias Inteligentes) mediante consentimento recorrente. Endpoints /recurring-consents (cria\xE7\xE3o, consulta e edi\xE7\xE3o/revoga\xE7\xE3o) e /pix/recurring-payments (cria\xE7\xE3o, retry, consulta e cancelamento); scope recurring-payments. Itens type=operation (endpoints, um por m\xE9todo+path), type=schema (payloads) e os components reutiliz\xE1veis alvos dos $ref: type=response, type=parameter e type=header. search devolve resumos; use get_item para o n\xF3 completo da spec \u2014 nas opera\xE7\xF5es o campo `refs` traz os ids dos components referenciados, prontos para get_item.",
643
702
  pathExample: "/pix/recurring-payments",
644
703
  specName: "automatic-payments",
645
704
  specVersion: "2.2.0",
@@ -654,6 +713,7 @@ var automaticPaymentsV2Domain = createOpenApiDomain(automaticPaymentsV2Config);
654
713
  var automaticPaymentsV2BusinessRulesConfig = {
655
714
  id: "automatic-payments-v2-business-rules",
656
715
  title: "API de Pagamentos Autom\xE1ticos v2 \u2014 Regras de neg\xF3cio (SV)",
716
+ specVersion: "2.2.0",
657
717
  description: "Regras de neg\xF3cio da API de Pagamentos Autom\xE1ticos (Pix Autom\xE1tico e Transfer\xEAncias Inteligentes) vers\xE3o 2.2.0 do Open Finance Brasil, extra\xEDdas das p\xE1ginas Confluence de Servi\xE7os (SV): Informa\xE7\xF5es Gerais (vis\xE3o geral dos endpoints e dicion\xE1rio de dados), M\xE1quina de Estados (status do consentimento recorrente e do pagamento), Edi\xE7\xE3o do consentimento (campos edit\xE1veis e condi\xE7\xF5es), Tentativas Intradia e Extradia para Pix Autom\xE1tico (janelas de liquida\xE7\xE3o, retentativas, e2eID) e Adapta\xE7\xF5es para consultas de recursos entre 1.0.0 e 2.2.0. Complementa automatic-payments-v2-openapi, que traz a spec (endpoints e schemas) da mesma vers\xE3o. O guia de implementa\xE7\xE3o passo a passo do Pix Autom\xE1tico est\xE1 em payments-implementation-guides. Cada item \xE9 uma se\xE7\xE3o (heading) da p\xE1gina. search devolve um snippet do conte\xFAdo; use get_item para o texto completo da se\xE7\xE3o.",
658
718
  confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
659
719
  interRequestDelayMs: 2e3,
@@ -718,7 +778,7 @@ var paymentsImplementationGuidesDomain = createConfluenceSectionsDomain(
718
778
  var consentsV3Config = {
719
779
  id: "consents-v3-openapi",
720
780
  title: "API de Consentimentos \u2014 spec OpenAPI 3.3.1",
721
- description: "Spec OpenAPI oficial da API de Consentimentos de compartilhamento de dados (Dados Cadastrais e Transacionais) do Open Finance Brasil, vers\xE3o 3.3.1. \xC9 o consentimento de dados \u2014 n\xE3o cobre consentimento de pagamento, que fica em payments-v4/v5-openapi (/consents) e automatic-payments-v2-openapi (/recurring-consents). Cobre cria\xE7\xE3o (POST /consents), consulta (GET /consents/{consentId}), revoga\xE7\xE3o (DELETE /consents/{consentId}), renova\xE7\xE3o (POST /consents/{consentId}/extends) e hist\xF3rico de renova\xE7\xF5es (GET /consents/{consentId}/extensions). Itens type=operation (um por m\xE9todo+path) e type=schema (payloads, ex.: CreateConsent, ResponseConsent, LoggedUser, BusinessEntity). search devolve resumos; use get_item para o n\xF3 completo da spec.",
781
+ description: "Spec OpenAPI oficial da API de Consentimentos de compartilhamento de dados (Dados Cadastrais e Transacionais) do Open Finance Brasil, vers\xE3o 3.3.1. \xC9 o consentimento de dados \u2014 n\xE3o cobre consentimento de pagamento, que fica em payments-v4/v5-openapi (/consents) e automatic-payments-v2-openapi (/recurring-consents). Cobre cria\xE7\xE3o (POST /consents), consulta (GET /consents/{consentId}), revoga\xE7\xE3o (DELETE /consents/{consentId}), renova\xE7\xE3o (POST /consents/{consentId}/extends) e hist\xF3rico de renova\xE7\xF5es (GET /consents/{consentId}/extensions). Itens type=operation (um por m\xE9todo+path), type=schema (payloads, ex.: CreateConsent, ResponseConsent, LoggedUser, BusinessEntity) e os components reutiliz\xE1veis alvos dos $ref: type=response (BadRequest, UnprocessableEntity, ...) e type=parameter (Authorization, xFapiInteractionId, ...). search devolve resumos; use get_item para o n\xF3 completo da spec \u2014 nas opera\xE7\xF5es o campo `refs` traz os ids dos components referenciados, prontos para get_item.",
722
782
  pathExample: "/consents/{consentId}",
723
783
  specName: "consents",
724
784
  specVersion: "3.3.1",
@@ -729,94 +789,95 @@ var consentsV3Config = {
729
789
  // src/domains/consents-v3-openapi/index.ts
730
790
  var consentsV3Domain = createOpenApiDomain(consentsV3Config);
731
791
 
792
+ // src/domains/resources-v3-openapi/config.ts
793
+ var resourcesV3Config = {
794
+ id: "resources-v3-openapi",
795
+ title: "API de Recursos \u2014 spec OpenAPI 3.1.0",
796
+ description: "Spec OpenAPI oficial da API de Recursos (Resources) do Open Finance Brasil, vers\xE3o 3.1.0. Endpoint \xFAnico (GET /resources) que lista os recursos compartilhados pelo cliente e o status de cada um, considerando a disponibilidade do recurso e o status do consentimento relacionado \u2014 \xE9 o ponto de partida de qualquer jornada de Dados Cadastrais e Transacionais, pois diz o que a receptora pode de fato consultar. O consentimento que a habilita fica em consents-v3-openapi; as contas em si, em accounts-v2-openapi. Itens type=operation, type=schema (ex.: ResponseResourceList, ResourceData com enum de status) e os components alvos dos $ref: type=response e type=parameter. Regras de neg\xF3cio da mesma API em resources-v3-business-rules. search devolve resumos; use get_item para o n\xF3 completo da spec \u2014 nas opera\xE7\xF5es o campo `refs` traz os ids dos components referenciados, prontos para get_item.",
797
+ pathExample: "/resources",
798
+ specName: "resources",
799
+ specVersion: "3.1.0",
800
+ url: "https://openbanking-brasil.github.io/openapi/swagger-apis/resources/3.1.0.yml",
801
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
802
+ };
803
+
804
+ // src/domains/resources-v3-openapi/index.ts
805
+ var resourcesV3Domain = createOpenApiDomain(resourcesV3Config);
806
+
807
+ // src/domains/resources-v3-business-rules/config.ts
808
+ var resourcesV3BusinessRulesConfig = {
809
+ id: "resources-v3-business-rules",
810
+ title: "API de Recursos v3 \u2014 Regras de neg\xF3cio (DC)",
811
+ specVersion: "3.1.0",
812
+ description: "Regras de neg\xF3cio da API de Recursos (Resources) vers\xE3o 3.1.0 do Open Finance Brasil, extra\xEDdas das p\xE1ginas Confluence de Dados Cadastrais e Transacionais (DC): Informa\xE7\xF5es Gerais (vis\xE3o geral do GET /resources/v3/resources, status do recurso versus status do consentimento) e Orienta\xE7\xF5es - [DC] Recursos (quando um recurso volta a ficar dispon\xEDvel, uso do status code de erro apropriado quando a transmissora n\xE3o retorna as informa\xE7\xF5es) \u2014 esta \xFAltima n\xE3o \xE9 versionada e vale para todo o major v3. Complementa resources-v3-openapi, que traz a spec (endpoints e schemas) do mesmo major. Cada item \xE9 uma se\xE7\xE3o (heading) da p\xE1gina. search devolve um snippet do conte\xFAdo; use get_item para o texto completo da se\xE7\xE3o.",
813
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
814
+ interRequestDelayMs: 2e3,
815
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
816
+ pages: [
817
+ { pageId: "1267990545", title: "Informa\xE7\xF5es Gerais - [DC] Recursos - v3.1.0" },
818
+ { pageId: "219512943", title: "Orienta\xE7\xF5es - [DC] Recursos" }
819
+ ]
820
+ };
821
+
822
+ // src/domains/resources-v3-business-rules/index.ts
823
+ var resourcesV3BusinessRulesDomain = createConfluenceSectionsDomain(
824
+ resourcesV3BusinessRulesConfig
825
+ );
826
+
827
+ // src/domains/accounts-v2-openapi/config.ts
828
+ var accountsV2Config = {
829
+ id: "accounts-v2-openapi",
830
+ title: "API de Contas \u2014 spec OpenAPI 2.4.2",
831
+ description: "Spec OpenAPI oficial da API de Contas (Accounts) do Open Finance Brasil, vers\xE3o 2.4.2 \u2014 compartilhamento de contas de dep\xF3sito \xE0 vista, poupan\xE7a e pagamento pr\xE9-paga. Cobre listagem (GET /accounts), identifica\xE7\xE3o (GET /accounts/{accountId}), saldos (GET /accounts/{accountId}/balances), transa\xE7\xF5es (GET /accounts/{accountId}/transactions e /transactions-current) e limites de cheque especial (GET /accounts/{accountId}/overdraft-limits). \xC9 API de Dados Cadastrais e Transacionais: o consentimento que a habilita fica em consents-v3-openapi, e a listagem de recursos compartilhados em resources-v3-openapi. Itens type=operation (um por m\xE9todo+path), type=schema (payloads, ex.: AccountData, AccountBalancesData, AccountTransactionsData) e os components alvos dos $ref: type=response e type=parameter. Regras de neg\xF3cio da mesma API em accounts-v2-business-rules. search devolve resumos; use get_item para o n\xF3 completo da spec \u2014 nas opera\xE7\xF5es o campo `refs` traz os ids dos components referenciados, prontos para get_item.",
832
+ pathExample: "/accounts/{accountId}/transactions",
833
+ specName: "accounts",
834
+ specVersion: "2.4.2",
835
+ url: "https://openbanking-brasil.github.io/openapi/swagger-apis/accounts/2.4.2.yml",
836
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
837
+ };
838
+
839
+ // src/domains/accounts-v2-openapi/index.ts
840
+ var accountsV2Domain = createOpenApiDomain(accountsV2Config);
841
+
842
+ // src/domains/accounts-v2-business-rules/config.ts
843
+ var accountsV2BusinessRulesConfig = {
844
+ id: "accounts-v2-business-rules",
845
+ title: "API de Contas v2 \u2014 Regras de neg\xF3cio (DC)",
846
+ specVersion: "2.4.2",
847
+ description: "Regras de neg\xF3cio da API de Contas (Accounts) vers\xE3o 2.4.2 do Open Finance Brasil, extra\xEDdas das p\xE1ginas Confluence de Dados Cadastrais e Transacionais (DC): Informa\xE7\xF5es Gerais (vis\xE3o geral dos endpoints, contas de dep\xF3sito \xE0 vista/poupan\xE7a/pagamento pr\xE9-paga, saldos, transa\xE7\xF5es e limites) e Orienta\xE7\xF5es - [DC] Contas (obrigatoriedade de informa\xE7\xF5es de contraparte pela IN BCB n\xBA 371, tratamento de transa\xE7\xF5es e casos de borda) \u2014 esta \xFAltima n\xE3o \xE9 versionada e vale para todo o major v2. Complementa accounts-v2-openapi, que traz a spec (endpoints e schemas) do mesmo major. Cada item \xE9 uma se\xE7\xE3o (heading) da p\xE1gina. search devolve um snippet do conte\xFAdo; use get_item para o texto completo da se\xE7\xE3o.",
848
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
849
+ interRequestDelayMs: 2e3,
850
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
851
+ pages: [
852
+ { pageId: "979566625", title: "Informa\xE7\xF5es Gerais - [DC] Contas - v2.4.2" },
853
+ { pageId: "1739096252", title: "Orienta\xE7\xF5es - [DC] Contas" }
854
+ ]
855
+ };
856
+
857
+ // src/domains/accounts-v2-business-rules/index.ts
858
+ var accountsV2BusinessRulesDomain = createConfluenceSectionsDomain(
859
+ accountsV2BusinessRulesConfig
860
+ );
861
+
732
862
  // src/domains/pcm-openapi/config.ts
733
863
  var pcmOpenapiConfig = {
734
864
  specName: "pcm",
735
- specVersion: "1.0.0",
736
- url: "https://raw.githubusercontent.com/OpenBanking-Brasil/pcm-specs/refs/heads/feature/correct-paths/PCM-current.openapi.yaml",
865
+ // A spec da PCM não declara `info.version` (o campo `openapi:` traz um valor
866
+ // fora do padrão). Identificar pelo commit é o único rótulo verificável — e
867
+ // deixa explícito, em list_domains, que este domínio está congelado no SHA.
868
+ specVersion: "commit 8a7f7b0",
869
+ url: "https://raw.githubusercontent.com/OpenBanking-Brasil/pcm-specs/8a7f7b03ddfab7eaf97bcfe68e67fac22a5eeb68/PCM-current.openapi.yaml",
737
870
  retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
738
871
  };
739
872
 
740
- // src/domains/pcm-openapi/parser.ts
741
- import { parse as parse2 } from "yaml";
742
- var HTTP_METHODS2 = ["get", "post", "put", "patch", "delete"];
743
- function parseOpenApiSpec2(yamlText, specName) {
744
- const spec = parse2(yamlText);
745
- const items = [];
746
- for (const [path, pathItem] of Object.entries(spec.paths ?? {})) {
747
- for (const method of HTTP_METHODS2) {
748
- const op = pathItem[method];
749
- if (!op) continue;
750
- items.push({
751
- id: `${specName}:${method.toUpperCase()} ${path}`,
752
- type: "operation",
753
- path,
754
- method: method.toUpperCase(),
755
- summary: op.summary ?? null,
756
- description: op.description ?? null,
757
- tags: op.tags ?? [],
758
- detail: op
759
- });
760
- }
761
- }
762
- for (const [name, schema] of Object.entries(spec.components?.schemas ?? {})) {
763
- items.push({
764
- id: `${specName}:schema:${name}`,
765
- type: "schema",
766
- name,
767
- description: schema.description ?? null,
768
- required: schema.required ?? [],
769
- detail: schema
770
- });
771
- }
772
- return items;
773
- }
774
-
775
873
  // src/domains/pcm-openapi/index.ts
776
- function summarize3(item) {
777
- const { detail: _detail, ...rest } = item;
778
- return rest;
779
- }
780
- var pcmOpenapiDomain = {
874
+ var pcmOpenapiDomain = createOpenApiDomain({
781
875
  id: "pcm-openapi",
782
- title: `PCM \u2014 spec OpenAPI ${pcmOpenapiConfig.specVersion}`,
783
- description: "Spec OpenAPI oficial da PCM (Plataforma de Coleta de M\xE9tricas) do Open Finance Brasil \u2014 a faceta swagger. Cobre os endpoints de reporte (report-api v1/v2), hybrid-flow, opendata, consents/stock, credit-portabilities, payments/status e token. Itens type=operation (um por m\xE9todo+path) e type=schema (payloads). Outras facetas da PCM: tabelas de obrigatoriedade do campo additionalInfo em pcm-additional-info; regras de neg\xF3cio (reporte, processamento, diverg\xEAncias) em pcm-business-rules. search devolve resumos; use get_item para o n\xF3 completo da spec.",
784
- ttlHours: 72,
785
- filters: [
786
- { name: "path", description: "Substring no path do endpoint (ex.: /report-api/v1/private/report)" },
787
- { name: "method", description: "Verbo HTTP exato (ex.: POST)" },
788
- { name: "schema", description: "Substring no nome do schema (case-insensitive)" }
789
- ],
790
- async extract(ctx) {
791
- if (ctx?.signal?.aborted) throw new Error("Extra\xE7\xE3o cancelada pelo cliente");
792
- ctx?.onProgress?.(0, 1, `Baixando spec ${pcmOpenapiConfig.specName} ${pcmOpenapiConfig.specVersion}`);
793
- const response = await fetchWithRetry(pcmOpenapiConfig.url, {
794
- retryDelaysMs: pcmOpenapiConfig.retryDelaysMs,
795
- signal: ctx?.signal
796
- });
797
- const yamlText = await response.text();
798
- ctx?.onProgress?.(1, 1);
799
- return { items: parseOpenApiSpec2(yamlText, pcmOpenapiConfig.specName) };
800
- },
801
- search(data, query, filters = {}) {
802
- const path = filters.path ? normalize(filters.path) : void 0;
803
- const method = filters.method?.toUpperCase();
804
- const schema = filters.schema ? normalize(filters.schema) : void 0;
805
- return data.items.filter((item) => {
806
- if (path && !normalize(String(item.path ?? "")).includes(path)) return false;
807
- if (method && item.method !== method) return false;
808
- if (schema && !normalize(String(item.name ?? "")).includes(schema)) return false;
809
- if (query?.trim()) {
810
- const haystack = [item.path, item.summary, item.description, item.name].map((v) => String(v ?? "")).join(" ");
811
- if (!matchesQuery(haystack, query)) return false;
812
- }
813
- return true;
814
- }).map(summarize3);
815
- },
816
- getItem(data, id) {
817
- return data.items.find((i) => i.id === id) ?? null;
818
- }
819
- };
876
+ title: `PCM \u2014 spec OpenAPI (${pcmOpenapiConfig.specVersion})`,
877
+ description: "Spec OpenAPI oficial da PCM (Plataforma de Coleta de M\xE9tricas) do Open Finance Brasil \u2014 a faceta swagger. Cobre os endpoints de reporte (report-api v1/v2), hybrid-flow, opendata, consents/stock, credit-portabilities, payments/status e token. Itens type=operation (um por m\xE9todo+path), type=schema (payloads) e type=response (components reutiliz\xE1veis, alvos dos $ref). Outras facetas da PCM: tabelas de obrigatoriedade do campo additionalInfo em pcm-additional-info; regras de neg\xF3cio (reporte, processamento, diverg\xEAncias) em pcm-business-rules. search devolve resumos; use get_item para o n\xF3 completo da spec (opera\xE7\xF5es trazem `refs` com os ids dos components que referenciam).",
878
+ pathExample: "/report-api/v1/private/report",
879
+ ...pcmOpenapiConfig
880
+ });
820
881
 
821
882
  // src/domains/pcm-business-rules/config.ts
822
883
  var pcmBusinessRulesConfig = {
@@ -883,7 +944,7 @@ var mqdDomain = createConfluenceSectionsDomain(mqdConfig);
883
944
  var webhookConfig = {
884
945
  id: "webhook-v1-openapi",
885
946
  title: "API de Webhook \u2014 spec OpenAPI 1.3.0",
886
- description: "Spec OpenAPI oficial da API de Webhook do Open Finance Brasil, que notifica mudan\xE7as de estado das demais APIs. 5 opera\xE7\xF5es POST (type=operation): consentNotification e pixPaymentNotification (Pagamentos), enrollmentIdNotification (Enrollments), recurringConsentIdNotification e recurringPaymentIdNotification (Pagamentos Autom\xE1ticos); e schemas type=schema (RequestBodyWebhook, RequestBodyWebhookEvents, EventType, Timestamp, xWebhookInteractionId). search devolve resumos; use get_item para o n\xF3 completo da spec.",
947
+ description: "Spec OpenAPI oficial da API de Webhook do Open Finance Brasil, que notifica mudan\xE7as de estado das demais APIs. 5 opera\xE7\xF5es POST (type=operation): consentNotification e pixPaymentNotification (Pagamentos), enrollmentIdNotification (Enrollments), recurringConsentIdNotification e recurringPaymentIdNotification (Pagamentos Autom\xE1ticos); schemas type=schema (RequestBodyWebhook, RequestBodyWebhookEvents, EventType, Timestamp, xWebhookInteractionId); e os components reutiliz\xE1veis alvos dos $ref: type=response (202Webhook, 202WebhookPayments) e type=parameter (consentId, versionApi, xWebhookInteractionId, ...). search devolve resumos; use get_item para o n\xF3 completo da spec \u2014 nas opera\xE7\xF5es o campo `refs` traz os ids dos components referenciados, prontos para get_item.",
887
948
  pathExample: "/payments/{versionApi}/consents/{consentId}",
888
949
  specName: "webhook",
889
950
  specVersion: "1.3.0",
@@ -964,7 +1025,7 @@ function parseParticipants(jsonText) {
964
1025
  }
965
1026
 
966
1027
  // src/domains/participantes/index.ts
967
- function summarize4(item) {
1028
+ function summarize3(item) {
968
1029
  const { detail: _detail, ...rest } = item;
969
1030
  return rest;
970
1031
  }
@@ -1005,7 +1066,7 @@ var participantesDomain = {
1005
1066
  if (!matchesQuery(haystack, query)) return false;
1006
1067
  }
1007
1068
  return true;
1008
- }).map(summarize4);
1069
+ }).map(summarize3);
1009
1070
  },
1010
1071
  getItem(data, id) {
1011
1072
  return data.items.find((i) => i.id === id) ?? null;
@@ -1086,6 +1147,10 @@ var domains = [
1086
1147
  paymentsCommonRulesDomain,
1087
1148
  paymentsImplementationGuidesDomain,
1088
1149
  consentsV3Domain,
1150
+ resourcesV3Domain,
1151
+ resourcesV3BusinessRulesDomain,
1152
+ accountsV2Domain,
1153
+ accountsV2BusinessRulesDomain,
1089
1154
  pcmOpenapiDomain,
1090
1155
  pcmBusinessRulesDomain,
1091
1156
  jornadaOtimizadaDomain,
@@ -1141,7 +1206,7 @@ function createServer() {
1141
1206
  "list_domains",
1142
1207
  {
1143
1208
  title: "Listar dom\xEDnios",
1144
- description: "Lista os dom\xEDnios de conhecimento do Open Finance Brasil dispon\xEDveis neste server, com os filtros aceitos por cada um e o estado do cache local. Comece por aqui; depois use search(domain, ...) e get_item(domain, id).",
1209
+ description: "Lista os dom\xEDnios de conhecimento do Open Finance Brasil dispon\xEDveis neste server, com os filtros aceitos por cada um, a vers\xE3o da spec de origem e o estado do cache local. Devolve tamb\xE9m a vers\xE3o deste server em `server.version`. Comece por aqui; depois use search(domain, ...) e get_item(domain, id).",
1145
1210
  annotations: {
1146
1211
  readOnlyHint: true,
1147
1212
  destructiveHint: false,
@@ -1151,20 +1216,24 @@ function createServer() {
1151
1216
  },
1152
1217
  async () => {
1153
1218
  const out = domains.map((d) => {
1154
- if (d.live) {
1155
- return { id: d.id, title: d.title, description: d.description, filters: d.filters, live: true };
1156
- }
1157
- const cached = readCache(d.id);
1158
- return {
1219
+ const base = {
1159
1220
  id: d.id,
1160
1221
  title: d.title,
1161
1222
  description: d.description,
1162
1223
  filters: d.filters,
1224
+ ...d.specVersion ? { specVersion: d.specVersion } : {}
1225
+ };
1226
+ if (d.live) {
1227
+ return { ...base, live: true };
1228
+ }
1229
+ const cached = readCache(d.id);
1230
+ return {
1231
+ ...base,
1163
1232
  cachedItems: cached?.data.items.length ?? 0,
1164
1233
  extractedAt: cached?.extractedAt ?? null
1165
1234
  };
1166
1235
  });
1167
- return text(out);
1236
+ return text({ server: { name: "opf-br-mcp", version: PACKAGE_VERSION }, domains: out });
1168
1237
  }
1169
1238
  );
1170
1239
  server2.registerTool(
@@ -1238,7 +1307,7 @@ function createServer() {
1238
1307
  "get_item",
1239
1308
  {
1240
1309
  title: "Detalhar um item",
1241
- description: "Devolve o registro completo de um item pelo `id` retornado por search (nos dom\xEDnios *-openapi e participantes inclui o n\xF3 integral da spec em `detail`; em pcm-additional-info devolve o registro completo, enquanto search devolve apenas um resumo).",
1310
+ description: "Devolve o registro completo de um item pelo `id` retornado por search (nos dom\xEDnios *-openapi e participantes inclui o n\xF3 integral da spec em `detail`; em pcm-additional-info devolve o registro completo, enquanto search devolve apenas um resumo). Nos dom\xEDnios *-openapi os `$ref` n\xE3o v\xEAm expandidos: o campo `refs` lista os ids dos components referenciados (responses, parameters, schemas) \u2014 chame get_item neles para resolver.",
1242
1311
  inputSchema: {
1243
1312
  domain: domainIdSchema,
1244
1313
  id: z.string().describe("Id do item (vindo de search)")
@@ -1311,6 +1380,10 @@ function createServer() {
1311
1380
  }
1312
1381
 
1313
1382
  // src/index.ts
1383
+ if (process.argv.includes("--version") || process.argv.includes("-v")) {
1384
+ console.log(PACKAGE_VERSION);
1385
+ process.exit(0);
1386
+ }
1314
1387
  var server = createServer();
1315
1388
  await server.connect(new StdioServerTransport());
1316
- console.error("[opf-br-mcp] server pronto (stdio)");
1389
+ console.error(`[opf-br-mcp] server pronto (stdio) \u2014 v${PACKAGE_VERSION}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opf-br-mcp",
3
- "version": "0.6.1",
3
+ "version": "0.8.0",
4
4
  "description": "MCP server local com as regras do Open Finance Brasil (PCM additionalInfo, specs OpenAPI de Pagamentos)",
5
5
  "type": "module",
6
6
  "license": "MIT",