Aller au contenu principal

Publié le 24/10/25

Au-delà du prompt, comment le protocole MCP augmente nos interactions avec les LLMs

Nicolas Gras
Nicolas Gras
Tech Lead
20 minutes
Partager :

Tech Lead chez Arneo, je suis constamment à la recherche des innovations qui peuvent non seulement optimiser nos processus, mais aussi débloquer de nouvelles capacités pour nos produits.

Aujourd'hui, je veux vous parler d'une technologie qui, correctement configurée et maitrisée, peut augmenter de manière significative l'automatisation de certains processus et nous faire gagner en productivité : le Model Context Protocol (MCP).

Les modèles de langage (LLM) comme GPT, Claude ou Llama sont incroyablement puissants. Cependant, ils souffrent de limitations majeures qui nous freinent au quotidien...

Article Protocole MCP - Header

Les limitations

  • Une connaissance figée dans le temps
    01
  • Un manque de contexte métier
    02
  • Des intégrations complexes et non standardisées
    03

Le MCP : un protocole pour les gouverner tous

Le MCP (Model Context Protocol) est un protocole ouvert et universel qui standardise la manière dont les applications fournissent des informations de contexte aux LLM.

Pour faire simple, imaginez le MCP comme une passerelle entre vos LLMs et vos données. De la même manière que le protocole HTTP permet à n'importe quel navigateur de communiquer avec n'importe quel serveur web, le protocole MCP permet à n'importe quel LLM de se connecter à diverses sources de données et outils de façon standardisée.

 

L'approche Function Calling (natif)

Idéal pour...

Actions simples et directes, intégration rapide.

Limites

Spécifique à un modèle (OpenAI, Google), moins interopérable.

L'approche RAG

Idéal pour...

Enrichir le contexte avec des documents, répondre à des questions sur une base de connaissances.

Limites

N'effectue pas d'actions, se concentre sur l'apport d'information.

L'approche MCP

Idéal pour...

Standardiser l'action et l'accès aux données sur de multiples outils et modèles.

Limites

Courbe d'apprentissage, nécessite de maintenir des serveurs dédiés.

MCP vs. les autres approches : Choisir le bon outil pour le bon travail

  • Le Serveur MCP :

      C'est un programme qui expose des "outils" et un accès à des données. Il peut tourner en local sur un poste de développeur ou être déployé sur un serveur distant. C'est lui qui sait comment interroger notre base de données produits ou lire un fichier sur un disque spécifique.

    • Le Client MCP :

        Intégré au LLM, il sert de pont. Il reçoit les requêtes du modèle et les transmet au bon serveur MCP.

      • L'Hôte MCP :

          C'est l'application que l'utilisateur final manipule, comme un IDE (ex: VSCode, Claude Code, etc...), une application de bureau (ex: Claude Desktop) ou notre propre application métier.

          Le client et l'hôte sont généralement intégrés au sein de la même application comme le montre le schéma ce schéma de fonctionnement du protocole MCP.

        Composants d'un serveur MCP

        Un serveur MCP est constitué des éléments suivants :

        Resources

        Ce sont des ensembles de données statiques (fichiers, schémas de base de données) que le serveur met à la disposition du modèle pour fournir un contexte. Leur utilisation est contrôlée par l'application cliente. L'application (par exemple, un IDE) décide comment et quand utiliser ces ressources. Elle peut les afficher à l'utilisateur sous forme d'une arborescence de fichiers pour qu'il les sélectionne manuellement, ou les inclure automatiquement dans le contexte en fonction de ses propres heuristiques. Chaque ressource est identifiée par un URI unique, et un serveur doit explicitement déclarer sa capacité à fournir des ressources

        Prompts

        Les prompts sont des modèles de commandes réutilisables, conçus pour être explicitement déclenchés par l'utilisateur. Pensez-y comme des raccourcis ou des commandes slash (par exemple, /expliquer_le_code ). L'utilisation des prompts est contrôlée par l'utilisateur.

        Tools

        Les outils sont des fonctions exécutables qui permettent au modèle d'interagir activement avec des systèmes externes (appeler une API, interroger une base de données). Contrairement aux prompts, leur utilisation est contrôlée par le modèle (LLM). Le serveur définit un outil avec un nom et un schéma d'entrée (les arguments attendus). Il est possible d'utiliser une spécification OpenAPI pour créer automatiquement les tools utilisables par le LLM (nous allons voir ca dans la prochaine partie).

        Sampling

        Le sampling permet à un serveur MCP de demander à son tour une complétion (une "réflexion") au modèle d'IA du client. Il s'agit d'une fonctionnalité côté client qui inverse les rôles. Un serveur, en exécutant un outil, peut avoir besoin de l'intelligence du LLM pour une sous-tâche. Il peut alors envoyer une requête de "sampling" au client. Cela permet de créer des agents complexes et des comportements en chaîne, où un outil peut lui-même faire appel au LLM pour affiner son résultat. L'avantage majeur est que le serveur n'a pas besoin de ses propres clés d'API pour le LLM ; il s'appuie sur la capacité du client, qui conserve le plein contrôle sur les accès au modèle

        Roots

        Les roots définissent un périmètre de sécurité en indiquant au serveur les répertoires du système de fichiers auxquels il est autorisé à accéder. Il s'agit d'une fonctionnalité côté client qui agit comme un "bac à sable" (sandbox). Le client expose une liste de répertoires racines (par exemple, le dossier du projet en cours) au serveur. Le serveur peut alors demander cette liste pour savoir où il a le droit d'opérer, empêchant ainsi un accès non autorisé à des fichiers sensibles en dehors du périmètre défini. Chaque racine est définie par un URI, qui doit être de type file:// selon la spécification actuelle.

        L'Elicitation

        C'est une nouvelle fonctionnalité du Model Context Protocol (MCP) qui permet à un serveur de demander de manière standardisée des informations supplémentaires à l'utilisateur via l'interface du client. Son objectif principal est de créer des flux de travail interactifs où un serveur, en cours d'exécution d'une tâche, peut se rendre compte qu'il lui manque une information et la demander dynamiquement, sans interrompre brutalement le processus.

        Transports

        Voir ci dessous

        Article MCP - illustration

        Protocoles de transport

        On distingue en 2025 trois grands types de transport pour le MCP : 

        • STDIO
        • SSE (déprécié)
        • Streamable HTTP

        Tous ont leurs avantages et inconvénients. Il faut noter que le SSE est en dépréciation pour être remplacer par le streamable HTTP. Voici un tableau comparatif entre STDIO et Streamable HTTP pour vous aider à choisir quel protocole implémenter dans vos serveurs MCP :

        Type de communication

        STDIO (Standard Input/Output)

        Locale, inter-processus (IPC)

        Streamable HTTP

        Réseau, client-serveur (HTTP)

        Cas d'usage principal

        STDIO (Standard Input/Output)

        Outils en ligne de commande, plugins IDE, scripts locaux 

        Streamable HTTP

        Applications web, API distantes, serveurs multi-clients

        Scalabilité

        STDIO (Standard Input/Output)

        Limitée à une seule machine

        Streamable HTTP

        Élevée, conçue pour les architectures distribuées

        Gestion de session

        STDIO (Standard Input/Output)

        Inhérente au processus (pas de gestion explicite)

        Streamable HTTP

        Gérée via des en-têtes HTTP (Mcp-Session-Id)

        Streaming

        STDIO (Standard Input/Output)

        Le flux de sortie est naturellement un stream 

        Streamable HTTP

        Géré via Server-Sent Events (SSE) de manière optionnelle

        Complexité de mise en oeuvre

        STDIO (Standard Input/Output)

        Faible

        Streamable HTTP

        Moyenne (gestion des endpoints HTTP, sécurité)

        Considérations de sécurité

        STDIO (Standard Input/Output)

        Moins de préoccupations (confiné localement)

        Streamable HTTP

        Critiques : HTTPS, validation d'origine (DNS rebinding), authentification

        Statut actuel

        STDIO (Standard Input/Output)

        Standard pour les intégrations locales

        Streamable HTTP

        Standard moderne pour les intégrations

        Pour résumer :

        • STDIO est la solution pour les outils qui tournent localement et qui doivent interagir avec l'environnement immédiat de l'utilisateur.
        • Streamable HTTP est la norme pour toute application nécessitant une communication réseau, offrant la robustesse, la flexibilité et la scalabilité requises pour des services web modernes

        La spécification MCP évoluant rapidement, d'autres protocoles de transport pourront voir le jour.

        Un des enjeux majeurs du MCP aujourd'hui est la sécurisation de ces serveurs. Il est fortement recommandé de prendre en compte ces enjeux dès la conception initiale de votre MCP, afin d'éviter les fuites de données vers l'extérieur ou les attaques malveillantes sur vos données sensibles.

        Cas d'usage du MCP chez Arneo

        Le MCP Figma pour fluidifer le travail entre designers et développeurs

        La friction actuelle

        Aujourd'hui, le passage de la maquette au code est une source de frictions et de tâches répétitives : le développeur doit constamment inspecter les maquettes pour extraire les spécifications (couleurs, polices, espacements), exporter manuellement les assets, et vérifier que son implémentation est conforme au design. C'est lent, et source d'erreurs.

        La solution MCP : Un serveur pour Figma

        Imaginons un serveur MCP pour Figma. Ce serveur, connecté à l'API de Figma, exposerait des "outils" permettant au modèle d'IA d'interagir directement avec nos fichiers de design.

        Scénario : Le développeur dans son IDE et accès à la maquette Figma

        Un développeur travaille sur un nouveau composant "CarteUtilisateur". Directement dans son IDE, il peut demander à son assistant IA :

        "Génère ma sélection en composant en <insérer son framework préféré>"

        Comment ça marche ?

        1. L'IA, via le client MCP, interroge le serveur MCP Figma.
        2. Elle utilise l'outil get_code pour générer le code du composant associé
        3. Un composant est créé dans l'IDE du développeur

        Bénéfices

        • Support multi-frameworks : Un designer crée un composant une seule fois. Le MCP permet de générer le code pour React, Vue, Svelte, etc., sans effort supplémentaire.
        • Accélération radicale : Le développeur ne perd plus de temps à "traduire" le design en code. Il peut se concentrer sur la logique métier, l'accessibilité et les interactions complexes.
        • Maintenance simplifiée : Quand un designer met à jour un composant dans Figma, le développeur peut simplement demander à l'IA de le régénérer, assurant que les changements sont répercutés instantanément et sans erreur.

        Attention, sur ce cas d'usage, le contrôle humain de la production est de rigueur car le MCP de Figma est encore en open beta.

         

        L'assistant surpuissant pour le développement (Jira + Gitlab)

        Le "travail à-côté" du développement

        Un développeur passe une part non négligeable de son temps à faire autre chose que coder : créer des branches, mettre à jour des tickets Jira, rédiger des messages de commit, créer des Merge Requests... Ces tâches, bien qu'essentielles, sont chronophages et fragmentent sa concentration.

        La solution MCP : Des serveurs pour chaque outil, un assistant unique

        Ici, la magie du MCP opère en combinant plusieurs serveurs : un serveur MCP pour Jira et un serveur MCP pour GitLab. L'IA peut alors orchestrer des actions sur les deux plateformes.

        Que s'est-il passé ?

        En une seule commande, l'assistant a :

        1. Interrogé le serveur Jira pour obtenir les détails du ticket.
        2. Mis à jour le statut du ticket à "In Progress".
        3. Interrogé le serveur GitLab pour créer une nouvelle branche avec un nom standardisé.
        4. À la fin du travail, il a créé un commit respectant nos conventions, poussé le code, créé la Merge Request, et posté le lien de la MR en commentaire sur le ticket Jira avant de le passer en "In Review".

        Bénéfices :

        • Productivité décuplée : Le développeur reste focalisé sur le code. Le "travail à-côté" est entièrement automatisé.
        • Qualité et standardisation : Les conventions (nom de branche, message de commit) sont appliquées automatiquement. Plus d'oublis de mise à jour de ticket.
        • Bien-être des développeurs : Réduction de la charge mentale et de la frustration liées aux processus.
        Article MCP - Illustration Cas d'usage

        Cas pratique : créer un serveur MCP rapidement

        Article MCP - Illustration 3

        Passons à la pratique : on va créer rapidement un serveur MCP. Pour cela on va imaginer que je travaille dans un cabinet comptable et que je dois gérer des flux d'argent entrants et sortants via un logiciel comptable à double entrée open source : Firefly III.

        Nous allons utiliser python 3.12.x, uv (gestion des dépendances), ainsi que le framework FastMCP 2.0 pour créer un serveur MCP.

        Initialisation du projet

        Nous allons assumer que python 3.12.x est installé. Si uv n'est pas installé, les étapes d'installation sont ici : https://docs.astral.sh/uv/getting-started/installation/.

        Pourquoi uv ? Voir schéma ci-dessus.

        Une fois installé, il suffit de lancer la commande suivante pour créer le projet :

        uv init firefly-mcp
        cd firefly-mcp

        Si vous voulez en savoir plus sur uv et son fonctionnement, explorez la documentation.

        Ensuite, nous allons installer FastMCP.

        Attention : il existe 2 versions distinctes de FastMCP : https://github.com/jlowin/fastmcp et https://github.com/modelcontextprotocol/python-sdk

        Nous allons partir sur FastMCP 2.x, car il offre des fonctionnalités supplémentaires par rapport à la version 1.0.

        On ajoute la dépendence au projet :

        uv add fastmcp
        ### check de la version
        fastmcp version
        ### output (peut varier)
        FastMCP version: 2.9.2
        MCP version: 1.9.4
        Python version: 3.12.9
        Platform: <platform>
        FastMCP root path: <root-path>

         

        De la même manière, on utilisera ces autres packages dans notre serveur MCP :

        • pyyaml
        • asyncio
        • httpx
        • Pour la version de développement, nous allons aussi créer un fichier .env avec ces 2 variables (il vous faut une instance fonctionnelle de Firefly III):
        • FIREFLY_III_URL=https://your-firefly-url.com
        • FIREFLY_III_ACCESS_TOKEN=ey....

        Pour créer l'access token, allez voir dans la documentation de Firefly III : https://docs.firefly-iii.org/how-to/firefly-iii/features/api/

        Pour des raisons de simplicité, nous utilisons seulement un Personal Access Token.

        Ensuite, téléchargeons la spécification OpenAPI de Firefly III et stockons la localement dans le projet. Récupérons la spécification à cette adresse : https://api-docs.firefly-iii.org/firefly-iii-6.2.13-v1.yaml (la version peut changer, récupérez la bonne version qui correspond à votre instance).

        Voici une architecture du serveur et son fonctionnement que nous allons mettre en place :

        Article MCP - Illustration 4

        Maintenant, armez vous de votre IDE préféré et commençons l'implémentation de notre serveur.

        Pour des raisons de simplicité, nous écrirons notre code dans le fichier main.py. Voici le fichier final avec l'explication bloc par bloc du code :

        import os
        import yaml
        import asyncio
        import httpx
        from fastmcp import FastMCP
        # On commence par charger et parser la spécification OpenAPI de Firefly III.
        with open("./firefly-iii-openapi.yaml", "r") as f:
        openapi_spec = yaml.safe_load(f)
        # On créé un client HTTP async authentifié pour communiquer avec notre instance de Firefly III.
        client = httpx.AsyncClient(base_url=os.environ["FIREFLY_III_URL"], headers={"Authorization": "Bearer " + os.environ["FIREFLY_III_ACCESS_TOKEN"]})
        # C'est la que la magie opère avec FastMCP. On instancie un serveur MCP en passant directement la spécification OpenAPI chargée plus haut et en utilisant notre client httpx.
        mcp = FastMCP.from_openapi(name="Firefly III MCP server", openapi_spec=openapi_spec, client=client)
        # On peut définir nos prompts ici pour guider l'usage du serveur MCP. C'est utile quand on a beaucoup de tools
        @mcp.prompt

        def get_account_balance_prompt(account_name: str) -> str:

        """

        Generates a prompt to get the current balance of a specified account.

        """

        return f"What is the current balance of the account named '{account_name}'?"

        @mcp.prompt

        def summarize_spending_by_category_prompt(start_date: str, end_date: str) -> str:

        """

        Generates a prompt to summarize spending by category within a date range (YYYY-MM-DD).

        """

        return f"Please provide a summary of my spending by category from {start_date} to {end_date}."
        # On définit la fonction principale pour lancer le serveur en asynchrone
        async def main():
        await mcp.run_async(transport="streamable-http")

        # On run le serveur

        if __name__ == "__main__":

        asyncio.run(main())

        Nous allons ensuite lancer le serveur en développement pour l'inspecter (ouvrez l'url avec le token):

        fastmcp dev main.py
        # output

        [07/08/25 12:39:45] INFO Created FastMCP OpenAPI server with 219 routes openapi.py:782

        Starting MCP inspector...

        ⚙️ Proxy server listening on 127.0.0.1:6277

        🔑 Session token: <redacted>

        Use this token to authenticate requests or set DANGEROUSLY_OMIT_AUTH=true to disable auth

        🔗 Open inspector with token pre-filled:

        http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=<redacted>

        Notons le nombre "élevé" de tools créés. Le but d'un MCP n'est pas de juste de transposer une API avec tous ses endpoints disponibles (sur un nombre élevé de tools, cela peut rapidement créer des problèmes d'identification du contexte).

        Les MCPs s'illustrent en contextualisant l'usage des tools avec les prompts et les autres fonctionnalités du protocole. C'est pourquoi la définition des prompts au sein de votre MCP est aussi importante que la définition des tools disponibles. Dans le cadre de l'implémentation d'un serveur MCP de production à grande échelle, posez-vous la question de quels endpoints sont vraiment utiles et est ce que je vais gagner de la valeur dans mes processus métiers.

        En cliquant sur l'URL, nous accédons au MCP Inspector, l'outil de test du protocole, plutôt pratique pour voir comment se comporte notre serveur.

        Pour nous connecter, remplissez les 2 variables d'environnements que nous avons défini dans le .env.

        Si tout est bon, nous devrions voir le statut connected.

        Maintenant, partez explorer l'inspecteur pour tester vos tools, prompts, resources, etc...

        Déploiement

        Nous avons mis en place un serveur local, mais si nous somme plusieurs à devoir utiliser celui ci, l'idéal est de le mettre en ligne pour que les personnes qui doivent l'utiliser y ait accès.

        Nous allons créer un container léger avec l'aide de Docker pour "packager" notre serveur

        Commençons par créer un Dockerfile très simple :

        FROM python:3.12.9-slim-bookworm

        ENV PYTHONBUFFERED=1

        ENV UV_LINK_MODE=copy

        WORKDIR /app

        # The installer requires curl (and certificates) to download the release archive

        RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates

        # Download the latest installer

        ADD https://astral.sh/uv/install.sh /uv-installer.sh

        # Run the installer then remove it

        RUN sh /uv-installer.sh && rm /uv-installer.sh

        # Ensure the installed binary is on the `PATH`

        ENV PATH="/root/.local/bin/:$PATH"

        # Copy the project into the image

        COPY . ./

        RUN --mount=type=cache,target=/root/.cache/uv \

        uv sync

        CMD ["uv", "run", "main.py"]

        On build l'image :

        docker build -t mcp-firefly .

        Si l'optimisation des images est un sujet qui vous intéresse, allez voir la documentation d'uv pour optimiser l'installation des dépendances dans une image docker :

        https://docs.astral.sh/uv/guides/integration/docker/

        Une fois l'image construite, vous pouvez la pousser sur votre registre d'images Docker.

        Vous pouvez ensuite configurer votre client MCP avec cette configuration (la configuration peut légèrement différer selon votre client/hôte MCP) :

        "mcpServers": {
        "firefly": {
        "command": "docker",
        "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "FIREFLY_III_URL",
        "-e",
        "FIREFLY_III_ACCESS_TOKEN",

        // utiliser l'URL de votre registre d'images

        "<registry>/mcp-firefly"

        ],

        env: {

        "FIREFLY_III_URL": "<your-firefly-url>",

        "FIREFLY_III_ACCESS_TOKEN": "<your-secret-token>"

        }

        }

        }

        Voila, nous avons un serveur fonctionnel prêt à l'emploi. À vous d'aller creuser vos cas d'usages pour en tirer parti de la puissance qu'offre le protocole MCP

        Considérations pour un passage en production

        Adopter le MCP est une décision stratégique, mais comme pour toute technologie, le passage du prototype à la production soulève des questions cruciales :

        Sécurité et Permissions

        Comment s'assurer qu'un outil appelé par l'IA respecte les droits de l'utilisateur final ? Le serveur MCP ne doit pas être une "super-clé" donnant un accès illimité. La solution consiste à propager l'identité de l'utilisateur de l'application hôte jusqu'au serveur MCP. Celui-ci peut alors utiliser cette identité pour interroger les services externes (bases de données, API) en respectant les permissions spécifiques de cet utilisateur.

        Gestion des Secrets

        Votre serveur MCP aura besoin de ses propres secrets (clés d'API, chaînes de connexion). Il est impératif de ne jamais les coder en dur. L'utilisation d'un gestionnaire de secrets (comme HashiCorp Vault, AWS/GCP Secret Manager) est non négociable en production.

        Performance et Latence

        Oui, le MCP ajoute une couche d'abstraction et donc potentiellement de la latence. Pour la minimiser, deux règles d'or :

        1. Choisir le bon transport : stdio pour les interactions locales ultra-rapides, Streamable HTTP pour le réseau.

        2. Colocaliser les serveurs et les données : Un serveur MCP qui doit traverser l'océan pour parler à sa base de données sera un goulot d'étranglement.

        Prévention des Abus

        Un LLM peut décider d'appeler un outil en boucle. Il est essentiel d'implémenter des garde-fous côté serveur : rate limiting (limitation du nombre d'appels), et pour les actions destructrices (suppression, modification), une étape de confirmation explicite via la fonctionnalité d' Elicitation est une bonne pratique.

        Conclusion

        Nous avons vu les principaux composants d'un serveur MCP et comment rapidement en implémenter un. L'avantage de générer des tools à partir d'un spécification OpenAPI. Si le travail de génération de la spécification est pris en compte dès la conception de vos bases et services métiers, il devient alors très facile pour le MCP de générer les tools associés plutôt que de devoir les réécrire dans le serveur. Néanmoins, il ne faut pas reprendre tous les endpoints de vos services et bases de données. Prenez ceux qui font sens pour vos cas d'usages et complémentez ces tools avec des prompts adaptés.

        Adopter le MCP aujourd'hui, c'est faire un pari sur l'avenir d'un standard ouvert et interopérable, une vision que nous, en tant qu'experts de l'innovation numérique, devrions encourager. Bien sûr, comme pour tout standard émergent, son succès dépendra de son adoption par la communauté et les autres acteurs majeurs de l'IA. Mais en créant un pont standardisé entre les modèles et le monde réel, il ouvre la porte à la création d'agents et d'applications IA véritablement utiles et profondément intégrés à nos métiers. Commençons à explorer la création de nos propres serveurs MCP pour nos données clés ; c'est là que réside le véritable potentiel pour connecter les LLMs à notre valeur métier.

        D’après mes analyses

        Nos projets et notre expertise vous intéressent ? Et si nous en discutions ?