Unofficial Lexware Office MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Access to a Lexware Office account through its public API. The account owner decides which of these tools exist, so the list is the whole of what is permitted - a tool that is missing was withheld deliberately, not forgotten.
Identifiers are Lexware UUIDs and are never invented. To act on a document or a contact, find it first with search_vouchers or search_contacts and use the id from the result. search_vouchers is the only way to find a document at all, so a question about invoices, credit notes or what is still unpaid starts there. Monetary values are returned exactly as the API reports them, always with their currency.
These are somebody's books, and a tool without readOnlyHint changes them for real. Before the first such call in a session, call get_profile and name the company you are about to write to. Most of what this API creates it cannot remove again, so say what a call will leave behind before making it, and make it once - there is no idempotency key, and a repeated create is a second record rather than the same one.
Every call spends from one budget of two requests per second, shared across all endpoints. One search with the right filter is worth several fetches, and a list answers in pages: read the page block of a result before asking for another one.
The person can open the configuration interface, where the API key is set and the tools are chosen, by picking the prompt "Set up Lexware Office" in the client. When server_status is the only tool listed, or the one a request needs is missing, say so and point to that prompt rather than guessing at a fault.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| server_statusA | Report which server is running: name, version, transport, Python and MCP library versions and uptime, without an API call. With details, also whether Lexware answers and accepts the key, at most one API call every 60 seconds, and whether the tool policy file is loaded. If it is not, no other tool is offered. An answer holds for the moment it was given: after the settings change, call it again rather than rely on an earlier one. |
| get_profileA | Show which Lexware Office account this server is connected to. One API call. Returns the organization, company name, tax setup and small-business status. Call it before anything that changes data, so the organization is confirmed rather than assumed. It doubles as the connection check: if it succeeds, the API key works. |
| search_contactsA | Find contacts by name, email address, number or role. One API call per page. This is how a name becomes an id: every tool
taking a Rows carry the id, name, customer and vendor numbers and one way to
get in touch. A row marked Filters combine with AND. Giving none lists the account in name order.
Read |
| get_contactA | Read one contact in full, by id. Returns the complete record: roles and their numbers, billing and
shipping addresses, all email addresses and phone numbers, the note
and the Use |
| create_contactA | Create a new customer or vendor in the account. Writes real accounting data, and the API cannot take it back:
there is no call that deletes a contact, though the web app does.
Confirm the organization with Returns the id and version, not the record. Lexware assigns the customer and vendor numbers, so read the contact back to see them. |
| update_contactA | Change an existing contact. Only the fields you give are changed. Writes real accounting data. Read the contact with If the contact changed since that read, nothing is written and the error says so. Read it again and decide what to do with the change you would have overwritten. |
| search_articlesA | List articles, filtered by number, barcode or kind. One API call, one page. Rows carry the id, title, number, type, unit and price. There is no search by title. The API filters on these three fields and silently ignores anything else, so finding an article by name means paging through the list and reading the titles. Both filters match in full, not by fragment. |
| get_articleA | Read one article in full, by id. One API call. Returns the title, description, note, unit, type, the
price block and the Use The price carries a net and a gross figure with the tax rate between
them. |
| create_articleA | Add an article to the catalogue. Writes to the account. One API call, and it is not retried. Returns the new id and Unlike a voucher, an article can be removed again with
|
| update_articleA | Change an article. Only the fields you give are changed. Read it with If the article changed since that read, nothing is written and the error says so. Giving |
| delete_articleA | Delete an article. The API has no way back. The record is removed, not archived: reading it afterwards is a "not
found". One API call, and only once Documents that already quote this article keep their line items, which hold their own copy of the text and the price. |
| search_vouchersA | Find invoices, credit notes, quotations and bookkeeping vouchers. One API call per page. The only way to turn a question about the books
into the ids Rows carry id, type, status, number, dates, contact name, total and
open amount. A row marked Narrow |
| get_voucherA | Read one bookkeeping voucher, by id or by its document number. One API call. Returns the booked amounts, tax type, the posting
category of every line, the contact and the Prefer the id. A number is unique only by convention, and
For whether it has been paid, use |
| get_paymentsA | Show whether a voucher has been paid, and what is still open. Returns the payment status, the amount still outstanding, the currency and the individual payments recorded against it. Costs one API call. Takes the id of the voucher, not of a payment. An |
| create_voucherA | Record a bookkeeping voucher in the account. Writes real accounting data, and the API cannot take it back:
there is no way to delete a voucher here. Correcting one is a job for
the web app. Confirm the organization with Every line needs a posting category id, from |
| update_voucherA | Change a bookkeeping voucher that is already recorded. Writes real accounting data. Read it with An If the voucher changed since that read, nothing is written. One that is already paid or booked may be refused whatever the version. |
| get_sales_documentA | Read one sales document in full: an invoice, quotation or their kin. One API call. Returns the recipient, the line items with their unit
prices, the totals, the tax breakdown and the
A draft reads in full with For a bookkeeping voucher use |
| create_sales_documentA | Create an invoice, quotation, credit note or one of their relatives. Writes to the account. One API call, never retried, so a failure that
might have gone through has to be checked with A draft can still be edited or deleted in the web app. Each kind wants one thing of its own: Totals are added up by the API from the lines. |
| get_recurring_templatesA | Read the templates that issue invoices on a schedule. One API call. With A row is shorter than the record behind it: what a template will actually invoice, its lines and tax, is only in the record, so read by id to see that.
There is nothing to filter by, and reading is all the API allows. |
| download_fileA | Save a stored file, such as an uploaded receipt. One API call. The bytes are not in this answer. Two ways to reach them:
For a link a person can click, call Use |
| download_documentA | Save the rendered PDF of an invoice or another sales document. One API call. Reports A draft has not been rendered and cannot be downloaded. An XRechnung is XML by nature and its PDF is only a preview. A ZUGFeRD document is a PDF with the XML inside it. |
| read_downloadA | Put the contents of a downloaded file into this conversation. No API call. Use it when the client cannot open the What arrives depends on the file: XML as text, so an XRechnung can
be read. PDF as pictures of its pages, first 10 unless
|
| upload_fileA | Upload a receipt, which also creates a bookkeeping voucher for it. Writes real accounting data, and the API cannot take it back:
the answer carries a Takes PDF, JPEG, PNG or XML, at most 5 MiB, from a path or a URL. An
XML file is treated as an XRechnung. The voucher starts |
| attach_file_to_voucherA | Attach a file to a voucher that already exists. Use this rather than Writes to the account, and the API cannot take it back: there
is no call that detaches a file. Confirm the organization with
Takes PDF, JPEG, PNG or XML, at most 5 MiB, from a path or a URL. The
answer is the new file id, which |
| get_deeplinkA | Build a link that opens a record in the Lexware Office web app. Costs no API call: the link is assembled from ids you already have. Use it whenever a person should look at something themselves, rather than describing where to click. The link is not checked for existence, and a wrong id still produces one. Take the id from a search rather than from memory. |
| get_master_dataA | Read one of the lists this account is configured with. One API call. Countries and posting categories run into the hundreds,
so The answer reports A posting category id is what |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| open_items | What is still unpaid, owed to the company and owed by it, overdue first. |
| missing_receipts | Which receipt or invoice a period lacks, by the rhythm of the year before. |
| contact_overview | One customer or vendor: the record, the latest documents, what is open. |
| open_setup | Opens the configuration interface in the browser. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 26 tools
The set is largely cleanly partitioned by resource (contacts, articles, vouchers, sales documents, files, master data), with verb+noun naming that signals the target. A few pairs need the descriptions to separate them—download_file vs download_document vs read_download, and upload_file vs attach_file_to_voucher—but the descriptions explicitly cross-reference and warn about the wrong choice.
Almost every tool follows a snake_case verb_noun pattern (get_, search_, create_, update_, delete_, download_, upload_, attach_, read_). The only real deviation is `server_status`, a bare noun that breaks the verb-first convention.
26 tools is at the heavy end for the stated scope; the bookkeeping domain is genuinely broad (contacts, articles, vouchers, sales documents, files, master data), so most tools earn their place, but it sits just past the comfortable 3-15 range and includes some glue tools (get_deeplink, read_download, server_status) that add surface area.
Coverage is strong across the core lifecycle: full CRUD for contacts and articles, create/update for vouchers, create/get/download for sales documents, plus payments, files, master data, and deeplinks. Minor gaps remain—no update/delete for sales documents, no explicit list/search for sales documents or files attached to a voucher—but the descriptions acknowledge these as API or web-app limitations.