Bokio MCP by usefulapi
Read Bokio accounts, invoices and customers; create drafts and journal entries.
Should I use this
Quality & Safety
Findings (8)
- LOWin bokio_get_fiscal_year
- LOWin bokio_get_journal_entry
- LOWin bokio_get_customer
- LOWin bokio_get_invoice
- LOWin bokio_list_invoice_payments
- LOWin bokio_get_credit_note
- LOWin bokio_list_suppliers
- LOWin bokio_list_supplier_invoices
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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-httpWhat it can do
Tool inventory
Tools (23)
🟢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
Evidence