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.
Callable today at agent.nuri.com/mcp.
Upstream tool is there, not wrapped yet. Hours, not weeks.
No backend can do it yet.
Real app features that are meaningless for an agent — QR scanning, biometrics, Apple Wallet.
The single most important separation in the product — and the one most people get wrong.
Bitcoin, Lightning, stablecoins, swaps, Apple Pay top-ups, the multisig Safe. A passkey is the only requirement. No email, no name, no document, ever.
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.
kyc_url. An agent that asks a user
to verify before that step will be waiting for a link that does not exist yet.Read top to bottom. nuri_me returns exactly this, resolved
against the real account, so an agent always knows which rung it is on.
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.
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.
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.
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.
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.
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.
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.
needs: keys
unlocks: every outbound rail
Independent of identity. A user can hold and move Bitcoin forever without ever doing a KYC.
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
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
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.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
| function | backend | status |
|---|---|---|
| Passkey wallet creation, PRF-derived in-browser | connect | live |
| Username reservation | banking | live |
nuri_login
Identity
requires: nothing · callable with no account
| function | backend | status |
|---|---|---|
| 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
| function | backend | status |
|---|---|---|
| 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.
| function | backend | status |
|---|
nuri_receive
Receive
requires: keys derived
| function | backend | status |
|---|---|---|
| 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
| function | backend | status |
|---|---|---|
| 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
| function | backend | status |
|---|---|---|
| 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
| function | backend | status |
|---|---|---|
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
| function | backend | status |
|---|---|---|
| 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
| function | backend | status |
|---|---|---|
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
| function | backend | status |
|---|---|---|
| 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
| function | backend | status |
|---|---|---|
| 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
| function | backend | status |
|---|---|---|
| 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
| function | backend | status |
|---|---|---|
| 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 |
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.
Passkey, keys, username, and the names they give you.
nuri_signupopennuri_loginopennuri_meopennuri_waitopenEvery way money can arrive.
nuri_receivekeysOne tool, every rail.
nuri_sendfundedApple Pay, cards, swaps between assets.
nuri_topupkeysnuri_swapopenThe Visa card and the SEPA IBAN. Identity-gated.
nuri_cardverifiednuri_ibanverifiedMultisig, history, diagnostics.
nuri_historykeysnuri_multisigkeysOrdered by what a user feels, not by effort.
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.
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.
Pay Lightning straight from the Bitcoin balance instead of routing through a stablecoin.
The last chain that is send-only.
One line. swap_route.only already accepts it.
Invoice settlement, swap tracking, dust sweep, card withdrawal, IBAN move. All facade-side, no upstream dependency.