tracking
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)状态文件与配置
文件 | 位置 | 覆盖变量 |
|
|
|
|
|
|
|
|
|
| 位于代码旁边,gitignore | -- |
代码旁边的旧版 tracking_state.json 会在首次启动时自动迁移(复制,绝不删除)。
保留相关的环境变量:
变量 | 默认值 | 作用 |
| 7 | 清理 done / error / paused 状态的会话 |
| 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 /sessions 和 tracking_get 返回一个由 metrics.py 实时计算的 metrics 块:
字段 | 含义 |
| 进度(上限 100) |
| 最近 120 秒的速度( |
| 预计剩余时间(仅 running 会话) |
| 从 |
|
|
安装
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.pysystemd 服务
两个服务常驻运行并在启动时自启:
服务 | 作用 | 端口 |
| 供外部脚本使用的本地 HTTP API | 127.0.0.1:8765 |
| 轮询 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 | 青 |
| done | 绿 |
| error | 红 |
会话颜色
颜色 | 状态 |
青 | running |
绿 | done |
红 | error |
黄 | paused |
键盘快捷键
按键 | 操作 |
| 下一个筛选(按模板动态循环) |
| 切换仅显示错误的筛选 |
| 手动刷新 |
| 正常停止会话(输入 ID)-> 状态为 paused |
| 强制终止会话(输入 ID)-> 删除 |
| 退出 |
方向键 / 滚轮 | 滚动 |
stop/kill 弹窗
按 s 或 k 会打开一个带会话 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 formatetracking_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 : MBmachine
对机器执行的操作(update、clone、snapshot、deploy)。 由 Lyra 用于 VM/集群操作。
Champs extra : operation, target
Unite par defaut : machinesfree
自由格式。由 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:5678dv_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变量用于调试
添加模板
打开
templates.py,在TEMPLATES中添加一个条目:
"mon_template": {
"description": "Description courte",
"extra_fields": ["champ1", "champ2"],
"default_unit": " unites",
"example_extra": {"champ1": "valeur", "champ2": "valeur"},
},可选:在
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:测试永远不会触碰生产状态。
This server cannot be installed
Maintenance
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
- AlicenseBqualityCmaintenanceEnables Claude to coordinate multiple specialized AI agents by creating tasks, tracking their complete thought process and execution in real-time, and monitoring progress across parallel workflows with full transparency.18172MIT
- AlicenseAqualityDmaintenanceProvides 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.5MIT
- AlicenseNot gradedqualityDmaintenanceA 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.20MIT
- FlicenseNot gradedqualityDmaintenanceA 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.
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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