Hébergement MCP (mcp-host)
Héberge les serveurs MCP stdio déclarés par tenant et par projet dans le Manager (navin-mcp-host) : chaque serveur est démarré à la demande, isolé dans son propre processus (isolation process) ou dans son propre conteneur Podman sans root sur le réseau de son projet de tenant (isolation container) avec ses limites de mémoire et de concurrence, et servi en HTTP streamable sous /t/{tenant}/p/{project}/s/{name}/mcp avec son propre jeton porteur. La liste des serveurs hébergés est écrite par le Manager (servers.json) et rechargée sans redémarrage.
Généré depuis catalog/services/mcp-host.yaml : ne pas modifier à la main.
Résumé
| |
|---|
| Version | 1.0.0 |
| Usage | installer et configurer |
| Couche | fonctionnelle (catalogue IA) |
| Catégorie | Passerelles et répartition de charge |
| Méthodes d'installation | python |
| Connexion externe | non |
| Réservé au bac à sable | non |
Licence
| |
|---|
| Identifiant SPDX | Apache-2.0 |
| Politique de licence | licence socle (MIT ou Apache-2.0) |
| Exception de licence | - |
| Composant de la plateforme | navin-mcp-host |
Paquets et artefacts
Un paquet que publie le projet du service (son image, son archive binaire, son paquet Python ou système) porte la licence du service ; un paquet tiers porte la licence écrite sur sa ligne, lue dans les métadonnées officielles du projet amont.
| Type | Paquet | Version | Licence | Détails |
|---|
| image de conteneur | docker.io/library/node | 22.23.4-bookworm-slim | Apache-2.0 | clé d'image node, condensé sha256:4b150b48b4116e2a22f2c39cc27025fbf4f153e2078fd3b14d159fdb5c7279da |
| image de conteneur | docker.io/astral/uv | 0.9.30-python3.12-bookworm-slim | Apache-2.0 | clé d'image python, condensé sha256:e5b65587bce7de595f299855d7385fe7fca39b8a74baa261ba1b7147afa78e58 |
| paquet Python | navin-mcp-host | 1.0.0 | Apache-2.0 | interpréteurs, par ordre de préférence python3.12, python3.11, python3.10 |
Les images sont épinglées par étiquette dans le descripteur, et par condensé (digest) quand le descripteur en déclare un (le bundle hors ligne refuse alors une image téléchargée qui ne le porte pas) ; le condensé est enregistré dans le miroir du Manager à l'import du bundle hors ligne, et chaque téléchargement ou chargement est vérifié par rapport à lui.
Systèmes et architectures pris en charge
| Méthode | Systèmes d'exploitation | Architectures |
|---|
python | famille RHEL (dnf), famille Debian (apt), Arch Linux (pacman) | x86_64, aarch64 (non restreintes par le descripteur) |
Systèmes hôtes certifiés : RHEL 8/9/10, Rocky Linux 8/9/10, AlmaLinux 8/9/10, Oracle Linux 8/9, CentOS Stream 9/10, Ubuntu 22.04/24.04, Debian 12, Arch Linux (rolling). Le contrôle préalable des hôtes accepte ces systèmes (une autre version d'une famille connue donne un avertissement, une version en fin de vie est refusée) et les architectures x86_64 et aarch64.
Prérequis
Hôte
- au moins 1024 Mo de mémoire (bloquant,
memory).
- le programme
npx installé sur l'hôte, seulement quand isolation vaut process (avertissement, npx_present).
- le programme
uvx installé sur l'hôte, seulement quand isolation vaut process (avertissement, uvx_present).
- le programme
podman installé sur l'hôte, seulement quand isolation vaut container (bloquant, podman_present).
- plages d'uid et de gid subordonnés de l'utilisateur navin-mcp-host dans /etc/subuid et /etc/subgid (créées par user.ensure sur un agent root avec usermod), seulement quand
isolation vaut container (bloquant, subordinate_ids).
Réseau et ports
| Composant | Nom du port | Port | Ouvert dans le pare-feu de l'hôte |
|---|
mcp-host | mcp | 8790/tcp | oui |
Services et connexions nécessaires
Ce service n'a aucune dépendance.
Méthodes et modes d'installation
| Méthode | Défaut | Ce que la méthode utilise |
|---|
python | oui | un environnement virtuel Python qui contient les paquets Python du descripteur |
Composants
| Composant | Type | Méthodes d'installation | Ports |
|---|
Hôte MCP (mcp-host) | maître | python | 8790/tcp |
Instance unique (single) (par défaut)
Une seule instance héberge tous les serveurs MCP du cluster.
Ce que le mode déploie :
| Composant | Placement |
|---|
mcp-host | min 1, max 1 |
Réparti (replicated)
Deux instances ou plus ; chaque serveur MCP est placé sur une seule instance, choisie par int(sha256(id)[:8], 16) modulo le nombre d'instances triées par id.
Ce que le mode déploie :
| Composant | Placement |
|---|
mcp-host | min 2, recommandé 2 |
Installer ce service
L'assistant d'installation du Navin Manager planifie, valide et exécute l'installation ; il faut la permission services:install sur le cluster.
-
Ouvrez l'assistant. Dans Clusters, choisissez l'action de ligne Installer des services du cluster cible. L'assistant s'ouvre sur sa première étape, Service.
-
Choisissez le service. À l'étape Service, sélectionnez Hébergement MCP. La carte affiche la licence Apache-2.0.
-
Choisissez les hôtes et le mode. À l'étape Hôtes, cochez les hôtes, puis choisissez le Mode : single (par défaut), replicated. Chaque mode déploie les composants listés dans Méthodes et modes d'installation.
-
Liaisons. Ce service n'a aucune dépendance : l'étape Liaisons n'a rien à lier.
-
Configurez. À l'étape Configuration, relisez les paramètres (voir Paramètres de configuration). Les mots de passe laissés vides avec une valeur générée par défaut sont générés et scellés par le Manager.
-
Relisez et installez. À l'étape Installation, le Manager valide le plan et affiche l'ordre d'installation ; quand il indique « Le plan est valide. Prêt pour l'installation. », choisissez Installer. Un mode hautement disponible n'est installé que si ses contrôles HA réussissent.
-
Vérifiez. L'opération se termine quand les contrôles de santé de chaque instance réussissent (voir Contrôles de santé) ; le service apparaît alors en marche dans Services.
Haute disponibilité
| |
|---|
| Cluster | aucun (none) |
| Haute disponibilité | redondance (redundancy) |
| Bascule | aucun (none) |
| Réplication | aucun (none) |
| Quorum | aucun (none) |
| Découverte | statique (static) |
| Point d'entrée | n'importe quel nœud (any-node) |
| Documentation officielle | https://modelcontextprotocol.io/specification/2025-03-26/basic/transports |
| Paramètre TLS entre pairs | tls_enabled |
| Authentification entre pairs | Aucun trafic entre les instances : chacune lit son propre servers.json écrit par le Manager. |
Topologie par mode
| Modes | Niveau le plus haut du catalogue | Répartition | Composant du quorum | Domaines de panne | Description |
|---|
single | autonome (standalone) | unique (single) | - | - | Une seule instance héberge tous les serveurs ; c'est un point unique de défaillance. |
replicated | autonome (standalone) | actif-actif (active-active) | - | 2 | Les serveurs sont répartis sur les instances, chaque serveur sur une seule instance ; la charge est partagée, une instance en panne n'arrête que ses propres serveurs. |
Remarques
- Répartition et non haute disponibilité : un serveur n'est pas déplacé quand son instance tombe ; le Manager le replace à la prochaine application de l'hébergement.
Paramètres de configuration
Réseau
| Paramètre | Type | Défaut | Valeurs permises | Obligatoire | Secret | Redémarrage | Description |
|---|
Port MCP (port) | port | 8790 | - | non | non | oui | Port du point d'accès HTTP streamable des serveurs hébergés, de /healthz et de /metrics. |
TLS (tls_enabled) | bool | false | - | non | non | oui | Servir le point d'accès en TLS avec un certificat émis par l'autorité de la console. |
Taille maximale des requêtes (max_body_kb) | int | 1024 | min 16, max 65536 | non | non | non | Kilo-octets acceptés dans une requête MCP ; les corps plus grands sont refusés avec 413. |
Limites des serveurs hébergés
| Paramètre | Type | Défaut | Valeurs permises | Obligatoire | Secret | Redémarrage | Description |
|---|
Mémoire par serveur (default_memory_mb) | int | 512 | min 64, max 65536 | non | non | non | Limite de mémoire par défaut (Mo) du processus d'un serveur hébergé ; un serveur peut fixer sa propre limite. |
Requêtes simultanées par serveur (default_max_concurrency) | int | 8 | min 1, max 256 | non | non | non | Nombre par défaut de requêtes traitées en même temps par un serveur hébergé ; les autres attendent. |
Délai des requêtes (request_timeout_s) | int | 60 | min 1, max 3600 | non | non | non | Secondes avant l'abandon d'un appel à un serveur hébergé. |
Délai d'inactivité (idle_timeout_s) | int | 600 | min 10, max 86400 | non | non | non | Secondes sans requête après lesquelles le processus d'un serveur hébergé est arrêté (relancé à la requête suivante). |
Nombre maximal de serveurs par instance (max_servers) | int | 200 | min 1, max 10000 | non | non | non | Serveurs hébergés acceptés par une instance ; les entrées en trop de servers.json sont ignorées et signalées. |
Exécution
| Paramètre | Type | Défaut | Valeurs permises | Obligatoire | Secret | Redémarrage | Description |
|---|
PATH des serveurs (runtime_path) | string | /usr/local/bin:/usr/bin:/bin | - | non | non | non | PATH donné aux processus des serveurs hébergés (où se trouvent npx, uvx ou les commandes des serveurs) ; avec l'isolation container, PATH des commandes podman (les serveurs gardent le PATH de leur image). |
Origines autorisées (allowed_origins) | json | [] | - | non | non | non | En-têtes Origin acceptés des navigateurs (liste JSON) ; vide refuse toute origine de navigateur. |
Niveau de journalisation (log_level) | enum | info | debug, info, warning, error | non | non | non | Verbosité du journal de l'environnement d'exécution. |
Isolation des serveurs
| Paramètre | Type | Défaut | Valeurs permises | Obligatoire | Secret | Redémarrage | Description |
|---|
Isolation (isolation) | enum | process | process, container | non | non | oui | process : chaque serveur est un processus enfant de l'hôte (séparation par la configuration, serveurs validés du catalogue de l'entreprise seulement). container : chaque serveur tourne dans un conteneur Podman sans root, un réseau par projet de tenant, système de fichiers racine en lecture seule, aucune capacité, quotas de mémoire et de processus ; nécessaire pour les serveurs non fiables. |
Processus par conteneur (container_pids_limit) | int | 256 | min 16, max 65536 | non | non | non | Nombre maximal de processus et de fils d'exécution d'un conteneur de serveur (podman --pids-limit). |
Espace temporaire par conteneur (container_tmpfs_mb) | int | 64 | min 1, max 4096 | non | non | non | Taille (Mo) du /tmp en mémoire d'un conteneur de serveur, seul dossier inscriptible avec /work. |
Points d'accès
| Point d'accès | Schéma | Composant | Port | Chemin | Paramètre TLS | Paramètres de liaison | Secrets de liaison | Commande de provisionnement |
|---|
mcp | http | mcp-host | 8790 (port) | - | tls_enabled | - | - | - |
Commandes
| Commande | Composant | Cible | Description |
|---|
État (status) | mcp-host | tous les hôtes | Demande à chaque instance si elle répond sur /healthz. |
Journaux récents (logs) | mcp-host | hôte choisi | Dernières lignes du journal de l'environnement d'exécution. |
Contrôles de santé
Vivacité (par instance)
| Composant | Contrôle | Détails |
|---|
mcp-host | HTTP {{ 'https' if config.tls_enabled else 'http' }}://{{ host.ip or '127.0.0.1' }}:{{ config.port }}/healthz | Attendu 200 ; 30 tentatives ; intervalle 2 s ; délai 5 s |
Disponibilité (contrôle du service)
| Contrôle | Détails |
|---|
HTTP {{ 'https' if config.tls_enabled else 'http' }}://{{ host.ip or '127.0.0.1' }}:{{ config.port }}/healthz | Attendu 200 ; 10 tentatives ; intervalle 2 s ; délai 5 s |
Contrôles préalables
| Contrôle | Type | Signification | Sévérité | Composants |
|---|
memory | memory_mb {"min": 1024} | au moins 1024 Mo de mémoire | bloquant | tous les composants |
mcp_port_free | port_free {"param": "port"} | port 8790 libre sur l'hôte | bloquant | tous les composants |
npx_present | binary {"name": "npx"} | le programme npx installé sur l'hôte, seulement quand isolation vaut process | avertissement | tous les composants |
uvx_present | binary {"name": "uvx"} | le programme uvx installé sur l'hôte, seulement quand isolation vaut process | avertissement | tous les composants |
podman_present | binary {"name": "podman"} | le programme podman installé sur l'hôte, seulement quand isolation vaut container | bloquant | tous les composants |
subordinate_ids | subordinate_ids {"user": "navin-mcp-host"} | plages d'uid et de gid subordonnés de l'utilisateur navin-mcp-host dans /etc/subuid et /etc/subgid (créées par user.ensure sur un agent root avec usermod), seulement quand isolation vaut container | bloquant | tous les composants |
Désinstallation
Chemins supprimés quand les données sont purgées : {{ paths.data }}, {{ paths.log }}.
Liens rapides
- Métriques :
{{ 'https' if config.tls_enabled else 'http' }}://{{ host.fqdn }}:{{ config.port }}/metrics
Documentation amont