Remote MCP server

Give your AIa wallet.Keep the leash.

Claude, Cursor and any MCP client can read your Solana wallet and propose SOL transfers. Nothing moves until you see the exact transaction — and sign it yourself.

Tools
5
Can sign
0
Signer
you
HELD IN HAND1LEASHCERTIFICATE OF CONSENTPay to the order of7xKX…sAsUPROPOSED BY AN ASSISTANTSIGNED BY THE HOLDER ALONETHE HOLDER5VfY…3kQe5VfY…3kQeSERIES L · HELD BY THE HOLDERTHIS NOTE MOVES ONLY BY THE SIGNATURE OF ITS HOLDER · THIS NOTE MOVES ONLY BY THE SIGNATURE OF ITS HOLDER · THIS NOTE MOVES ONLY BY THE SIGNATURE OF ITS HOLDER · THIS NOTE MOVES ONLY BY THE SIGNATURE OF ITS HOLDER · THIS NOTE MOVES ONLY BY THE SIGNATURE OF ITS HOLDER · THIS NOTE MOVES ONLY BY THE SIGNATURE OF ITS HOLDER · THIS NOTE MOVES ONLY BY THE SIGNATURE OF ITS HOLDER · THIS NOTE MOVES ONLY BY THE SIGNATURE OF ITS HOLDER · THIS NOTE MOVES ONLY BY THE SIGNATURE OF ITS HOLDER · THIS NOTE MOVES ONLY BY THE SIGNATURE OF ITS HOLDER ·
Fig. 1 — A certificate of consent. Original engraving, not currency.

The whole idea, in one line

The AI writes the request.
You sign the transaction.

Single-use requests
10-minute expiry
Verified before broadcast
§ 01How it works

Three parties.
One of them holds the key.

Your assistant talks to LEASH over MCP. LEASH talks to you. The chain only ever hears from your wallet.

  1. A
    Assistant
    Claude · Cursor · any MCP client
    ↓ proposes
  2. L
    LEASH
    /api/mcp · validates & holds
    ↓ asks — you sign or reject
  3. Y
    You
    Phantom · Solflare · your key
  1. 01
    Propose

    Your assistant calls prepare_sol_transfer with a destination and an amount.

  2. 02
    Validate

    LEASH checks address, amount, balance and fee — then holds a pending request for ten minutes.

  3. 03
    Review & sign

    You see the exact destination, amount and fee, and approve in Phantom or Solflare. Or reject.

  4. 04
    Verify

    LEASH checks the signed transaction matches the request, broadcasts it once and reports the real on-chain status.

§ 02What the AI can see — and cannot do

Five tools. Four only read. One can ask.

  • 01get_wallet_addressPublic address of the wallet you authorized.Read only
  • 02get_sol_balanceCurrent SOL balance and network.Read only
  • 03get_token_balancesNon-zero SPL / Token-2022 balances (mint, amount).Read only
  • 04prepare_sol_transferProposes a SOL transfer. Creates a pending request — never signs.Needs your signature
  • 05get_transaction_statusHonest status of a request or any signature.Read only
It can see
  • Your public addressAlready public on-chain.
  • SOL & SPL balancesRead from public chain data.
  • Your requests & statusesOnly for the wallet you paired.
  • The last 50 actionsAn activity log you can audit.
It can never
  • Seed phrases or private keysNever requested, never stored, never transmitted.
  • Signing on your behalfThe server holds no key. It can only prepare.
  • Swaps, approvals, arbitrary programsOne instruction type: a plain SOL transfer.
  • Other people's walletsEvery token is bound to exactly one wallet.
§ 03The approval, live

Watch a request
wait for its holder.

A simulation of the real flow. Hover to pause, click any step to jump. In the product, the request appears on your dashboard and your wallet asks for the signature.

Live simulationPlaying
You
Pay Alice 0.25 SOL for the logo work.
Assistant
I've prepared it. Nothing is sent until you sign in your wallet.
prepare_sol_transfer({ to: "7xKX…sAsU", amount_sol: "0.25" })
leash:9f2c
Send
0.25 SOL
Fee
0.000005 SOL
To
7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
Review & signReject
Signature
5VfY…k3Qe · finalized
memo leash:9f2c ✓ matches request

Requests are single-use. Repeating the call returns the same pending request; changing parameters creates a new one that also needs your signature. Expired or rejected requests can never be submitted.

§ 04Connect over MCP

One URL.
One bearer token.

  1. 1Open the dashboard and connect your wallet.
  2. 2Sign a one-time message to prove ownership — no transaction, no fee.
  3. 3Generate an MCP token. It is shown once and bound to that wallet.
  4. 4Add the server to your client with the snippet for it.

Transport: Streamable HTTP at /api/mcp. The dashboard shows these snippets prefilled with your URL and token.

Claude Code
claude mcp add --transport http leash https://your-leash.vercel.app/api/mcp \
  --header "Authorization: Bearer leash_…"
Cursor · ~/.cursor/mcp.json
{
  "mcpServers": {
    "leash": {
      "url": "https://your-leash.vercel.app/api/mcp",
      "headers": {
        "Authorization": "Bearer leash_…"
      }
    }
  }
}
Claude Desktop · claude_desktop_config.json (via mcp-remote)
{
  "mcpServers": {
    "leash": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://your-leash.vercel.app/api/mcp",
        "--header",
        "Authorization:${LEASH_AUTH}"
      ],
      "env": {
        "LEASH_AUTH": "Bearer leash_…"
      }
    }
  }
}
§ 05Security, in the fine print

Paranoid by design.
Boring on purpose.

Ed25519 pairing
You prove wallet ownership by signing a message. The server verifies it and sets an httpOnly session.
Hashed tokens
MCP tokens are shown once and stored only as a SHA-256 hash. Rotate or revoke at any time.
Exact-match verification
The signed transaction must be one System transfer, from → to, for the approved lamports, plus the leash memo.
Single-use lock
First submit or reject wins. A request can be broadcast exactly once — then re-verified on-chain.
Fig. 2 — The only seal that counts

Two minutes · no seed phrase

Hand it the wallet.
Hold the leash.