Skip to main content
Glama
theepicsaxguy

OpenCollective MCP Server

README.md
# OpenCollective MCP Server

A [Model Context Protocol](https://modelcontextprotocol.io/) server that gives AI agents programmatic access to [OpenCollective](https://opencollective.com/), [Hetzner Cloud](https://www.hetzner.com/), and [Cloudflare](https://www.cloudflare.com/) — enabling automated bookkeeping, collective management, and invoice handling without manual intervention.

## What is it?

This MCP server exposes 22 tools that let AI agents interact with:

- **OpenCollective GraphQL API v2** — Manage collectives, submit expenses, process payments, query transactions, and handle members
- **Hetzner Cloud invoices** — Automatically fetch, parse, and reconcile hosting invoices
- **Cloudflare billing** — Track CDN and hosting costs via the billing history API

### The Problem

If you run an OpenCollective-backed project with infrastructure on Hetzner, you face a tedious monthly ritual:

1. Log into Hetzner → navigate to invoices → download the PDF
2. Manually extract the amount, date, and line items
3. Log into OpenCollective → create a new expense → copy-paste the data
4. Submit and wait for approval

Repeat every month. Forever.

**This MCP automates it.**

## Who is it for?

- **Open collective maintainers** who want to automate expense workflows
- **DevOps engineers** running infrastructure on Hetzner who track costs via OpenCollective
- **AI developers** building agents that need to manage budgets, expenses, or financial reporting
- **Bookkeepers** tired of copy-pasting invoice data between systems

## What can it do?

### OpenCollective Operations (13 tools)

| Tool | What it does |
|------|--------------|
| `oc_get_account` | Get detailed info about any collective (balance, stats, social links) |
| `oc_search_accounts` | Search across all OpenCollective accounts |
| `oc_get_logged_in_account` | Get the authenticated user's account |
| `oc_edit_account` | Update collective profile (name, description, tags, currency) |
| `oc_get_members` | List members, backers, and their donation totals |
| `oc_list_expenses` | Query expenses with rich filters (status, type, date, tags) |
| `oc_get_expense` | Get full expense details by ID |
| `oc_create_expense` | Submit new expenses (INVOICE, RECEIPT, GRANT, etc.) |
| `oc_edit_expense` | Modify existing expenses |
| `oc_delete_expense` | Remove expenses |
| `oc_process_expense` | Approve, reject, pay, hold, or release expenses |
| `oc_list_transactions` | Query the ledger (credits/debits, linked expenses) |
| `oc_execute_graphql` | Escape hatch for any GraphQL operation |

### Hetzner Operations (6 tools)

| Tool | What it does |
|------|--------------|
| `hetzner_list_invoices` | List all invoices (paginated) |
| `hetzner_get_invoice` | Get a specific invoice by ID |
| `hetzner_get_latest_invoice` | Fetch the most recent invoice |
| `hetzner_get_invoice_pdf` | Download invoice as PDF (base64) |
| `hetzner_parse_invoice_pdf` | Extract structured data from invoice PDF |
| `hetzner_get_invoice_details` | Get line-item breakdown from usage portal |

### Cloudflare Operations (3 tools)

| Tool | What it does |
|------|--------------|
| `cloudflare_list_invoices` | List billing history (paginated). Auto-converts USD to EUR using historical ECB rates |
| `cloudflare_get_invoice` | Get a specific billing item by ID. Includes EUR conversion |
| `cloudflare_get_latest_invoice` | Fetch the most recent billing item. Returns `amount_cents_eur` ready for OpenCollective |

## The Monthly Bookkeeping Workflow

```python
# 1. Fetch the latest Hetzner invoice
invoice = hetzner_get_latest_invoice()

# 2. Submit it as an expense to your collective
oc_create_expense(
    account_slug="my-collective",
    description=f"Hetzner Cloud - {invoice['date']}",
    expense_type="INVOICE",
    payee_slug="my-org",
    items=[{
        "description": f"Cloud services - {invoice['date']}",
        "amount_cents": invoice['amount_cents'],
        "currency": "EUR"
    }],
    tags=["hetzner", "hosting"]
)
```

```python
# For Cloudflare (automatically converts USD to EUR)
invoice = cloudflare_get_latest_invoice()

oc_create_expense(
    account_slug="my-collective",
    description=f"Cloudflare - {invoice['date']}",
    expense_type="INVOICE",
    payee_slug="my-org",
    items=[{
        "description": f"Cloudflare services - {invoice['date']}",
        "amount_cents": invoice['amount_cents_eur'],  # Already converted!
        "currency": "EUR"
    }],
    tags=["cloudflare", "hosting", "cdn"]
)
```

That's it. One agent prompt = one booked expense.

## What it's NOT

- **Not a replacement for human judgment** — Expenses still need approval based on your collective's policies
- **Not a financial advisory tool** — It moves data, not money; you control the payouts
- **Not limited to Hetzner** — The `oc_execute_graphql` tool lets you run any OpenCollective operation, so you can manage Stripe payouts, Wise transfers, or budget forecasting
- **Not a GUI** — It's a backend for AI agents; use the OpenCollective dashboard for manual tasks

## Quick Start

### 1. Clone and install

```bash
git clone https://github.com/your-org/opencollective-mcp.git
cd opencollective-mcp
pip install -e .
```

### 2. Configure environment

Copy `.env.example` to `.env` and fill in:

```bash
cp .env.example .env
# Edit .env with your credentials
```

| Variable | Required for | How to get it |
|----------|-------------|---------------|
| `OPENCOLLECTIVE_TOKEN` | Write operations | [OpenCollective dashboard](https://opencollective.com/dashboard) → For Developers → Personal Tokens |
| `HETZNER_ACCOUNT_EMAIL` | Hetzner invoice tools | Your Hetzner account email |
| `HETZNER_ACCOUNT_PASSWORD` | Hetzner invoice tools | Your Hetzner password |
| `HETZNER_TOTP_SECRET` | Hetzner invoice tools (if 2FA) | Shown when you enable 2FA |
| `CLOUDFLARE_API_TOKEN` | Cloudflare billing tools | [Cloudflare dashboard](https://dash.cloudflare.com) → My Profile → API Tokens → Create Token with "Billing:Read" permission |

### 3. Run the server

```bash
# Direct
python -m opencollective_mcp

# Or via installed script
opencollective-mcp
```

### 4. Connect to Claude Desktop

Add to your `~/.claude.json`:

```json
{
  "mcpServers": {
    "opencollective": {
      "command": "python",
      "args": ["-m", "opencollective_mcp"],
      "env": {
        "OPENCOLLECTIVE_TOKEN": "your-token",
        "HETZNER_ACCOUNT_EMAIL": "you@example.com",
        "HETZNER_ACCOUNT_PASSWORD": "your-password",
        "CLOUDFLARE_API_TOKEN": "your-cloudflare-token"
      }
    }
  }
}
```

## Why build this?

Because **infrastructure costs should be visible, automated, and auditable** — exactly what OpenCollective provides for open source projects.

We built this to solve our own bookkeeping pain: tracking Hetzner hosting costs for [Going Dark](https://opencollective.com/goingdark) and automatically submitting them as expenses each month. Now our AI agent does it.

If you run a collective with cloud infrastructure, this saves you 15–30 minutes every month — and eliminates human error from manual data entry.

## License

Apache License 2.0

---

Built with [FastMCP](https://github.com/modelcontextprotocol/python-sdk), [httpx](https://www.python-httpx.org/), and [Playwright](https://playwright.dev/).

TDQS

A4.1/5.0

Scored across 24 tools

Disambiguation5/5

Tools are clearly separated by prefix (cloudflare_, hetzner_, oc_) and each tool has a distinct purpose. There is no ambiguity between tools from different services, and within groups, operations are well-differentiated (e.g., list vs. get, create vs. edit).

Naming Consistency5/5

All tools follow a consistent naming pattern: provider/domain prefix + verb_noun in snake_case (e.g., cloudflare_list_invoices, oc_create_expense). No mixing of conventions or irregular names.

Tool Count4/5

With 24 tools across three services, the count is slightly high but still reasonable for a multi-service integration server. Each service has a focused set of operations, and the number does not feel excessive.

Completeness5/5

The tool set covers core CRUD operations for Cloudflare invoices, Hetzner invoices, and OpenCollective expenses/accounts, plus additional utilities like currency conversion, PDF parsing, and a GraphQL escape hatch. The surface is comprehensive for the stated bookkeeping and expense management domain.

Maintenance

ActivityInactive
ResponsivenessNo issues