Skip to main content
Glama
OpenCollective MCP Server

OpenCollective MCP Server

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:

  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.

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

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_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

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.

Available Tools

24 tools
cloudflare_get_invoiceA
Read-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_invoiceA
Read-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_invoicesA
Read-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_invoiceA
Read-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_detailsA
Read-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_pdfA
Read-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_invoiceA
Read-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_invoicesA
Read-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_pdfA
Read-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_expenseB
DestructiveIdempotent

Delete an expense. Requires authentication and appropriate permissions.

Inputs: params (required), ctx. Returns: result

oc_edit_accountA
Idempotent

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_settingA
Idempotent

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_expenseA
Idempotent

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_accountA
Read-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_expenseA
Read-onlyIdempotent

Get detailed information about a specific expense by ID or legacy ID.

Inputs: params (required), ctx. Returns: result

oc_get_logged_in_accountA
Read-onlyIdempotent

Get information about the currently authenticated account.

Requires OPENCOLLECTIVE_TOKEN to be set.

Inputs: ctx. Returns: result

oc_get_membersA
Read-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_expensesA
Read-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_transactionsA
Read-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_accountsA
Read-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_budgetA
Idempotent

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

    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 recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI agents to read and write Cynco accounting data, including querying books, creating invoices, reconciling transactions, and generating financial reports.
      9 npm
      1
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Enables 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.
      30
      25 PyPI
      1
      AGPL 3.0
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables 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 npm
      MIT