Skip to main content
Glama
Sharmaz

Phoenixd MCP Server

by Sharmaz
README.md
# Phoenixd MCP Server

Connect a phoenixd bitcoin lightning wallet to your LLM.

This MCP server uses [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) and [Phoenixd API](https://phoenix.acinq.co/server/api).

## Prerequisites

You need a running [phoenixd](https://github.com/ACINQ/phoenixd) node. Phoenixd generates an HTTP password on first run and writes it to `~/.phoenix/phoenix.conf`:

```
http-password=your_generated_password
```

Use that value for `HTTP_PASSWORD` in the configuration below.

Node.js >= 18 is required.

## Configuration

### Usage with Claude Desktop

Add this to your `claude_desktop_config.json` file:

```json
{
  "mcpServers": {
    "phoenixd-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "phoenixd-mcp-server"
      ],
      "env": {
        "HTTP_PROTOCOL": "http",
        "HTTP_HOST": "127.0.0.1",
        "HTTP_PORT": "9740",
        "HTTP_PASSWORD": "<your_password_from_phoenix.conf>"
      }
    }
  }
}
```

### Remote node (VPS / HTTPS)

If phoenixd runs on a remote server behind a reverse proxy with TLS:

```json
{
  "mcpServers": {
    "phoenixd-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "phoenixd-mcp-server"
      ],
      "env": {
        "HTTP_PROTOCOL": "https",
        "HTTP_HOST": "your.server.com",
        "HTTP_PORT": "9740",
        "HTTP_PASSWORD": "<your_password_from_phoenix.conf>"
      }
    }
  }
}
```

## Tools

### Payments

- `create-invoice`
  - Create a bolt11 invoice with a specified amount and description.
  - Inputs:
    - `description` (string, optional): The description of the invoice (max. 128 characters). Either `description` or `descriptionHash` must be provided.
    - `descriptionHash` (string, optional): SHA256 hash of the description. Use instead of `description`.
    - `amountSat` (number, optional): The amount requested by the invoice, in satoshi. If not set, the invoice can be paid by any amount.
    - `expirySeconds` (number, optional): The invoice expiry in seconds, default 3600 (1 hour).
    - `externalId` (string, optional): A custom identifier to link the invoice to an external system.
    - `webhookUrl` (string, optional): A URL that phoenixd will POST to when this invoice is paid. The payload is a JSON object with the payment details as defined in the [Phoenixd API docs](https://phoenix.acinq.co/server/api).

- `create-offer`
  - Create a bolt12 offer.
  - Inputs:
    - `description` (string): The description of the offer.
    - `amountSat` (number, optional): The amount requested by the offer, in satoshi.
    - `expirySeconds` (number, optional): The offer expiry in seconds.

- `pay-invoice`
  - Pay a bolt11 invoice.
  - Inputs:
    - `invoice` (string): The bolt11 invoice to pay.
    - `amountSat` (number, optional): Amount to pay in satoshis (only for zero-amount invoices). Mutually exclusive with `sendAll`.
    - `sendAll` (boolean, optional): If true, empties the wallet. Mutually exclusive with `amountSat`.
    - `externalId` (string, optional): A custom identifier to link the payment to an external system.

- `pay-offer`
  - Pay a bolt12 offer.
  - Inputs:
    - `offer` (string): The bolt12 offer to pay.
    - `amountSat` (number, optional): Amount to pay in satoshis. Mutually exclusive with `sendAll`.
    - `sendAll` (boolean, optional): If true, empties the wallet. Mutually exclusive with `amountSat`.
    - `message` (string, optional): A message for the recipient.
    - `externalId` (string, optional): A custom identifier to link the payment to an external system.

- `pay-lightning-address`
  - Pay a Lightning Address.
  - Inputs:
    - `address` (string): The Lightning Address to pay (e.g., swamppawpaw18@phoenixwallet.me).
    - `amountSat` (number, optional): Amount to pay in satoshis. Mutually exclusive with `sendAll`.
    - `sendAll` (boolean, optional): If true, empties the wallet. Mutually exclusive with `amountSat`.
    - `message` (string, optional): Optional message to include with the payment.

- `pay-on-chain`
  - Send an on-chain Bitcoin payment.
  - Inputs:
    - `address` (string): The Bitcoin address to send funds to.
    - `amountSat` (number): Amount to send in satoshis.
    - `feerateSatByte` (number, optional): Fee rate in satoshis per byte.

- `bump-fee`
  - Bumps the fee rate of all unconfirmed on-chain transactions using CPFP. Returns the ID of the child transaction.
  - Inputs:
    - `feerateSatByte` (number): New fee rate in satoshis per byte.

- `list-incoming-payments`
  - List incoming payments (invoices).
  - Inputs:
    - `from` (string, optional): Start timestamp in millis from epoch, default 0.
    - `to` (string, optional): End timestamp in millis from epoch, default now.
    - `limit` (number, optional): Number of payments per page, default 20.
    - `offset` (number, optional): Page offset, default 0.
    - `all` (boolean, optional): Also return unpaid invoices, default false.
    - `externalId` (string, optional): External id of the bolt11 invoice.

- `get-incoming-payment`
  - Get details of a specific incoming payment (invoice).
  - Inputs:
    - `paymentHash` (string): The payment hash of the invoice.

- `list-outgoing-payments`
  - List outgoing payments.
  - Inputs:
    - `from` (string, optional): Start timestamp in millis from epoch, default 0.
    - `to` (string, optional): End timestamp in millis from epoch, default now.
    - `limit` (number, optional): Number of payments per page, default 20.
    - `offset` (number, optional): Page offset, default 0.
    - `externalId` (string, optional): External id of the payment.

- `get-outgoing-payment`
  - Get details of a specific outgoing payment.
  - Inputs:
    - `paymentHash` (string): The payment hash of the outgoing payment.

### Node management

- `get-node-info`
  - Get the node info.
  - Inputs: none

- `get-balance`
  - Get the balance of the node.
  - Inputs: none

- `list-channels`
  - List the node channels.
  - Inputs: none

- `close-channel`
  - Close a channel by ID, sending the funds to a specified address on chain, with a specified fee rate.
  - Inputs:
    - `channelId` (string): The ID of the channel to close.
    - `address` (string): The Bitcoin on chain address to send the funds to.
    - `feerateSatByte` (number): The fee rate in satoshis per byte.

- `decode-invoice`
  - Decode a bolt11 invoice, the output amount is in millisatoshis.
  - Inputs:
    - `invoice` (string): The bolt11 invoice to decode.

- `decode-offer`
  - Decode a bolt12 offer, the output amount is in millisatoshis.
  - Inputs:
    - `offer` (string): The bolt12 offer to decode.

## Troubleshooting

**`Authentication failed` / `401`** — Check that `HTTP_PASSWORD` matches the value in `~/.phoenix/phoenix.conf`.

**`Connection refused`** — Phoenixd is not running or is listening on a different host/port. Verify with `curl http://127.0.0.1:9740/getinfo -u :your_password`.

**`Node.js version error`** — This package requires Node.js >= 18. Run `node --version` to check.

TDQS

B3.3/5.0

Scored across 17 tools

Disambiguation5/5

All 17 tools have clearly distinct purposes, targeting different Lightning operations like invoices, offers, payments (by various methods), channels, balance, and node info. No overlap or ambiguity.

Naming Consistency5/5

Tool names consistently follow a verb-noun pattern with lowercase and hyphens (e.g., create-invoice, pay-on-chain, get-balance). No mixing of conventions or irregular variations.

Tool Count5/5

17 tools is appropriate for a Lightning node management server, covering invoices, payments, channels, balance, and node info without being excessive or insufficient.

Completeness3/5

The tool set covers most core operations for node management and payments, but notably lacks a tool to open channels, which is a fundamental operation for a Lightning node, leaving a meaningful gap.

Maintenance

ActivityInactive
ResponsivenessNo issues