Skip to main content
Glama
garu-mcp

garu-mcp

Official

@garuhq/mcp

npm version License: MIT

An MCP server for the Garu payment platform. Create charges, manage customers, and discover products — directly from any MCP client like Claude Desktop, Cursor, or Claude Code.

Features

  • PIX Charges — Create instant PIX charges with auto-generated QR codes for Brazilian real-time payments.

  • Boleto Charges — Generate boleto bancário payment slips.

  • Charge Management — List, retrieve, and refund charges (full or partial).

  • Products — List your seller's products and look them up by UUID — the same UUID accepted by the charge tools.

  • Customers — Create, list, get, update, and remove customers linked to your seller account.

Related MCP server: bepaid-mcp

Setup

Create a Garu account and get your API key at garu.com.br.

Usage

Claude Code

claude mcp add garu -e GARU_API_KEY=sk_live_xxx -- npx -y --package=@garuhq/mcp@latest garu-mcp

Cursor

Open the command palette and choose "Cursor Settings" > "MCP" > "Add new global MCP server".

{
  "mcpServers": {
    "garu": {
      "command": "npx",
      "args": ["-y", "--package=@garuhq/mcp@latest", "garu-mcp"],
      "env": {
        "GARU_API_KEY": "sk_live_xxx"
      }
    }
  }
}

Windsurf

Add to .windsurf/mcp.json:

{
  "mcpServers": {
    "garu": {
      "command": "npx",
      "args": ["-y", "--package=@garuhq/mcp@latest", "garu-mcp"],
      "env": {
        "GARU_API_KEY": "sk_live_xxx"
      }
    }
  }
}

VS Code

Add to .vscode/mcp.json:

{
  "mcpServers": {
    "garu": {
      "command": "npx",
      "args": ["-y", "--package=@garuhq/mcp@latest", "garu-mcp"],
      "env": {
        "GARU_API_KEY": "sk_live_xxx"
      }
    }
  }
}

Claude Desktop

Open Claude Desktop settings > "Developer" tab > "Edit Config".

{
  "mcpServers": {
    "garu": {
      "command": "npx",
      "args": ["-y", "--package=@garuhq/mcp@latest", "garu-mcp"],
      "env": {
        "GARU_API_KEY": "sk_live_xxx"
      }
    }
  }
}

Codex

codex mcp add garu --env GARU_API_KEY=sk_live_xxx -- npx -y --package=@garuhq/mcp@latest garu-mcp

Tools

Products (7 tools)

Tool

Description

list_products

List your seller's products with pagination and search. Each product carries the pixAutomatic flag

get_product

Get a single product by UUID — the identifier accepted by the charge tools. pixAutomatic enables Pix Automático on the public subscription checkout

create_product

Create a product. The API requires name, image and value. value is in reais: 0 (no price) or at least R$ 5,00

update_product

Partial update. Omit value to keep the current price; a value you send must be 0 or at least R$ 5,00

get_product_portal_config

Read per-product portal customization (B2B2C). Returns null if unset — product falls back to seller-level config

set_product_portal_config

Upsert with merge: only fields provided are written. Pass null on a field to inherit from seller

clear_product_portal_config

Remove the per-product config; product falls back to seller-level config

Portal-config tools accept productId as either the product UUID (preferred — same id returned by list_products) or the legacy numeric id. UUID support added in Garu v0.10.0.

Use list_products to discover the UUID you'll pass to create_pix_charge or create_boleto_charge.

Minimum price R$ 5,00. A product's value must be 0 or at least R$ 5,00; from R$ 0,01 to R$ 4,99 the API answers 400. 0 is a product with no price: it is accepted, but it cannot be sold through its payment link. On a subscription product the product's own value is not checked. On update_product the rule applies only when you send value, so a product priced below R$ 5,00 before the minimum existed keeps selling.

Per-product portal config is the B2B2C primitive: SaaS that models professionals/coaches/instructors as Products under one Seller can give each one custom branding (businessName, primaryColor, logoUrl) and policies on the customer payment page + /minha-area portal — all without fragmenting the seller's accounting.

Offers (5 tools)

An offer is a named price on a product, reachable at /pay/{productUuid}?offer={slug or id}. It overrides the price and nothing else — payment methods, installments, carnê, name, description and image all stay on the product, and a bare product link keeps charging the product's own price.

Tool

Description

list_offers

List a product's offers. Active only by default; active: 'all' includes deactivated ones

get_offer

Read one offer's current price and whether it is still active

create_offer

Create an offer. value is in reais, at least R$ 5,00, and may exceed the product's price

update_offer

Reprice, rename, or activate/deactivate. Deactivating is how you END a promo

delete_offer

Delete — only while the offer has never sold, otherwise 409

The slug is public and guessable. Anyone holding the product link can try ?offer=promo. For pricing that should not circulate, omit slug — the link then carries the unguessable offer id.

To end a promo, deactivate rather than delete. A deactivated link falls back to the product's price and tells the buyer the offer ended, so the sale still completes. Deleting is refused once the offer has sales, so past attribution survives.

create_pix_charge and create_boleto_charge accept an offer too — the server resolves the price from it, so the amount is never taken from the agent.

Charges (5 tools)

Tool

Description

create_pix_charge

Create a PIX charge with QR code

create_boleto_charge

Create a boleto bancário charge

list_charges

List charges with pagination and filters

get_charge

Get charge details by uuid (includes status)

refund_charge

Refund a charge (full or partial, amount in reais)

cancel_charge

Cancel an unpaid charge by uuid

Customers (6 tools)

Tool

Description

create_customer

Create a customer linked to your seller account

list_customers

List customers with search and pagination

get_customer

Get customer details by uuid

update_customer

Update customer information

delete_customer

Remove customer from your seller account

set_customer_billing_email_override

Override the billing-email used for that customer

Scheduled charges (13 tools)

Bill an existing customer on a future date — one-time or recurring with card tokenization or Pix Automático (BACEN auto-debit recurring Pix; recurring + productId only).

Tool

Description

create_scheduled_charge

Schedule a future charge. type='recurring' enables silent-charge of saved card on cycle 2+. methods accepts pix_automatic (Pix Automático — recurring + productId only). Optional maxRecoveryDays (1–365) caps how long past dueDate the recovery sweep keeps auto-billing a missed charge (default 14)

list_scheduled_charges

Paginated list with filters by status, type, due-date range, customer

get_scheduled_charge

Detail bundle: charge + event timeline + linked transactions

mark_paid_scheduled_charge

Mark a cycle paid (off-Garu reconciliation)

charge_now_scheduled_charge

Force-bill the current cycle now instead of waiting for the due date (same dispatch as the daily cron). Idempotent — reports already_sent rather than re-charging

postpone_scheduled_charge

Move next due date forward

pause_scheduled_charge / resume_scheduled_charge

Suspend / re-enable a series

cancel_recurrence_scheduled_charge

Hard-stop future cycles (recurring only)

cancel_at_period_end_scheduled_charge

Stripe-style soft-cancel; reversible

change_scheduled_charge_payment_method

Swap the saved card. It must already bill one of your charges for that customer, else 404

clear_scheduled_charge_payment_method

Remove saved card; future cycles email-with-link

list_scheduled_charge_attempts

Per-attempt billing log (v0.8.2). Each row carries the canonical failureCode for declines — use this to debug recurring billing failures without joining Transactions

create_scheduled_charge takes amount in reais, at least R$ 5,00 (the platform minimum per charge), one-time and recurring alike; a lower amount answers 400. Charges created before the minimum existed keep their amount and keep billing.

Resources

  • garu://docs/quickstart — Getting started guide

  • garu://docs/openapi — Link to the OpenAPI spec

Environment Variables

  • GARU_API_KEY — Your Garu API key (required). Get yours at garu.com.br.

Local Development

  1. Clone and build:

git clone https://github.com/Garu-Pagamentos/garu-mcp.git
npm install
npm run build
  1. To use the local build, replace the npx command with the path to your local build:

Claude Code:

claude mcp add garu -e GARU_API_KEY=sk_live_xxx -- node /absolute/path/to/garu-mcp/dist/index.js

Cursor / VS Code / Windsurf / Claude Desktop:

{
  "mcpServers": {
    "garu": {
      "command": "node",
      "args": ["/absolute/path/to/garu-mcp/dist/index.js"],
      "env": {
        "GARU_API_KEY": "sk_live_xxx"
      }
    }
  }
}
  1. Run tests:

npm test

License

MIT

Available Tools

37 tools
cancel_chargeB

Cancel an unpaid charge by its uuid.

Inputs: uuid (required).

cancel_recurrence_scheduled_chargeA

Stop future cycles for a recurring scheduled charge. The currently in-flight cycle (if any) remains active until paid, postponed, or marked-paid; only after that resolves does the series flip to recurrence_canceled. Final — use a new series to restart. Recurring-only.

Inputs: id (required), reason.

change_scheduled_charge_payment_methodA

Swap the saved card on a recurring series. The new PaymentMethod must belong to the same customerId. Future cycles silent-charge the new card; the in-flight cycle is not retroactively rebound.

Inputs: id (required), paymentMethodId (required).

charge_now_scheduled_chargeA

Force-bill the current cycle right now instead of waiting for its due date. Runs the same dispatch the daily billing cron would: customer email/notification + outbound webhook + timeline event. Allowed only from a billable status (scheduled / due_today); a recurring series must also have an open cycle (otherwise the gateway returns 400). IDEMPOTENT — NOT a re-charge: if this cycle's d-day was already dispatched it reports outcome 'already_sent' and does nothing, so retries are safe and never double-bill. Read the returned outcome ('dispatched' | 'already_sent' | 'not_sent' | 'failed'), the optional reason (e.g. no_email, no_saved_payment_method, card_expired, or a gateway decline code), and the pt-BR message to decide what to tell the user.

Inputs: id (required).

clear_product_portal_configA

Remove the per-product portal customization. The product falls back to the seller-level portal config. Returns { removed: true } when a row was deleted, { removed: false } when there was nothing to remove.

Inputs: productId (required).

clear_scheduled_charge_payment_methodA

Clear the saved card on a recurring series. Future cycles fall back to the email-with-link flow so the customer can re-enter card details or pay via PIX/Boleto.

Inputs: id (required).

create_boleto_chargeB

Create a boleto bancario charge. Returns a bank slip line for payment.

Inputs: customer (required), productId (required), additionalInfo.

create_customerC

Create a customer and link to the current seller.

Inputs: name (required), email (required), phone (required), document (required), +8 more.

create_pix_chargeA

Create a PIX charge. Returns a QR code for the customer to pay.

Inputs: customer (required), productId (required), additionalInfo.

create_productA

Create a product for the authenticated seller. Returns the created product, whose UUID is the same identifier accepted by create_pix_charge / create_boleto_charge. value is in decimal BRL / reais (e.g. 29.90), NOT centavos. Setting pixAutomatic: true exposes Pix Automático (BACEN auto-debit recurring Pix) on the subscription checkout. Pass idempotencyKey to make a retry across process restarts safe — the backend returns the original product instead of creating a duplicate.

Inputs: name (required), pix, tags, image, +12 more.

create_scheduled_chargeA

Schedule a future charge for an existing customer. Use list_customers first to find the customerId. type='one_time' is the simple case (PIX/Boleto). type='recurring' takes a recurrence config and silent-charges the saved card on every cycle past the first. Card method is recurring-only and requires productId. Pix Automático (methods: ['pix_automatic']) is BACEN auto-debit recurring Pix — the customer authorizes once and later cycles debit silently; it is recurring-only and requires productId. Optional trialDays (1..365, recurring-only) rebases cycle 1 to today + N days and emits customer.trial_started immediately.

Inputs: type (required), amount (required), dueDate (required), methods (required), +8 more.

delete_customerA

Remove a customer from the current seller. Does not delete the customer globally.

Inputs: id (required).

get_chargeA

Get details of a specific charge by its uuid.

Inputs: uuid (required).

get_customerA

Get details of a specific customer by numeric ID.

Inputs: id (required).

get_integration_setupA

Return the steps and dashboard URLs an agent needs to integrate an application with Garu: where to create an API key, where to register a webhook endpoint, and how to verify webhook signatures with the SDK. Garu does not expose programmatic endpoints for these — both have to be done in the dashboard at https://garu.com.br/configuracoes/desenvolvedores. Call this whenever the user asks how to wire up Garu in their app, set up the API key, or receive webhooks.

Inputs: no named parameters.

get_productA

Get details of a specific product by UUID. Use this to inspect a product before creating a charge. The pixAutomatic boolean indicates whether Pix Automático (BACEN auto-debit recurring Pix) is enabled on the public subscription checkout for this product.

Inputs: uuid (required).

get_product_portal_configA

Get the per-product portal customization (business name, logo, primary color, cancellation policy, custom welcome / success / cancellation messages). Returns null when no per-product config exists — the product falls back to the seller-level portal config. Used by B2B2C platforms that model their professionals/coaches as Products under a single seller.

Inputs: productId (required).

get_scheduled_chargeA

Get a scheduled charge by ID, bundled with its event timeline and any linked Garu transactions. The response shape is { charge, events, transactions }. Unit caveat: charge.amount is decimal BRL (e.g. 297.50) but transactions[].value is centavos (BRL × 100, e.g. 29750). Convert before comparing.

Inputs: id (required).

get_webhook_eventA

Fetch one webhook event by numeric id. Returns the full payload, the embedded endpoint snapshot, the most recent response status/body, and the retry schedule. Use this to drill into why a delivery is failing.

Inputs: id (required).

list_chargesA

List charges for the authenticated seller with pagination and filters.

Inputs: page, limit, search, status, +2 more.

list_customersA

List customers for the authenticated seller with pagination, search, and an optional 'overdue' filter that surfaces customers with at least one overdue scheduled charge.

Inputs: page, limit, search, status.

list_productsA

List products for the authenticated seller with pagination and search. The UUID returned for each product is the same identifier accepted by create_pix_charge and create_boleto_charge. Each product also carries a pixAutomatic boolean — when true, Pix Automático (BACEN auto-debit recurring Pix) is offered on the public subscription checkout.

Inputs: tab, page, limit, search.

list_scheduled_charge_attemptsA

Per-attempt billing log for a scheduled charge series (SPEC §4.2). One row per logical billing event: cycle 1 interactive charge, every silent-charge attempt, every retry cron retry, every manual mark-paid. Each row carries the canonical Garu failureCode for declines, the gateway raw code for forensics, and a snapshot of the card last4 / brand even after the PaymentMethod is deleted (LGPD survival). Use this to audit why a recurring series fell behind.

Inputs: id (required), page, limit, cycleNumber.

list_scheduled_chargesA

List scheduled charges for the authenticated seller, with pagination and filters. Pass status as a single value or an array. Use search to match against the linked customer's name, email, or document.

Inputs: page, type, dueTo, limit, +4 more.

list_webhook_eventsA

List webhook events for the authenticated seller. Filter by delivery status (pending, success, failed), by Garu event type (e.g. 'transaction.payment.paid'), and/or by the destination endpoint id. Use this to audit deliveries — the canonical 'did my customer's endpoint actually receive event X?' workflow. Newest first.

Inputs: page, limit, status, event_type, +1 more.

mark_paid_scheduled_chargeA

Manually mark a scheduled charge as paid (e.g. customer paid via bank transfer outside Garu). For one-time: omit cycleNumber, allowed from due_today / overdue. For recurring: pass cycleNumber, allowed from cycle status due_today / overdue / failed; future cycles continue.

Inputs: id (required), paymentDate (required), cycleNumber, externalReference.

pause_scheduled_chargeA

Pause a scheduled charge. No reminders fire while paused. Allowed from scheduled / due_today / overdue. Use resume_scheduled_charge to bring it back.

Inputs: id (required), reason.

postpone_scheduled_chargeA

Postpone a scheduled charge to a new due date. Allowed from scheduled / due_today / overdue / paused. Clears any pending dunning so the customer gets a fresh reminder on the new date.

Inputs: id (required), newDueDate (required), reason.

refund_chargeA

Refund a charge fully or partially. Amount is in BRL / reais (e.g. 10.50 for R$10,50). For a Pix Automatico charge the refund is asynchronous: the charge returns as refund_pending and only reaches refunded once the transfer settles.

Inputs: uuid (required), amount, reason.

resend_webhook_eventA

Re-deliver a webhook event by id, audit-trail preserving. Inserts a fresh event (new numeric id) that points back at the source via manualResendOf, then dispatches that clone — the original row is left untouched, so its prior response status/body stays on the record. Works on any status (success, failed, pending). Returns the clone event; the returned id is the new event's id, NOT the source. The customer's webhook handler will see Idempotency-Key: resend_ on the delivery, and can distinguish a resend from the original by that prefix or by the payload's manualResendOf field. Prefer this over retry_webhook_event when a customer reports a missed or unprocessed event, or during a backfill — you want the original delivery outcome to remain on the record.

Inputs: id (required).

resume_scheduled_chargeA

Resume a paused scheduled charge. Only valid from paused.

Inputs: id (required).

retry_webhook_eventA

Re-deliver a webhook event by id. Resets it to 'pending' in place, clears the retry schedule, and triggers an immediate delivery attempt. Works on any status (success, failed, pending). For most cases prefer resend_webhook_event, which preserves the original event's audit trail by cloning instead of mutating — retry overwrites the historical response status/body on the source row. Kept for callers that explicitly want the legacy in-place semantics.

Inputs: id (required).

set_cancel_at_period_end_scheduled_chargeA

Toggle Stripe-style soft cancel on a recurring series. With enabled=true, the cycle generator stops emitting new cycles after the next paid cycle (the in-flight cycle still bills + can be paid). Reversible by passing enabled=false. Mutually exclusive with recurrence.endsAfter and recurrence.endsOn.

Inputs: id (required), enabled (required).

set_customer_billing_email_overrideA

Set or clear the per-seller billing email override for a customer. The override is sticky: it takes precedence over the per-seller last-used email and the global customer.email for outbound seller-to-customer emails, and is never auto-overwritten by subsequent payments. Pass null to clear and fall back to the last-used email. Use this when the customer asks for a specific billing address (e.g. financeiro@empresa.com.br) different from the email they used at checkout.

Inputs: id (required), billingEmailOverride (required).

set_product_portal_configB

Create or merge the per-product portal customization. Both this tool and PATCH have the same merge semantics: only fields you provide are written; unspecified fields keep their persisted value. Use clear_product_portal_config (DELETE) to reset everything. Each Boolean / string field can be passed as null to inherit from the seller-level config.

Inputs: productId (required), logoUrl, businessName, primaryColor, +12 more.

update_customerC

Update a customer's information for the current seller.

Inputs: id (required), city, name, email, +9 more.

update_productA

Update an existing product (partial PATCH — only the fields you provide are written; everything else keeps its persisted value). value is in decimal BRL / reais (e.g. 29.90), NOT centavos. Setting pixAutomatic: true exposes Pix Automático (BACEN auto-debit recurring Pix) on the subscription checkout. At least one write field is required.

Inputs: productId (required), pix, name, tags, +12 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 37 tools

    Disambiguation5/5

    Each tool targets a distinct resource and action with clear, detailed descriptions. Tools like pause_scheduled_charge and resume_scheduled_charge are complementary, not overlapping. Even similar operations like retry_webhook_event and resend_webhook_event are carefully differentiated by audit trail semantics.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern in snake_case. Verbs are imperative, nouns are plural for lists and singular for single operations. Even longer names like set_cancel_at_period_end_scheduled_charge adhere to the pattern without deviation.

    Tool Count4/5

    37 tools is on the higher end but reasonable for a comprehensive payment platform covering customers, charges, scheduled charges, products, webhooks, and setup. Each tool serves a specific purpose, though the scheduled charge cluster (13 tools) could potentially be consolidated slightly.

    Completeness4/5

    The tool surface is extensive, covering CRUD for customers and charges, lifecycle management for scheduled charges, and webhook handling. A notable gap is the lack of a delete_product tool, as products can only be updated or have their portal config cleared.

    Maintenance

    ActivitySlowing
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      MCP server for PayMongo payment gateway (Philippines). Supports payment intents, sources, payments, refunds, and checkout sessions via Basic Auth.
      24
      16 npm
      2
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server for bePaid payment gateway enabling payment operations including create, capture, void, refund, card tokenization, and subscriptions through natural language prompts.
      17 npm
      MIT