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.
- package/README.md +19 -11
- package/dist/index.js +263 -168
- 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/
|
|
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.
|
|
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
|
|
57
|
-
|
|
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
|
|
65
|
-
`payments-v4:schema:PixPayment`)
|
|
66
|
-
`
|
|
67
|
-
|
|
68
|
-
|
|
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.
|
|
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: "
|
|
301
|
-
ttlHours:
|
|
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 [
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
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:
|
|
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
|
-
|
|
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.
|
|
439
|
-
description: "Spec OpenAPI oficial da API de Pagamentos (Pix) do Open Finance Brasil. Itens type=operation (endpoints, um por m\xE9todo+path)
|
|
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.
|
|
443
|
-
url: "https://raw.githubusercontent.com/OpenBanking-Brasil/
|
|
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.
|
|
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
|
|
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:
|
|
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(
|
|
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);
|
|
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
|
|
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:
|
|
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(
|
|
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
|
|
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.
|
|
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",
|