Skip to main content
Glama
README.md
<p align="center">
  <h1 align="center">MCP Bitcoin CLI</h1>
  <p align="center">
    <strong>Embed and read data on the Bitcoin blockchain through Claude</strong>
  </p>
  <p align="center">
    <a href="https://github.com/EricGrill/mcp-bitcoin-cli/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License"></a>
    <img src="https://img.shields.io/badge/tools-16-green.svg" alt="16 Tools">
    <img src="https://img.shields.io/badge/OP__RETURN-100KB-orange.svg" alt="OP_RETURN 100KB">
    <img src="https://img.shields.io/badge/python-%3E%3D3.11-blue.svg" alt="Python >= 3.11">
  </p>
  <p align="center">
    <a href="#-quick-start">Quick Start</a> |
    <a href="#-available-tools">Tools</a> |
    <a href="#%EF%B8%8F-configuration">Configuration</a> |
    <a href="#-contributing">Contributing</a>
  </p>
</p>

---

## What is this?

An [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server that enables Claude to interact with Bitcoin's OP_RETURN functionality. Store documents, create timestamps, deploy tokens, and build custom protocols—all through natural language.

**Works with Claude Desktop, Cursor, and any MCP-compatible client.**

**Supports Bitcoin Core v30+ with up to ~100KB OP_RETURN data.**

---

## Quick Start

```bash
# Install from source
git clone https://github.com/EricGrill/mcp-bitcoin-cli.git
cd mcp-bitcoin-cli
pip install -e .

# Run the server
mcp-bitcoin-cli
```

Add to your Claude Desktop config and start working with Bitcoin:

> "Create a timestamp for this document on Bitcoin testnet"

---

## Why Use This?

| Feature | Description |
|---------|-------------|
| **Document Storage** | Embed documents up to 100KB directly on-chain |
| **Timestamping** | Create immutable SHA-256/SHA3 hash commitments |
| **BRC-20 Tokens** | Deploy, mint, and transfer tokens using the BRC-20 standard |
| **Custom Protocols** | Build your own OP_RETURN protocols with the BTCD envelope format |
| **Offline-Capable** | Encode/decode data without a running Bitcoin node |
| **Safety First** | Testnet default, dry-run mode, fee warnings |

---

## Available Tools

### Low-Level Primitives

Offline-capable tools for data encoding and transaction building.

| Tool | Description |
|------|-------------|
| `encode_op_return` | Encode arbitrary data into OP_RETURN script format |
| `decode_op_return` | Parse and extract data from OP_RETURN scripts |
| `build_op_return_transaction` | Construct transactions with OP_RETURN outputs |
| `parse_envelope` | Parse BTCD envelope structure from raw bytes |

### Bitcoin Core Interface

Tools for interacting with a running Bitcoin node.

| Tool | Description |
|------|-------------|
| `get_node_info` | Check connection status and network info |
| `list_utxos` | List available UTXOs for funding transactions |
| `broadcast_transaction` | Send signed transactions (dry-run by default) |
| `get_transaction` | Fetch and decode transaction details |
| `search_op_returns` | Scan blocks for OP_RETURN transactions |

### Token Operations (BRC-20)

Create and manage tokens using the [BRC-20 standard](https://domo-2.gitbook.io/brc-20-experiment/).

| Tool | Description |
|------|-------------|
| `create_token_deploy` | Deploy a new BRC-20 token |
| `create_token_mint` | Mint tokens from an existing deployment |
| `create_token_transfer` | Create a transfer inscription |

### Document Storage

Store and retrieve documents on the blockchain.

| Tool | Description |
|------|-------------|
| `embed_document` | Prepare documents for on-chain storage |
| `read_document` | Parse and extract documents from transactions |

### Timestamping & Attestation

Create cryptographic proofs of existence.

| Tool | Description |
|------|-------------|
| `create_timestamp` | Create SHA-256/SHA3 hash commitments |
| `verify_timestamp` | Verify data against on-chain timestamps |

---

## Data Envelope Format

All data uses the **BTCD envelope format** for discoverability and proper parsing:

```
┌─────────────────────────────────────────────────────────┐
│ OP_RETURN Envelope (variable size, up to ~100KB)        │
├──────────┬──────────┬──────────┬────────────────────────┤
│ Magic    │ Version  │ Type     │ Payload                │
│ (4 bytes)│ (1 byte) │ (1 byte) │ (variable)             │
├──────────┼──────────┼──────────┼────────────────────────┤
│ "BTCD"   │ 0x01     │ See below│ Type-specific data     │
└──────────┴──────────┴──────────┴────────────────────────┘
```

| Type | Hex | Description |
|------|-----|-------------|
| RAW | `0x00` | Raw bytes, no structure |
| TEXT | `0x01` | UTF-8 text |
| JSON | `0x02` | JSON document |
| HASH | `0x03` | Hash commitment (timestamp) |
| TOKEN | `0x04` | Token operation (BRC-20) |
| FILE | `0x05` | File with content-type |
| CUSTOM | `0x80+` | User-defined protocols |

---

## Configuration

### Claude Desktop Setup

Add to your Claude Desktop config:

| Platform | Config Path |
|----------|-------------|
| macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
| Windows | `%APPDATA%\Claude\claude_desktop_config.json` |
| Linux | `~/.config/Claude/claude_desktop_config.json` |

```json
{
  "mcpServers": {
    "bitcoin": {
      "command": "mcp-bitcoin-cli",
      "env": {
        "BITCOIN_NETWORK": "testnet",
        "BITCOIN_CLI_PATH": "/usr/local/bin/bitcoin-cli"
      }
    }
  }
}
```

### Configuration File

Create `~/.mcp-bitcoin-cli/config.toml`:

```toml
[connection]
method = "cli"              # "cli" or "rpc"
network = "testnet"         # "mainnet", "testnet", "signet", "regtest"

[cli]
path = "bitcoin-cli"        # Path to bitcoin-cli binary
datadir = ""                # Optional: custom datadir

[rpc]
host = "127.0.0.1"
port = 18332                # Testnet default
user = ""
password = ""

[safety]
require_confirmation = true # Prompt before broadcast
dry_run_default = true      # Always dry-run first
max_data_size = 102400      # 100KB limit
```

### Network Ports

| Network | Default RPC Port |
|---------|------------------|
| Mainnet | 8332 |
| Testnet | 18332 |
| Signet | 38332 |
| Regtest | 18443 |

---

## Examples

<details>
<summary><b>Timestamping</b></summary>

```
"Create a SHA-256 timestamp for this contract"
"Verify this document against timestamp in transaction abc123..."
"Create a SHA3-256 hash commitment for my research paper"
```

</details>

<details>
<summary><b>Document Storage</b></summary>

```
"Embed this JSON configuration on the blockchain"
"Store this text document with content-type text/plain"
"Read the document from transaction def456..."
```

</details>

<details>
<summary><b>BRC-20 Tokens</b></summary>

```
"Deploy a new token called TEST with max supply 21 million"
"Mint 1000 TEST tokens"
"Create a transfer inscription for 500 TEST"
```

</details>

<details>
<summary><b>Raw Data</b></summary>

```
"Encode this hex data into an OP_RETURN script"
"Decode the OP_RETURN from this transaction"
"Build a transaction with this message embedded"
```

</details>

---

## Architecture

```
┌─────────────────────────────────────────────────────────┐
│                    MCP Server                           │
├─────────────────────────────────────────────────────────┤
│  High-Level Tools                                       │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐   │
│  │ BRC-20 Ops  │ │ Document    │ │ Timestamp/      │   │
│  │ deploy/mint │ │ Storage     │ │ Attestation     │   │
│  └──────┬──────┘ └──────┬──────┘ └────────┬────────┘   │
│         │               │                  │            │
│  ───────┴───────────────┴──────────────────┴─────────  │
│                                                         │
│  Low-Level Primitives                                   │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐   │
│  │ encode_     │ │ decode_     │ │ build_op_return │   │
│  │ op_return   │ │ op_return   │ │ _transaction    │   │
│  └─────────────┘ └─────────────┘ └─────────────────┘   │
├─────────────────────────────────────────────────────────┤
│  Bitcoin Core Interface (configurable)                  │
│  ┌──────────────────┐  ┌────────────────────────────┐  │
│  │ bitcoin-cli      │  │ JSON-RPC (direct)          │  │
│  │ (subprocess)     │  │                            │  │
│  └──────────────────┘  └────────────────────────────┘  │
└─────────────────────────────────────────────────────────┘
```

---

## Safety Features

| Feature | Description |
|---------|-------------|
| **Testnet Default** | Network locked to testnet unless explicitly configured |
| **Dry-Run Mode** | Transactions validated before broadcast by default |
| **Fee Warnings** | Alerts for unusually high fees |
| **Size Validation** | Rejects data exceeding configured max before building |
| **Network Lock** | Can't switch networks mid-session |

---

## Development

```bash
# Clone
git clone https://github.com/EricGrill/mcp-bitcoin-cli.git
cd mcp-bitcoin-cli

# Install with dev dependencies
pip install -e ".[dev]"

# Run tests
pytest -v

# Run tests with coverage
pytest --cov=mcp_bitcoin_cli
```

### Project Structure

```
src/mcp_bitcoin_cli/
├── __init__.py          # Public exports
├── server.py            # MCP server with 16 tools
├── envelope.py          # BTCD envelope encoding/decoding
├── primitives.py        # OP_RETURN script encoding/decoding
├── config.py            # Configuration loading
├── node/
│   ├── interface.py     # Abstract node interface
│   ├── cli.py           # bitcoin-cli subprocess
│   └── rpc.py           # JSON-RPC direct connection
└── protocols/
    ├── base.py          # Base protocol class
    └── brc20.py         # BRC-20 token protocol
```

---

## Troubleshooting

<details>
<summary><b>Cannot connect to Bitcoin Core</b></summary>

1. Verify Bitcoin Core is running: `bitcoin-cli getblockchaininfo`
2. Check network matches config (testnet vs mainnet)
3. Verify RPC credentials if using JSON-RPC mode

</details>

<details>
<summary><b>Transaction rejected</b></summary>

1. Use `broadcast_transaction` with `dry_run=true` first
2. Check fee rate is sufficient
3. Verify UTXOs have enough confirmations

</details>

<details>
<summary><b>Data too large</b></summary>

- Bitcoin Core v30+ supports up to ~100KB OP_RETURN
- Older versions limited to 80 bytes
- Check `max_data_size` in config

</details>

<details>
<summary><b>Import errors</b></summary>

```bash
# Verify installation
python -c "import mcp_bitcoin_cli; print(mcp_bitcoin_cli.__version__)"

# Reinstall if needed
pip install -e ".[dev]"
```

</details>

---

## Contributing

Contributions welcome!

1. Fork the repository
2. Create feature branch: `git checkout -b feature/my-feature`
3. Make changes and test: `pytest`
4. Commit: `git commit -m 'Add my feature'`
5. Push: `git push origin feature/my-feature`
6. Open a Pull Request

---

## Related Projects

- [MCP Proxmox Admin](https://github.com/EricGrill/mcp-proxmox-admin) - Manage Proxmox VE through Claude
- [Model Context Protocol](https://modelcontextprotocol.io/) - The protocol specification
- [BRC-20 Standard](https://domo-2.gitbook.io/brc-20-experiment/) - Bitcoin token standard

---

## License

MIT

TDQS

B3.3/5.0

Scored across 16 tools

Disambiguation4/5

Most tools have distinct purposes, such as broadcast_transaction for sending transactions and get_node_info for node status. However, there is some overlap between embed_document and encode_op_return, both preparing data for embedding, which could cause minor confusion. Overall, the descriptions clarify differences, but a few tools have similar scopes.

Naming Consistency4/5

The naming follows a consistent verb_noun pattern throughout, like broadcast_transaction and decode_op_return, with clear and descriptive names. There are minor deviations, such as get_node_info using 'get' while others use verbs like 'create' or 'list', but the pattern remains largely predictable and readable.

Tool Count4/5

With 16 tools, the count is slightly high but reasonable for a Bitcoin CLI server covering transactions, tokens, documents, and network operations. It feels comprehensive without being overwhelming, though it borders on heavy for the scope. Each tool appears to serve a specific function, justifying its inclusion.

Completeness4/5

The toolset provides good coverage for Bitcoin operations, including transaction handling, token management (BRC-20), document embedding, and network queries. Minor gaps exist, such as no direct tools for wallet management or advanced blockchain queries, but core workflows like creating, broadcasting, and verifying are well-supported, allowing agents to work effectively.

Maintenance

ActivitySlowing
ResponsivenessUnresponsive