mcpField
B
benethos-lexware-office-mcp

benethos-lexware-office-mcp

本地服务
github.com/benethos-hub金融数据21 天前更新

关于 benethos-lexware-office-mcp

benethos-lexware-office-mcp 通过公开的 REST API 将 MCP 客户端连接到 Lexware Office 会计数据。它提供可单独控制的读写工具,写入权限默认关闭。

主要功能

  1. 01读取联系人、凭证和销售单据
  2. 02查看付款状态与未付金额
  3. 03创建和更新会计记录
  4. 04下载单据并上传收据
  5. 05逐项工具权限与只读模式
  6. 06stdio 和 streamable HTTP 传输

适用场景

  1. 01查找未付凭证及付款详情
  2. 02查看客户联系人和销售单据
  3. 03下载发票 PDF 或上传收据
  4. 04为助手启用指定会计操作

MCP 相关

该服务将 Lexware Office 账户和单据操作作为 MCP 工具提供。它支持 stdio 和 streamable HTTP,仅开放策略文件启用的工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
pypibenethos-lexware-office-mcp0.7.0
ocighcr.io/benethos-hub/benethos-lexware-office-mcp:0.7.0
mcpbbenethos-lexware-office-mcp-0.7.0.mcpb

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

README 配图 非官方 Lexware Office MCP 服务

CI Coverage License Python

PyPI benethos-lexware-office-mcp Container benethos-lexware-office-mcp

Sponsor PayPal

免责声明

  • 本项目与 Lexware 或 Haufe-Lexware GmbH & Co. KG 无关联,未获其认可或赞助。“Lexware”和“Lexware Office”是其各自所有者的商标。
  • 本项目使用有文档说明的公开 API,并通过您自行生成、可自行撤销的 API 密钥进行访问。该 API 的使用受 Lexware 自身条款约束,您需独立于本项目接受这些条款。API 可能随时变更,请求也可能受到速率限制或被阻止。
  • 本项目会访问真实的会计记录。默认关闭写入权限。如果您启用该权限,通过 API 创建的任何内容都是真实且具有法律效力的记录——已定稿的文档无法通过 API 撤回。
  • 数据可能不完整或过时。**此处内容不构成税务、会计或法律建议。**请勿将其用于申报、审计或履行记账义务。
  • 本项目按“原样”提供,不作任何保证。供您自行承担风险,用于个人和专业用途。请参阅 LICENSE。
  • 商业用途请查看 Lexware 的 API 条款,以及您自身的数据保留和文档记录义务。

目录

一个 MCP 服务,可通过官方 公共 REST API 将 Claude Desktop 等 MCP 客户端 连接到 Lexware Office 账户。用日常语言询问发票、 联系人、商品和凭证,并让客户端为你获取相关信息。

状态:0.6.2。 此服务支持联系人、凭证和单据:查找、读取、创建和修改,查看未付款项, 下载 PDF,以及上传收据并将其记账。get_profile 可查看当前连接的账户。 下表中的所有工具均已开发完成,并且都在真实账户上进行了测试。它通过 stdio 连接启动它的客户端,可作为 Claude Desktop 扩展或从 PyPI 运行;也可在需要 由其他程序访问时,通过 bearer token 在 streamable HTTP 上提供服务——既可使用 已发布的容器镜像,也可使用用于运行服务或从代码检出构建服务的 Compose 文件。 完整技术规范和路线图请参阅 SPECS.md。

为何开发此工具

Lexware Office 保存着小型企业的日常账务记录。有关账务的大多数问题都需要读取数据—— 还有哪些款项未付、某个客户订购了什么、哪张收据对应那笔支出——而只要助手能够 查看数据,就能很好地回答这些问题。此服务无需导出任何内容,即可实现这一点; 它使用由账户所有者生成且可随时撤销的 API 密钥。

安全第一

该服务指向真实的会计系统,因此默认设置较为谨慎。

除非有充分理由,否则请以只读模式运行。 此服务可以更改真实的会计记录——创建联系人、记录凭证、开具发票、附加收据——而是否调用这类工具由助手决定,不是由你决定。--tools read-only 已提供回答账簿相关问题所需的一切,这也是大多数人使用它的目的:搜索、读取和下载。该工具集中的操作都不会写入数据。

需要使用写入工具时,再启用它,并了解它会留下什么记录。此 API 完全无法删除记账凭证,因此凭证有误时要在 Web 应用中更正,不能在这里撤销;已定稿的发票则是真实文件,带有已使用的编号。如果你不确定需要哪些工具,只读模式是稳妥的起点——在权限页面上只需点击一下即可添加工具;而支持 notifications/tools/list_changed 的客户端(例如 Claude Desktop)无需重启就能获取变更。

  • 未经你明确允许,不会启用任何工具。 全新安装时没有策略文件,没有策略文件的服务不会提供任何工具。此服务可以执行哪些操作,始终取决于有人作出的决定,绝非默认行为。
  • 每个工具对应一个标记,可通过 --tools 创建 JSON 文件、通过 setup 勾选,或手动编辑。没有等级,也没有分组:启用 create_contact、禁用 upload_file 完全合理,文件可以表达任意组合。
  • 决定启用工具时,其成本清晰可见。 每次请求都会将所有已启用的工具发送给助手,权限页面会在每一行显示对应的数量。
  • 工具列表生成时会检查该文件,收到调用时也会再次检查,因此客户端中过时的工具列表无法绕过限制。
  • API 密钥绝不会记入日志、不会在工具结果中返回,也会从错误消息中删去。它只能放在 .env 中——不能放在客户端的配置文件中,因为该文件由其他程序管理并会被重写,而且人们寻求帮助时最常截图的就是这个文件。你的计算机上的任何路径也不会传给助手。

工作原理

本地 AI Agent 通过 stdio 连接到服务;远程 Agent 则通过携带 bearer token 的 HTTP 连接。服务内部的策略文件 tools.json 决定哪些工具可用,每次调用都通过一个 API 客户端和一个限速器,经由 HTTPS 连接到 Lexware Office 的公共 API。setup 是一个独立进程,由提示词 Set up Lexware Office 或命令行启动,它会写入供服务读取的 .env 和 tools.json。下载内容会保存到一个最多保留最近 100 个文件的文件夹中。

客户端启动服务,或通过 HTTP 连接到服务,并与之使用 MCP 通信。在任何内容到达 Lexware 之前,就已确定模型可以执行哪些操作:策略文件中未列出的工具对客户端而言并不存在,所有剩余的调用都会通过一个 API 客户端和一个限速器。密钥和权限分别存储在两个由 setup 写入的文件中;setup 是一个独立进程,可由客户端的提示词 Set up Lexware Office 启动,也可在终端中运行 benethos-lexware-office-mcp setup 启动。

工具

下面的每个工具都已构建完成,并在真实账户上测试过。在策略文件中列出之前,它们都不会启用。

读取工具:

工具功能
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修改已记录的凭证,或为 upload_file 留下的未核对收据记账
create_sales_document创建发票、报价单、贷项通知单、订单确认单、送货单或催款单 — 默认创建草稿;只有在你明确指示时,助手才可以将其开具
upload_file从路径或 URL 上传收据,同时创建对应凭证
attach_file_to_voucher将文件附加到已有凭证

update_contact 和 update_voucher 需要调用 API 两次,而不是一次。 API 会替换记录,而不是对记录进行局部更新,因此会先读取当前记录,再在其基础上应用更改。否则,只修改电子邮件地址就会清空地址、备注以及其他所有内容。两者还需要提供你上次读取的 version:如果记录在此期间发生更改,更新就会被拒绝,且不会写入任何内容。

只有一个工具可以删除内容:

工具功能
delete_article删除商品。API 无法恢复已删除的商品。需要传入 confirm: true,否则不会发送任何内容

目前它是 --tools irreversible 步骤中的唯一成员,因此只有通过该步骤才能启用它。商品也是此 API 允许删除的唯一对象,这也是这点的另一层含义:

--tools write 并不意味着可撤销。该预设启用的工具都不会删除记录,但其中五个会创建此 API 无法事后移除的记录:create_contact 创建的联系人只能通过 Web 应用删除;create_voucher、create_sales_document、upload_file 和 attach_file_to_voucher 则会留下记账记录。 **无法通过 API 删除记账凭证。**没有对应的端点,因此错误的 create_voucher 必须在 Lexware Office 网页应用中更正,而且凭证会在创建时立即入账——API 不接受传入状态。upload_file 也是如此:上传收据也会创建与之对应的凭证,所以即使名称只提到文件,也会留下记录。该凭证最初未核对,update_voucher 会填写凭证信息,并在你要求时将其入账。

下载文件会写入服务器运行所在机器上的下载目录,并通过两种方式报告:路径,适用于客户端和服务器共用同一台机器的情况;以及资源 URI,客户端可通过它读取文件字节,无论服务器在哪里。文件本身不会放进工具结果中,因为 base64 会让上下文占用量增加约 1.37 倍,而且模型无论如何都无法读取 PDF。绝不会覆盖已有文件:如果下载内容与已有文件相同,就会复用该文件;如果不同,则会在同一目录下另存一份,并在文件名中添加计数。

下载目录缓存最近的 100 份文档。服务器启动时和每次下载后都会删除较旧的下载文件,因为每份文档仍在 Lexware Office 中,只需一次调用即可获取。LXO_MCP_KEPT_DOWNLOADS 可更改保留数量,设为 0 则保留所有文件。使用 LXO_MCP_DOWNLOAD_DIR 指定的目录默认不会被清理;即使你也设置了清理数量,也只会删除文件名符合下载文件命名规则的文件:名称中含空格、变音符或 .docx 等扩展名的文件都不会被删除。每次客户端请求时,资源列表都会从目录中读取,列出相同的最新下载文件,并且在服务器重启后仍然可用。新下载文件的通知方式与工具列表变更相同:服务器会发送 notifications/resources/list_changed,因此,已列出过下载文件的客户端可以再次请求列表,而不必一直沿用会话开始时的列表。是否重新请求由客户端决定。

资源列表不会包含在提示词中。每次请求都会向模型发送工具列表。资源列表只有在客户端请求时才会发送,客户端如何处理由客户端决定。Claude Desktop 会在附件菜单中提供来自该服务器的文件,位于添加自下方;有人选中文件后,文件才会进入对话。若客户端将整个列表交给模型,相关费用就由此产生:每个条目包含 lexware:// URI、文件名、类型和大小——绝不会包含这台机器上的路径——长度约为 230 个字符,因此默认的 100 个条目约有 23,000 个字符,相当于约 6,000 到 7,000 个 token。对于这类客户端,可调低 LXO_MCP_KEPT_DOWNLOADS,列表和缓存都会随之缩短。

Claude Desktop 根本不会跟随资源链接,因此 read_download 是始终可用的方式。它接收相同的 URI,并将内容放入回答中。返回内容取决于文件类型:

文件返回形式
XML文本,因此可以实际读取 XRechnung
PDF页面图像,默认前 10 页
图像图像
其他任何文件嵌入式二进制数据,由客户端处理

PDF 会被渲染,而不是直接传递,因为 Claude Desktop 调用 API 时会将嵌入式二进制数据转换为图像块,而 application/pdf 在那里不是允许的图像类型,因此整个请求会被拒绝。渲染也不会产生 API 调用,因为文件已经在服务器上。

指向网页应用的链接由另一个工具提供。get_deeplink 会将 ID 转换为浏览器可用的 URL,不产生 API 调用;当客户端既无法显示文件,也无法显示资源链接时,这是仍然可用的方式:由用户自行打开链接。下载内容不会附带此类链接——下载回答的是字节存放在哪里,这是另一个问题。两者曾经被组合在一起,结果一个坏链接搭上了可正常使用的下载。 upload_file 和 attach_file_to_voucher 接受一个 source:运行服务的机器上的路径,或用于获取文件的 URL。无论哪种方式,文件都必须是 PDF、JPEG、PNG 或 XML,且每个文件最大为 5 MiB,这是 API 的限制。XML 文件会被视为 XRechnung;如果不是,就会被拒绝。

模型会选择路径。 未设置 LXO_MCP_UPLOAD_DIR 时,upload_file 和 attach_file_to_voucher 会读取此进程有权限读取且扩展名符合上述类型的任何文件,并将其发送到 Lexware。这包括任何 .xml 文件:配置文件或导出文件只有在到达 API 后才会因不是 XRechnung 而被拒绝。将它设置为一个目录——例如用于存放收据的收件箱——就不会读取该目录以外的任何内容,包括链接。

URL 只能来自你允许的地址。 其他服务可以向模型提供指向文件的短时链接——例如邮件服务器提供的附件链接——随后文件会从该服务直接传到 Lexware,不经过模型。LXO_MCP_UPLOAD_URLS 列出此类链接可以指向的地址,以逗号分隔:包含协议和主机,可选端口和路径起始部分,例如 https://files.example.com/inbox/。未设置此项时,不会获取任何 URL。 必须设置此列表,因为模型会选择 URL,而且模型会读取邮件:否则,消息中隐藏的一条指令就可能让服务从任何可访问的位置获取文件,包括你自己网络上的文档服务,再将获取到的内容归档到账簿中。不符合任何前缀的链接会在发送任何内容之前被拒绝;不会跟随重定向;获取操作会在 30 秒后超时,文件大小会被限制在 5 MiB。请求时会要求不压缩;空文件会被拒绝;如果通过代理访问本机上的服务,则会直接获取,因为代理无法访问该服务。文件如果只以字节流、application/octet-stream 类型或不带类型的形式提供(邮件附件通常如此),就会根据其开头字节判断类型,且只接受上述四种类型。Lexware 密钥绝不会随请求发送;日志只记录链接的主机,不记录其路径或查询参数,而签名链接会在这里携带密钥。

每个条目都是 URL 前缀,不是模式。 链接以某个前缀开头时才会被获取:协议必须相同,主机必须完全相同,端口也必须相同——未指定时,https 默认为 443,http 默认为 80——路径必须与前缀相同或位于其下级路径。后面的内容可以任意,包括路径剩余部分和签名链接携带的查询参数。使用 https://files.example.com/inbox/ 时:

  • https://files.example.com/inbox/9f3c?sig=abc 会被获取
  • https://files.example.com/outbox/9f3c 不会被获取,因为路径不同
  • https://files.example.com.elsewhere.net/inbox/9f3c 不会被获取,因为主机不同
  • https://files.example.com:8443/inbox/9f3c 不会被获取,因为端口不同

https://files.example.com/ 允许该主机上的所有路径。没有通配符:必须写出完整主机名;* 会被视为一个无人使用的主机名,因此 https://* 什么也不允许。

https:// 是默认规则。http:// 用于本机上的服务,且只接受 127.0.0.1、::1 和 localhost:如果使用其他主机,服务会拒绝启动,因为文件会在未加密的情况下通过网络传输。在容器中,本机指容器本身。

要求

  • uv,它自带 Python 和以下所有示例都使用的 uvx 命令。Claude Desktop 扩展既不需要 uv,也不需要 Python:Claude Desktop 两者都已自带
  • Python 3.11 或更高版本(如果你更愿意自行准备)。安装时会一并安装 MCP SDK、httpx、platformdirs、用于渲染 PDF 页面 的 pypdfium2,以及用于 setup 页面 的 Jinja2
  • 已启用公共 API 插件的 Lexware Office 账户
  • 来自 https://app.lexware.de/addons/public-api 的 API 密钥

获取 API 密钥

  1. 以账户所有者身份登录 Lexware Office。
  2. 打开公共 API 插件: https://app.lexware.de/addons/public-api。
  3. 创建密钥并复制一次——它只会显示一次。
  4. 不要将密钥放入任何会纳入版本控制的文件中。setup 会将密钥写入服务器读取的 .env 文件,该文件位于每用户配置目录中,或在代码检出目录中位于 config/.env,后者已被 gitignore。无论从哪个目录启动服务器,都能找到该文件,因此 Claude Desktop 之类的客户端无需在自己的配置文件中设置密钥。也可以使用环境变量。

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

安装

有两种方式。在 Claude Desktop 中,最简单的是使用扩展,除了 Claude Desktop 外无需安装其他内容。对于其他客户端,或需要自行管理服务器的情况,请使用 uvx 运行。两种方式读取相同的配置,因此从一种方式切换到另一种方式时,密钥和权限都会保留。若要改为在容器中运行,请参阅在容器中运行。

该服务器也已列入官方 MCP Registry,标识符为 io.github.benethos-hub/benethos-lexware-office-mcp,其中包含全部三种形式:PyPI 包、容器镜像和扩展。

作为 Claude Desktop 扩展

只需要 Claude Desktop,并登录账号。

1. 获取 API 密钥。 以账户所有者身份登录 Lexware Office,打开 https://app.lexware.de/addons/public-api,创建密钥并立即复制, 因为它只会显示一次。你可以随时在同一页面撤销密钥。请参阅 获取 API 密钥。

2. 下载扩展。 此链接始终提供最新版本: benethos-lexware-office-mcp.mcpb。

3. 将其拖入 Claude Desktop 的 设置 → 扩展。Claude Desktop 会自行提供 Python 和 uv,无需安装其他内容。

4. 打开设置界面。 在聊天中,点击消息框中的加号,然后依次选择 连接器 → 从 Unofficial Lexware Office MCP Server 添加 → 设置 Lexware Office。浏览器会打开 在浏览器中配置一节所述的界面。只有你可以 选择此项,模型无法选择。

5. 输入密钥并选择工具。 在 Zugangsdaten 下输入密钥,在 Rechte 下 勾选工具,然后点击 Beenden 关闭页面。两项设置会立即生效,无需重启 Claude Desktop。

6. 试用。 询问 “我连接的是哪个 Lexware Office 账户?” 回答会显示密钥所属的公司。

注意事项:

  • 完成第 5 步前会显示失败。 安装后不会启用任何内容,因此 Claude Desktop 会将服务显示为失败,且不提供任何工具,直到设置 页面保存了配置。
  • 安装对话框不会要求任何内容。它会警告扩展可以访问你电脑上的所有内容, 这对所有本地 MCP 服务都适用,本服务也不例外。服务的依赖项会在首次启动时安装, 版本以本项目的锁定文件为准。
  • 设置页面会在闲置 30 分钟后自行关闭。
  • 每个发行版也会附带自己的软件包,文件名中包含版本号,方便安装特定版本。
  • 二选一。 扩展和 claude_desktop_config.json 中同一服务的配置项 会导致每个工具出现两次。切换到扩展时,请移除该配置项。
  • 配置是共享的。 扩展会读取与通过 uvx 安装的版本相同的用户级 .env 和 tools.json,因此 uvx benethos-lexware-office-mcp setup 也会修改这些文件。
  • 更新只需用较新的文件覆盖旧文件。如果 Claude Desktop 无法替换文件,请先点击 Beenden 关闭设置页面:页面运行期间会占用扩展文件。
  • 更换密钥后,需从系统托盘退出 Claude Desktop 并重新启动,改动才会生效。 首次设置密钥无需重启;在重启前,更改密钥也不会生效。
  • 已在 Windows 上测试,使用的是 Microsoft Store 中的 Claude Desktop,且未安装其他内容。 预计 macOS 上的操作方式相同,但尚未测试。
使用 uvx,适用于任何 MCP 客户端

对其他客户端来说,这是最简单的方式:无需克隆、无需手动创建虚拟 环境,也无需 git。uvx 会从 PyPI 获取服务并按需运行 (发布包名为 benethos-lexware-office-mcp)。

1. 安装 uv,如果你尚未安装—— uv 安装页面 介绍了所有平台的安装方式。它会一并提供 uvx,此处只需要安装这一项。

2. 配置服务。 无需安装任何内容:uvx 会获取软件包并运行它。

uvx benethos-lexware-office-mcp setup

这会打开在浏览器中配置一节所述的界面:密钥、设置以及 每个工具对应的一个复选框。所有操作也都可以手动完成——使用 uvx benethos-lexware-office-mcp --settings-sample > config/.env 创建设置文件,将密钥填入文件,并按下文所述使用 --tools。

检查是否正常运行:

uvx benethos-lexware-office-mcp --help

3. 在 claude_desktop_config.json 中将 Claude Desktop 指向该服务:

{
  "mcpServers": {
    "benethos-lexware-office-mcp": {
      "command": "uvx",
      "args": ["benethos-lexware-office-mcp"]
    }
  }
}

这里没有出现你机器上的路径,这正是重点:uvx 会按名称查找包。关于这项配置,有两点值得了解:

  • 固定版本以确保稳定性:"args": ["benethos-lexware-office-mcp==0.6.2"]。 如果不固定版本,uvx 会采用它能解析到的最新版本;重启客户端就足以改变它运行的版本。
  • uvx 必须位于客户端使用的 PATH 中,而这个 PATH 不一定和终端中的相同——有些 GUI 客户端传递的环境变量较少。如果服务无法启动,请在 command 中填入 uvx 的绝对路径,并彻底重启客户端,而不是重新加载。

更想使用自己的命令? uv tool install benethos-lexware-office-mcp 会让你无需在命令前加上 uvx,直接使用 benethos-lexware-office-mcp。如果你经常从命令行更改权限,这样做会很方便。除此之外没有其他好处:无论哪种方式都可以固定到相同版本,热启动的差异也只有几十毫秒。有一点需要注意——uv 会将它安装到自己的工具目录中,而这个目录不会自动加入全新安装的 PATH。安装完成时会有提示。运行 uv tool update-shell,然后打开一个新终端。

改用源代码,用于开发或运行尚未发布的版本:

git clone https://github.com/benethos-hub/lexware-office-mcp
cd lexware-office-mcp
uv sync
uv run benethos-lexware-office-mcp setup

然后,客户端需要使用该检出版本虚拟环境中的解释器:在 Windows 上让 command 指向 .venv/Scripts/python.exe,在其他系统上指向 .venv/bin/python,并将 args 设为 ["-m", "benethos_lexware_office_mcp"]。

**这里故意没有密钥。**服务会从 .env 中读取密钥。客户端的配置文件不是存放凭据的正确位置:它不属于你——另一个程序负责管理它,决定它存放在哪里以及何时重写。有人就 MCP 设置寻求帮助时,往往会截图这个文件;它可以在客户端自己的设置视图中读取,而且会和客户端的其他配置一起带到下一台机器上。至少,.env 是本项目有文档说明的文件,没有任何东西会代你同步它,而且配置界面写入密钥时不会再显示给你。

.env 才是值得小心处理的部分。它保存着一个正在使用的会计系统的凭据,因此不要将其纳入版本控制、放进共享文件夹,也不要放入他人可以读取的备份中。停止使用服务时,请删除它,并撤销密钥:在 Extensions、Public API 下撤销密钥,这是唯一能真正终止访问权限的步骤。

4. 完全重启 Claude Desktop——从系统托盘退出,而不是只关闭窗口。你刚编辑的配置文件需要这样处理,客户端会在启动时读取该文件;.env 中的设置发生变化时也需要这样处理,因为服务同样会在启动时读取这些设置。权限变更则不需要重启:稍后更改权限时,运行中的客户端会收到通知,请参阅关闭单项工具。首次设置 API 密钥也不需要重启:未配置密钥就启动的服务,会从之后的下一次调用开始使用后来保存的密钥,并在每次调用时重新读取,直到服务重启为止,因此更改该密钥也会立即生效。如果服务启动时已配置密钥,则更改该密钥需要重启。

在浏览器中配置

uvx benethos-lexware-office-mcp setup

也可以从客户端进行设置:通过 stdio 连接时,服务会提供一个名为 Set up Lexware Office 的提示词,选择后会打开相同的页面。在 Claude Desktop 中,它位于消息框中的加号菜单内,在服务名称下方的 Connectors 中。此处模型无法启动它,只有你可以启动;它只会打开这些页面。这个限制来自客户端,而非服务:有些 Agent 框架和编辑器等客户端会将提示词交给模型处理,因此模型也可以打开这些页面。使用此类客户端时,请设置 LXO_MCP_SETUP_PROMPT=0,这样就不会提供该提示词。 http://127.0.0.1:8771/ 上的四个页面;在侧边栏点击 Beenden 或按 Ctrl+C 即可关闭。端口号比 HTTP 传输的 8770 大 1,因此两者可以同时运行;--port 可指定其他端口。它们写入的文件与命令行相同,因此你可以任选其一,也可以同时使用。页面使用德语,因为 Lexware Office 只面向德国公司销售;下文会在每个页面名称后用方括号标注其标签,并说明页面用途。

概览(Übersicht)— 用三行展示安装状态:已保存或缺失的密钥、已启用的工具数量及其成本,以及上次连接测试的结果。红色的第一行指示下一步操作,右上角的按钮可直接前往该步骤。下方列出让客户端使用相同文件的 "args" 条目、这些文件具体是什么,以及每个文件是否已存在。

凭据(Zugangsdaten)— API 密钥默认会先通过 API 验证,然后再保存;除非你另行指定。旁边是连接测试:点击按钮时调用一次,页面加载时不会调用,并显示找到的账户。密钥绝不会再次显示给你,不会被记录到日志中,也不会导出。如果有环境变量设置了密钥,页面会说明这一点,因为它会覆盖你保存的密钥。未使用密钥启动的服务会从下一次调用开始使用此处保存的密钥,并会在每次调用时重新读取此处保存的内容,直到服务重启。替换服务启动时所用密钥的密钥,会在客户端下次启动服务时生效。HTTP 传输的令牌会折叠显示在下方;服务设为该传输方式时,该部分会展开。

权限(Rechte)— 每个工具对应一个复选框,并按组排列;预设项以按钮形式显示,保存按钮位于右上角的数量统计旁边。在尚无策略文件的全新安装中,读取工具会预先勾选,作为起始设置——这只是表单中的建议,并不代表已授予权限: 仍然没有文件,因此在点击保存之前也不会启用任何工具;页面会对此作出说明。每一行都显示该工具会占用助手多少上下文,合计数也会随勾选情况变化:每个已启用的工具都会在每次请求中发送给模型,因此启用工具既是预算决策,也是权限决策。写入工具会特别标记;其中 API 无法撤销操作结果的工具会另行标记:联系人对应 nur App,Lexware Office 可直接删除联系人;会计记录对应 nur App · Buchhaltung,因为它会进入账簿。这两种标记都不意味着操作无法挽回——创建记录时不会将其最终定稿;页面上的图例会列出之后会让记录生效的四项操作。

这里也可以管理配置文件。将当前选择保存为一个名称,之后再加载。加载只会勾选相应复选框:在你点击保存之前,不会写入 tools.json。如果名称已被占用,系统会拒绝保存,而不会悄悄覆盖现有配置——大小写和空格差异不会创建出第二个配置文件;要替换现有配置,需点击列表旁边专用的替换按钮。配置文件存储在策略文件旁边的 tool_profiles.json 中。

策略文件本身可以在同一页面下载并重新导入——导入的是原样文件,因此无论其他安装是否有此界面,都可以使用该文件;通过 --tools 写入的 tools.json 也可以在此处读取。读取文件只会勾选相应复选框,仍需另行点击保存。文件中未提及的工具会保持关闭,页面会说明这类工具的数量;这与命令行中的 --tools sync 行为相同。

设置(Einstellungen)— 四个卡片中列出十三项非机密设置:连接、输出、文件,以及是否向客户端提供打开这些页面的提示词。字段留空表示使用内置默认值,默认值会显示在占位符中。由实际环境变量设置的选项会直接显示,而非提供编辑,因为覆盖它并不会改变任何内容。 有三件事值得了解。每次启动都会生成一个启动码,并附在打印出的地址中:http://127.0.0.1:8771/?code=…。没有有效代码时,每个页面都会显示一个输入框,输入代码,因此同一台机器上的其他程序或其他用户无法通过环回端口打开这些页面。代码在进程运行期间有效,输错五次后,每次后续尝试都需要等待。浏览器打开 setup 时,会使用另一个只能使用一次的代码登录,因为浏览器地址可能会一直显示在命令行中,供这台机器上的其他用户读取。它绑定到 127.0.0.1,因为代码以明文传输,无法阻止能读取流量的人访问。 容器场景可以使用 --host,此时主机侧的端口发布会让端口保持本地可用,详见在容器中。在其他任何场景下,绑定到环回地址以外的接口,都会让能访问端口并读取代码的人打开这些页面,启动时也会对此发出提示。并且这是一个独立命令:MCP 服务不会提供 HTTP 服务,像 Claude Desktop 这样的客户端会启动它,而不是启动这个命令。

--port N 用于更改端口,--no-browser 只打印地址,--exit-when-idle N 会在 N 分钟没有请求后退出(提示词将其设为 30),--env-file 和 --tools-file 用于指定它要编辑的文件。与其他情况不同,这些文件不必事先存在。容器发布的端口与其绑定的端口不同时,可使用 --public-port N:它打印并打开的地址会使用该端口。

如果你的客户端使用 --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 只能删除文章。事后也无法完成最终确认或作废;而唯一能在之后登记的项目,是未经核验的凭证,助手必须将 finalize 和 confirm 传给 update_voucher,并且只有在你提出要求时才能这样做。

如果没有 --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 会根据此分类进行选择,浏览器界面也会据此分组和标记。但它绝不会决定一次调用是否允许执行:只有文件才决定这一点。

配置

值的来源,以及优先级

只使用一个 .env,绝不会同时使用多个。 查找位置如下, 从优先级最低的开始;最高优先级且存在的文件就是要使用的文件——不会读取其他文件:

  1. 用户配置目录中的 .env
  2. 服务器运行所在代码库中的 config/.env(如果服务器是在代码库中运行)
  3. 工作目录中的 config/.env,然后是 .env

--env-file 可直接指定文件,此时完全不执行搜索。这与 --tools-file 指定策略文件遵循相同规则,因此这两个标志的含义相同:只使用这个文件,不使用其他文件。

还有两个值来源不属于该文件,一个优先级更低,一个更高:

  • 内置默认值,用于文件中未提及的设置
  • 真实的环境变量,其优先级高于文件中的任何值,除非它为空:空值视为未设置

最后一种情况最容易让人意外。在 shell 中导出、写入客户端 env 块,或固定在 Compose 文件中的设置,无法通过编辑 .env 来更改——无论是手动编辑,还是通过 setup 编辑。值已经写入,文件也没有问题,但什么都不会发生。

配置界面会明确显示这一点,让你不必自行摸索:每项设置都带有标明其来源的徽章;如果某项设置由环境变量控制,徽章也会注明这一点。当你保存的内容似乎被忽略时,查看徽章就能找到答案。

在容器中,这并非罕见情况。 Compose 文件会将传输方式、绑定地址、端口和允许的主机固定为真实的环境变量,因为这些设置属于容器,而不是容器内安装的程序。其他所有设置——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 密钥。必填。仅允许可见的 ASCII 字符,因此,如果密钥中包含空格或复制时一并带入的不可见字符,系统会拒绝—
LXO_MCP_TOOL_POLICY按工具启用或禁用的文件,见下文tools.json,按查找 .env 的方式查找
LXO_MCP_BASE_URLAPI 基础 URL,仅支持 https://,因为密钥会发送到该地址https://api.lexware.io
LXO_MCP_APP_BASE_URL用于深层链接的 Web 应用基础 URL,仅支持 https://https://app.lexware.de
LXO_MCP_DOWNLOAD_DIR下载文档的存放位置用户缓存目录
LXO_MCP_KEPT_DOWNLOADS目录中保留的下载文件数量,按最新优先。较旧的文件会被删除,需要时重新获取。仅对默认目录生效,除非另行设置;设为 0 则保留全部文件,而资源列表仍只列出最新的 100 个未设置:默认目录中为 100,指定目录中为全部
LXO_MCP_UPLOAD_DIR上传工具唯一可读取的目录任意位置
LXO_MCP_UPLOAD_URLS上传工具可从中获取文件的 URL 前缀,以逗号分隔,不支持通配符。仅对 127.0.0.1、::1 和 localhost 允许使用 http://,这些地址的请求不会经过 HTTP_PROXY 环境变量指定的代理无
LXO_MCP_TIMEOUTHTTP 超时时间,单位为秒30
LXO_MCP_RATE所有端点共用的每秒请求数1.5
LXO_MCP_BURST令牌桶容量。账户自身的令牌桶容量为 42
LXO_MCP_PAGE_SIZE搜索请求和返回的每页行数25
LXO_MCP_PDF_PAGESread_download 默认渲染的 PDF 页数,最多 100 页10
LXO_MCP_LOG_LEVEL此服务自身输出到 stderr 的日志级别。底层库保持为 WARNINGINFO
LXO_MCP_SETUP_PROMPT通过 stdio 提供 设置 Lexware Office 提示词。设为 0 时不提供,适用于会将提示词交给模型处理的客户端开启
LXO_MCP_TRANSPORTstdio、streamable-http 或 ssestdio
LXO_MCP_BEARER_TOKEN每个 HTTP 请求都必须携带的共享密钥。使用 HTTP 传输时必填。仅允许可见的 ASCII 字符—
LXO_MCP_HTTP_HOSTHTTP 传输的绑定地址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 错误。无论指定的值是多少,search_articles 都会请求至少 25 条,因为该端点不接受更小的值。

传输方式

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

streamable-HTTP 和 SSE 会在端口上提供相同的工具,适用于容器或独立运行的机器:

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

端口前有两道防线,缺一不可。第一道是承载令牌,每个请求都必须通过 Authorization: Bearer <token> 携带它——如果没有 LXO_MCP_BEARER_TOKEN,服务将拒绝启动任何 HTTP 传输方式,因为否则任何能访问该端口的人都可能盗用你的 Lexware 凭据。第二道是 SDK 的 DNS 重绑定防护,它会将 Host 和 Origin 与环回地址名称的允许列表进行比对;如果容器或代理在前面使用了其他名称,可通过 --allowed-hosts 扩展该列表。

这两道防线都无法让端口适合发布到网络上。它们只能让端口在与其他进程共享的机器上更安全地运行。--host 会将端口绑定到环回地址以外的位置,容器必须这样做——有关这并非看起来那样放宽限制的原因,请参阅在容器中。

在容器中

此映像为 linux/amd64 和 linux/arm64 架构发布,因此运行它不需要此仓库中的任何内容:

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

对于依赖项,请固定版本号:使用 :0.6.2 锁定到确切版本,使用 :0.6 跟随该版本的补丁更新。:latest 会随着每次发布而变动,:edge 则按需从 main 中的当前内容构建,完全不属于正式发布版本。

从 0.2.0 开始,该映像沿用软件包的名称。 在 0.4.2 之前,它以 ghcr.io/benethos-hub/lexware-office-mcp 的名称发布;之前的版本也以相同摘要复制了过去,因此无论使用哪个名称拉取标签,获取的字节都相同。旧名称包含 0.4 系列的补丁版本,但不包含 0.5.0 及之后的版本。如果你正在拉取旧名称,请改用上方的名称:卷保持不变。

使用 Compose

containers/production/ 运行已发布的镜像,所需内容都在该文件夹中。在一个空文件夹中:

mkdir lexware-office-mcp && cd lexware-office-mcp
for file in compose.yaml .env.example Caddyfile README.md; do
  curl -fsSL -o "$file" "https://raw.githubusercontent.com/benethos-hub/lexware-office-mcp/main/containers/production/$file"
done
cp .env.example .env                      # names the image's version
docker compose up -d                      # the server, on 127.0.0.1:8770
docker compose --profile setup up -d      # add the configuration interface
docker compose rm -f -s setup             # take the interface away again

不要运行 docker compose --profile setup down。 这会关闭整个项目,也会一并关闭服务。rm -f -s setup 会停止并移除这一个服务,同时让服务继续运行。docker compose stop setup 也可以,这样会保留已停止的容器,供下次使用。

要更新,请在 .env 中将 LXO_VERSION 设为新版本,然后运行 docker compose pull && docker compose up -d。compose.yaml 旁的 .env 只保存该版本、主机上的端口和 HTTPS 设置。服务自身的设置保存在其配置卷中。

在本地网络中启用 HTTPS,需要在服务前部署 Caddy,并启用 https 配置: 设置 COMPOSE_PROFILES=https,并在 LXO_DOMAIN 中填写名称;其他机器上的 客户端即可通过 443 端口访问 https://<name>/mcp。证书由 Caddy 自己的 CA 签发, 每个客户端只需信任一次该 CA 的根证书;Caddy 只会转发 MCP 路径,绝不转发配置界面。 该文件夹中的 README 列出了具体步骤。它并非用于公开地址:该服务识别请求者的方式只有一个持有者令牌。

Compose 文件以前位于仓库根目录,并从检出目录构建。containers/production/ 保留了项目名称,因此卷会沿用,其中的密钥、令牌和工具也会保留:在该目录中运行 docker compose up -d 会替换容器并保留这些内容。从检出目录构建请使用 containers/development/,它会使用独立的项目,在运行中的安装旁边启动,使用 8780 和 8781 端口,且绝不会触碰该安装的卷。

Docker 会为每个服务最多保留五个 10 MB 的日志文件,并优先删除最旧的文件。服务会为每个拒绝的请求写入一行日志;在 DEBUG 级别下,每个收到的请求都会写入一行日志。因此,如果端口可访问且不设上限,日志就会在容器存在期间不断增长。

作为单独容器运行
docker run -d --name lexware-office-mcp \
  --restart unless-stopped \
  --log-opt max-size=10m --log-opt max-file=5 \
  --read-only --tmpfs /tmp --cap-drop ALL --security-opt no-new-privileges \
  -p 127.0.0.1:8770:8770 \
  -v lxo-config:/config -v lxo-downloads:/downloads \
  ghcr.io/benethos-hub/benethos-lexware-office-mcp:latest

自动生成的令牌保存在配置卷中,可从该卷读取:

docker exec lexware-office-mcp grep LXO_MCP_BEARER_TOKEN /config/.env

只输出这一行,而不是整个文件:输入密钥后,API 密钥也会保存在其中;它不应显示在可能被截图的终端上。

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

docker run --rm -d --name lexware-office-mcp-setup \
  --read-only --tmpfs /tmp --cap-drop ALL --security-opt no-new-privileges \
  -p 127.0.0.1:8771:8771 \
  -v lxo-config:/config -v lxo-downloads:/downloads \
  ghcr.io/benethos-hub/benethos-lexware-office-mcp:latest \
  setup --no-browser --host 0.0.0.0 --port 8771 \
        --env-file /config/.env --tools-file /config/tools.json

若要映射到其他端口,例如 -p 127.0.0.1:9000:8771,请添加 --public-port 9000,这样日志中的地址就会显示要打开的端口。

日志中包含带有启动代码的地址,打开的就是这一行:

docker logs lexware-office-mcp-setup 2>&1 | grep "interface at"

它使用 --rm 启动,因此停止时容器也会被删除:

docker stop lexware-office-mcp-setup

这里的 --restart unless-stopped 不是摆设。 设置文件更改时,容器会结束其进程;这样才能让已保存的设置应用到正在运行的服务。若不设置重启策略,容器结束后就会一直处于停止状态。

第二行的其余部分用于加固,Compose 文件也采用了相同设置。 服务只会向两个卷和 /tmp 写入内容,因此镜像本身可以保持只读;而普通用户进程在高于 1024 的端口上运行,无需任何 Linux capability。

用完后关闭界面

打开其日志中的地址:在 Compose 中运行 docker compose logs setup, 输入密钥,勾选工具——然后通过侧边栏中的 Beenden 或下面的某条命令停止它。该地址指明了它发布到的端口,两个 Compose 文件都会将 LXO_SETUP_PORT 传入 --public-port。**它不会自动停止。**它接受通过明文传输的代码保护的 API 密钥,而且只要机器在运行,它就会一直提供该页面。 Beenden 会结束进程并留下一个已停止的容器,运行 docker compose rm -f -s setup 即可将其移除;使用 docker run --rm 启动的容器则会自行移除。

docker compose rm -f -s setup             # Compose
docker stop lexware-office-mcp-setup      # a single container
docker ps --filter name=setup             # nothing listed means it is off

服务本来就应该持续运行。界面只应在你配置它的几分钟内运行,因此直接运行 docker compose up 时不会启动它,而且它没有重启策略:一旦停止,就会保持停止状态,直到你再次启动它。

无需预先进行任何准备。 首次启动时,服务会生成一个 bearer token,将其写入配置卷并告知你——界面会显示它,这就是客户端需要的值。它不会被内置到镜像中,否则每个副本都会共用同一个 token。

容器绑定到 0.0.0.0,这并不意味着放宽了限制。 容器自身回环接口上的进程根本无法通过已发布的端口访问。隔离由网络命名空间实现,而哪些人可以访问该端口,则由仅映射 127.0.0.1 的端口发布规则决定。

在浏览器中保存的设置会应用到运行中的服务。 设置只会在启动时读取,因此设置文件发生变化时,容器会被要求结束,Compose 会在一秒后重新启动它。客户端已打开的数据流最多会让结束延迟五秒,随后连接会关闭,客户端再连接到新的进程。Compose 固定为实际环境变量的设置——传输方式、绑定地址、端口、允许的主机——属于容器,无法从卷中更改,详见配置。

日志

所有内容都会写入 stderr。在 INFO 级别下,每次工具调用会记录一行:读取或写入的内容(以 Lexware id 命名)、行数或大小、API 调用次数以及耗时。被拒绝或失败的调用会记录一条 WARNING,注明错误类别;如果是 API 拒绝,还会记录其状态码和错误代码。DEBUG 级别会为每次 API 尝试和每个 HTTP 请求各添加一行。LXO_MCP_LOG_LEVEL 用于设置日志级别。

2026-09-30T13:58:50.597+02:00 INFO     tools: search_contacts read 12 rows in 1 API call, 230 ms

时间采用本地时间,精确到毫秒,并带有时区偏移量。在终端中,日志级别和来源会以颜色显示,除非设置了 NO_COLOR。

日志行绝不会包含助手发送的内容或 API 返回的内容:不会包含搜索词、名称、金额、文件名或查询字符串。底层库也会保持在 WARNING 级别,原因相同:它们的 INFO 日志会包含请求 URL 和错误文本。配置界面会为保存的每项内容写一行日志,但绝不会记录密钥、token 或设置值。

提示词示例

连接服务后,以下提示词便是预期的使用方式:

  • “哪些发票仍未结清?其中哪些已经逾期?”
  • “显示本季度向客户 Muster GmbH 开具的所有账单。”
  • “发票 RE-2024-0142 包含哪些内容?是否已付款?”
  • “查找编号为 A-1007 的商品,并告诉我它目前的价格。”
  • “下载我们最近开具的贷项通知单 PDF。”
  • “给我一个链接,让我在 Lexware Office 中打开凭证 X。”

速率限制

Lexware API 每秒允许发出两次请求,并通过 token bucket 进行限制。该额度是 全局的——它同时适用于 API 的所有端点,因此读取联系人和读取发票会消耗同一额度。

服务端也采用一个由进程中的所有请求共享的令牌桶,默认补充速率略低于文档所述速率。 Lexware 指出,如果不留缓冲、严格执行速率限制,网络抖动改变请求到达时间后,仍然容易触发 429 错误, 因此默认值留有余量。请求会通过该令牌桶串行处理,而不是并行发送,这意味着涉及许多文档的 宽泛问题只会变慢,而不会被阻止。

以下两点值得注意:

  • 额度属于你的账户,而不是此进程。第二个服务实例、另一个集成,或你自行运行的脚本,都会 消耗同一账户每秒两次的额度。
  • Lexware 警告称,客户端在收到 429 错误后持续发送请求,可能会被永久封锁。因此,服务端会进行 指数退避,并在几次尝试后放弃,而不是加大力度重试。

账户的令牌桶于 2026-08-21 测得容量为四次:同时发出五个请求时,四个成功,一个被拒绝。 默认值 2 为其他使用同一账户的程序留出一半额度——网页应用、另一个集成,或此服务的第二个实例。 只有在确认此服务是唯一使用者时,才将其调高到 4。

如果你的账户情况有所不同,可以通过 LXO_MCP_RATE 和 LXO_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 jar 来驱动,因为只有按照浏览器实际访问它的方式测试,CSRF 防护才有意义。

此仓库不附带 API 密钥,CI 中也不应包含密钥,因此仅凭检出仓库永远无法与 Lexware 通信。若要使用真实 API 检查服务,必须在本地明确运行并提供密钥;这与上面的测试套件分开,且绝不会成为套件的一部分:

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

它会读取你的账户,不会对账户写入任何内容。它构建的服务会使用 read-only 预设,因此根本无法调用 写入工具。它会打印检查了哪些内容、账户中哪些内容为空,以及哪些检查失败,并会遮盖记录 ID,以便 报告可以粘贴到其他地方。pytest 永远不会运行它。关于为何实时检查不是门槛,参见 SPECS.md 第 14.1 节。

欢迎贡献和提交问题。 设计决策及其背后的原因和测量结果记录在 SPECS.md 中。

许可证

MIT。参见 LICENSE。

商标与关联关系

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

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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。