mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
Ajouter un serveur MCP demandait d'écrire soi-même `npx -y @scope/paquet …` dans la modale, en devinant le nom du paquet. Le catalogue liste une vingtaine de serveurs connus, commande déjà renseignée, classés par catégorie. - internal/loki/mcp_catalog.json est EMBARQUÉ dans le binaire (go:embed), pas interrogé sur le réseau : Loki tourne hors ligne, et rien de ce qui s'exécute sur la machine ne vient d'un annuaire distant. Pour proposer un serveur de plus : éditer le fichier et recompiler. - Choisir une entrée n'installe rien. Ça préremplit la modale d'ajout existante et l'utilisateur relit la commande avant d'enregistrer — un serveur stdio exécute un process arbitraire, au même titre que l'outil bash du mode agent. Aucune ligne de mcp_client.go n'est touchée : le catalogue s'arrête à l'affichage, tout le reste passe par l'API MCP déjà en place. - Une entrée dont le runtime manque (npx ou uvx absent) le signale dans la liste, plutôt que de laisser l'utilisateur découvrir l'échec au démarrage du serveur. - Les entrées qui réclament une clé d'API la rappellent avant l'enregistrement, au lieu d'enregistrer un serveur qui ne peut pas se connecter. - Les entrées Python publiées avant le SDK MCP 2.0 sont épinglées avec `uvx --with "mcp<2"` : sans cela elles plantent sur ImportError: McpError. - Le Dockerfile gagne uv/uvx (~35 Mo). Sans lui, 9 des 21 entrées s'affichent sans pouvoir démarrer dans le conteneur. Intensité du raisonnement (REASONING_EFFORT) L'interrupteur Raisonnement était binaire. llama-server accepte `reasoning_effort` dans /v1/chat/completions : `none` coupe le raisonnement, toute autre valeur est passée au gabarit jinja du modèle. - Nouvelle clé de preset REASONING_EFFORT — donc réglée par modèle, comme le reste du preset. Vide = on n'envoie rien et le gabarit garde son comportement. - Pas de repli à prévoir : un gabarit qui ne lit pas la valeur l'ignore sans erreur. En pratique seuls gpt-oss et apparentés changent de comportement, et le sous-titre du réglage le dit — promettre un effet universel serait faux. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
263 lines
9.6 KiB
JSON
263 lines
9.6 KiB
JSON
{
|
|
"version": 1,
|
|
"note": "Catalogue MCP embarqué (hors ligne, aucun annuaire distant). Éditable à la main : ajoute une entrée pour la proposer dans l'interface, puis relance le build. Le jeton {workspace} est remplacé par le dossier de travail de l'agent. Les entrées « uvx --with mcp<2 … » visent des serveurs publiés avant le SDK MCP 2.0 : sans cet épinglage, ils plantent au démarrage (ImportError McpError).",
|
|
"servers": [
|
|
{
|
|
"id": "filesystem",
|
|
"name": "Filesystem",
|
|
"category": "Fichiers",
|
|
"description": "Lecture, écriture et recherche de fichiers, limitées aux dossiers passés en argument.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-filesystem", "{workspace}"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "git",
|
|
"name": "Git",
|
|
"category": "Code",
|
|
"description": "Historique, diff et statut d'un dépôt Git ; commits et branches.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers/tree/main/src/git",
|
|
"runtime": "python",
|
|
"command": "uvx",
|
|
"args": ["mcp-server-git", "--repository", "{workspace}"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "fetch",
|
|
"name": "Fetch",
|
|
"category": "Web",
|
|
"description": "Télécharge une URL et la convertit en Markdown pour le modèle.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers/tree/main/src/fetch",
|
|
"runtime": "python",
|
|
"command": "uvx",
|
|
"args": ["--with", "mcp<2", "mcp-server-fetch"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "memory",
|
|
"name": "Memory",
|
|
"category": "Agent",
|
|
"description": "Mémoire sous forme de graphe de connaissances (entités, relations, observations).",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers/tree/main/src/memory",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-memory"],
|
|
"env": { "MEMORY_FILE_PATH": "{workspace}/mcp-memory.json" },
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "sequential-thinking",
|
|
"name": "Sequential Thinking",
|
|
"category": "Agent",
|
|
"description": "Structure le raisonnement en étapes révisables. Utile aux petits modèles locaux.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "time",
|
|
"name": "Time",
|
|
"category": "Utilitaires",
|
|
"description": "Heure courante et conversions de fuseaux horaires.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers/tree/main/src/time",
|
|
"runtime": "python",
|
|
"command": "uvx",
|
|
"args": ["--with", "mcp<2", "mcp-server-time"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "sqlite",
|
|
"name": "SQLite",
|
|
"category": "Données",
|
|
"description": "Interroge et modifie une base SQLite locale.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers-archived/tree/main/src/sqlite",
|
|
"runtime": "python",
|
|
"command": "uvx",
|
|
"args": ["--with", "mcp<2", "mcp-server-sqlite", "--db-path", "{workspace}/agent.db"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "everything",
|
|
"name": "Everything (test)",
|
|
"category": "Utilitaires",
|
|
"description": "Serveur de référence exposant toutes les primitives MCP. Sert à vérifier l'intégration.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers/tree/main/src/everything",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-everything"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "duckduckgo",
|
|
"name": "DuckDuckGo",
|
|
"category": "Web",
|
|
"description": "Recherche web via DuckDuckGo, sans clé d'API.",
|
|
"homepage": "https://pypi.org/project/duckduckgo-mcp-server/",
|
|
"runtime": "python",
|
|
"command": "uvx",
|
|
"args": ["duckduckgo-mcp-server"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "playwright",
|
|
"name": "Playwright",
|
|
"category": "Web",
|
|
"description": "Pilote un navigateur (navigation, clics, formulaires) via l'arbre d'accessibilité.",
|
|
"homepage": "https://github.com/microsoft/playwright-mcp",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@playwright/mcp@latest", "--headless"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "puppeteer",
|
|
"name": "Puppeteer",
|
|
"category": "Web",
|
|
"description": "Automatisation d'un Chrome sans interface (alternative à Playwright).",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers-archived/tree/main/src/puppeteer",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-puppeteer"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "context7",
|
|
"name": "Context7",
|
|
"category": "Code",
|
|
"description": "Documentation à jour des bibliothèques, injectée directement dans le contexte.",
|
|
"homepage": "https://github.com/upstash/context7",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@upstash/context7-mcp"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "github",
|
|
"name": "GitHub",
|
|
"category": "Code",
|
|
"description": "Dépôts, issues et pull requests via l'API GitHub. Nécessite un jeton personnel.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers-archived/tree/main/src/github",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-github"],
|
|
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "" },
|
|
"secrets": ["GITHUB_PERSONAL_ACCESS_TOKEN"]
|
|
},
|
|
{
|
|
"id": "postgres",
|
|
"name": "PostgreSQL",
|
|
"category": "Données",
|
|
"description": "Requêtes SQL en lecture seule et inspection du schéma d'une base PostgreSQL.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers-archived/tree/main/src/postgres",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": [
|
|
"-y",
|
|
"@modelcontextprotocol/server-postgres",
|
|
"postgresql://utilisateur:motdepasse@hote:5432/base"
|
|
],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "docker",
|
|
"name": "Docker",
|
|
"category": "Infra",
|
|
"description": "Gère conteneurs et stacks compose. Nécessite l'accès au socket Docker.",
|
|
"homepage": "https://pypi.org/project/docker-mcp/",
|
|
"runtime": "python",
|
|
"command": "uvx",
|
|
"args": ["--with", "mcp<2", "docker-mcp"],
|
|
"env": {},
|
|
"secrets": []
|
|
},
|
|
{
|
|
"id": "brave-search",
|
|
"name": "Brave Search",
|
|
"category": "Web",
|
|
"description": "Recherche web et locale via l'API Brave. Nécessite une clé d'API.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers-archived/tree/main/src/brave-search",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
|
|
"env": { "BRAVE_API_KEY": "" },
|
|
"secrets": ["BRAVE_API_KEY"]
|
|
},
|
|
{
|
|
"id": "firecrawl",
|
|
"name": "Firecrawl",
|
|
"category": "Web",
|
|
"description": "Scraping et crawl de sites avec extraction structurée. Nécessite une clé d'API.",
|
|
"homepage": "https://github.com/firecrawl/firecrawl-mcp-server",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "firecrawl-mcp"],
|
|
"env": { "FIRECRAWL_API_KEY": "" },
|
|
"secrets": ["FIRECRAWL_API_KEY"]
|
|
},
|
|
{
|
|
"id": "notion",
|
|
"name": "Notion",
|
|
"category": "Productivité",
|
|
"description": "Lecture et écriture de pages et bases Notion. Nécessite un jeton d'intégration.",
|
|
"homepage": "https://github.com/makenotion/notion-mcp-server",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@notionhq/notion-mcp-server"],
|
|
"env": { "NOTION_TOKEN": "" },
|
|
"secrets": ["NOTION_TOKEN"]
|
|
},
|
|
{
|
|
"id": "slack",
|
|
"name": "Slack",
|
|
"category": "Productivité",
|
|
"description": "Lecture des canaux et envoi de messages Slack. Nécessite un jeton de bot.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers-archived/tree/main/src/slack",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-slack"],
|
|
"env": { "SLACK_BOT_TOKEN": "", "SLACK_TEAM_ID": "" },
|
|
"secrets": ["SLACK_BOT_TOKEN"]
|
|
},
|
|
{
|
|
"id": "google-maps",
|
|
"name": "Google Maps",
|
|
"category": "Utilitaires",
|
|
"description": "Géocodage, itinéraires et recherche de lieux. Nécessite une clé d'API.",
|
|
"homepage": "https://github.com/modelcontextprotocol/servers-archived/tree/main/src/google-maps",
|
|
"runtime": "node",
|
|
"command": "npx",
|
|
"args": ["-y", "@modelcontextprotocol/server-google-maps"],
|
|
"env": { "GOOGLE_MAPS_API_KEY": "" },
|
|
"secrets": ["GOOGLE_MAPS_API_KEY"]
|
|
},
|
|
{
|
|
"id": "sentry",
|
|
"name": "Sentry",
|
|
"category": "Infra",
|
|
"description": "Récupère les issues et traces d'erreur d'un projet Sentry.",
|
|
"homepage": "https://pypi.org/project/mcp-server-sentry/",
|
|
"runtime": "python",
|
|
"command": "uvx",
|
|
"args": ["--with", "mcp<2", "mcp-server-sentry", "--auth-token", "REMPLACE_MOI"],
|
|
"env": {},
|
|
"secrets": []
|
|
}
|
|
]
|
|
}
|