Koskamo

Conecto Bookkeeping MCP

An official MCP server provided by Conecto for double-entry bookkeeping. It allows AI agents to manage charts of accounts, record expenses and journal entries, import and match bank statements, attach receipts, apply bank rules, and generate financial reports like profit and loss and balance sheets. It supports DATEV export and replaces traditional accounting software like QuickBooks or Xero.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Conecto Bookkeeping MCP logo, by ConectoVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by Conecto
You need:send the key as `Authorization: Bearer `
MCP endpoint (Streamable HTTP)
https://api.conecto.chat/mcp/books
Vendor documentation

What its tools do

61 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

61 of 61 have a description · 61 of 61 declare behavior hints · 9 of 50 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to conecto.chat ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Record business expenses with tax splits and receipts
  • Import bank statements and match lines to journal entries
  • Generate profit and loss and balance sheet reports
  • Manage chart of accounts and tax rates

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
conecto-books 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
61 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Conecto Bookkeeping: The business's double-entry books: a chart of accounts, journal entries, expenses with receipts, taxes, bank statements imported (CSV, CAMT.053, OFX) and matched, invoices posted on their own, locked periods, and profit and loss, balance sheet, trial balance, ledger and tax reports. Every tool lists its price; reads are free up to 1,000,000 a month for the account (then $0.50 per 10,000), and a call that fails is never charged. Pay from your Conecto balance (GET https://api.conecto.chat/v1/balance).

Tools

61 advertised

books_setup — Set up the books
Advertised by the server during the last successful anonymous check.

Start the business's double-entry books, or change their settings. The first call needs currency (the base currency of every report; it can't change once something is booked) and makes the chart: "starter" (cash, bank, receivables, tax, equity, sales and common costs, numbered 1000-8000) or "minimal" (only the eight accounts the books post to on their own). The books start on start_date (default: the start of this fiscal year); enter what the business owned and owed that day as one entry against the opening balances account (3900), unpaid invoices and bills from before included. With post_invoices (default on), sent invoices and supplier bills, their payments and voids post on their own, those from start_date on right away. payment_accounts says where payments land per method, in and out (default: the bank account, cash in the cash account); rates are standing exchange rates for currencies the European Central Bank doesn't publish. Costs $0.001 per call; nothing if it fails.

books_setup input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "chart": {
      "enum": [
        "starter",
        "minimal"
      ],
      "type": "string",
      "description": "Only on the first call."
    },
    "rates": {
      "type": "object",
      "description": "Currency -> one unit of it in the base currency, e.g. {\"AED\": \"0.2486\"}; null removes one. Used instead of the ECB's rate.",
      "additionalProperties": {
        "type": [
          "number",
          "string",
          "null"
        ]
      }
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "ISO 4217, e.g. \"EUR\"."
    },
    "start_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "The first day the books cover."
    },
    "post_invoices": {
      "type": "boolean"
    },
    "payment_accounts": {
      "type": "object",
      "description": "Payment method -> account code, e.g. {\"card\": \"1020\"}; null goes back to the default. Methods: bank_transfer, card, cash, check, online, other.",
      "additionalProperties": {
        "type": [
          "string",
          "null"
        ]
      }
    },
    "fiscal_year_start": {
      "type": "integer",
      "maximum": 12,
      "minimum": 1,
      "description": "The month the fiscal year starts. Default 1 (January)."
    }
  },
  "additionalProperties": false
}
books_setup annotations
{
  "title": "Set up the books",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_get — Read the books' settings
Advertised by the server during the last successful anonymous check.
Advertised read-only

The base currency, start date, fiscal year, locked period, which accounts hold which role, where invoice payments land, the taxes, how many entries there are and how many bank lines wait to be matched. Free.

books_get input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
books_get annotations
{
  "title": "Read the books' settings",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_list_accounts — List the chart of accounts
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every account with its code, type, role and balance on as_of (default today). Balance sheet accounts show their balance; income and expense accounts show the fiscal year so far. Free.

books_list_accounts input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "as_of": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "include_archived": {
      "type": "boolean",
      "default": false
    }
  },
  "additionalProperties": false
}
books_list_accounts annotations
{
  "title": "List the chart of accounts",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_save_accounts — Add or change accounts
Advertised by the server during the last successful anonymous check.

Add accounts or change them, matched by code: name, type (only while unused), description, a new code, archived (only with no balance and no role), a bank account's IBAN and BIC, and role. Roles are the accounts the books post to on their own: bank, cash, receivable, inventory, input_tax, sales_tax, payable, retained_earnings, opening_balances, sales, cost_of_sales, exchange, depreciation, accumulated_depreciation, asset_disposals, customer_credits, supplier_credits, expense_claims, import_vat. Giving a role moves it from the account that had it. Costs $0.001 per call; nothing if it fails.

books_save_accounts input schema
{
  "type": "object",
  "required": [
    "accounts"
  ],
  "properties": {
    "accounts": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "code"
        ],
        "properties": {
          "bic": {
            "type": "string",
            "maxLength": 11
          },
          "code": {
            "type": "string",
            "maxLength": 20,
            "minLength": 1,
            "description": "An account code from the chart, e.g. \"6600\"."
          },
          "iban": {
            "type": "string",
            "maxLength": 42,
            "description": "A bank account's IBAN, what bills paid in a batch are paid from; \"\" clears it."
          },
          "name": {
            "type": "string",
            "maxLength": 120
          },
          "role": {
            "enum": [
              "",
              "bank",
              "cash",
              "receivable",
              "inventory",
              "input_tax",
              "sales_tax",
              "payable",
              "retained_earnings",
              "opening_balances",
              "sales",
              "cost_of_sales",
              "exchange",
              "depreciation",
              "accumulated_depreciation",
              "asset_disposals",
              "customer_credits",
              "supplier_credits",
              "expense_claims",
              "import_vat"
            ],
            "type": "string"
          },
          "type": {
            "enum": [
              "asset",
              "liability",
              "equity",
              "income",
              "expense"
            ],
            "type": "string"
          },
          "archived": {
            "type": "boolean"
          },
          "new_code": {
            "type": "string",
            "maxLength": 20
          },
          "description": {
            "type": "string",
            "maxLength": 500
          }
        },
        "additionalProperties": false
      },
      "maxItems": 100,
      "minItems": 1
    }
  },
  "additionalProperties": false
}
books_save_accounts annotations
{
  "title": "Add or change accounts",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_save_tax — Add or change a tax
Advertised by the server during the last successful anonymous check.

A tax rate the books use (VAT, GST, sales tax), matched by name. Tax charged on sales is owed on sales_account (default: the sales tax account); tax paid on purchases is reclaimed on purchase_account (default: the tax to reclaim account; null when it can't be reclaimed, and it stays part of the cost). A rate in use can't change: add a new tax and archive the old one. Invoices make the taxes they need on their own. kind makes a new tax one the business owes itself, like Xero's reverse charge rates: rc_eu (services from another EU country), rc_abroad (from outside it), rc_home (reverse charge at home) or eu_goods (goods from another EU country); on an expense or a bank line it books the VAT owed and reclaimed at once, the amount paid being without VAT. kind import is import VAT paid at customs, no rate: what is booked with it is the VAT itself, reclaimed whole on the import VAT account (1310, made with it), where an expense or a bank line counts with no tax named (box 62 in Germany, box 4 in the UK). Conecto gives no tax advice; the rates are the business's. Costs $0.001 per call; nothing if it fails.

books_save_tax input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "kind": {
      "enum": [
        "rc_eu",
        "rc_abroad",
        "rc_home",
        "eu_goods",
        "import"
      ],
      "type": "string",
      "description": "For a new tax: VAT the business owes itself, or import VAT."
    },
    "name": {
      "type": "string",
      "maxLength": 60,
      "minLength": 1
    },
    "rate": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24,
      "description": "Percent, e.g. 19."
    },
    "archived": {
      "type": "boolean"
    },
    "new_name": {
      "type": "string",
      "maxLength": 60
    },
    "sales_account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    },
    "purchase_account": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 20
    }
  },
  "additionalProperties": false
}
books_save_tax annotations
{
  "title": "Add or change a tax",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_record_entry — Book a journal entry
Advertised by the server during the last successful anonymous check.

Book an entry: two or more lines, each a debit or a credit on an account, which must balance. For anything the other tools don't cover: opening balances, a loan, depreciation, owner's drawings, moving money between accounts, a correction. Entries are never edited; undo one with books_reverse_entry. Lines can carry a tax so the tax report counts them. Costs $0.01 per call; nothing if it fails.

books_record_entry input schema
{
  "type": "object",
  "required": [
    "date",
    "lines"
  ],
  "properties": {
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "memo": {
      "type": "string",
      "maxLength": 500
    },
    "rate": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24,
      "description": "One unit of currency in the base currency, e.g. \"0.9241\". Default: a standing rate, else the European Central Bank's reference rate for the date."
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "account"
        ],
        "properties": {
          "tax": {
            "type": "string",
            "maxLength": 60,
            "description": "A tax by name (books_get lists them), e.g. \"VAT 19%\"."
          },
          "debit": {
            "type": [
              "number",
              "string"
            ],
            "maxLength": 24,
            "description": "A positive amount."
          },
          "credit": {
            "type": [
              "number",
              "string"
            ],
            "maxLength": 24,
            "description": "A positive amount."
          },
          "account": {
            "type": "string",
            "maxLength": 20,
            "minLength": 1,
            "description": "An account code from the chart, e.g. \"6600\"."
          },
          "tracking": {
            "type": "object",
            "description": "Tracking options by category, e.g. {\"Department\": \"Service\"} (books_list_tracking).",
            "maxProperties": 2,
            "additionalProperties": {
              "type": "string",
              "maxLength": 60
            }
          },
          "description": {
            "type": "string",
            "maxLength": 300
          }
        },
        "additionalProperties": false
      },
      "maxItems": 200,
      "minItems": 2
    },
    "party": {
      "type": "string",
      "maxLength": 200,
      "description": "Who paid or was paid."
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "When it is not the base currency, e.g. \"USD\". The rate is then rate, a standing rate, or the European Central Bank's for the date."
    },
    "reference": {
      "type": "string",
      "maxLength": 120
    },
    "receipt_file_id": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36,
      "description": "A file_id from the file store."
    }
  },
  "additionalProperties": false
}
books_record_entry annotations
{
  "title": "Book a journal entry",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_record_expense — Book an expense
Advertised by the server during the last successful anonymous check.

Book a cost the business paid: account is what it was for (an expense, or an asset like equipment), paid_from where the money came from (default the bank account; a card, cash or the owner's account). paid_by instead (an email) makes it an expense claim, like Xero's: someone paid with their own money and is paid back with books_repay_claims. With a tax, the tax to reclaim is split off (amount includes it unless amount_includes_tax is false). Attach the receipt from the file store. A negative amount is a refund. Costs $0.01 per call; nothing if it fails.

books_record_expense input schema
{
  "type": "object",
  "required": [
    "date",
    "amount",
    "account"
  ],
  "properties": {
    "tax": {
      "type": "string",
      "maxLength": 60,
      "description": "A tax by name (books_get lists them), e.g. \"VAT 19%\"."
    },
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "memo": {
      "type": "string",
      "maxLength": 500
    },
    "rate": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24,
      "description": "One unit of currency in the base currency, e.g. \"0.9241\". Default: a standing rate, else the European Central Bank's reference rate for the date."
    },
    "amount": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24,
      "description": "e.g. \"119.00\"."
    },
    "vendor": {
      "type": "string",
      "maxLength": 200
    },
    "account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    },
    "paid_by": {
      "type": "string",
      "maxLength": 254,
      "description": "The email of whoever paid it privately and is paid back: an expense claim. Not with paid_from."
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "When it is not the base currency, e.g. \"USD\". The rate is then rate, a standing rate, or the European Central Bank's for the date."
    },
    "tracking": {
      "type": "object",
      "description": "Tracking options by category, e.g. {\"Department\": \"Service\"} (books_list_tracking).",
      "maxProperties": 2,
      "additionalProperties": {
        "type": "string",
        "maxLength": 60
      }
    },
    "paid_from": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    },
    "reference": {
      "type": "string",
      "maxLength": 120,
      "description": "e.g. the receipt number."
    },
    "paid_by_name": {
      "type": "string",
      "maxLength": 200
    },
    "receipt_file_id": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36,
      "description": "A file_id from the file store."
    },
    "amount_includes_tax": {
      "type": "boolean",
      "default": true
    }
  },
  "additionalProperties": false
}
books_record_expense annotations
{
  "title": "Book an expense",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_repay_claims — Pay back expense claims
Advertised by the server during the last successful anonymous check.

Pay back what someone paid for the business with their own money (expense claims, from books_record_expense with paid_by), like Xero's: all their open claims in one currency, or the claims named, in one entry from paid_from (default the bank account) against Expense claims to repay. sepa_file: true adds a SEPA credit transfer file to their iban, to upload to the bank. Costs $0.01 per call; nothing if it fails.

books_repay_claims input schema
{
  "type": "object",
  "required": [
    "person"
  ],
  "properties": {
    "bic": {
      "type": "string",
      "maxLength": 11
    },
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "When it was paid. Default today."
    },
    "iban": {
      "type": "string",
      "maxLength": 42
    },
    "claims": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 1
      },
      "maxItems": 200,
      "minItems": 1,
      "description": "Only these claims (claim_id)."
    },
    "person": {
      "type": "string",
      "maxLength": 254,
      "minLength": 3,
      "description": "Their email, as paid_by had it."
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "When it is not the base currency, e.g. \"USD\". The rate is then rate, a standing rate, or the European Central Bank's for the date."
    },
    "paid_from": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    },
    "reference": {
      "type": "string",
      "maxLength": 140
    },
    "sepa_file": {
      "type": "boolean",
      "default": false
    }
  },
  "additionalProperties": false
}
books_repay_claims annotations
{
  "title": "Pay back expense claims",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_list_claims — List expense claims
Advertised by the server during the last successful anonymous check.
Advertised read-only

Expense claims: what people paid for the business with their own money, still to repay (the default), repaid, void or all, newest first, with what each person is owed per currency; person keeps to one. Free.

books_list_claims input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 100,
      "maximum": 200,
      "minimum": 1
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0
    },
    "person": {
      "type": "string",
      "maxLength": 254
    },
    "status": {
      "enum": [
        "to_repay",
        "repaid",
        "void",
        "all"
      ],
      "type": "string",
      "default": "to_repay"
    }
  },
  "additionalProperties": false
}
books_list_claims annotations
{
  "title": "List expense claims",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_reverse_entry — Reverse an entry
Advertised by the server during the last successful anonymous check.

Undo an entry by booking its mirror image (entries are never edited or deleted). It is dated like the entry, or today when that period is locked, unless date is given. Bank lines matched to the entry wait to be matched again. Entries posted from invoices follow the invoice: void it, or record a refund. Costs $0.01 per call; nothing if it fails.

books_reverse_entry input schema
{
  "type": "object",
  "required": [
    "entry"
  ],
  "properties": {
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "memo": {
      "type": "string",
      "maxLength": 500
    },
    "entry": {
      "type": "integer",
      "minimum": 1,
      "description": "The entry number."
    }
  },
  "additionalProperties": false
}
books_reverse_entry annotations
{
  "title": "Reverse an entry",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_attach_receipt — Attach a receipt
Advertised by the server during the last successful anonymous check.

Attach a receipt or invoice from the file store to an entry that has none. It stays with the books: the file can't be deleted while the entry has it. Costs $0.01 per call; nothing if it fails.

books_attach_receipt input schema
{
  "type": "object",
  "required": [
    "entry",
    "file_id"
  ],
  "properties": {
    "entry": {
      "type": "integer",
      "minimum": 1,
      "description": "The entry number."
    },
    "file_id": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36,
      "description": "A file_id from the file store."
    }
  },
  "additionalProperties": false
}
books_attach_receipt annotations
{
  "title": "Attach a receipt",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_list_entries — List entries
Advertised by the server during the last successful anonymous check.
Advertised read-only

Entries newest first, each with its lines, filtered by dates, an account, where it came from (manual, expense, bank, invoice, invoice_payment, invoice_void, reversal) or text in the memo, reference or party. Free.

books_list_entries input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "to": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "from": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "text": {
      "type": "string",
      "maxLength": 100
    },
    "entry": {
      "type": "integer",
      "minimum": 1,
      "description": "The entry number."
    },
    "limit": {
      "type": "integer",
      "default": 50,
      "maximum": 200,
      "minimum": 1
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0
    },
    "source": {
      "enum": [
        "manual",
        "expense",
        "bank",
        "invoice",
        "invoice_payment",
        "invoice_void",
        "reversal",
        "stock",
        "bill",
        "bill_payment",
        "bill_void",
        "credit_note",
        "depreciation",
        "asset_disposal",
        "customer_credit",
        "supplier_credit",
        "expense_claim"
      ],
      "type": "string"
    },
    "account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    }
  },
  "additionalProperties": false
}
books_list_entries annotations
{
  "title": "List entries",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_import_bank — Import a bank statement
Advertised by the server during the last successful anonymous check.

Read a bank statement from the file store onto a bank account (default the bank account): CSV as the bank exports it, CAMT.053 (.052, .054) or OFX/QFX. CSV columns are found by their headers in several languages; when they aren't, name them with columns. Lines imported before are skipped, so overlapping statements are fine. Each line then waits in books_bank_lines to be matched. Charged per line added. Free.

books_import_bank input schema
{
  "type": "object",
  "required": [
    "file_id"
  ],
  "properties": {
    "account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    },
    "columns": {
      "type": "object",
      "properties": {
        "date": {
          "type": "string",
          "maxLength": 100
        },
        "amount": {
          "type": "string",
          "maxLength": 100
        },
        "balance": {
          "type": "string",
          "maxLength": 100
        },
        "bank_id": {
          "type": "string",
          "maxLength": 100
        },
        "currency": {
          "type": "string",
          "maxLength": 100
        },
        "money_in": {
          "type": "string",
          "maxLength": 100
        },
        "direction": {
          "type": "string",
          "maxLength": 100
        },
        "money_out": {
          "type": "string",
          "maxLength": 100
        },
        "reference": {
          "type": "string",
          "maxLength": 100
        },
        "description": {
          "type": "string",
          "maxLength": 100
        },
        "counterparty": {
          "type": "string",
          "maxLength": 100
        }
      },
      "description": "CSV header names, e.g. {\"date\": \"Buchungstag\", \"amount\": \"Betrag\", \"description\": \"Verwendungszweck\"}. money_in and money_out are for files with two amount columns; direction for a debit/credit marker column.",
      "additionalProperties": false
    },
    "decimal": {
      "enum": [
        ",",
        "."
      ],
      "type": "string",
      "description": "The CSV's decimal mark."
    },
    "file_id": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36,
      "description": "A file_id from the file store."
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "The statement's currency when the file doesn't say. Default the base currency."
    },
    "max_lines": {
      "type": "integer",
      "default": 500,
      "maximum": 5000,
      "minimum": 1,
      "description": "The most lines this call may add (and hold the price for)."
    },
    "date_format": {
      "enum": [
        "YYYY-MM-DD",
        "DD.MM.YYYY",
        "DD.MM.YY",
        "DD/MM/YYYY",
        "MM/DD/YYYY",
        "DD/MM/YY",
        "MM/DD/YY",
        "DD-MM-YYYY",
        "MM-DD-YYYY",
        "YYYY/MM/DD",
        "YYYY.MM.DD",
        "YYYYMMDD",
        "DD MMM YYYY",
        "DD-MMM-YYYY",
        "MMM DD, YYYY",
        "DD MMMM YYYY"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
books_import_bank annotations
{
  "title": "Import a bank statement",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_bank_lines — List bank lines
Advertised by the server during the last successful anonymous check.
Advertised read-only

Imported bank lines, by default those still to match, oldest first, each with up to three suggestions of what it was: entries already booked (same amount, close in date), an open invoice it pays (money in) or an open supplier bill it pays (money out), or the account earlier lines from the same party went to. Suggestions are plain rules; you decide, with books_match_bank_lines (pass a suggestion's match as it is). A first suggestion with sure: true is one the books are sure of (a bank rule, or the number and the exact amount, well ahead of any other); such lines can be matched together in one call. Free.

books_bank_lines input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "to": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "from": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "limit": {
      "type": "integer",
      "default": 50,
      "maximum": 200,
      "minimum": 1
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0
    },
    "status": {
      "enum": [
        "new",
        "matched",
        "ignored",
        "all"
      ],
      "type": "string",
      "default": "new"
    },
    "account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    }
  },
  "additionalProperties": false
}
books_bank_lines annotations
{
  "title": "List bank lines",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_match_bank_lines — Match bank lines
Advertised by the server during the last successful anonymous check.

Say what bank lines were, up to 100 at a time, each one of: entries (entry numbers already booked whose lines on the bank account add up to the line), invoices (the open invoices money in pays: their payments are recorded and posted, the amount spread in the order given unless amounts are given), bills (the open supplier bills money out pays, the same way), account (book it there now, with an optional tax split off: a sale when money came in, a cost when it went out), rule (book it the way a bank rule says), ignore (not for the books, e.g. a duplicate), or unmatch (undo; a line booked to an account is reversed). Each line succeeds or fails on its own; only those done are charged. Costs $0.02 per bank line matched; nothing if none are found.

books_match_bank_lines input schema
{
  "type": "object",
  "required": [
    "matches"
  ],
  "properties": {
    "matches": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "line_id"
        ],
        "properties": {
          "tax": {
            "type": "string",
            "maxLength": 60,
            "description": "A tax by name (books_get lists them), e.g. \"VAT 19%\"."
          },
          "rate": {
            "type": [
              "number",
              "string"
            ],
            "maxLength": 24,
            "description": "One unit of currency in the base currency, e.g. \"0.9241\". Default: a standing rate, else the European Central Bank's reference rate for the date."
          },
          "rule": {
            "type": "string",
            "maxLength": 80,
            "description": "A bank rule by name (books_list_bank_rules)."
          },
          "bills": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "bill_id"
              ],
              "properties": {
                "amount": {
                  "type": [
                    "number",
                    "string"
                  ],
                  "maxLength": 24
                },
                "bill_id": {
                  "type": "string",
                  "maxLength": 36,
                  "minLength": 36
                }
              },
              "additionalProperties": false
            },
            "maxItems": 20,
            "minItems": 1
          },
          "ignore": {
            "type": "boolean"
          },
          "account": {
            "type": "string",
            "maxLength": 20,
            "minLength": 1,
            "description": "An account code from the chart, e.g. \"6600\"."
          },
          "entries": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 1,
              "description": "The entry number."
            },
            "maxItems": 20,
            "minItems": 1
          },
          "line_id": {
            "type": "integer",
            "minimum": 1
          },
          "unmatch": {
            "type": "boolean"
          },
          "invoices": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "invoice_id"
              ],
              "properties": {
                "amount": {
                  "type": [
                    "number",
                    "string"
                  ],
                  "maxLength": 24
                },
                "invoice_id": {
                  "type": "string",
                  "maxLength": 36,
                  "minLength": 36
                }
              },
              "additionalProperties": false
            },
            "maxItems": 20,
            "minItems": 1
          },
          "tracking": {
            "type": "object",
            "description": "Tracking options by category, e.g. {\"Department\": \"Service\"} (books_list_tracking).",
            "maxProperties": 2,
            "additionalProperties": {
              "type": "string",
              "maxLength": 60
            }
          },
          "description": {
            "type": "string",
            "maxLength": 300
          }
        },
        "additionalProperties": false
      },
      "maxItems": 100,
      "minItems": 1
    }
  },
  "additionalProperties": false
}
books_match_bank_lines annotations
{
  "title": "Match bank lines",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_save_bank_rule — Save a bank rule
Advertised by the server during the last successful anonymous check.

A bank rule, like Xero's: which new bank lines it matches and how to book them, so lines that come every month (bank fees, rent, the phone bill) book themselves. when: conditions on the counterparty, description or reference (contains, equals, starts_with, ends_with; any case), all of them or any (match). Narrow it with direction (in, out), amount_min and amount_max (the line's size, no sign) and bank_account. Book to account with an optional tax split off, or split by percent across accounts (70% phone, 30% private), each part with its own tax. Rules are tried by position, lowest first; the first that matches is the line's first suggestion in books_bank_lines, and books_apply_bank_rules books every line a rule matches. Matched by name; only what you pass changes. Costs $0.001 per call; nothing if it fails.

books_save_bank_rule input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "tax": {
      "type": "string",
      "maxLength": 60,
      "description": "A tax by name (books_get lists them), e.g. \"VAT 19%\"."
    },
    "name": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1,
      "description": "The rule's name, e.g. \"Bank fees\"."
    },
    "when": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "field",
          "value"
        ],
        "properties": {
          "op": {
            "enum": [
              "contains",
              "equals",
              "starts_with",
              "ends_with"
            ],
            "type": "string",
            "default": "contains"
          },
          "field": {
            "enum": [
              "counterparty",
              "description",
              "reference"
            ],
            "type": "string"
          },
          "value": {
            "type": "string",
            "maxLength": 120,
            "minLength": 1,
            "description": "The words to look for, in any case."
          }
        },
        "additionalProperties": false
      },
      "maxItems": 10,
      "minItems": 1
    },
    "match": {
      "enum": [
        "all",
        "any"
      ],
      "type": "string",
      "default": "all"
    },
    "split": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "account",
          "percent"
        ],
        "properties": {
          "tax": {
            "type": "string",
            "maxLength": 60,
            "description": "A tax by name (books_get lists them), e.g. \"VAT 19%\"."
          },
          "account": {
            "type": "string",
            "maxLength": 20,
            "minLength": 1,
            "description": "An account code from the chart, e.g. \"6600\"."
          },
          "percent": {
            "type": "number",
            "maximum": 100,
            "exclusiveMinimum": 0
          },
          "tracking": {
            "type": "object",
            "description": "Tracking options by category, e.g. {\"Department\": \"Service\"} (books_list_tracking).",
            "maxProperties": 2,
            "additionalProperties": {
              "type": "string",
              "maxLength": 60
            }
          }
        },
        "additionalProperties": false
      },
      "maxItems": 10,
      "minItems": 2
    },
    "account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    },
    "new_name": {
      "type": "string",
      "maxLength": 80
    },
    "position": {
      "type": "integer",
      "maximum": 10000,
      "minimum": 0
    },
    "tracking": {
      "type": "object",
      "description": "Tracking options by category, e.g. {\"Department\": \"Service\"} (books_list_tracking).",
      "maxProperties": 2,
      "additionalProperties": {
        "type": "string",
        "maxLength": 60
      }
    },
    "direction": {
      "enum": [
        "any",
        "in",
        "out"
      ],
      "type": "string"
    },
    "amount_max": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24
    },
    "amount_min": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24
    },
    "description": {
      "type": "string",
      "maxLength": 300,
      "description": "The memo of the entries it books. Default: the line's own text."
    },
    "bank_account": {
      "type": "string",
      "maxLength": 20,
      "description": "Only lines on this bank account (its code); \"\" for any."
    }
  },
  "additionalProperties": false
}
books_save_bank_rule annotations
{
  "title": "Save a bank rule",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_list_bank_rules — List bank rules
Advertised by the server during the last successful anonymous check.
Advertised read-only

The bank rules, in the order they are tried: their conditions, where they book, and how often and when each was last used. Free.

books_list_bank_rules input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
books_list_bank_rules annotations
{
  "title": "List bank rules",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_delete_bank_rule — Delete a bank rule
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a bank rule. What it booked stays booked. Free.

books_delete_bank_rule input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1,
      "description": "The rule's name, e.g. \"Bank fees\"."
    }
  },
  "additionalProperties": false
}
books_delete_bank_rule annotations
{
  "title": "Delete a bank rule",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
books_apply_bank_rules — Book lines by the bank rules
Advertised by the server during the last successful anonymous check.

Book every new bank line a rule matches, oldest first, each by the first rule that matches (up to limit), on one bank account or all. Run it after books_import_bank. Lines no rule matches wait for books_match_bank_lines; a line the books can't take (a locked month) is listed under skipped with why. $0.02 per line booked, as matching it by hand. Costs $0.02 per bank line booked; nothing if none are found.

books_apply_bank_rules input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 100,
      "maximum": 200,
      "minimum": 1
    },
    "bank_account": {
      "type": "string",
      "maxLength": 20,
      "description": "Only lines on this bank account (its code)."
    }
  },
  "additionalProperties": false
}
books_apply_bank_rules annotations
{
  "title": "Book lines by the bank rules",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_save_tracking — Save a tracking category
Advertised by the server during the last successful anonymous check.

A tracking category, like Xero's: a department, a region or a project line, with its options. Up to two at a time. Any line can then carry one option of each (tracking: {"Department": "Service"}): journal entry lines, expenses, bank lines booked to an account, invoice and bill lines; profit and loss splits by a category with books_report by_tracking, or keeps to one option with tracking. Matched by name: options adds options, rename renames them on every line, archive stops new use. Costs $0.001 per call; nothing if it fails.

books_save_tracking input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 60,
      "minLength": 1
    },
    "rename": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "from",
          "to"
        ],
        "properties": {
          "to": {
            "type": "string",
            "maxLength": 60
          },
          "from": {
            "type": "string",
            "maxLength": 60
          }
        },
        "additionalProperties": false
      },
      "maxItems": 100
    },
    "archive": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 60
      },
      "maxItems": 100
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 60,
        "minLength": 1
      },
      "maxItems": 100
    },
    "archived": {
      "type": "boolean",
      "description": "Archive (or bring back) the whole category."
    },
    "new_name": {
      "type": "string",
      "maxLength": 60
    }
  },
  "additionalProperties": false
}
books_save_tracking annotations
{
  "title": "Save a tracking category",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_list_tracking — List tracking categories
Advertised by the server during the last successful anonymous check.
Advertised read-only

The tracking categories with their options, archived ones marked. Free.

books_list_tracking input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
books_list_tracking annotations
{
  "title": "List tracking categories",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_save_budget — Save a budget
Advertised by the server during the last successful anonymous check.

A budget, like Xero's budget manager: an amount per income or expense account for each month from start (12 months unless months says otherwise). Each line gives amounts (one per month), monthly (the same every month) or yearly (spread evenly); a line for an account already in it replaces that line, and remove takes one out. Hold it against what happened with books_report budget_variance. Matched by name. Not a team's spending budget at Conecto. Costs $0.001 per call; nothing if it fails.

books_save_budget input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1,
      "description": "The budget's name, e.g. \"2026\"."
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "account"
        ],
        "properties": {
          "remove": {
            "type": "boolean",
            "description": "Take the account out of the budget."
          },
          "yearly": {
            "type": [
              "number",
              "string"
            ],
            "maxLength": 24,
            "description": "A year's amount, spread evenly over the months."
          },
          "account": {
            "type": "string",
            "maxLength": 20,
            "minLength": 1,
            "description": "An account code from the chart, e.g. \"6600\"."
          },
          "amounts": {
            "type": "array",
            "items": {
              "type": [
                "number",
                "string"
              ],
              "maxLength": 24
            },
            "maxItems": 36,
            "minItems": 1,
            "description": "One amount per month of the budget."
          },
          "monthly": {
            "type": [
              "number",
              "string"
            ],
            "maxLength": 24,
            "description": "The same amount every month."
          }
        },
        "additionalProperties": false
      },
      "maxItems": 300
    },
    "start": {
      "type": "string",
      "maxLength": 7,
      "description": "Its first month, like 2026-01."
    },
    "months": {
      "type": "integer",
      "maximum": 36,
      "minimum": 1
    },
    "new_name": {
      "type": "string",
      "maxLength": 80
    }
  },
  "additionalProperties": false
}
books_save_budget annotations
{
  "title": "Save a budget",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_list_budgets — List budgets
Advertised by the server during the last successful anonymous check.
Advertised read-only

The budgets with their months and every line's amounts and total. Free.

books_list_budgets input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
books_list_budgets annotations
{
  "title": "List budgets",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_delete_budget — Delete a budget
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a budget. The books don't change. Free.

books_delete_budget input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1,
      "description": "The budget's name, e.g. \"2026\"."
    }
  },
  "additionalProperties": false
}
books_delete_budget annotations
{
  "title": "Delete a budget",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
books_save_asset — Register a fixed asset
Advertised by the server during the last successful anonymous check.

Put an asset the business bought in the register, like Xero's fixed assets: a van, a machine, a laptop, with its cost, purchase date and the asset account its purchase was booked to (registering books nothing). method: straight_line over its life down to residual, declining_balance at rate_percent of its book value at the start of each fiscal year, full (all of it in the month it starts, for something cheap enough to write off at once) or none (land). averaging: full_month counts the month it starts in full, actual_days counts days. Depreciation goes to the depreciation expense and accumulated depreciation accounts (made as 6950 and 1590 when missing) unless expense_account and accumulated_account say otherwise. An asset depreciated before the books started brings opening_accumulated. To change one, pass asset: once its depreciation is booked, only its name, description, serial number, warranty and tracking change. Costs $0.001 per call; nothing if it fails.

books_save_asset input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "cost": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24,
      "description": "What it cost before tax, in the base currency."
    },
    "name": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1
    },
    "asset": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "The asset to change, by its number. Leave out to register one."
    },
    "method": {
      "enum": [
        "straight_line",
        "declining_balance",
        "full",
        "none"
      ],
      "type": "string",
      "default": "straight_line"
    },
    "number": {
      "type": "string",
      "maxLength": 20,
      "description": "A new asset's number. Default: the next FA-0001."
    },
    "account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "The asset account its purchase was booked to, e.g. \"1500\"."
    },
    "residual": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24,
      "description": "What it is worth at the end of its life. Default 0."
    },
    "tracking": {
      "type": "object",
      "description": "Tracking options by category, e.g. {\"Department\": \"Service\"} (books_list_tracking).",
      "maxProperties": 2,
      "additionalProperties": {
        "type": "string",
        "maxLength": 60
      }
    },
    "averaging": {
      "enum": [
        "full_month",
        "actual_days"
      ],
      "type": "string",
      "default": "full_month"
    },
    "life_years": {
      "type": "number",
      "maximum": 100,
      "minimum": 0.1
    },
    "description": {
      "type": "string",
      "maxLength": 500
    },
    "life_months": {
      "type": "integer",
      "maximum": 1200,
      "minimum": 1
    },
    "rate_percent": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24,
      "description": "Declining balance: the share of its book value a year."
    },
    "purchase_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "serial_number": {
      "type": "string",
      "maxLength": 80
    },
    "warranty_until": {
      "type": "string",
      "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$",
      "description": "YYYY-MM-DD, \"\" for none."
    },
    "expense_account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    },
    "depreciation_start": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "When it was first used, if after the purchase date."
    },
    "accumulated_account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    },
    "opening_accumulated": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24,
      "description": "Depreciation booked before the books started."
    }
  },
  "additionalProperties": false
}
books_save_asset annotations
{
  "title": "Register a fixed asset",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_list_assets — List the fixed assets
Advertised by the server during the last successful anonymous check.
Advertised read-only

The asset register: each asset's cost, accumulated depreciation, book value, how it depreciates and through which month that is booked, with totals. due: what books_depreciate would book through the end of last month. check: the register held against the books per account, like Xero's fixed asset reconciliation; a difference is a purchase not registered yet, or an asset booked out another way. asset gives one asset with its schedule (depreciation and book value per fiscal year) and the months booked. Free.

books_list_assets input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "asset": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "The asset's number, like \"FA-0001\" (books_list_assets)."
    },
    "limit": {
      "type": "integer",
      "default": 100,
      "maximum": 500,
      "minimum": 1
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0
    },
    "status": {
      "enum": [
        "registered",
        "disposed",
        "all"
      ],
      "type": "string",
      "default": "registered"
    }
  },
  "additionalProperties": false
}
books_list_assets annotations
{
  "title": "List the fixed assets",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_depreciate — Book depreciation
Advertised by the server during the last successful anonymous check.

Book the depreciation of every registered asset through a month's end (default: the end of last month), like Xero's run depreciation: one entry per month, dated its last day, from the month after the last one booked, so running it again books nothing twice. Months in a locked period are refused; catch_up: true books them in the first open month instead. undo_after books the opposite of what was booked for the months after that date, for every asset or the one asset names; undo before changing an asset's cost, life or method. Costs $0.01 per call; nothing if it fails.

books_depreciate input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "asset": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "Only this asset."
    },
    "through": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "catch_up": {
      "type": "boolean",
      "default": false
    },
    "undo_after": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Undo the months after this date."
    }
  },
  "additionalProperties": false
}
books_depreciate annotations
{
  "title": "Book depreciation",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_dispose_asset — Sell or write off an asset
Advertised by the server during the last successful anonymous check.

Take an asset out of the books, sold or written off, like Xero's dispose. Its depreciation is booked through the month it goes first (to the day with actual_days; what was booked for later months is undone), then one entry takes its cost and accumulated depreciation out, books price to paid_to and the difference as a gain or a loss on gain_account (made as 4950 Gains and losses on assets sold when missing). paid_to is the bank account the money went to, or the income account the invoice to the buyer booked it to, which this then clears. A write-off has no price. undo: true brings it back. Costs $0.01 per call; nothing if it fails.

books_dispose_asset input schema
{
  "type": "object",
  "required": [
    "asset"
  ],
  "properties": {
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "undo": {
      "type": "boolean",
      "description": "Bring a sold or written off asset back."
    },
    "asset": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "The asset's number, like \"FA-0001\" (books_list_assets)."
    },
    "price": {
      "type": [
        "number",
        "string"
      ],
      "maxLength": 24,
      "description": "What it sold for before tax. Default 0, a write-off."
    },
    "paid_to": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "Where the price went, e.g. \"1010\"."
    },
    "catch_up": {
      "type": "boolean",
      "default": false
    },
    "gain_account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    }
  },
  "additionalProperties": false
}
books_dispose_asset annotations
{
  "title": "Sell or write off an asset",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
books_delete_asset — Delete an asset
Advertised by the server during the last successful anonymous check.
Advertised destructive

Take an asset registered by mistake out of the register. Only while none of its depreciation is booked and it is not sold or written off: else undo its depreciation first (books_depreciate undo_after with asset). The books don't change. Free.

books_delete_asset input schema
{
  "type": "object",
  "required": [
    "asset"
  ],
  "properties": {
    "asset": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "The asset's number, like \"FA-0001\" (books_list_assets)."
    }
  },
  "additionalProperties": false
}
books_delete_asset annotations
{
  "title": "Delete an asset",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
books_report — Run a report
Advertised by the server during the last successful anonymous check.
Advertised read-only

A report in the base currency. profit_and_loss and tax cover from-to (default: this fiscal year so far); balance_sheet and trial_balance are as of to (default today); general_ledger lists each account's lines from-to with running balances (one account, or all, paged); oss is a quarter's sales to consumers in other EU countries for the One Stop Shop return, per country and VAT rate in euros (quarter, default the last one ended; no books needed); reconciliation holds each bank account's books against the closing balance its latest statement on or before to stated: reconciled, to_match (statement lines and entries still to pair explain the difference) or off (unexplained). Like Xero's: profit_and_loss with compare adds columns for earlier months, quarters or years; cash_summary shows the money accounts at the start and end of from-to and what came in and went out, by account; executive_summary (default this month so far) gives cash, profit, margins, what is owed both ways, debtor and creditor days and invoices issued, against the same days a month before; budget_variance holds a budget (books_save_budget) against the actual figures for the months from-to touches; vat_return gives from-to by the boxes of the VAT return the business files itself, Germany's advance return by Kennzahl or the UK's nine boxes (country, default the business's), with what the books can't tell yet. Like Xero's short-term cash flow, cash_forecast projects the money accounts `days` ahead (default 30, up to 180) from open invoices and bills on their due, expected or planned dates and what repeating templates will make, by day and week, with the lowest point and the overdue invoices and bills it leaves out until they have a date to come (each with the id that invoices_set_expected_date or purchasing_set_planned_date takes). snapshot is the year so far (default) against the same days a year before: profit, margins, income and expenses by month, the largest costs, the balance sheet, cash, and the average days from an invoice's or a bill's date to the payment that settled it, for those paid in the period. To show a person, put it in a view (view_show). Free.

books_report input schema
{
  "type": "object",
  "required": [
    "report"
  ],
  "properties": {
    "to": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "days": {
      "type": "integer",
      "default": 30,
      "maximum": 180,
      "minimum": 1,
      "description": "For cash_forecast: how many days ahead."
    },
    "from": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "limit": {
      "type": "integer",
      "default": 500,
      "maximum": 2000,
      "minimum": 1
    },
    "budget": {
      "type": "string",
      "maxLength": 80,
      "description": "For budget_variance: the budget's name (books_list_budgets)."
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0
    },
    "report": {
      "enum": [
        "profit_and_loss",
        "balance_sheet",
        "trial_balance",
        "general_ledger",
        "tax",
        "oss",
        "reconciliation",
        "cash_summary",
        "executive_summary",
        "budget_variance",
        "vat_return",
        "cash_forecast",
        "snapshot"
      ],
      "type": "string"
    },
    "account": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "An account code from the chart, e.g. \"6600\"."
    },
    "compare": {
      "enum": [
        "month",
        "quarter",
        "year"
      ],
      "type": "string",
      "description": "For profit_and_loss: add columns for the same days `periods` months, quarters or years before."
    },
    "country": {
      "enum": [
        "DE",
        "GB"
      ],
      "type": "string",
      "description": "For vat_return: whose form. Default the business's country."
    },
    "periods": {
      "type": "integer",
      "maximum": 11,
      "minimum": 1,
      "description": "With compare; default 1."
    },
    "quarter": {
      "type": "string",
      "pattern": "^\\d{4}-[Qq][1-4]$",
      "description": "For oss: like 2026-Q3."
    },
    "tracking": {
      "type": "object",
      "description": "For profit_and_loss: only lines with these options, e.g. {\"Department\": \"Service\"}.",
      "maxProperties": 2,
      "additionalProperties": {
        "type": "string",
        "maxLength": 60
      }
    },
    "by_tracking": {
      "type": "string",
      "maxLength": 60,
      "description": "For profit_and_loss: a tracking category to split by, one column per option and one for what is not tracked."
    }
  },
  "additionalProperties": false
}
books_report annotations
{
  "title": "Run a report",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_lock — Lock a period
Advertised by the server during the last successful anonymous check.

Lock the books through a date (a closed month, a filed tax return): nothing new can be booked on or before it, by any tool or invoice. null unlocks. Every change is kept in the books' history. Costs $0.001 per call; nothing if it fails.

books_lock input schema
{
  "type": "object",
  "required": [
    "through"
  ],
  "properties": {
    "reason": {
      "type": "string",
      "maxLength": 300
    },
    "through": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    }
  },
  "additionalProperties": false
}
books_lock annotations
{
  "title": "Lock a period",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
books_close_year — Close a fiscal year for good
Advertised by the server during the last successful anonymous check.
Advertised destructive

Close a fiscal year once its accounts and tax returns are final: nothing can be booked on or before its last day again, by any tool, invoice or unlock, and every earlier year is closed with it. It can't be undone; a correction found later is booked in the open year. Monthly work uses books_lock instead. Costs $0.001 per call; nothing if it fails.

books_close_year input schema
{
  "type": "object",
  "required": [
    "year_end"
  ],
  "properties": {
    "reason": {
      "type": "string",
      "maxLength": 300
    },
    "year_end": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "The fiscal year's last day, like 2025-12-31."
    }
  },
  "additionalProperties": false
}
books_close_year annotations
{
  "title": "Close a fiscal year for good",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
books_export — Export the books
Advertised by the server during the last successful anonymous check.

A file in the file store, with a download link: journal (a CSV of every line of every entry from-to, for an accountant or another program), accounts (the chart with balances on to) or datev (a DATEV Buchungsstapel for a German tax adviser: one fiscal year, from-to, default the year so far; needs the datev settings once) or fec (the French Fichier des Écritures Comptables for a tax audit: the fiscal year that holds to, every entry; needs the fec settings once). Conecto files no tax returns: for UK VAT (Making Tax Digital) the journal CSV is the digital link into bridging software. Costs $0.001 per call; nothing if it fails.

books_export input schema
{
  "type": "object",
  "required": [
    "what"
  ],
  "properties": {
    "to": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "fec": {
      "type": "object",
      "properties": {
        "siren": {
          "type": "string",
          "maxLength": 14
        },
        "accounts": {
          "type": "object",
          "maxProperties": 500,
          "additionalProperties": {
            "type": "string",
            "maxLength": 20
          }
        },
        "same_numbers": {
          "type": "boolean"
        }
      },
      "description": "For what: fec, kept for the next export. siren (9 digits; read from a French VAT ID when left out); accounts: each account code used to its plan comptable général number, like {\"4000\": \"706000\", \"1010\": \"512000\"} (same_numbers: true when the chart already uses them).",
      "additionalProperties": false
    },
    "from": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "what": {
      "enum": [
        "journal",
        "accounts",
        "datev",
        "fec"
      ],
      "type": "string"
    },
    "datev": {
      "type": "object",
      "properties": {
        "chart": {
          "enum": [
            "03",
            "04"
          ],
          "type": "string"
        },
        "client": {
          "type": "integer",
          "maximum": 99999,
          "minimum": 1
        },
        "adviser": {
          "type": "integer",
          "maximum": 9999999,
          "minimum": 1001
        },
        "accounts": {
          "type": "object",
          "maxProperties": 500,
          "additionalProperties": {
            "type": "string",
            "maxLength": 9
          }
        },
        "tax_keys": {
          "type": "object",
          "maxProperties": 50,
          "additionalProperties": {
            "type": "string",
            "maxLength": 4
          }
        },
        "same_numbers": {
          "type": "boolean"
        },
        "account_length": {
          "type": "integer",
          "maximum": 8,
          "minimum": 4
        }
      },
      "description": "For what: datev, kept for the next export. adviser (Beraternummer) and client (Mandantennummer) from the tax adviser; chart \"03\" (SKR03) or \"04\" (SKR04); account_length (4 to 8, default 4); accounts: each account code used to its DATEV number, like {\"4000\": \"8400\", \"1010\": \"1200\"} (same_numbers: true when the chart already uses them); tax_keys: a tax's BU-Schlüssel when it isn't German VAT at 19 or 7 percent.",
      "additionalProperties": false
    }
  },
  "additionalProperties": false
}
books_export annotations
{
  "title": "Export the books",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
account_balance — Check balance
Advertised by the server during the last successful anonymous check.
Advertised read-only

The account balance, how much of it is credit bought (AI visibility and the phone run only on that) and how much free and bonus credit, what running calls are holding, this key's daily budget, the auto-reload state, and how much of this month's free reads and downloads is used. Free.

account_balance input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
account_balance annotations
{
  "title": "Check balance",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_get_call — Get a call
Advertised by the server during the last successful anonymous check.
Advertised read-only

One call by id: its status (queued, running, succeeded, failed), cost and result. Use it to poll a background call until it finishes. Free.

account_get_call input schema
{
  "type": "object",
  "required": [
    "call_id"
  ],
  "properties": {
    "call_id": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36
    }
  },
  "additionalProperties": false
}
account_get_call annotations
{
  "title": "Get a call",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_list_calls — List calls
Advertised by the server during the last successful anonymous check.
Advertised read-only

Recent calls on this account, newest first, optionally only failed or succeeded ones, or one area's. Free.

account_list_calls input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "area": {
      "enum": [
        "analytics",
        "code",
        "crm",
        "calendar",
        "chat",
        "account",
        "admin",
        "email",
        "helpdesk",
        "documents",
        "esign",
        "hiring",
        "outreach",
        "prospects",
        "lookups",
        "companies",
        "longlists",
        "mergers",
        "valuation",
        "newsletters",
        "notify",
        "projects",
        "schedules",
        "speech",
        "uptime",
        "vault",
        "web",
        "tables",
        "links",
        "images",
        "files",
        "forms",
        "helpcenter",
        "imports",
        "invoices",
        "books",
        "inventory",
        "whistleblowing",
        "connect",
        "microsoft365",
        "googleworkspace",
        "hubspot",
        "salesforce",
        "directory",
        "hr",
        "social",
        "purchasing",
        "phone",
        "websites",
        "views",
        "visibility",
        "markets"
      ],
      "type": "string"
    },
    "limit": {
      "type": "integer",
      "default": 20,
      "maximum": 100,
      "minimum": 1
    },
    "status": {
      "enum": [
        "reserved",
        "running",
        "succeeded",
        "failed"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
account_list_calls annotations
{
  "title": "List calls",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_refund_topup — Refund a top-up
Advertised by the server during the last successful anonymous check.
Advertised destructive

Refund a top-up paid in the last 24 hours that none of has been used yet: its credit, with the first top-up's bonus, leaves the balance, and the card gets the credit back with its tax. The service fee is kept. Without topup_id, the newest top-up (GET /v1/topups lists them with their ids). Free. Free.

account_refund_topup input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "topup_id": {
      "type": "integer",
      "minimum": 1
    }
  },
  "additionalProperties": false
}
account_refund_topup annotations
{
  "title": "Refund a top-up",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}
account_set_owner_email — Name the business's owner
Advertised by the server during the last successful anonymous check.

When the account was made without the owner's email: send that person a link to confirm they own it. Once they confirm, the owner gets the account's warnings and approval requests, and only the owner raises limits. Nothing changes until they open the link. Free. Free.

account_set_owner_email input schema
{
  "type": "object",
  "required": [
    "email"
  ],
  "properties": {
    "email": {
      "type": "string",
      "maxLength": 254,
      "minLength": 3
    }
  },
  "additionalProperties": false
}
account_set_owner_email annotations
{
  "title": "Name the business's owner",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
account_owner_link — Get a sign-in link for the owner
Advertised by the server during the last successful anonymous check.
Advertised read-only

A link that signs the business owner into their Conecto page, with no password: the balance, adding credit, auto-reload, limits, what the bots did, people, rentals and keys. page opens it where the owner is needed, like people for a role only the owner gives, or settings for joining by email domain. It works once, within 30 minutes; hand it to the owner. Free.

account_owner_link input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "page": {
      "enum": [
        "home",
        "tools",
        "activity",
        "apps",
        "billing",
        "add_credit",
        "limits",
        "people",
        "settings"
      ],
      "type": "string",
      "default": "home"
    }
  },
  "additionalProperties": false
}
account_owner_link annotations
{
  "title": "Get a sign-in link for the owner",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_dashboard_link — Get a link to an area at a glance
Advertised by the server during the last successful anonymous check.
Advertised read-only

A one-time link to a page showing one area as it is when the page opens, for when the person you work for asks to see it themselves: a recruiter looks at the applicants, a bookkeeper at what is due. Do the work and answer with the area's own tools first; a link never replaces that. When an answer would be a long list they would rather look through, offer a link and make it once they say yes. The page is made from the area's own reads as this key, so it shows only what this key may see. It opens once and keeps for an hour; an unopened link ends after 7 days. Free.

account_dashboard_link input schema
{
  "type": "object",
  "required": [
    "area"
  ],
  "properties": {
    "area": {
      "enum": [
        "analytics",
        "code",
        "crm",
        "calendar",
        "chat",
        "account",
        "admin",
        "email",
        "helpdesk",
        "documents",
        "esign",
        "hiring",
        "outreach",
        "prospects",
        "lookups",
        "companies",
        "longlists",
        "mergers",
        "valuation",
        "newsletters",
        "notify",
        "projects",
        "schedules",
        "speech",
        "uptime",
        "vault",
        "web",
        "tables",
        "links",
        "images",
        "files",
        "forms",
        "helpcenter",
        "imports",
        "invoices",
        "books",
        "inventory",
        "whistleblowing",
        "connect",
        "microsoft365",
        "googleworkspace",
        "hubspot",
        "salesforce",
        "directory",
        "hr",
        "social",
        "purchasing",
        "phone",
        "websites",
        "views",
        "visibility",
        "markets"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
account_dashboard_link annotations
{
  "title": "Get a link to an area at a glance",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_get_limits — Read the limits
Advertised by the server during the last successful anonymous check.
Advertised read-only

The limits a business can ask Conecto to raise (calls a minute, new email addresses a day, phone numbers and more): each one's standard and current value and the most that can be asked for, and the business's requests with their answers. Free.

account_get_limits input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
account_get_limits annotations
{
  "title": "Read the limits",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_request_limit — Ask for a higher limit
Advertised by the server during the last successful anonymous check.

Ask Conecto to raise one of the business's limits: which one (or other, saying which), the number it needs, and why, in 40 to 2,000 characters. Conecto reviews it and approves (maybe with less) or declines; the answer comes as the account.limit_request_answered event and by email to the owner, who is also told now. For an account that has topped up; one request per limit at a time, five in 30 days. Free. Free.

account_request_limit input schema
{
  "type": "object",
  "required": [
    "limit",
    "amount",
    "reason"
  ],
  "properties": {
    "limit": {
      "enum": [
        "calls_per_minute",
        "key_calls_per_minute",
        "downloads_per_hour",
        "new_email_recipients_per_day",
        "documents_emailed_per_day",
        "orders_emailed_per_day",
        "phone_numbers",
        "confirmation_calls_per_day",
        "connections",
        "storage_blocks",
        "prospects_per_month",
        "outreach_mailboxes",
        "other"
      ],
      "type": "string",
      "description": "The limit, as account_get_limits names it, or other."
    },
    "other": {
      "type": "string",
      "maxLength": 200,
      "description": "With limit other: which limit, like \"rows in one table\"."
    },
    "amount": {
      "type": "integer",
      "maximum": 1000000000,
      "minimum": 1,
      "description": "The number the business needs, in the limit's unit (5000 calls a minute)."
    },
    "reason": {
      "type": "string",
      "maxLength": 2000,
      "minLength": 40,
      "description": "What the business does that needs it, and why the current limit is too low."
    }
  },
  "additionalProperties": false
}
account_request_limit annotations
{
  "title": "Ask for a higher limit",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
account_events — Read recent events
Advertised by the server during the last successful anonymous check.
Advertised read-only

What happened in this account that someone outside the bot did, oldest first: applications, bookings, form responses, signatures, replies, emails received, goals reached on the website; and the custom events bots sent with account_emit_event. Kept 30 days. Poll with after = the last event_id you saw. Free.

account_events input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "after": {
      "type": "integer",
      "minimum": 0,
      "description": "Only events after this event_id."
    },
    "kinds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 30,
      "description": "Event names or areas (\"hiring.*\"); all when left out."
    },
    "limit": {
      "type": "integer",
      "default": 50,
      "maximum": 200,
      "minimum": 1
    }
  },
  "additionalProperties": false
}
account_events annotations
{
  "title": "Read recent events",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_emit_event — Send an event of your own
Advertised by the server during the last successful anonymous check.

Send an event you name, custom.<name> (custom.lead_qualified, custom.order_shipped), to every channel subscribed to it (notify_subscribe with "custom.*" or its name: Slack, Teams, a webhook to Zapier, Make, n8n or the business's own systems) and to account_events, where another team's bot can pick it up. data is any JSON object (up to 10 KB); sent_by is added with this bot's name and team. $0.005 for each channel it goes to; free when no channel is subscribed. Costs $0.005 per channel it goes to; nothing if none are found.

account_emit_event input schema
{
  "type": "object",
  "required": [
    "kind",
    "title"
  ],
  "properties": {
    "data": {
      "type": "object"
    },
    "kind": {
      "type": "string",
      "pattern": "^custom\\.[a-z0-9][a-z0-9_.-]*$",
      "maxLength": 66,
      "minLength": 8,
      "description": "custom. and a name of lowercase letters, digits, dots, dashes and _."
    },
    "link": {
      "type": "string",
      "pattern": "^https://",
      "maxLength": 1000
    },
    "text": {
      "type": "string",
      "maxLength": 4000
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1
    }
  },
  "additionalProperties": false
}
account_emit_event annotations
{
  "title": "Send an event of your own",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
account_search — Search everything
Advertised by the server during the last successful anonymous check.
Advertised read-only

One search over what this account holds: what its files say (PDFs, Word, Excel, PowerPoint, text), table rows, help center articles, CRM contacts, companies and deals, emails, tickets, quotes and invoices, book entries, stock items and project tasks. Every word must appear (any case); titles rank first, then the newest. Each result says which tool opens it. Narrow it with areas. Free.

account_search input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "areas": {
      "type": "array",
      "items": {
        "enum": [
          "files",
          "tables",
          "helpcenter",
          "crm",
          "email",
          "helpdesk",
          "invoices",
          "books",
          "inventory",
          "projects"
        ],
        "type": "string"
      },
      "minItems": 1
    },
    "limit": {
      "type": "integer",
      "default": 20,
      "maximum": 50,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "maxLength": 200,
      "minLength": 2
    }
  },
  "additionalProperties": false
}
account_search annotations
{
  "title": "Search everything",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_get_brand — See the business's look
Advertised by the server during the last successful anonymous check.
Advertised read-only

The name, logo, colour and footer line the business's emails and published pages carry. Free.

account_get_brand input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
account_get_brand annotations
{
  "title": "See the business's look",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_set_brand — Set the business's look
Advertised by the server during the last successful anonymous check.

The business's name as the sender, its logo (a PNG, JPEG, WebP or GIF from the file store), its colour and a footer line (an address, a legal line), on every email to its customers (bookings, applications, tests, signatures, invoices, newsletters, replies) and on its published pages (forms, booking, careers, newsletters, status, views). Only what you pass changes; an empty string clears it. Mail from Conecto to you keeps Conecto's look. Costs $0.001 per call; nothing if it fails.

account_set_brand input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "colour": {
      "type": "string",
      "maxLength": 7,
      "description": "Hex, like #1a73e8; empty for none."
    },
    "footer": {
      "type": "string",
      "maxLength": 200
    },
    "remove_logo": {
      "type": "boolean",
      "default": false
    },
    "sender_name": {
      "type": "string",
      "maxLength": 120
    },
    "logo_file_id": {
      "type": "string",
      "maxLength": 36,
      "minLength": 36
    }
  },
  "additionalProperties": false
}
account_set_brand annotations
{
  "title": "Set the business's look",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_list_email_templates — See what the business's emails say
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every email Conecto sends to the business's customers (bookings, applications, interviews, tests, signatures, invoices and quotes, newsletter sign-ups), with when it goes out and its subject, headline and opening words as they are now, and the {variables} each can use. Free.

account_list_email_templates input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
account_list_email_templates annotations
{
  "title": "See what the business's emails say",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_set_email_template — Rewrite one of the business's emails
Advertised by the server during the last successful anonymous check.

Change an email's subject, headline or opening words in the business's own voice, with {variables} from account_list_email_templates (like {name} or {when}). The facts under them (times, places, amounts, links and buttons) stay as they are. Only what you pass changes; an empty string brings back the original words. Plain text; a blank line starts a new paragraph. Costs $0.001 per call; nothing if it fails.

account_set_email_template input schema
{
  "type": "object",
  "required": [
    "email"
  ],
  "properties": {
    "email": {
      "type": "string",
      "maxLength": 40,
      "description": "Like booking_booked or invoice_sent."
    },
    "opening": {
      "type": "string",
      "maxLength": 4000
    },
    "subject": {
      "type": "string",
      "maxLength": 200
    },
    "headline": {
      "type": "string",
      "maxLength": 120
    }
  },
  "additionalProperties": false
}
account_set_email_template annotations
{
  "title": "Rewrite one of the business's emails",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_export_all — Export everything
Advertised by the server during the last successful anonymous check.

Everything this account holds, in ZIP files of up to 24 MB saved to its file store: every record of every area as JSON Lines, and the stored files themselves, with a README saying what is where. Credentials are left out. Runs in the background: poll the call with account_get_call; the result has a download link for each part. The parts open only for this key and for the owner's and admins' own keys that neither only read nor only draft. A key of a team other than the company-wide one gets owner_required. Free (EU Data Act). One at a time, three a day; the owner is emailed when an export is made. Free. Runs in the background: the reply has a call_id; poll it with the account_get_call tool or GET /v1/calls/<id>.

account_export_all input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
account_export_all annotations
{
  "title": "Export everything",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
account_audit_log — Read the audit log
Advertised by the server during the last successful anonymous check.
Advertised read-only

The account's admin and security actions, newest first: keys made and revoked, limits and auto-reload, the owner's sign-ins, connectors, exports, vault reads and writes, credentials set and everything deleted. Ordinary work is in the call log (account_list_calls). verify: true also checks the hash chain, which breaks where an entry was changed or removed. Free.

account_audit_log input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 50,
      "maximum": 500,
      "minimum": 1
    },
    "since": {
      "type": "string",
      "format": "date-time",
      "maxLength": 40
    },
    "action": {
      "type": "string",
      "maxLength": 60,
      "description": "Only actions starting with this, like \"key.\" or \"tool.vault_\"."
    },
    "verify": {
      "type": "boolean",
      "default": false
    }
  },
  "additionalProperties": false
}
account_audit_log annotations
{
  "title": "Read the audit log",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_save_team — Create or change a team
Advertised by the server during the last successful anonymous check.

A department, location or project group of the account, like Support, Finance or the Hamburg shop. Its keys (POST /v1/keys with "team") can only work in its areas, only read when read_only is on, and spend against its budget (monthly_budget_usd per budget_period: a month, a fiscal quarter or year, or a project total): a hard budget refuses the call that would pass it, a soft one only warns. At alert_percent you get the event account.budget_alert and the owner an email, once a period. erp_code is the team's cost center in the company's ERP, for statements. drafts_only makes every write of its keys wait for one of its managers (or the owner), for a new bot that should only draft. mailboxes are the Microsoft 365 or Google mailboxes its keys may act as. You may make a team and narrow one; widening its areas, letting it write, ending drafts only, switching a hard budget to soft, and raising or removing a budget are the owner's, on their account page, when the account has an owner email. The company-wide team holds every key no other team does and is never limited to areas. $0.001. Costs $0.001 per call; nothing if it fails.

account_save_team input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1
    },
    "areas": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "string"
      },
      "maxItems": 50,
      "description": "The areas its keys may work in (account tools always); null for every area."
    },
    "budget": {
      "enum": [
        "hard",
        "soft"
      ],
      "type": "string",
      "description": "hard refuses calls past the budget; soft only warns."
    },
    "erp_code": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 40
    },
    "new_name": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1,
      "description": "Renames the team; its keys, spend and budget stay with it."
    },
    "mailboxes": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "string",
        "maxLength": 254
      },
      "maxItems": 20,
      "description": "The Microsoft 365 or Google mailboxes its keys may act as; null for every mailbox the connection lists."
    },
    "read_only": {
      "type": "boolean",
      "description": "Its keys only read, and get links that act for whoever opens them as \"[redacted]\"."
    },
    "drafts_only": {
      "type": "boolean",
      "description": "Every write of its keys waits for a person, and they get links that act for whoever opens them as \"[redacted]\"."
    },
    "alert_percent": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1
    },
    "budget_period": {
      "enum": [
        "month",
        "quarter",
        "year",
        "project"
      ],
      "type": "string",
      "description": "What the budget is for: a month, a quarter or a year of the account's fiscal calendar, or a project total until budget_ends_on."
    },
    "budget_ends_on": {
      "type": [
        "string",
        "null"
      ],
      "format": "date",
      "description": "The last day of a project budget, like 2026-12-31."
    },
    "sees_sensitive": {
      "type": "boolean",
      "description": "false hides suppliers' bank details and HR notes and contracts from its keys; only the owner turns it on."
    },
    "monthly_budget_usd": {
      "type": [
        "number",
        "null"
      ],
      "maximum": 1000000,
      "minimum": 0,
      "description": "null counts the spend without a cap."
    }
  },
  "additionalProperties": false
}
account_save_team annotations
{
  "title": "Create or change a team",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_list_teams — List teams
Advertised by the server during the last successful anonymous check.
Advertised read-only

The account's teams, the company-wide one first: each with its areas, whether it only reads, its budget (hard or soft, and its period) and alert line, this period's spend, its ERP code, whether it is paused, its keys, and its people with who manages it. A person's own assistant works within their teams. Free.

account_list_teams input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
account_list_teams annotations
{
  "title": "List teams",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_pause_team — Pause a team
Advertised by the server during the last successful anonymous check.

Stops every key of a team at once, this one too if it is the team's: their calls are refused until the owner starts the team again on their account page. For a bot that misbehaves or a team that spends too fast. Free. Free.

account_pause_team input schema
{
  "type": "object",
  "required": [
    "team"
  ],
  "properties": {
    "team": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1
    }
  },
  "additionalProperties": false
}
account_pause_team annotations
{
  "title": "Pause a team",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
account_assign_team — Give something to a team
Advertised by the server during the last successful anonymous check.

Move a form, a meeting type, a job, an inbox, a phone number, a newsletter, the website chat, a rental, a pipeline, a table or a website to a team. What happens through it is charged to that team from now on (a form's responses, a number's calls, an inbox's tickets), and its rental moves with it. Something a bot makes already belongs to the bot's team. Only a key of the company-wide team without limits moves things between teams. $0.001. Costs $0.001 per call; nothing if it fails.

account_assign_team input schema
{
  "type": "object",
  "required": [
    "kind",
    "team"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 254,
      "description": "Its id, slug, name, address or number; not needed for the chat."
    },
    "kind": {
      "enum": [
        "form",
        "meeting_type",
        "job",
        "inbox",
        "phone_number",
        "newsletter",
        "chat",
        "rental",
        "pipeline",
        "table",
        "website"
      ],
      "type": "string"
    },
    "team": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1
    }
  },
  "additionalProperties": false
}
account_assign_team annotations
{
  "title": "Give something to a team",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_add_approval_rule — Hold a tool for approval
Advertised by the server during the last successful anonymous check.

Make a tool wait for a person: every call of it, those whose argument is over a number (like invoices_create_credit_note when amount is over 500), or those whose argument is one of some values (like connect_call when method is POST, PUT, PATCH or DELETE). A held call answers approval_required with an approval_id and asks the approver; when they approve, call again with the same arguments, once (a call no person answers for adds the approval: header X-Conecto-Approval, or _meta.approvalId over MCP). The approver is an email, a saved channel, or a team (its managers, or everyone in it); each approver gets a link of their own, and the person whose call it is never approves it. With two_people_over, calls whose argument is over it need two people. Bills like Xero's bill approval: purchasing_create_bill with argument total holds bills over an amount, tax included; a rule on purchasing_pay_bill also holds batches with such a payment. Removing a rule is the owner's, on their account page, when the account has an owner email. $0.001. Costs $0.001 per call; nothing if it fails.

account_add_approval_rule input schema
{
  "type": "object",
  "required": [
    "tool"
  ],
  "properties": {
    "over": {
      "type": "number",
      "description": "Calls with argument over this are held."
    },
    "tool": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1
    },
    "values": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 60,
        "minLength": 1
      },
      "maxItems": 20,
      "minItems": 1,
      "description": "Calls with argument equal to one of these (any case) are held."
    },
    "argument": {
      "type": "string",
      "maxLength": 60,
      "description": "An argument of the tool (or total, for purchasing_create_bill)."
    },
    "approvers": {
      "enum": [
        "managers",
        "everyone"
      ],
      "type": "string",
      "default": "managers",
      "description": "Who in approver_team approves."
    },
    "approver_team": {
      "type": "string",
      "maxLength": 80,
      "description": "A team (account_list_teams)."
    },
    "approver_email": {
      "type": "string",
      "maxLength": 254
    },
    "two_people_over": {
      "type": "number",
      "description": "Calls whose argument is over this need two people; higher than over."
    },
    "approver_channel": {
      "type": "string",
      "maxLength": 80,
      "description": "A saved notify channel."
    }
  },
  "additionalProperties": false
}
account_add_approval_rule annotations
{
  "title": "Hold a tool for approval",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
account_list_approval_rules — List approval rules
Advertised by the server during the last successful anonymous check.
Advertised read-only

The tools that wait for a person's approval, with their thresholds and approvers. Free.

account_list_approval_rules input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
account_list_approval_rules annotations
{
  "title": "List approval rules",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_find_person — Find a person's data
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every record this account holds about one person, by their email address or phone number, across every area: CRM, chats, emails, tickets, forms, bookings, calls, applications, invoices, orders, newsletters, HR and the call log, with their chats and CRM history. For a person who asks what the business keeps about them (GDPR Art. 15). Shows each kind with its count and ids; account_export_person gives them a copy, account_erase_person erases what may go. Free.

account_find_person input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "email": {
      "type": "string",
      "maxLength": 254,
      "description": "The person's email address."
    },
    "phone": {
      "type": "string",
      "maxLength": 40,
      "description": "Their phone number in international format, like +1 503 555 0145."
    }
  },
  "additionalProperties": false
}
account_find_person annotations
{
  "title": "Find a person's data",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
account_export_person — Export a person's data
Advertised by the server during the last successful anonymous check.

Everything account_find_person finds about one person in one ZIP in the file store: their records as JSON Lines (credentials left out) and the files those records point to, like a CV. Give the person the download link when they ask for a copy of their data (GDPR Art. 15 and 20), once you know it is them. The ZIP opens only for this key and for the owner's and admins' own keys that neither only read nor only draft. A key of a team other than the company-wide one gets owner_required: pass the request to the owner. Free; 20 a day. Free.

account_export_person input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "email": {
      "type": "string",
      "maxLength": 254,
      "description": "The person's email address."
    },
    "phone": {
      "type": "string",
      "maxLength": 40,
      "description": "Their phone number in international format, like +1 503 555 0145."
    }
  },
  "additionalProperties": false
}
account_export_person annotations
{
  "title": "Export a person's data",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
account_erase_person — Erase a person's data
Advertised by the server during the last successful anonymous check.
Advertised destructive

Erases one person across every area when they ask (GDPR Art. 17), once you know it is them (they wrote from that address, or confirmed it). Their CRM contact, chat visitor, past meetings and calls are anonymised, so deals stay without them, and a meeting they were only a guest at drops them; their chats, CRM history, form and routing form answers, job applications with the CV, newsletter subscriptions and events are deleted, and the call log's contents that name them are cleared. Kept, each with its reason in the result: accounting records, employment records, signed documents, the audit log, the account's own settings, upcoming meetings, and emails and tickets (outreach emails and replies too) unless correspondence is true. Their address goes on the suppression lists, so it is never mailed again: outreach campaigns stop for them at once. Can't be undone; the owner is emailed. A key of a team other than the company-wide one gets owner_required: pass the request to the owner. Free. Free.

account_erase_person input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "email": {
      "type": "string",
      "maxLength": 254,
      "description": "The person's email address."
    },
    "phone": {
      "type": "string",
      "maxLength": 40,
      "description": "Their phone number in international format, like +1 503 555 0145."
    },
    "correspondence": {
      "type": "boolean",
      "default": false,
      "description": "Also delete their emails and tickets, when no law requires keeping them."
    }
  },
  "additionalProperties": false
}
account_erase_person annotations
{
  "title": "Erase a person's data",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
account_data_locations — See where the data is
Advertised by the server during the last successful anonymous check.
Advertised read-only

Where each area's data is stored and processed: the company that runs each place, the country or region, and what it holds. Every area keeps its records in the database and runs on Conecto's servers; some also use a service named here (email, phone, PDFs, search). For the business's records of processing and its transfer assessments (GDPR Art. 30 and 44). Free.

account_data_locations input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "areas": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 40
      },
      "maxItems": 50,
      "description": "Areas to show, like [\"email\", \"phone\"]; all when left out."
    }
  },
  "additionalProperties": false
}
account_data_locations annotations
{
  "title": "See where the data is",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
890 ms
95th percentile latency
890 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 890 ms · metadata changed · 61 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http conecto-bookkeeping-mcp https://api.conecto.chat/mcp/books

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add conecto-bookkeeping-mcp --url https://api.conecto.chat/mcp/books

Cursor

Merge this server into .cursor/mcp.json in your project, then enable conecto-bookkeeping-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "conecto-bookkeeping-mcp": {
      "url": "https://api.conecto.chat/mcp/books"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "conecto-bookkeeping-mcp": {
      "type": "streamableHttp",
      "url": "https://api.conecto.chat/mcp/books",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start conecto-bookkeeping-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "conecto-bookkeeping-mcp": {
      "type": "http",
      "url": "https://api.conecto.chat/mcp/books"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http conecto-bookkeeping-mcp https://api.conecto.chat/mcp/books

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://api.conecto.chat/mcp/books

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "conecto-bookkeeping-mcp": {
      "serverUrl": "https://api.conecto.chat/mcp/books"
    }
  }
}

Let your agent find its tools

Find servers like Conecto Bookkeeping MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Conecto Bookkeeping MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing