OpenCollective MCP Server
Enables automated retrieval and parsing of Hetzner Cloud invoices, including fetching invoice PDFs, extracting structured data, and accessing line-item details.
Provides programmatic access to the OpenCollective GraphQL API v2 to manage collectives, search accounts, process expenses, query ledger transactions, and handle member information.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@OpenCollective MCP Server Submit the latest Hetzner invoice as an expense to my collective"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
Related MCP server: omie-finance-mcp
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 |
| Get detailed info about any collective (balance, stats, social links) |
| Search across all OpenCollective accounts |
| Get the authenticated user's account |
| Update collective profile (name, description, tags, currency) |
| List members, backers, and their donation totals |
| Query expenses with rich filters (status, type, date, tags) |
| Get full expense details by ID |
| Submit new expenses (INVOICE, RECEIPT, GRANT, etc.) |
| Modify existing expenses |
| Remove expenses |
| Approve, reject, pay, hold, or release expenses |
| Query the ledger (credits/debits, linked expenses) |
| Escape hatch for any GraphQL operation |
Hetzner Operations (6 tools)
Tool | What it does |
| List all invoices (paginated) |
| Get a specific invoice by ID |
| Fetch the most recent invoice |
| Download invoice as PDF (base64) |
| Extract structured data from invoice PDF |
| Get line-item breakdown from usage portal |
Cloudflare Operations (3 tools)
Tool | What it does |
| List billing history (paginated). Auto-converts USD to EUR using historical ECB rates |
| Get a specific billing item by ID. Includes EUR conversion |
| Fetch the most recent billing item. Returns |
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 forecastingNot 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 credentialsVariable | Required for | How to get it |
| Write operations | OpenCollective dashboard → For Developers → Personal Tokens |
| Hetzner invoice tools | Your Hetzner account email |
| Hetzner invoice tools | Your Hetzner password |
| Hetzner invoice tools (if 2FA) | Shown when you enable 2FA |
| 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-mcp4. 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.
Available Tools
24 toolscloudflare_get_invoiceARead-onlyIdempotent
Get details of a specific Cloudflare billing item by ID.
When convert_to_eur is True (default), automatically converts USD amounts to EUR using historical exchange rates from the European Central Bank.
Returns invoice with:
amount: Original amount (usually USD)
currency: Original currency code
amount_eur: Converted EUR amount (when conversion enabled)
amount_cents_eur: EUR amount in cents (for OpenCollective)
exchange_rate: Rate used for conversion
rate_date: Date the exchange rate was fetched
Requires CLOUDFLARE_API_TOKEN to be set.
Inputs: params (required), ctx. Returns: result
cloudflare_get_latest_invoiceARead-only
Get the most recent Cloudflare billing item.
Fetches the latest billing item with cost and date. When convert_to_eur is True (default), automatically converts USD amounts to EUR using historical exchange rates from the European Central Bank.
Returns invoice with:
amount: Original amount (usually USD)
currency: Original currency code
amount_eur: Converted EUR amount (when conversion enabled)
amount_cents_eur: EUR amount in cents (ready for OpenCollective)
exchange_rate: Rate used for conversion
rate_date: Date the exchange rate was fetched
Requires CLOUDFLARE_API_TOKEN to be set.
Useful for automated monthly bookkeeping: fetch the latest Cloudflare bill and then use oc_create_expense to submit it to OpenCollective.
Inputs: params (required), ctx. Returns: result
cloudflare_list_invoicesARead-onlyIdempotent
List billing history from Cloudflare.
Returns billing items with cost and date. When convert_to_eur is True (default), automatically converts USD amounts to EUR using historical exchange rates from the European Central Bank (via Frankfurter API).
Each invoice includes:
amount: Original amount (usually USD)
currency: Original currency code
amount_eur: Converted EUR amount (when conversion enabled)
amount_cents_eur: EUR amount in cents (for OpenCollective)
exchange_rate: Rate used for conversion
rate_date: Date the exchange rate was fetched
Requires CLOUDFLARE_API_TOKEN to be set. Uses the Cloudflare API (deprecated but functional /user/billing/history endpoint).
Inputs: params (required), ctx. Returns: result
hetzner_get_invoiceARead-onlyIdempotent
Get details of a specific Hetzner Cloud invoice by ID.
Requires HETZNER_ACCOUNT_EMAIL and HETZNER_ACCOUNT_PASSWORD to be set.
Inputs: params (required), ctx. Returns: result
hetzner_get_invoice_detailsARead-onlyIdempotent
Get detailed invoice information from Hetzner usage portal.
Fetches invoice line items as CSV from usage.hetzner.com. Requires HETZNER_ACCOUNT_EMAIL, HETZNER_ACCOUNT_PASSWORD, and HETZNER_CUSTOMER_NUMBER to be set.
Inputs: params (required), ctx. Returns: result
hetzner_get_invoice_pdfARead-onlyIdempotent
Download a Hetzner invoice as PDF.
Returns the PDF content as base64-encoded string. Requires HETZNER_ACCOUNT_EMAIL and HETZNER_ACCOUNT_PASSWORD to be set.
Inputs: params (required), ctx. Returns: result
hetzner_get_latest_invoiceARead-only
Get the most recent Hetzner Cloud invoice.
Fetches the first page of invoices and returns the latest one. Requires HETZNER_ACCOUNT_EMAIL and HETZNER_ACCOUNT_PASSWORD to be set.
Useful for automated monthly bookkeeping: fetch the latest Hetzner invoice and then use oc_create_expense to submit it to OpenCollective.
Inputs: ctx. Returns: result
hetzner_list_invoicesARead-onlyIdempotent
List invoices from Hetzner Cloud.
Returns paginated invoice data. Requires HETZNER_ACCOUNT_EMAIL and HETZNER_ACCOUNT_PASSWORD to be set. Uses browser automation to fetch invoices from accounts.hetzner.com.
Inputs: params (required), ctx. Returns: result
hetzner_parse_invoice_pdfARead-onlyIdempotent
Download and parse a Hetzner invoice PDF to JSON.
Extracts invoice data like invoice number, date, amount, net, VAT, etc. Requires HETZNER_ACCOUNT_EMAIL and HETZNER_ACCOUNT_PASSWORD to be set.
Inputs: params (required), ctx. Returns: result
oc_create_expenseA
Submit a new expense to an OpenCollective collective.
Supports INVOICE, RECEIPT, FUNDING_REQUEST, GRANT, and UNCLASSIFIED types. Each expense requires at least one line item with description and amount.
The payee is the account that will receive the payment. The account is the collective the expense is submitted to. Requires authentication.
For bookkeeping expenses (e.g. when collective has negative balance), submit as INVOICE type.
Inputs: params (required), ctx. Returns: result
oc_delete_expenseBDestructiveIdempotent
Delete an expense. Requires authentication and appropriate permissions.
Inputs: params (required), ctx. Returns: result
oc_edit_accountAIdempotent
Edit an OpenCollective account/collective profile.
Requires authentication. Use oc_get_account first to obtain the account ID. Only provided fields will be updated.
Inputs: params (required), ctx. Returns: result
oc_edit_account_settingAIdempotent
Edit an account setting like monthly spending limits.
Requires authentication with account scope. Common keys:
'expensesMonthlyLimit': Monthly expense limit in EUR
'VIRTUAL_CARDS_MAX_MONTHLY_AMOUNT': Max monthly virtual card spending
'VIRTUAL_CARDS_MAX_DAILY_AMOUNT': Max daily virtual card spending
Inputs: params (required), ctx. Returns: result
oc_edit_expenseAIdempotent
Edit an existing expense. Only provided fields will be updated.
Requires authentication and appropriate permissions.
Inputs: params (required), ctx. Returns: result
oc_execute_graphqlA
Execute a raw GraphQL query or mutation against the OpenCollective API v2.
Use this as an escape hatch for operations not covered by other tools. The API endpoint is https://api.opencollective.com/graphql/v2. Authentication is applied automatically if OPENCOLLECTIVE_TOKEN is set.
Inputs: params (required), ctx. Returns: result
oc_get_accountARead-onlyIdempotent
Get detailed information about an OpenCollective account/collective by slug.
Returns account profile, stats (balance, budget, total received/spent), social links, and metadata. Works without authentication for public data.
Inputs: params (required), ctx. Returns: result
oc_get_expenseARead-onlyIdempotent
Get detailed information about a specific expense by ID or legacy ID.
Inputs: params (required), ctx. Returns: result
oc_get_logged_in_accountARead-onlyIdempotent
Get information about the currently authenticated account.
Requires OPENCOLLECTIVE_TOKEN to be set.
Inputs: ctx. Returns: result
oc_get_membersARead-onlyIdempotent
List members and backers of an OpenCollective account.
Returns member roles (ADMIN, MEMBER, BACKER, etc.), donation totals, and linked account info.
Inputs: params (required), ctx. Returns: result
oc_list_expensesARead-onlyIdempotent
List expenses for an OpenCollective account with filtering.
Supports filtering by status, type, tags, date range, and search term. Use account_slug to filter by collective, from_account_slug to filter by payee.
Inputs: params (required), ctx. Returns: result
oc_list_transactionsARead-onlyIdempotent
List transactions for an OpenCollective account (the ledger).
Shows credits and debits with amounts, descriptions, linked expenses/orders. Supports filtering by type (CREDIT/DEBIT), date range, kind, and search term.
Inputs: params (required), ctx. Returns: result
oc_process_expenseA
Process an expense: approve, reject, pay, hold, release, etc.
Available actions: APPROVE, UNAPPROVE, REQUEST_RE_APPROVAL, REJECT, MARK_AS_UNPAID, SCHEDULE_FOR_PAYMENT, UNSCHEDULE_PAYMENT, PAY, MARK_AS_SPAM, MARK_AS_INCOMPLETE, HOLD, RELEASE.
Requires authentication and admin/host permissions.
Inputs: params (required), ctx. Returns: result
oc_search_accountsARead-onlyIdempotent
Search for OpenCollective accounts/collectives.
Supports filtering by search term and account type (COLLECTIVE, ORGANIZATION, INDIVIDUAL, FUND, PROJECT, EVENT).
Inputs: params (required), ctx. Returns: result
oc_set_budgetAIdempotent
Set the yearly budget goal for a collective.
Example: Set 800 EUR yearly budget for goingdark collective. Requires token with 'account' scope.
Inputs: params (required), ctx. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 24 tools
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).
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.
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.
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
Related MCP Connectors
The whole back office for your AI agent: CRM, invoices, books, email and more. Pay per action.
Accounts receivable automation for Xero and QuickBooks Online, inside your AI assistant. Ask Claude, ChatGPT or any MCP client for a receivables summary, find customers and invoices, read the email and SMS replies your customers sent, and see what Paidnice sent or skipped. Ask why a reminder, late fee or statement did or did not go out, and update a customer's contact people straight into your ledger. Secure OAuth sign-in. One connection covers every organisation you tick, with Read or Read and Write access.
Create EU-compliant invoices, manage clients and download PDFs from your AI assistant.
Holded MCP server for ChatGPT, Claude and any AI agent: create invoice, send invoice, create expense, add contact and list unpaid invoices in your own Holded account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Holded yourself; Cotlet does not store your password and you need no Holded API key. About the official Holded API: Yes, Holded has a REST API, and it is only on paid plans (checked 14 Oct 2026). You create a key in Settings > Developers > Credentials > Add API Token, choose read, write or full access per module, and the plan sets a monthly call limit. Setup and FAQ: https://cotlet.dev/integrations/holded-api-mcp-server
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to read and write Cynco accounting data, including querying books, creating invoices, reconciling transactions, and generating financial reports.9 npm1MIT
- AlicenseBqualityDmaintenanceExposes OMIE ERP's financial API as MCP tools, enabling AI agents to query bills, process payments, generate boletos/PIX, and read cash flow via natural language.541MIT
- AlicenseBqualityBmaintenanceEnables AI assistants to query and manage self-hosted accounting data—invoices, balances, and books—through natural language, with read-only tools by default and optional scoped write operations.3025 PyPI1AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to query a connected accounting platform for organisations, invoices, contacts, chart of accounts, and profit-and-loss reports, supporting bookkeeping, AR/AP, and financial reporting workflows.299 npmMIT