tracking
MCP Tracking
실시간 추적 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)상태 파일은 파일 잠금(tracking_state.lock) 아래 원자적 쓰기(os.replace)를 통해 수정될 때마다 기록됩니다. 모든 프로세스(MCP, API, poller, dashboard)가 이 단일 파일을 공유하며, 각 읽기는 mtime을 확인하여 캐시를 무효화합니다.
모든 변경(HTTP 또는 MCP)은 mutations.py를 거치며 두 경로에서 동일한 동작을 보장합니다: 항목과 세션에 started_at / finished_at 설정, 진행 이력(40개 포인트 슬라이딩 윈도우), info / warn / error 로그 레벨, 모든 항목이 완료되면 자동 완료 처리.
파생 지표
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 rapideClaude 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 errorsMCP 도구 사용 (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 --test4개 세션을 병렬로 시뮬레이션합니다: 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 입력) -> status paused |
| 세션 강제 종료(ID 입력) -> 삭제 |
| 종료 |
화살표 / 휠 | 스크롤 |
stop/kill 모달
s 또는 k를 누르면 세션 ID 입력 필드가 있는 모달이 열립니다.
s는 세션을paused로 표시하고 로그를 추가합니다k는 대시보드에서 세션을 완전히 삭제합니다Echap는 취소합니다
동적 필터링
필터 순환은 현재 존재하는 세션에서 자동으로 구성됩니다:
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를 조회합니다.
활성 토렌트 = 이름, 크기, 속도, ETA가 포함된
[DOWNLOAD]세션토렌트가 완료되거나 사라지면 세션이 자동으로 삭제됩니다
자격 증명:
credentials/qbt-password.cred(systemd-creds --user로 암호화,media-server/scripts/secrets/rotate-secrets.sh가 생성)
Bazarr 누락 자막 (자동)
poller는 60초마다 Bazarr API를 조회합니다.
단일
[SUBTITLES]세션이 프랑스어 자막이 없는 모든 에피소드/영화를 나열합니다세션 제목에 총 개수가 표시됩니다:
Sous-titres manquants (151)누락된 처음 50개 파일이 항목으로 나열됩니다
Bazarr API 키:
credentials/bazarr-api-key.cred(동일한 메커니즘). 자격 증명이 없으면 해당 poller는 그냥 비활성화됩니다.
Dolby Vision 변환 (자동)
Radarr/Sonarr가 DV Profile 4 또는 7 영화를 가져올 때 dv-webhook.service가 트리거합니다.
흐름:
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 BL에 RPU P8 주입 | dovi_tool | frames X/Y (%), P8 HEVC: X GB |
5/6 타임스탬프 재구성 | ffmpeg | frame / fps / size |
6/6 최종 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수동 모드에서는 추적 세션이 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% 완료(done)로 표시합니다.
Parametres:
session_id (str)
message (str, opt)tracking_error
오류로 표시합니다(자동으로 "ERREUR:" 접두사가 붙고, 오류 열에 표시됩니다).
Parametres:
session_id (str)
message (str)tracking_stop
세션을 정상적으로 중지합니다(status -> 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
파일 다운로드. poller를 통해 qBittorrent가 자동으로 채웁니다.
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:5678로 제한됨dv_webhook_server.py는0.0.0.0:8787에서 수신합니다(Docker 웹훅 수신에 필요) -- 머신이 노출된 경우 방화벽으로 이 포트를 보호하세요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 픽스처는 영속성을 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