MCP SubMatcher

MCP SubMatcher

An MCP server that automatically renames local subtitle files to match corresponding videos using statistical token matching and episode verification. It enables users to scan media directories, preview matches, and manage subtitle configurations through natural language commands.

Category
访问服务器

README

MCP SubMatcher

一个基于统计分词匹配算法的 MCP 服务器,能够自动将本地字幕文件重命名为与对应视频同名,解决压制组、分辨率等干扰信息导致的无法自动加载字幕的问题。


特性

  • 🎯 智能匹配算法:基于文件名分词和权重系统,自动匹配视频和字幕
  • 🌍 多语言支持:支持简英双语、繁英双语、简体中文、繁体中文、纯英文
  • 📊 格式识别:ASS格式优先于SRT格式
  • 🔧 压制组识别:识别相同的压制组给予额外加分
  • 🛡️ 安全机制:演习模式、确认机制、备份功能
  • ⚙️ 可配置性:完全可定制的权重和匹配规则
  • 🔌 MCP 协议:通过 MCP 协议与 Claude Desktop 等 AI 客户端集成
  • 📝 审计日志:自动记录所有配置变更

安装

环境要求

  • Python 3.10 或更高版本
  • uv - 快速 Python 包管理器
  • Claude Desktop 或其他 MCP 客户端

快速安装

1. 安装 UV(如果还未安装)

curl -LsSf https://astral.sh/uv/install.sh | sh  # macOS/Linux
# 或
brew install uv  # macOS

2. 配置 Claude Desktop(推荐方式)

直接在 Claude Desktop 配置文件中使用 uvx 从 GitHub 安装,无需克隆项目。

配置 MCP 客户端

Claude Desktop 配置

在 Claude Desktop 的配置文件中添加 MCP 服务器:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Windows: %APPDATA%\Claude\claude_desktop_config.json

添加以下配置:

{
  "mcpServers": {
    "submatcher": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/sienyaa/mcp-submatcher",
        "mcp-submatcher"
      ]
    }
  }
}

说明

  • uvx 会自动从 GitHub 下载并运行最新版本的 MCP SubMatcher
  • 无需手动克隆项目或安装依赖
  • 每次启动时会自动检查并使用最新版本

高级配置(可选)

如果需要使用特定版本或本地开发版本,可以使用以下配置:

{
  "mcpServers": {
    "submatcher": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/mcp-submatcher",
        "run",
        "mcp-submatcher"
      ]
    }
  }
}

说明

  • 适用于本地开发或需要使用特定版本的情况
  • 需要先克隆项目并运行 uv sync

重启 Claude Desktop

配置完成后,重启 Claude Desktop 以加载 MCP 服务器。

快速开始

配置完成后,你可以直接在 Claude Desktop 中与对话:

你:请扫描 /Users/username/Videos/TVShows 目录中的视频和字幕文件

Claude:[自动调用 scan_media_files 工具]
扫描完成,找到 5 个视频文件和 6 个字幕文件。

你:请预览这个目录中的字幕匹配结果

Claude:[自动调用 preview_matching 工具]
匹配结果预览:
1. Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.mkv
   - 匹配字幕: Breaking.Bad.S01E01.chs&eng.ass (评分: 280.0)
2. Breaking.Bad.S01E02.720p.WEB-DL.DDP5.1.H.264-NTb.mkv
   - 匹配字幕: Breaking.Bad.S01E02.cht&eng.srt (评分: 270.0)

你:看起来不错,请执行实际重命名

Claude:[自动调用 rename_subtitles 工具]
重命名完成:
- Breaking.Bad.S01E01.chs&eng.ass → Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.ass
- Breaking.Bad.S01E02.cht&eng.srt → Breaking.Bad.S01E02.720p.WEB-DL.DDP5.1.H.264-NTb.srt

就这么简单!无需手动运行任何命令,只需与 Claude 对话即可。

工具详解

MCP SubMatcher 提供以下 6 个工具:

1. scan_media_files

扫描指定目录中的视频和字幕文件。

参数

  • directory (string, 必需): 要扫描的目录路径

对话示例

你:请扫描 /Users/username/Videos/TVShows 目录中的视频和字幕文件

Claude:[调用 scan_media_files 工具]
扫描完成,找到 5 个视频文件和 6 个字幕文件。

输出示例

{
  "success": true,
  "directory": "/Users/username/Videos/TVShows",
  "video_files": [
    {
      "path": "/Users/username/Videos/TVShows/Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.mkv",
      "file_type": "video",
      "name": "Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.mkv",
      "stem": "Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS",
      "extension": ".mkv",
      "tokens": ["breaking", "bad", "s01e01", "1080p", "bluray", "x264", "sparks"],
      "season": 1,
      "episode": 1
    }
  ],
  "subtitle_files": [
    {
      "path": "/Users/username/Videos/TVShows/Breaking.Bad.S01E01.chs&eng.ass",
      "file_type": "subtitle",
      "name": "Breaking.Bad.S01E01.chs&eng.ass",
      "stem": "Breaking.Bad.S01E01.chs&eng",
      "extension": ".ass",
      "tokens": ["breaking", "bad", "s01e01", "chs&eng"],
      "season": 1,
      "episode": 1
    }
  ],
  "video_count": 5,
  "subtitle_count": 6
}

2. preview_matching

预览字幕匹配结果(演习模式,不会实际修改文件)。

参数

  • directory (string, 必需): 要分析的目录路径

对话示例

你:请预览 /Users/username/Videos/TVShows 目录中的字幕匹配结果

Claude:[调用 preview_matching 工具]
匹配结果预览:
1. Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.mkv
   - 匹配字幕: Breaking.Bad.S01E01.chs&eng.ass (评分: 280.0)
   - 语言权重: 120.0
   - 格式权重: 100.0
   - 血统加分: 0.0

输出示例

[
  {
    "video": {
      "path": "/Users/username/Videos/TVShows/Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.mkv",
      "file_type": "video",
      "name": "Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.mkv",
      "stem": "Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS",
      "extension": ".mkv",
      "tokens": ["breaking", "bad", "s01e01", "1080p", "bluray", "x264", "sparks"],
      "season": 1,
      "episode": 1
    },
    "subtitle": {
      "path": "/Users/username/Videos/TVShows/Breaking.Bad.S01E01.chs&eng.ass",
      "file_type": "subtitle",
      "name": "Breaking.Bad.S01E01.chs&eng.ass",
      "stem": "Breaking.Bad.S01E01.chs&eng",
      "extension": ".ass",
      "tokens": ["breaking", "bad", "s01e01", "chs&eng"],
      "season": 1,
      "episode": 1
    },
    "score": 280.0,
    "language_weight": 120.0,
    "format_weight": 100.0,
    "lineage_bonus": 0.0
  }
]

3. rename_subtitles

执行字幕重命名操作。

参数

  • directory (string, 必需): 要处理的目录路径
  • confirm (boolean, 可选): 是否确认执行实际重命名(默认为 false,仅演习模式)

对话示例

你:请重命名 /Users/username/Videos/TVShows 目录中的字幕文件

Claude:[调用 rename_subtitles 工具,confirm=false]
演习模式完成,将重命名 3 个字幕文件。

你:确认执行实际重命名

Claude:[调用 rename_subtitles 工具,confirm=true]
重命名完成:
- Breaking.Bad.S01E01.chs&eng.ass → Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.ass
- Breaking.Bad.S01E02.cht&eng.srt → Breaking.Bad.S01E02.720p.WEB-DL.DDP5.1.H.264-NTb.srt

输出示例

{
  "success": true,
  "directory": "/Users/username/Videos/TVShows",
  "dry_run": false,
  "renamed_count": 3,
  "failed_count": 0,
  "skipped_count": 0,
  "renamed_files": [
    {
      "old_name": "Breaking.Bad.S01E01.chs&eng.ass",
      "new_name": "Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.ass",
      "video_name": "Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.mkv",
      "score": 280.0
    }
  ],
  "failed_files": [],
  "skipped_files": []
}

4. get_config_value

获取配置文件中指定路径的值。

参数

  • path (string, 必需): 配置路径,支持点号路径和数组索引

对话示例

你:请获取配置中语言权重的第一个值

Claude:[调用 get_config_value 工具]
配置值:120

你:请获取配置中安全设置的 dry_run 值

Claude:[调用 get_config_value 工具]
配置值:false

输出示例

120

5. set_config_value

设置配置文件中指定路径的值。

参数

  • path (string, 必需): 配置路径,支持点号路径和数组索引
  • value (any, 必需): 要设置的值,可以是字符串、数字、布尔值等

对话示例

你:请将配置中安全设置的 dry_run 设置为 true

Claude:[调用 set_config_value 工具]
配置已更新:
- 配置路径: safety.dry_run
- 旧值: false
- 新值: true
- 备份文件: /path/to/.config_backups/config_backup_20260201_165517.yaml

你:请将语言权重中简英双语的权重设置为 150

Claude:[调用 set_config_value 工具]
配置已更新:
- 配置路径: language_weights[0].weight
- 旧值: 120
- 新值: 150

输出示例

{
  "success": true,
  "path": "safety.dry_run",
  "config_path": "/path/to/core/config.yaml",
  "backup_path": "/path/to/.config_backups/config_backup_20260201_165517.yaml",
  "old_value": false,
  "new_value": true,
  "error": null,
  "timestamp": "2026-02-01 16:55"
}

6. get_config_summary

获取当前配置摘要。

参数:无

对话示例

你:请获取当前配置摘要

Claude:[调用 get_config_summary 工具]
当前配置摘要:
- 语言权重: 5 种语言类型
- 格式权重: 2 种格式
- 压制组加分: 已启用
- 安全设置: dry_run=false, require_confirm=true

输出示例

{
  "language_weights": [
    {"name": "简英双语", "weight": 120, "keywords": ["chs&eng", "双语"]},
    {"name": "繁英双语", "weight": 90, "keywords": ["cht&eng", "繁英"]},
    {"name": "简体中文", "weight": 80, "keywords": ["chs", "sc", "简体"]},
    {"name": "繁体中文", "weight": 70, "keywords": ["cht", "tc", "繁体"]},
    {"name": "纯英文", "weight": 60, "keywords": ["eng", "en", "english"]}
  ],
  "format_weights": [
    {"name": "ass", "weight": 100, "description": "特效字幕格式"},
    {"name": "srt", "weight": 80, "description": "通用字幕格式"}
  ],
  "lineage_bonus": {
    "enabled": true,
    "weight": 20,
    "common_release_groups": ["eztv", "rarbg", "sparks"]
  },
  "safety": {
    "dry_run": false,
    "require_confirm": true,
    "backup_enabled": false,
    "backup_dir": ".backup"
  },
  "matching": {
    "min_common_tokens": 1,
    "min_score_threshold": 50,
    "skip_on_conflict": true,
    "log_unmatched": true
  }
}

配置管理

配置文件位置

配置文件位于 core/config.yaml

主要配置项

1. 语言权重配置

控制字幕语言的优先级,权重越高越优先。

language_weights:
  - name: "简英双语"
    weight: 120
    keywords:
      - "chs&eng"
      - "cht&eng"
      - "简体&英文"
      - "双语"
      - "中英"
      - "zh&en"

说明

  • weight: 语言权重值,越高越优先
  • keywords: 识别该语言的关键词列表(不区分大小写)

2. 格式权重配置

控制字幕格式的优先级。

format_weights:
  - name: "ass"
    weight: 100
    description: "特效字幕格式,支持样式和特效"
  - name: "srt"
    weight: 80
    description: "通用字幕格式"

3. 血统匹配加分

如果字幕文件名包含与视频相同的压制组标识,给予额外加分。

lineage_bonus:
  enabled: true
  weight: 20
  description: "如果字幕文件名包含与视频相同的压制组标识,给予额外加分"
  common_release_groups:
    - "eztv"
    - "rarbg"
    - "vxt"
    - "yify"
    - "sparks"

4. 文件扩展名配置

定义支持的视频和字幕格式。

file_extensions:
  video:
    - ".mp4"
    - ".mkv"
    - ".avi"
  subtitle:
    - ".ass"
    - ".srt"

5. 分词配置

控制文件名分词的行为。

tokenization:
  separators:
    - "."
    - "_"
    - "-"
    - "["
    - "]"
    - "("
    - ")"
    - " "
  min_token_length: 2
  ignore_tokens:
    - "the"
    - "a"
    - "an"
    - "of"
    - "in"
    - "on"

6. 集数提取配置

定义识别季号和集号的正则表达式模式。

episode_patterns:
  - pattern: "S(\\d{1,2})E(\\d{1,2})"
    season_group: 1
    episode_group: 2
  - pattern: "(\\d{1,2})x(\\d{1,2})"
    season_group: 1
    episode_group: 2

7. 安全配置

控制程序的安全行为。

safety:
  dry_run: false
  require_confirm: true
  backup_enabled: false
  backup_dir: ".backup"

动态配置

通过 MCP 工具可以动态修改配置:

用户:请将配置中安全设置的 dry_run 设置为 true

Claude:[调用 set_config_value 工具]
配置已更新:safety.dry_run = true

安全功能

1. 演习模式 (Dry Run)

在演习模式下,工具只显示将要执行的操作,不实际修改文件。

启用演习模式

你:请将配置中安全设置的 dry_run 设置为 true

Claude:[调用 set_config_value 工具]
配置已更新:safety.dry_run = true

使用演习模式

你:请预览 /Users/username/Videos/TVShows 目录中的字幕匹配结果

Claude:[调用 preview_matching 工具]
演习模式完成,将重命名 3 个字幕文件(不会实际修改文件)。

2. 确认机制

要求用户确认后才执行重命名操作。

配置确认机制

你:请启用确认机制

Claude:[调用 set_config_value 工具,path="safety.require_confirm", value=true]
配置已更新:safety.require_confirm = true

禁用确认机制(自动执行)

你:请禁用确认机制

Claude:[调用 set_config_value 工具,path="safety.require_confirm", value=false]
配置已更新:safety.require_confirm = false

3. 备份功能

在执行重命名前备份原始文件。

启用备份功能

你:请启用备份功能

Claude:[调用 set_config_value 工具,path="safety.backup_enabled", value=true]
配置已更新:safety.backup_enabled = true

设置备份目录

你:请将备份目录设置为 subtitle_backups

Claude:[调用 set_config_value 工具,path="safety.backup_dir", value="subtitle_backups"]
配置已更新:safety.backup_dir = subtitle_backups

备份文件结构

当前目录/
├── .backup/  # 或自定义备份目录
│   ├── Breaking.Bad.S01E01.chs&eng.ass
│   ├── Breaking.Bad.S01E02.cht&eng.srt
│   └── Breaking.Bad.S01E03.chs&eng.ass
└── ... # 其他文件

4. 配置文件自动备份

每次修改配置时自动备份配置文件。

备份位置

.config_backups/
├── config_backup_20260201_165517.yaml
├── config_backup_20260201_165520.yaml
└── config_backup_20260201_165525.yaml

审计日志: 所有配置变更都会记录到 SYSTEM_MOD_LOG.md 文件中,包括:

  • 时间戳
  • 配置路径
  • 旧值和新值
  • 环境信息

工作原理

1. 文件扫描

程序递归扫描指定目录,识别所有视频文件和字幕文件。

2. 分词处理

使用配置的分隔符将文件名切碎为单词元(Tokens)。

示例

Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.mkv
↓ 分词后
['breaking', 'bad', 's01e01', '1080p', 'bluray', 'x264', 'sparks']

3. 聚类分析

统计所有文件中每个Token出现的频率,识别"全局Token"(高频词)。

目的:区分文件夹内混杂的多部不同美剧。

4. 集数提取

从文件名中提取季号和集号,支持多种格式:

  • S01E01 → Season 1, Episode 1
  • 1x01 → Season 1, Episode 1
  • 101 → Season 1, Episode 01

5. 匹配算法

基于"全局Token"和"集数锚点"双重验证建立对应关系。

匹配条件

  • 存在共同的全局Token
  • 季号和集号匹配(或至少集号匹配)

6. 评分系统

当一个视频对应多个候选字幕时,按以下权重自动筛选最优解:

评分公式

总分 = 基础分 + 语言权重 + 格式权重 + 血统加分

权重说明

  1. 基础分:基于共同Token和集数匹配

  2. 语言权重(最高优先级):

    • 简英双语:120分
    • 繁英双语:90分
    • 简体中文:80分
    • 繁体中文:70分
    • 纯英文:60分
  3. 格式权重

    • .ass:100分(支持特效)
    • .srt:80分(通用格式)
  4. 血统加分

    • 如果字幕和视频有相同的压制组标识:+20分

故障排除

常见问题

1. 没有找到匹配

问题:工具没有找到任何匹配的字幕文件。

可能原因

  • 字幕文件名与视频文件名差异太大
  • 匹配分数低于阈值(默认50分)
  • 文件编码问题

解决方案

你:请降低匹配阈值

Claude:[调用 set_config_value 工具,path="matching.min_score_threshold", value=30]
配置已更新:matching.min_score_threshold = 30

你:请检查文件编码
Claude:建议确保文件名使用 UTF-8 编码

2. 匹配错误

问题:工具匹配了错误的字幕文件。

可能原因

  • 多个剧集有相似的命名
  • 权重设置不合理

解决方案

你:请提高匹配精度

Claude:[调用 set_config_value 工具,path="matching.min_common_tokens", value=2]
配置已更新:matching.min_common_tokens = 2

你:请调整语言权重

Claude:[调用 set_config_value 工具,path="language_weights[0].weight", value=200]
配置已更新:language_weights[0].weight = 200

3. 权限问题

问题:无法重命名文件。

可能原因

  • 文件只读权限
  • 目录权限不足

解决方案

# 检查文件权限
ls -la 文件名

# 修改权限
chmod +w 文件名

调试模式

启用详细日志

你:请记录未匹配的文件

Claude:[调用 set_config_value 工具,path="matching.log_unmatched", value=true]
配置已更新:matching.log_unmatched = true

你:请在冲突时跳过

Claude:[调用 set_config_value 工具,path="matching.skip_on_conflict", value=true]
配置已更新:matching.skip_on_conflict = true

检查匹配分数

你:请获取详细的匹配分析

Claude:[调用 preview_matching 工具]
匹配结果预览:
1. Breaking.Bad.S01E01.1080p.BluRay.x264-SPARKS.mkv
   - 匹配字幕: Breaking.Bad.S01E01.chs&eng.ass (评分: 280.0)
   - 语言权重: 120.0
   - 格式权重: 100.0
   - 血统加分: 0.0

最佳实践

1. 新用户建议

你:请帮我设置新用户环境

Claude:[执行以下步骤]
1. 先启用演习模式
   [调用 set_config_value 工具,path="safety.dry_run", value=true]

2. 预览匹配结果
   [调用 preview_matching 工具]

3. 确认无误后关闭演习模式
   [调用 set_config_value 工具,path="safety.dry_run", value=false]

4. 执行重命名
   [调用 rename_subtitles 工具,confirm=true]

2. 批量处理建议

你:请帮我批量处理多个目录

Claude:[执行以下步骤]
1. 启用备份功能
   [调用 set_config_value 工具,path="safety.backup_enabled", value=true]

2. 设置合理的备份目录
   [调用 set_config_value 工具,path="safety.backup_dir", value="字幕备份_$(date +%Y%m%d)"]

3. 逐个处理目录
   - 扫描目录
   - 预览匹配
   - 执行重命名

3. 性能优化

  • 避免在根目录运行,指定具体目录
  • 定期清理备份文件
  • 对于大量文件,分批处理

附录

A. 默认配置值

语言权重

语言类型 权重 关键词
简英双语 120 chs&eng, cht&eng, 简体&英文, 双语, 中英, zh&en
繁英双语 90 cht&eng, 繁体&英文, 繁英
简体中文 80 chs, sc, 简体, 简中, zh
繁体中文 70 cht, tc, 繁体, 繁中
纯英文 60 eng, en, english

格式权重

格式 权重 描述
ASS 100 特效字幕格式,支持样式和特效
SRT 80 通用字幕格式

压制组加分

  • 启用: true
  • 权重: 20
  • 常见压制组: eztv, rarbg, vxt, yify, yts, sparks, fgt, mgb, dimension, deflate, x264, x265, h264, h265, 1080p, 720p, 2160p, 4k, web-dl, webrip, bluray, bdrip, dvdrip

安全设置

  • dry_run: false
  • require_confirm: true
  • backup_enabled: false
  • backup_dir: ".backup"

匹配设置

  • min_common_tokens: 1
  • min_score_threshold: 50
  • skip_on_conflict: true
  • log_unmatched: true

B. 支持的视频格式

  • .mkv
  • .mp4
  • .avi
  • .mov
  • .wmv
  • .flv
  • .webm

C. 支持的字幕格式

  • .ass
  • .srt
  • .sub
  • .ssa

D. 文件名匹配规则

  1. 分词处理:将文件名按分隔符(. _ - 空格)分割成单词
  2. 剧集识别:识别 S01E01、S01E02 等剧集格式
  3. 质量识别:识别 1080p、720p、4K 等质量标识
  4. 编码识别:识别 x264、x265、H.264、H.265 等编码格式
  5. 压制组识别:识别 HiQVE、YIFY、RARBG 等压制组

E. 评分算法

总分 = 基础分 + 语言权重 + 格式权重 + 压制组加分

示例:
简英双语ASS字幕 + 相同压制组
= 120(语言) + 100(格式) + 20(压制组)
= 240分

常见问题

Q1: 如何在 Claude Desktop 中使用 MCP SubMatcher?

  1. 确保已安装 uv
  2. 在 Claude Desktop 配置文件中添加 MCP 服务器配置(见上方"配置 MCP 客户端"章节)
  3. 重启 Claude Desktop
  4. 直接与 Claude 对话,例如:"请扫描 /path/to/videos 目录中的视频和字幕文件"

Q2: 使用 uvx 安装有什么优势?

使用 uvx --from git+https://github.com/sienyaa/mcp-submatcher 的优势:

  • 无需克隆项目:直接从 GitHub 下载运行
  • 自动更新:每次启动时自动使用最新版本
  • 零依赖管理:uvx 会自动处理所有依赖
  • 沙盒化:每个运行实例都是独立的,不会污染系统环境
  • 快速启动:uvx 使用缓存机制,第二次启动更快

Q3: 为什么有些字幕没有匹配成功?

可能原因

  1. 字幕文件名中缺少集号信息(如 S01E01
  2. 字幕和视频的集号不匹配
  3. 存在多个相同评分的候选字幕(冲突)
  4. 字幕文件名与视频文件名没有共同的全局Token

解决方法

  • 使用 preview_matching 工具查看详细匹配结果
  • 检查字幕文件名是否包含正确的集号
  • 手动调整字幕文件名,添加集号信息

Q4: 如何调整语言优先级?

通过 MCP 工具动态修改配置:

用户:请获取当前配置摘要
Claude:[调用 get_config_summary 工具]

用户:请将语言权重中简英双语的权重设置为 150
Claude:[调用 set_config_value 工具]

Q5: 程序会修改视频文件吗?

不会。程序只会重命名字幕文件,不会修改或删除视频文件。

Q6: 如何撤销重命名操作?

目前程序不支持自动撤销。建议:

  1. 首次使用时先使用 preview_matching 工具预览结果
  2. 确认结果无误后再使用 rename_subtitles 工具执行重命名
  3. 可以手动备份字幕文件

Q7: 支持哪些视频和字幕格式?

默认支持:

  • 视频.mkv, .mp4, .avi, .mov, .wmv, .flv, .webm
  • 字幕.ass, .srt, .sub, .ssa

可以通过 MCP 工具动态添加更多格式。

Q8: 程序能处理多个剧集混合的目录吗?

可以。程序通过聚类分析自动识别不同的剧集,即使多个剧集混合在同一目录也能正确匹配。

Q9: 如何使用特定版本或本地开发版本?

如果需要使用特定版本或本地开发版本,可以在 Claude Desktop 配置文件中使用 uv --directory 方式:

{
  "mcpServers": {
    "submatcher": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/mcp-submatcher",
        "run",
        "mcp-submatcher"
      ]
    }
  }
}

适用场景

  • 本地开发和测试
  • 需要使用特定版本
  • 需要修改代码并立即测试

注意:使用此方式前需要先克隆项目并运行 uv sync

技术架构

核心模块

  • mcp_server.py: MCP 服务器入口,定义工具和调用逻辑
  • mcp_adapter.py: SubMatcher 的 MCP 适配器,提供 MCP 友好的接口
  • config_nlp.py: 配置文件的 MCP 包装器,支持动态配置
  • core/submatcher.py: 核心匹配算法实现
  • core/config.yaml: 默认配置文件

技术栈

  • 语言: Python 3.10+
  • MCP 协议: Model Context Protocol
  • 核心库: pathlib, re, collections.Counter
  • 配置管理: PyYAML
  • 包管理: uv

性能特点

  • 轻量级: 仅使用标准库和少量依赖
  • 高效: 基于统计和正则表达式,处理速度快
  • 安全: 默认演习模式,防止误操作
  • 灵活: 完全可配置,适应不同需求

开发

本地开发

如果需要本地开发或修改代码,可以克隆项目:

git clone https://github.com/sienyaa/mcp-submatcher.git
cd mcp-submatcher
uv sync

然后在 Claude Desktop 配置文件中使用本地版本:

{
  "mcpServers": {
    "submatcher": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/mcp-submatcher",
        "run",
        "mcp-submatcher"
      ]
    }
  }
}

运行测试

uv run pytest

代码格式化

uv run black .

类型检查

uv run mypy .

贡献

欢迎提交问题报告和改进建议!

许可证

MIT License

更新日志

v1.0.0 (2026-02-01)

  • ✨ 初始版本发布
  • ✅ 实现所有核心功能
  • ✅ 支持 MCP 协议
  • ✅ 完善的安全机制
  • ✅ 详细的文档

相关链接


享受 AI 辅助的自动化字幕管理体验! 🎬🤖📝

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选