Files
Auto-Finance/src/upload/README.md
T
wandering e1acf2de84 docs: 文档全面对齐 MCP 架构,并脱敏公开操作指南
接口与入门:
- 新增 docs/MCP.md:注册方法(DSH patch + 通用 client)、返回信封、会话目录布局、标准流程、
  硬约束与未实现清单;工具参考段由**运行时 input_schema 自动生成**,与代码同源不会漂移
- 删除 docs/API.md(856 行 Flask 路由/SSE 文档,描述的端点已不存在)
- 重写根 README.md:为什么放弃自带前端、职责分工表、快速开始、注册配置、流程链、结构与风险
- 重写 AGENTS.md:命令表换成 mcp/mcp-smoke/upload;mypy 目标改 src;新增「提交纪律」
  (pre-commit 的 stash 窗口会回滚未暂存改动)、COM 与 Playwright 线程约束、多进程共存提醒

包文档:src/README.md 与各包 README 按现状重写;新增 src/mcp/README.md(写工具的规矩、
宿主侧四个坑)与 src/upload/README.md(路由表与安全边界);tests/scripts/config 三处索引更新。

提示词迁移:src/infra/llm/ 整个删除,三份系统提示词迁到 .agents/skills/reimbursement/references/
(invoice-fields / travel-info-fields / normal-info-fields),删掉 can_submit 与 suggestion
(save_info 也会主动剥离),「严格只输出 JSON」改为「交给对应工具落盘」;新增 SKILL.md 作为
宿主侧操作纪律(已被 DSH 热加载为 reimbursement 技能)。

作废处理:删除 .agents/docs/guides/系统事件流全景图.md(SSE 与 file_events/agent_events 通道已整体
移除,现在没有任何事件流);给项目架构全景图与架构分析-2026-06-15 加「已过时」横幅保留历史;
config.example.json 去 consumable_storage 加 upload_pin;.env.example 去 LLM 段并说明已不再自动加载 .env。

安全:docs/报销操作指南.md 的示例配置里原来写着**真实姓名、16 位公务卡号、内网 LLM 地址与工号**
(自 9fe5d70/2026-05-25 起在版本历史里),本次全部换成占位符。历史清洗与令牌轮换另议。

门禁(改动含 src/infra/llm 删除,故重跑全部门禁):
  ruff check PASS | ruff format --check PASS(42) | mypy src PASS(34) | deptry PASS(36) |
  pytest 107 passed | scripts/mcp_smoke.py PASS(17 工具 / instructions 1449 字节 / case_list ok)
申购单在依赖清理后另已实机复测:2.4s 生成,产物单元格读回正确。
2026-10-19 22:40:06 +08:00

1.8 KiB
Raw Blame History

last_reviewed
last_reviewed
2026-10-19

src/upload — 扫码上传收件器

独立进程,不是 MCP 工具,也绝不由 MCP 子进程拉起(生命周期要独立于宿主,重启宿主不能带走上传口)。

uv run python -m src.upload.server            # 0.0.0.0:5055
uv run python -m src.upload.server --local    # 只监听 127.0.0.1
uv run python -m src.upload.server --port 6000 --pin 1234
文件 职责
server.py Flask 应用与路由、上限与白名单、lan_ip()、命令行参数
page.py 页面模板(内联 CSS,零外部 CDN,__PLACEHOLDER__ 占位替换)

路由

路由 说明
GET / PC 端首页(可选 PIN 校验)
GET /qr/<case_id> 服务端生成的二维码 PNG(segno)
GET /u/<case_id> 手机上传页(令牌在 URL 里)
POST /u/<case_id> 接收文件,落 cases/<id>/inbox/
GET /api/inbox/<case_id> 该会话待收数量(只给数量,不给内容)

安全边界

  • 默认 0.0.0.0 是刻意的(手机要用局域网 IP 访问),补偿控制如下
  • 每会话令牌强制:case.json 里的 upload_token,缺失或错误一律 403;工具输出里永不回显令牌明文, 只在 case_create 返回的页面地址中出现一次
  • 只写不读:没有文件列表、没有下载路由
  • 扩展名白名单、单文件 25MB、每会话 200 个文件封顶
  • 文件名一律 Path(raw.replace(chr(92), '/')).name 取基名 + 重名加序号,防目录穿越
  • 可选 --pin / UPLOAD_PIN / config.json 的 upload_pin 作为额外访问码

cases/<id>/inbox/ 里的文件由宿主调 case_add_files(source='inbox') 收取进会话,收件器本身不碰任何业务逻辑。