MCP server by theepicsaxguy
OpenCollective MCP Server
A Model Context Protocol server that gives AI agents programmatic access to OpenCollective, Hetzner Cloud, and Cloudflare — 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:
- Log into Hetzner → navigate to invoices → download the PDF
- Manually extract the amount, date, and line items
- Log into OpenCollective → create a new expense → copy-paste the data
- 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
# 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"]
)
# 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_graphqltool 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
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:
cp .env.example .env
# Edit .env with your credentials
| Variable | Required for | How to get it |
|----------|-------------|---------------|
| OPENCOLLECTIVE_TOKEN | Write operations | OpenCollective 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 → My Profile → API Tokens → Create Token with "Billing:Read" permission |
3. Run the server
# Direct
python -m opencollective_mcp
# Or via installed script
opencollective-mcp
4. Connect to Claude Desktop
Add to your ~/.claude.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 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, httpx, and Playwright.