Connect a phoenixd bitcoin lightning wallet to your LLM.
The server provides 17 tools for managing a bitcoind/phoenixd Lightning wallet. Tool names follow clear verb_noun patterns (get-balance, list-channels, create-invoice, pay-invoice). Descriptions are present for most tools and are reasonably specific. However, the server has critical gaps: (1) Two tools (pay-offer, pay-on-chain) lack descriptions entirely, scoring 0 for description. (2) Input schemas are present and use Zod with type annotations, but schema documentation is sparse, parameters like 'from' and 'to' in list-incoming-payments lack min/max bounds, enums where appropriate, and clarity on millisecond epoch format. (3) Output schemas are not documented anywhere, the LLM cannot infer what fields are returned by these tools, preventing downstream composition and chaining. (4) Error handling is absent from tool descriptions; no recovery guidance for failed payments or network errors. (5) No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite multiple irreversible operations (pay-invoice, close-channel, pay-on-chain). (6) Tools like bump-fee and pay-invoice accept financial amounts without explicit validation hints or min/max bounds. Averaging across 17 tools: read-only tools (get-balance, get-node-info, list-channels, decode-invoice, decode-offer, list-incoming-payments, get-incoming-payment, list-outgoing-payments, get-outgoing-payment) score ~65-70 due to adequate naming and descriptions but missing output schemas. Write/irreversible tools score 40-55 due to missing descriptions (pay-offer, pay-on-chain), lack of error guidance, and no confirmation/dry-run patterns. Overall 51 reflects a functional but incomplete foundation.
Makes all your unconfirmed transactions use a higher fee rate, using CPFP. Returns the ID of the child transaction
Close a channel by ID, sending the funds to a specified address on chain, with a specified fee rate
Create a bolt11 invoice with a specified amount and description
Create a bolt12 offer with an optional description and amount
Decode an bolt11 invoice, the output amount is in milisatoshis
Decode an bolt12 offer the output amount is in milisatoshis
Two tools lack descriptions entirely (pay-offer, pay-on-chain), violating the pattern:tool-description pattern. LLMs cannot infer when to call these tools.
Output schemas are completely undocumented. No tool specifies what fields are returned (e.g., does get-balance return {satoshi: number} or {balance: number, unit: string}?). This breaks downstream composition, an LLM cannot chain get-incoming-payment results into another tool without guessing field names.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 13 | - | v1 |
Get the balance of the node
Get the incoming payment by payment hash
Get the node info
Get the outgoing payment by payment id
List the node channels
List the incoming payments
List the outgoing payments
Pay a bolt11 invoice with a specified amount and description
Pays an email-like Lightning address, either based on BIP-353 or LNURL
Irreversible financial operations (pay-invoice, close-channel, pay-on-chain, pay-lightning-address, pay-offer) lack error recovery guidance and confirmation patterns. No dry-run support, no 'what if' estimation, no explicit reversibility warnings in descriptions.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are used in the Zod schemas. This means the MCP client has no machine-readable signal that pay-invoice is destructive or get-balance is safe to retry. Agents cannot reason about retry safety or mutation risk.
List tools (list-incoming-payments, list-outgoing-payments, list-channels) accept 'from' and 'to' timestamps but lack min/max bounds and explicit documentation of the epoch format (milliseconds). Accepting 'from'/'to' as strings further introduces ambiguity, are these ISO 8601 or epoch millis?
Financial parameter descriptions lack validation guidance. E.g., amountSat in pay-invoice has no min (1 satoshi?), max (wallet balance?), or constraint notes. An LLM could pass negative amounts or amounts exceeding available balance without explicit bounds.
Mutually exclusive parameters (amountSat vs sendAll in pay-invoice, pay-lightning-address) are documented in descriptions but not enforced in the schema. Zod allows registering a discriminated union (z.discriminatedUnion) to make this clear to LLMs and runtime validation.
No error recovery guidance in any tool description. E.g., if pay-invoice fails due to insufficient funds, closed channel, or network error, what should the LLM do next? Should it retry? Call get-balance first? Offer alternatives? All missing.
Parameters in list-incoming-payments and list-outgoing-payments ('from', 'to', 'limit', 'offset') lack explicit explanation of pagination semantics. Is 'offset' 0-indexed or 1-indexed? What happens if offset exceeds total count? What is the max limit?