What is available when, and what depends on what

Every tool belongs to one area and unlocks at one stage. Some are open to anyone with no account at all; others are gated behind a chain that has to happen in order. 85 capabilities audited against the five live Nuri servers.

live56

Callable today at agent.nuri.com/mcp.

backend exists7

Upstream tool is there, not wrapped yet. Hours, not weeks.

missing upstream17

No backend can do it yet.

app-only5

Real app features that are meaningless for an agent — QR scanning, biometrics, Apple Wallet.

Two tracks, one passkey

The single most important separation in the product — and the one most people get wrong.

Self-custody · never needs an ID check

Bitcoin, Lightning, stablecoins, swaps, Apple Pay top-ups, the multisig Safe. A passkey is the only requirement. No email, no name, no document, ever.

Card & IBAN · identity-gated

The Visa card and the SEPA IBAN need, in this order: passkey → username → a smart account registered on-chain → and only then the ID check.

The gate people miss: there is no ID-check link until the on-chain registration has settled. The backend submits a gasless registration UserOperation first and only then returns kyc_url. An agent that asks a user to verify before that step will be waiting for a link that does not exist yet.

The dependency ladder

Read top to bottom. nuri_me returns exactly this, resolved against the real account, so an agent always knows which rung it is on.

  1. No account yet Open to everyone

    needs: nothing

    unlocks: nuri_me nuri_swap (quotes) nuri_signup nuri_login

    Quotes, routes and rates need nothing at all. An agent can price a swap before a user exists.

  2. Passkey created Both tracks

    needs: open

    unlocks: nuri_login nuri_wait

    RP ID is nuri.com. The private key is derived from PRF in the browser, used, and wiped — it never exists on a server.

  3. Keys derived Both tracks

    needs: passkey

    unlocks: nuri_receive (EVM) nuri_send (crypto rails) nuri_topup nuri_multisig

    Automatic — the same passkey tap that creates the credential derives the keys.

  4. Username claimed Both tracks

    needs: passkey

    unlocks: user@nuri.com Lightning address user.nuri.eth ENS name

    Both names resolve the moment the username exists. No registrar call, no transaction, no waiting.

  5. Smart account registered on-chain Card & IBAN gate

    needs: keys + username

    unlocks: the ID-check link itself

    THE gate people miss: there is no KYC link until this settles. wirex_register_result submits it and only then returns kyc_url. Nuri sponsors the gas.

  6. ID check started Card & IBAN

    needs: smart_account

    unlocks: nothing yet — waiting on the provider

    An email address is required here, and only here. The self-custody track never needs one.

  7. Identity approved Card & IBAN gate

    needs: kyc_started

    unlocks: EUR IBAN virtual Visa card SEPA out 3DS approvals physical card

    IBAN and the first virtual card are provisioned automatically at this point.

  8. Wallet funded Self-custody

    needs: keys

    unlocks: every outbound rail

    Independent of identity. A user can hold and move Bitcoin forever without ever doing a KYC.

Which tool needs which stage

flowchart LR
  classDef open fill:#0d2b21,stroke:#3ec9a0,color:#d6fff2
  classDef mid fill:#1a2230,stroke:#8b9dff,color:#e6ebff
  classDef gated fill:#2e1a10,stroke:#f7931a,color:#ffe8c6

  P["passkey"]:::open --> K["keys derived"]:::open
  P --> U["username"]:::open
  K --> SA["smart account on-chain"]:::mid
  U --> SA
  SA --> KY["ID check link"]:::mid
  KY --> V["identity approved"]:::mid
  K --> F["wallet funded"]:::open

  O["no account needed"]:::open --> T0["nuri_me · nuri_swap · nuri_signup · nuri_login · nuri_wait"]:::open
  K --> T1["nuri_receive · nuri_topup · nuri_multisig · nuri_history"]:::open
  F --> T2["nuri_send"]:::open
  V --> T3["nuri_card · nuri_iban"]:::gated
  

How nuri_send picks a rail

flowchart TD
  A["nuri_send(to, amount)"] --> B{"what is 'to'?"}
  B -->|"lnbc… lnurl…"| L["Lightning invoice"]
  B -->|"name@domain"| LA["Lightning address"]
  B -->|"+255 6xx/7xx"| TZ["Tanzanian mobile"]
  B -->|"DE89 3704…"| IB["IBAN"]
  B -->|"0x… name.eth"| EV["EVM"]
  B -->|"bc1…"| BQ["Bitcoin bech32"]
  B -->|"1… 3…"| CK{"base58check valid?"}
  CK -->|yes| BT["Bitcoin legacy"]
  CK -->|no| SO["Solana"]
  L --> SK1["swapkit → BTC_LN"]
  LA --> SK1
  TZ --> RM["remit: quote + BOLT11"]
  RM --> SK1
  IB --> WX["banking: lookup → estimate → signed SEPA"]
  EV --> DT["connect: signed ERC-20, gas sponsored"]
  BQ --> SK2["swapkit → BTC / SOL"]
  BT --> SK2
  SO --> SK2
  classDef rail fill:#0d2b21,stroke:#3ec9a0,color:#d6fff2
  classDef work fill:#141b23,stroke:#5b6c8f,color:#e8edf5
  class L,LA,TZ,IB,EV,BQ,BT,SO rail
  class SK1,SK2,WX,DT,RM work
  
A 32–35 character string starting 1 or 3 is shape-identical as a Bitcoin legacy address and a Solana address. Guessing sends the money to the wrong chain, so it is checksummed instead.

Every function, under its tool, with its dependency

The complete map: which function sits under which tool, what that tool requires before it works, and which backend answers. 85 functions across 12 tools.

nuri_signup Identity requires: nothing · callable with no account
functionbackendstatus
Passkey wallet creation, PRF-derived in-browser connect live
Username reservation banking live
nuri_login Identity requires: nothing · callable with no account
functionbackendstatus
Zero-argument passkey login banking live
Bitcoin and Lightning key unlock bitcoin connect live
Switch between several passkeys on one device credential_id connect live
nuri_me Identity requires: nothing · callable with no account
functionbackendstatus
Account dashboard with explicit next steps banking live
Live onboarding stage read (backend truth) wirex_diagnose live
On-chain Bitcoin balance (spendable / preconfirmed / boarding) connect arkade_balance live
nuri_wait Identity requires: nothing · callable with no account

No capability rows of its own — it is the polling tool every other flow hands its ticket to.

nuri_receive Receive requires: keys derived
functionbackendstatus
Lightning address — no invoice, no expiry nuri.com live
Lightning invoice for an exact amount amount_sats connect live
EVM address — Base, Ethereum, every EVM chain connect live
EUR IBAN details banking live
Did my invoice get paid? check connect live
On-chain Bitcoin receive address connect arkade_balance live
On-chain BTC receive address (app has it) connect arkade_balance live
nuri_send Send requires: wallet funded
functionbackendstatus
Lightning invoice or address swapkit → BTC_LN live
SEPA transfer to any IBAN banking live
EVM stablecoin transfer, gas sponsored connect live
ENS resolution swapkit live
Bitcoin address, funded by swap swapkit live
Solana address swapkit live
Tanzanian shilling mobile money remit + swapkit live
nuri_topup Money in requires: keys derived
functionbackendstatus
Apple Pay or card via Mercuryo swapkit live
Apple Pay or card via Paybis provider swapkit live
Top up the card from the Euro wallet balance from:wallet,to:card connect + banking live
Top up the card with Bitcoin from:bitcoin,to:card swapkit + banking live
nuri_swap Money in requires: nothing · callable with no account
functionbackendstatus
Sweep dust into one asset sweep swapkit live
Swap across 13 providers swapkit live
Multi-hop routing swapkit live
Track one swap by id track swapkit live
Auto-convert stranded USDC → EURC auto_convert swapkit live
Sweep-claim of found funds sweep swapkit live
Swap phase status + refund deadline track swapkit live
nuri_card Cards & banking requires: identity approved
functionbackendstatus
Card status and balance banking live
Issue a virtual Visa create banking live
Reveal PAN and CVV details banking live
Reveal PIN pin banking live
Freeze and unfreeze freeze banking live
Daily spending limit limit banking live
Approve a purchase held at checkout (3DS) confirm_purchase banking live
Physical card eligibility and delivery options physical banking live
Complete a physical card order physical banking live
Withdraw card balance back to the wallet withdraw banking live
nuri_iban Cards & banking requires: identity approved
functionbackendstatus
Personal EUR IBAN personal banking live
Business IBAN with company KYB business monerium live
Onchain EUR IBAN — EURe on Base onchain_eur monerium live
Card top-up from IBAN (show bank details) banking live
nuri_history Advanced requires: keys derived
functionbackendstatus
Bitcoin transaction rows with status connect arkade_transactions live
Merged activity feed banking + swapkit live
Lightning receives in the activity feed connect arkade_transactions live
CSV export of any feed format:csv facade live
nuri_multisig Advanced requires: keys derived
functionbackendstatus
2-of-2 Safe preview, deterministic connect live
2-of-2 Safe deploy, gas sponsored deploy connect live
automatic Identity requires: no tool call — it exists the moment the username does
functionbackendstatus
user@nuri.com Lightning address nuri.com LNURL live
user.nuri.eth + user.nuriwallet.eth offchain resolver live
Encrypted Nostr key recovery connect live
not exposed yet Identity requires: nothing wraps these yet — this is the backlog
functionbackendstatus
One tap for banking AND Bitcoin needs connect or banking to return both upstream
Solana receive address connect derives no SOL key upstream
Native Bitcoin spend from the BTC balance wallet_send_* needs a browser-built PSBT upstream
Pay a BOLT11 from the BTC balance needs arkade_send_invoice in connect upstream
EURe SEPA payout via Monerium monerium_browser_create_sepa_payment unwrapped wrap it
Daimo onramp in swap_route.only, absent from swap_onramp enum upstream
Swap notifications and subscriptions swap_subscribe unwrapped wrap it
Move the IBAN to another address monerium_move_iban_start unwrapped wrap it
Push funds out to an external card wirex_push_to_card is sandbox-only upstream
Safe on Base ethereum_safe_create takes no chain argument upstream
Restore a wallet from an existing passkey on a new device connect already restores in the Access flow — result is only console-logged wrap it
Encrypted Nostr backup read/write connect publishes on create and reads on Access; not exposed as a tool wrap it
Migrate a v1.nuri.com wallet app-only WebView flow upstream
Delete wallet / factory reset destructive lifecycle, deliberately not agent-exposed app-only
Biometric app-lock on resume device-level, not an API app-only
Unlock an inbound Arkade payment (claim it) without it received BTC stays unclaimed upstream
Manually broadcast a signed Bitcoin tx hex app exposes hex + broadcast upstream
Scan a QR / IBAN-SEPA QR an agent is handed the string already app-only
Native Apple Pay buy via buybitcoin.nuri.com that host is not one of the five wrapped servers upstream
Base gas faucet drip before a mainnet send banking.nuri.com/faucet/drip, plain HTTP wrap it
Add the card to Apple Wallet native provisioning, not an API app-only
Base on-chain rows in the activity feed nuri_history reads no Alchemy transfers wrap it
Create a MuSig2 cosigner passkey app-only today upstream
Encrypted Nostr support chat + diagnostic log share no MCP surface upstream
Forced app-update check app lifecycle, meaningless for an agent app-only
Business account: KYB status, per-chain balances, order history nuri-business-app, only the application start is wrapped upstream
Business account: desktop QR passkey sign-in + approval relay nuri-business-app upstream
Provision a phone number / SIM nuri-phone-hermes: native Android automation, not an HTTP API upstream
VPN nuri-phone-hermes: device-level on a rooted Pixel, not an API upstream

The same thing grouped by area

Each tool is tagged with its area and its required stage inside the MCP itself, so an agent sees the same separation you see here.

Identity

Passkey, keys, username, and the names they give you.

nuri_signupopennuri_loginopennuri_meopennuri_waitopen
Passkey wallet creation, PRF-derived in-browsernuri_signup · connect
live
Username reservationnuri_signup · banking
live
user@nuri.com Lightning addressautomatic · nuri.com LNURL
live
user.nuri.eth + user.nuriwallet.ethautomatic · offchain resolver
live
Zero-argument passkey loginnuri_login · banking
live
Bitcoin and Lightning key unlocknuri_login(bitcoin) · connect
live
Account dashboard with explicit next stepsnuri_me · banking
live
Live onboarding stage read (backend truth)nuri_me · wirex_diagnose
live
Encrypted Nostr key recoveryautomatic on create · connect
live
One tap for banking AND Bitcoin— · needs connect or banking to return both
upstream
Restore a wallet from an existing passkey on a new device— · connect already restores in the Access flow — result is only console-logged
wrap it
Encrypted Nostr backup read/write— · connect publishes on create and reads on Access; not exposed as a tool
wrap it
Switch between several passkeys on one devicenuri_login(credential_id) · connect
live
Migrate a v1.nuri.com wallet— · app-only WebView flow
upstream
Delete wallet / factory reset— · destructive lifecycle, deliberately not agent-exposed
app-only
Biometric app-lock on resume— · device-level, not an API
app-only
Provision a phone number / SIM— · nuri-phone-hermes: native Android automation, not an HTTP API
upstream
VPN— · nuri-phone-hermes: device-level on a rooted Pixel, not an API
upstream

Receive

Every way money can arrive.

nuri_receivekeys
On-chain Bitcoin balance (spendable / preconfirmed / boarding)nuri_me · connect arkade_balance
live
Lightning address — no invoice, no expirynuri_receive · nuri.com
live
Lightning invoice for an exact amountnuri_receive(amount_sats) · connect
live
EVM address — Base, Ethereum, every EVM chainnuri_receive · connect
live
EUR IBAN detailsnuri_receive · banking
live
Did my invoice get paid?nuri_receive(check) · connect
live
On-chain Bitcoin receive addressnuri_receive · connect arkade_balance
live
Solana receive address— · connect derives no SOL key
upstream
Unlock an inbound Arkade payment (claim it)— · without it received BTC stays unclaimed
upstream
On-chain BTC receive address (app has it)nuri_receive · connect arkade_balance
live

Send

One tool, every rail.

nuri_sendfunded
Lightning invoice or addressnuri_send · swapkit → BTC_LN
live
SEPA transfer to any IBANnuri_send · banking
live
EVM stablecoin transfer, gas sponsorednuri_send · connect
live
ENS resolutionnuri_send · swapkit
live
Bitcoin address, funded by swapnuri_send · swapkit
live
Solana addressnuri_send · swapkit
live
Tanzanian shilling mobile moneynuri_send · remit + swapkit
live
Native Bitcoin spend from the BTC balance— · wallet_send_* needs a browser-built PSBT
upstream
Pay a BOLT11 from the BTC balance— · needs arkade_send_invoice in connect
upstream
EURe SEPA payout via Monerium— · monerium_browser_create_sepa_payment unwrapped
wrap it
Sweep dust into one assetnuri_swap(sweep) · swapkit
live
Manually broadcast a signed Bitcoin tx hex— · app exposes hex + broadcast
upstream
Scan a QR / IBAN-SEPA QR— · an agent is handed the string already
app-only

Money in

Apple Pay, cards, swaps between assets.

nuri_topupkeysnuri_swapopen
Apple Pay or card via Mercuryonuri_topup · swapkit
live
Apple Pay or card via Paybisnuri_topup(provider) · swapkit
live
Swap across 13 providersnuri_swap · swapkit
live
Multi-hop routingnuri_swap · swapkit
live
Daimo onramp— · in swap_route.only, absent from swap_onramp enum
upstream
Track one swap by idnuri_swap(track) · swapkit
live
Swap notifications and subscriptions— · swap_subscribe unwrapped
wrap it
Top up the card from the Euro wallet balancenuri_topup(from:wallet,to:card) · connect + banking
live
Top up the card with Bitcoinnuri_topup(from:bitcoin,to:card) · swapkit + banking
live
Native Apple Pay buy via buybitcoin.nuri.com— · that host is not one of the five wrapped servers
upstream
Base gas faucet drip before a mainnet send— · banking.nuri.com/faucet/drip, plain HTTP
wrap it
Auto-convert stranded USDC → EURCnuri_swap(auto_convert) · swapkit
live
Sweep-claim of found fundsnuri_swap(sweep) · swapkit
live
Swap phase status + refund deadlinenuri_swap(track) · swapkit
live

Cards & banking

The Visa card and the SEPA IBAN. Identity-gated.

nuri_cardverifiednuri_ibanverified
Card status and balancenuri_card · banking
live
Issue a virtual Visanuri_card(create) · banking
live
Reveal PAN and CVVnuri_card(details) · banking
live
Reveal PINnuri_card(pin) · banking
live
Freeze and unfreezenuri_card(freeze) · banking
live
Daily spending limitnuri_card(limit) · banking
live
Approve a purchase held at checkout (3DS)nuri_card(confirm_purchase) · banking
live
Physical card eligibility and delivery optionsnuri_card(physical) · banking
live
Personal EUR IBANnuri_iban(personal) · banking
live
Business IBAN with company KYBnuri_iban(business) · monerium
live
Onchain EUR IBAN — EURe on Basenuri_iban(onchain_eur) · monerium
live
Complete a physical card ordernuri_card(physical) · banking
live
Withdraw card balance back to the walletnuri_card(withdraw) · banking
live
Move the IBAN to another address— · monerium_move_iban_start unwrapped
wrap it
Push funds out to an external card— · wirex_push_to_card is sandbox-only
upstream
Add the card to Apple Wallet— · native provisioning, not an API
app-only
Card top-up from IBAN (show bank details)nuri_iban · banking
live

Advanced

Multisig, history, diagnostics.

nuri_historykeysnuri_multisigkeys
Bitcoin transaction rows with statusnuri_history · connect arkade_transactions
live
Merged activity feednuri_history · banking + swapkit
live
2-of-2 Safe preview, deterministicnuri_multisig · connect
live
2-of-2 Safe deploy, gas sponsorednuri_multisig(deploy) · connect
live
Safe on Base— · ethereum_safe_create takes no chain argument
upstream
Base on-chain rows in the activity feed— · nuri_history reads no Alchemy transfers
wrap it
Lightning receives in the activity feednuri_history · connect arkade_transactions
live
CSV export of any feednuri_history(format:csv) · facade
live
Create a MuSig2 cosigner passkey— · app-only today
upstream
Encrypted Nostr support chat + diagnostic log share— · no MCP surface
upstream
Forced app-update check— · app lifecycle, meaningless for an agent
app-only
Business account: KYB status, per-chain balances, order history— · nuri-business-app, only the application start is wrapped
upstream
Business account: desktop QR passkey sign-in + approval relay— · nuri-business-app
upstream

To reach parity, in this order

Ordered by what a user feels, not by effort.

  1. One-tap combined login

    The only gap a user notices today. Have wirex_session_result return the wallet tuple, or wallet_link_result return a banking session. Either one fixes it.

  2. Publish the on-chain Bitcoin host

    The nuri_btc_* server exists but bitcoin.nuri.com does not resolve. Publishing it closes BTC receive, BTC balance and native BTC send at once.

  3. Add arkade_send_invoice to connect

    Pay Lightning straight from the Bitcoin balance instead of routing through a stablecoin.

  4. Derive a Solana key in connect

    The last chain that is send-only.

  5. Add daimo to the swap_onramp enum

    One line. swap_route.only already accepts it.

  6. Wrap the amber rows

    Invoice settlement, swap tracking, dust sweep, card withdrawal, IBAN move. All facade-side, no upstream dependency.