Gives Claude a universal payment interface that routes through any rail without teaching it provider-specific APIs. You get seven tools: pay, charge, status, refund, balance, providers, and limits. Ships with Woovi/Pix support (live-tested with real Brazilian transactions), plus built-in guardrails for daily spend caps, per-transaction limits, and human-in-the-loop confirmation above thresholds. Every action logs to JSONL for audit. Useful when you want agents to handle real money movement across Stripe, Wise, Mercado Pago, or other providers through a single MCP interface. Named after Franklin's Junto club, the idea being different payment rails at the same table.
The payment protocol for people and agents.
Send and receive money through any AI assistant. Any payment rail. Built-in guardrails.
Named after Benjamin Franklin's Junto — a society of tradesmen who built civic infrastructure together. Different providers, same table, mutual benefit.
AI assistants are starting to move real money — paying invoices, splitting bills, sending transfers. But every payment provider has a different API, different auth, different settlement times. Nobody should have to teach their assistant how Pix works vs Stripe vs Wise.
Junto fixes that with one MCP server that:
| Tool | Description |
|---|---|
pay | Send money to a destination (Pix key, email, IBAN, etc.) |
charge | Create a payment request / invoice / QR code |
status | Check payment status by correlation ID |
refund | Reverse a completed transaction |
balance | Check available funds on a provider |
providers | List configured providers and their capabilities |
limits | Show spending limits and today's usage |
npm install -g junto-mcp
Set your provider API key:
export WOOVI_APP_ID="your-woovi-app-id"
Run as CLI (human mode):
junto pay 25.00 maria@email.com
junto charge 10.00 "Coffee"
junto balance
Run as MCP server (for AI clients):
junto --mcp
Junto auto-detects your system language, or set manually:
JUNTO_LANG=pt-BR junto ajuda
junto pagar 25.00 maria@email.com
junto cobrar 10.00 "Cafe"
junto saldo
See CLI.md for the full command reference in both languages.
{
"mcpServers": {
"junto": {
"command": "npx",
"args": ["-y", "junto-mcp"],
"env": {
"WOOVI_APP_ID": "your-woovi-app-id"
}
}
}
}
That's it. Your AI assistant now has payment tools.
All amounts are in cents (smallest currency unit).
| Setting | Env Var | Default | Meaning |
|---|---|---|---|
| Daily limit | JUNTO_DAILY_LIMIT | 50000 (R$500) | Max total spend per day |
| Per-tx max | JUNTO_PER_TX_MAX | 20000 (R$200) | Max single transaction |
| Confirm above | JUNTO_CONFIRM_ABOVE | 5000 (R$50) | Ask human before sending |
| Allowed providers | JUNTO_ALLOWED_PROVIDERS | (all) | Comma-separated allowlist |
| Allowed destinations | JUNTO_ALLOWED_DESTINATIONS | (all) | Comma-separated type allowlist |
When an agent tries to send above the JUNTO_CONFIRM_ABOVE threshold, the server pauses and returns a confirmation prompt. The agent must relay this to the user and get approval before proceeding.
⚠️ Confirmation required
Amount: BRL 150.00
To: maria@email.com
Reason: Amount (15000 cents) exceeds confirmation threshold (5000 cents)
Please confirm with the user before proceeding.
┌─────────────────────────────────────┐
│ MCP Client (Claude, Cursor, etc.) │
└──────────────┬──────────────────────┘
│ MCP Protocol (stdio)
┌──────────────▼──────────────────────┐
│ junto-mcp │
│ │
│ ┌───────────┐ ┌────────────────┐ │
│ │ Router │ │ Guardrails │ │
│ │ (picks │ │ (spend caps, │ │
│ │ provider) │ │ HITL confirm, │ │
│ │ │ │ audit log) │ │
│ └─────┬─────┘ └────────────────┘ │
│ │ │
│ ┌─────▼─────────────────────────┐ │
│ │ Provider Adapters │ │
│ │ ┌────────┐ ┌──────┐ ┌────┐ │ │
│ │ │ Woovi │ │Stripe│ │Wise│ │ │
│ │ └────────┘ └──────┘ └────┘ │ │
│ └───────────────────────────────┘ │
│ │
│ ┌───────────────────────────────┐ │
│ │ Audit Ledger (JSONL) │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
| Provider | Region | Rails | Status |
|---|---|---|---|
| Woovi/OpenPix | Brazil | Pix | 🟢 Live (tested with real Pix transactions) |
| Ebanx | Brazil + LATAM | Pix payouts, Boleto, Cards | 🟡 Next |
| Belvo | Brazil | Open Finance (all banks) | 🟡 Next |
| Stripe | Global | Cards, ACH, SEPA | 🟡 Next |
| Wise | Global | Bank transfers | 🔴 Planned |
| Mercado Pago | LATAM | Pix, Cards | 🔴 Planned |
| PayPal | Global | Email-based | 🔴 Planned |
You: "Pay R$25 to maria@email.com via Pix"
Agent: I'll send the following payment:
Amount: R$ 25,00
To: maria@email.com (Pix)
Via: Woovi
Shall I go ahead?
You: "Yes"
Agent: Done! Payment sent.
Amount: R$ 25,00
To: maria@email.com
Via: Pix (Woovi)
Status: Completed
ID: junto-1739612345-a1b2c3
Each provider is a single file implementing the PaymentProvider interface:
// src/providers/your-provider.ts
import { PaymentProvider } from "../types.js";
export class YourProvider implements PaymentProvider {
name = "your-provider";
supportedCurrencies = ["USD"];
supportedRails = ["card"];
settlementTime = "1-3 days";
async pay(req) { /* send money */ }
async charge(req) { /* create invoice */ }
async status(id) { /* check status */ }
async refund(id) { /* reverse payment */ }
async balance() { /* check funds */ }
info() { /* return capabilities */ }
}
Copy src/providers/_template.ts to get started, then register your provider in src/index.ts.
npm test # Guardrail unit tests
npm run test:smoke # Full flow smoke tests (mock provider)
# Create a Pix charge (R$1.00)
WOOVI_APP_ID=your-key npx tsx test/live-pix.ts charge 100 "Test charge"
# Check status
WOOVI_APP_ID=your-key npx tsx test/live-pix.ts status <correlation-id>
# Send a Pix payment
WOOVI_APP_ID=your-key npx tsx test/live-pix.ts pay 100 user@email.com EMAIL
# Refund
WOOVI_APP_ID=your-key npx tsx test/live-pix.ts refund <correlation-id>
npx tsx demo/demo.ts # Full demo with typewriter narration + real API calls
npx tsx demo/demo.ts --fast # Fast mode for rehearsals
Every transaction is logged to ~/.junto/audit-YYYY-MM-DD.jsonl:
{
"timestamp": "2026-02-15T14:32:07Z",
"type": "payment",
"action": "pay",
"tool": "pay",
"amount": 2500,
"currency": "BRL",
"provider": "woovi",
"destination": "maria@email.com",
"status": "executed"
}
npx tsx demo/demo.ts)We need help with:
MIT
WOOVI_APP_IDsecretWoovi/OpenPix API key for Pix payments (Brazil)
JUNTO_DAILY_LIMITDaily spending limit in cents (default: 50000)
JUNTO_TX_MAXMax per-transaction amount in cents (default: 10000)
JUNTO_CONFIRM_ABOVERequire human confirmation above this amount in cents (default: 5000)
io.github.shelvick/shopify-subscription-reconciliation
zleventer/google-ads-mcp
csoai-org/meok-stripe-acp-checkout-mcp
io.github.mharnett/google-ads
csoai-org/stripe-billing-mcp
co.pipeboard/google-ads-mcp