Skip to main content
Glama
elimyliu

timeverse-omni-converter-mcp

by elimyliu
README.md
# Format Converter MCP

![License](https://img.shields.io/badge/license-MIT-blue)
![Version](https://img.shields.io/badge/version-1.0.0-brightgreen)
![Node.js](https://img.shields.io/badge/node-%3E%3D18-green)
![TypeScript](https://img.shields.io/badge/TypeScript-5.7-3178c6)
![MCP](https://img.shields.io/badge/MCP-compatible-orange)

> 通用格式转换 MCP Server

一个覆盖音频、视频、图片、Office、数据、电子书、PDF、字幕等全格式转换的 [Model Context Protocol (MCP)](https://modelcontextprotocol.io) 服务器,可被 TimeVerse Studio、Claude Desktop、Cursor、VS Code 等任意 MCP 客户端调用。

[English](./README.en.md)

***

## ✨ 特性

| 特性        | 说明                                                              |
| --------- | --------------------------------------------------------------- |
| 🎯 格式覆盖广  | 9 大格式域、71 种去重格式,另含字幕、PDF 操作等特殊能力                                |
| 🧩 14 个工具 | 10 个核心转换工具 + 4 个辅助工具,按格式域精准分类,LLM 易于选择                          |
| 🧠 智能路由   | 自动选择最优转换路径(直转 / 多步链式),依赖不可用时自动降级                                |
| 🔧 6 大引擎  | FFmpeg / ImageMagick / LibreOffice / Pandoc / Python / PDF 统一封装 |
| ⚡ 零配置     | 启动时自检测系统依赖,缺失时提示或降级                                             |
| 🛡️ 生产可用  | 分级错误处理、资源上限防护、临时文件 TTL 清理                                       |

***

## 📦 支持的格式

| 格式域    | 工具                     | 引擎                                  | 格式数   | 示例                                                                            |
| ------ | ---------------------- | ----------------------------------- | ----- | ----------------------------------------------------------------------------- |
| 音频     | `convert_media`        | FFmpeg                              | 12    | MP3, WAV, FLAC, AAC, OGG, M4A, WMA, AIFF, OPUS, AC3, AMR, MKA                 |
| 视频     | `convert_media`        | FFmpeg                              | 14    | MP4, AVI, MKV, MOV, WebM, FLV, WMV, M4V, MPEG, 3GP, TS, GIF, VOB, RMVB        |
| 图片     | `convert_image`        | ImageMagick / Pillow                | 16    | JPEG, PNG, GIF, BMP, TIFF, WebP, SVG, HEIC, ICO, PSD, RAW, AVIF, EXR          |
| 文档     | `convert_document`     | LibreOffice / Pandoc / pdf2docx     | 10    | DOCX, DOC, PDF, RTF, ODT, TXT, PAGES\*, WPS\*, HTML, MD                       |
| 演示     | `convert_presentation` | LibreOffice                         | 6     | PPTX, PPT, ODP, PDF, KEY\*, HTML                                              |
| 表格     | `convert_spreadsheet`  | openpyxl / pandas / LibreOffice     | 8     | XLSX, XLS, ODS, CSV, TSV, NUMBERS\*, FODS, HTML                               |
| 标记     | `convert_markup`       | Pandoc                              | 12    | Markdown, HTML, RST, AsciiDoc, LaTeX, Org, MediaWiki, EPUB, Typst, TXT, IPYNB |
| 数据     | `convert_data`         | Python (PyYAML/tomlkit/pandas/lxml) | 8     | JSON, YAML, XML, TOML, CSV, TSV, Parquet, Protobuf                            |
| 电子书    | `convert_ebook`        | Pandoc / Calibre                    | 5     | EPUB, MOBI, AZW3, FB2, PDF                                                    |
| 字幕     | `convert_subtitle`     | pysubs2                             | 3     | SRT, ASS/SSA, VTT                                                             |
| PDF 操作 | `convert_pdf`          | PyMuPDF / pypdf                     | 9 种操作 | merge, split, compress, extract, watermark, rotate, to\_images                |

> `*` 标记为受限格式(PAGES / WPS / NUMBERS / KEY),需 macOS 原生应用或 iCloud 导出。

> 合计去重后约 **71 种格式**,覆盖行业 95%+ 的常见转换需求。

***

## ⚠️ 已知限制

- **受限格式**:`PAGES` / `WPS` / `NUMBERS` / `KEY` 需 macOS 原生应用或 iCloud 导出,其它平台通常无法直接转换。
- **HEIC/HEIF 解码**:依赖 ImageMagick 的 libheif 支持;缺失时无法解码 Apple 高效图片。
- **引擎缺省降级**:若未安装 LaTeX,Markdown→PDF 会降级为 weasyprint;若未安装 Calibre,MOBI/AZW3 电子书不可用;若未安装 ImageMagick,图片转换回退到 Python Pillow(能力更有限)。
- **Protocol Buffers**:转换为 PB 需要额外的 `.proto` 定义文件。
- **Parquet / Protobuf**:对应的 Python 依赖(`pyarrow`、`protobuf`)为可选,需手动安装。

***

## 🧰 工具列表

### 核心转换工具(10 个)

| 工具                     | 说明                                           |
| ---------------------- | -------------------------------------------- |
| `convert_media`        | 音频/视频互转,提取音频、截取片段、嵌入字幕                       |
| `convert_image`        | 图片互转,缩放、优化、矢量↔栅格、DPI 控制                      |
| `convert_document`     | Word/PDF/RTF/TXT/HTML/MD 高保真转换,OCR、表格提取      |
| `convert_presentation` | PPT/ODP/PDF/HTML/PNG(幻灯片图片)转换                |
| `convert_spreadsheet`  | Excel/CSV/TSV/JSON/HTML 转换,保留公式与多工作表         |
| `convert_markup`       | Markdown/HTML/LaTeX/EPUB 等标记文本转换,目录/高亮/公式    |
| `convert_data`         | JSON/YAML/XML/TOML/CSV/Parquet/Protobuf 数据转换 |
| `convert_ebook`        | EPUB/MOBI/AZW3/FB2/PDF 电子书转换,封面/元数据          |
| `convert_pdf`          | PDF 合并/拆分/压缩/提取/水印/旋转/转图片                    |
| `convert_subtitle`     | SRT/ASS/VTT 字幕互转,时间偏移、编码转换                   |

### 辅助工具(4 个)

| 工具                      | 说明                        |
| ----------------------- | ------------------------- |
| `get_supported_formats` | 查询支持的格式、转换路径与可用引擎         |
| `get_file_info`         | 探测文件元信息(格式、编码、分辨率、时长、页数等) |
| `batch_convert`         | 批量转换,支持 Glob 匹配与并行执行      |
| `check_dependencies`    | 检查所有引擎与系统依赖的可用性与版本        |

所有转换工具统一遵循 `input_path` + `output_format` + `options` 参数范式。

***

## 🏗️ 架构

```
┌─────────────────────────────────────────────────────┐
│              MCP Client (LLM)                        │
│        Claude / Cursor / VS Code / ...               │
└──────────────────────┬──────────────────────────────┘
                       │ JSON-RPC (stdio)
┌──────────────────────┴──────────────────────────────┐
│           MCP Protocol Layer                         │
│      tool list · tool call · notifications           │
├──────────────────────────────────────────────────────┤
│           Tool Router Layer                          │
│    请求解析 → 格式识别 → 路由分发 → 结果封装           │
├───────────┬───────────┬──────────┬───────────────────┤
│  Format   │ Conversion│  File    │  Dependency       │
│  Registry │  Planner  │ Manager  │  Checker          │
├───────────┴───────────┴──────────┴───────────────────┤
│           Conversion Engine Layer                    │
│  FFmpeg · ImageMagick · LibreOffice · Pandoc         │
│  Python · PDF                                         │
└──────────────────────────────────────────────────────┘
```

智能路径规划示例:

| 源 → 目标      | 路径                                       |
| ----------- | ---------------------------------------- |
| PDF → XLSX  | PDF → CSV (pdfplumber) → XLSX (openpyxl) |
| PDF → DOCX  | PDF → DOCX (pdf2docx)                    |
| XLSX → JSON | XLSX → DataFrame (pandas) → JSON         |
| PPTX → MD   | PPTX → HTML (LibreOffice) → MD (Pandoc)  |
| DOCX → EPUB | DOCX → HTML (Pandoc) → EPUB (Pandoc)     |

***

## ⚙️ 技术栈

- **主语言**:TypeScript (Node.js ≥ 18)
- **协议**:`@modelcontextprotocol/sdk`
- **转换引擎**:FFmpeg / ImageMagick / LibreOffice / Pandoc / Python (venv 隔离) / PyMuPDF

### 系统依赖

| 依赖          | 版本     | 用途            | 安装                                                                                    |
| ----------- | ------ | ------------- | ------------------------------------------------------------------------------------- |
| Node.js     | ≥ 18   | 运行 MCP Server | [nodejs.org](https://nodejs.org)                                                      |
| FFmpeg      | ≥ 6.0  | 音视频/字幕转换      | `winget install ffmpeg` / `brew install ffmpeg` / `apt install ffmpeg`                |
| ImageMagick | ≥ 7.0  | 图片转换          | `winget install ImageMagick` / `brew install imagemagick` / `apt install imagemagick` |
| LibreOffice | ≥ 7.5  | Office 文档保真转换 | [libreoffice.org](https://www.libreoffice.org)                                        |
| Pandoc      | ≥ 3.0  | 标记/文档/电子书转换   | `winget install pandoc` / `brew install pandoc` / `apt install pandoc`                |
| Python      | ≥ 3.10 | 数据/PDF/表格/字幕  | [python.org](https://python.org)                                                      |

> LaTeX(可选,Markdown→PDF 高质量)与 Calibre(可选,MOBI/AZW3)可缺省,系统会自动降级。

### Python 依赖

```bash
pip install -r python/requirements.txt
```

核心依赖:`openpyxl`、`pandas`、`PyYAML`、`tomlkit`、`xmltodict`、`PyMuPDF`、`pypdf`、`pdf2docx`、`pysubs2`、`Pillow`(`pyarrow`、`protobuf` 为可选)。

***

## 🚀 安装

先安装系统依赖(FFmpeg / ImageMagick / LibreOffice / Pandoc):

- **Windows**:`npm run prepare-deps`(一键下载便携版)
- **macOS**:`brew install ffmpeg imagemagick pandoc && brew install --cask libreoffice`
- **Linux**:`apt install ffmpeg imagemagick libreoffice pandoc`

然后构建并安装 Python 依赖:

```bash
# 1. 安装 Node 依赖
npm install

# 2. 构建(生成 dist/)
npm run build

# 3. 安装 Python 依赖(建议使用虚拟环境)
python3 -m venv .venv        # macOS/Linux;Windows 使用 python
source .venv/bin/activate    # macOS/Linux;Windows 使用 .venv\Scripts\activate
pip install -r python/requirements.txt
```

***

## 🔌 MCP 配置

在 MCP 客户端的 `mcpServers` 配置中添加以下服务器即可。

### TimeVerse Studio(推荐 · npm 托管)

TimeVerse Studio 使用标准 `mcpServers` JSON 接入。发布到 npm 后,直接通过 `npx` 一键运行,无需本地构建:

```json
{
  "mcpServers": {
    "timeverse-omni-converter-mcp": {
      "command": "npx",
      "args": ["-y", "timeverse-omni-converter-mcp"],
      "env": {
        "FC_PYTHON_PATH": "python",
        "FC_TEMP_DIR": "C:/temp/format-converter",
        "FC_MAX_FILE_SIZE": "524288000",
        "FC_TIMEOUT": "300000"
      }
    }
  }
}
```

### Claude Desktop / Cursor(本地构建)

本地构建后,通过 `node` 直接运行:

```json
{
  "mcpServers": {
    "timeverse-omni-converter-mcp": {
      "command": "node",
      "args": ["C:/path/to/timeverse-omni-converter-mcp/dist/index.js"],
      "env": {
        "FC_PYTHON_PATH": "python",
        "FC_TEMP_DIR": "C:/temp/format-converter",
        "FC_MAX_FILE_SIZE": "524288000",
        "FC_TIMEOUT": "300000"
      }
    }
  }
}
```

> macOS:将 `args` 改为 `/Users/<you>/timeverse-omni-converter-mcp/dist/index.js`,并将 `FC_PYTHON_PATH` 改为 `python3`(或删除该项,让其自动检测 `.venv`/`python3`)。

***

## 🔧 环境变量

| 变量                         | 默认值                 | 说明                   |
| -------------------------- | ------------------- | -------------------- |
| `FC_PYTHON_PATH`           | `python`            | Python 解释器路径         |
| `FC_FFMPEG_PATH`           | `ffmpeg`            | FFmpeg 可执行文件路径       |
| `FC_FFPROBE_PATH`          | `ffprobe`           | ffprobe 可执行文件路径      |
| `FC_IMAGEMAGICK_PATH`      | `magick`            | ImageMagick 可执行文件路径  |
| `FC_LIBREOFFICE_PATH`      | `soffice`           | LibreOffice 可执行文件路径  |
| `FC_PANDOC_PATH`           | `pandoc`            | Pandoc 可执行文件路径       |
| `FC_CALIBRE_PATH`          | `ebook-convert`     | Calibre 电子书转换器路径     |
| `FC_TEMP_DIR`              | 系统临时目录              | 临时文件目录               |
| `FC_MAX_FILE_SIZE`         | `524288000` (500MB) | 最大输入文件大小             |
| `FC_MAX_EXTRACTED_SIZE`    | `1073741824` (1GB)  | 解压后总大小上限(防 zip bomb) |
| `FC_MAX_COMPRESSION_RATIO` | `100`               | 最大压缩比                |
| `FC_MAX_PIXELS`            | `100000000`         | 图片解压像素上限(防解压炸弹)      |
| `FC_TIMEOUT`               | `300000` (5min)     | 单次转换超时               |
| `FC_PARALLEL`              | `1`                 | 默认并行数                |
| `FC_LOG_LEVEL`             | `info`              | 日志级别                 |

***

## 💬 使用示例

向 MCP 客户端中的 LLM 发出自然语言指令,例如:

- 「把 `a.mov` 转成 `a.mp4`,分辨率 1920x1080」→ `convert_media`
- 「把 `photo.heic` 转成 `photo.png`」→ `convert_image`
- 「把 `report.docx` 转成 `report.pdf`」→ `convert_document`
- 「把 `data.json` 转成 `data.csv`」→ `convert_data`
- 「把 `slides.pptx` 每一页导出成 PNG」→ `convert_presentation`
- 「把 `book.epub` 转成 `book.mobi`」→ `convert_ebook`
- 「合并 `a.pdf` 和 `b.pdf`」→ `convert_pdf`(`operation: "merge"`)
- 「把 `subs.ass` 转成 `subs.srt`」→ `convert_subtitle`

工具调用示例:

```json
{
  "name": "convert_media",
  "arguments": {
    "input_path": "C:/media/input.mov",
    "output_format": "mp4",
    "options": {
      "video_codec": "libx264",
      "video_resolution": "1920x1080",
      "crf": 23
    }
  }
}
```

返回结果:

```json
{
  "success": true,
  "outputPath": "C:/media/input.mp4",
  "outputSize": 10485760,
  "duration": 3215,
  "warnings": []
}
```

***

## ❓ 常见问题

**Q: 转换提示依赖缺失或失败怎么办?**
A: 调用 `check_dependencies` 工具查看各引擎(FFmpeg / ImageMagick / LibreOffice / Pandoc / Python)的可用状态与版本,安装缺失的依赖后重试。

**Q: Python 相关转换(数据 / PDF / 表格 / 字幕)报错?**
A: 确认已通过 `pip install -r python/requirements.txt` 安装依赖,并通过 `FC_PYTHON_PATH` 指向正确的 Python 解释器(或已激活虚拟环境)。

**Q: 目标文件已存在会发生什么?**
A: 默认自动重命名为 `文件名_1.扩展名`;批量转换时可通过 `on_conflict` 参数控制 `overwrite` / `skip` / `rename`。

**Q: 为什么某些格式(如 PAGES / NUMBERS)无法转换?**
A: 这些是 Apple 专有格式,需 macOS 原生应用或 iCloud 导出,属于受限格式,详见「已知限制」。

**Q: 大文件转换超时怎么办?**
A: 调大 `FC_TIMEOUT`(默认 300000ms),并注意 `FC_MAX_FILE_SIZE`(默认 500MB)上限。

***

## 🛡️ 安全

Server 处理不可信文件内容,内置多项资源与安全防护:

- 输入文件大小、解压后体积、压缩比、图片像素上限(防 zip bomb / 解压炸弹)
- 单次转换超时与并发上限
- 解析器禁用 XXE(外部实体注入)、PDF 嵌入脚本、外部资源加载
- 外部进程统一使用参数数组调用(`execFile`),避免命令注入

***

## 📄 License

MIT

TDQS

A3.6/5.0

Scored across 14 tools

Disambiguation5/5

每个转换工具针对特定媒体类型(媒体、图像、文档、演示、电子表格、标记、数据、电子书、PDF、字幕),用途明确不重叠。辅助工具如获取支持格式、文件信息、批量转换和依赖检查与转换工具区分明显。

Naming Consistency5/5

所有工具名称均采用一致的动词_名词模式(如convert_media、get_file_info、batch_convert),全部使用小写蛇形命名法,风格统一,易于预测和选择。

Tool Count5/5

14个工具覆盖了广泛的转换领域,每个工具都针对特定的格式类别或辅助功能,数量适中,没有冗余或明显不足,与服务器目的匹配。

Completeness5/5

工具集覆盖了媒体、图像、文档、演示、电子表格、标记、数据、电子书、PDF和字幕等多种格式转换,并包含格式查询、文件信息、批量转换和依赖检查等辅助功能,看似完整无重大缺失。

Maintenance

ActivityMaintained
ResponsivenessNo issues