Skip to main content
Glama
Leave MCP Server
by daomengKJ

请假流程 MCP 服务

将 Dify 请假流程封装为 Model Context Protocol (MCP) 服务,让 LLM 客户端(Claude Desktop、Trae 等)通过标准 MCP 协议调用工具完成请假申请。

功能特性

  • 6 个业务流程层工具:覆盖请假全流程(初始化、选岗、计算天数、附件检查、上传、提交)

  • 环境切换:通过 API_ENV 环境变量一键切换 UAT/PRD 环境,所有接口统一域名

  • 业务校验内置:年假/调休假余额校验、丧假 ≤3 天限制、7 类附件要求

  • 附件上传:支持 base64 编码和本地文件路径两种方式

  • 无状态设计:MCP 服务无状态,状态由 LLM 上下文保存,确认后再执行

  • 流程引导 Prompt:内置 leave_flow_guide 提示词,指导 LLM 按序调用工具

Related MCP server: HR Leave Management MCP Server

安装

# 克隆项目后安装(包含开发依赖)
pip install -e ".[dev]"

环境变量配置

复制 .env.example 为 .env 并按需修改:

copy .env.example .env

变量

说明

默认值

API_ENV

环境切换:uat 或 prd

uat

API_BASE_UAT

UAT 域名

https://zhgr-mp-uat.huanhuigroup.cn

API_BASE_PROD

PRD 域名

https://zhgr-mp.huanhuigroup.cn

切换生产环境只需设置 API_ENV=prd,所有接口自动指向 PRD 域名。

使用方式

1. MCP Inspector(开发调试)

mcp dev src/leave_mcp/server.py

浏览器打开 Inspector 界面,可手动触发每个工具并查看返回结构。

2. Claude Desktop 配置

在 Claude Desktop 配置文件(claude_desktop_config.json)中添加:

{
  "mcpServers": {
    "leave-service": {
      "command": "python",
      "args": ["-m", "leave_mcp.server"],
      "cwd": "D:\\子公司AI大赛PPT\\003",
      "env": {
        "PYTHONPATH": "D:\\子公司AI大赛PPT\\003\\src",
        "API_ENV": "uat"
      }
    }
  }
}

API_ENV 设为 uat 或 prd,不设置默认 uat。切换到生产环境改为 "prd" 即可。

3. 直接运行

python -m leave_mcp.server

工具列表

#

工具名

功能

封装接口

1

init_leave_flow

初始化流程:获取用户信息、检查未销假、获取请假类型和余额

接口 1+4+2+3

2

select_organization

从岗位列表中选择指定岗位(边界校验)

无

3

calculate_leave_days

计算实际休假天数 + 年假/调休假余额校验

接口 5

4

check_attachment_requirement

根据请假类型检查附件要求(7 类规则 + 丧假 ≤3 天)

无

5

upload_attachment

批量上传附件(支持 base64 编码或文件路径)

接口 7

6

submit_leave_application

提交请假申请,返回申请单号

接口 8

Prompt

  • leave_flow_guide:请假流程引导,指导 LLM 按 init → select → calculate → check_attachment → (upload) → submit 顺序调用工具。

工具调用流程

用户发起请假请求
    │
    ▼
init_leave_flow(user_token)
    │
    ├── has_pending_leave=true → 提示用户先销假,结束
    │
    ▼
select_organization(user_orgs, selected_index)  [多岗位时]
    │
    ▼
calculate_leave_days(...)
    │
    ├── balance_sufficient=false → 提示余额不足
    │
    ▼
check_attachment_requirement(leave_type, leave_days, has_attachment)
    │
    ├── action=reject → 提示拒绝原因(如丧假超3天)
    ├── action=upload → upload_attachment(...) → submit_leave_application(...)
    └── action=submit → submit_leave_application(...)

附件要求速查

请假类型

所需附件

病假

诊断证明或病假条(二选一)

产假

产检证明

工伤假

工伤情况证明

婚假

结婚证

丧假

死亡证明(且时长 ≤ 3 天)

流产假

诊断证明或病假条(二选一)

年休假

无需附件(但需校验余额)

调休假

无需附件(但需校验余额)

测试

# 运行所有测试
pytest tests/ -v

# 运行特定测试类
pytest tests/test_tools.py::TestCalculateLeaveDays -v

测试覆盖:

  • test_client.py:8 个 REST 接口封装(respx mock httpx)

  • test_tools.py:6 个工具的正常/异常分支(未销假拦截、余额不足、丧假超限、7 类附件规则、base64 解码)

项目结构

├── pyproject.toml              # 项目配置 + 依赖
├── .env.example                # 环境变量示例
├── src/leave_mcp/
│   ├── server.py               # FastMCP 实例 + 6 个工具 + prompt
│   ├── config.py               # 环境切换配置(API_ENV 控制 uat/prd)
│   ├── models.py               # Pydantic 输入输出模型
│   ├── client.py               # httpx 异步客户端,8 接口封装
│   ├── exceptions.py           # 自定义异常
│   └── prompts.py              # 流程引导提示词
└── tests/
    ├── conftest.py             # pytest fixtures
    ├── test_client.py          # 接口封装测试
    └── test_tools.py          # 工具逻辑测试

关键设计决策

  1. 环境切换:通过 API_ENV 变量控制(uat/prd),所有 8 个接口统一域名,UAT 用 zhgr-mp-uat.huanhuigroup.cn,PRD 用 zhgr-mp.huanhuigroup.cn。

  2. 错误分层:业务可恢复结果(余额不足等)返回 {success: false, message} 不中断对话;系统异常抛错。

  3. 无状态:MCP 服务不保存会话状态,所需状态(如 selected_org、leave_types)由 LLM 在上下文中保存并作为参数传入。

  4. Token 传参:user_token 通过工具参数传入,不在服务端存储。

  5. Prompts 替代编排:Dify 的 22 节点状态机靠 leave_flow_guide prompt 指导 LLM 按序调用。

  6. 附件双模式上传:支持 file_base64(跨客户端通用)和 file_path(本地直读),优先 file_path。

技术栈

Available Tools

6 tools
calculate_leave_daysA

计算实际休假天数并校验假期余额。

调用接口 5 计算实际休假天数,然后根据请假类型校验余额:

  • 年休假:校验年假余额是否充足

  • 调休假:校验调休假余额是否充足

  • 其他类型:不校验余额

Args: user_token: 用户认证 Token。 leave_type_code: 请假类型编码(来自 init_leave_flow 的 leave_types)。 start_date: 开始日期,格式 yyyy-MM-dd。 end_date: 结束日期,格式 yyyy-MM-dd。 user_code: 用户编码。 leave_type: 请假类型名称(如 "年休假"、"调休假"),用于余额校验。 avlb_annl_leave: 年假剩余天数(来自 init_leave_flow)。 avlb_ot_leave: 调休假剩余天数(来自 init_leave_flow)。 start_time_code: 开始时间编码,AM 或 PM,默认 AM。 end_time_code: 结束时间编码,AM 或 PM,默认 AM。

Returns: CalcDaysResult: 包含休假天数和余额校验结果。

Inputs: end_date (required), user_code (required), leave_type (required), start_date (required), +6 more. Returns: calculate_leave_days 工具返回结果。

check_attachment_requirementA

根据请假类型检查附件要求。

7 类请假类型的附件规则:

  • 病假:诊断证明或病假条

  • 产假:产检证明

  • 工伤假:工伤证明

  • 婚假:结婚证

  • 丧假:死亡证明,且时长 ≤ 3 天(超出则拒绝)

  • 流产假:诊断证明或病假条

  • 年休假/调休假:无需附件

如果用户已上传附件(has_attachment=true),则 action=submit; 否则需上传时 action=upload。

Args: leave_type: 请假类型名称(如 "病假"、"婚假")。 leave_days: 实际休假天数(字符串,来自 calculate_leave_days)。 has_attachment: 用户是否已上传附件。

Returns: AttachmentCheckResult: 包含 action(upload/submit/reject)和提示信息。

Inputs: leave_days (required), leave_type (required), has_attachment (required). Returns: check_attachment_requirement 工具返回结果。

init_leave_flowA

初始化请假流程。

依次执行:获取用户信息(接口1)→ 检查未销假(接口4)→ 获取请假类型(接口2)→ 查询剩余假期(接口3)。 如果存在未销假记录,返回 has_pending_leave=true,LLM 应提示用户先销假。

两种调用方式:

  1. 提供 user_token:直接使用 Token 调用接口。

  2. 提供 user_code:自动通过 /auth/sso/getZhhhToken/{userCode} 获取 Token。 如果 Token 为空,返回提示"用户未登录,请先登录"。

Args: user_token: 用户认证 Token(可选,优先使用)。 user_code: 用户编码(可选,user_token 为空时通过此编码自动获取 Token)。

Returns: InitFlowResult: 包含用户信息、岗位列表、请假类型、剩余假期、Token。

Inputs: user_code, user_token. Returns: init_leave_flow 工具返回结果。

select_organizationA

根据用户选择的序号返回岗位信息。

用于用户有多个岗位时,从 init_leave_flow 返回的 user_orgs 中选择一个。 索引从 0 开始(与 Python 列表一致)。如果用户输入的是从 1 开始的序号, LLM 应在调用前转换为从 0 开始的索引。

Args: user_orgs: 岗位列表,来自 init_leave_flow 的返回值。 selected_index: 选中的岗位索引(从 0 开始)。

Returns: SelectOrgResult: 包含选中的岗位信息。

Inputs: user_orgs (required), selected_index (required). Returns: select_organization 工具返回结果。

submit_leave_applicationA

提交请假申请。

调用接口 8 提交请假流程,返回申请单号。需要汇总所有信息: 用户信息、岗位信息、请假类型、日期、天数、原因、附件等。

Args: user_token: 用户认证 Token。 user_name: 申请人姓名(来自 init_leave_flow)。 user_code: 申请人编码(来自 init_leave_flow)。 selected_org: 选中的岗位信息(来自 select_organization)。 avlb_annl_leave: 年假剩余天数(来自 init_leave_flow)。 avlb_ot_leave: 调休假剩余天数(来自 init_leave_flow)。 leave_type_code: 请假类型编码。 leave_type_value: 请假类型名称。 start_date: 开始日期,格式 yyyy-MM-dd。 end_date: 结束日期,格式 yyyy-MM-dd。 leave_days: 实际休假天数(来自 calculate_leave_days)。 lv_reason: 请假原因。 start_time_code: 开始时间编码,AM 或 PM,默认 AM。 end_time_code: 结束时间编码,AM 或 PM,默认 AM。 file_ids: 附件 ID 列表(来自 upload_attachment,无附件时为 None)。 file_names: 附件名列表(来自 upload_attachment,无附件时为 None)。

Returns: SubmitResult: 包含申请单号。

Inputs: end_date (required), lv_reason (required), user_code (required), user_name (required), +12 more. Returns: submit_leave_application 工具返回结果。

upload_attachmentA

批量上传附件文件。

将 base64 编码的文件内容解码后调用接口 7 上传。支持同时上传多个附件。 单文件大小上限由 MAX_ATTACHMENT_SIZE_MB 控制(默认 10MB)。

Args: user_token: 用户认证 Token。 files: 附件列表,每个元素包含 file_name、mime_type、file_base64。

Returns: UploadResult: 包含上传后的文件 ID 和文件名列表。

Inputs: files (required), user_token (required). Returns: upload_attachment 工具返回结果。

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.3/5.0

    Scored across 6 tools

    Disambiguation5/5

    Each tool has a clear, distinct purpose: initialization, leave calculation, attachment check, organization selection, upload, and submission. No overlapping functionality.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern in snake_case, e.g., calculate_leave_days, upload_attachment. No deviations.

    Tool Count5/5

    With 6 tools, the server covers the essential steps of a leave application process without unnecessary bloat or missing critical operations.

    Completeness4/5

    The tool set covers the full leave application workflow: init, calculate, check, select, upload, submit. Minor gaps like viewing or canceling existing leave are absent but not critical for the core flow.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers