---
name: relay
description: |
  Issue and top up crypto-funded, reloadable virtual debit cards
  (Visa/Mastercard) from an AI agent, via Relay's MCP server. Use when an
  agent wants to issue a USDC-funded virtual card, top one up, freeze/
  unfreeze it, or check card balances. Cards are reloadable and KYC'd.
---

# Relay

Relay issues crypto-funded, **reloadable** virtual Visa/Mastercard debit
cards. Cards are funded with USDC, carry real KYC, and are owned by a
relay.credit account the user controls. You drive everything through Relay's
**MCP server** — there is no CLI to install.

> **This is NOT the EconomyOS / Alchemy native card.** Those are single-use,
> Stripe(fiat)-funded, and expire ~30 min after issuance. Relay cards are
> reloadable, USDC-funded, KYC'd, and managed from a relay.credit dashboard.

## Step 1 — connect the MCP server

Add Relay's MCP server, then sign in when prompted:

```
claude mcp add relay https://mcp.relay.credit
```

On first use the server returns a sign-in URL (MCP OAuth / device-code flow).
Open it **in a browser**, sign up or sign in (email or wallet), and approve
the connection. After that the MCP tools are authenticated as your account.

## Step 2 — KYC (required before issuing a card)

Card issuance requires KYC. Check your status with the MCP account/KYC tool;
if it isn't `APPROVED`, open https://relay.credit **in a browser** to complete it
(document capture is a browser flow — an agent can't upload KYC photos).
Re-check until `APPROVED`.

## Step 3 — fund, then issue or top up

Relay gives each account a **funding wallet** (an MCP tool returns its
address). Send USDC to it; the deposit loads your card automatically. Use the
MCP tools to:

- **List products** and **issue** a card (issuance itself is free).
- **Top up** an existing card by depositing more USDC to the funding wallet.
- **Freeze / unfreeze** a card, and **check balances** / transactions.

### Money model
```
Issuance:  free (no card fee)
Top-up:    deposit D  ->  card loaded D - 4%   (4% top-up fee)
```
Minimums are Relay's own and configurable; deposit too little and you get a
precise "send at least $X" error.

> **Partner-onboarded agents:** if your platform onboarded you through Relay's
> partner channel, your card is already funded from your embedded wallet —
> deposits to that wallet top the card up automatically and spends settle back
> against it. You still manage the card with the MCP tools below.

## Available cards

Pick one by `slug` when issuing. The live, authoritative list is the
`products` resource / `GET /v1/relay/products`.

| slug | card | best for |
|------|------|----------|
| `ads-hk-mc-1` | Ads Card (HK · Mastercard) | Meta / Google / TikTok ad spend |
| `gaming-sg` | Gaming Card (SG · Mastercard) | Steam, PlayStation, Xbox, gaming subscriptions |
| `wallet-verified` | Verified Wallet Card (HK · Mastercard) | Apple Pay / Google Pay, mobile checkout (KYC required) |

## More

- Human dashboard / sign-in / KYC: https://relay.credit

## MCP tools

The tools the MCP server exposes (auto-generated from the live registry):

### Account

- **`get_balance`** — Get the agent's single spendable balance. Returns balance, currency, and source: 'card' when the agent has a card (the balance is the card balance), or 'wallet' when it has no card yet (the balance is the embedded funding wallet's on-chain USDC+USDT). Fund the wallet via get_funding_wallet, then buy a card to make the balance spendable.
- **`get_confirmation_status`** — Poll the status of a confirmation request (e.g. from request_email_link). Status is one of: pending, confirmed, expired.
- **`get_funding_wallet`** — Get the agent's embedded funding wallet — the EVM address it sends USDC/USDT to in order to fund its card. Returns the address, the EVM chains and stablecoins it accepts, and the wallet's current on-chain balance. The agent deposits into this wallet; the deposit is then loaded onto the card (or, before a card exists, held in the wallet and shown as the balance).
- **`get_kyc_status`** — Check the human user's identity-verification (KYC) status. Relay card issuance is gated on KYC approval. Returns status (e.g. not_started, pending, approved, declined) plus the local submission pipeline state. The human completes or updates their KYC on the relay.credit website — this tool is read-only.
- **`get_profile`** — Get the authenticated user's profile including wallets, cards, and total balance.
- **`list_wallets`** — List all wallets connected to the user's account.
- **`request_email_link`** — Start the agent-safe email linking flow. Returns a verification URL the agent MUST present to the human. The email is NOT applied until the human clicks the link on the returned URL. Poll get_confirmation_status with the returned token to check progress.
- **`sync_privy`** — Refresh the user's wallets and email from Privy. The caller must supply a fresh Privy access token from the human user; the server verifies it server-side and reconciles wallet linkage. Idempotent. Returns counts only — the underlying wallet addresses are reachable via list_wallets after sync.

### Cards

- **`freeze_card`** — Freeze a card to temporarily disable all transactions.
- **`get_card_details`** — Get full card details including card number, expiry, CVV, and live balance. Use with care as this returns sensitive data.
- **`get_card_request_status`** — Poll the status of an asynchronous card operation (e.g. a KYC-gated card issuance or a withdrawal) using the request_id or doc_id returned when it was submitted.
- **`get_card_transactions`** — Get the spending transaction history for a specific card.
- **`get_transaction_detail`** — Get the full breakdown of a single card spending transaction (merchant, amounts, fees, status). Use the tx_id from get_card_transactions.
- **`list_cards`** — List all cards belonging to the user with their balances and status.
- **`unfreeze_card`** — Unfreeze a card to re-enable transactions.
- **`withdraw_card`** — Withdraw funds from a card. This is a financial operation gated by the per-app spending policy.

### Notifications

- **`get_unread_count`** — Get the number of unread notifications.
- **`list_notifications`** — List user notifications, optionally filtered by status or type.
- **`mark_all_notifications_read`** — Mark all notifications as read.
- **`mark_notification_read`** — Mark a specific notification as read.

### Payments

- **`create_payment_session`** — Create a new crypto payment session. Returns a one-time deposit address and a MINIMUM deposit (min_amount_usd) — NOT an exact amount. The user sends AT LEAST min_amount_usd in USDC/USDT to the address within 15 minutes; they may send more. Settlement derives the card load from the amount actually received: card_load = (amount_received − card_price) / (1 + fee), where card_price is the product price for a purchase and 0 for a top-up. Provide either card_id (to top up an existing card — get it from list_cards) or product_slug (to purchase a new card — get it from list_products), never both. For a NEW-CARD purchase, ask the user for the deposit chain and token, and optionally how much they want to load onto the card initially (amount_usd) — if they don't care, omit amount_usd and the minimum is quoted. amount_usd is only a SUGGESTED initial balance: the deposit is still a minimum, so the user can send more and any extra (minus the card price and our fee) also lands on the card. For a TOP-UP, amount_usd is the amount the user wants loaded (still a minimum — they can send more). How to present the amount to send: if the user specified an amount (you passed amount_usd, so amount_usd > min_amount_usd), tell them to send amount_usd — the quoted total that loads exactly what they asked for — and do NOT tell them they 'must send more', that amount already covers it. If the user did NOT specify an amount (amount_usd == min_amount_usd), present min_amount_usd as a minimum ('send at least …, don't send less'). Either way never offer a $0 / no-balance option. Surface the full breakdown: card_price (the product price, 0 for top-ups), card_load_amount (what lands on the card), fee_amount (pbank's fee on the LOAD ONLY — it does NOT include the card price), and the total to send (= card_price + card_load_amount + fee_amount; this equals amount_usd, with min_amount_usd as the floor). Supported deposit chains: ethereum, base, polygon, bnb, avalanche, arbitrum, solana, tron. Tokens: usdc, usdt.
- **`get_payment_session`** — Get details of a specific payment session including status, address, and amounts.
- **`list_payment_sessions`** — List the user's payment sessions with their statuses.

### Products

- **`list_products`** — List available card products with their limits and pricing.
- **`merchant_search`** — Search the card-product catalogue by merchant name or keyword and return the matching products with relay pricing. Use this to find a card that works for a specific merchant before calling create_payment_session.

### Tickets

- **`add_ticket_message`** — Add a message to an existing support ticket.
- **`create_ticket`** — Create a support ticket. Categories: billing, technical, account, other.
- **`get_ticket`** — Get a support ticket with its full message history.
- **`list_tickets`** — List the user's support tickets.

### Tokens

- **`get_token_balances`** — Get token balances for a wallet address across supported chains.

### Transactions

- **`list_transactions`** — List all transactions (top-ups, withdrawals, card spending) in reverse chronological order.

