Skip to main content
Glama
marouabah

tracking

by marouabah

MCP Tracking

带终端仪表盘(dashboard)的实时追踪 MCP 服务器。 让 Claude/Lyra 可以追踪任意长时间运行的操作,并自动从 media-server(qBittorrent、Bazarr、DV 转换)填充会话。


目录


Related MCP server: Claude Session MCP

架构

MCP/tracking/
  server.py              -- Serveur MCP (outils Claude/Lyra) + point d'entree --ui / --test
  api.py                 -- API HTTP locale (127.0.0.1:8765) pour les scripts externes
  mutations.py           -- Mutations d'une session, partagees par api.py ET server.py
                            (horodatage items, historique, niveaux de log, auto-completion)
  metrics.py             -- Metriques derivees (vitesse, ETA, ecoule, stale) -- logique pure,
                            calculees a la lecture, jamais stockees
  storage.py             -- Persistence JSON atomique + verrou fichier + cache mtime + purge TTL
  models.py              -- Modeles pydantic (TrackingSession, TrackingItem, LogEntry, ProgressPoint)
  templates.py           -- Templates builtin + templates utilisateur (JSON)
  ui.py                  -- Dashboard Textual (TUI temps reel) + modales stop/kill
  sim.py                 -- Simulations de demo (server.py --test)
  poller.py              -- Daemon polling qBittorrent (10s) + Bazarr (60s)
  tracking-api.service   -- Unite systemd (systeme) pour api.py
  tracking-poller.service -- Unite systemd (systeme) pour poller.py
  install.sh / deploy.sh -- Installation initiale / redeploiement des services
  Makefile               -- make test | smoke | deploy | ui
  tests/                 -- unitaires (storage, metrics) + integration/ (API HTTP reelle)

状态文件与配置

文件

位置

覆盖变量

tracking_state.json

~/.local/state/tracking/

TRACKING_STATE_DIR

poller_state.json

~/.local/state/tracking/

TRACKING_STATE_DIR

templates.json(用户模板,可选)

~/.config/tracking/

TRACKING_TEMPLATES_FILE

credentials/*.cred(qBittorrent、Bazarr)

位于代码旁边,gitignore

--

代码旁边的旧版 tracking_state.json 会在首次启动时自动迁移(复制,绝不删除)。

保留相关的环境变量:

变量

默认值

作用

TRACKING_TTL_DAYS

7

清理 done / error / paused 状态的会话

TRACKING_TTL_RUNNING_H

24

清理孤立的 running 会话(不再更新)

完整数据流

Claude/Lyra (outils MCP)
      |
      v
  server.py ─────────────────────────────────────────┐
                                                      |
qBittorrent API (poll 10s)                            |
      |                                               |
Bazarr API (poll 60s)    ──> poller.py ──> api.py ──> mutations.py ──> storage.py ──> ~/.local/state/tracking/tracking_state.json
      |                                               |                        |
dv_webhook_server.py                                  |                        v
      |                                               |                     ui.py
      v                                               |               (rafraichit chaque seconde)
dv_convert.py ──────────────────────────────────────>
   (metriques temps reel ffmpeg/dovi_tool)

状态文件在每次修改时通过原子写入(os.replace)并在文件锁(tracking_state.lock)下写入。所有进程(MCP、API、poller、dashboard)共享这一唯一文件;每次读取都会检查 mtime 以使缓存失效。

所有变更(HTTP 或 MCP)都通过 mutations.py 处理,确保两条路径上的行为一致:在 items 和 session 上设置 started_at / finished_at,保留进度历史(40 个点的滑动窗口),info / warn / error 日志级别,以及当所有 items 完成时自动完成(auto-completion)。

派生指标

GET /sessionstracking_get 返回一个由 metrics.py 实时计算的 metrics 块:

字段

含义

percent

进度(上限 100)

rate, rate_str

最近 120 秒的速度(2.0 MB/s30.0 u/min

eta_seconds, eta_str

预计剩余时间(仅 running 会话)

elapsed_seconds, elapsed_str

created_atfinished_at 或当前时间

idle_seconds, stale

stale = 超过 10 分钟未更新的 running 会话(在 TUI 中显示)


安装

cd /home/amineutron/dev/MCP/tracking

# Creer le venv et installer les dependances
uv venv .venv
uv pip install "mcp[cli]>=1.0.0" "pydantic>=2.0" "textual>=0.80.0" "fastapi"

MCP 已注册到 Claude Code(用户作用域):

claude mcp list        # -> tracking: Connected

重新注册:

claude mcp add tracking -s user -- \
  /home/amineutron/dev/MCP/tracking/.venv/bin/python \
  /home/amineutron/dev/MCP/tracking/server.py

systemd 服务

两个服务常驻运行并在启动时自启:

服务

作用

端口

tracking-api.service

供外部脚本使用的本地 HTTP API

127.0.0.1:8765

tracking-poller.service

轮询 qBittorrent(10 秒)+ Bazarr(60 秒)

--

初始安装与重新部署

cd /home/amineutron/dev/MCP/tracking
./install.sh        # premiere fois : venv + services (demande sudo)
sudo ./deploy.sh    # apres chaque mise a jour du code : stop, unites, restart, verif
make smoke          # sante rapide

已由 Claude Code 会话打开的 MCP 实例 server.py 不会被 deploy.sh 重启:在这些会话中通过 /mcp 重新连接 tracking

常用命令

# Etat
systemctl status tracking-api.service tracking-poller.service

# Logs en direct
journalctl -fu tracking-poller.service
journalctl -fu tracking-api.service

# Redemarrage
sudo systemctl restart tracking-api.service tracking-poller.service

# Test API
curl http://127.0.0.1:8765/health
curl http://127.0.0.1:8765/sessions

启动

仪表盘(wofi 快捷方式)

在 wofi/启动器中搜索 "MCP Tracking"。在 Kitty 中启动仪表盘。

仪表盘(终端)

# Toutes les sessions
/home/amineutron/dev/MCP/tracking/.venv/bin/python \
  /home/amineutron/dev/MCP/tracking/server.py --ui

# Filtre direct au lancement
.venv/bin/python server.py --ui --filter download
.venv/bin/python server.py --ui --filter movie
.venv/bin/python server.py --ui --filter errors

通过 MCP 工具(从 Claude/Lyra)

open_tracking_ui()                             # toutes les sessions
open_tracking_ui(filter_template="lyra_task")  # vue Lyra uniquement
open_tracking_ui(filter_template="errors")     # erreurs uniquement

测试模式(演示)

.venv/bin/python server.py --test

并行模拟 4 个会话:download、machine(12 个节点)、free、movie(完整 DV 流水线)。


仪表盘

会话布局

[TEMPLATE]  Nom de la session  id:xxxxxxxx  (status)
  [=============>            ] 54.2%  27100 MB / 50000 MB
  champ_extra1: valeur  |  champ_extra2: valeur

  [ok]  item-1                          100.0 GB     -- termine
  [>]   item-2                          frame: 94231 / 172800  (54.5%)  speed: 3.2x
  [ ]   item-3                          --
  [!]   item-4                          erreur detail

  Logs                                  Erreurs
  14:32:01  Message log 1               [!] item-4
  14:32:04  Message log 2               14:32:08  ECHEC: details
  14:32:07  Message log 3               --
  --                                    --
  --                                    --

项目图标

图标

状态

颜色

[ ]

pending

[>]

running

[ok]

done

绿

[!]

error

会话颜色

颜色

状态

running

绿

done

error

paused

键盘快捷键

按键

操作

f

下一个筛选(按模板动态循环)

e

切换仅显示错误的筛选

r

手动刷新

s

正常停止会话(输入 ID)-> 状态为 paused

k

强制终止会话(输入 ID)-> 删除

q

退出

方向键 / 滚轮

滚动

stop/kill 弹窗

sk 会打开一个带会话 ID 输入框的弹窗。

  • s 将会话标记为 paused 并添加一条日志

  • k 从仪表盘中永久删除该会话

  • Esc 取消

动态筛选

筛选循环会根据当前会话自动构建:

all -> download -> free -> movie -> lyra_task -> errors -> all -> ...
  • all 始终存在

  • JSON 中出现的每个模板都会自动添加

  • errors 仅当至少有一个会话出错时才出现

  • 当前筛选显示在副标题中:filtre: movie | 2/5 session(s)

  • 如果被筛选的模板从 JSON 中消失,自动回到 all


media-server 集成

qBittorrent(自动)

poller 每 10 秒查询一次 http://localhost:8080/api/v2/torrents/info

  • 一个活动 torrent = 一个 [DOWNLOAD] 会话,包含名称、大小、速度、ETA

  • 当 torrent 完成或消失时,会话会自动删除

  • 凭据:credentials/qbt-password.cred(由 systemd-creds --user 加密,由 media-server/scripts/secrets/rotate-secrets.sh 生成)

Bazarr 缺少字幕(自动)

poller 每 60 秒查询一次 Bazarr API。

  • 一个 [SUBTITLES] 会话列出所有没有 FR 字幕的剧集/电影

  • 会话标题显示总数:Sous-titres manquants (151)

  • 前 50 个缺失文件作为 items 列出

  • Bazarr API 密钥:credentials/bazarr-api-key.cred(相同机制)。没有凭据时,相关 poller 会被直接禁用。

Dolby Vision 转换(自动)

dv-webhook.service 在 Radarr/Sonarr 导入 DV Profile 4 或 7 电影时触发。

流程:

Radarr/Sonarr import
      |
      v
dv_webhook_server.py (port 8787)
      |-- cree session tracking via api.py
      |-- passe DV_TRACKING_SESSION_ID en env
      v
dv_convert.py
      |-- 6 etapes avec metriques temps reel
      |-- ffmpeg   : frame / speed / size / time (parse stderr)
      |-- dovi_tool: frames X/Y ou X% (parse stderr indicatif)
      v
session tracking completee ou en erreur

被追踪的 6 个步骤及其指标:

步骤

工具

显示的指标

1/6 提取 HEVC

ffmpeg

frame / speed / size / time

2/6 分离 BL/EL

dovi_tool

frames X/Y (%), bl: X GB, el: X GB

3/6 提取 RPU + 转换 P8

dovi_tool

frames X/Y (%), RPU: X KB

4/6 将 RPU P8 注入 BL

dovi_tool

frames X/Y (%), P8 HEVC: X GB

5/6 重建时间戳

ffmpeg

frame / fps / size

6/6 最终 remux MKV

ffmpeg

frame / speed / size

全局进度条在每个步骤期间连续推进(不是在每个步骤结束时按 1/6 跳跃)。

手动模式:

# Fichier unique
python /home/amineutron/dev/media-server/scripts/dv_convert.py /chemin/film.mkv

# Scan dossier
python /home/amineutron/dev/media-server/scripts/dv_convert.py --scan /mnt/media/media/movies

在手动模式下,tracking 会话会在 process_file 中自动创建。

本地 HTTP API(端口 8765)

外部脚本可以直接创建/修改会话:

# Creer une session
curl -X POST http://127.0.0.1:8765/sessions \
  -H "Content-Type: application/json" \
  -d '{"name":"Mon operation","template":"free","total":100,"unit":"%"}'
# -> {"id": "a1b2c3d4"}

# Mettre a jour
curl -X PUT http://127.0.0.1:8765/sessions/a1b2c3d4 \
  -H "Content-Type: application/json" \
  -d '{"processed":45,"log":"Etape 2/5 en cours","extra":{"phase":"etape 2"}}'

# Mettre a jour un item
curl -X PUT http://127.0.0.1:8765/sessions/a1b2c3d4 \
  -H "Content-Type: application/json" \
  -d '{"item":{"name":"mon-item","status":"done","note":"100 frames  speed: 2x"}}'

# Supprimer
curl -X DELETE http://127.0.0.1:8765/sessions/a1b2c3d4

# Lister
curl http://127.0.0.1:8765/sessions

完整 PUT 请求体(所有字段均可选):

{
  "processed": 45.0,
  "total":     100.0,
  "status":    "running",
  "extra":     {"phase": "etape 2"},
  "log":       "message de log",
  "item": {
    "name":      "nom-de-l-item",
    "status":    "running",
    "note":      "metriques ici",
    "processed": 50.0,
    "total":     100.0
  }
}

MCP 工具

tracking_create

Parametres:
  name      (str)          Nom de la session
  template  (str)          "download" | "machine" | "free" | "movie" | "lyra_task" |
                           "subtitles" | "series_episode" | "series_season" | template utilisateur
  total     (float)        Valeur totale
  unit      (str, opt)     Unite affichee (ex: " MB", " machines", "%")
  items     (list, opt)    Liste d'elements a suivre
  extra     (dict, opt)    Champs specifiques au template

Format items:
  [{"name": "fichier.iso", "total": 5100, "unit": " MB", "note": "info"}]

Retourne: ID de session + etat initial formate

tracking_update

Parametres:
  session_id    (str)          ID de la session
  processed     (float, opt)   Nouvelle valeur de progression
  message       (str, opt)     Message de log
  item_updates  (list, opt)    Mises a jour des items
  extra         (dict, opt)    Champs extra a merger

Format item_updates:
  [{"name": "item-1", "status": "done", "processed": 1200, "note": "detail"}]
  Status: "pending" | "running" | "done" | "error"

tracking_log

添加一条日志而不修改进度。

Parametres:
  session_id  (str)
  message     (str)

tracking_complete

标记为完成,进度 100%。

Parametres:
  session_id  (str)
  message     (str, opt)

tracking_error

标记为错误(自动添加前缀 "ERREUR:",显示在错误列中)。

Parametres:
  session_id  (str)
  message     (str)

tracking_stop

正常停止一个会话(状态 -> paused)。仍会在仪表盘中可见。

Parametres:
  session_id  (str)
  message     (str, opt)

tracking_kill

强制删除一个会话。它会立即从仪表盘中消失。

Parametres:
  session_id  (str)

tracking_get

返回一个会话的完整格式化状态。

tracking_list

Parametres:
  template  (str, opt)   Filtrer par template
  status    (str, opt)   Filtrer par statut ("running", "done", "error", "paused")

tracking_delete

删除一个会话(等同于 tracking_kill)。

tracking_templates

显示模板列表及其字段。

open_tracking_ui

在 Kitty 终端中打开仪表盘。

Parametres:
  filter_template  (str, opt)   Template a afficher au lancement

模板

download

文件下载。由 qBittorrent 通过 poller 自动填充。

Champs extra : speed, eta
Unite par defaut : MB

machine

对机器执行的操作(update、clone、snapshot、deploy)。 由 Lyra 用于 VM/集群操作。

Champs extra : operation, target
Unite par defaut : machines

free

自由格式。由 poller 用于缺失的 Bazarr 字幕。

Aucun champ extra impose, aucune unite par defaut.

lyra_task

Lyra 操作(VM clone、backup、update、snapshot)。

Champs extra : operation, target, phase, eta
Unite par defaut : %

movie

电影的完整流水线:下载、Dolby Vision 转换。 当 Radarr/Sonarr 导入 DV P4/P7 文件时,由 dv_convert.py 自动填充。

Champs extra : phase, quality, codec, audio, source, dv, speed, eta
Unite par defaut : %

Les 6 etapes DV trackees avec metriques temps reel :
  "1/6 extraction HEVC"
  "2/6 demux BL/EL"
  "3/6 extraction RPU + conv P8"
  "4/6 injection RPU P8 dans BL"
  "5/6 reconstruction timestamps"
  "6/6 remuxage MKV final"

安全

  • api.py 仅在 127.0.0.1:8765 上监听——无法从网络访问

  • n8n 在 docker-compose.yml 中限制为 127.0.0.1:5678

  • dv_webhook_server.py 监听 0.0.0.0:8787(接收 Docker webhooks 所必需)——如果机器暴露在外,请用防火墙保护该端口

  • systemd 服务以 NoNewPrivileges=true 运行

  • 代码中没有明文密钥:poller.py 读取 $CREDENTIALS_DIRECTORY(用户服务)或通过 systemd-creds decrypt --user 解密 credentials/*.cred(系统服务),并回退到 QBT_PASSWORD / BAZARR_KEY 变量用于调试


添加模板

  1. 打开 templates.py,在 TEMPLATES 中添加一个条目:

"mon_template": {
    "description": "Description courte",
    "extra_fields": ["champ1", "champ2"],
    "default_unit": " unites",
    "example_extra": {"champ1": "valeur", "champ2": "valeur"},
},
  1. 可选:在 sim.py 中添加一个模拟函数 _sim_mon_template()

该模板立即可用,无需其他修改。

无需修改代码,也可以在 ~/.config/tracking/templates.json 中声明模板(结构相同,键 = 模板名称);它会在启动时加载。


测试

make test     # unitaires (storage, metrics) + integration (API HTTP reelle sur port ephemere)

conftest.py 中的 autouse fixture 会将持久化重定向到 tmp_path:测试永远不会触碰生产状态。

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides Claude Code with programmatic session awareness to track context usage, session history, and task progress. It enables intelligent context reset recommendations and automatic synchronization of project planning documentation.
    5
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A comprehensive project management and workflow tracking system that integrates with Claude Code via MCP, automatically capturing sessions, tools, agents, and project tasks into a centralized dashboard and database.
    20
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A comprehensive MCP server for monitoring Claude Code sessions, agent performance, cost tracking, project management, and GitHub synchronization with 89 tools and a real-time dashboard.

View all related MCP servers

Related MCP Connectors

  • Uptime, SSL, DNS and domain monitoring you can talk to from Claude or any MCP client.

  • Let your AI sessions talk to each other — messaging, tasks, sessions, and alerts

  • AI agent run monitoring with incident replay and SLA receipts.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/marouabah/mcp-tracking'

If you have feedback or need assistance with the MCP directory API, please join our Discord server