Files
Loki/internal/jean/mcp_client_test.go
T
nathaninline 8e57685b19 v0.5.0 : intégration MCP (Model Context Protocol)
Jean peut désormais se connecter à des serveurs MCP tiers pour enrichir la
palette d'outils de l'IA (accès fichiers, bases de données, APIs métier…).

- Transports stdio (process local npx/uvx/binaire) et http (Streamable HTTP
  distant, en-têtes d'auth possibles), via le SDK officiel go-sdk.
- Outils namespacés mcp__<serveur>__<outil>, exposés seulement en mode agent
  (même niveau de confiance que le shell : exécution de code sur l'hôte).
- Sessions persistantes (connexion paresseuse + cachée, reconnexion auto).
- Gestion complète dans l'UI web : ajout/édition de serveurs, activation par
  serveur ET par outil (pour maîtriser le contexte), état de connexion en direct.
- Config dans mcp.json (format Claude Desktop mcpServers, copiable).
2026-07-24 12:49:56 +02:00

51 lines
1.4 KiB
Go

package jean
import (
"os/exec"
"strings"
"testing"
)
// TestMCPEndToEnd connecte le serveur MCP de référence (@modelcontextprotocol/
// server-everything via npx), vérifie la découverte d'outils namespacés puis un
// appel réel (echo). Skippé si npx est absent (CI sans Node).
func TestMCPEndToEnd(t *testing.T) {
if _, err := exec.LookPath("npx"); err != nil {
t.Skip("npx indisponible — test MCP e2e ignoré")
}
t.Setenv("JEAN_HOME", t.TempDir())
cfg := MCPServerConfig{
Command: "npx",
Args: []string{"-y", "@modelcontextprotocol/server-everything"},
Enabled: true,
}
if err := SetMCPServer("everything", cfg); err != nil {
t.Fatalf("SetMCPServer: %v", err)
}
t.Cleanup(mcpCloseAll)
tools := mcpTools()
if len(tools) == 0 {
t.Fatal("aucun outil MCP découvert (le serveur s'est-il connecté ?)")
}
echoName := mcpExposedName("everything", "echo")
found := false
for _, tl := range tools {
if tl.Function.Name == echoName {
found = true
}
if !strings.HasPrefix(tl.Function.Name, "mcp__everything__") {
t.Errorf("outil mal namespacé: %s", tl.Function.Name)
}
}
if !found {
t.Fatalf("outil %s introuvable dans %d outils", echoName, len(tools))
}
out := mcpCall(echoName, map[string]any{"message": "bonjour-jean"})
if !strings.Contains(out, "bonjour-jean") {
t.Fatalf("echo n'a pas renvoyé le message ; got: %q", out)
}
}