Aqua Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Aqua Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
unified_balance shows bothbtc_* tools (BDK)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/uvxRestart Claude Desktop and you're ready to use Bitcoin and Liquid wallets.
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.13Why pin Python 3.13?bdkpythoncurrently publishes wheels for CPython 3.13, but not 3.14. Ifuv syncpicks 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"]
}
}
}Once connected, you can ask Claude to:
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) |
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 entrypointOutput defaults to a human-readable table on the terminal and JSON when piped. Force a format with --format json or --format pretty.
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-stdinThe 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-stdinTips:
.env or secrets.env files (the project's .gitignore already excludes them).set -a; . file; set +a over export $(cat file) — the former tolerates spaces and quotes inside values.AQUA_PASSWORD is used to sign transactions.Default config location: ~/.aqua/config.json
Migrating from `aqua-mcp`? The config dir moved from~/.aqua-mcpto~/.aqua. There is no automatic migration. To carry over your wallets, run once:
>
``bash mv ~/.aqua-mcp ~/.aqua ``{
"network": "mainnet",
"default_wallet": "default",
"electrum_url": null,
"auto_sync": true
}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:
All private key operations happen locally. Only blockchain sync uses Blockstream's public servers.
# 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/AI Assistant ←→ MCP Server (Python) ←→ LWK (Liquid) ──→ Electrum/Esplora
│
├──→ BDK (Bitcoin) ──→ Esplora (Blockstream)
│
└──→ Boltz / Ankara ──→ LightningBuilt with:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.