MCPServer
Portée : namespaced · Modes : catalog (intégré, sous licence) · external (gratuit)
Un MCPServer définit un serveur Model Context Protocol unique qu'une ou plusieurs ChatUI peuvent utiliser. Définissez-le une fois et référencez-le depuis n'importe quelle ChatUI via spec.mcpRefs — l'opérateur le câble pour vous dans LibreChat (le point de terminaison Agents).
Spec
| Champ | Type | Description |
|---|---|---|
mode | enum catalog | external (requis) | Serveur intégré vs point de terminaison auto-hébergé |
catalog | string | Clé du serveur intégré (mode=catalog), p. ex. websearch |
external | object | Point de terminaison auto-hébergé (mode=external) |
displayName | string | Nom du serveur affiché dans LibreChat (par défaut : clé du catalogue ou nom du CR) |
serverInstructions | string | Remplace les instructions d'outil destinées au modèle |
external
| Champ | Description |
|---|---|
url | Le point de terminaison MCP (p. ex. http://host:8080/mcp) |
type | Transport : streamable-http (par défaut) ou sse |
inCluster | Force le traitement par liste d'autorisation SSRF. Omettez pour une détection automatique d'après l'hôte (DNS de service / IP privée) |
timeoutMs | Délai par requête (par défaut 60000) |
headersSecretRef | Secret du même namespace dont les clés deviennent des en-têtes HTTP (injectés via env, jamais écrits dans la configuration rendue) |
oauth | Authentification OAuth 2.0 vers un point de terminaison MCP protégé (sous licence : mcp-oauth) — voir Authentification OAuth |
external.oauth (sous licence : mcp-oauth)
Définissez exactement un parmi interactive ou onBehalfOf (une règle de validation l'impose). Sans la licence mcp-oauth, le MCPServer est refusé (MCPOAuthUnlicensed) et une ChatUI qui le référence reste non câblée.
| Champ | Description |
|---|---|
interactive | Flux authorization-code + PKCE par utilisateur (chaque utilisateur s'autorise une fois auprès de l'IdP) |
interactive.authorizationURL | Point de terminaison d'autorisation de l'IdP. Optionnel — omettez-le (avec tokenURL) pour laisser LibreChat le découvrir automatiquement à partir des métadonnées du serveur |
interactive.tokenURL | Point de terminaison de jeton de l'IdP (optionnel, voir ci-dessus) |
interactive.clientSecretRef | Secret du même namespace contenant l'ID client (client-id) et, pour les clients confidentiels, le secret client (client-secret). Injecté via env, référencé comme ${…} — jamais en ligne. Omettez-le pour un client public/PKCE |
interactive.scopes | Scopes demandés à l'IdP (séparés par des espaces) |
interactive.tokenExchangeMethod | default_post (secret client dans le corps) ou basic_auth |
onBehalfOf | Échange de jeton on-behalf-of silencieux de la session SSO de l'utilisateur (aucune invite) |
onBehalfOf.scopes | Scopes en aval à demander (requis, non vide), p. ex. api://<client-id>/<permission> |
Modes
catalog(sous licence :bundled-mcp-catalog) — l'opérateur déploie le serveur intégré comme une seule version partagée et comptée par référence pour tout le cluster (dansnavique-mcp-system) et câble chaque ChatUI qui le référence à son Service interne au cluster. Sans licence (Community), leMCPServerest refusé (aucun déploiement) ; une ChatUI qui le référence attend simplement. Le premier serveur intégré estwebsearch(recherche web d'entreprise : SearXNG + scraping + PII + reclassement). L'empreinte se règle au niveau du cluster viaPlatformConfig.spec.mcp(fullpar défaut, ouminimal).external(gratuit / Community) — pointe vers un point de terminaison MCP que vous hébergez vous-même. Les cibles internes au cluster sont détectées automatiquement et reçoivent la liste d'autorisation SSRF de LibreChat (mcpSettings) afin que les adresses privées soient accessibles.
Liste d'autorisation SSRF (automatique)
LibreChat bloque les appels MCP vers des adresses privées/internes au cluster sauf si elles sont autorisées. L'opérateur s'en charge : dès qu'un serveur référencé est interne au cluster, il rend un bloc mcpSettings de premier niveau dont allowedDomains liste chaque origine de serveur (une liste globale — les serveurs publics doivent aussi y figurer, sinon ils seraient bloqués) et dont allowedAddresses exempte les hôtes internes au cluster. Vous n'avez rien à configurer.
Exemple — recherche web intégrée
apiVersion: core.navique.com/v1alpha1
kind: MCPServer
metadata:
name: websearch
namespace: forge
spec:
mode: catalog
catalog: websearch
---
apiVersion: core.navique.com/v1alpha1
kind: ChatUI
metadata:
name: forge-ui
namespace: forge
spec:
# … gateway/mongo/meili/secrets …
mcpRefs:
- { name: websearch }Exemple — externe (interne au cluster, avec auth)
apiVersion: core.navique.com/v1alpha1
kind: MCPServer
metadata:
name: internal-docs
namespace: forge
spec:
mode: external
external:
url: http://docs-mcp.team.svc.cluster.local:8080/mcp
headersSecretRef: { name: docs-mcp-auth } # clés → en-têtes HTTPAuthentification OAuth (sous licence)
Fonctionnalité sous licence : mcp-oauth. Connectez des ChatUI à des serveurs MCP qui exigent OAuth 2.0. Deux modes — choisissez-en un par serveur :
- Interactif (authorization-code + PKCE). Chaque utilisateur s'autorise une fois auprès de l'IdP (une invite « OAuth Required » unique dans le menu du chat) ; les jetons sont stockés chiffrés et rafraîchis automatiquement. Fonctionne avec n'importe quel fournisseur. Les identifiants client proviennent d'un Secret et ne sont jamais écrits dans la configuration rendue. Comme l'IdP redirige le navigateur vers l'interface, la ChatUI doit être exposée via
spec.ingresspour que le callback se résolve. - On-behalf-of (OBO). LibreChat échange silencieusement le jeton de session SSO existant de l'utilisateur contre un jeton en aval — aucune invite, aucun secret client. La ChatUI doit avoir
spec.ssoconfiguré (le jeton échangé est la connexion SSO). Idéal pour les serveurs basés sur Entra/OpenID.
Exemple — OAuth interactif
apiVersion: core.navique.com/v1alpha1
kind: MCPServer
metadata:
name: salesforce
namespace: forge
spec:
mode: external
external:
url: https://api.salesforce.com/platform/mcp/v1/…
oauth:
interactive:
authorizationURL: https://login.salesforce.com/services/oauth2/authorize
tokenURL: https://login.salesforce.com/services/oauth2/token
scopes: [mcp_api, refresh_token]
clientSecretRef: { name: salesforce-mcp-oauth } # clés : client-id, client-secretExemple — on-behalf-of (Entra)
apiVersion: core.navique.com/v1alpha1
kind: MCPServer
metadata:
name: graph
namespace: forge
spec:
mode: external
external:
url: https://mcp.example.com
oauth:
onBehalfOf:
scopes: ["api://<client-id>/Files.Read"]
# La ChatUI qui la référence doit avoir spec.sso configuré.Remarques
- Référencer un serveur MCP active automatiquement le point de terminaison Agents de LibreChat (les outils MCP ne sont utilisables que via Agents).
- La recherche web native et l'interpréteur de code sont désactivés par l'opérateur, et les utilisateurs (administrateurs compris) ne peuvent pas ajouter ou désactiver de serveurs MCP depuis l'interface — seule la configuration de l'opérateur les définit.
Statut
{ phase, url (point de terminaison résolu), transport, inCluster, serverName, conditions, observedGeneration }. Nom court mcp.