opf-br-mcp 0.5.1 → 0.6.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.
Files changed (3) hide show
  1. package/README.md +7 -2
  2. package/dist/index.js +248 -136
  3. package/package.json +3 -2
package/README.md CHANGED
@@ -11,10 +11,15 @@ acesso token-eficiente às regras do Open Finance Brasil.
11
11
  | Domínio | Fonte | Conteúdo |
12
12
  |---|---|---|
13
13
  | `pcm-additional-info` | Confluence público OFB | Regras de obrigatoriedade do `additionalInfo` (PCM) |
14
- | `payments-v4-openapi` | GitHub OpenBanking-Brasil/openapi | Spec OpenAPI 4.0.0 da API de Pagamentos |
14
+ | `payments-v4-openapi` | GitHub OpenBanking-Brasil/all-services-repo | Spec OpenAPI 4.1.0 da API de Pagamentos |
15
15
  | `payments-v5-openapi` | GitHub OpenBanking-Brasil/all-services-repo | Spec OpenAPI 5.0.0 da API de Iniciação de Pagamentos (consentimentos + Pix) |
16
- | `enrollments-v2-openapi` | GitHub OpenBanking-Brasil/all-services-repo | Spec OpenAPI 2.2.0 da API de Vínculo de Dispositivo (Enrollments, FIDO, Pix Automático) |
16
+ | `payments-v5-business-rules` | Confluence público OFB (Serviços - SV) | Regras de negócio da API de Pagamentos 5.0.0 (Escopo, Máquina de Estados, Diagrama de Sequência, Validação no DICT, Adaptações 4.0.1→5.0.0) — item por seção |
17
+ | `enrollments-v2-openapi` | GitHub OpenBanking-Brasil/all-services-repo | Spec OpenAPI 2.3.0 da API de Vínculo de Dispositivo (Enrollments, FIDO, Pix Automático) |
18
+ | `enrollments-v2-business-rules` | Confluence público OFB (Serviços - SV) | Regras de negócio do Vínculo de Dispositivo 2.2.0 (Máquina de estados, Edição do vínculo, FAQ - JSR) — item por seção |
17
19
  | `automatic-payments-v2-openapi` | GitHub OpenBanking-Brasil/all-services-repo | Spec OpenAPI 2.2.0 da API de Pagamentos Automáticos (Pix Automático e Transferências Inteligentes) |
20
+ | `automatic-payments-v2-business-rules` | Confluence público OFB (Serviços - SV) | Regras de negócio de Pagamentos Automáticos 2.2.0 (Máquina de Estados, Edição do consentimento, Tentativas Intradia/Extradia, Adaptações 1.0.0→2.2.0) — item por seção |
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
+ | `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 |
18
23
  | `consents-v3-openapi` | GitHub Pages openbanking-brasil.github.io | Spec OpenAPI 3.3.1 da API de Consentimentos (Dados Cadastrais e Transacionais) |
19
24
  | `pcm-openapi` | GitHub OpenBanking-Brasil/pcm-specs | Spec OpenAPI da PCM (reportes, hybrid-flow, opendata, consents/stock, credit-portabilities, payments/status) |
20
25
  | `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 |
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.5.0";
49
+ var PACKAGE_VERSION = "0.6.1";
50
50
 
51
51
  // src/core/data.ts
52
52
  async function getDomainData(domain, force = false, ctx) {
@@ -297,8 +297,8 @@ function buildItems(pages) {
297
297
  var pcmDomain = {
298
298
  id: "pcm-additional-info",
299
299
  title: "PCM \u2014 Regras de obrigatoriedade do additionalInfo",
300
- description: "Regras de preenchimento do campo additionalInfo das p\xE1ginas PCM (Plataforma de Coleta de M\xE9tricas) do Confluence do Open Finance Brasil (Inicia\xE7\xE3o de Pagamentos, Pagamentos Autom\xE1ticos, Sem Redirecionamento, DC-*). Cada item \xE9 um campo com regra, m\xE9todos, endpoints, vers\xF5es, tamanho m\xE1ximo e exemplo. search devolve resumos; use get_item para o registro completo.",
301
- ttlHours: 24,
300
+ description: "Tabelas de obrigatoriedade e preenchimento do campo additionalInfo no Open Finance Brasil, extra\xEDdas do Confluence, por fam\xEDlia: Inicia\xE7\xE3o de Pagamentos (v4/v5), Sem Redirecionamento, Pagamentos Autom\xE1ticos, Seguran\xE7a (SG) e Dados/Consentimento (DC-*, v3). Cada item \xE9 um campo com regra de preenchimento, roles (CLIENT/SERVER), m\xE9todos, endpoints, vers\xF5es, tamanho m\xE1ximo e exemplo. Uma das facetas da PCM (Plataforma de Coleta de M\xE9tricas): para o swagger dos endpoints de reporte veja pcm-openapi; para as regras de neg\xF3cio (reporte, processamento, diverg\xEAncias) veja pcm-business-rules. search devolve resumos; use get_item para o registro completo.",
301
+ ttlHours: 72,
302
302
  filters: [
303
303
  { name: "field", description: "Match exato no nome do campo (case-insensitive)" },
304
304
  { name: "contains", description: "Substring em campo ou definicao" },
@@ -394,7 +394,7 @@ function createOpenApiDomain(config) {
394
394
  id: config.id,
395
395
  title: config.title,
396
396
  description: config.description,
397
- ttlHours: 24,
397
+ ttlHours: 72,
398
398
  filters: [
399
399
  { name: "path", description: `Substring no path do endpoint (ex.: ${config.pathExample})` },
400
400
  { name: "method", description: "Verbo HTTP exato (ex.: POST)" },
@@ -435,12 +435,12 @@ function createOpenApiDomain(config) {
435
435
  // src/domains/payments-v4-openapi/config.ts
436
436
  var paymentsConfig = {
437
437
  id: "payments-v4-openapi",
438
- title: "API de Pagamentos \u2014 spec OpenAPI 4.0.0",
439
- description: "Spec OpenAPI oficial da API de Pagamentos (Pix) do Open Finance Brasil. 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.",
438
+ 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.",
440
440
  pathExample: "/pix/payments",
441
441
  specName: "payments",
442
- specVersion: "4.0.0",
443
- url: "https://raw.githubusercontent.com/OpenBanking-Brasil/openapi/main/swagger-apis/payments/4.0.0.yml",
442
+ specVersion: "4.1.0",
443
+ url: "https://raw.githubusercontent.com/OpenBanking-Brasil/all-services-repo/refs/heads/main/api_payment_initiation_-_open_finance_brasil/4.1.0.yaml",
444
444
  retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
445
445
  };
446
446
 
@@ -451,7 +451,7 @@ var paymentsDomain = createOpenApiDomain(paymentsConfig);
451
451
  var paymentsV5Config = {
452
452
  id: "payments-v5-openapi",
453
453
  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. Inclui endpoints de consentimento (/consents) e de pagamento (/pix/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.",
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.",
455
455
  pathExample: "/pix/payments",
456
456
  specName: "payments",
457
457
  specVersion: "5.0.0",
@@ -462,21 +462,179 @@ var paymentsV5Config = {
462
462
  // src/domains/payments-v5-openapi/index.ts
463
463
  var paymentsV5Domain = createOpenApiDomain(paymentsV5Config);
464
464
 
465
+ // src/domains/_confluence-sections/parser.ts
466
+ import * as cheerio2 from "cheerio";
467
+ var HEADING_SELECTOR = "h1, h2, h3";
468
+ function cellText2($, el) {
469
+ const clone = $(el).clone();
470
+ clone.find("br").replaceWith("\n");
471
+ return clone.text().replace(/ /g, " ").replace(/[ \t]+/g, " ").trim();
472
+ }
473
+ function blockText($, node) {
474
+ const $node = $(node);
475
+ if (node.tagName === "table") {
476
+ return $node.find("tr").toArray().map(
477
+ (tr) => $(tr).find("th, td").toArray().map((c) => cellText2($, c)).join(" | ")
478
+ ).filter((line) => line.replace(/[ |]/g, "").length > 0).join("\n");
479
+ }
480
+ return cellText2($, node);
481
+ }
482
+ function parseSections(html) {
483
+ const $ = cheerio2.load(html);
484
+ $("style, script").remove();
485
+ const sections = [];
486
+ const headings = $(HEADING_SELECTOR).toArray();
487
+ const first = headings[0];
488
+ const introNodes = first ? $(first).prevAll().toArray().reverse() : $("body").contents().toArray();
489
+ const introParts = introNodes.map((n) => blockText($, n)).filter(Boolean);
490
+ const introContent = introParts.join("\n\n").trim();
491
+ if (introContent) sections.push({ heading: "intro", level: 0, content: introContent });
492
+ for (const el of headings) {
493
+ const heading = cellText2($, el);
494
+ if (!heading) continue;
495
+ const level = Number(el.tagName.slice(1));
496
+ const parts = $(el).nextUntil(HEADING_SELECTOR).toArray().map((n) => blockText($, n)).filter(Boolean);
497
+ sections.push({ heading, level, content: parts.join("\n\n").trim() });
498
+ }
499
+ return sections;
500
+ }
501
+
502
+ // src/domains/_confluence-sections/domain.ts
503
+ var SNIPPET_LEN = 200;
504
+ function slugify2(text2) {
505
+ return text2.normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
506
+ }
507
+ function buildItems2(pages) {
508
+ const items = [];
509
+ const seen = /* @__PURE__ */ new Map();
510
+ for (const page of pages) {
511
+ for (const section of page.sections) {
512
+ const base = `${page.pageId}:${slugify2(section.heading)}`;
513
+ const count = (seen.get(base) ?? 0) + 1;
514
+ seen.set(base, count);
515
+ const id = count > 1 ? `${base}-${count}` : base;
516
+ items.push({
517
+ id,
518
+ heading: section.heading,
519
+ level: section.level,
520
+ content: section.content,
521
+ page: { pageId: page.pageId, title: page.title, url: page.url }
522
+ });
523
+ }
524
+ }
525
+ return items;
526
+ }
527
+ function summarize2(item) {
528
+ const { content, ...rest } = item;
529
+ const snippet = content.length > SNIPPET_LEN ? `${content.slice(0, SNIPPET_LEN)}\u2026` : content;
530
+ return { ...rest, snippet };
531
+ }
532
+ function createConfluenceSectionsDomain(config) {
533
+ return {
534
+ id: config.id,
535
+ title: config.title,
536
+ description: config.description,
537
+ ttlHours: 72,
538
+ filters: [
539
+ { name: "page", description: "Substring no t\xEDtulo da p\xE1gina Confluence" },
540
+ { name: "heading", description: "Substring no t\xEDtulo da se\xE7\xE3o (heading)" },
541
+ { name: "contains", description: "Substring no conte\xFAdo da se\xE7\xE3o" }
542
+ ],
543
+ async extract(ctx) {
544
+ const total = config.pages.length;
545
+ const pages = [];
546
+ for (const [i, page] of config.pages.entries()) {
547
+ if (ctx?.signal?.aborted) throw new Error("Extra\xE7\xE3o cancelada pelo cliente");
548
+ if (i > 0) await sleep(config.interRequestDelayMs);
549
+ ctx?.onProgress?.(i, total, `Extraindo "${page.title}"`);
550
+ const { html, url } = await fetchConfluencePage(
551
+ config.confluenceBaseUrl,
552
+ page.pageId,
553
+ config.retryDelaysMs,
554
+ ctx?.signal
555
+ );
556
+ pages.push({ pageId: page.pageId, title: page.title, url, sections: parseSections(html) });
557
+ }
558
+ ctx?.onProgress?.(total, total);
559
+ return { items: buildItems2(pages) };
560
+ },
561
+ search(data, query, filters = {}) {
562
+ const page = filters.page ? normalize(filters.page) : void 0;
563
+ const heading = filters.heading ? normalize(filters.heading) : void 0;
564
+ const contains = filters.contains ? normalize(filters.contains) : void 0;
565
+ return data.items.filter((item) => {
566
+ if (page && !normalize(item.page.title).includes(page)) return false;
567
+ if (heading && !normalize(item.heading).includes(heading)) return false;
568
+ if (contains && !normalize(item.content).includes(contains)) return false;
569
+ if (query?.trim()) {
570
+ if (!matchesQuery(`${item.heading} ${item.content}`, query)) return false;
571
+ }
572
+ return true;
573
+ }).map(summarize2);
574
+ },
575
+ getItem(data, id) {
576
+ return data.items.find((i) => i.id === id) ?? null;
577
+ }
578
+ };
579
+ }
580
+
581
+ // src/domains/payments-v5-business-rules/config.ts
582
+ var paymentsV5BusinessRulesConfig = {
583
+ id: "payments-v5-business-rules",
584
+ title: "API de Pagamentos v5 \u2014 Regras de neg\xF3cio (SV)",
585
+ 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
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
587
+ interRequestDelayMs: 2e3,
588
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
589
+ pages: [
590
+ { pageId: "1767146135", title: "Informa\xE7\xF5es Gerais - Pagamentos v5.0.0" },
591
+ { pageId: "1767342137", title: "Escopo da API de Pagamentos - v5.0.0" },
592
+ { pageId: "1767146236", title: "M\xE1quina de Estados - Pagamentos v5.0.0" },
593
+ { pageId: "1767146164", title: "Diagrama de Sequ\xEAncia - Pagamentos v5.0.0" },
594
+ { pageId: "1767146321", title: "Valida\xE7\xE3o de informa\xE7\xF5es no DICT - Pagamentos v5.0.0" },
595
+ { pageId: "1861353753", title: "Adapta\xE7\xF5es para consultas de recursos entre 4.0.1 e 5.0.0" }
596
+ ]
597
+ };
598
+
599
+ // src/domains/payments-v5-business-rules/index.ts
600
+ var paymentsV5BusinessRulesDomain = createConfluenceSectionsDomain(paymentsV5BusinessRulesConfig);
601
+
465
602
  // src/domains/enrollments-v2-openapi/config.ts
466
603
  var enrollmentsV2Config = {
467
604
  id: "enrollments-v2-openapi",
468
- title: "API de V\xEDnculo de Dispositivo (Enrollments) \u2014 spec OpenAPI 2.2.0",
605
+ title: "API de V\xEDnculo de Dispositivo (Enrollments) \u2014 spec OpenAPI 2.3.0",
469
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.",
470
607
  pathExample: "/enrollments",
471
608
  specName: "enrollments",
472
- specVersion: "2.2.0",
473
- url: "https://raw.githubusercontent.com/OpenBanking-Brasil/all-services-repo/refs/heads/main/api_enrollments_for_payment_initiation_-_open_finance_brasil/2.2.0.yaml",
609
+ specVersion: "2.3.0",
610
+ url: "https://raw.githubusercontent.com/OpenBanking-Brasil/all-services-repo/refs/heads/main/api_enrollments_for_payment_initiation_-_open_finance_brasil/2.3.0.yaml",
474
611
  retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
475
612
  };
476
613
 
477
614
  // src/domains/enrollments-v2-openapi/index.ts
478
615
  var enrollmentsV2Domain = createOpenApiDomain(enrollmentsV2Config);
479
616
 
617
+ // src/domains/enrollments-v2-business-rules/config.ts
618
+ var enrollmentsV2BusinessRulesConfig = {
619
+ id: "enrollments-v2-business-rules",
620
+ title: "API de V\xEDnculo de Dispositivo v2 \u2014 Regras de neg\xF3cio (SV)",
621
+ 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
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
623
+ interRequestDelayMs: 2e3,
624
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
625
+ pages: [
626
+ { pageId: "1436516369", title: "Informa\xE7\xF5es Gerais - V\xEDnculo de dispositivo v2.2.0" },
627
+ { pageId: "1436516401", title: "M\xE1quina de estados - V\xEDnculo de dispositivo v2.2.0" },
628
+ { pageId: "1436516593", title: "Edi\xE7\xE3o do v\xEDnculo de dispositivo - v2.2.0" },
629
+ { pageId: "1436516567", title: "FAQ - JSR - V\xEDnculo de dispositivo v2.2.0" }
630
+ ]
631
+ };
632
+
633
+ // src/domains/enrollments-v2-business-rules/index.ts
634
+ var enrollmentsV2BusinessRulesDomain = createConfluenceSectionsDomain(
635
+ enrollmentsV2BusinessRulesConfig
636
+ );
637
+
480
638
  // src/domains/automatic-payments-v2-openapi/config.ts
481
639
  var automaticPaymentsV2Config = {
482
640
  id: "automatic-payments-v2-openapi",
@@ -492,11 +650,75 @@ var automaticPaymentsV2Config = {
492
650
  // src/domains/automatic-payments-v2-openapi/index.ts
493
651
  var automaticPaymentsV2Domain = createOpenApiDomain(automaticPaymentsV2Config);
494
652
 
653
+ // src/domains/automatic-payments-v2-business-rules/config.ts
654
+ var automaticPaymentsV2BusinessRulesConfig = {
655
+ id: "automatic-payments-v2-business-rules",
656
+ title: "API de Pagamentos Autom\xE1ticos v2 \u2014 Regras de neg\xF3cio (SV)",
657
+ 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
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
659
+ interRequestDelayMs: 2e3,
660
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
661
+ pages: [
662
+ { pageId: "1178042385", title: "Informa\xE7\xF5es Gerais - Pagamentos Autom\xE1ticos v2.2.0" },
663
+ { pageId: "1178042440", title: "M\xE1quina de Estados - Pagamentos Autom\xE1ticos v2.2.0" },
664
+ { pageId: "1178042534", title: "Edi\xE7\xE3o do consentimento - Pagamentos Autom\xE1ticos v2.2.0" },
665
+ { pageId: "1178042550", title: "Tentativas Intradia e Extradia para Pix Autom\xE1tico - v2.2.0" },
666
+ { pageId: "1178042602", title: "Adapta\xE7\xF5es para consultas de recursos entre 1.0.0 e 2.2.0" }
667
+ ]
668
+ };
669
+
670
+ // src/domains/automatic-payments-v2-business-rules/index.ts
671
+ var automaticPaymentsV2BusinessRulesDomain = createConfluenceSectionsDomain(
672
+ automaticPaymentsV2BusinessRulesConfig
673
+ );
674
+
675
+ // src/domains/payments-common-rules/config.ts
676
+ var paymentsCommonRulesConfig = {
677
+ id: "payments-common-rules",
678
+ title: "Inicia\xE7\xE3o de Pagamentos \u2014 Conte\xFAdo comum entre os produtos (SV)",
679
+ description: "Regras que valem para todos os produtos de Inicia\xE7\xE3o de Pagamentos do Open Finance Brasil (Pagamentos, Pagamentos Autom\xE1ticos e V\xEDnculo de Dispositivo), independentes de vers\xE3o da API, extra\xEDdas das p\xE1ginas Confluence de Servi\xE7os (SV): conceitos e atores da inicia\xE7\xE3o (detentora de conta, iniciadora de transa\xE7\xE3o de pagamento, inicia\xE7\xE3o pelo recebedor), Idempot\xEAncia, Assinatura de Mensagem vs Idempot\xEAncia, Como Assinar o Payload (JWS, claims, valida\xE7\xE3o), Conven\xE7\xF5es de formata\xE7\xE3o e fuso hor\xE1rio de campos de data e hora, e Recomenda\xE7\xE3o de Uso de Polling e Controle de Acesso. Regras espec\xEDficas de cada API est\xE3o em payments-v5-business-rules, automatic-payments-v2-business-rules e enrollments-v2-business-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.",
680
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
681
+ interRequestDelayMs: 2e3,
682
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
683
+ pages: [
684
+ { pageId: "17375910", title: "Inicia\xE7\xE3o de Pagamentos - conceitos e atores" },
685
+ { pageId: "728301590", title: "Idempot\xEAncia" },
686
+ { pageId: "728301669", title: "Assinatura de Mensagem vs Idempot\xEAncia" },
687
+ { pageId: "728301632", title: "Como Assinar o Payload" },
688
+ { pageId: "728301690", title: "Conven\xE7\xF5es de formata\xE7\xE3o e fuso hor\xE1rio de campos de data e hora" },
689
+ { pageId: "728301611", title: "Recomenda\xE7\xE3o Uso de Polling e Controle de Acesso" }
690
+ ]
691
+ };
692
+
693
+ // src/domains/payments-common-rules/index.ts
694
+ var paymentsCommonRulesDomain = createConfluenceSectionsDomain(paymentsCommonRulesConfig);
695
+
696
+ // src/domains/payments-implementation-guides/config.ts
697
+ var paymentsImplementationGuidesConfig = {
698
+ id: "payments-implementation-guides",
699
+ title: "Inicia\xE7\xE3o de Pagamentos \u2014 Guias de Implementa\xE7\xE3o (SV)",
700
+ description: "Guias de implementa\xE7\xE3o da Inicia\xE7\xE3o de Pagamentos do Open Finance Brasil, extra\xEDdos das p\xE1ginas Confluence de Servi\xE7os (SV). S\xE3o documentos longos, orientados a jornada, que descrevem regras de neg\xF3cio, fluxos e casos de uso ponta a ponta: Pix Autom\xE1tico (consentimento com/sem pagamento inicial, edi\xE7\xE3o, revoga\xE7\xE3o, ciclos de cobran\xE7a e retentativas), Agendamento Recorrente, Transfer\xEAncias Inteligentes e Liquida\xE7\xE3o de QR Codes via API Pagamentos (QR est\xE1tico, din\xE2mico, Pix Saque/Troco). Seguem versionamento pr\xF3prio, independente da vers\xE3o da API. Para as regras normativas por vers\xE3o de API veja payments-v5-business-rules, automatic-payments-v2-business-rules e enrollments-v2-business-rules. Cuidado: o dom\xEDnio jornada-otimizada tem uma p\xE1gina hom\xF4nima de Transfer\xEAncias Inteligentes, com outro recorte (Jornada Otimizada); aqui o foco \xE9 o guia de implementa\xE7\xE3o do produto. 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.",
701
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
702
+ interRequestDelayMs: 2e3,
703
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
704
+ pages: [
705
+ { pageId: "1217527809", title: "Pix Autom\xE1tico" },
706
+ { pageId: "213876817", title: "Agendamento Recorrente" },
707
+ { pageId: "628195902", title: "Transfer\xEAncias Inteligentes" },
708
+ { pageId: "1836744705", title: "Liquida\xE7\xE3o de QR Codes via API Pagamentos" }
709
+ ]
710
+ };
711
+
712
+ // src/domains/payments-implementation-guides/index.ts
713
+ var paymentsImplementationGuidesDomain = createConfluenceSectionsDomain(
714
+ paymentsImplementationGuidesConfig
715
+ );
716
+
495
717
  // src/domains/consents-v3-openapi/config.ts
496
718
  var consentsV3Config = {
497
719
  id: "consents-v3-openapi",
498
720
  title: "API de Consentimentos \u2014 spec OpenAPI 3.3.1",
499
- description: "Spec OpenAPI oficial da API de Consentimentos (Dados Cadastrais e Transacionais) do Open Finance Brasil, vers\xE3o 3.3.1. 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.",
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.",
500
722
  pathExample: "/consents/{consentId}",
501
723
  specName: "consents",
502
724
  specVersion: "3.3.1",
@@ -551,15 +773,15 @@ function parseOpenApiSpec2(yamlText, specName) {
551
773
  }
552
774
 
553
775
  // src/domains/pcm-openapi/index.ts
554
- function summarize2(item) {
776
+ function summarize3(item) {
555
777
  const { detail: _detail, ...rest } = item;
556
778
  return rest;
557
779
  }
558
780
  var pcmOpenapiDomain = {
559
781
  id: "pcm-openapi",
560
782
  title: `PCM \u2014 spec OpenAPI ${pcmOpenapiConfig.specVersion}`,
561
- description: "Spec OpenAPI oficial da PCM (Plataforma de Coleta de M\xE9tricas) do Open Finance Brasil. 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). search devolve resumos; use get_item para o n\xF3 completo da spec.",
562
- ttlHours: 24,
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,
563
785
  filters: [
564
786
  { name: "path", description: "Substring no path do endpoint (ex.: /report-api/v1/private/report)" },
565
787
  { name: "method", description: "Verbo HTTP exato (ex.: POST)" },
@@ -589,133 +811,18 @@ var pcmOpenapiDomain = {
589
811
  if (!matchesQuery(haystack, query)) return false;
590
812
  }
591
813
  return true;
592
- }).map(summarize2);
814
+ }).map(summarize3);
593
815
  },
594
816
  getItem(data, id) {
595
817
  return data.items.find((i) => i.id === id) ?? null;
596
818
  }
597
819
  };
598
820
 
599
- // src/domains/_confluence-sections/parser.ts
600
- import * as cheerio2 from "cheerio";
601
- var HEADING_SELECTOR = "h1, h2, h3";
602
- function cellText2($, el) {
603
- const clone = $(el).clone();
604
- clone.find("br").replaceWith("\n");
605
- return clone.text().replace(/ /g, " ").replace(/[ \t]+/g, " ").trim();
606
- }
607
- function blockText($, node) {
608
- const $node = $(node);
609
- if (node.tagName === "table") {
610
- return $node.find("tr").toArray().map(
611
- (tr) => $(tr).find("th, td").toArray().map((c) => cellText2($, c)).join(" | ")
612
- ).filter((line) => line.replace(/[ |]/g, "").length > 0).join("\n");
613
- }
614
- return cellText2($, node);
615
- }
616
- function parseSections(html) {
617
- const $ = cheerio2.load(html);
618
- const sections = [];
619
- const headings = $(HEADING_SELECTOR).toArray();
620
- const first = headings[0];
621
- const introNodes = first ? $(first).prevAll().toArray().reverse() : $("body").contents().toArray();
622
- const introParts = introNodes.map((n) => blockText($, n)).filter(Boolean);
623
- const introContent = introParts.join("\n\n").trim();
624
- if (introContent) sections.push({ heading: "intro", level: 0, content: introContent });
625
- for (const el of headings) {
626
- const heading = cellText2($, el);
627
- if (!heading) continue;
628
- const level = Number(el.tagName.slice(1));
629
- const parts = $(el).nextUntil(HEADING_SELECTOR).toArray().map((n) => blockText($, n)).filter(Boolean);
630
- sections.push({ heading, level, content: parts.join("\n\n").trim() });
631
- }
632
- return sections;
633
- }
634
-
635
- // src/domains/_confluence-sections/domain.ts
636
- var SNIPPET_LEN = 200;
637
- function slugify2(text2) {
638
- return text2.normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
639
- }
640
- function buildItems2(pages) {
641
- const items = [];
642
- const seen = /* @__PURE__ */ new Map();
643
- for (const page of pages) {
644
- for (const section of page.sections) {
645
- const base = `${page.pageId}:${slugify2(section.heading)}`;
646
- const count = (seen.get(base) ?? 0) + 1;
647
- seen.set(base, count);
648
- const id = count > 1 ? `${base}-${count}` : base;
649
- items.push({
650
- id,
651
- heading: section.heading,
652
- level: section.level,
653
- content: section.content,
654
- page: { pageId: page.pageId, title: page.title, url: page.url }
655
- });
656
- }
657
- }
658
- return items;
659
- }
660
- function summarize3(item) {
661
- const { content, ...rest } = item;
662
- const snippet = content.length > SNIPPET_LEN ? `${content.slice(0, SNIPPET_LEN)}\u2026` : content;
663
- return { ...rest, snippet };
664
- }
665
- function createConfluenceSectionsDomain(config) {
666
- return {
667
- id: config.id,
668
- title: config.title,
669
- description: config.description,
670
- ttlHours: 24,
671
- filters: [
672
- { name: "page", description: "Substring no t\xEDtulo da p\xE1gina Confluence" },
673
- { name: "heading", description: "Substring no t\xEDtulo da se\xE7\xE3o (heading)" },
674
- { name: "contains", description: "Substring no conte\xFAdo da se\xE7\xE3o" }
675
- ],
676
- async extract(ctx) {
677
- const total = config.pages.length;
678
- const pages = [];
679
- for (const [i, page] of config.pages.entries()) {
680
- if (ctx?.signal?.aborted) throw new Error("Extra\xE7\xE3o cancelada pelo cliente");
681
- if (i > 0) await sleep(config.interRequestDelayMs);
682
- ctx?.onProgress?.(i, total, `Extraindo "${page.title}"`);
683
- const { html, url } = await fetchConfluencePage(
684
- config.confluenceBaseUrl,
685
- page.pageId,
686
- config.retryDelaysMs,
687
- ctx?.signal
688
- );
689
- pages.push({ pageId: page.pageId, title: page.title, url, sections: parseSections(html) });
690
- }
691
- ctx?.onProgress?.(total, total);
692
- return { items: buildItems2(pages) };
693
- },
694
- search(data, query, filters = {}) {
695
- const page = filters.page ? normalize(filters.page) : void 0;
696
- const heading = filters.heading ? normalize(filters.heading) : void 0;
697
- const contains = filters.contains ? normalize(filters.contains) : void 0;
698
- return data.items.filter((item) => {
699
- if (page && !normalize(item.page.title).includes(page)) return false;
700
- if (heading && !normalize(item.heading).includes(heading)) return false;
701
- if (contains && !normalize(item.content).includes(contains)) return false;
702
- if (query?.trim()) {
703
- if (!matchesQuery(`${item.heading} ${item.content}`, query)) return false;
704
- }
705
- return true;
706
- }).map(summarize3);
707
- },
708
- getItem(data, id) {
709
- return data.items.find((i) => i.id === id) ?? null;
710
- }
711
- };
712
- }
713
-
714
821
  // src/domains/pcm-business-rules/config.ts
715
822
  var pcmBusinessRulesConfig = {
716
823
  id: "pcm-business-rules",
717
824
  title: "PCM \u2014 Regras de neg\xF3cio (Reporte, Processamento, Diverg\xEAncias)",
718
- description: "Regras de neg\xF3cio da PCM (Plataforma de Coleta de M\xE9tricas) do Open Finance Brasil, extra\xEDdas das p\xE1ginas Confluence: Especifica\xE7\xE3o T\xE9cnica, Reporte, Processamento, Diverg\xEAncias e Manual de Integra\xE7\xE3o. 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.",
825
+ description: "Regras de neg\xF3cio da PCM (Plataforma de Coleta de M\xE9tricas) do Open Finance Brasil \u2014 como funcionam reporte, processamento, fechamento e diverg\xEAncias \u2014, extra\xEDdas das p\xE1ginas Confluence: Especifica\xE7\xE3o T\xE9cnica, Reporte, Processamento, Diverg\xEAncias e Manual de Integra\xE7\xE3o. Cada item \xE9 uma se\xE7\xE3o (heading) da p\xE1gina. Outras facetas da PCM: o swagger dos endpoints de reporte em pcm-openapi; as tabelas de obrigatoriedade do campo additionalInfo em pcm-additional-info. search devolve um snippet do conte\xFAdo; use get_item para o texto completo da se\xE7\xE3o.",
719
826
  confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
720
827
  interRequestDelayMs: 2e3,
721
828
  retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
@@ -735,7 +842,7 @@ var pcmBusinessRulesDomain = createConfluenceSectionsDomain(pcmBusinessRulesConf
735
842
  var jornadaOtimizadaConfig = {
736
843
  id: "jornada-otimizada",
737
844
  title: "Jornada Otimizada",
738
- description: "Conhecimento regulat\xF3rio da Jornada Otimizada do Open Finance Brasil, extra\xEDdo das p\xE1ginas Confluence: Jornada Otimizada (introdu\xE7\xE3o), Orienta\xE7\xF5es Gerais, Transfer\xEAncias Inteligentes e Jornada sem Redirecionamento. 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.",
845
+ description: "Conhecimento regulat\xF3rio da Jornada Otimizada do Open Finance Brasil, extra\xEDdo das p\xE1ginas Confluence: Jornada Otimizada (introdu\xE7\xE3o), Orienta\xE7\xF5es Gerais, Transfer\xEAncias Inteligentes e Jornada sem Redirecionamento. Recorte da Jornada Otimizada; o guia de implementa\xE7\xE3o hom\xF4nimo de Transfer\xEAncias Inteligentes, sob Servi\xE7os (SV), 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.",
739
846
  confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
740
847
  interRequestDelayMs: 2e3,
741
848
  retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
@@ -865,7 +972,7 @@ var participantesDomain = {
865
972
  id: participantesConfig.id,
866
973
  title: participantesConfig.title,
867
974
  description: participantesConfig.description,
868
- ttlHours: 24,
975
+ ttlHours: 72,
869
976
  filters: [
870
977
  { name: "name", description: "Substring no nome da organiza\xE7\xE3o ou na marca (CustomerFriendlyName)" },
871
978
  { name: "api", description: "Substring na fam\xEDlia de API (ex.: payments, automatic-payments)" },
@@ -971,8 +1078,13 @@ var domains = [
971
1078
  pcmDomain,
972
1079
  paymentsDomain,
973
1080
  paymentsV5Domain,
1081
+ paymentsV5BusinessRulesDomain,
974
1082
  enrollmentsV2Domain,
1083
+ enrollmentsV2BusinessRulesDomain,
975
1084
  automaticPaymentsV2Domain,
1085
+ automaticPaymentsV2BusinessRulesDomain,
1086
+ paymentsCommonRulesDomain,
1087
+ paymentsImplementationGuidesDomain,
976
1088
  consentsV3Domain,
977
1089
  pcmOpenapiDomain,
978
1090
  pcmBusinessRulesDomain,
@@ -1168,7 +1280,7 @@ function createServer() {
1168
1280
  "refresh",
1169
1281
  {
1170
1282
  title: "Re-extrair fontes",
1171
- description: "For\xE7a re-extra\xE7\xE3o das fontes p\xFAblicas (ignora o TTL de 24h do cache). Sem `domain`, atualiza todos. Use quando suspeitar de dados desatualizados.",
1283
+ description: "For\xE7a re-extra\xE7\xE3o das fontes p\xFAblicas (ignora o TTL de 72h do cache). Sem `domain`, atualiza todos. Use quando suspeitar de dados desatualizados.",
1172
1284
  inputSchema: {
1173
1285
  domain: domainIdSchema.optional().describe("Id do dom\xEDnio; omita para todos")
1174
1286
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opf-br-mcp",
3
- "version": "0.5.1",
3
+ "version": "0.6.1",
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",
@@ -35,7 +35,8 @@
35
35
  "scripts": {
36
36
  "build": "tsup",
37
37
  "test": "vitest run",
38
- "typecheck": "tsc --noEmit"
38
+ "typecheck": "tsc --noEmit",
39
+ "prepack": "npm run build && npm test"
39
40
  },
40
41
  "dependencies": {
41
42
  "@modelcontextprotocol/sdk": "^1.17.0",