Bokio MCP by usefulapi

Read Bokio accounts, invoices and customers; create drafts and journal entries.

Should I use this

Quality & Safety

A
Description quality
81%
Schema completeness
92%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (8)

  • LOWTool 'bokio_get_fiscal_year' description lacks action verbin bokio_get_fiscal_year
  • LOWTool 'bokio_get_journal_entry' description lacks action verbin bokio_get_journal_entry
  • LOWTool 'bokio_get_customer' description lacks action verbin bokio_get_customer
  • LOWTool 'bokio_get_invoice' description lacks action verbin bokio_get_invoice
  • LOWTool 'bokio_list_invoice_payments' description lacks action verbin bokio_list_invoice_payments
  • LOWTool 'bokio_get_credit_note' description lacks action verbin bokio_get_credit_note
  • LOWTool 'bokio_list_suppliers' description lacks action verbin bokio_list_suppliers
  • LOWTool 'bokio_list_supplier_invoices' description lacks action verbin bokio_list_supplier_invoices

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~5,121Tokens (tool definitions)
~1.7 KBTypical response size
Significant attention impact (4.00% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "bokio": {
      "url": "https://bokio.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://bokio.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (23)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢bokio_get_company_information

The connected Bokio company: name, organisation number, company type, address, contact details.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_list_fiscal_years(page, pageSize, query)

Fiscal years (id, start and end date, cash or accrual accounting method, open or closed).

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number, starting at 1 (default 1).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Items per page, 1-100 (default 25).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "query": {
      "description": "Optional Bokio filter: property, operator, value, joined with && (operators ==, !=, <, <=, >, >=, ~ for contains). Filterable fields: startDate, endDate, accountingMethod, status. Example: status==open",
      "type": "string",
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_get_fiscal_year(fiscalYearId)

One fiscal year by id.

Input Schema

{
  "type": "object",
  "properties": {
    "fiscalYearId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The fiscal year id (a GUID)."
    }
  },
  "required": [
    "fiscalYearId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_list_chart_of_accounts(query)

The company's complete chart of accounts (account number, name, base-plan or custom). Not paginated.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Optional Bokio filter: property, operator, value, joined with && (operators ==, !=, <, <=, >, >=, ~ for contains). Filterable fields: account, name, accountType. Example: account>=3000&&account<4000",
      "type": "string",
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_get_account(account)

One account of the chart of accounts by its number (for example 1930).

Input Schema

{
  "type": "object",
  "properties": {
    "account": {
      "type": "integer",
      "minimum": 1,
      "maximum": 99999,
      "description": "The account number, for example 1930."
    }
  },
  "required": [
    "account"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_list_journal_entries(page, pageSize, query)

Bookkeeping journal entries (verifications) with their debit/credit lines. Filter by date or number.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number, starting at 1 (default 1).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Items per page, 1-100 (default 25).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "query": {
      "description": "Optional Bokio filter: property, operator, value, joined with && (operators ==, !=, <, <=, >, >=, ~ for contains). Filterable fields: date, journalEntryNumber, title, reversedByJournalEntryId, reversingJournalEntryId. Example: date>=2024-01-01&&date<=2024-12-31",
      "type": "string",
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_get_journal_entry(journalEntryId)

One journal entry (verification) with its lines.

Input Schema

{
  "type": "object",
  "properties": {
    "journalEntryId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The journal entry id (a GUID)."
    }
  },
  "required": [
    "journalEntryId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_list_customers(page, pageSize, query)

Customers of the company, highest customer number first.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number, starting at 1 (default 1).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Items per page, 1-100 (default 25).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "query": {
      "description": "Optional Bokio filter: property, operator, value, joined with && (operators ==, !=, <, <=, >, >=, ~ for contains). Filterable fields: name, customerNumber, type, vatNumber, orgNumber, modifiedDateTime. Example: name~Acme",
      "type": "string",
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_get_customer(customerId)

One customer by id.

Input Schema

{
  "type": "object",
  "properties": {
    "customerId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The customer id (a GUID)."
    }
  },
  "required": [
    "customerId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_list_invoices(page, pageSize, projectId, query)

Sales invoices (draft, published, paid, overdue, credited) with line items and totals.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number, starting at 1 (default 1).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Items per page, 1-100 (default 25).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "projectId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The project id (a GUID)."
    },
    "query": {
      "description": "Optional Bokio filter: property, operator, value, joined with && (operators ==, !=, <, <=, >, >=, ~ for contains). Filterable fields: type, status, invoiceDate, dueDate, customerRef.id, customerRef.customerNumber, orderNumberReference, projectReference, buyerReference, contractReference, currency, totalAmount. Example: status==overdue",
      "type": "string",
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_get_invoice(invoiceId)

One sales invoice by id, with line items.

Input Schema

{
  "type": "object",
  "properties": {
    "invoiceId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The invoice id (a GUID)."
    }
  },
  "required": [
    "invoiceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_list_invoice_payments(invoiceId, page, pageSize)

Payments registered against one sales invoice.

Input Schema

{
  "type": "object",
  "properties": {
    "invoiceId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The invoice id (a GUID)."
    },
    "page": {
      "description": "Page number, starting at 1 (default 1).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Items per page, 1-100 (default 25).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "required": [
    "invoiceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_list_credit_notes(page, pageSize, query)

Credit notes (draft or published).

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number, starting at 1 (default 1).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Items per page, 1-100 (default 25).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "query": {
      "description": "Optional Bokio filter: property, operator, value, joined with && (operators ==, !=, <, <=, >, >=, ~ for contains). Filterable fields: type, status, creditDate, dueDate, customerRef, orderNumberReference, projectReference, buyerReference, contractReference, currency, totalAmount. Example: status==published",
      "type": "string",
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_get_credit_note(creditNoteId)

One credit note by id, with line items.

Input Schema

{
  "type": "object",
  "properties": {
    "creditNoteId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The credit note id (a GUID)."
    }
  },
  "required": [
    "creditNoteId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_list_items(page, pageSize, query)

Reusable invoice items: description, product type, unit price, tax rate, bookkeeping account.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number, starting at 1 (default 1).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Items per page, 1-100 (default 25).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "query": {
      "description": "Optional Bokio filter: property, operator, value, joined with && (operators ==, !=, <, <=, >, >=, ~ for contains). Filterable fields: description, itemType, productType, unitType, unitPrice, taxRate. Example: productType==services",
      "type": "string",
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_list_suppliers(page, pageSize, query)

Suppliers of the company with payment details.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number, starting at 1 (default 1).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Items per page, 1-100 (default 25).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "query": {
      "description": "Optional Bokio filter: property, operator, value, joined with && (operators ==, !=, <, <=, >, >=, ~ for contains). Filterable fields: name, vatNumber, orgNumber. Example: name~Telia",
      "type": "string",
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢bokio_list_supplier_invoices(page, pageSize, projectId, query)

Supplier (purchase) invoices with remaining amounts and their journal entry.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number, starting at 1 (default 1).",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Items per page, 1-100 (default 25).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "projectId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The project id (a GUID)."
    },
    "query": {
      "description": "Optional Bokio filter: property, operator, value, joined with && (operators ==, !=, <, <=, >, >=, ~ for contains). Filterable fields: supplierRef.id, invoiceNumber, invoiceDate, dueDate, totalAmount, currency. Example: dueDate<2024-12-31",
      "type": "string",
      "maxLength": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴bokio_create_customer(name, type, customerNumber, orgNumber, vatNumber, ...)

Create a customer in the company's Bokio. If customerNumber is omitted Bokio picks the next number. Not idempotent: calling twice creates two customers; check bokio_list_customers first.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "type": {
      "type": "string",
      "enum": [
        "company",
        "private"
      ]
    },
    "customerNumber": {
      "type": "string",
      "maxLength": 50
    },
    "orgNumber": {
      "description": "Organisation number (companies) or personal number (private).",
      "type": "string",
      "maxLength": 50
    },
    "vatNumber": {
      "type": "string",
      "maxLength": 50
    },
    "email": {
      "description": "Default contact e-mail.",
      "type": "string",
      "maxLength": 200
    },
    "phone": {
      "description": "Default contact phone.",
      "type": "string",
      "maxLength": 50
    },
    "paymentTerms": {
      "description": "Payment terms in days, as Bokio expects, for example 30.",
      "type": "string",
      "maxLength": 50
    },
    "language": {
      "type": "string",
      "enum": [
        "sv",
        "en"
      ]
    },
    "address": {
      "type": "object",
      "properties": {
        "line1": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "line2": {
          "type": "string",
          "maxLength": 200
        },
        "city": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        },
        "postalCode": {
          "type": "string",
          "minLength": 1,
          "maxLength": 30
        },
        "country": {
          "type": "string",
          "minLength": 2,
          "maxLength": 2,
          "description": "ISO 3166-1 alpha-2 country code, for example SE."
        },
        "countrySubdivision": {
          "description": "ISO 3166-2 subdivision code (ENG, SCT, WLS, NIR). Required by Bokio when country is GB.",
          "type": "string",
          "maxLength": 10
        }
      },
      "required": [
        "line1",
        "city",
        "postalCode",
        "country"
      ],
      "description": "Postal address."
    }
  },
  "required": [
    "name",
    "type"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴bokio_create_invoice_draft(customerId, invoiceDate, dueDate, currency, currencyRate, ...)

Create a DRAFT sales invoice. Nothing is bookkept and nothing is sent until bokio_publish_invoice. Not idempotent: calling twice creates two drafts.

Input Schema

{
  "type": "object",
  "properties": {
    "customerId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The customer id from bokio_list_customers (a GUID)."
    },
    "invoiceDate": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Invoice date (YYYY-MM-DD)."
    },
    "dueDate": {
      "description": "Due date (YYYY-MM-DD).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "currency": {
      "description": "ISO 4217 code, default SEK.",
      "type": "string",
      "minLength": 3,
      "maxLength": 3
    },
    "currencyRate": {
      "description": "Rate to SEK when the currency is not SEK.",
      "type": "number",
      "exclusiveMinimum": 0
    },
    "orderNumberReference": {
      "type": "string",
      "maxLength": 100
    },
    "buyerReference": {
      "type": "string",
      "maxLength": 100
    },
    "lineItems": {
      "minItems": 1,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "description": "Line text. With itemId Bokio uses the saved item's own description and ignores this one."
          },
          "customUnitType": {
            "description": "The unit label when unitType is custom, for example session.",
            "type": "string",
            "maxLength": 50
          },
          "itemType": {
            "description": "salesItem (default) is a priced line; descriptionOnlyItem is a text line.",
            "type": "string",
            "enum": [
              "salesItem",
              "descriptionOnlyItem"
            ]
          },
          "productType": {
            "description": "Required for a salesItem line without itemId.",
            "type": "string",
            "enum": [
              "goods",
              "services"
            ]
          },
          "quantity": {
            "description": "Required for salesItem.",
            "type": "number"
          },
          "unitPrice": {
            "description": "Price per unit excluding VAT. Required for a salesItem line without itemId; with itemId it overrides the item's price.",
            "type": "number"
          },
          "taxRate": {
            "description": "VAT percentage, for example 25. Required for a salesItem line without itemId.",
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "unitType": {
            "type": "string",
            "enum": [
              "unspecified",
              "piece",
              "hour",
              "day",
              "month",
              "kilogram",
              "gram",
              "liter",
              "meter",
              "centimeter",
              "millimeter",
              "meterSquared",
              "meterCubic",
              "mile",
              "kilometer",
              "gigabyte",
              "hectar",
              "words",
              "year",
              "week",
              "minute",
              "megabyte",
              "ton",
              "custom"
            ]
          },
          "itemId": {
            "description": "A saved item (GUID). Bokio then takes product type, unit, VAT rate and account from the item; only quantity and unitPrice can be set on the line.",
            "type": "string",
            "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
          },
          "bookkeepingAccountNumber": {
            "description": "Revenue account; Bokio uses the default when omitted. Not allowed together with itemId.",
            "type": "integer",
            "minimum": 1,
            "maximum": 99999
          }
        },
        "required": [
          "description"
        ]
      }
    }
  },
  "required": [
    "customerId",
    "invoiceDate",
    "lineItems"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴bokio_publish_invoice(invoiceId)

IRREVERSIBLE: publish a draft invoice. It becomes official and immutable and gets its invoice number. This does NOT bookkeep it (use bokio_record_invoice for that) and Bokio does NOT e-mail it to the customer through the API. Only call when the user has confirmed this exact invoice.

Input Schema

{
  "type": "object",
  "properties": {
    "invoiceId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The draft invoice id (a GUID)."
    }
  },
  "required": [
    "invoiceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴bokio_record_invoice(invoiceId)

IRREVERSIBLE: record (bookkeep) a published invoice: Bokio posts it to the ledger using the accounts of its line items. Call after bokio_publish_invoice, only when the user has confirmed.

Input Schema

{
  "type": "object",
  "properties": {
    "invoiceId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The published invoice id (a GUID)."
    }
  },
  "required": [
    "invoiceId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴bokio_create_journal_entry(title, date, items)

IRREVERSIBLE bookkeeping: post a journal entry (verification) to the ledger. Debits must equal credits. It can only be undone by reversing it with bokio_reverse_journal_entry, which posts a counter-entry. Not idempotent: calling twice posts two entries. Only call when the user has confirmed the exact lines.

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Booking date, inside an open fiscal year (YYYY-MM-DD)."
    },
    "items": {
      "minItems": 2,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "account": {
            "type": "integer",
            "minimum": 1,
            "maximum": 99999,
            "description": "Account number from the chart of accounts."
          },
          "debit": {
            "type": "number",
            "minimum": 0,
            "description": "Debit amount (0 if this is a credit line)."
          },
          "credit": {
            "type": "number",
            "minimum": 0,
            "description": "Credit amount (0 if this is a debit line)."
          }
        },
        "required": [
          "account",
          "debit",
          "credit"
        ]
      }
    }
  },
  "required": [
    "title",
    "date",
    "items"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴bokio_reverse_journal_entry(journalEntryId)

IRREVERSIBLE: post a counter-entry that cancels a journal entry. Only entries created through the API can be reversed; the original stays in the ledger. Only call when the user has confirmed.

Input Schema

{
  "type": "object",
  "properties": {
    "journalEntryId": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
      "description": "The journal entry id (a GUID)."
    }
  },
  "required": [
    "journalEntryId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded23 tools