README
🚀 Kanboard MCP 服务器
适用于 Kanboard 集成的模型上下文协议(MCP)服务器
这是一个强大的基于 Go 语言的 MCP 服务器,它能实现 AI 助手(如 Claude Desktop、Cursor)与 Kanboard 项目管理系统的无缝集成。你可以直接通过自然语言命令来管理 Kanboard 项目、任务、用户和工作流程。
⚠️ 重要提示
为避免出现如下问题:
![]()
我们建议使用 mcpproxy 作为代理解决方案。
🚀 快速开始
前提条件
- Go 1.21 或更高版本
- 具有 API 访问权限的 Kanboard 实例
- 兼容 MCP 的客户端(如 Cursor、Claude Desktop 等)
安装
- 克隆仓库:
git clone https://github.com/bivex/kanboard-mcp.git
cd kanboard-mcp
- 构建可执行文件:
- Windows 系统:
build-release.bat
- **Linux 或 macOS 系统**:
./build-release.sh
- **手动构建**:
go build -ldflags="-s -w" -o kanboard-mcp .
✨ 主要特性
- 🔗 Kanboard 无缝集成 - 与 Kanboard 进行直接的 API 通信
- 🤖 自然语言处理 - 使用简洁的英文来管理项目
- 📊 全面的项目管理 - 处理项目、任务、用户、列等更多内容
- 🔐 安全认证 - 支持 API 密钥和用户名/密码两种认证方式
- ⚡ 高性能 - 采用 Go 语言构建,性能卓越
- 🎯 MCP 标准 - 与所有 MCP 客户端兼容
⚙️ 配置
1. 环境变量
使用环境变量设置你的 Kanboard 凭证:
export KANBOARD_API_ENDPOINT="https://your-kanboard-url/jsonrpc.php"
export KANBOARD_API_KEY="your-kanboard-api-key"
export KANBOARD_USERNAME="your-kanboard-username"
export KANBOARD_PASSWORD="your-kanboard-password"
2. MCP 客户端配置
为你的客户端创建 MCP 配置文件:
- Windows 系统:
C:\Users\YOUR_USERNAME\AppData\Roaming\Cursor\.cursor\mcp_config.json - Linux 或 macOS 系统:
~/.cursor/mcp_config.json
配置内容:
{
"mcpServers": {
"kanboard-mcp-server": {
"command": "/path/to/your/kanboard-mcp",
"args": [],
"env": {
"KANBOARD_API_ENDPOINT": "https://your-kanboard-url/jsonrpc.php",
"KANBOARD_API_KEY": "your-kanboard-api-key",
"KANBOARD_USERNAME": "your-kanboard-username",
"KANBOARD_PASSWORD": "your-kanboard-password"
}
}
}
}
3. 重启客户端
保存配置后,重启你的 MCP 客户端(如 Cursor、Claude Desktop 等)以使更改生效。
🛠️ 可用工具
📁 项目管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_projects | 📋 列出所有项目 | "Show me all Kanboard projects" |
| create_project | ➕ 创建新项目 | "Create a project called 'Website Redesign' with description 'Redesign the company website' and owner 1" |
| get_project_by_id | 🔍 通过 ID 获取项目信息 | "Get project details for ID 123" |
| get_project_by_name | 🔍 通过名称获取项目信息 | "Get project details for name 'My Project'" |
| get_project_by_identifier | 🔍 通过标识符获取项目信息 | "Get project details for identifier 'WEB-APP'" |
| get_project_by_email | 🔍 通过电子邮件获取项目信息 | "Get project details for email 'project@example.com'" |
| get_all_projects | 📋 获取所有可用项目 | "Show me all available projects" |
| update_project | ✏️ 更新项目 | "Update project 1 with new name 'New Website' and description 'Updated description'" |
| remove_project | 🗑️ 删除项目 | "Remove project with ID 456" |
| enable_project | ✅ 启用项目 | "Enable project 123" |
| disable_project | 🚫 禁用项目 | "Disable project 123" |
| enable_project_public_access | 🌐 启用给定项目的公共访问权限 | "Enable public access for project 123" |
| disable_project_public_access | 🔒 禁用给定项目的公共访问权限 | "Disable public access for project 123" |
| get_project_activity | 📢 获取项目的活动流 | "Show me activity for project 123" |
| get_project_activities | 📊 获取项目的活动信息 | "Get activities for projects 1, 2, and 3" |
📝 任务管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_tasks | 📋 获取项目任务 | "Get tasks for 'Website Redesign' project" |
| create_task | ➕ 创建新任务 | "Create task 'Design homepage' in 'Website Redesign'" |
| update_task | ✏️ 修改现有任务 | "Update task 123 with description 'New requirements'" |
| delete_task | 🗑️ 删除任务 | "Delete task with ID 456" |
| get_task | 🔍 通过唯一 ID 获取任务 | "Get details for task 789" |
| get_task_by_reference | 🔍 通过外部引用获取任务 | "Get task for project 1 with reference 'TICKET-1234'" |
| get_all_tasks | 📋 获取所有可用任务 | "Get all active tasks for project 1" |
| get_overdue_tasks | ⏰ 获取所有逾期任务 | "Show me all overdue tasks" |
| get_overdue_tasks_by_project | ⏰ 获取特定项目的所有逾期任务 | "Show me overdue tasks for project 1" |
| open_task | ✅ 将任务状态设置为打开 | "Open task 123" |
| close_task | ❌ 将任务状态设置为关闭 | "Close task 123" |
| move_task_position | ➡️ 在同一看板内将任务移动到其他列、位置或泳道 | "Move task 123 to column 2, position 1, swimlane 1 in project 1" |
| move_task_to_project | ➡️ 将任务移动到其他项目 | "Move task 123 to project 456" |
| duplicate_task_to_project | 📋 将任务复制到其他项目 | "Duplicate task 123 to project 456" |
| search_tasks | 🔍 使用搜索引擎查找任务 | "Search tasks in project 2 for query 'assignee:nobody'" |
| assign_task | 👤 将任务分配给用户 | "Assign the API task to John" |
| set_task_due_date | 📅 设置任务截止日期 | "Set due date for login task to 2024-01-15" |
💬 评论管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| create_comment | ➕ 创建新评论 | "Create a comment 'Meeting notes' for task 123 by user 1, visible to app-managers" |
| get_task_comments | 📋 获取任务评论 | "Show all comments for task 123" |
| get_comment | 🔍 获取评论信息 | "Get details for comment 789" |
| update_comment | ✏️ 更新评论 | "Update comment 456 content to 'Revised notes'" |
| remove_comment | 🗑️ 删除评论 | "Remove comment with ID 101" |
🏗️ 列管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_columns | 📋 列出项目列 | "Show me all columns in project 123" |
| get_column | 🔍 获取单个列 | "Get details for column 456" |
| create_column | ➕ 添加新列 | "Create a 'Testing' column in project 123 with 5 task limit and description 'For UAT testing'" |
| update_column | ✏️ 修改列设置 | "Change column 123 title to 'Review' and limit to 3 tasks, with description 'Needs final review'" |
| change_column_position | 🔄 更改列位置 | "Move column 123 to position 3 in project 456" |
| delete_column | 🗑️ 删除列 | "Delete the unused 'Draft' column" |
🏷️ 类别管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_categories | 📋 列出项目类别 | "Show me all task categories for project 123" |
| get_category | 🔍 获取类别信息 | "Get details for category 456" |
| create_category | ➕ 添加任务类别 | "Create a 'Bug Fixes' category in project 123 with color 'red'" |
| update_category | ✏️ 修改类别 | "Rename category 123 to 'Critical Issues' and set color to 'blue'" |
| delete_category | 🗑️ 删除类别 | "Delete the unused 'Archive' category" |
🏊 泳道管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_swimlanes | 📋 列出项目的所有泳道(启用或禁用),并按位置排序 | "Show me all swimlanes for project 1" |
| get_active_swimlanes | 📋 获取项目的启用泳道列表(如果启用了默认泳道,则包含在内) | "Get active swimlanes for project 1" |
| get_swimlane | 🔍 通过 ID 获取泳道 | "Get swimlane details for ID 1" |
| get_swimlane_by_id | 🔍 通过 ID 获取泳道 | "Get swimlane details for ID 1" |
| get_swimlane_by_name | 🔍 通过名称获取泳道 | "Get swimlane details for project 1 with name 'Swimlane 1'" |
| change_swimlane_position | 🔄 移动泳道位置(仅适用于活动泳道) | "Change swimlane 2 position to 3 in project 1" |
| create_swimlane | ➕ 添加新泳道 | "Create a swimlane 'Frontend Team' in project 1" |
| update_swimlane | ✏️ 更新泳道属性 | "Update swimlane 1 for project 1 with new name 'Cross-Platform Team'" |
| remove_swimlane | 🗑️ 删除泳道 | "Remove swimlane 1 from project 2" |
| disable_swimlane | 🚫 禁用泳道 | "Disable swimlane 1 from project 2" |
| enable_swimlane | ✅ 启用泳道 | "Enable swimlane 1 from project 2" |
📋 看板管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_board | 📋 获取显示看板所需的所有信息 | "Show me the board for project 123" |
🧑💻 当前用户管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_me | 👤 获取当前登录用户的会话信息 | "Get my user session information" |
| get_my_dashboard | 📊 获取当前登录用户的仪表盘 | "Show me my dashboard" |
| get_my_activity_stream | 📢 获取当前登录用户的最后 100 个事件 | "Show me my recent activity" |
| create_my_private_project | ➕ 为当前登录用户创建一个私有项目 | "Create a private project named 'My Secret Project' with description 'For personal tasks'" |
| get_my_projects_list | 📋 获取当前登录用户参与的项目 | "List all projects I'm involved in" |
| get_my_overdue_tasks | ⏰ 获取当前登录用户的逾期任务 | "Show me all my tasks that are overdue" |
| get_my_projects | 📝 获取当前登录用户参与的项目的详细信息 | "Get detailed information about all my projects" |
🔗 外部任务链接管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_external_task_link_types | 📋 获取所有注册的外部链接提供者 | "Show me all external link types" |
| get_ext_link_provider_deps | ⛓️ 获取给定提供者的可用依赖项 | "Get dependencies for 'weblink' provider" |
| create_external_task_link | ➕ 创建新的外部链接 | "Create an external link for task 123 to 'http://example.com/doc.pdf' with dependency 'related' and type 'attachment'" |
| update_external_task_link | ✏️ 更新外部任务链接 | "Update external link 456 for task 789 with new title 'Updated Document' and URL 'http://new.example.com/doc.pdf'" |
| get_external_task_link_by_id | 🔍 通过 ID 获取外部任务链接 | "Get external link 456 for task 789" |
| get_all_external_task_links | 📋 获取附加到任务的所有外部链接 | "Show all external links for task 123" |
| remove_external_task_link | 🗑️ 删除外部链接 | "Remove external link 456 from task 789" |
🔗 内部任务链接管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| create_task_link | ➕ 在两个任务之间创建链接 | "Create a link between task 123 and task 456 with link type 1" |
| update_task_link | ✏️ 更新任务链接 | "Update task link 789 between task 123 and task 456 with new link type 2" |
| get_task_link_by_id | 🔍 通过 ID 获取任务链接 | "Get details for task link 101" |
| get_all_task_links | 📋 获取与任务相关的所有链接 | "Show all links for task 123" |
| remove_task_link | 🗑️ 删除两个任务之间的链接 | "Remove task link 101" |
🔗 链接管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_all_links | 📋 获取任务之间可能的关系列表 | "Show all possible task relations" |
| get_opposite_link_id | 🔍 获取任务链接的相反链接 ID | "Get the opposite link ID for link 2" |
| get_link_by_label | 🔍 通过标签获取链接 | "Get details for link with label 'blocks'" |
| get_link_by_id | 🔍 通过 ID 获取链接 | "Get details for link with ID 4" |
| create_link | ➕ 创建新的任务关系 | "Create a link 'foo' with opposite label 'bar'" |
| update_link | ✏️ 更新链接 | "Update link 14 with opposite link 12 and label 'boo'" |
| remove_link | 🗑️ 删除链接 | "Remove link with ID 14" |
📂 项目文件管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| create_project_file | ➕ 创建并上传新的项目附件 | "Create a file 'My Document.pdf' for project 1 with base64 content 'Zm9vYmFy'" |
| get_all_project_files | 📋 获取附加到项目的所有文件 | "Show all files for project 123" |
| get_project_file | 🔍 获取文件信息 | "Get details for file 456 in project 123" |
| download_project_file | 📥 下载项目文件内容(以 base64 编码) | "Download file 456 from project 123" |
| remove_project_file | 🗑️ 删除与项目关联的文件 | "Remove file 456 from project 123" |
| remove_all_project_files | 🗑️ 删除与项目关联的所有文件 | "Remove all files from project 123" |
📝 项目元数据管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_project_metadata | 📋 获取项目元数据 | "Get all metadata for project 123" |
| get_project_metadata_by_name | 🔍 获取单个元数据值 | "Get metadata 'my_key' for project 123" |
| save_project_metadata | 💾 添加或更新元数据 | "Save metadata 'key1:value1, key2:value2' for project 123" |
| remove_project_metadata | 🗑️ 删除项目元数据 | "Remove metadata 'my_key' from project 123" |
🔐 项目权限管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_project_users | 📋 获取项目的所有成员 | "Show all users in project 123" |
| get_assignable_users | 👥 获取可以分配给项目任务的用户(除查看者外的所有成员) | "Get assignable users for project 123" |
| add_project_user | ➕ 授予用户对项目的访问权限 | "Add user 1 to project 123 with role 'project-member'" |
| add_project_group | ➕ 授予组对项目的访问权限 | "Add group 456 to project 123 with role 'project-viewer'" |
| remove_project_user | 🗑️ 撤销用户对项目的访问权限 | "Remove user 1 from project 123" |
| remove_project_group | 🗑️ 撤销组对项目的访问权限 | "Remove group 456 from project 123" |
| change_project_user_role | ✏️ 更改用户在项目中的角色 | "Change user 1's role in project 123 to 'project-manager'" |
| change_project_group_role | ✏️ 更改组在项目中的角色 | "Change group 456's role in project 123 to 'project-manager'" |
| get_project_user_role | 🔍 获取用户在给定项目中的角色 | "Get the role of user 1 in project 123" |
📝 子任务管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| create_subtask | ➕ 创建新的子任务 | "Create a subtask 'Review designs' for task 123 with user 1 assigned" |
| get_subtask | 🔍 获取子任务信息 | "Get details for subtask 456" |
| get_all_subtasks | 📋 获取任务的所有可用子任务 | "Show all subtasks for task 123" |
| update_subtask | ✏️ 更新子任务 | "Update subtask 456 for task 123 to status 2 (Done)" |
| remove_subtask | 🗑️ 删除子任务 | "Remove subtask with ID 456" |
⏰ 子任务时间跟踪
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| has_subtask_timer | ⏱️ 检查给定子任务和用户是否已启动计时器 | "Check if a timer is active for subtask 123 by user 4" |
| set_subtask_start_time | ▶️ 为用户启动子任务计时器 | "Start timer for subtask 123 by user 4" |
| set_subtask_end_time | ⏹️ 为用户停止子任务计时器 | "Stop timer for subtask 123 by user 4" |
| get_subtask_time_spent | 📊 获取用户在子任务上花费的时间 | "Get time spent on subtask 123 by user 4" |
🏷️ 标签管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_all_tags | 📋 获取所有标签 | "Show all available tags" |
| get_tags_by_project | 📋 获取给定项目的所有标签 | "Show tags for project 123" |
| create_tag | ➕ 创建新标签 | "Create tag 'backend' for project 123 with color 1" |
| update_tag | ✏️ 重命名标签 | "Rename tag 456 to 'frontend' and set color to 2" |
| remove_tag | 🗑️ 删除标签 | "Remove tag with ID 456" |
| set_task_tags | 🏷️ 为任务分配/创建/更新标签 | "Set tags 'urgent', 'bug' for task 123 in project 456" |
| get_task_tags | 🔍 获取分配给任务的标签 | "Get tags assigned to task 123" |
📂 任务文件管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| create_task_file | ➕ 创建并上传新的任务附件 | "Create a file 'meeting_notes.txt' for project 1 with task 2 and base64 content 'Zm9vYmFy'" |
| get_all_task_files | 📋 获取附加到任务的所有文件 | "Show all files for task 123" |
| get_task_file | 🔍 获取文件信息 | "Get details for file 456" |
| download_task_file | 📥 下载文件内容(以 base64 编码) | "Download file 456" |
| remove_task_file | 🗑️ 删除文件 | "Remove file with ID 456" |
| remove_all_task_files | 🗑️ 删除与任务关联的所有文件 | "Remove all files from task 123" |
📝 任务元数据管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_task_metadata | 📋 获取与任务相关的所有元数据(通过任务唯一 ID) | "Get all metadata for task 1" |
| get_task_metadata_by_name | 🔍 获取与任务相关的单个元数据值(通过任务唯一 ID 和元数据键) | "Get metadata 'metaKey1' for task 1" |
| save_task_metadata | 💾 保存/更新任务元数据 | "Save metadata 'metaName:metaValue' for task 1" |
| remove_task_metadata | 🗑️ 删除任务元数据(通过名称) | "Remove metadata 'metaKey1' from task 1" |
⚙️ 应用程序管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_version | 📋 获取应用程序版本 | "What is the Kanboard version?" |
| get_timezone | 🌐 获取当前登录用户的时区 | "What is my current timezone?" |
| get_default_task_colors | 🌈 获取所有默认任务颜色 | "Show me all default task colors" |
| get_default_task_color | 🎨 获取默认任务颜色 | "What is the default task color?" |
| get_color_list | 📋 获取任务颜色列表 | "List all available task colors" |
| get_application_roles | 👥 获取应用程序角色 | "List all application roles" |
| get_project_roles | 👥 获取项目角色 | "List all project roles" |
🤖 自动操作管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_available_actions | 📋 获取可用的自动操作列表 | "Show available automatic actions" |
| get_available_action_events | 📋 获取操作可用的事件列表 | "Show available action events" |
| get_compatible_action_events | 🔍 获取与操作兼容的事件列表 | "Get compatible events for action 'TaskClose'" |
| get_actions | 📋 获取项目的操作列表 | "Get actions for project 123" |
| create_action | ➕ 创建操作 | "Create an action for project 1, event 'task.move.column', action '\Kanboard\Action\TaskClose', with params 'column_id:3'" |
| remove_action | 🗑️ 删除操作 | "Remove action with ID 456" |
👥 组管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| create_group | ➕ 创建新组 | "Create a group named 'Development Team' with external ID 'dev_001'" |
| update_group | ✏️ 更新组 | "Rename group 123 to 'QA Team' and change its external ID to 'qa_001'" |
| remove_group | 🗑️ 删除组 | "Remove group with ID 456" |
| get_group | 🔍 获取一个组的信息 | "Get details for group 789" |
| get_all_groups | 📋 获取所有组 | "Show me all user groups" |
👥 组成员管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_member_groups | 📋 获取给定用户的所有组 | "Show me all groups for user 1" |
| get_group_members | 👥 获取组的所有成员 | "List all members of group 123" |
| add_group_member | ➕ 将用户添加到组中 | "Add user 456 to group 789" |
| remove_group_member | 🗑️ 从组中移除用户 | "Remove user 456 from group 789" |
| is_group_member | ❓ 检查用户是否为组的成员 | "Is user 456 a member of group 789?" |
👥 用户管理
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| get_users | 📋 列出所有系统用户 | "Show me all users" |
| create_user | ➕ 创建新用户 | "Create user 'john' with password '123456'" |
| create_ldap_user | ➕ 创建通过 LDAP 认证的新用户 | "Create LDAP user 'jane'" |
| get_user | 🔍 通过 ID 获取用户信息 | "Get user details for ID 123" |
| get_user_by_name | 🔍 通过用户名获取用户信息 | "Get user details for 'john'" |
| update_user | ✏️ 更新用户信息 | "Update user 123 with role 'app-manager'" |
| remove_user | 🗑️ 删除用户 | "Remove user with ID 456" |
| disable_user | ❌ 禁用用户 | "Disable user 123" |
| enable_user | ✅ 启用用户 | "Enable user 123" |
| is_active_user | 🔍 检查用户是否处于活动状态 | "Check if user 123 is active" |
| assign_user_to_project | 👤 将用户分配到项目并指定特定角色 | "Assign user 1 to project 'Website' with role 'project-member'" |
🏃 ScrumSprint 插件 API
| 工具 | 描述 | 示例 |
| ---- | ---- | ---- |
| create_sprint | ➕ 创建新的冲刺 | "Create a sprint named 'Sprint 1' in project 'My Project' starting '2024-01-01' and ending '2024-01-14' with goal 'Complete onboarding features'" |
| get_sprint_by_id | 🔍 通过 ID 检索冲刺 | "Get details for sprint with ID 123" |
| update_sprint | ✏️ 更新现有冲刺 | "Update sprint 123 in project 'My Project' to be completed" |
| remove_sprint | 🗑️ 通过 ID 删除冲刺 | "Remove sprint with ID 123" |
| get_all_sprints_by_project | 📋 检索给定项目的所有冲刺 | "Get all sprints for project 'My Project'" |
💻 使用示例
项目工作流
# 创建一个新项目
"Create a new project called 'Mobile App Development'"
# 向项目中添加任务
"Create task 'Design UI mockups' in project 'Mobile App Development'"
"Create task 'Set up development environment' in project 'Mobile App Development'"
# 获取所有任务
"Get tasks for 'Mobile App Development' project"
# 在列之间移动任务
"Move task 1 to 'In Progress' column"
"Move task 2 to 'Done' column"
团队管理
# 创建一个新的团队成员
"Create user 'alice.smith' with password 'secure123' and email 'alice@company.com'"
# 将用户分配到项目
"Assign user 'alice.smith' to project 'Mobile App Development' as project-member"
# 将任务分配给团队成员
"Assign task 1 to user 'alice.smith'"
任务组织
# 创建类别以更好地组织任务
"Create category 'Critical Bugs'"
"Create category 'Feature Requests'"
# 为任务添加评论
"Add comment 'This needs urgent attention' to task 5"
# 设置截止日期
"Set due date for task 3 to 2024-01-20"
🔧 开发
从源代码构建
# 克隆仓库
git clone https://github.com/bivex/kanboard-mcp.git
cd kanboard-mcp
# 安装依赖
go mod download
# 构建应用程序
go build -o kanboard-mcp .
# 运行测试
go test ./...
项目结构
kanboard-mcp/
├── main.go # 主应用程序入口点
├── go.mod # Go 模块依赖项
├── go.sum # 依赖项校验和
├── build-release.bat # Windows 构建脚本
├── build-release.sh # Unix 构建脚本
├── README.md # 本文件
└── LICENSE.md # 许可证信息
贡献代码
- Fork 仓库
- 创建功能分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 打开 Pull Request
📄 许可证
本项目采用 MIT 许可证 - 详情请参阅 LICENSE.md 文件。
Scan to join WeChat group