# ChargeOver MCP by usefulapi (remote · chargeover.usefulapi.io)

Read ChargeOver customers, invoices, transactions, subscriptions, reports; create customers, quotes.

- Trust score: 64/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-17

## Components

- remote · `chargeover.usefulapi.io`: 64/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-chargeover/chargeover.md), [page](https://verifymcp.io/servers/io-usefulapi-chargeover/chargeover)

## Channel facts

- Endpoint: `https://chargeover.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-17.

- **Endpoint Security**: 78/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS enforcement could not be verified: the plaintext port redirected somewhere other than https, so enforcement is unproven.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 0/100
  - Transport check failed: declared streamable-http, but the endpoint redirected instead of responding directly.
- **Schema Quality & AI Usability**: 78/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4223 tokens (~168/item across 25 items; 25 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 17/100
  - Stability observed for 5 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 25 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 26 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### How do I install the ChargeOver MCP by usefulapi server?

ChargeOver MCP by usefulapi is a hosted endpoint at https://chargeover.usefulapi.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http io-usefulapi-chargeover 'https://chargeover.usefulapi.io/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "io-usefulapi-chargeover": {
      "url": "https://chargeover.usefulapi.io/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-usefulapi-chargeover": {
      "type": "http",
      "url": "https://chargeover.usefulapi.io/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-usefulapi-chargeover]
url = "https://chargeover.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-chargeover": {
      "type": "remote",
      "url": "https://chargeover.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-chargeover --url 'https://chargeover.usefulapi.io/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-chargeover:
    url: "https://chargeover.usefulapi.io/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-usefulapi-chargeover": {
      "Transport": "http",
      "Url": "https://chargeover.usefulapi.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-usefulapi-chargeover -t streamable-http -u 'https://chargeover.usefulapi.io/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-chargeover": {
      "type": "http",
      "url": "https://chargeover.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-17 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-14 (score 63, +3)

- [security] The server rewrote its instructions, which are the text every model session reads
- [functional] The server now declares the “prompts” capability
- [functional] First check of Schema quality: 100
- [functional] New prompt “getting_started”
- [functional] Server version: 1.0.0 → 1.1.0

### 2026-10-13 (score 60, +1)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-12 (score 59)

First indexed and scored.

## MCP tools (25)

### `chargeover_list_customers` (~229 tokens)

List or search customers

List customers (companies that are billed). Filterable fields: customer_id, parent_customer_id, bill_state, ship_state, bill_country, ship_country, external_key, token, company, superuser_id, superuser_email, customer_status_state (a = active, i = inactive), customer_status_str (active-current, active-overdue, inactive-manual, inactive-activity), custom_1..custom_50, write_datetime, mod_datetime. Paged: pass next_offset as offset. GET /customer.

Input parameters:

- `filters` (array): Filters, all combined with AND. Example: [{field:'customer_id',op:'EQUALS',value:12},{field:'date',op:'GTE',value:'2026-01-01'}].
- `limit` (integer): Records per page, 1-500 (default 50).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.

### `chargeover_list_contacts` (~186 tokens)

List or search contacts

List contacts (the people at customers; the API calls them users). Filterable fields: user_id, external_key, first_name, last_name, email, phone, user_type_id, username, customers.customer_id (contacts of one customer). Paged: pass next_offset as offset. GET /user.

Input parameters:

- `filters` (array): Filters, all combined with AND. Example: [{field:'customer_id',op:'EQUALS',value:12},{field:'date',op:'GTE',value:'2026-01-01'}].
- `limit` (integer): Records per page, 1-500 (default 50).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.

### `chargeover_list_invoices` (~259 tokens)

List or search invoices

List invoices with status, totals, credits, payments and balance. Filterable fields: invoice_id, refnumber, customer_id, invoice_status_str (open-unpaid, open-overdue, open-collections, closed-void, closed-paid), invoice_status_state (o = open, c = closed), package_id, package_token, date, currency_id, total, balance, subtotal, token, bill_state, bill_country, line_items.item_id, write_datetime, mod_datetime. Paged: pass next_offset as offset. GET /invoice.

Input parameters:

- `filters` (array): Filters, all combined with AND. Example: [{field:'customer_id',op:'EQUALS',value:12},{field:'date',op:'GTE',value:'2026-01-01'}].
- `include_line_items` (boolean): true = include each record's line items (bigger reply). Default false.
- `limit` (integer): Records per page, 1-500 (default 50).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.

### `chargeover_list_transactions` (~255 tokens)

List or search transactions (read only)

List transactions (payments, refunds and credits that already happened; this tool only reads them). Filterable fields: transaction_id, customer_id, gateway_id, currency_id, creditcard_id, ach_id, tokenized_id, token, external_key, gateway_status, gateway_transid, amount, fee, transaction_type, transaction_method, transaction_detail, transaction_datetime, transaction_status.state, transaction_status.str, applied_to.invoice_id, applied_to.package_id. Paged: pass next_offset as offset. GET /transaction.

Input parameters:

- `filters` (array): Filters, all combined with AND. Example: [{field:'customer_id',op:'EQUALS',value:12},{field:'date',op:'GTE',value:'2026-01-01'}].
- `include_applied_to` (boolean): true = include the invoices each transaction was applied to (bigger reply). Default false.
- `limit` (integer): Records per page, 1-500 (default 50).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.

### `chargeover_list_quotes` (~224 tokens)

List or search quotes

List quotes (proposals for a customer or lead; the list has no line items, get one quote for those). Filterable fields: quote_id, customer_id, brand_id, currency_id, refnumber, token, external_key, date, bill_state, bill_country, quote_status_str (open-new, open-sent, closed-won, closed-lost), quote_status_state (o = open, c = closed). Paged: pass next_offset as offset. GET /quote.

Input parameters:

- `filters` (array): Filters, all combined with AND. Example: [{field:'customer_id',op:'EQUALS',value:12},{field:'date',op:'GTE',value:'2026-01-01'}].
- `limit` (integer): Records per page, 1-500 (default 50).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.

### `chargeover_list_subscriptions` (~286 tokens)

List or search subscriptions

List subscriptions (the API calls them packages): recurring billing plans of customers. Filterable fields: package_id, customer_id, token, brand_id, paymethod, paycycle (mon, qtr, yrl...), nickname, package_status_state (a active, c cancelled, e expired, s suspended), package_status_str (active-trial, active-current, active-overdue, canceled-nonpayment, canceled-manual, expired-expired, expired-trial, suspended-suspended), external_key, write_datetime, mod_datetime, cancel_datetime, line_items.item_id, customer.superuser_email, customer.users.email. Paged: pass next_offset as offset. GET /package.

Input parameters:

- `filters` (array): Filters, all combined with AND. Example: [{field:'customer_id',op:'EQUALS',value:12},{field:'date',op:'GTE',value:'2026-01-01'}].
- `include_line_items` (boolean): true = include each record's line items (bigger reply). Default false.
- `limit` (integer): Records per page, 1-500 (default 50).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.

### `chargeover_list_items` (~195 tokens)

List or search items (products and discounts)

List items: the products, services and discounts that go on invoices, quotes and subscriptions, with their pricing tiers. Filterable fields: item_id, name, external_key, accounting_sku, item_type (service or discount), custom_1, custom_2, custom_3. Paged: pass next_offset as offset. GET /item.

Input parameters:

- `filters` (array): Filters, all combined with AND. Example: [{field:'customer_id',op:'EQUALS',value:12},{field:'date',op:'GTE',value:'2026-01-01'}].
- `limit` (integer): Records per page, 1-500 (default 50).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.

### `chargeover_list_notes` (~176 tokens)

List notes

List notes attached to customers, subscriptions, invoices, contacts, quotes and items. Filterable fields: context_str (customer, billing_package, invoice, user, quote, item), context_id. Paged: pass next_offset as offset. GET /note.

Input parameters:

- `filters` (array): Filters, all combined with AND. Example: [{field:'customer_id',op:'EQUALS',value:12},{field:'date',op:'GTE',value:'2026-01-01'}].
- `limit` (integer): Records per page, 1-500 (default 50).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.

### `chargeover_list_usage` (~171 tokens)

List usage (metered) data

List usage (metered billing) data points recorded against subscription line items. Filterable fields: line_item_id, external_key, from (date), to (date). Paged: pass next_offset as offset. GET /usage.

Input parameters:

- `filters` (array): Filters, all combined with AND. Example: [{field:'customer_id',op:'EQUALS',value:12},{field:'date',op:'GTE',value:'2026-01-01'}].
- `limit` (integer): Records per page, 1-500 (default 50).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.

### `chargeover_list_coupons` (~166 tokens)

List coupons

List coupons (code, description, type, enabled, linked discount item). Filterable fields: none documented; the list is small. Paged: pass next_offset as offset. GET /coupon.

Input parameters:

- `filters` (array): Filters, all combined with AND. Example: [{field:'customer_id',op:'EQUALS',value:12},{field:'date',op:'GTE',value:'2026-01-01'}].
- `limit` (integer): Records per page, 1-500 (default 50).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.

### `chargeover_get_customer` (~54 tokens)

Get a customer

Get one customer by customer_id: company, status, addresses, primary contact, terms, balance fields, custom fields. GET /customer/{customer_id}.

Input parameters:

- `id` (integer, required): The customer_id (a number).

### `chargeover_get_contact` (~54 tokens)

Get a contact

Get one contact (user) by user_id: name, email, phone, username, the customers they belong to. GET /user/{user_id}.

Input parameters:

- `id` (integer, required): The user_id (a number).

### `chargeover_get_invoice` (~54 tokens)

Get an invoice

Get one invoice by invoice_id: status, line items, totals, balance, payments and credits applied, billing address. GET /invoice/{invoice_id}.

Input parameters:

- `id` (integer, required): The invoice_id (a number).

### `chargeover_get_transaction` (~63 tokens)

Get a transaction (read only)

Get one transaction (payment, refund or credit that already happened) by transaction_id: amount, method, status, the invoices it was applied to, related refunds. GET /transaction/{transaction_id}.

Input parameters:

- `id` (integer, required): The transaction_id (a number).

### `chargeover_get_quote` (~55 tokens)

Get a quote

Get one quote by quote_id: status, line items, totals, memo, links to the invoice or subscription it became. GET /quote/{quote_id}.

Input parameters:

- `id` (integer, required): The quote_id (a number).

### `chargeover_get_subscription` (~55 tokens)

Get a subscription

Get one subscription (package) by package_id: status, payment cycle, pay method, next invoice date, line items. GET /package/{package_id}.

Input parameters:

- `id` (integer, required): The package_id (a number).

### `chargeover_get_item` (~55 tokens)

Get an item

Get one item (product, service or discount) by item_id: name, type, SKU, pricing tiers per currency. GET /item/{item_id}.

Input parameters:

- `id` (integer, required): The item_id (a number).

### `chargeover_list_reports` (~35 tokens)

List reports

List the account's saved reports (report_id and name). Run one with chargeover_run_report. GET /_report.

### `chargeover_get_report` (~71 tokens)

Get a report's definition

A report's name, its available_filters (field names and allowed operators), available_columns and default_columns. Read this before chargeover_run_report to know which filters and columns to use. GET /_report/{report_id}.

Input parameters:

- `report_id` (integer, required): The report_id from chargeover_list_reports.

### `chargeover_run_report` (~241 tokens)

Run a report

Run a saved report and return its rows (read only; nothing is changed). Filters use the report's own field names from chargeover_get_report, for example [{field:'transaction_transaction_date',op:'GTE',value:'2026-01-01'}]. Operators vary by field (dates GTE/LTE/EQUALS, ids EQUALS, strings CONTAINS/DOES_NOT_CONTAIN). To page (offset > 0) an order is required. Max 1000 rows per page. POST /_report/{report_id}/_action/reportData.

Input parameters:

- `columns` (array): Column names to return (default: the report's default columns).
- `filters` (array): Report filters (combined with AND).
- `limit` (integer): Rows per page, 1-1000 (default 100).
- `offset` (integer): Records to skip (default 0). Use next_offset from the previous reply.
- `order` (string): Sort as field:ASC or field:DESC, for example invoice_id:DESC.
- `report_id` (integer, required): The report_id from chargeover_list_reports.

### `chargeover_create_customer` (~321 tokens)

Create a customer

WRITE: create a new customer (no charge, no invoice, no email is sent by this call). Returns the new customer_id. Add a primary contact with the superuser_* fields. Use chargeover_list_customers first to avoid a duplicate (external_key is unique). POST /customer.

Input parameters:

- `bill_addr1` (string): Billing address line 1.
- `bill_addr2` (string): Billing address line 2.
- `bill_city` (string): Billing city.
- `bill_country` (string): Billing country.
- `bill_postcode` (string): Billing postal code.
- `bill_state` (string): Billing state/province.
- `company` (string, required): Company / customer name.
- `external_key` (string): Your own unique id for the customer (cannot be reused by default, even after deletion).
- `parent_customer_id` (integer): Parent customer id, to create a child customer.
- `ship_addr1` (string): Shipping address line 1.
- `ship_addr2` (string): Shipping address line 2.
- `ship_city` (string): Shipping city.
- `ship_country` (string): Shipping country.
- `ship_postcode` (string): Shipping postal code.
- `ship_state` (string): Shipping state/province.
- `superuser_email` (string): Primary contact email address.
- `superuser_first_name` (string): Primary contact first name.
- `superuser_last_name` (string): Primary contact last name.
- `superuser_phone` (string): Primary contact phone number.

### `chargeover_update_customer` (~301 tokens)

Update a customer

WRITE: change fields of an existing customer; send only the fields to change. Cannot touch payment methods, balances or status. Replaces the previous values of the fields you send. PUT /customer/{customer_id}.

Input parameters:

- `bill_addr1` (string): Billing address line 1.
- `bill_addr2` (string): Billing address line 2.
- `bill_city` (string): Billing city.
- `bill_country` (string): Billing country.
- `bill_postcode` (string): Billing postal code.
- `bill_state` (string): Billing state/province.
- `company` (string): New company / customer name.
- `customer_id` (integer, required): The customer_id to update.
- `external_key` (string): Your own unique id for the customer (cannot be reused by default, even after deletion).
- `ship_addr1` (string): Shipping address line 1.
- `ship_addr2` (string): Shipping address line 2.
- `ship_city` (string): Shipping city.
- `ship_country` (string): Shipping country.
- `ship_postcode` (string): Shipping postal code.
- `ship_state` (string): Shipping state/province.
- `superuser_email` (string): Primary contact email address.
- `superuser_first_name` (string): Primary contact first name.
- `superuser_last_name` (string): Primary contact last name.
- `superuser_phone` (string): Primary contact phone number.

### `chargeover_create_contact` (~143 tokens)

Add a contact to a customer

WRITE: add a contact (person) to an existing customer. No email is sent by this call. Returns the new user_id. POST /user.

Input parameters:

- `customer_id` (integer, required): The customer the contact belongs to.
- `email` (string): Email address.
- `external_key` (string): Your own unique id for the contact.
- `first_name` (string): First name.
- `last_name` (string): Last name.
- `mobile` (string): Mobile number.
- `name` (string): Full name (alternative to first_name and last_name).
- `phone` (string): Phone number.
- `title` (string): Job title.

### `chargeover_create_note` (~120 tokens)

Add a note

WRITE: add a note to a customer, subscription, invoice, contact, quote or item (shown in the ChargeOver UI to the team; never sent to the customer). Returns the note id. POST /note.

Input parameters:

- `context_id` (integer, required): The id of that record (customer_id, package_id, invoice_id, user_id, quote_id or item_id).
- `context_str` (string, required): What the note is attached to (billing_package = a subscription, user = a contact).
- `note` (string, required): The note text.

### `chargeover_create_quote` (~251 tokens)

Create a quote

WRITE: create a quote (a proposal) for an existing customer. Nothing is billed and no email is sent: the quote stays open until someone sends or accepts it in ChargeOver. Each line refers to an existing item (chargeover_list_items). paycycle: one = one-time invoice, mon = monthly, 2mn = every 2 months, qtr = quarterly, six = every 6 months, yrl = yearly, 2yr, 3yr, 1wk = weekly, 2wk. Returns the new quote_id. POST /quote.

Input parameters:

- `customer_id` (integer, required): The customer the quote is for.
- `date` (string): A date as YYYY-MM-DD.
- `external_key` (string): Your own unique id for the quote.
- `line_items` (array, required): At least one line.
- `memo` (string): Memo shown to the customer on the quote.
- `nickname` (string): Nickname of the quote.
- `paycycle` (string, required): Billing cycle of the quote.
- `refnumber` (string): Your reference number for the quote.
- `validuntil_date` (string): Quote valid until, YYYY-MM-DD.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-chargeover/chargeover#diagnostics

## Score history

- 2026-10-17: 64
- 2026-10-16: 63
- 2026-10-15: 63
- 2026-10-14: 63
- 2026-10-13: 60
- 2026-10-12: 59

## Common questions

### What is the ChargeOver MCP by usefulapi server?

ChargeOver MCP by usefulapi is listed in the public MCP registry as io.usefulapi/chargeover. Read ChargeOver customers, invoices, transactions, subscriptions, reports; create customers, quotes. This page covers its hosted endpoint (https://chargeover.usefulapi.io/mcp).

### Is the ChargeOver MCP by usefulapi server safe to use?

ChargeOver MCP by usefulapi scores 64 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the ChargeOver MCP by usefulapi server expose?

ChargeOver MCP by usefulapi exposes 25 tools: chargeover_list_customers, chargeover_list_contacts, chargeover_list_invoices, chargeover_list_transactions, chargeover_list_quotes, and 20 more. Their descriptions and schemas cost roughly 4,020 tokens of context every time the server is loaded.

### Does the ChargeOver MCP by usefulapi server require authentication?

Yes. ChargeOver MCP by usefulapi asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the ChargeOver MCP by usefulapi server still maintained?

ChargeOver MCP by usefulapi is still listed as active in the MCP registry. We last reached this channel on 17 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://chargeover.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Website: https://usefulapi.io/chargeover/
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-chargeover/chargeover.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-chargeover/chargeover.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-chargeover/chargeover
