- 在 client.py 中新增 view() 函数,支持调用金蝶云星空 DynamicFormService.View 接口 - 在 tools.py 中新增 view_form 工具,供 MCP 客户端调用 - 添加演示脚本 demo_view.py 和示例配置文件 demo_view.json - 重构 demo_save.py 为通用演示脚本,支持自定义 payload 文件 - 删除过时的 demo.json,新增 userful_save.json 作为实用示例 - 添加项目交接文档,详细说明各子项目架构和配置 - 优化 payload 序列化逻辑,提取为共享函数 _serialize_payload
19 KiB
19 KiB
lzwcai-mcp 项目交接文档
本文档面向接手本仓库的技术人员,重点说明整体架构、各子项目职责、运行方式与配置要点,便于快速上手维护与扩展。
一、项目整体概览
- 仓库名称:
lzwcai-mcp - 项目类型:一组基于 MCP(Model Context Protocol)的独立服务,每个服务都是一个「技能包」,通过
stdio与上层 MCP Agent 通信。 - 主要能力:
- Feishu/Lark 卡片发送、图片上传、OKR 查询等企业协同能力(
lzwcai_lark_mcp) - 文件与 URL 的 Base64 编解码、临时文件处理、MinIO 上传等通用文件工具(
file_tools) - 金蝶云星空单据保存与查询能力,封装 DynamicFormService.Save / View 接口(
k3cloud_mcp) - 访客信息查询与登记、门禁控制(
terminal_dhr_mcp) - Temi 轮足机器人导航与业务动作控制(
terminal_temi_mcp) - Go2 机器人运动控制、避障、服务管理等(
terminal_go2_mcp)
- Feishu/Lark 卡片发送、图片上传、OKR 查询等企业协同能力(
各子项目都是独立的 Python 包,拥有各自的 pyproject.toml 与入口脚本,通过 JSON 配置文件被 MCP Agent 挂载为工具服务器。
二、代码结构概览
仓库根目录主要结构:
file_tools/file_tools/:文件工具 MCP 服务器实现(入口file_tools.main)。pyproject.toml:使用hatchling构建,脚本名lzwcai-file-tools-mcp。
k3cloud_mcp/k3cloud_mcp/:金蝶云星空 MCP 服务器实现。mcp-server.json:MCP Agent 挂载示例,包含k3cloud-mcp的启动方式与环境变量示例。pyproject.toml:使用hatchling构建,脚本名k3cloud-mcp。
lzwcai_lark_mcp/lzwcai_lark_mcp/:Lark 相关 MCP 服务器实现(入口lzwcai_lark_mcp.main)。pyproject.toml:使用hatchling构建,脚本名lzwcai-lark-mcp。
lzwcai_temi_mcp/lzwcai_temi_mcp/:另一个 Temi 机器人相关 MCP 服务(目前主要用到main.py、mcp_mqtt.py、nav_server.py)。mcp-server.json:MCP Agent 挂载示例。pyproject.toml:使用hatchling构建,脚本名lzwcai_temi_mcp。
terminal_dhr_mcp/terminal_dhr_mcp/:访客系统 + 门禁控制 MCP 服务器。.env:示例环境变量。pyproject.toml:基于setuptools的构建配置,脚本名terminal-dhr-mcp。
terminal_go2_mcp/terminal_go2_mcp/:Go2 机器人 MCP 服务器。pyproject.toml:使用hatchling构建,脚本名terminal_go2_mcp。
terminal_temi_mcp/terminal_temi_mcp/:Temi 轮足机器人 MCP 服务器。pyproject.toml:使用hatchling构建,脚本名terminal_temi_mcp。
- 根目录其他文件:
README.md:顶层简介与部分子项目说明。mcp.json:示例 MCP 服务器配置(目前包含一个 JS 实现的lark-mcp示例,与本仓库 Python 版本的 Lark MCP 可共存)。LICENSE、.gitignore等。
三、运行环境与基础依赖
总体建议:
- Python 版本:优先使用 3.10+。
terminal-dhr-mcp声明支持 3.8+,但其他项目为 3.10+,统一到 3.10 可以减少环境碎片。
- 依赖管理:建议使用虚拟环境(
venv或uv等)分别在各子项目目录下执行安装。
核心依赖:
- 统一:
mcp[cli]或mcp:MCP 协议实现。python-dotenv:从.env加载配置。
- Lark 相关(
lzwcai_lark_mcp):requests:调用 Feishu/Lark HTTP API。openpyxl:从 Excel 中解析image_key及图片路径。
- 文件工具(
file_tools):httpx:下载远程文件。minio:将文件上传到 MinIO 对象存储。openpyxl:Excel 图片解析。
- 金蝶云星空(
k3cloud_mcp):requests:调用 K3Cloud Web API。
- 访客/门禁(
terminal_dhr_mcp):httpx、pydantic、python-dotenv等,用于 HTTP 调用与配置。
- 机器人相关(
terminal_temi_mcp、terminal_go2_mcp):fastapi、uvicorn(部分场景)、paho-mqtt、pydantic、requests。
四、各子项目详细说明
4.1 Lark MCP(lzwcai_lark_mcp)
- 入口:
- 包:
lzwcai_lark_mcp - 入口函数:
lzwcai_lark_mcp.main:main - MCP Server 名称:
lzwcai-mcpskills-lark-mcp
- 包:
- 核心文件:
main.py:MCP server 启动逻辑,负责:- 初始化
Server。 - 通过
_request_token根据app_id/app_secret获取 Larktenant_access_token,带过期时间缓存。 - 注册
list_tools/call_tool,在调用工具前自动确保 token 有效。
- 初始化
config.py:- 从环境变量读取:
app_idapp_secret
- 从环境变量读取:
tools.py:- 定义对外暴露的
Tool列表。 - 实现具体业务函数,如:
- 图片上传:
upload_image_by_url/upload_image_by_file - Excel 定位图片源:
_resolve_image_source_from_excel - OKR 查询:
get_user_okr_list、batch_get_okr - 资产确认/复核/陌生人处理/反馈等多种交互卡片:
send_confirmation_card、send_review_card、send_stranger_card、send_feedback_card - 入库通知卡片:
send_notion_card/send_card_message
- 图片上传:
handle_call_tool:根据name分发到对应的 Python 函数,处理参数校验、错误返回等。
- 定义对外暴露的
- 外部依赖与接口:
- Feishu/Lark Open API:
- 认证:
/open-apis/auth/v3/tenant_access_token/internal - 消息/图片:
/open-apis/im/v1/images、/open-apis/im/v1/messages - 通讯录:
/open-apis/contact/v3/users/{user_id} - OKR:
/open-apis/okr/v1/users/{user_id}/okrs、/open-apis/okr/v1/okrs/batch_get
- 认证:
- Feishu/Lark Open API:
- 配置要点:
- 必需环境变量:
app_id:Lark 应用的 app id。app_secret:Lark 应用的 app secret。
- 可选:
LOG_LEVEL(通过 logging.basicConfig 读取)。
- 必需环境变量:
4.2 文件工具 MCP(file_tools)
- 入口:
- 包:
file_tools - 入口函数:
file_tools.main:main - MCP Server 名称:
lzwcai-mcpskills-file-tools-mcp
- 包:
- 核心文件:
main.py:- 初始化 MCP
Server,注册list_tools/call_tool。
- 初始化 MCP
tools.py:- 工具列表:
file_to_json:将文件对象或本地路径转成 JSON 结构(带 base64 内容)。file_to_data_uri:将文件转为data URI。file_path_to_data_uri:本地文件路径 ->data URI。url_to_data_uri:URL 下载并转为data URI。url_to_temp_file:URL 下载为本地临时文件,返回路径。excel_image_key_to_temp_file:从 Excel 中按image_key找到图片并写入临时文件。upload_file_to_minio:将文件上传到 MinIO,返回访问 URL。
- 工具内部大量使用
Path、tempfile、httpx、minio等。
- 工具列表:
- 配置要点:
- MinIO 相关配置位于
config.py(minio_endpoint、minio_access_key、minio_secret_key),通过环境变量读取。 - 当前
upload_file_to_minio里的 bucket 名称固定为lzwcai(写在tools.py),如需多环境隔离建议改为可配置项。
- MinIO 相关配置位于
4.3 金蝶云星空 MCP(k3cloud_mcp)
- 入口:
- 包:
k3cloud_mcp - 入口函数:
k3cloud_mcp.main:main - MCP Server 名称:
k3cloud-mcp
- 包:
- 核心文件:
main.py:- 初始化 MCP
Server。 - 注册
list_tools/call_tool。 - 运行
stdio_server,供上层 MCP Agent 调用。
- 初始化 MCP
tools.py:- 当前暴露两个工具:
save_form、view_form。 save_form参数:formid:业务对象表单 Id,例如SAL_QUOTATION。data_payload:可传 JSON 对象或 JSON 字符串。timeout:HTTP 超时时间,默认 30 秒。
view_form参数:formid:业务对象表单 Id,例如SAL_QUOTATION。payload:可传 JSON 对象或 JSON 字符串。timeout:HTTP 超时时间,默认 30 秒。
handle_call_tool()负责做参数校验、分发到底层save()/view(),并把响应序列化为文本返回。
- 当前暴露两个工具:
client.py:- 封装
save(formid, data_payload, timeout=30)与view(formid, payload, timeout=30)。 - 分别调用
DynamicFormService.Save.common.kdsvc与DynamicFormService.View.common.kdsvc接口。 - 会自动将对象型 payload 转为 JSON 字符串后再提交。
- 封装
signing.py:- 负责生成 K3Cloud 所需签名头。
- 包含
APP_ID拆分、APP_SECRET解码、HMAC 签名等逻辑。
config.py:- 从环境变量读取
K3CLOUD_*配置。 - 缺少必填项时会在导入阶段直接抛出异常。
- 从环境变量读取
demo_save.py/demo_save.json:- 用于本地直接测试
save()函数。
- 用于本地直接测试
demo_view.py/demo_view.json:- 用于本地直接测试
view()函数。
- 用于本地直接测试
- 外部依赖与接口:
- 金蝶云星空 Web API:
- 保存接口:
/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc - 查询接口:
/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.View.common.kdsvc
- 保存接口:
- 金蝶云星空 Web API:
- 配置要点:
- 必需环境变量:
K3CLOUD_BASE_URL:K3Cloud 站点根地址。K3CLOUD_ACCT_ID:账套标识。K3CLOUD_APP_ID:应用标识。K3CLOUD_USERNAME:调用用户名。K3CLOUD_APP_SECRET:应用密钥。
- 可选环境变量:
K3CLOUD_LCID:语言代码,默认2052。K3CLOUD_ORG_NUM:组织编号,默认0。LOG_LEVEL:日志级别。
- 必需环境变量:
- 本地测试方式:
- 保存接口联调:
python k3cloud_mcp/demo_save.py <formid> --payload k3cloud_mcp/demo_save.json
- 查询接口联调:
python k3cloud_mcp/demo_view.py <formid> --payload k3cloud_mcp/demo_view.json
- 当前测试脚本会优先使用当前进程环境变量;若未设置,则补读子项目目录下
mcp-server.json中k3cloud-mcp.env的配置,便于本地快速验证。
- 保存接口联调:
4.4 访客系统 + 门禁 MCP(terminal_dhr_mcp)
- 入口:
- 包:
terminal_dhr_mcp - 入口函数:
terminal_dhr_mcp.main:main - MCP Server 名称:
terminal-dhr-mcp
- 包:
- 核心文件:
main.py:- 定义
DhrMCPServer类,注册list_tools/call_tool,调用tools.py中的逻辑。
- 定义
tools.py:- 工具列表包括:
query_visitor:根据user_id查询访客预约记录。register_visitor:登记新访客。control_door:控制门禁开关。get_door_status:查询门禁状态。
- 工具列表包括:
config.py:- 关键配置:
EMPLOYEE_ID:从环境变量employeeId读取,用于请求访客系统。BASE_URL:访客系统服务地址。VISITOR_QUERY_ENDPOINT、VISITOR_REGISTER_ENDPOINT:固定后缀路径。- 门禁相关:
DOOR_API_ENDPOINTDOOR_ENTERPRISE_IDDOOR_DEFAULT_ENTITY_ID
LOG_LEVEL、若干长度限制常量等。
- 关键配置:
- 典型环境配置:
- 可在
terminal_dhr_mcp/.env中配置:employeeIdBASE_URLDOOR_ENTERPRISE_IDDOOR_DEFAULT_ENTITY_IDLOG_LEVEL
- 可在
4.5 Temi 轮足机器人 MCP(terminal_temi_mcp)
- 入口:
- 包:
terminal_temi_mcp - 入口函数:
terminal_temi_mcp.main:main - MCP Server 名称:
terminal_temi_mcp
- 包:
- 核心文件:
main.py:- 定义
NavServer,通过mcp_mqtt.get_mcpmqtt_handler()获取 MQTT 客户端。 - 封装业务命令:
nav_to:导航到指定地点。speak:语音播报。reception:迎宾。notification(目前工具层注释掉)。repose:重新定位。delivery:配送任务。patrol:巡逻。- 若干人脸识别 / 扫码相关函数目前未对外暴露。
list_tools中暴露的工具包括nav_to、speak、reception、repose、delivery、patrol等,对输入参数做了详细描述。call_tool根据工具名分发到NavServer方法,并做参数校验与错误转换。
- 定义
mcp_mqtt.py:- 封装 MQTT Broker 连接、客户端初始化与复用。
- 配置要点:
.env(参考 README):LOG_LEVELMQTT_BROKER_ADDRESSMQTT_PORTMQTT_USERNAMEMQTT_PASSWORD
- MCP Agent 配置文件(示例在子项目 README 中)会把
employeeId、userId作为环境变量注入。
4.6 Go2 机器人 MCP(terminal_go2_mcp)
- 入口:
- 包:
terminal_go2_mcp - 入口函数:
terminal_go2_mcp.main:main - MCP Server 名称:
terminal_go2_mcp
- 包:
- 核心文件:
main.py:TerminalGo2McpServer提供对 Go2 机器人的封装:- 低层统一接口
pubCmd(type, cmd, params)通过 MQTT 发布到unitree/go2/cmd。 - 运动相关:
custom_action、ContinuousMove、move、euler、set_speed_level、pose等。 - 避障相关:
obstacle_avoidance_switch、obstacle_move。 - 导航相关:
start_mapping、end_mapping、initialize_pose、pose_navigation、pause_navigation、resume_navigation等(部分在工具层已注释)。 - 充电:
start_recharge、stop_recharge。 - 服务管理:
list_services、switch_service、set_report_freq。
- 低层统一接口
serve()中:- 注册工具列表(Tool 定义),描述参数与取值范围。
- 在
call_tool中根据name分发到对应协程函数。
mcp_mqtt.py:- 和 Temi 类似,管理 MQTT 客户端。
- 配置要点:
- MQTT 连接参数在
mcp_mqtt.py或.env中通过环境变量读取(具体字段请在接手时查看该文件)。
- MQTT 连接参数在
4.7 Temi 机器人 MCP(旧版,lzwcai_temi_mcp)
- 入口:
- 包:
lzwcai_temi_mcp - 入口函数:
lzwcai_temi_mcp.main:main - MCP Server 名称:
lzwcai_temi_mcp
- 包:
- 核心文件:
main.py:- 当前暴露工具包含
recharge、terminate、goto、speak、reception、notification、repose、patrol、dance。
- 当前暴露工具包含
mcp_mqtt.py:- 管理 MQTT 连接与消息发布。
nav_server.py:- 封装导航与动作编排逻辑。
- 维护建议:
- 仓库内同时存在
terminal_temi_mcp与lzwcai_temi_mcp两套 Temi 服务,接手时建议先和业务方确认实际在线使用的是哪一套,避免重复维护。
- 仓库内同时存在
五、安装与运行方式(面向开发/调试)
以下步骤均建议在虚拟环境中执行。
-
克隆仓库:
git clone <repo-url> cd lzwcai-mcp -
进入某个子项目目录并安装:
cd terminal_dhr_mcp pip install -e .[dev] # 或仅运行所需: pip install -e .其他子项目类似:
cd lzwcai_lark_mcp && pip install -e .cd file_tools && pip install -e .cd k3cloud_mcp && pip install -e .cd lzwcai_temi_mcp && pip install -e .cd terminal_temi_mcp && pip install -e .cd terminal_go2_mcp && pip install -e .
-
启动某个 MCP 服务器(本地调试):
# Lark lzwcai-lark-mcp # 文件工具 lzwcai-file-tools-mcp # 金蝶云星空 k3cloud-mcp # 访客系统 + 门禁 terminal-dhr-mcp # Temi 机器人(旧版) lzwcai_temi_mcp # Temi 机器人 terminal_temi_mcp # Go2 机器人 terminal_go2_mcp -
与 MCP Agent 集成:
- 顶层或子项目中提供示例配置文件,如:
lzwcai_lark_mcp/mcp-server.jsonterminal_dhr_mcp/mcp-server-dhr.jsonterminal_temi_mcp/mcp-server-temi.jsonterminal_go2_mcp/mcp-server-go2.jsonlzwcai_temi_mcp/mcp-server.jsonfile_tools/mcp-server-file-tools.jsonk3cloud_mcp/mcp-server.json
- 在上层 Agent 的配置(例如 IDE 插件或自研 Agent)中引入这些 JSON 即可通过
stdio调起对应服务器。
- 顶层或子项目中提供示例配置文件,如:
六、配置与敏感信息管理
- 所有敏感信息(token、密钥、账号密码)均通过环境变量或
.env文件注入,不应直接写入代码或仓库。 - 当前仓库中的部分
mcp-server*.json已包含真实或准生产敏感配置示例;对外共享仓库前建议先做脱敏或改成占位符。 - 推荐做法:
- 针对每个子项目,在其根目录创建
.env,仅存放本项目相关配置。 - 在部署环境中,通过进程管理器(如 systemd、Docker、K8s)把
.env或环境变量挂载进去。
- 针对每个子项目,在其根目录创建
- 接手时建议重点确认:
- Lark 应用的
app_id/app_secret是否有效,是否具备所需 API 权限。 - K3Cloud 的
BASE_URL、账套、应用标识、用户名、密钥是否仍然有效,签名规则是否与现网一致。 - 访客系统 / 门禁接口
BASE_URL、企业 ID、门禁实体 ID 是否与现网一致。 - MQTT Broker 地址、账号密码是否与机器人当前网络环境匹配。
- MinIO 的 endpoint、access key、secret key、bucket 名称是否存在且有权限。
- Lark 应用的
七、开发规范与注意事项
- 编码风格:
- Python 代码整体接近 PEP 8 风格。
- 部分子项目(如
terminal_dhr_mcp)在pyproject.toml中配置了black、isort、ruff、mypy等工具,对应规则可作为编码参考。
- 日志:
- 所有服务器都使用
logging.basicConfig统一输出日志,日志级别可通过LOG_LEVEL环境变量控制。 - 出错时通常会在日志中打印详细异常,并向 MCP Agent 返回友好文本。
- 所有服务器都使用
- 错误处理:
- 多数工具会对必需参数做显式校验,缺失时抛出
ValueError或返回带错误信息的字符串。 - 对外 HTTP/MQTT 调用失败时,会记录错误日志,并抛出异常或返回失败说明。
- 多数工具会对必需参数做显式校验,缺失时抛出
- 工具定义:
- 工具使用
mcp.types.Tool定义,inputSchema为 JSON Schema 格式,方便上层 Agent 自动生成表单或进行参数校验。 - 若新增工具,请保持命名风格一致,并且在
list_tools与call_tool实现中同步更新。
- 工具使用
八、后续扩展建议
- 如需扩展新的硬件或业务系统,建议:
- 新增独立子项目目录(与现有结构一致),保持「一个 MCP 服务一个 Python 包」的模式。
- 优先复用现有 MQTT/HTTP 封装模式与错误处理风格。
- 在子项目内补充 README,简要说明工具列表与配置方式,并在顶层
README.md中更新项目清单。
九、已知问题与接手优先项
file_tools/config.py默认从mcp-server-file-tools.json读取配置时,查找的 server key 是lzwcai-mcpskills-file-tools-mcp,而当前示例文件使用的是lzwcai-file-tools-mcp,可能导致本地自动注入环境变量失效。terminal_temi_mcp与lzwcai_temi_mcp为并行存在的两套 Temi MCP 服务,能力与工具名不完全一致,建议先统一服务边界再继续演进。
如在接手过程中遇到不清楚的业务规则(例如具体资产变动业务、访客流程、机器人业务场景),建议先与业务方确认需求,再在对应子项目中补充或调整工具逻辑。