MCP server

Connect Claude Code, Cursor or any MCP client to an ln.bot wallet: one streamable HTTP server per wallet, with 12 tools for payments and L402.

Updated View as Markdown

Every wallet has its own Model Context Protocol server. An agent connected to it can check the balance, create invoices, price and send payments, list its history, buy an address and handle L402, through the 12 tools below.

  • Server: https://api.ln.bot/v1/wallets/{walletId}/mcp
  • Transport: streamable HTTP
  • Auth: Authorization: Bearer <key>
  • Discovery: https://ln.bot/.well-known/mcp.json, the server card agents and clients can find ln.bot by

The tools have no spending limit of their own: send_payment and pay_l402_challenge can spend the whole balance. Give an agent a wallet that holds only what it may spend, and keep the rest in another wallet. Creating wallets, rotating keys, webhooks and backups aren't MCP tools; use the CLI, an SDK or the REST API for those.

Client config

A client needs the wallet's ID for the URL and a key for the header. lnbot init created both: lnbot whoami shows the wallet ID, and the key is in ~/.config/lnbot/config.json (lnbot key show prints it). Without the CLI, POST /v1/register returns the keys and POST /v1/wallets the wallet ID; see getting started with the API.

The CLI prints a ready block for the active wallet, or for another with --wallet:

$ lnbot mcp config --remote
Add to your MCP client config:

{
  "mcpServers": {
    "lnbot": {
      "headers": {
        "Authorization": "Bearer uk_9Qf3Lx7TzM2pW8vR4kNs6bHc"
      },
      "type": "url",
      "url": "https://api.ln.bot/v1/wallets/wal_c7i0hnuoxxupuwej/mcp"
    }
  }
}

The key in that header is the account's primary user key (uk_), which reaches every wallet on the account, so treat the file you paste it into like the key itself. For an agent, put that wallet's own key (wk_..., from w.key.create()) in the header instead: it reaches that wallet and no other. With a wallet key, the URL can also be https://api.ln.bot/v1/wallets/current/mcp. Clients differ in the shape they want around the URL and the header.

Claude Code

claude mcp add --transport http lnbot https://api.ln.bot/v1/wallets/wal_.../mcp \
  --header "Authorization: Bearer uk_..."
bash

That stores the server for you in the current project; --scope user makes it available in every project. Claude Code's own config files describe this kind of server with "type": "http", so add it with the command rather than pasting the block above. See Claude Code's MCP docs.

Cursor

Put this in .cursor/mcp.json in your project, or in ~/.cursor/mcp.json for every project:

{
  "mcpServers": {
    "lnbot": {
      "url": "https://api.ln.bot/v1/wallets/wal_.../mcp",
      "headers": {
        "Authorization": "Bearer ${env:LNBOT_API_KEY}"
      }
    }
  }
}
json

Cursor fills in ${env:LNBOT_API_KEY} from your environment, which keeps the key out of the file; writing the key in directly works too. See Cursor's MCP docs.

Other clients

Any client that speaks streamable HTTP and can send a header can connect: add the URL and the Authorization: Bearer header in its MCP settings.

Tools

The parameter descriptions below are the ones the server gives agents.

get_wallet

Get wallet balance and summary. No parameters.

Returns the balance, the on-hold amount, the available balance, and invoice, payment and transaction counts.

create_invoice

Create a Lightning invoice to receive sats.

Parameter Type Required Description
amount integer yes Amount in sats (1 to 1,000,000,000)
reference string no Optional tracking reference (max 256 chars)
memo string no Optional memo embedded in the BOLT11 invoice (max 256 chars)

Returns the invoice number, bolt11 string, amount and expiry.

quote_payment

Price a payment without sending it. Read-only: nothing is sent or held.

Parameter Type Required Description
target string yes Lightning address (user@domain), LNURL (lnurl1...), or BOLT11 invoice string
amount integer no Amount in sats to price. Omit it for a Lightning address or LNURL to get the most the wallet can send there; a BOLT11 invoice is priced at its own amount.

Returns what GET .../payments/resolve does: whether the recipient is an ln.bot wallet (internal, no fees), the network fee estimate, the service fee, the total, and without an amount the most the wallet can send there now. A fee warning means send_payment without maxFee would be rejected. Pricing a Lightning address or LNURL fetches an invoice from the recipient, so it takes a moment longer.

send_payment

Send sats to a Lightning address (user@domain), LNURL, or BOLT11 invoice. This sends real money: the amount and the fees are placed on hold until the payment settles.

Parameter Type Required Description
target string yes Lightning address (user@domain), LNURL (lnurl1...), or BOLT11 invoice string
amount integer no Amount in sats (required for Lightning addresses and LNURLs, optional for BOLT11)
maxFee integer no Maximum network fee in sats, the 0.25% network fee plus routing (default 1% of the amount, at least 20; ignored for internal transfers)
reference string no Optional tracking reference (max 256 chars)

Leave maxFee out unless quote_payment returned a fee warning. A payment out to Lightning also pays the 0.25% service fee, at least ₿1; between ln.bot wallets there are no fees.

list_invoices

List invoices (newest first).

Parameter Type Required Description
after integer no Return invoices with number less than this (for pagination)
limit integer no Number of invoices to return (default 10, max 50)

Returns invoice summaries with status, amount and bolt11.

list_payments

List payments (newest first).

Parameter Type Required Description
after integer no Return payments with number less than this (for pagination)
limit integer no Number of payments to return (default 10, max 50)

Returns payment summaries with status, amount and destination.

list_transactions

List transaction history (newest first).

Parameter Type Required Description
after integer no Return transactions with number less than this (for pagination)
limit integer no Number of transactions to return (default 10, max 50)

Returns each transaction's type, amount and the balance after it.

list_addresses

List the wallet's Lightning addresses, in user@domain format. No parameters.

buy_address

Buy a vanity Lightning address (name@ln.bot). It costs ₿100 for five characters or more, ₿1,000 for four and ₿10,000 for three, deducted from the wallet's balance.

Parameter Type Required Description
address string yes The vanity address to claim (3-20 lowercase alphanumeric characters)

create_l402_challenge

Create an L402 challenge (an invoice and a macaroon) for pay-per-use API access.

Parameter Type Required Description
amount integer yes Amount in sats (1 to 1,000,000,000)
description string no Optional description embedded in the invoice (max 256 chars)
expirySeconds integer no Optional token expiry in seconds (adds an expiry caveat)
caveats string no Optional comma-separated caveats (e.g., 'service=api,tier=premium')

Returns the macaroon, the invoice and a ready-made WWW-Authenticate header value for the 402 response.

pay_l402_challenge

Pay an L402 challenge and get a ready-to-use Authorization header (L402 <macaroon>:<preimage>). The tool parses the WWW-Authenticate header, pays the invoice and waits for settlement.

Parameter Type Required Description
wwwAuthenticate string yes The WWW-Authenticate header value from the 402 response
maxFee integer no Maximum network fee in sats (default 1% of the amount, at least 20)
wait boolean no Wait for settlement (default true)

There is no price limit: the tool pays whatever the invoice asks. The L402 clients for TypeScript and C# check the invoice's amount against a limit you set before paying.

verify_l402_token

Verify an L402 authorization token.

Parameter Type Required Description
authorization string yes The full Authorization header value: L402 <base64_macaroon>:<hex_preimage>

Checks the macaroon signature, the preimage (proof of payment) and the caveats.