Skip to main content
Glama
lpillonwp

Payments MCP

by lpillonwp

payments-mcp

MCP Server (Model Context Protocol) para centralizar integrações de pagamento:

  • Pagar.me (Core API v5): customers, recipients, Pix, cartão, split 100%, charges, captura/cancelamento, tokenização (card_token)

  • Woovi/OpenPix: charges Pix, consulta/listagem, deleção, refunds, verificação de webhook (HMAC)

O servidor expõe tools MCP para serem chamadas por um client MCP (ex: um agente/LLM), via stdio (padrão) ou MCP over HTTP (opcional).

Licença

MIT - Veja: ./LICENSE.


Stack e arquitetura

  • Node.js + TypeScript

  • MCP TypeScript SDK (@modelcontextprotocol/sdk) usando o McpServer com registerTool e schemas Zod.

  • Zod para validação de entrada

  • Axios para Woovi/OpenPix

  • SDK oficial Pagar.me @pagarme/pagarme-nodejs-sdk

  • Express (opcional): para expor MCP over HTTP (/mcp) via StreamableHTTPServerTransport

Estrutura de pastas (clean, por domínio):

  • src/index.ts: bootstrap do MCP server (stdio)

  • src/http/server.ts: transport HTTP opcional (MCP over HTTP)

  • src/mcp/server.ts: factory de criação do McpServer (tools registradas)

  • src/tools/register.ts: registry central de tools

  • src/mcp/utils.ts: helpers de resposta/erro (ok, fail)

  • src/integrations/pagarme/*: client, schemas e tools Pagar.me

  • src/integrations/woovi/*: client, schemas e tools Woovi/OpenPix


Requisitos

  • Node.js 18+ (recomendado) / npm

  • Credenciais de Pagar.me e/ou Woovi/OpenPix


Instalação

npm install

Build:

npm run build

Rodar (stdio):

npm start

Dev:

npm run dev

Observação: o build sempre limpa dist/ antes de compilar.


Variáveis de ambiente

Crie um .env na raiz (ou exporte no ambiente):

Copie o template:

cp env.example .env

Pagar.me

  • PAGARME_API_KEY (obrigatória): usada como Basic Auth username (password vazio)

  • PAGARME_PUBLIC_KEY (opcional, mas recomendado): necessária para pagarme_create_card_token / pagarme_get_token

Woovi/OpenPix

  • WOOVI_APP_ID (obrigatória): header Authorization (AppID)

  • WOOVI_BASE_URL (opcional):

    • produção: https://api.openpix.com.br/api/v1 (default)

    • sandbox: https://api.woovi-sandbox.com/api/v1


Modos de execução (MCP)

MCP via stdio (local)

Modo padrão (ex: Cursor). O client MCP executa este processo e conversa via stdin/stdout.

MCP over HTTP (opcional)

Se você definir MCP_HTTP_PORT, o servidor também expõe MCP via HTTP (Streamable HTTP).

Exemplo:

export MCP_HTTP_PORT=3001 npm start

Endpoints:

  • GET /health

  • POST /mcp (protocolo MCP)

  • GET /mcp (protocolo MCP, com sessão)

  • DELETE /mcp (protocolo MCP, com sessão)

Importante: isso é MCP over HTTP, não é uma REST API para o frontend.

Para usar via HTTP, utilize um client MCP HTTP (ex: StreamableHTTPClientTransport). O servidor usa sessões via header mcp-session-id (o client gerencia isso automaticamente).

Exemplo (TypeScript) de client MCP HTTP:

import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; const client = new Client({ name: "my-client", version: "1.0.0" }); const transport = new StreamableHTTPClientTransport(new URL("http://localhost:3001/mcp")); await client.connect(transport); // Agora você pode listar/callar tools via MCP

Rodar com Docker

Build da imagem

docker build -t payments-mcp:local .

Subir como serviço (MCP over HTTP)

Opção 1 (docker run):

docker run --rm -p 3001:3001 --env-file .env -e MCP_HTTP_PORT=3001 payments-mcp:local

Opção 2 (docker compose):

docker compose up --build

Health check:

curl -s http://localhost:3001/health

Rodar E2E dentro do container

Smoke:

docker run --rm --env-file .env payments-mcp:local npm run e2e:smoke

Full:

docker run --rm --env-file .env payments-mcp:local npm run e2e

Pagar.me — funcionalidades (tools MCP)

Customers

  • pagarme_create_customer

  • pagarme_get_customer

  • pagarme_update_customer_metadata

Recipients (personal)

  • pagarme_create_recipient

  • pagarme_update_recipient_default_bank_account

  • pagarme_get_recipients

Orders / Pix / Cartão (split 100%)

  • pagarme_get_order

  • pagarme_create_order_pix_split

  • pagarme_create_order_credit_card_split

Split 100%:

  • O recipient (personal) recebe 100% do valor do pedido e arcará com as taxas (configurado como liable=true e chargeProcessingFee=true no split do payment).

Charges

  • pagarme_get_charge

  • pagarme_get_charge_transactions (útil para Pix — QRCode vem das transações)

  • pagarme_capture_charge (quando cartão foi criado com capture=false)

  • pagarme_cancel_charge

Tokenização (cartão)

  • pagarme_create_card_token (usa PAGARME_PUBLIC_KEY ou publicKey no payload)

  • pagarme_get_token


Woovi/OpenPix — funcionalidades (tools MCP)

As tools foram implementadas seguindo a documentação do OpenPix (Woovi), incluindo:

Charges (Pix)

  • woovi_create_charge (POST /api/v1/charge)

  • woovi_get_charge (GET /api/v1/charge/{id})

  • woovi_list_charges (GET /api/v1/charge com filtros)

  • woovi_delete_charge (DELETE /api/v1/charge/{id})

Saída “pronta para FrontEnd”:

As tools woovi_create_charge e woovi_get_charge retornam um objeto normalizado com:

  • charge.brCode

  • charge.qrCodeImage

  • charge.paymentLinkUrl

  • charge.expiresDate

  • charge.status

  • e raw com o payload integral da API

Refunds

  • woovi_create_refund (POST /api/v1/refund)

  • woovi_list_refunds (GET /api/v1/refund)

  • woovi_get_refund (GET /api/v1/refund/{id})

  • woovi_get_charge_refunds (GET /api/v1/charge/{id}/refund)

  • woovi_create_charge_refund (POST /api/v1/charge/{id}/refund)

Webhook

  • woovi_verify_webhook_hmac: valida HMAC do webhook usando sha1 + base64 e o header X-OpenPix-Signature.


Fluxos recomendados

Pix via Pagar.me (preferência atual)

  1. (opcional) pagarme_create_customer (aluno)

  2. pagarme_create_recipient (personal)

  3. pagarme_create_order_pix_split → retorna chargeId e pix.qrCode/qrCodeUrl/expiresAt

  4. Polling de status com pagarme_get_charge / pagarme_get_order

Pix via Woovi/OpenPix (alternativo)

  1. woovi_create_charge → retorna charge.brCode, charge.qrCodeImage, charge.paymentLinkUrl

  2. woovi_get_charge / woovi_list_charges → acompanhar status

  3. Se precisar estornar: woovi_create_refund (com transactionEndToEndId)

Cartão via Pagar.me

  1. (opcional) pagarme_create_card_token → obtém card_token

  2. pagarme_create_order_credit_card_split (usa cardToken ou cardId)

  3. Se capture=false: pagarme_capture_charge

  4. Cancelamento/estorno: pagarme_cancel_charge


Exemplos de payloads (copiar/colar)

Pagar.me — Pix + split 100%

{ "recipientId": "rp_xxxxxxxxxx", "items": [ { "amount": 15000, "description": "Mensalidade", "quantity": 1 } ], "customer": { "name": "Aluno Exemplo", "email": "aluno@exemplo.com", "document": "98765432100", "type": "individual", "address": { "street": "Rua Exemplo", "number": "100", "zipCode": "01001000", "neighborhood": "Centro", "city": "São Paulo", "state": "SP", "country": "BR" } }, "pix": { "expiresIn": 3600 }, "idempotencyKey": "order-pix-pay_001" }

Pagar.me — tokenização (card_token)

{ "publicKey": "pk_xxxxxxxxxx", "card": { "number": "4111111111111111", "holderName": "ALUNO EXEMPLO", "expMonth": 12, "expYear": 2030, "cvv": "123", "brand": "visa", "label": "Blah" }, "idempotencyKey": "token-stu_123" }

Pagar.me — Cartão + split 100%

{ "recipientId": "rp_xxxxxxxxxx", "items": [ { "amount": 15000, "description": "Mensalidade", "quantity": 1 } ], "customer": { "name": "Aluno Exemplo", "email": "aluno@exemplo.com", "document": "98765432100", "type": "individual", "address": { "street": "Rua Exemplo", "number": "100", "zipCode": "01001000", "neighborhood": "Centro", "city": "São Paulo", "state": "SP", "country": "BR" } }, "creditCard": { "capture": true, "installments": 1, "statementDescriptor": "Blah", "cardToken": "card_tok_xxx" }, "idempotencyKey": "order-cc-pay_002" }

Woovi/OpenPix — criar charge Pix

{ "correlationID": "pay_123", "value": 15000, "comment": "Mensalidade", "customer": { "name": "Aluno Exemplo", "email": "aluno@exemplo.com", "phone": "+5511999999999", "taxID": "471.737.080-52" } }

Woovi/OpenPix — refund

{ "transactionEndToEndId": "E1234567...", "correlationID": "refund_pay_123", "value": 15000, "comment": "Estorno" }

Woovi/OpenPix — validar webhook (HMAC)

{ "secret": "hmac-secret-key", "signature": "jgR2XF0PKDiAwHP1s+TryvxMySQ=", "body": "{\"event\":\"OPENPIX:CHARGE_COMPLETED\"}" }

Referências (Context7)

  • OpenPix/Woovi — charges/refunds/webhook HMAC: developers_openpix_br (docs em api.md e docs/webhook/seguranca/webhook-hmac.md)

  • Pagar.me — SDK Node: pagarme/pagarme-nodejs-sdk

  • MCP TypeScript SDK: modelcontextprotocol/typescript-sdk

Autor

Luiz Pillon.

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lpillonwp/mcp-payments'

If you have feedback or need assistance with the MCP directory API, please join our Discord server