opf-br-mcp 0.6.0 → 0.7.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 +19 -11
  2. package/dist/index.js +263 -168
  3. package/package.json +3 -2
package/README.md CHANGED
@@ -11,10 +11,10 @@ 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
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.2.0 da API de Vínculo de Dispositivo (Enrollments, FIDO, Pix Automático) |
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
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 |
19
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
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 |
@@ -52,20 +52,28 @@ bem na janela de contexto de um agente, e despejá-la desperdiça tokens. A solu
52
52
  apenas o mínimo necessário em cada etapa do funil:
53
53
 
54
54
  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).
55
+ 2. **`search`** — índice **pesquisável e resumido**. Cada resultado traz só os
56
+ campos leves (`id`, `type`, `path`, `method`, `summary`/`name`, `required`,
57
+ `in`); o nó pesado da spec (`detail`) e a lista `refs` são removidos do
58
+ resumo, e o retorno ainda é compactado (omite `null` e arrays vazios).
59
59
  3. **`get_item`** — só aqui o nó integral da spec é entregue, e apenas para o
60
60
  `id` que o agente escolheu.
61
61
 
62
62
  Como o Swagger/OpenAPI vira dados pesquisáveis: o parser "achata" a spec em itens
63
63
  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.
64
+ `payments-v4:POST /pix/payments`) e um por component reutilizável: `type: schema`
65
+ (`payments-v4:schema:PixPayment`), `type: response` (`webhook:response:202Webhook`),
66
+ `type: parameter` (`webhook:parameter:xWebhookInteractionId`) e `type: header`
67
+ (`payments:header:X-V`). O JSON completo de
68
+ cada nó fica retido em `detail` até um `get_item` explícito. Os `id`s não são
69
+ adivinháveis: sempre vêm de um `search`. Assim o agente localiza o endpoint/schema
70
+ certo pagando poucos tokens e só "paga" o payload integral quando pede um item nomeado.
71
+
72
+ Os `$ref` não são expandidos em linha (medimos 3–7x mais tokens por operação):
73
+ em vez disso, o `get_item` de um item traz `refs` com os `id`s dos components que
74
+ ele referencia — todos resolvíveis por `get_item`. Resolver
75
+ `responses.202.$ref: '#/components/responses/202Webhook'` é uma chamada a mais,
76
+ não uma ida ao YAML da fonte.
69
77
 
70
78
  Dados: extraídos das fontes públicas na primeira consulta (lazy), cache em
71
79
  `~/.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.5.0";
49
+ var PACKAGE_VERSION = "0.7.0";
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" },
@@ -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,23 @@ function createOpenApiDomain(config) {
394
433
  id: config.id,
395
434
  title: config.title,
396
435
  description: config.description,
397
- ttlHours: 24,
436
+ ttlHours: 72,
398
437
  filters: [
399
438
  { name: "path", description: `Substring no path do endpoint (ex.: ${config.pathExample})` },
400
439
  { name: "method", description: "Verbo HTTP exato (ex.: POST)" },
401
- { name: "schema", description: "Substring no nome do schema (case-insensitive)" }
440
+ { name: "schema", description: "Substring no nome do schema (case-insensitive)" },
441
+ {
442
+ name: "response",
443
+ description: "Substring no nome do components.responses, a chave usada no $ref (ex.: 202Webhook)"
444
+ },
445
+ {
446
+ name: "parameter",
447
+ description: "Substring no nome do components.parameters, a chave usada no $ref (ex.: xFapiInteractionId)"
448
+ },
449
+ {
450
+ name: "header",
451
+ description: "Substring no nome do components.headers, a chave usada no $ref (ex.: X-V)"
452
+ }
402
453
  ],
403
454
  async extract(ctx) {
404
455
  if (ctx?.signal?.aborted) throw new Error("Extra\xE7\xE3o cancelada pelo cliente");
@@ -414,13 +465,17 @@ function createOpenApiDomain(config) {
414
465
  search(data, query, filters = {}) {
415
466
  const path = filters.path ? normalize(filters.path) : void 0;
416
467
  const method = filters.method?.toUpperCase();
417
- const schema = filters.schema ? normalize(filters.schema) : void 0;
418
468
  return data.items.filter((item) => {
419
469
  if (path && !normalize(String(item.path ?? "")).includes(path)) return false;
420
470
  if (method && item.method !== method) return false;
421
- if (schema && !normalize(String(item.name ?? "")).includes(schema)) return false;
471
+ for (const type of ["schema", "response", "parameter", "header"]) {
472
+ const name = filters[type];
473
+ if (!name) continue;
474
+ if (item.type !== type) return false;
475
+ if (!normalize(String(item.name ?? "")).includes(normalize(name))) return false;
476
+ }
422
477
  if (query?.trim()) {
423
- const haystack = [item.path, item.summary, item.description, item.name].map((v) => String(v ?? "")).join(" ");
478
+ const haystack = [item.path, item.summary, item.description, item.name, item.paramName].map((v) => String(v ?? "")).join(" ");
424
479
  if (!matchesQuery(haystack, query)) return false;
425
480
  }
426
481
  return true;
@@ -435,12 +490,12 @@ function createOpenApiDomain(config) {
435
490
  // src/domains/payments-v4-openapi/config.ts
436
491
  var paymentsConfig = {
437
492
  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.",
493
+ title: "API de Pagamentos \u2014 spec OpenAPI 4.1.0",
494
+ 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
495
  pathExample: "/pix/payments",
441
496
  specName: "payments",
442
- specVersion: "4.0.0",
443
- url: "https://raw.githubusercontent.com/OpenBanking-Brasil/openapi/main/swagger-apis/payments/4.0.0.yml",
497
+ specVersion: "4.1.0",
498
+ url: "https://raw.githubusercontent.com/OpenBanking-Brasil/all-services-repo/refs/heads/main/api_payment_initiation_-_open_finance_brasil/4.1.0.yaml",
444
499
  retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
445
500
  };
446
501
 
@@ -451,7 +506,7 @@ var paymentsDomain = createOpenApiDomain(paymentsConfig);
451
506
  var paymentsV5Config = {
452
507
  id: "payments-v5-openapi",
453
508
  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.",
509
+ 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
510
  pathExample: "/pix/payments",
456
511
  specName: "payments",
457
512
  specVersion: "5.0.0",
@@ -462,140 +517,6 @@ var paymentsV5Config = {
462
517
  // src/domains/payments-v5-openapi/index.ts
463
518
  var paymentsV5Domain = createOpenApiDomain(paymentsV5Config);
464
519
 
465
- // src/domains/enrollments-v2-openapi/config.ts
466
- var enrollmentsV2Config = {
467
- id: "enrollments-v2-openapi",
468
- title: "API de V\xEDnculo de Dispositivo (Enrollments) \u2014 spec OpenAPI 2.2.0",
469
- 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
- pathExample: "/enrollments",
471
- 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",
474
- retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
475
- };
476
-
477
- // src/domains/enrollments-v2-openapi/index.ts
478
- var enrollmentsV2Domain = createOpenApiDomain(enrollmentsV2Config);
479
-
480
- // src/domains/automatic-payments-v2-openapi/config.ts
481
- var automaticPaymentsV2Config = {
482
- id: "automatic-payments-v2-openapi",
483
- title: "API de Pagamentos Autom\xE1ticos (Automatic Payments) \u2014 spec OpenAPI 2.2.0",
484
- 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.",
485
- pathExample: "/pix/recurring-payments",
486
- specName: "automatic-payments",
487
- specVersion: "2.2.0",
488
- url: "https://raw.githubusercontent.com/OpenBanking-Brasil/all-services-repo/refs/heads/main/api_automatic_payments_-_open_finance_brasil/2.2.0.yaml",
489
- retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
490
- };
491
-
492
- // src/domains/automatic-payments-v2-openapi/index.ts
493
- var automaticPaymentsV2Domain = createOpenApiDomain(automaticPaymentsV2Config);
494
-
495
- // src/domains/consents-v3-openapi/config.ts
496
- var consentsV3Config = {
497
- id: "consents-v3-openapi",
498
- 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.",
500
- pathExample: "/consents/{consentId}",
501
- specName: "consents",
502
- specVersion: "3.3.1",
503
- url: "https://openbanking-brasil.github.io/openapi/swagger-apis/consents/3.3.1.yml",
504
- retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
505
- };
506
-
507
- // src/domains/consents-v3-openapi/index.ts
508
- var consentsV3Domain = createOpenApiDomain(consentsV3Config);
509
-
510
- // src/domains/pcm-openapi/config.ts
511
- var pcmOpenapiConfig = {
512
- specName: "pcm",
513
- specVersion: "1.0.0",
514
- url: "https://raw.githubusercontent.com/OpenBanking-Brasil/pcm-specs/refs/heads/feature/correct-paths/PCM-current.openapi.yaml",
515
- retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
516
- };
517
-
518
- // src/domains/pcm-openapi/parser.ts
519
- import { parse as parse2 } from "yaml";
520
- var HTTP_METHODS2 = ["get", "post", "put", "patch", "delete"];
521
- function parseOpenApiSpec2(yamlText, specName) {
522
- const spec = parse2(yamlText);
523
- const items = [];
524
- for (const [path, pathItem] of Object.entries(spec.paths ?? {})) {
525
- for (const method of HTTP_METHODS2) {
526
- const op = pathItem[method];
527
- if (!op) continue;
528
- items.push({
529
- id: `${specName}:${method.toUpperCase()} ${path}`,
530
- type: "operation",
531
- path,
532
- method: method.toUpperCase(),
533
- summary: op.summary ?? null,
534
- description: op.description ?? null,
535
- tags: op.tags ?? [],
536
- detail: op
537
- });
538
- }
539
- }
540
- for (const [name, schema] of Object.entries(spec.components?.schemas ?? {})) {
541
- items.push({
542
- id: `${specName}:schema:${name}`,
543
- type: "schema",
544
- name,
545
- description: schema.description ?? null,
546
- required: schema.required ?? [],
547
- detail: schema
548
- });
549
- }
550
- return items;
551
- }
552
-
553
- // src/domains/pcm-openapi/index.ts
554
- function summarize2(item) {
555
- const { detail: _detail, ...rest } = item;
556
- return rest;
557
- }
558
- var pcmOpenapiDomain = {
559
- id: "pcm-openapi",
560
- 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,
563
- filters: [
564
- { name: "path", description: "Substring no path do endpoint (ex.: /report-api/v1/private/report)" },
565
- { name: "method", description: "Verbo HTTP exato (ex.: POST)" },
566
- { name: "schema", description: "Substring no nome do schema (case-insensitive)" }
567
- ],
568
- async extract(ctx) {
569
- if (ctx?.signal?.aborted) throw new Error("Extra\xE7\xE3o cancelada pelo cliente");
570
- ctx?.onProgress?.(0, 1, `Baixando spec ${pcmOpenapiConfig.specName} ${pcmOpenapiConfig.specVersion}`);
571
- const response = await fetchWithRetry(pcmOpenapiConfig.url, {
572
- retryDelaysMs: pcmOpenapiConfig.retryDelaysMs,
573
- signal: ctx?.signal
574
- });
575
- const yamlText = await response.text();
576
- ctx?.onProgress?.(1, 1);
577
- return { items: parseOpenApiSpec2(yamlText, pcmOpenapiConfig.specName) };
578
- },
579
- search(data, query, filters = {}) {
580
- const path = filters.path ? normalize(filters.path) : void 0;
581
- const method = filters.method?.toUpperCase();
582
- const schema = filters.schema ? normalize(filters.schema) : void 0;
583
- return data.items.filter((item) => {
584
- if (path && !normalize(String(item.path ?? "")).includes(path)) return false;
585
- if (method && item.method !== method) return false;
586
- if (schema && !normalize(String(item.name ?? "")).includes(schema)) return false;
587
- if (query?.trim()) {
588
- const haystack = [item.path, item.summary, item.description, item.name].map((v) => String(v ?? "")).join(" ");
589
- if (!matchesQuery(haystack, query)) return false;
590
- }
591
- return true;
592
- }).map(summarize2);
593
- },
594
- getItem(data, id) {
595
- return data.items.find((i) => i.id === id) ?? null;
596
- }
597
- };
598
-
599
520
  // src/domains/_confluence-sections/parser.ts
600
521
  import * as cheerio2 from "cheerio";
601
522
  var HEADING_SELECTOR = "h1, h2, h3";
@@ -615,6 +536,7 @@ function blockText($, node) {
615
536
  }
616
537
  function parseSections(html) {
617
538
  const $ = cheerio2.load(html);
539
+ $("style, script").remove();
618
540
  const sections = [];
619
541
  const headings = $(HEADING_SELECTOR).toArray();
620
542
  const first = headings[0];
@@ -657,7 +579,7 @@ function buildItems2(pages) {
657
579
  }
658
580
  return items;
659
581
  }
660
- function summarize3(item) {
582
+ function summarize2(item) {
661
583
  const { content, ...rest } = item;
662
584
  const snippet = content.length > SNIPPET_LEN ? `${content.slice(0, SNIPPET_LEN)}\u2026` : content;
663
585
  return { ...rest, snippet };
@@ -667,7 +589,7 @@ function createConfluenceSectionsDomain(config) {
667
589
  id: config.id,
668
590
  title: config.title,
669
591
  description: config.description,
670
- ttlHours: 24,
592
+ ttlHours: 72,
671
593
  filters: [
672
594
  { name: "page", description: "Substring no t\xEDtulo da p\xE1gina Confluence" },
673
595
  { name: "heading", description: "Substring no t\xEDtulo da se\xE7\xE3o (heading)" },
@@ -703,7 +625,7 @@ function createConfluenceSectionsDomain(config) {
703
625
  if (!matchesQuery(`${item.heading} ${item.content}`, query)) return false;
704
626
  }
705
627
  return true;
706
- }).map(summarize3);
628
+ }).map(summarize2);
707
629
  },
708
630
  getItem(data, id) {
709
631
  return data.items.find((i) => i.id === id) ?? null;
@@ -711,11 +633,179 @@ function createConfluenceSectionsDomain(config) {
711
633
  };
712
634
  }
713
635
 
636
+ // src/domains/payments-v5-business-rules/config.ts
637
+ var paymentsV5BusinessRulesConfig = {
638
+ id: "payments-v5-business-rules",
639
+ title: "API de Pagamentos v5 \u2014 Regras de neg\xF3cio (SV)",
640
+ 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.",
641
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
642
+ interRequestDelayMs: 2e3,
643
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
644
+ pages: [
645
+ { pageId: "1767146135", title: "Informa\xE7\xF5es Gerais - Pagamentos v5.0.0" },
646
+ { pageId: "1767342137", title: "Escopo da API de Pagamentos - v5.0.0" },
647
+ { pageId: "1767146236", title: "M\xE1quina de Estados - Pagamentos v5.0.0" },
648
+ { pageId: "1767146164", title: "Diagrama de Sequ\xEAncia - Pagamentos v5.0.0" },
649
+ { pageId: "1767146321", title: "Valida\xE7\xE3o de informa\xE7\xF5es no DICT - Pagamentos v5.0.0" },
650
+ { pageId: "1861353753", title: "Adapta\xE7\xF5es para consultas de recursos entre 4.0.1 e 5.0.0" }
651
+ ]
652
+ };
653
+
654
+ // src/domains/payments-v5-business-rules/index.ts
655
+ var paymentsV5BusinessRulesDomain = createConfluenceSectionsDomain(paymentsV5BusinessRulesConfig);
656
+
657
+ // src/domains/enrollments-v2-openapi/config.ts
658
+ var enrollmentsV2Config = {
659
+ id: "enrollments-v2-openapi",
660
+ title: "API de V\xEDnculo de Dispositivo (Enrollments) \u2014 spec OpenAPI 2.3.0",
661
+ 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.",
662
+ pathExample: "/enrollments",
663
+ specName: "enrollments",
664
+ specVersion: "2.3.0",
665
+ 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",
666
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
667
+ };
668
+
669
+ // src/domains/enrollments-v2-openapi/index.ts
670
+ var enrollmentsV2Domain = createOpenApiDomain(enrollmentsV2Config);
671
+
672
+ // src/domains/enrollments-v2-business-rules/config.ts
673
+ var enrollmentsV2BusinessRulesConfig = {
674
+ id: "enrollments-v2-business-rules",
675
+ title: "API de V\xEDnculo de Dispositivo v2 \u2014 Regras de neg\xF3cio (SV)",
676
+ 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.",
677
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
678
+ interRequestDelayMs: 2e3,
679
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
680
+ pages: [
681
+ { pageId: "1436516369", title: "Informa\xE7\xF5es Gerais - V\xEDnculo de dispositivo v2.2.0" },
682
+ { pageId: "1436516401", title: "M\xE1quina de estados - V\xEDnculo de dispositivo v2.2.0" },
683
+ { pageId: "1436516593", title: "Edi\xE7\xE3o do v\xEDnculo de dispositivo - v2.2.0" },
684
+ { pageId: "1436516567", title: "FAQ - JSR - V\xEDnculo de dispositivo v2.2.0" }
685
+ ]
686
+ };
687
+
688
+ // src/domains/enrollments-v2-business-rules/index.ts
689
+ var enrollmentsV2BusinessRulesDomain = createConfluenceSectionsDomain(
690
+ enrollmentsV2BusinessRulesConfig
691
+ );
692
+
693
+ // src/domains/automatic-payments-v2-openapi/config.ts
694
+ var automaticPaymentsV2Config = {
695
+ id: "automatic-payments-v2-openapi",
696
+ title: "API de Pagamentos Autom\xE1ticos (Automatic Payments) \u2014 spec OpenAPI 2.2.0",
697
+ 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.",
698
+ pathExample: "/pix/recurring-payments",
699
+ specName: "automatic-payments",
700
+ specVersion: "2.2.0",
701
+ url: "https://raw.githubusercontent.com/OpenBanking-Brasil/all-services-repo/refs/heads/main/api_automatic_payments_-_open_finance_brasil/2.2.0.yaml",
702
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
703
+ };
704
+
705
+ // src/domains/automatic-payments-v2-openapi/index.ts
706
+ var automaticPaymentsV2Domain = createOpenApiDomain(automaticPaymentsV2Config);
707
+
708
+ // src/domains/automatic-payments-v2-business-rules/config.ts
709
+ var automaticPaymentsV2BusinessRulesConfig = {
710
+ id: "automatic-payments-v2-business-rules",
711
+ title: "API de Pagamentos Autom\xE1ticos v2 \u2014 Regras de neg\xF3cio (SV)",
712
+ 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.",
713
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
714
+ interRequestDelayMs: 2e3,
715
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
716
+ pages: [
717
+ { pageId: "1178042385", title: "Informa\xE7\xF5es Gerais - Pagamentos Autom\xE1ticos v2.2.0" },
718
+ { pageId: "1178042440", title: "M\xE1quina de Estados - Pagamentos Autom\xE1ticos v2.2.0" },
719
+ { pageId: "1178042534", title: "Edi\xE7\xE3o do consentimento - Pagamentos Autom\xE1ticos v2.2.0" },
720
+ { pageId: "1178042550", title: "Tentativas Intradia e Extradia para Pix Autom\xE1tico - v2.2.0" },
721
+ { pageId: "1178042602", title: "Adapta\xE7\xF5es para consultas de recursos entre 1.0.0 e 2.2.0" }
722
+ ]
723
+ };
724
+
725
+ // src/domains/automatic-payments-v2-business-rules/index.ts
726
+ var automaticPaymentsV2BusinessRulesDomain = createConfluenceSectionsDomain(
727
+ automaticPaymentsV2BusinessRulesConfig
728
+ );
729
+
730
+ // src/domains/payments-common-rules/config.ts
731
+ var paymentsCommonRulesConfig = {
732
+ id: "payments-common-rules",
733
+ title: "Inicia\xE7\xE3o de Pagamentos \u2014 Conte\xFAdo comum entre os produtos (SV)",
734
+ 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.",
735
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
736
+ interRequestDelayMs: 2e3,
737
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
738
+ pages: [
739
+ { pageId: "17375910", title: "Inicia\xE7\xE3o de Pagamentos - conceitos e atores" },
740
+ { pageId: "728301590", title: "Idempot\xEAncia" },
741
+ { pageId: "728301669", title: "Assinatura de Mensagem vs Idempot\xEAncia" },
742
+ { pageId: "728301632", title: "Como Assinar o Payload" },
743
+ { pageId: "728301690", title: "Conven\xE7\xF5es de formata\xE7\xE3o e fuso hor\xE1rio de campos de data e hora" },
744
+ { pageId: "728301611", title: "Recomenda\xE7\xE3o Uso de Polling e Controle de Acesso" }
745
+ ]
746
+ };
747
+
748
+ // src/domains/payments-common-rules/index.ts
749
+ var paymentsCommonRulesDomain = createConfluenceSectionsDomain(paymentsCommonRulesConfig);
750
+
751
+ // src/domains/payments-implementation-guides/config.ts
752
+ var paymentsImplementationGuidesConfig = {
753
+ id: "payments-implementation-guides",
754
+ title: "Inicia\xE7\xE3o de Pagamentos \u2014 Guias de Implementa\xE7\xE3o (SV)",
755
+ 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.",
756
+ confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
757
+ interRequestDelayMs: 2e3,
758
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
759
+ pages: [
760
+ { pageId: "1217527809", title: "Pix Autom\xE1tico" },
761
+ { pageId: "213876817", title: "Agendamento Recorrente" },
762
+ { pageId: "628195902", title: "Transfer\xEAncias Inteligentes" },
763
+ { pageId: "1836744705", title: "Liquida\xE7\xE3o de QR Codes via API Pagamentos" }
764
+ ]
765
+ };
766
+
767
+ // src/domains/payments-implementation-guides/index.ts
768
+ var paymentsImplementationGuidesDomain = createConfluenceSectionsDomain(
769
+ paymentsImplementationGuidesConfig
770
+ );
771
+
772
+ // src/domains/consents-v3-openapi/config.ts
773
+ var consentsV3Config = {
774
+ id: "consents-v3-openapi",
775
+ title: "API de Consentimentos \u2014 spec OpenAPI 3.3.1",
776
+ 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.",
777
+ pathExample: "/consents/{consentId}",
778
+ specName: "consents",
779
+ specVersion: "3.3.1",
780
+ url: "https://openbanking-brasil.github.io/openapi/swagger-apis/consents/3.3.1.yml",
781
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
782
+ };
783
+
784
+ // src/domains/consents-v3-openapi/index.ts
785
+ var consentsV3Domain = createOpenApiDomain(consentsV3Config);
786
+
787
+ // src/domains/pcm-openapi/config.ts
788
+ var pcmOpenapiConfig = {
789
+ specName: "pcm",
790
+ specVersion: "1.0.0",
791
+ url: "https://raw.githubusercontent.com/OpenBanking-Brasil/pcm-specs/refs/heads/feature/correct-paths/PCM-current.openapi.yaml",
792
+ retryDelaysMs: [2e3, 4e3, 8e3, 16e3]
793
+ };
794
+
795
+ // src/domains/pcm-openapi/index.ts
796
+ var pcmOpenapiDomain = createOpenApiDomain({
797
+ id: "pcm-openapi",
798
+ title: `PCM \u2014 spec OpenAPI ${pcmOpenapiConfig.specVersion}`,
799
+ 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).",
800
+ pathExample: "/report-api/v1/private/report",
801
+ ...pcmOpenapiConfig
802
+ });
803
+
714
804
  // src/domains/pcm-business-rules/config.ts
715
805
  var pcmBusinessRulesConfig = {
716
806
  id: "pcm-business-rules",
717
807
  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.",
808
+ 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
809
  confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
720
810
  interRequestDelayMs: 2e3,
721
811
  retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
@@ -735,7 +825,7 @@ var pcmBusinessRulesDomain = createConfluenceSectionsDomain(pcmBusinessRulesConf
735
825
  var jornadaOtimizadaConfig = {
736
826
  id: "jornada-otimizada",
737
827
  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.",
828
+ 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
829
  confluenceBaseUrl: "https://openfinancebrasil.atlassian.net",
740
830
  interRequestDelayMs: 2e3,
741
831
  retryDelaysMs: [2e3, 4e3, 8e3, 16e3],
@@ -776,7 +866,7 @@ var mqdDomain = createConfluenceSectionsDomain(mqdConfig);
776
866
  var webhookConfig = {
777
867
  id: "webhook-v1-openapi",
778
868
  title: "API de Webhook \u2014 spec OpenAPI 1.3.0",
779
- 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.",
869
+ 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.",
780
870
  pathExample: "/payments/{versionApi}/consents/{consentId}",
781
871
  specName: "webhook",
782
872
  specVersion: "1.3.0",
@@ -857,7 +947,7 @@ function parseParticipants(jsonText) {
857
947
  }
858
948
 
859
949
  // src/domains/participantes/index.ts
860
- function summarize4(item) {
950
+ function summarize3(item) {
861
951
  const { detail: _detail, ...rest } = item;
862
952
  return rest;
863
953
  }
@@ -865,7 +955,7 @@ var participantesDomain = {
865
955
  id: participantesConfig.id,
866
956
  title: participantesConfig.title,
867
957
  description: participantesConfig.description,
868
- ttlHours: 24,
958
+ ttlHours: 72,
869
959
  filters: [
870
960
  { name: "name", description: "Substring no nome da organiza\xE7\xE3o ou na marca (CustomerFriendlyName)" },
871
961
  { name: "api", description: "Substring na fam\xEDlia de API (ex.: payments, automatic-payments)" },
@@ -898,7 +988,7 @@ var participantesDomain = {
898
988
  if (!matchesQuery(haystack, query)) return false;
899
989
  }
900
990
  return true;
901
- }).map(summarize4);
991
+ }).map(summarize3);
902
992
  },
903
993
  getItem(data, id) {
904
994
  return data.items.find((i) => i.id === id) ?? null;
@@ -971,8 +1061,13 @@ var domains = [
971
1061
  pcmDomain,
972
1062
  paymentsDomain,
973
1063
  paymentsV5Domain,
1064
+ paymentsV5BusinessRulesDomain,
974
1065
  enrollmentsV2Domain,
1066
+ enrollmentsV2BusinessRulesDomain,
975
1067
  automaticPaymentsV2Domain,
1068
+ automaticPaymentsV2BusinessRulesDomain,
1069
+ paymentsCommonRulesDomain,
1070
+ paymentsImplementationGuidesDomain,
976
1071
  consentsV3Domain,
977
1072
  pcmOpenapiDomain,
978
1073
  pcmBusinessRulesDomain,
@@ -1126,7 +1221,7 @@ function createServer() {
1126
1221
  "get_item",
1127
1222
  {
1128
1223
  title: "Detalhar um item",
1129
- 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).",
1224
+ 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.",
1130
1225
  inputSchema: {
1131
1226
  domain: domainIdSchema,
1132
1227
  id: z.string().describe("Id do item (vindo de search)")
@@ -1168,7 +1263,7 @@ function createServer() {
1168
1263
  "refresh",
1169
1264
  {
1170
1265
  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.",
1266
+ 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
1267
  inputSchema: {
1173
1268
  domain: domainIdSchema.optional().describe("Id do dom\xEDnio; omita para todos")
1174
1269
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opf-br-mcp",
3
- "version": "0.6.0",
3
+ "version": "0.7.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",
@@ -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",