loading…
Search for a command to run...
loading…
Create Pix charges (Woovi/OpenPix) · List payments & check status · Refund transactions · Multi-provider routing · Daily/per-tx spending limits · Human-in-the-l
Create Pix charges (Woovi/OpenPix) · List payments & check status · Refund transactions · Multi-provider routing · Daily/per-tx spending limits · Human-in-the-loop confirmation · JSONL audit trail
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 [email protected]
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 [email protected]
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: [email protected]
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 [email protected] via Pix"
Agent: I'll send the following payment:
Amount: R$ 25,00
To: [email protected] (Pix)
Via: Woovi
Shall I go ahead?
You: "Yes"
Agent: Done! Payment sent.
Amount: R$ 25,00
To: [email protected]
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 [email protected] 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": "[email protected]",
"status": "executed"
}
npx tsx demo/demo.ts)We need help with:
MIT
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"junto-mcp": {
"command": "npx",
"args": []
}
}
}