Skip to main content
Glama
jan3dev

Agentic AQUA

by jan3dev

Agentic AQUA

MCP server and CLI for managing Bitcoin and Liquid Network wallets through AI assistants like Claude. One seed backs both networks (unified wallet). Agentic AQUA can also can operate on the Lightning Network.

Features

  • Generate & Import - Create new wallets or import existing seeds

  • Unified Wallet - One seed (mnemonic) for Bitcoin and Liquid; unified_balance shows both

  • Bitcoin (onchain) - BIP84 wallets, balance and send via btc_* tools (BDK)

  • Watch-Only - Import CT descriptors for balance monitoring

  • Send & Receive - Full transaction support (L-BTC, BTC, and Liquid assets like USDt)

  • Lightning - Send and receive via Lightning using L-BTC

  • Assets - Native support for L-BTC, USDt, and all Liquid assets

  • Secure - Encrypted storage, no remote servers for keys

Installation

Quickest way: just ask your AI agent directly:

Install this MCP server: https://github.com/jan3dev/agentic-aqua

If you don't have uvx installed:

# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

Configure Claude Desktop (~/.claude/claude_desktop_config.json):

{
  "mcpServers": {
    "agentic-aqua": {
      "command": "/full/path/to/uvx",
      "args": ["agentic-aqua"]
    }
  }
}

Find the full path to uvx with:

which uvx
# Example: /Users/yourname/.local/bin/uvx

Restart Claude Desktop and you're ready to use Bitcoin and Liquid wallets.

For Developers

Clone and install from source:

git clone https://github.com/jan3dev/agentic-aqua.git
cd agentic-aqua
uv python install 3.13
uv sync --python 3.13

Why pin Python 3.13? bdkpython currently publishes wheels for CPython 3.13, but not 3.14. If uv sync picks 3.14 automatically, installation fails on a clean machine.

Configure Claude Desktop using the full path to uv (find with which uv):

{
  "mcpServers": {
    "agentic-aqua": {
      "command": "/full/path/to/uv",
      "args": ["run", "--directory", "/absolute/path/to/agentic-aqua", "python", "-m", "aqua.server"]
    }
  }
}

Quick Start

Once connected, you can ask Claude to:

  • "Create a new wallet" (creates both Bitcoin and Liquid wallets from one seed)

  • "Show my balance" / "What's my Bitcoin balance?"

  • "Generate a receive address" (Liquid or Bitcoin)

  • "Send 10,000 Sats to bc1..." / "Send 0.001 L-BTC to lq1..."

  • "Pay this Lightning invoice: lnbc..."

  • "Receive 50,000 Sats via Lightning"

  • "Delete my wallet"

Available Tools

Wallet Management

Tool

Description

lw_generate_mnemonic

Generate new BIP39 seed

lw_import_mnemonic

Import wallet from seed (also creates Bitcoin wallet)

lw_import_descriptor

Import watch-only Liquid wallet from CT descriptor

lw_export_descriptor

Export Liquid CT descriptor for watch-only use

btc_import_descriptor

Import watch-only Bitcoin wallet from BIP84 descriptor

btc_export_descriptor

Export Bitcoin BIP84 descriptors + xpub

lw_list_wallets

List all wallets

delete_wallet

Delete a wallet and all its cached data

⚠️ Bitcoin and Liquid descriptors cannot be derived from each other (different BIP84 paths + Liquid's SLIP-77 blinding key). To watch a unified wallet, import both descriptors separately.

Liquid (lw_*)

Tool

Description

lw_balance

Get wallet balances (all assets)

lw_address

Generate Liquid receive address (lq1...)

lw_send

Send L-BTC

lw_send_asset

Send any Liquid asset (USDt, etc.)

lw_transactions

Transaction history

lw_tx_status

Get transaction status (txid or explorer URL)

Bitcoin (btc_*)

Tool

Description

btc_balance

Get Bitcoin balance (sats)

btc_address

Generate Bitcoin receive address (bc1...)

btc_transactions

Bitcoin transaction history

btc_send

Send BTC

Unified

Tool

Description

unified_balance

Get balance for both Bitcoin and Liquid

Lightning

Tool

Description

lightning_receive

Generate a Lightning invoice to receive L-BTC (100–25,000,000 Sats)

lightning_send

Pay a Lightning invoice using L-BTC via Boltz (~0.1% fee)

lightning_transaction_status

Check status of a Lightning swap (send or receive)

CLI

Agentic AQUA also ships with a Click-based CLI (aqua) for direct, scriptable wallet operations. It exposes the same operations as the MCP tools.

# Discover commands
aqua --help
aqua wallet --help
aqua btc --help
aqua liquid --help
aqua lightning --help

# Wallet management
aqua wallet generate-mnemonic
aqua wallet import-mnemonic --mnemonic-stdin --wallet-name default --network mainnet --password-stdin
aqua wallet list
aqua wallet delete --wallet-name old

# Watch-only descriptors (Bitcoin and Liquid are separate)
aqua btc export-descriptor    --wallet-name default
aqua btc import-descriptor    --wallet-name cold --descriptor "wpkh([fp/84h/0h/0h]xpub.../0/*)#cs"
aqua liquid export-descriptor --wallet-name default
aqua liquid import-descriptor --wallet-name cold --descriptor "ct(slip77(...),elwpkh(...))"

# Balances
aqua balance                              # unified (BTC + Liquid)
aqua btc balance --wallet-name default
aqua liquid balance --wallet-name default

# Receive addresses
aqua btc address
aqua liquid address

# Send (--wallet-name is required for on-chain sends)
aqua btc send    --wallet-name default --address bc1... --amount 10000
aqua liquid send --wallet-name default --address lq1... --amount 50000
aqua liquid send-asset --wallet-name default --address lq1... --amount 1000000 --asset-id <asset_id>
# (or use --asset-ticker USDt instead of --asset-id)

# Transaction history & status
aqua btc transactions
aqua liquid transactions
aqua liquid tx-status --tx <txid|explorer_url>

# Lightning (L-BTC via Boltz / Ankara)
aqua lightning receive --amount 50000
aqua lightning send --invoice lnbc...
aqua lightning status --swap-id <id>

# Run as MCP stdio server
aqua serve       # recommended
aqua-mcp         # direct MCP entrypoint

Output defaults to a human-readable table on the terminal and JSON when piped. Force a format with --format json or --format pretty.

Loading seeds safely

Avoid pasting seeds into the chat with your agent. Because it will persists in logs and will be sent to the AI provider agent transcripts may persist them. The recommended workflow is to use this command that hide the text input:

aqua wallet import-mnemonic --mnemonic-stdin --wallet-name defaultx --network mainnet --password-stdin

The CLI honors these variables out of the box:

Variable

Used by

AQUA_MNEMONIC

wallet import-mnemonic

AQUA_PASSWORD

wallet import-mnemonic, btc send, liquid send, liquid send-asset, lightning send, lightning receive

AQUA_<OPTION>

Any CLI option (Click auto_envvar_prefix="AQUA") — e.g. AQUA_WALLET_NAME=default

If you would rather pipe secrets from a password manager, every secret-bearing command also accepts --mnemonic-stdin / --password-stdin:

pass show crypto/aqua-mnemonic | aqua-cli wallet import-mnemonic --mnemonic-stdin

Tips:

  • Never commit .env or secrets.env files (the project's .gitignore already excludes them).

  • Prefer set -a; . file; set +a over export $(cat file) — the former tolerates spaces and quotes inside values.

  • After importing a wallet, the seed is no longer needed for day-to-day operations; only AQUA_PASSWORD is used to sign transactions.

Configuration

Default config location: ~/.aqua/config.json

Migrating from aqua-mcp? The config dir moved from ~/.aqua-mcp to ~/.aqua. There is no automatic migration. To carry over your wallets, run once:

mv ~/.aqua-mcp ~/.aqua
{
  "network": "mainnet",
  "default_wallet": "default",
  "electrum_url": null,
  "auto_sync": true
}

Security

Seeds are encrypted at rest using a password (PBKDF2 + Fernet). Without a password, the seed is stored base64-encoded only — use a password for real funds. Note: this password is NOT a BIP39 passphrase; the derived Liquid/Bitcoin keys depend solely on the seed, so the same seed restores identical descriptors in any BIP39-compliant wallet (AQUA, Blockstream App, Jade, etc.).

For maximum security you can:

  1. Generate wallet on an air-gapped device

  2. Export the CT descriptor

  3. Import as watch-only on your daily machine

All private key operations happen locally. Only blockchain sync uses Blockstream's public servers.

Development

# Install with dev dependencies
uv python install 3.13
uv sync --python 3.13 --all-extras

# Run tests
uv run --python 3.13 python -m pytest tests/

# Format code
uv run black src/
uv run ruff check src/

Architecture

AI Assistant ←→ MCP Server (Python) ←→ LWK (Liquid) ──→ Electrum/Esplora
                       │
                       ├──→ BDK (Bitcoin) ──→ Esplora (Blockstream)
                       │
                       └──→ Boltz / Ankara ──→ Lightning

Credits

Built with:

  • LWK - Liquid Wallet Kit by Blockstream

  • BDK - Bitcoin Development Kit

  • MCP - Model Context Protocol

  • Boltz - Submarine swaps for Lightning

A
license - permissive license
-
quality - not tested
-
maintenance - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jan3dev/agentic-aqua'

If you have feedback or need assistance with the MCP directory API, please join our Discord server