tkhs101
我在日本生活,长期用 BeeCount 记账,也用 MCP 让 AI 帮我建交易。这里提一个关于 **MCP 能力补齐**的请求。 ## 前置检查 - [x] 我已查阅 [官方文档](https://count.beejz.com/docs/intro),确认该功能尚未实现 - [x] 我已搜过 [已有 Issues / Discussions](https://github.com/TNT-Likely/BeeCount/issues?q=is%3Aissue),没有重复 - [x] 本次请求只包含**一个独立功能**,不混杂多个不相关的模块 ## 遇到的问题 / 使用场景 **交易附件在 App 端已经完整支持,但 MCP 这条路径没有暴露出来。** 现状是: - App 里可以给交易附小票照片,存储、上传、查看都正常 - `GET` 侧 MCP 也能读到附件(`read_tools.py` 里会解析 `attachments_json` 返回) - 但 `create_transaction` / `update_transaction` **没有任何附件参数**,只能建交易、挂不上图 这造成一个很实际的断裂:**小票照片恰恰是记账最自然的输入,但 AI 读完小票、建好交易之后,却没法把这张照片作为凭证一起存进去。** 以我自己的用法为例 —— 一张便利店小票,同时包含商家名、消费税金额和合计金额,正是 #510 想要的信息。我希望把这个流程做成「拍照 → 发给 AI → 一条交易带凭证落库」,但现在最后一步断了,只能建完交易再去 App 里手动补图,每次多两道操作。 ## 期望的解决方案 建议 `create_transaction` 和 `update_transaction` 支持传入附件。 **参数形式**,两种都可以接受,以第一种为主: - **本地文件路径**(推荐):LLM 客户端通常已经拿到了用户发来的图片文件,路径是最自然的输入。服务端负责读取、上传、再挂到交易上。 - **已上传的 file id**:如果调用方已经调过上传接口,可以直接传 id。 **建议的行为:** - 复用现有的去重机制。`POST /attachments/upload` 已经按 sha256 做过账本内去重,同一张图重复上传会直接返回已有记录,所以不必在 MCP 层重复实现。 - 新增交易时支持多个附件,并保持传入顺序(App 端附件有 `sortOrder` 字段)。 - 附件参数可选,不传时行为与现在完全一致。 ## 替代方案(非必填) - **保持现状,在 App 里手动补附**:能用,但把一个完整的流程拆成两处操作,每次记账都要切App,体验割裂。 - **先上传再手动关联**:目前没有「把已有附件关联到交易」的 MCP 或其他接口,这条路也走不通。 ## 参考示例(非必填) 一次典型的消费: ``` 用户:小票在这里(附便利店小票照片),帮我记一笔 AI :(读取图片)7-Eleven,税込 ¥788,消費税等 ¥58 AI :→ create_transaction(amount=788, category=餐饮, note=7-Eleven, attachments=[<这张图>]) ``` 期望这条 `create_transaction` 返回的交易里就带着原始小票照片,可以在 App 和 Web 端直接查看。 ## 优先级 - 很重要 ## 贡献意愿(可多选) - [x] 我愿意提交 PR 实现此功能(先跟 maintainer 对齐方案再动手) - [x] 我可以帮助测试 - [x] 我可以提供更详细的需求说明 ## 其他补充(非必填) 这个请求的性质是**把已有能力接到 MCP 上**,不涉及新的数据模型、界面或迁移,前端和服务端的附件功能都已经存在。我大致看了一下源码,涉及的位置供维护者参考(不一定准确): - 上传接口已存在:`src/routers/attachments.py` 的 `POST /upload`(multipart,`ledger_id` + `file`),返回 `file_id` / `sha256` 等信息;另有 `POST /batch-exists` 可用于按 sha256 预检去重 - 交易上的附件字段已存在:`read_tx_projection.attachments_json`,MCP 读侧已在 `read_tools.py` 解析它 - 同步协议里附件对象的字段(`lib/cloud/transactions_json.dart`):`fileName`、`originalName`、`fileSize`、`width`、`height`、`sortOrder`,云端对应 `cloudFileId`、`cloudSha256` - 大小限制是 64MB(`attachment_max_upload_bytes`),手机小票远小于此 所以 MCP 侧大致只需:新增附件参数 → 调用上传接口拿到 `file_id` / `sha256` → 组装成上述附件对象数组随交易一起提交。