Skip to main content
Glama
answerlink

MCP Workspace Server

by answerlink
README.md
# MCP Workspace Server

**[English](./README_EN.md)** | **äž­æ–‡**

[![License](assets/license-badge.svg)](LICENSE)

🚀 **只需䞀䞪 MCP就胜实现䜠的完敎 Agent 胜力**

**超越文件系统的 AI 匀发环境** - 让 AI 像 Claude Code 䞀样进行完敎的 Web 匀发、数据倄理和代码执行

> 💡 **栞心价倌**无需集成倚䞪 MCP 工具**䞀䞪 MCP 服务噚**即可提䟛文件操䜜、代码执行、Web 郚眲、数据倄理、囟像生成等完敎的 Agent 胜力。匀箱即甚䞀站匏解决方案。

䞀䞪功胜区倧的 MCP (Model Context Protocol) 服务噚䞍仅提䟛安党的文件系统操䜜曎是䞀䞪**完敎的 AI 匀发工䜜空闎**。支持代码执行、Web 应甚䞀键郚眲、泛域名访问、Excel 倄理、囟像生成等䌁䞚级胜力。

## ✹ 䞺什么选择我们

### 🎯 䞀䞪 MCP完敎 Agent 胜力

**䌠统方案**需芁集成倚䞪 MCP 工具才胜实现完敎功胜
- ❌ 文件操䜜 → 需芁䞀䞪 MCP
- ❌ 代码执行 → 需芁及䞀䞪 MCP  
- ❌ Web 郚眲 → 需芁第䞉䞪 MCP
- ❌ 数据倄理 → 需芁第四䞪 MCP
- ❌ 囟像生成 → 需芁第五䞪 MCP
- **结果**配眮倍杂、绎技困隟、功胜分散

**我们的方案**只需䞀䞪 MCP所有胜力匀箱即甚
- ✅ **文件操䜜** + **代码执行** + **Web 郚眲** + **数据倄理** + **囟像生成**
- ✅ **统䞀配眮**䞀次配眮党郚启甚
- ✅ **统䞀管理**䞀䞪服务集䞭管理
- ✅ **统䞀安党**䞀套安党策略党面保技

我们提䟛的是**完敎的 AI 匀发工䜜空闎**胜力远超䌠统文件系统服务噚

- 🚀 **Web 匀发胜力**AI 可以创建完敎的 Web 应甚HTML/CSS/JS并**䞀键郚眲到生产环境**
- 🌐 **泛域名郚眲**支持 `*.your-domain.com` 泛域名每䞪䌚话自劚获埗独立子域名访问
- 💻 **代码执行**内眮 Python 3.12 和 Node.js 20 沙盒环境支持代码实时执行和调试
- 📊 **数据倄理**完敎的 Excel/CSV 倄理胜力支持暡板、公匏、栌匏化
- 🎚 **囟像生成**支持 Mermaid 流皋囟、数据囟衚、HTML 枲染等倚种囟像生成方匏
- 🔍 **智胜搜玢**文件内容搜玢、知识库检玢、眑页抓取等高级胜力
- 🔐 **䌁䞚级安党**倚租户隔犻、路埄安党防技、资源限制、沙盒执行

### 🎁 All-in-One 䌘势

| 䌠统方案 | 我们的方案 |
|---------|-----------|
| 需芁 5+ 䞪 MCP 工具 | **只需 1 䞪 MCP** |
| 配眮倍杂需芁逐䞪集成 | **匀箱即甚䞀键配眮** |
| 功胜分散隟以统䞀管理 | **功胜集䞭统䞀管理** |
| 安党策略䞍统䞀 | **统䞀安党策略** |
| 绎技成本高 | **绎技简单** |

**䞀句话总结**䞀䞪 MCP 服务噚 = 完敎的 Agent 胜力栈 🚀

### 💡 兞型䜿甚场景

**场景 1AI 驱劚的 Web 匀发**
```
AI 创建完敎的前端应甚 → 䞀键郚眲 → 获埗独立域名访问
䟋劂https://user123_chat456.your-domain.com
```

**场景 2数据分析䞎可视化**
```
读取 Excel → 数据倄理 → 生成囟衚 → 创建报告 → 郚眲展瀺页面
```

**场景 3代码匀发䞎测试**
```
猖写 Python 脚本 → 执行测试 → 修倍 Bug → 郚眲 API 服务
```

## ✹ 栞心特性

### 🔐 倚租户䌚话隔犻

每䞪甚户/䌚话拥有独立的虚拟工䜜空闎完党隔犻互䞍干扰。

**工䜜目圕呜名规则**

| X-User-ID | X-Chat-ID | 工䜜目圕 |
|----------|-----------|----------|
| `user123` | `chat456` | `user_data/user123_chat456/` |
| `user123` | (空) | `user_data/user123/` |
| (空) | `chat456` | `user_data/chat456/` |
| (空) | (空) | 䜿甚默讀党局暡匏 |

通过 HTTP 请求倎䌠递身仜标识
- `X-User-ID`: 甚户唯䞀标识可选
- `X-Chat-ID`: 䌚话唯䞀标识可选

### 🛡 虚拟路埄系统

**LLM 视角完党虚拟化**AI 暡型看到的是䞀䞪干净的虚拟文件系统以 `/` 䞺根目圕。

```
LLM 看到的路埄          实际物理路埄
─────────────────────────────────────────────────────────
/                    → /server/user_data/user123_chat456/
/todo.txt            → /server/user_data/user123_chat456/todo.txt
/docs/readme.md      → /server/user_data/user123_chat456/docs/readme.md
```

**䌘势**
- ✅ 䞍暎露服务噚真实目圕结构
- ✅ AI 平台无法获知物理路埄信息
- ✅ 简化 AI 的文件操䜜指什
- ✅ 提升安党性和隐私保技

### 🔒 路埄安党防技

内眮倚层安党机制防止路埄遍历攻击

```
攻击尝试                              结果
─────────────────────────────────────────────────
/../../../etc/passwd                 ❌ 被阻止
../../../etc/passwd                  ❌ 被阻止  
/foo/../../../etc/passwd             ❌ 被阻止
/foo/bar/../../..                    ❌ 被阻止
```

**安党机制**
1. **路埄解析**䜿甚 `Path.resolve()` 解析所有 `..` 和笊号铟接
2. **蟹界检查**验证解析后的路埄是吊圚允讞范囎内
3. **双重保技**即䜿路埄被解析仍必须圚 `allowed_dirs` 内

### 📡 SSE 䌠蟓协议

支持 Server-Sent Events (SSE) 䌠蟓适配各类 AI 平台

```
客户端                                服务噚
   │                                    │
   │──── GET /sse ──────────────────────▶│  建立 SSE 连接
   │◀─── SSE: endpoint=/messages?sid=xxx │  返回消息端点
   │                                    │
   │──── POST /messages?session_id=xxx ─▶│  发送工具调甚
   │◀─── SSE: message (响应) ───────────│  接收结果
```

### 🌐 䞀键郚眲䞎泛域名支持

**䞀键郚眲 Web 应甚**
- AI 创建的前端项目可通过 `preview_frontend` 工具䞀键郚眲
- 自劚生成可访问的 URL支持 HTTPS
- 支持自定义入口文件和目圕结构

**泛域名郚眲生产环境**
```json
{
  "preview": {
    "wildcard_domain": "*.proxy.your-domain.com",
    "use_tls": true
  }
}
```

配眮后每䞪䌚话自劚获埗独立子域名
- `user123_chat456.proxy.your-domain.com`
- `user789_chat012.proxy.your-domain.com`

**䌘势**
- ✅ 无需手劚配眮域名和端口
- ✅ 自劚隔犻互䞍干扰
- ✅ 支持 HTTPS生产就绪
- ✅ 单端口服务简化郚眲

## 📊 完敎功胜列衚

### 💻 Web 匀发䞎郚眲
| 工具 | 功胜 | 亮点 |
|------|------|------|
| `fs_write` | 创建 Web 文件HTML/CSS/JS | 自劚识别栌匏支持完敎前端项目 |
| `preview_frontend` | 䞀键郚眲静态前端 | **支持泛域名自劚生成独立子域名** |
| `exec` | 执行 Python/Node.js 代码 | 沙盒环境支持实时调试 |
| `generate_image` | 生成囟衚和流皋囟 | Mermaid、数据可视化、HTML 枲染 |

### 📁 文件系统操䜜
| 工具 | 功胜 |
|------|------|
| `fs_read` | 读取文件支持批量、Excel、行范囎 |
| `fs_write` | 创建/芆盖文件自劚识别栌匏 |
| `fs_ops` | 文件系统操䜜list/mkdir/move/info/delete |
| `fs_replace` | 基于 SEARCH/REPLACE 粟确猖蟑文件 |
| `fs_search` | 搜玢文件glob=按文件名content=按内容正则 |

### 📊 Excel 数据倄理
| 工具 | 功胜 |
|------|------|
| `fs_read` | 读取 Excel 文件支持 sheet、range 参数 |
| `fs_write` | 创建/芆盖 Excel 文件自劚识别栌匏 |
| `excel_edit` | 猖蟑 Excel批量曎新单元栌、栌匏化 |
| `list_excel_templates` | 列出可甚 Excel 暡板 |
| `create_excel_from_template` | 从暡板创建 Excel 文件 |

### 🔍 高级胜力可选
| 工具 | 功胜 | 配眮项 |
|------|------|--------|
| `kb_search` | 䌁䞚知识库 glob 搜玢 | `kb.enabled=true` |
| `kb_read` | 读取知识库文件返回 Markdown | `kb.enabled=true` |
| `crawl_url` | 抓取眑页并返回 Markdown | `web_crawl.enabled=true` |
| `web_search` | 联眑搜玢 | `web_search.enabled=true` |

## 🔌 侎 AI 平台集成

### 🎯 䞺什么选择我们䜜䞺䜠的 MCP Server

**我们是区倧的 All-in-One MCP Server**只需䞀次配眮即可䞺䜠的 AI 平台提䟛完敎的 Agent 胜力

- ✅ **文件操䜜**读写、搜玢、猖蟑文件
- ✅ **代码执行**Python/Node.js 沙盒环境
- ✅ **Web 郚眲**䞀键郚眲前端应甚支持泛域名
- ✅ **数据倄理**Excel/CSV 完敎倄理胜力
- ✅ **囟像生成**Mermaid 流皋囟、数据囟衚
- ✅ **智胜搜玢**知识库检玢、眑页抓取可选

**无需集成倚䞪 MCP 工具**䞀䞪 MCP Server 即可满足所有需求

### 🚀 支持的 AI 平台

我们䞎䞻流 AI 平台完矎集成配眮简单匀箱即甚

#### Dify

1. **进入 Dify 工䜜流配眮**
   - 添加 **MCP Tool** 节点
   - 选择 **SSE** 䌠蟓协议

2. **配眮 MCP Server 连接**
   ```
   SSE 地址: http://your-server:8000/sse
   ```

3. **讟眮请求倎倚租户隔犻**
   ```
   X-User-ID: {{user_id}}
   X-Chat-ID: {{conversation_id}}
   ```

4. **完成** 现圚䜠的 Dify Agent 拥有完敎的文件操䜜、代码执行、Web 郚眲等胜力。

#### FastGPT

1. **进入 FastGPT 知识库/应甚配眮**
   - 添加 **倖郚工具** → **MCP**
   - 䌠蟓方匏选择 **SSE**

2. **配眮连接信息**
   ```
   MCP Server URL: http://your-server:8000/sse
   ```

3. **配眮甚户标识可选甚于倚租户隔犻**
   ```
   自定义 Header:
   X-User-ID: {{userId}}
   X-Chat-ID: {{chatId}}
   ```

4. **启甚工具**所有工具自劚可甚无需逐䞪配眮

#### Cherry Studio

1. **进入 Cherry Studio 讟眮**
   - 打匀 **MCP Servers** 配眮
   - 添加新的 MCP Server

2. **配眮连接**
   ```json
   {
     "name": "MCP Workspace Server",
     "transport": "sse",
     "url": "http://your-server:8000/sse"
   }
   ```

3. **讟眮䌚话标识倚租户支持**
   - Cherry Studio 䌚自劚䌠递甚户和䌚话信息
   - 每䞪䌚话获埗独立的工䜜空闎

### 💡 集成䌘势

| 䌠统方案 | 䜿甚我们的 All-in-One MCP |
|---------|---------------------------|
| 需芁配眮 5+ 䞪䞍同的 MCP 工具 | **只需配眮 1 䞪 MCP Server** |
| 每䞪工具需芁单独连接和讀证 | **䞀次配眮党郚启甚** |
| 工具之闎功胜分散隟以统䞀管理 | **功胜集䞭统䞀管理** |
| 䞍同工具的安党策略䞍䞀臎 | **统䞀安党策略党面保技** |
| 绎技倚䞪服务的成本高 | **绎技简单䞀䞪服务搞定** |

### 🎁 匀箱即甚的胜力

配眮完成后䜠的 AI Agent 立即拥有

- 📝 **文件操䜜**创建、读取、猖蟑、搜玢文件
- 💻 **代码执行**运行 Python/Node.js 脚本实时调试
- 🌐 **Web 匀发**创建前端应甚并䞀键郚眲到生产环境
- 📊 **数据倄理**读取、猖蟑 Excel生成报告
- 🎚 **囟像生成**创建流皋囟、数据可视化囟衚
- 🔍 **智胜搜玢**文件内容搜玢、知识库检玢劂启甚

**䞀䞪 MCP Server = 完敎的 Agent 胜力栈** 🚀

## 🚀 快速匀始

### Docker 郚眲掚荐

```bash
# 克隆项目
git clone <repository-url>
cd mcp-filesystem

# 銖次郚眲构建镜像并启劚
docker-compose up -d --build

> 劂果无法䜿甚docker镜像源可以先执行 export DOCKER_BUILDKIT=0

# 曎新代码后重启生效
git pull && docker-compose restart

# 查看日志
docker-compose logs -f

# 仅圓䟝赖变化时需芁重新构建
docker-compose up -d --build
```

> 💡 镜像包含运行环境代码通过 volume 挂蜜曎新代码只需 `git pull && docker-compose restart`

> ⚠ **重芁诎明**本项目运行环境高床䟝赖 Docker 基础镜像包含完敎的 Python 3.12、Node.js 20 运行环境以及所有系统䟝赖劂 Tesseract OCR、囟像倄理库等。**区烈建议䜿甚 Docker 方匏郚眲**䞍掚荐本地 Python 盎接运行。劂需本地匀发请确保已安装所有系统䟝赖。

### 快速配眮参考

> 📖 **诊细集成诎明**请查看䞊方的 [🔌 侎 AI 平台集成](#-侎-ai-平台集成) 章节包含 Dify、FastGPT、Cherry Studio 的完敎配眮步骀。

**快速连接信息**
- **SSE 地址**: `http://your-server:8000/sse`
- **请求倎**倚租户隔犻:
  - `X-User-ID`: `{{userId}}` 或固定甚户ID
  - `X-Chat-ID`: `{{chatId}}` 或固定䌚话ID

**Claude DesktopSTDIO 暡匏**

猖蟑配眮文件
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%/Claude/claude_desktop_config.json`

```json
{
  "mcpServers": {
    "mcp-workspace": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/mcp-filesystem",
        "run",
        "run_server.py",
        "/path/to/allowed/dir1",
        "/path/to/allowed/dir2"
      ]
    }
  }
}
```

## 🏗 架构讟计

```
┌─────────────────────────────────────────────────────────────┐
│          AI 平台 (Dify / FastGPT / Cherry Studio)           │
└─────────────────────────────────────────────────────────────┘
                              │
                              │ SSE + HTTP POST
                              │ Headers: X-User-ID, X-Chat-ID
                              ▌
┌─────────────────────────────────────────────────────────────┐
│              MCP Workspace Server (All-in-One)               │
│  ┌─────────────────────────────────────────────────────┐    │
│  │              䌚话管理 & 身仜识别                       │    │
│  │         (user_id + chat_id → workspace_name)        │    │
│  └─────────────────────────────────────────────────────┘    │
│                              │                               │
│  ┌─────────────────────────────────────────────────────┐    │
│  │              虚拟路埄蜬换层                           │    │
│  │         /todo.txt → /user_data/xxx/todo.txt         │    │
│  └─────────────────────────────────────────────────────┘    │
│                              │                               │
│  ┌─────────────────────────────────────────────────────┐    │
│  │              路埄安党验证                             │    │
│  │         PathValidator + 路埄遍历防技                  │    │
│  └─────────────────────────────────────────────────────┘    │
│                              │                               │
│  ┌─────────────────────────────────────────────────────┐    │
│  │              文件操䜜执行                             │    │
│  │         FileOperations / AdvancedFileOperations      │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▌
┌─────────────────────────────────────────────────────────────┐
│                      物理文件系统                            │
│  user_data/                                                 │
│  ├── user1_chat1/                                           │
│  │   ├── todo.txt                                           │
│  │   └── docs/                                              │
│  ├── user1_chat2/                                           │
│  └── user2_chat1/                                           │
└─────────────────────────────────────────────────────────────┘
```

## 🔧 管理员 API

提䟛 HTTP 接口甚于监控、调试和运绎。

### 🔑 讀证配眮

Admin API 需芁 Bearer Token 讀证。銖先配眮 `config.json`

```bash
# 倍制瀺䟋配眮文件
cp config.example.json config.json

# 猖蟑配眮讟眮䜠的管理员密钥
vim config.json
```

```json
{
  "admin_token": "your-secret-admin-token-here"
}
```

所有 Admin API 请求必须携垊 `Authorization` 倎

```bash
curl -H "Authorization: Bearer your-secret-admin-token-here" \
     http://localhost:8000/admin/stats
```

> ⚠ **安党提瀺**`config.json` 已添加到 `.gitignore`请勿将其提亀到版本库。

### 获取服务噚统计信息

```http
GET /admin/stats
Authorization: Bearer <admin_token>
```

**响应瀺䟋**
```json
{
  "success": true,
  "user_data_dir": "/path/to/user_data",
  "total_workspaces": 15,
  "unique_users": 8,
  "total_size_bytes": 1048576,
  "total_size_human": "1.00 MB",
  "active_sessions": 3
}
```

### 列出所有工䜜空闎

```http
GET /admin/workspaces
GET /admin/workspaces?user_id=user123
Authorization: Bearer <admin_token>
```

### 获取工䜜空闎诊情

```http
GET /admin/workspace/{workspace_id}
GET /admin/workspace/{workspace_id}/tree?max_depth=5
Authorization: Bearer <admin_token>
```

### 删陀工䜜空闎

```http
DELETE /admin/workspace/{workspace_id}?confirm=yes
Authorization: Bearer <admin_token>
```

⚠ **譊告**歀操䜜䞍可逆必须添加 `?confirm=yes` 参数才胜执行删陀。

## 👀 甚户工䜜空闎 API

䞺甚户提䟛无需管理员 Token 的工䜜空闎目圕树查询。

```http
GET /api/workspace/tree?user_id={user_id}&chat_id={chat_id}&max_depth=5
```

- 䞍需芁 `Authorization` 倎
- 仅返回对应 `user_id + chat_id` 组合的工䜜空闎
- 每䞪目圕层级按最近修改时闎排序仅保留前 20 䞪文件/文件倹其䜙盎接过滀以节省垊宜

## 🧩 Excel 配眮

- `config.json`/`config.example.json` 新增 `excel` 段萜甚于讟眮最倧文件倧小、默讀读取行数、支持栌匏䞎公匏检测匀关。
- 暡板`excel.templates_file` 默讀指向 `excel_templates/templates.json`暡板源文件攟圚 `excel_templates/`对倖只暎露 `title/desc``create_excel_from_template` 䌚自劚避匀重名。銖次䜿甚时请从 `templates_example.json` 倍制创建 `templates.json`并根据实际情况配眮暡板路埄。
- 环境变量芆盖`MCP_EXCEL_MAX_ROWS`、`MCP_EXCEL_MAX_SIZE_MB`。
- 诊细参数䞎瀺䟋见 `docs/EXCEL_TOOLS.md`。

## ⚙ 启劚配眮

- `config.json` 䞭新增 `mcp` 段萜可配眮 `transport`默讀 `sse`、`host`默讀 `0.0.0.0`、`port`默讀 `18089`。
- CLI 参数 `--transport/--host/--port` 䌘先级高于配眮文件。
- Web 管理界面`config.json` 新增 `admin_web` 段萜`enabled` 默讀 `false``password` 默讀 `123456`。匀启后访问 `http://<host>:<port>/admin`蟓入密码可查看 user_data 䞋文件树并预览文本/Markdown/CSV。

## 📖 䜿甚瀺䟋

### 🚀 Web 匀发完敎流皋

**步骀 1创建前端项目**
```
Tool: fs_write
Arguments: {
  "path": "/index.html",
  "content": "<!DOCTYPE html>..."
}
```

**步骀 2䞀键郚眲**
```
Tool: preview_frontend
Arguments: {
  "entry_file": "index.html"
}
```

**返回结果**
```json
{
  "success": true,
  "url": "https://user123_chat456.proxy.your-domain.com/index.html",
  "subdomain": "user123_chat456"
}
```

**步骀 3访问郚眲的应甚**
- 自劚获埗独立子域名
- 支持 HTTPS劂配眮
- 无需手劚配眮端口和域名

### 💻 代码执行䞎调试

### 读取文件支持行范囎

```
Tool: fs_read
Arguments: {
  "path": "/file.txt",
  "line_range": "100:150"  # 读取第100-150行
}
```

### 批量读取文件

```
Tool: fs_read
Arguments: {
  "path": ["/file1.txt", "/file2.json", "/data.xlsx"]
}
```

### 搜玢文件

```
Tool: fs_search
Arguments: {
  "search_type": "content",  # glob=按文件名, content=按内容
  "pattern": "function\\s+\\w+\\(",
  "context_lines": 2  # 返回匹配行前后2行䞊䞋文
}
```

### 粟确猖蟑文件

```
Tool: fs_replace
Arguments: {
  "path": "/config.py",
  "diff": "------- SEARCH\nDEBUG = True\n========\nDEBUG = False\n+++++++ REPLACE"
}
```

### 执行 Python 代码

```
Tool: exec
Arguments: {
  "code": "print('Hello, World!')"
}
```

### 执行 Python 文件

```
Tool: exec
Arguments: {
  "file": "/script.py",
  "args": ["--verbose", "input.txt"]
}
```

### 读取 Excel 文件

```
Tool: fs_read
Arguments: {
  "path": "/data.xlsx",
  "sheet": "Sheet1",      # 可选指定工䜜衚
  "range": "A1:D100"      # 可选指定读取范囎
}
```

### 创建 Excel 文件

```
Tool: fs_write
Arguments: {
  "path": "/output.xlsx",
  "content": [
    ["Name", "Age", "City"],
    ["Alice", 30, "Beijing"],
    ["Bob", 25, "Shanghai"]
  ]
}
```

### 猖蟑 Excel 文件

```
Tool: excel_edit
Arguments: {
  "path": "/data.xlsx",
  "edit_type": "cells",
  "sheet": "Sheet1",
  "updates": [
    {"cell": "A1", "value": "Updated Value"}
  ]
}
```

### 🎚 生成囟衚和流皋囟

```
Tool: generate_image
Arguments: {
  "mermaid_code": "flowchart TD\nA[匀始] --> B[倄理] --> C[结束]"
}
```

或䜿甚 HTML 枲染倍杂囟衚
```
Tool: generate_image
Arguments: {
  "html_code": "<html><body><h1>数据可视化</h1>...</body></html>"
}
```

## 🔐 安党最䜳实践

1. **生产环境郚眲**
   - 䜿甚反向代理Nginx倄理 HTTPS
   - 限制访问 IP 或䜿甚 API 密钥讀证
   - 讟眮合理的请求频率限制

2. **数据隔犻**
   - 确保 `X-User-ID` 和 `X-Chat-ID` 由可信来源生成
   - 定期枅理过期的䌚话工䜜目圕

3. **Admin API 保技**
   ```nginx
   location /admin/ {
       allow 10.0.0.0/8;
       deny all;
       proxy_pass http://localhost:8000;
   }
   ```

## ⚙ 环境变量

| 变量名 | 诎明 | 默讀倌 |
|--------|------|--------|
| `MCP_WORKSPACES_DIR` | 甚户工䜜空闎根目圕 | `项目目圕/user_data` |
| `MCP_ALLOWED_DIRS` | 允讞访问的目圕列衚党局暡匏 | 圓前工䜜目圕 |
| `FASTMCP_PORT` | 服务噚端口 | `8000` |

## 📄 讞可证

[Apache License 2.0](LICENSE)

## 🀝 莡献

欢迎提亀 Issue 和 Pull Request