garu-mcp
OfficialSummary: Garu MCP server exposes the Garu Brazilian payment platform to MCP clients — create and manage charges, customers, products, offers, scheduled charges, and webhook deliveries.
Charges — create PIX (QR code) and Boleto charges, list/filter, get by UUID, refund (full or partial, in reais), cancel unpaid charges.
Products — list, get, create, and update products (value in reais, min R$ 5,00 or 0); get/set/clear per-product portal config (B2B2C branding, policies, messages) that inherits from seller-level config.
Offers — list, get, create, update (reprice/rename/deactivate), and delete named prices on a product, reachable at
/pay/{uuid}?offer=...(per README).Customers — create, list (with search and
overduefilter), get, update, delete, and set/clear a sticky per-seller billing-email override.Scheduled charges — create one-time or recurring (card tokenization or Pix Automático), list, get with event timeline + transactions, mark paid, force-bill now (idempotent), postpone, pause/resume, cancel recurrence, soft-cancel at period end, swap/clear saved card, and audit per-attempt billing logs with failure codes.
Webhooks — list and inspect delivery events (by status, event type, endpoint), retry in place, or resend as an audit-preserving clone.
Integration setup — return the steps and dashboard URLs for creating an API key and registering a webhook endpoint.
Requires a GARU_API_KEY.
Allows creation of instant PIX charges with auto-generated QR codes for Brazilian real-time payments via the Garu payment platform.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@garu-mcp Create a PIX charge of R$150"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@garuhq/mcp
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-mcpCursor
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-mcpTools
Products (7 tools)
Tool | Description |
| List your seller's products with pagination and search. Each product carries the |
| Get a single product by UUID — the identifier accepted by the charge tools. |
| Create a product. The API requires |
| Partial update. Omit |
| Read per-product portal customization (B2B2C). Returns |
| Upsert with merge: only fields provided are written. Pass |
| Remove the per-product config; product falls back to seller-level config |
Portal-config tools accept
productIdas either the product UUID (preferred — same id returned bylist_products) or the legacy numeric id. UUID support added in Garu v0.10.0.Use
list_productsto discover the UUID you'll pass tocreate_pix_chargeorcreate_boleto_charge.Minimum price R$ 5,00. A product's
valuemust be0or at least R$ 5,00; from R$ 0,01 to R$ 4,99 the API answers 400.0is a product with no price: it is accepted, but it cannot be sold through its payment link. On a subscription product the product's ownvalueis not checked. Onupdate_productthe rule applies only when you sendvalue, 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-areaportal — 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 a product's offers. Active only by default; |
| Read one offer's current price and whether it is still active |
| Create an offer. |
| Reprice, rename, or activate/deactivate. Deactivating is how you END a promo |
| 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, omitslug— 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_chargeandcreate_boleto_chargeaccept anoffertoo — the server resolves the price from it, so the amount is never taken from the agent.
Charges (5 tools)
Tool | Description |
| Create a PIX charge with QR code |
| Create a boleto bancário charge |
| List charges with pagination and filters |
| Get charge details by uuid (includes |
| Refund a charge (full or partial, amount in reais) |
| Cancel an unpaid charge by uuid |
Customers (6 tools)
Tool | Description |
| Create a customer linked to your seller account |
| List customers with search and pagination |
| Get customer details by uuid |
| Update customer information |
| Remove customer from your seller account |
| 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 |
| Schedule a future charge. |
| Paginated list with filters by status, type, due-date range, customer |
| Detail bundle: charge + event timeline + linked transactions |
| Mark a cycle paid (off-Garu reconciliation) |
| Force-bill the current cycle now instead of waiting for the due date (same dispatch as the daily cron). Idempotent — reports |
| Move next due date forward |
| Suspend / re-enable a series |
| Hard-stop future cycles (recurring only) |
| Stripe-style soft-cancel; reversible |
| Swap the saved card. It must already bill one of your charges for that customer, else 404 |
| Remove saved card; future cycles email-with-link |
| Per-attempt billing log (v0.8.2). Each row carries the canonical |
create_scheduled_chargetakesamountin 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 guidegaru://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
Clone and build:
git clone https://github.com/Garu-Pagamentos/garu-mcp.git
npm install
npm run buildTo use the local build, replace the
npxcommand 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.jsCursor / 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"
}
}
}
}Run tests:
npm testLicense
MIT
Available Tools
37 toolscancel_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
Scored across 37 tools
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.
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.
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.
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
Related MCP Connectors
MCP server for Modern Treasury — payment orders, transactions, counterparties and ledgers.
MCP server integrating with Stripe - tools for customers, products, payments, and more.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for PayMongo payment gateway (Philippines). Supports payment intents, sources, payments, refunds, and checkout sessions via Basic Auth.2416 npm2MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for bePaid payment gateway enabling payment operations including create, capture, void, refund, card tokenization, and subscriptions through natural language prompts.17 npmMIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for the Chargily Pay V2 API, enabling payment management including customers, products, prices, checkouts, and payment links.MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for Stone's payment gateway, enabling AI agents to manage orders, charges, customers, subscriptions, and more via the Pagar.me API.MIT