send21
Non-custodial payment drafts/pay links for BTC, USDC, USDT, EURC. Never holds keys.
Should I use this
Quality & Safety
Findings (2)
- HIGH
- MEDIUMin get_draft_status
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"mcp": {
"url": "https://send21.io/mcp"
}
}
}Remote endpoints
https://send21.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (9)
🟢get_transaction_template(draftId)
Get the multi-output transaction template for a draft: Bitcoin Core walletcreatefundedpsbt arguments and Electrum/Sparrow pay-to-many CSV. The operator's wallet funds, reviews, and signs it — send21 contains no signing code. Requires scope drafts:read.
Input Schema
{
"type": "object",
"properties": {
"draftId": {
"description": "Draft id (GUID)",
"type": "string"
}
},
"required": [
"draftId"
]
}🟢get_fee_schedule
Get the public send21 fee schedule: tiered percent by payment size in USD, min/max fee, and dust limit. No authentication needed.
Input Schema
{
"type": "object",
"properties": {}
}🟡create_payment_request(fiatCurrency, fiatAmount, options, orderId, memo, ...)
Create a payment request / checkout pay link (you are the RECEIVER asking to get paid). Price in any of 165 fiat currencies; the payer opens the returned payPath, picks one of the offered currencies (rate locks then), and pays a single QR-scannable transfer straight to your address. Requires scope drafts:write.
Input Schema
{
"type": "object",
"properties": {
"fiatCurrency": {
"description": "Fiat currency the request is priced in, e.g. USD, EUR, SEK",
"type": "string"
},
"fiatAmount": {
"description": "Amount in the fiat currency",
"type": "number"
},
"options": {
"description": "Currencies the payer may choose from, each with your receiving address",
"type": "array",
"items": {
"type": "object",
"properties": {
"currency": {
"description": "Asset: Btc, Usdc, Usdt, or Eurc",
"type": "string"
},
"network": {
"description": "Network the address lives on: Mainnet, Solana, Ethereum, or Base",
"type": "string"
},
"address": {
"description": "The RECEIVER's own address for this currency",
"type": "string"
}
},
"required": [
"currency",
"network",
"address"
]
}
},
"orderId": {
"description": "Your own order/reference id — echoed in webhooks for reconciliation",
"type": [
"string",
"null"
]
},
"memo": {
"description": "Message shown to the payer (max 500 chars)",
"type": [
"string",
"null"
]
},
"expiryHours": {
"description": "Hours until the request expires (default 24)",
"type": [
"integer",
"null"
]
},
"idempotencyKey": {
"description": "Idempotency key — retries with the same key return the original request",
"type": [
"string",
"null"
]
}
},
"required": [
"fiatCurrency",
"fiatAmount",
"options",
"orderId",
"memo",
"expiryHours",
"idempotencyKey"
]
}🟢list_address_book
List the account's saved addresses (label, address, network, direction: Sending = recipients the owner pays, Receiving = the owner's own addresses). Requires scope addressbook:read.
Input Schema
{
"type": "object",
"properties": {}
}🟢get_draft(draftId)
Get a payment draft by id, including amounts, fee, quote, and status. Requires scope drafts:read.
Input Schema
{
"type": "object",
"properties": {
"draftId": {
"description": "Draft id (GUID)",
"type": "string"
}
},
"required": [
"draftId"
]
}🟢get_payment_request(paymentRequestId)
Get a payment request by id: status (Open/Completed/Cancelled/Expired), pay path, offered currencies, and the underlying draft once the payer committed. Requires scope drafts:read.
Input Schema
{
"type": "object",
"properties": {
"paymentRequestId": {
"description": "Payment request id (GUID)",
"type": "string"
}
},
"required": [
"paymentRequestId"
]
}🟢get_rate(fiatCurrency, asset)
Get the current exchange rate for an asset in a fiat currency (rate = fiat units per 1 whole asset unit, with source provenance). Assets: Btc, Usdc, Usdt, Eurc. 165 ISO-4217 fiat currencies are supported.
Input Schema
{
"type": "object",
"properties": {
"fiatCurrency": {
"description": "Fiat currency code, e.g. USD, EUR, SEK",
"type": "string"
},
"asset": {
"description": "Asset: Btc, Usdc, Usdt, or Eurc",
"type": "string"
}
},
"required": [
"fiatCurrency",
"asset"
]
}🟡create_draft(receiverAddress, network, currency, amountBaseUnits, fiatCurrency, ...)
Create a non-custodial payment draft (you are the SENDER paying a receiver address). Amount is either exact base units (sats for BTC, micro-units for stablecoins) via amountBaseUnits, or fiat-pegged via fiatCurrency+fiatAmount with the exchange rate locked at creation. Returns the draft incl. id, amounts, fee, and status. Funds move only when the sender signs in their own wallet — send21 never holds keys. Requires scope drafts:write.
Input Schema
{
"type": "object",
"properties": {
"receiverAddress": {
"description": "Receiver address (Bitcoin bc1…, Solana base58, or 0x… for Ethereum/Base)",
"type": "string"
},
"network": {
"description": "Network: Mainnet, Solana, Ethereum, Base (test: Testnet4, Signet, Regtest, SolanaDevnet, EthereumSepolia, BaseSepolia)",
"type": "string"
},
"currency": {
"description": "Asset: Btc (default), Usdc, Usdt, or Eurc",
"type": [
"string",
"null"
]
},
"amountBaseUnits": {
"description": "Exact amount in base units (sats / micro-units); omit when using fiat pricing",
"type": [
"integer",
"null"
]
},
"fiatCurrency": {
"description": "Fiat currency code for fiat-pegged amount, e.g. USD",
"type": [
"string",
"null"
]
},
"fiatAmount": {
"description": "Fiat amount; requires fiatCurrency",
"type": [
"number",
"null"
]
},
"memo": {
"description": "Free-text memo shown on the draft (max 500 chars)",
"type": [
"string",
"null"
]
},
"idempotencyKey": {
"description": "Idempotency key — retries with the same key return the original draft",
"type": [
"string",
"null"
]
}
},
"required": [
"receiverAddress",
"network",
"currency",
"amountBaseUnits",
"fiatCurrency",
"fiatAmount",
"memo",
"idempotencyKey"
]
}🟢get_draft_status(draftId)
Lightweight status snapshot of a draft: status (AwaitingPayment/Seen/Confirmed/Expired/Cancelled), paying txid, confirmations. Cheap to poll. Requires scope drafts:read.
Input Schema
{
"type": "object",
"properties": {
"draftId": {
"description": "Draft id (GUID)",
"type": "string"
}
},
"required": [
"draftId"
]
}Community
Evidence