Repository navigation
Releases: DeamonDev888/mcp-control
Releases · DeamonDev888/mcp-control
Release list
v0.7.12
[0.7.12] — Finitions « produit » : diagnostic réseau, pannes visibles, confort d'usage
Diagnostic réseau (le cas VPN qui ressemblait à une panne)
- Veille de la passerelle LAN : toutes les 30 s, l'app pingue la passerelle par défaut et croise ce résultat avec l'état des serveurs distants. Si le LAN est coupé (VPN actif le plus souvent) alors que la machine est bien connectée, un bandeau rouge s'affiche en haut de la fenêtre : « réseau local injoignable — VPN actif ? (Proton VPN : autoriser les connexions LAN) ». Le journal enregistre l'apparition et le retour du réseau.
- Décision isolée dans une fonction pure
lan_decision()et testée (4 cas : sain, passerelle muette, VPN trompeur, indéterminé). - Messages d'erreur actionnables : une erreur SSH de type
connect to host …n'est plus présentée comme un problème de clé mais comme « machine injoignable (LAN coupé / VPN actif, ou machine éteinte) ».
Panics enfin visibles
panic::set_hook: tout panic écrit désormais une ligne[panic] …dansmcc.loget sur stderr. Avant, en mode fenêtré (windows_subsystem=windows), un panic était totalement muet.catch_unwindautour du cycle de sondage : un panic dans un cycle ne tue plus le thread de supervision — il est journalisé et le cycle suivant repart.
Confort d'usage
- Boutons clarifiés :
Désactiverdevient « ⏸ Mettre en pause » / « ▶ Reprendre » (le serveur reste listé) etRetirerdevient « 🗑 Supprimer » — la confusion entre les deux avait conduit à mettre 14 serveurs hors supervision par erreur. Chaque bouton a un tooltip qui explique l'effet exact. - Bouton de déconnexion (🔓 dans la barre de titre, visible seulement si un code est stocké) + « Oublier le code enregistré » dans le dialogue de déverrouillage : plus rien ne traîne dans le navigateur après une rotation de code ou sur un poste partagé.
Performance
- Sondage parallèle : les serveurs sont sondés par paquets de 8 au lieu d'un par un. Avec ~30 serveurs dont 15 en SSH, un cycle dépassait le refresh de 15 s (états en retard d'un cycle) ; il tient maintenant dans l'intervalle. Les spawns concurrents restent protégés par la garde anti-doublon.
Sécurité
- Comparaisons à temps constant (
crypto::ct_eq) pour le code d'accès et la preuve de pair : la comparaison précédente sortait au premier octet différent.
Documentation
- README : section Installer (assistant NSIS, sans droits admin), tableau des boutons mis à jour (⚡ autoboot par serveur, ⏸ pause, 🗑 suppression), 37 frameworks, FAQ « tous mes serveurs distants sont DOWN » (VPN) et « mes serveurs ont disparu » (pause).
Tests
- 89 tests verts (+
lan_decision_couvre_les_cas_vpn_et_panne), clippy-D warningssous Windows et Linux,cargo fmt --check.
v0.7.11
[0.7.11] — Installateur wizard (NSIS) + bouton Autoboot par serveur
Installateur Windows (wizard)
- Vrai installateur
*-setup.exegénéré par Tauri (NSIS), publié dans la release à côté du binaire portable. Parcours : choix de la langue (Français/English) → bienvenue → dossier d'installation → dossier du menu Démarrer → installation → fin (avec case « créer un raccourci bureau » et lancement de l'app). installMode: currentUser: installation dans le profil utilisateur, aucune élévation UAC ; désinstalleur et entrée « Ajout/Suppression de programmes » inclus.- Métadonnées du paquet : description courte/longue, éditeur
DeamonDev888, catégorieDeveloperTool, icône de l'installateur. - CI : le job desktop Windows construit désormais le bundle NSIS (
@tauri-apps/cli build --bundles nsis) et publie<artifact>-setup.exeen plus du binaire.
Autoboot par serveur (⚡)
- Nouveau bouton ⚡ par serveur : dans la ligne de l'explorateur et dans la barre d'actions du détail. Il pilote
auto_restart— le serveur est relancé au démarrage du command center et après un crash, indépendamment de l'autostart de l'app elle-même. - Nouvelle action API
set_auto_restart({action, id, enabled}) : journalise le changement et, à la réactivation, remet à zéro le compteur d'échecs de spawn (un serveur qui avait été coupé après 3 échecs peut repartir). - Persistance réparée :
auto_restartn'était lu ni écrit dansconfig.json(toujourstrueau rechargement). Il est maintenant écrit quand il vautfalseet relu au chargement — le bouton survit au redémarrage. - État visuel : ⚡ orange quand actif, grisé sinon, tooltip explicite ; l'état est aussi rappelé en clair dans le panneau Démarrage du détail.
Tests
auto_restart_par_serveur_action_et_persistance: action → flag du serveur → écriture dansconfig.json→ réactivation effaçant les échecs → serveur inconnu rejeté proprement.- 88 tests verts, clippy
-D warnings(Windows et Linux),cargo fmt --check.
v0.7.10
[0.7.10] — Trois modes de transport (STDIO / HTTP / WS) + 37 frameworks MCP détectés par langage
Frameworks MCP
- 37 frameworks reconnus, 5 maximum par langage : Python (FastMCP, FastAPI-MCP, mcpo, mcp-proxy, MCP SDK), TypeScript/Node (FastMCP, xmcp, mcp-framework, MCP SDK, Fastify MCP), Rust (LiteMCP, rmcp, rust-mcp-sdk, tower-mcp, mcp-rs), Go (mcp-go, Go SDK, mcp-golang, gomcp, go-mcp), Java (Spring AI, MCP Java SDK, Quarkus MCP, LangChain4j, mcp-java), C#/.NET (MCP C# SDK, mcp-dotnet, mcpdotnet, csharp-mcp), Ruby (MCP Ruby, fast-mcp, ruby-mcp, mcp-rb), PHP (PHP MCP SDK, Laravel MCP, mcp-php, Symfony MCP).
- Détection combinée : signature comportementale d'abord (LiteMCP = spec 2026-07-28 non négociée +
/health« ok » ; FastMCP = réponses SSE +/sselegacy co-servi, avec arbitrage Python/TypeScript par le langage du process), puis nom annoncé par le serveur (serverInfo.name) et paquet lancé pour les serveurs stdio. - Langage déduit du framework quand il est identifié (rmcp → Rust, mcp-go → Go…), sinon en-têtes HTTP, process propriétaire du port ou commande stdio.
- Matching par mot délimité :
mcpone matche plusmcporter, et@modelcontextprotocol/server-*(serveurs npm officiels) n'est plus pris pour le SDK C#. Tests de non-régression dédiés. - Nouvelle route
GET /api/frameworks(id, label, langage) : l'UI construit les badges depuis cette table, sans liste dupliquée en JavaScript. Badge générique.tag.fwpour les frameworks autres que LiteMCP/FastMCP.
Durcissements (audit 2026-10-25)
sanitize_http_path: un chemin de sonde sans/initial ou contenant un caractère de contrôle retombe sur le chemin par défaut (anti-CRLF dans la request-line) ; utilisé parhttp_request,sse_get_hostet le probe.http_host_header: en-têteHostcorrect (host:port, crochets IPv6) sur toutes les requêtes de sonde.read_bounded_line: lecture stdio plafonnée (au plusMAX_PROBE_READ+ 1 octets avant troncature) — plus d'allocation géante avant coupure.RespHead.session_id: leMcp-Session-Idrenvoyé par l'initialize est capturé, prêt à être rejoué sur les appels suivants.ssh_error_hintfactorisé (un seul endroit pour les messages « auth refusée » / « machine injoignable »).
UI
- Plus de badge « HTTP+SSE » ni « SSE » : le streamable JSON et les réponses encodées SSE (FastMCP/mcp-proxy) sont tous les deux du HTTP — le badge de transport affiche désormais simplement
HTTP. Le badge de framework (FastMCP,LiteMCP) reste séparé et son tooltip ne parle plus de SSE. - Trois modes seulement : STDIO / HTTP / WS. Le badge
HTTPS(port 443) est retiré : ce n'était pas un mode de transport. - Badge WS (orange) : affiché quand le serveur accepte une upgrade WebSocket (
HTTP/1.1 101 Switching Protocols) sur le chemin MCP. Nouvelle sondews_upgrade_host(en-têtesUpgrade: websocket,Sec-WebSocket-Key), timeout court, détection seule — aucun frame WS n'est échangé. - Détail serveur : la ligne framework de FastMCP n'affiche plus « + SSE legacy ».
Technique
Server.ws/McpProbe.wspropagés (probe HTTP loopback, probe par hôte, cache de démarrage,/api/state,/api/detail).- Test de non-régression
ws_upgrade_detecte_101_et_rejette_le_reste: 101 → WS, 200 → HTTP, port fermé → pas de panic.
v0.6.4
[0.6.4] — Plus aucune fenêtre console qui s'ouvre
Corrigé (bug bloquant)
- Cliquer Start/Stop (ou chaque poll) ouvrait des fenêtres console : les spawns utilitaires (netstat, tasklist, taskkill, arp, ipconfig, hostname) n'avaient pas CREATE_NO_WINDOW depuis une app GUI. Helper
hidden()appliqué à TOUS les Command de l'app. - Kill des serveurs stdio :
Child::kill()ne tuait que le lanceur .cmd, pas node.exe détaché → processus orphelins et consoles résiduelles.kill_tree()(taskkill /F /T /PID) remplace les 6 sites de kill (toggle OFF, kill_stdio, remove, chemins d'erreur handshake).
Vérifié
- 0 console visible (MainWindowHandle ≠ 0) avant/après 5 toggles + polls.
- Start → UP (pid réel), Stop → process tué côté OS, aucune fenêtre.
v0.6.3
[0.6.3] — Langage détecté par le process réel + chips visibles partout
Corrigé
- Les serveurs HTTP locaux sans en-têtes n'avaient AUCUN langage → chip absent. Le probe interroge désormais le vrai process qui écoute le port (netstat -ano → PID → tasklist → image, cache 10 s) : node.exe → node, python.exe → python, java.exe → java, dotnet.exe → dotnet…
- Normalisation de l'image (
node.exe→node) pour que la chip s'affiche. - Chip « ? » explicite quand le langage est indétectable (au lieu de rien).
- La fenêtre native desktop embarquait un vieux core (v0.6.0) → rebuild aligné sur le core courant.
Preuve : Overmind/discord/postgres/X/NEWS détectés node via leur process node.exe ; py-header → python (header uvicorn) ; stdio → node (commande).
v0.6.2
[0.6.2] — Langage des serveurs MCP + logos
Frontend
- Chip de langage (monogramme coloré façon logo) à côté du badge de type : JS (Node/TS), PY, RS, GO, JV, C#, RB, PHP. Survol = libellé complet. Badge absent si le langage est inconnu (aucune invention).
- Transport conservé : STDIO / HTTP / SSE / HTTPS (+ ·LAN).
Backend
- Détection du langage — la spec MCP n'expose PAS le langage (serverInfo = name/title/version uniquement) :
- stdio : commande de lancement (node/npx/tsx → Node, python/uv/uvx → Python, cargo → Rust, go/java/dotnet/ruby/php), extension du script en dernier recours.
- HTTP : en-têtes Server / X-Powered-By (uvicorn/gunicorn/werkzeug → Python, express → Node, hyper/axum → Rust, Kestrel → .NET, Jetty/Tomcat → Java, net/http → Go), sinon indice dans le nom.
- RespHead (content-type/server/x-powered-by) remplace le simple content-type ;
langexposé dans /api/state. - Fixture
examples/test-py-header-server.js(se présente comme uvicorn) pour tester l'inférence.
Preuves : py-header → python (header uvicorn) ; Filesystem/demo-stdio → node (commande) ; serveurs réels sans en-tête → lang inconnu.
v0.6.1
[0.6.1] — Badges du type de MCP (STDIO / HTTP / SSE / HTTPS)
UI
- Chaque serveur affiche son type de transport avant le badge « désuet » : STDIO (cyan), HTTP (violet), SSE (vert, détecté au probe), HTTPS (port 443), suffixe ·LAN pour les serveurs distants.
- Même badge dans la vue détail à côté du pill d'état.
Backend
- Détection SSE : Content-Type
text/event-streamcapturé sur la réponse initialize → champsse(McpProbe/Server) exposé dans /api/state. - Fixture
examples/test-sse-server.js(serveur MCP SSE zéro dépendance) pour tester.
Preuve réelle : Overmind, discord, postgres, X, NEWS détectés SSE ; demo-http (JSON chunked) HTTP ; stdio → STDIO.
v0.6.0
[0.6.0] — App NATIVE (Tauri) + CLI headless
Architecture
- Workspace cargo :
mcp-command-center(core headless, lib + bin) +mcp-command-center-desktop(Tauri 2). - Le core devient une LIBRAIRIE : tout le moteur (config, probes, polling, HTTP, boutique) est dans
src/lib.rs;run_headless()démarre tout et retourne l'URL,park_forever()bloque. mcp-command-center.exe= CLI 100 % headless : plus AUCUNE ouverture de navigateur/fenêtre. Sortie console : URL + endpoints. (Le mode --app Edge/Chrome est supprimé.)mcp-command-center-desktop.exe= vraie fenêtre native OS : Tauri 2 + WebView2 système (déjà fourni par Windows 11), exe autonome 9 MB,windows_subsystem = "windows"(aucune console). Le moteur tourne dans le process, la fenêtre navigue vers l'URL locale.- Lanceurs :
start-command-center.bat→ fenêtre native ;start-headless.bat→ CLI.
CI
- Jobs core scopés sur
-p mcp-command-center(le desktop ne compile pas sur ubuntu sans webkit2gtk). - Nouveau job
desktop(windows-latest) : construit la fenêtre native et l'ajoute à la release (mcp-command-center-desktop-windows-x86_64.exe). - Prérequis MSVC : toolchain
stable-x86_64-pc-windows-msvc+ Build Tools 2022 + WebView2 Runtime (tous présents ici).
v0.5.1
[0.5.1] — Audit complet + formatage
Gates
- cargo fmt appliqué (tout le repo formaté, vérifié par fmt --check) + fmt --check ajouté au rituel de release.
- Corrigé : refresh_secs non clampé (une config avec 0 = busy-loop CPU) → clamp 5..3600.
- Nettoyé : variable batch morte dans scan_ports.
Audit — feuille de route
Voir README (section Feuille de route) pour la liste complète construire/optimiser/sécuriser.
v0.5.0
[0.5.0] — Fenêtre desktop + Boutique MCP
Desktop
- L'app s'ouvre maintenant dans une FENÊTRE dédiée (Edge/Chrome --app, style Electron sans la payload) au lieu d'un onglet navigateur. Fallback navigateur. MCC_NO_BROWSER=1 pour désactiver.
Boutique MCP (portée de l'app Hermes desktop)
- Bouton « Boutique » : catalogue de 14 serveurs MCP officiels (Filesystem, Git, GitHub, Memory, Fetch, Puppeteer, Brave, PostgreSQL, SQLite, Slack…), catégories + recherche, install en un clic.
- Import « collez n'importe quoi » (porté de mcp-import.ts) : snippet mcp.json (mcpServers ou mcp_servers ou map brute), commande npx/uvx/docker/claude mcp add, ou simple URL → serveurs créés.
- Backend : /api/store, actions install_store + import_mcp, parsing tolerant (mcp-doc.ts), nettoyage de noms (@modelcontextprotocol/server-filesystem → filesystem).
Corrigé (Windows)
- Rust Command::new("npx") échouait : CreateProcess ne résout que les .exe — résolution .cmd dans le PATH ajoutée (npx/uvx fonctionnent).
- Timeout de handshake stdio 6 s → 15 s (npx télécharge le package au premier lancement).