Skip to main content
Glama
benethos-hub

Unofficial Lexware Office MCP Server

by benethos-hub

非官方 Lexware Office MCP 服务器

CI PyPI Python Coverage License

免责声明

  • 本项目与 Lexware 或 Haufe-Lexware GmbH & Co. KG 无关联、未获其认可,亦未受其赞助。"Lexware" 和 "Lexware Office" 是其各自所有者的商标。

  • 它使用有文档记录的公共 API,API 密钥由您自行生成并可自行撤销。该 API 的使用受 Lexware 自身条款的约束,您需独立接受这些条款。API 可能随时变更,请求可能被限流或阻止。

  • 它访问的是真实的会计记录。写入权限默认关闭。如果启用,通过 API 创建的任何内容都是真实且具有法律效力的记录——已完成的单据无法通过 API 撤回。

  • 数据可能不完整或已过时。本工具不构成税务、会计或法律建议。 请勿依赖它进行申报、审计或履行记账义务。

  • 按"原样"提供,不附带任何担保。 仅供个人和专业使用,风险自负。请参阅 LICENSE

  • 对于商业用途,请审阅 Lexware 的 API 条款以及您自身的留存和文档义务。

一个 MCP 服务器,通过官方公共 REST API 将 MCP 客户端(如 Claude Desktop)连接到 Lexware Office 账户。您可以用自然语言询问发票、联系人、商品和凭证,让客户端为您获取这些信息。

状态:0.2.0。 该服务器处理联系人、凭证和单据:查找、读取、创建、修改,查看未付款项,下载 PDF 以及上传收据。get_profile 可回答当前连接的是哪个账户。下表中的每个工具均已构建完成,并已针对真实账户进行过验证。它通过 stdio 与启动它的客户端通信,也支持通过 bearer token 进行流式 HTTP 通信,并提供了对应的 Compose 文件。完整的技术规范和路线图请参阅 SPECS.md

为什么存在

Lexware Office 承载着小企业的日常会计工作。大多数问题都是查询类问题——还有哪些未付款?这个客户订了什么?哪张收据对应哪笔费用?——而这些正是助手在能够访问数据后最擅长回答的问题。本服务器无需导出任何数据即可实现这一点,只需使用账户所有者生成并可撤销的 API 密钥。

Related MCP server: lexware-mcp-server

安全第一

该服务器指向的是一个真实的会计系统,因此默认设置非常谨慎。

除非您有理由,否则请以只读模式运行。 该服务器可以修改真实的会计记录——创建联系人、录入凭证、开具发票、上传附件——而决定何时调用这些工具的是助手,不是您。--tools read-only 参数赋予它回答有关账簿问题所需的一切能力:搜索、读取和下载。该集合中没有任何写入操作。

当您确实需要启用写入工具时,请明确知晓它会留下什么痕迹。该 API 无法删除任何记账凭证,因此错误的凭证只能在 Web 应用中更正,而无法在此处撤回;已开具的发票是带有编号的真实单据,一旦使用便无法撤销。如果您不确定需要哪些工具,只读模式是诚实的起点——权限页面可以随时添加工具,像 Claude Desktop 这样的客户端会通过 notifications/tools/list_changed 通知立即感知变更,无需重启。

  • 在您明确授权之前,一切均未启用。 全新安装没有策略文件,服务器在未配置任何工具的情况下不会提供任何工具。服务器能做什么、不能做什么,是您做出的决定,绝不会是默认行为。

  • 每个工具一个标志,您可以在 --tools 参数中编写 JSON 文件,通过 setup 勾选,或手动编辑。这不是分级权限,而是精确到单个工具的开关:create_contact 开启而 upload_file 关闭,是完全正常的组合,任何组合都可以表达。

  • 成本在您决策时清晰可见。 每个启用的工具都会在每次请求时发送给助手,权限页面会明确列出每个工具。没有隐藏的工具,也没有"管理"后门。

  • 策略文件会被检查两次:一次在构建工具列表时,一次在调用到达时。因此,即使客户端持有过期的工具列表,也无法绕过您当前的策略。

  • API 密钥永远不会被记录,永远不会出现在工具结果中,也会从错误消息中移除。它只应放在 .env 文件中,绝无例外——不要放在客户端的配置文件里(那可能被其他程序读取或覆盖),也不要放在您截图分享的内容中。任何路径都不会从您的机器泄露给助手。

工具

已构建表示该工具目前可用。其余工具在 SPECS.md 中有详细说明,但尚未实现。

读取工具:

工具

功能

状态

get_profile

公司信息和连接检查

已构建

search_contacts

按名称、电子邮件、编号或角色查找客户和供应商

已构建

get_contact

单个联系人及其地址、角色和版本

已构建

search_articles

列出商品,可按编号、条码或类别筛选。API 不支持按名称搜索

已构建

get_article

单个商品及其价格块和版本

已构建

search_vouchers

核心查询——按类型、状态、联系人、日期范围以及是否未结清来筛选凭证列表

已构建

get_sales_document

完整读取发票、报价单、贷项通知单、订单确认书、交货单或催款单

已构建

get_voucher

按 ID 或单据编号读取记账凭证

已构建

get_payments

凭证的付款状态和未结金额

已构建

get_recurring_templates

按计划开具发票的模板,可获取单个或一页

已构建

get_master_data

国家、付款条件、过账类别和打印版式,支持搜索以缩小范围

已构建

download_document

保存销售单据的渲染 PDF 或 XML

已构建

download_file

保存已存储的文件,例如上传的收据

已构建

read_download

将下载的文件放入回答中,适用于无法跟随资源链接的客户端

已构建

get_deeplink

构建指向 Web 应用中销售单据、联系人或凭证的永久链接,无需 API 调用

已构建

写入工具。这些工具会修改真实的会计记录,因此请逐个启用,并且只针对您愿意接受变更的账户:

工具

功能

状态

create_contact

创建客户或供应商

已构建

update_contact

修改单个联系人,不会触及您未指定的字段

已构建

create_article

向商品目录添加商品

已构建

update_article

修改单个商品,不会触及您未指定的字段

已构建

create_voucher

录入记账凭证

已构建

update_voucher

修改已录入的凭证

已构建

create_sales_document

创建发票、报价单、贷项通知单、订单确认书、交货单或催款单——默认创建草稿,除非您要求开具,而助手只能在您明确指示时才能执行开具操作

已构建

upload_file

上传收据,同时会创建对应的凭证

已构建

attach_file_to_voucher

将文件挂到已存在的凭证上

已构建

update_contactupdate_voucher 需要两次 API 调用而非一次。该 API 是整体替换记录而非局部修补,因此需要先读取当前记录,再将变更叠加其上。否则,仅修改电子邮件地址就会清空地址、备注及其他所有字段。两者还都需要您上次读取的 version:如果记录在此期间发生了变化,更新将被拒绝,不会写入任何内容。

有一个工具会删除,而且它是唯一的一个:

| 工具 | 功能 | 状态 | | -------------------- | ---------------------------------------------------------------------------------------- | ------------ | | delete_article | 删除一篇文章。API 无法将其恢复。需要传入 confirm: true,否则不会发送任何内容 | 已构建 |

它是 `--tools irreversible` 步骤目前唯一的成员,因此该步骤是启用它的唯一方式。文章也是此 API 唯一允许你删除的内容,这正是另一方面的意义所在:

`--tools write` 并不等同于可撤销。该预设启用的任何工具都不会删除记录,但其中有两个工具会创建一条之后无法移除的记录。

**无法通过 API 删除记账凭证。** 没有对应的端点,因此错误的 `create_voucher` 必须在 Lexware Office Web 应用中更正。传入 `unchecked` 可记录一条待审核的条目,而不是立即过账。`upload_file` 也是如此:上传收据也会创建与之关联的凭证,因此尽管其名称只提到文件,它仍会留下记录。

下载内容会写入服务器所在计算机的下载目录,并通过两种方式报告:**路径**,当客户端与服务器共享同一台机器时,这是你需要的;以及**资源 URI**,客户端可以读取它以获取字节,无论服务器在哪里。文件本身永远不会在工具结果中传输,因为 base64 在上下文中约占文件大小的 1.37 倍,而且没有模型能读取 PDF。已有文件永远不会被替换:第二次下载会以带计数器的新名称保存在第一个文件旁边。

资源列表在服务器启动时从下载目录填充,因此 URI 在重启后仍可读取。服务器无法做到的是通告*新*下载:MCP SDK 无法让它发送列表更改通知,因此在启动时列出过一次的客户端将看不到会话后期获取的任何内容。

再加上 Claude Desktop 根本不遵循资源链接,`read_download` 是始终有效的途径。它接受相同的 URI 并将内容放入答案中。到达的内容取决于文件类型:

| 文件             | 到达形式                                 |
| ---------------- | ---------------------------------------- |
| XML              | 文本,因此 XRechnung 实际上可以被读取    |
| PDF              | 页面图片,默认为前 10 页                 |
| 图片             | 图片                                     |
| 其他任何内容     | 供客户端处理的内嵌二进制文件             |

PDF 是渲染而不是直接传递的,因为 Claude Desktop 在调用 API 时会将其转换为图像块,而 `application/pdf` 在那里不是允许的图像类型,因此整个请求会被拒绝。渲染也不消耗 API 调用,因为文件已经在服务器上。

指向 Web 应用的链接是一个单独的工具。`get_deeplink` 将 id 转换为浏览器 URL,不消耗 API 调用,并且是当客户端既无法显示文件也无法显示资源链接时仍然有效的途径:由用户自行打开。下载不附带链接——它回答的是字节在哪里,这是一个不同的问题,而这两者曾经合并在一起,导致一个损坏的链接与一个可用的下载一起出现。

`upload_file` 接受 PDF、JPEG、PNG 和 XML,每个文件最大 5 MiB,这是 API 的限制。XML 文件被视为 XRechnung,如果不是则会被拒绝。

## 要求

* [uv](https://docs.astral.sh/uv/getting-started/installation/),它自带 Python 和下面所有示例使用的 `uvx` 命令
* Python 3.11 或更高版本,如果你更愿意自带 Python 的话。安装会拉取 MCP SDK、httpx、platformdirs 和 pypdfium2,最后一个是用于渲染 PDF 页面的
* 启用了公共 API 插件的 Lexware Office 账户
* 来自 <https://app.lexware.de/addons/public-api> 的 API 密钥

## 获取 API 密钥

1. 以账户所有者身份登录 Lexware Office。
2. 打开 <https://app.lexware.de/addons/public-api> 上的公共 API 插件。
3. 创建密钥并复制一次——它只显示一次。
4. 不要将其放入任何进入版本控制的文件中。将其放在 `config/.env` 中(该文件已被 gitignore),或将其作为环境变量传递。无论从哪个目录启动服务器,`config/.env` 中的密钥都能被找到,因此像 Claude Desktop 这样的客户端无需在其配置文件中包含自己的密钥。

密钥可以随时在同一页面上撤销,如果出现任何异常,这是切断访问的最快方式。

## 安装

**1. 安装 uv**,如果你还没有安装的话——[uv 安装页面](https://docs.astral.sh/uv/getting-started/installation/)涵盖了所有平台。它会带来 `uvx`,而这正是这里唯一需要的。

**2. 配置服务器。** 这不需要安装任何东西:`uvx` 会获取包并运行它。

GXP1

这会打开[在浏览器中配置](#configuring-it-in-a-browser)中描述的界面:密钥、设置和每个工具一个复选框。它所做的所有事情都可以手动完成——使用 `uvx benethos-lexware-office-mcp --settings-sample > config/.env` 启动设置文件,将密钥放入其中,然后按照下面的说明使用 `--tools`。

检查它是否正常工作:

GXP2

**3. 在 `claude_desktop_config.json` 中将其指向 Claude Desktop**:

GXP3

你的机器路径不会出现在其中,这正是重点:`uvx` 按名称查找包。关于该条目有两点值得了解:

* **固定版本**以获得稳定性:`"args": ["benethos-lexware-office-mcp==0.2.0"]`。如果不固定,`uvx` 会获取其能解析到的最新版本,而重启客户端就足以改变其运行的内容。
* **`uvx` 必须在客户端使用的 `PATH` 中**,这并不总是你的终端所拥有的那个——一些 GUI 客户端会传递一个精简的环境。如果服务器无法启动,请将 `uvx` 的绝对路径放入 `command` 中,并完全重启客户端,而不是重新加载。

**想要一个自己的命令?**
`uv tool install benethos-lexware-office-mcp` 会给你 `benethos-lexware-office-mcp`,而无需前面的 `uvx`,如果你经常从命令行更改权限,这是值得的。除此之外没有其他好处:两种方式都可以固定相同版本,热启动差异也只有几十毫秒。有一点需要了解——uv 会将其安装到自己的工具目录中,该目录**不在全新安装的 `PATH` 中**。它会在完成时说明这一点。运行 `uv tool update-shell` 并打开一个新终端。

**或者从源代码**,用于开发或运行未发布的内容:

GXP4

然后客户端需要该检出虚拟环境的解释器,`command` 在 Windows 上指向 `.venv/Scripts/python.exe`,在其他平台上指向 `.venv/bin/python`,`args` 为 `["-m", "benethos_lexware_office_mcp"]`。

**这里故意没有密钥。** 服务器会在 `.env` 中找到它。客户端的配置文件不是存放凭据的地方:它不是你的——另一个程序拥有它,决定它在哪里以及何时重写它。这是人们在 MCP 设置遇到问题时截图求助的文件,它可以在客户端自己的设置视图中读取,并会随客户端的其他配置一起传播到下一台机器。而 `.env` 至少是这个项目记录在案的文件,没有任何东西会代表你同步它,而且配置界面在写入时永远不会把密钥显示回给你。

这个 `.env` 已经是需要小心的部分了。它包含实时会计系统的凭据,因此请将其远离版本控制、共享文件夹以及其他人可以读取的备份。当你停止使用服务器时,请删除它**并撤销密钥**,在扩展、公共 API 下操作——撤销才是真正结束访问的唯一步骤。

**4. 完全重启 Claude Desktop**——从系统托盘退出,而不是关闭窗口。这是为了你刚刚编辑的配置文件,客户端在启动时读取一次,这也是 `.env` 中更改的设置所需要的——服务器也会在启动时读取这些设置。权限**不**需要重启:之后更改权限,运行中的客户端会收到通知,请参阅[关闭单个工具](#switching-individual-tools-off)。

## 在浏览器中配置

GXP5

在 `127.0.0.1` 上有三个页面,按 Ctrl+C 关闭。它们写入与命令行相同的文件,因此你可以使用其中一个或两个。界面是德语的,因为 Lexware Office 仅面向德国公司销售,下面每个页面都按其功能命名,并在方括号中标注其标签。

**概览**(`Übersicht`)——实际生效的是哪个 `.env` 和哪个 `tools.json`,每个设置解析为什么值以及该值来自哪里,每个文件是否已存在,有多少工具处于开启状态及其成本。连接测试在按钮上,而不是在页面加载时。

**凭据**(`Zugangsdaten`)——API 密钥,在保存前会对照 API 检查,除非你另有说明,以及非机密的设置。密钥永远不会显示回给你,永远不会记录,也永远不会导出。如果是环境变量在设置它,页面会说明,因为这会覆盖你保存的任何内容。

**权限**(`Rechte`)——每个工具一个复选框,分组显示,预设为按钮。在全新安装且尚无策略文件时,读取工具会预先勾选作为起点——这是表单中的建议,而不是权限:在按下保存之前仍然没有文件,因此也没有工具,页面会说明这一点。每一行都标明该工具在上下文中对助手的成本,总计会跟随你的勾选而变化:每个启用的工具都会在**每次**请求时发送给模型,因此开启一个工具既是预算决策,也是权限决策。写入工具会标记出来,API 无法收回结果的工具会单独标记:联系人为 `nur App`,Lexware Office 会毫不客气地删除它;进入账簿的记录为 `nur App · Buchhaltung`。两者都不意味着它被卡住了——创建时没有任何内容是固定的,页面上的图例会说明稍后绑定记录的四件事。

配置文件也在这里。将当前选择保存到名称下,稍后加载。加载只会填充框:在按下保存之前,不会有任何内容写入 `tools.json`。已占用的名称会被拒绝,而不是静默替换现有内容——大小写和空格不会创建第二个配置文件——替换是列表旁边自己的按钮。它们存储在策略文件旁边的 `tool_profiles.json` 中。

**策略文件本身**可以从同一页面下载并读回——文件保持原样,因此它可以在另一个安装上使用,无论有没有此界面,而由 `--tools` 写入的 `tools.json` 也可以在这里读取。读取只会勾选复选框,保存仍然需要单独按下。文件未提及的工具保持**关闭**状态,页面会说明有多少个,这就是命令行中 `--tools sync` 的作用。

有两点值得了解。它**只绑定 `127.0.0.1`**——这些页面没有密码,只有在无法从其他机器访问的情况下这才合理,因此没有更改它的选项。而且它是一个**单独的命令**:MCP 服务器从不提供 HTTP 服务,像 Claude Desktop 这样的客户端启动的是那个,而不是这个。

`--port N` 可以移动它,`--no-browser` 只打印地址,`--env-file` 和 `--tools-file` 指定它编辑哪些文件。与其他地方不同,这些文件尚不存在也可以。

如果你的客户端以 --tools-file 启动服务器,请给 setup 传入同样的参数——否则它会编辑另一个文件并报告成功。两个进程在启动时都会修复各自的文件,之后再也不改动它们,而且任何一方都无法看到另一方是如何启动的。概览页面会打印出 "args" 那一行,让你的客户端与界面所持有的文件相匹配,这是更省事的方向。

逐个关闭工具

一个 JSON 文件决定这个服务器提供什么,其他任何东西都不起作用。要么在上面的 setup 下勾选相应的框,要么用以下命令启动文件

uvx benethos-lexware-office-mcp --tools read-only

这会把每个工具都写入 tools.json,把读操作设为开、其余设为关,并打印它所做的事情。三个预设,每个都包含前一个:

启用

--tools read-only

仅查询

--tools write

以及创建和更新

--tools irreversible

以及删除文章

--tools sync

不改变任何标志,只添加文件中尚未见过的工具

--tools show 只做报告。--tools-file PATH 指定写入位置,并且与所有选项兼容——--tools write --tools-file ./tools.json 会在那里创建文件。

预设会覆盖整个文件,因此手工编辑会丢失。用预设来创建文件,而不是更新文件。升级带来新工具后,运行 --tools sync:它会将新工具写入为关,保留你设置的所有标志,并且绝不会打开任何东西。最后这一点正是它为什么是这些选项中唯一适合从脚本运行的原因。

第三步单独成一步,因为它本身就是一个独立的决定:被删除的东西就没了,所以应该通过指名道姓来选择它,而不是通过挑选最大的选项。恰好有一个工具带有这种效果,即 delete_article,而且这不是临时状态——文章是这个 API 唯一能删除的东西,而且事后也没有办法预订、定稿或作废任何东西。

如果没有 --tools-file,文件的搜索方式与 .env 完全相同,优先级从低到高:

  1. 每用户配置目录

  2. 从源码运行时,检出目录的 config/

  3. 工作目录的 config/,然后是工作目录根目录

最后找到的生效,而尚未被任何人创建的文件解析为第一个。之后,编辑它:

{
 "create_contact": false,
 "search_contacts": true,
 "upload_file": false
}

设为 false 的工具不会被列出,也无法被调用。文件中未提及的工具同样处于关闭状态——沉默即拒绝,因此随升级而来的工具会等待你,而不是自行出现。完全没有文件意味着完全没有工具,这就是为什么 --tools 是搭建服务器的一部分。

文件在构建工具列表时被读取,并且在每次调用时再次读取,因此编辑会立即在两个方向生效——无需重启。服务器还会在启用的工具集合发生变化时告知客户端,因此客户端会自行重新获取列表:Claude Desktop 在运行中就能捕捉到变化。无论哪种方式都不依赖于此,因为已被关闭的工具无论客户端仍在显示什么列表都无法被调用。如果你的客户端没有注意到,请重启它——Claude Desktop 通过从托盘退出来重启。

每个工具还声明了它是什么——读取还是写入、属于哪个组、以及它写入的内容是否可以被再次删除。这个分类正是 --tools read-only 所依据的选择标准,也是浏览器界面分组和标记的依据。它绝不会决定一次调用:只有文件才能决定。

配置

值从哪里来,哪个胜出

六个来源,从低到高——后面的覆盖前面的:

  1. 内置默认值

  2. 每用户配置目录中的 .env

  3. 服务器运行所在的检出目录的 config/.env(如果它从检出目录运行)

  4. 工作目录的 config/.env,然后是工作目录的 .env

  5. --env-file 指定的文件,它在所有这些之后被读取,而不是替代它们:它是被指名而非被找到的,所以它优先于它们

  6. 真正的环境变量,它胜过所有文件

最后一个是让人意外的那一个。在你的 shell 中导出的、放在客户端 env 块中的、或固定在 Compose 文件中的设置,无法通过编辑 .env 来更改——手工不行,通过 setup 也不行。值被写入了,文件是正确的,但什么也没发生。

配置界面会直接说明这一点,而不是让你自己去发现:每个设置都带有一个标明其来源的徽章,而由环境变量持有的设置会被标记为如此。当你保存的内容似乎被忽略时,那个徽章就是答案。

在容器中这不是边缘情况。 compose.yaml 将传输方式、绑定地址、端口和允许的主机固定为真正的环境变量,因为这些属于容器而非容器内的安装。其他一切——API 密钥、HTTP 令牌、限制——都留给配置卷,这正是配置界面能够更改它们的原因。

同样的顺序适用于策略文件,而 LXO_MCP_TOOL_POLICY--tools-file 直接指定一个。界面固定它在启动时找到的那个文件,因此页面无法在你自己不知情的情况下换掉自己的主题。

命名文件

--env-file PATH 指定一个设置文件而不是搜索,并与 --tools-file 配对,这样客户端配置中的一条条目就携带自己的账户和自己的权限:

"args": ["--env-file", "/path/to/test.env",
         "--tools-file", "/path/to/test-tools.json"]

不存在的路径会被拒绝,而不是悄悄回退到搜索——setup 除外,它存在的部分目的就是创建一个。

setup 会为你写入这个文件。

设置

变量

含义

默认值

LXO_MCP_API_KEY

你的 Lexware Office API 密钥。必填。

LXO_MCP_TOOL_POLICY

按工具的开/关文件,见下文

配置目录中的 tools.json

LXO_MCP_BASE_URL

API 基础 URL

https://api.lexware.io

LXO_MCP_APP_BASE_URL

用于深层链接的 Web 应用基础

https://app.lexware.de

LXO_MCP_DOWNLOAD_DIR

下载的文档存放位置

用户缓存目录

LXO_MCP_TIMEOUT

HTTP 超时(秒)

30

LXO_MCP_RATE

每秒请求数,跨所有端点全局生效

1.5

LXO_MCP_BURST

令牌桶容量。账户自己的桶容量为 4

2

LXO_MCP_PAGE_SIZE

搜索请求和返回的每页行数

25

LXO_MCP_PDF_PAGES

read_download 默认渲染的 PDF 页数

10

LXO_MCP_LOG_LEVEL

stderr 上的日志级别

INFO

LXO_MCP_TRANSPORT

stdiostreamable-httpsse

stdio

LXO_MCP_BEARER_TOKEN

每个 HTTP 请求必须携带的共享密钥。HTTP 传输方式必填

LXO_MCP_HTTP_HOST

HTTP 传输方式的绑定地址

127.0.0.1

LXO_MCP_HTTP_PORT

绑定端口

8770

LXO_MCP_HTTP_PATH

传输方式服务的 URL 路径

/mcp

LXO_MCP_ALLOWED_HOSTS

除回环外要接受的 Host 值,逗号分隔

LXO_MCP_GENERATE_BEARER_TOKEN

启动时若未设置则生成令牌并写入设置文件

LXO_MCP_EXIT_ON_CONFIG_CHANGE

设置文件变化时结束进程,供会重启它的东西使用

以上每个设置都在使用中。LXO_MCP_PAGE_SIZE 上限为 250,这是任何端点接受的最小页面大小,更大的值会在启动时被拒绝,而不是稍后变成 API 错误。

传输方式

stdio 是默认方式,也是 Claude Desktop 和类似的本地客户端所使用的:客户端将服务器作为自己的子进程启动,其他任何东西都无法与它通信。

streamable-HTTPSSE 在端口上提供相同的工具,供容器或专用机器使用:

uvx benethos-lexware-office-mcp --transport streamable-http --port 8770

那个端口前面有两道防线,两者都不可省略。一个承载令牌,每个请求都必须以 Authorization: Bearer <token> 携带——没有 LXO_MCP_BEARER_TOKEN,服务器会完全拒绝启动 HTTP 传输方式,因为任何能访问该端口的人都可以消耗你的 Lexware 凭据。还有 SDK 的 DNS 重绑定防护,它根据回环名称的允许列表检查 HostOrigin,在容器或代理将另一个名称放在前面时由 --allowed-hosts 扩展。

两者都不会让端口可以在网络上发布。它们让端口在与共享机器上的其他进程共存时能够存活。--host 绑定到回环以外的地址,容器必须这样做——参见在容器中了解为什么这并不像看起来那样是放宽限制。

在容器中

镜像发布为 linux/amd64linux/arm64,因此运行一个容器不需要本仓库中的任何东西:

docker pull ghcr.io/benethos-hub/lexware-office-mcp:latest

使用 :0.2.0 而不是 :latest 来固定版本。

使用 Compose

docker compose up -d                      # the server, on 127.0.0.1:8770
docker compose --profile setup up -d      # add the configuration interface

按原样提供时,compose.yaml 从本检出目录构建。其两个服务中各有两行被注释掉的行可切换到已发布的镜像,之后该文件就是你从这里需要的唯一东西。

作为单个容器

docker run -d --name lexware-office-mcp \
  --restart unless-stopped \
  -p 127.0.0.1:8770:8770 \
  -v lxo-config:/config -v lxo-downloads:/downloads \
  ghcr.io/benethos-hub/lexware-office-mcp:latest

它为自身生成的令牌在配置卷中,你可以从这里读取:

docker exec lexware-office-mcp cat /config/.env

配置界面是同一个镜像,使用其另一个命令,指向同一个卷:

docker run --rm -d --name lexware-office-mcp-setup \
  -p 127.0.0.1:8771:8771 \
  -v lxo-config:/config -v lxo-downloads:/downloads \
  ghcr.io/benethos-hub/lexware-office-mcp:latest \
  setup --no-browser --host 0.0.0.0 --port 8771 \
        --env-file /config/.env --tools-file /config/tools.json

--restart unless-stopped 在这里不是装饰。 容器在设置文件变化时结束其进程,这正是将已保存的设置带入运行中的服务器的方式。没有重启策略,它就结束并保持结束状态。

无论哪种方式

打开 http://127.0.0.1:8771/,输入密钥,勾选工具,然后再次停止界面——docker compose --profile setup down,或 docker stop lexware-office-mcp-setup。它只应在需要的几分钟内运行,而不是永久运行,因为它没有登录功能,而且它接受 API 密钥。

无需事先准备任何东西。 首次启动时,服务器会生成一个承载令牌,将其写入配置卷并说明这一点——界面会显示它,而那就是客户端需要的值。它没有被烘焙进镜像,否则每个副本都会共享同一个令牌。

容器绑定 0.0.0.0,这并非放宽限制。 容器自身回环(loopback)上的进程根本无法通过已发布的端口被访问。隔离机制是网络命名空间,谁能访问该端口由发布(publish)决定,而发布仅映射 127.0.0.1

浏览器中保存的设置会送达运行中的服务器。 设置在启动时仅读取一次,因此当设置文件发生变化时,容器被告知结束,Compose 在一秒后重新启动它。Compose 固定为真实环境变量的内容——传输协议、绑定地址、端口、允许的主机——属于容器本身,无法从卷中更改,请参阅配置

示例提示

服务器连接后,以下提示即为预期用法:

  • “哪些发票仍未结清,其中哪些已逾期?”

  • “显示我们本季度向 Muster GmbH 客户开具的所有账单。”

  • “发票 RE-2024-0142 包含什么内容,是否已付款?”

  • “查找编号为 A-1007 的商品,并告诉我它的当前价格。”

  • “下载我们开具的最后一张贷项通知单的 PDF。”

  • “给我一个在 Lexware Office 中打开凭证 X 的链接。”

速率限制

Lexware API 允许每秒两个请求,通过令牌桶强制执行。该预算全局共享——同时覆盖 API 的所有端点,因此读取联系人和读取发票消耗的是同一个配额。

服务器以单一令牌桶镜像此机制,由进程中的每个请求共享,默认情况下以略低于文档所述速率的频率补充。Lexware 指出,在没有缓冲的情况下精确执行限制,一旦网络抖动导致到达时间偏移,往往会仍然产生 429 错误,因此默认设置留有裕量。请求通过该令牌桶串行化而非并行发出,这意味着涉及许多文档的宽泛问题会变慢而不会被阻止。

有两点值得了解:

  • 该预算属于你的账户,而非此进程。服务器的另一个实例、其他集成,或你自己运行的脚本,都从相同的每秒两次配额中消耗。

  • Lexware 警告,在 429 后持续猛攻的客户端可能被永久封禁。因此服务器呈指数退避,并在几次尝试后放弃,而非更努力地重试。

账户的令牌桶于 2026-08-21 测得容量为:同时发出五个请求,四个通过,一个被拒绝。默认值 2 为同一账户上消耗配额的其他一切——Web 应用、其他集成、此服务器的另一个实例——留出一半。只有当你确定此服务器是唯一消费者时,才将其提升为 4

如果你的账户行为不同,两个限流值均可通过 LXO_MCP_RATELXO_MCP_BURST 配置。

开发

uv sync --extra dev
uv run pytest -q
uv run ruff check .
uv run ruff format --check .
uv run mypy

测试套件完全离线运行。它模拟 HTTP 层,无需 API 密钥,因此可在任何地方运行。有两类测试在不离开机器的情况下退出进程:三类测试将服务器作为真实子进程启动,并通过 stdio 与之进行 MCP 通信,这同时也证明了启动路径上没有任何内容写入 stdout;配置接口通过真实的回环 HTTP 服务器和真实的 Cookie 罐(cookie jar)驱动,因为其 CSRF 防护只有以浏览器面对它们的方式测试才有意义。

此仓库不附带任何 API 密钥,CI 中也不应有密钥,因此签出的代码本身永远无法与 Lexware 通信。因此,对照真实 API 检查服务器始终是一次需要使用你提供的密钥、有意进行的本地运行,与上述测试套件分开,也绝不包含在其中:

uv run python tests/smoke.py
uv run python tests/smoke.py --env-file path/to/.env

它读取你的账户,不会向账户写入任何内容。它构建的服务器使用 read-only 预设,因此写入工具根本不存在可供调用。它会打印检查了什么、账户中没有什么、什么失败了,并掩盖记录 ID,以便报告可以粘贴到某处。pytest 永远不会运行它。关于为什么实时检查不是门禁,请参阅 SPECS.md 第 14.1 节。

首个版本发布后欢迎贡献和提交问题。在此之前,SPECS.md 是记录设计决策的地方,包括仍需对照实时 API 解决的未决问题。

许可证

MIT。参见 LICENSE

商标与关联声明

本项目与 Lexware、Haufe-Lexware GmbH & Co. KG 或其任何子公司无关联、未获其认可或赞助。 “Lexware”和“Lexware Office”是各自所有者的商标,此处仅以描述性方式用于指代本软件所集成的 API。

该软件仅通过账户所有者提供且可撤销的凭据,与文档化的公共 API 进行通信。使用该 API 受 Lexware 自身条款的约束,你独立于本项目接受这些条款。

Install Server
A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
2Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    B
    quality
    C
    maintenance
    MCP server for DACH accounting automation. Connect AI assistants to sevDesk and Lexoffice — create invoices, manage contacts, handle bookings and vouchers for German-speaking businesses.
    15
    37
  • A
    license
    B
    quality
    A
    maintenance
    MCP server for the Lexware Office API that enables management of invoices, contacts, articles, vouchers, and more through the Model Context Protocol.
    66
    161
    6
    Functional Source , Version 1.1, MIT Future
  • A
    license
    C
    quality
    C
    maintenance
    Enables natural language interaction with the WeFact invoicing platform, allowing users to manage debtors, invoices, products, subscriptions, and perform various administrative tasks via MCP-compatible clients.
    18
    1
    AGPL 3.0
  • A
    license
    B
    quality
    C
    maintenance
    An MCP server for Danish accounting via Billy.dk API, enabling natural-language control over invoices, bank lines, reports, and more, with a write-guard for safety.
    65
    MIT

View all related MCP servers

Related MCP Connectors

  • Log, query, and edit expenses, budgets, and accounts in Ledgy from any MCP-compatible AI assistant.

  • Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.

  • Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/benethos-hub/lexware-office-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server