# io.usefulapi/codat (remote · codat.usefulapi.io)

MCP server for Codat — companies, connections, invoices, bills and financial statements.

- Trust score: 72/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

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

## Channel facts

- Endpoint: `https://codat.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.1`

## 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-08-03.

- **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 not yet verified: we couldn't determine whether a plaintext access path exists.
  - 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**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 73/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3930 tokens (~140/item across 28 items; 28 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 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.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### Claude

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

### Codex

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

### opencode

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

### OpenClaw

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

### Hermes

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

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-codat": {
      "type": "http",
      "url": "https://codat.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-08-02 (score 72, +1)

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

### 2026-07-31 (score 71, +3)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 68, −2)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 70, +1)

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

### 2026-07-28 (score 69, +1)

- [functional improvement] Stability: unverified → 0.03

### 2026-07-27 (score 68, +56)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 12)

First indexed and scored.

## MCP tools (28)

### `codat_get_profile` (~46 tokens)

Get account profile

Fetch the authenticated Codat account's profile (organization name, redirect URLs, features) — a quick way to verify the API key works. Codat API: GET /profile.

### `codat_list_companies` (~167 tokens)

List companies

List the companies in your Codat account. A company represents one of your customers' businesses and holds its data connections. Codat API: GET /companies. Returns the paged envelope { results, pageNumber, pageSize, totalResults, _links }.

Input parameters:

- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_get_company` (~55 tokens)

Get a company

Fetch a single company by id (name, platform, dataConnections, created/lastSync). Codat API: GET /companies/{companyId}.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).

### `codat_list_connections` (~171 tokens)

List data connections

List a company's data connections (each links the company to one source platform, e.g. QuickBooks, Xero). Codat API: GET /companies/{companyId}/connections. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_get_connection` (~81 tokens)

Get a data connection

Fetch a single data connection by id (platformKey, status, sourceType, lastSync). Codat API: GET /companies/{companyId}/connections/{connectionId}.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `connectionId` (string, required): The Codat connectionId (data connection UUID) within the company.

### `codat_get_data_status` (~77 tokens)

Get data status

Get the freshness/status of each accounting data type for a company (lastSuccessfulSync, currentStatus, dataType). Use this to check whether a dataset has been pulled before reading it. Codat API: GET /companies/{companyId}/dataStatus.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).

### `codat_get_data_info` (~55 tokens)

Get accounting metadata

Get a company's accounting metadata (base currency, supported data types, etc.). Codat API: GET /companies/{companyId}/data/info.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).

### `codat_list_integrations` (~150 tokens)

List integrations

List the accounting/commerce/banking platforms (integrations) Codat supports, with their platformKey. Codat API: GET /integrations. Returns the paged envelope.

Input parameters:

- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_list_accounts` (~171 tokens)

List chart of accounts

List a company's chart of accounts (id, name, nominalCode, type, status, currency, currentBalance). Codat API: GET /companies/{companyId}/data/accounts. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_list_invoices` (~205 tokens)

List invoices

List a company's accounts-receivable invoices (id, invoiceNumber, customerRef, issueDate, dueDate, currency, totalAmount, amountDue, status, lineItems). Codat API: GET /companies/{companyId}/data/invoices. Returns the paged envelope. Tip: filter with query, e.g. "status=Submitted&&amountDue>0".

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_get_invoice` (~73 tokens)

Get an invoice

Fetch a single AR invoice by id (full object incl. lineItems, paymentAllocations). Codat API: GET /companies/{companyId}/data/invoices/{invoiceId}.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `invoiceId` (string, required): The invoice id.

### `codat_list_bills` (~184 tokens)

List bills

List a company's accounts-payable bills (id, reference, supplierRef, issueDate, dueDate, currency, totalAmount, amountDue, status, lineItems). Codat API: GET /companies/{companyId}/data/bills. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_list_bill_payments` (~179 tokens)

List bill payments

List a company's bill payments (money paid out to suppliers) — id, supplierRef, date, currency, totalAmount, lines. Codat API: GET /companies/{companyId}/data/billPayments. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_list_credit_notes` (~179 tokens)

List credit notes

List a company's credit notes (id, creditNoteNumber, customerRef, issueDate, currency, totalAmount, remainingCredit, status). Codat API: GET /companies/{companyId}/data/creditNotes. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_list_customers` (~173 tokens)

List customers

List a company's customers (id, customerName, contactName, emailAddress, addresses, status, defaultCurrency). Codat API: GET /companies/{companyId}/data/customers. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_list_suppliers` (~175 tokens)

List suppliers

List a company's suppliers/vendors (id, supplierName, contactName, emailAddress, addresses, status, defaultCurrency). Codat API: GET /companies/{companyId}/data/suppliers. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_list_payments` (~179 tokens)

List payments

List a company's payments received (money in against invoices) — id, customerRef, date, currency, totalAmount, lines/allocations. Codat API: GET /companies/{companyId}/data/payments. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_list_journal_entries` (~176 tokens)

List journal entries

List a company's journal entries (id, postedOn, createdOn, journalLines with accountRef/netAmount/currency). Codat API: GET /companies/{companyId}/data/journalEntries. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_get_balance_sheet` (~136 tokens)

Get balance sheet

Get a company's balance sheet, broken into periods. periodLength (months per period) and periodsToCompare are BOTH required by Codat. Codat API: GET /companies/{companyId}/data/financials/balanceSheet.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `periodLength` (integer, required): Number of months per period (1-12). Required.
- `periodsToCompare` (integer, required): How many periods to return (1-12). Required.
- `startMonth` (string): First month of the earliest period (YYYY-MM-DD); defaults to the most recent.

### `codat_get_profit_and_loss` (~137 tokens)

Get profit & loss

Get a company's profit and loss (income statement), broken into periods. periodLength and periodsToCompare are BOTH required by Codat. Codat API: GET /companies/{companyId}/data/financials/profitAndLoss.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `periodLength` (integer, required): Number of months per period (1-12). Required.
- `periodsToCompare` (integer, required): How many periods to return (1-12). Required.
- `startMonth` (string): First month of the earliest period (YYYY-MM-DD); defaults to the most recent.

### `codat_get_cash_flow_statement` (~134 tokens)

Get cash flow statement

Get a company's cash flow statement, broken into periods. periodLength and periodsToCompare are BOTH required by Codat. Codat API: GET /companies/{companyId}/data/financials/cashFlowStatement.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `periodLength` (integer, required): Number of months per period (1-12). Required.
- `periodsToCompare` (integer, required): How many periods to return (1-12). Required.
- `startMonth` (string): First month of the earliest period (YYYY-MM-DD); defaults to the most recent.

### `codat_list_direct_costs` (~209 tokens)

List direct costs

List a company's direct costs (point-of-sale purchases: card/cash spend, refunds) for a data connection. NOTE: this endpoint is CONNECTION-scoped. Codat API: GET /companies/{companyId}/connections/{connectionId}/data/directCosts. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `connectionId` (string, required): The Codat connectionId (data connection UUID) within the company.
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_list_account_transactions` (~201 tokens)

List account transactions

List a company's account transactions (bank/GL transactions) for a data connection. NOTE: this endpoint is CONNECTION-scoped. Codat API: GET /companies/{companyId}/connections/{connectionId}/data/accountTransactions. Returns the paged envelope.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `connectionId` (string, required): The Codat connectionId (data connection UUID) within the company.
- `orderBy` (string): Field to order results by, e.g. "-modifiedDate" (leading "-" for descending).
- `page` (integer): Page number (default 1).
- `pageSize` (integer): Records per page (1-2000, default 100).
- `query` (string): Codat query filter string, e.g. "status=Paid" or "modifiedDate>2026-01-01". See docs.codat.io/using-the-api/querying.

### `codat_request` (~109 tokens)

Raw read request

Power-user escape hatch: GET any Codat API path not wrapped by a dedicated tool. READ-ONLY — only GET is allowed. Path starts with a slash (e.g. "/companies/{id}/data/taxRates", "/companies/{id}/reports/agedDebtor"). Codat API: GET {path}.

Input parameters:

- `path` (string, required): API path starting with a slash, e.g. "/companies/{id}/data/items".
- `query` (object): Optional query params object.

### `codat_create_company` (~124 tokens)

Create a company

MUTATES Codat data — create a new company (a container for a customer's data connections). Provide a name; optionally a description, tags, or other attributes via `fields`. Codat API: POST /companies. Returns the created company (incl. its id).

Input parameters:

- `description` (string): Optional description / notes for the company.
- `fields` (object): Additional raw Codat fields merged into the request body (escape hatch for any field not typed above).
- `name` (string, required): A human-readable name for the company (usually your customer's business name).

### `codat_create_connection` (~155 tokens)

Create a data connection

MUTATES Codat data — create a new data connection on a company for a given source platform. Provide the platformKey (from codat_list_integrations, e.g. "gbol" for QuickBooks Online sandbox). The connection is created in a PendingAuth state; the customer completes authorization via the returned linkUrl. Codat API: POST /companies/{companyId}/connections. Returns the created connection.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `fields` (object): Additional raw Codat fields merged into the request body (escape hatch for any field not typed above).
- `platformKey` (string, required): The integration platformKey to connect (from codat_list_integrations).

### `codat_refresh_all_data` (~93 tokens)

Queue a full data refresh

MUTATES Codat state — queue a refresh of ALL data types for a company (Codat re-pulls from the connected source platforms). Asynchronous: it enqueues pulls, it does not return the data. Use codat_get_data_status to track progress. Codat API: POST /companies/{companyId}/data/all.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).

### `codat_refresh_data_type` (~136 tokens)

Queue a single dataset refresh

MUTATES Codat state — queue a refresh of ONE data type for a company (e.g. "invoices", "bills", "chartOfAccounts", "balanceSheet"). Asynchronous: it enqueues a pull, it does not return the data. Codat API: POST /companies/{companyId}/data/queue/{dataType}.

Input parameters:

- `companyId` (string, required): The Codat companyId (UUID).
- `dataType` (string, required): The Codat data type key to refresh, e.g. "invoices", "bills", "customers", "chartOfAccounts", "balanceSheet".

## Diagnostics

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

## Score history

- 2026-08-03: 72
- 2026-08-02: 72
- 2026-08-01: 71
- 2026-07-31: 71
- 2026-07-30: 68
- 2026-07-29: 70
- 2026-07-28: 69
- 2026-07-27: 68
- 2026-07-26: 12

## Links

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