Agent IA, serveur MCP

Bonjour à tous,

Ces dernières années on a vu passer une grosse vague sur l’IA et plus récemment on parle de plus en plus des agents IA, on est d’ailleurs surement nombreux à en avoir déjà utilisé.

Je suis entré dans l’univers des serveurs MCP et je me disais que ça serait bien utile d’en avoir un directement dans Gladys. Pour ceux qui ne connaissent pas, MCP c’est pour Model Context Protocol, c’est un protocole imaginé par Anthropic, ceux qui sont derrière les modèles Claude. Il permet d’exposer des outils et fonctions que les agents peuvent appeler pour avoir des informations supplémentaires ou interagir avec des appareils du monde réels. C’est un protocole ouvert, la plupart des grands noms du domaine ont commencé à l’implémenter après Anthropic dont OpenAI, et dernièrement c’est Perplexity.

J’ai développé une première version du service qui fait office de serveur. Il permet pour l’instant de :

  • récupérer les valeurs des capteurs (température, humidité, ouverture…)
  • regarder les caméras, je ne suis pas sur que ce soit possible d’afficher dans le chat agent l’image de la caméra mais selon les capacités du modèle utilisé, il peut vous décrire ce qu’il voit
  • allumer/éteindre les lumières d’une pièce

Je vous laisse voir la démonstration dans mon environnement de dev (les températures ne sont pas forcément pertinentes, ainsi que les caméras qui sont des caméras publiques).

Dans la démo, j’utilise l’agent associé à Github Copilot dans VSCode mais normalement si vous avec Claude ou un autre agent compatible MCP sur votre ordinateur ça devrait fonctionner.

Il faut encore améliorer les fonctions exposées je pense, mais ça me semble déjà pas mal et on peut imaginer pas mal de choses, il faut aussi surement mettre plus de sécurité pour authentifier l’agent qui se connecte.

La PR est là

Dans les prochaines heures une image docker sera disponible bertrandda/gladys:mcp-server

Pour l’instant c’est uniquement le backend donc rien de visible dans la liste des services. Pour tester vous pouvez utiliser la route /api/v1/service/mcp/proxy dans la configuration de votre agent. Attention la route n’est pas sécurisée donc ne testez pas si votre machine que vous utilisez pour faire tourner Gladys est exposée à internet.

N’hésitez pas à tester et dire ce que vous en pensez.

13 « J'aime »

Je n’y connais pas grand chose à la technicité de tout ça, mais je trouve la démo vidéo très interessante !!

3 « J'aime »

Bonjour @bertrandda

J’avoue être vraiment bluffé par la démo :heart_eyes: Superbe boulot :slight_smile:

Je suis (AHMA comme plein d’autres ici …) très intéressé par plus d’informations techniques, par exemple le matériel utilisé, ou encore comment interconnecter Gladys et le serveur MCP.

Pourrait-on également imaginer remplacer le prompt manuel par une solution STT, car j’implémente déjà une solution audio « maison » chez moi qui supporte le multi-room, avec Gladys qui me répond, et on est là pas très loin de pouvoir arriver à discuter naturellement avec Gladys :+1:

3 « J'aime »

Très content qu’il y ai autant d’intérêt pour ce travail !

Pour expliquer un peu plus, voici un schéma d’un ensemble fonctionnant avec le protocole MCP

Donc il y a le host qui contient le client MCP aujourd’hui ce sont souvent des agents bien connu Claude desktop, ChatGPT… qui intègrent ce client. Comme je disais, dans la vidéo démo au dessus, c’est l’agent présent dans VSCode avec Github Copilot.
Son travaille va être d’un côté de discuter avec le llm (souvent Claude Sonnet ou GPT-4) qui s’occupera de comprendre les demandes et analyser des données et de l’autre avec le serveur MCP.

Le serveur MCP s’occupe de déclarer des fonctions que le MCP client peut appeler pour interagir avec la ressource (dans notre cas la ressource c’est Gladys, mais ça peut être une base de données, Google Drive, Slack… n’importe quel outil local ou à distance).Dans notre cas pour l’instant 4 fonctions:

  • device.get-state pour obtenir les données de capteurs
  • camera.get-image pour récupérer les images de caméra
  • light.turn-(on|off) pour allumer/éteindre les lumières d’une pièce
  • scene.start pour lancer une scène

Maintenant si on regarde plus précisément tout en restant simple le fonctionnement de la partie host, quand on utilise par exemple Claude Desktop, voilà ce qui va être fait :

  • Au démarrage, Claude Desktop va demander à tous les serveurs MCP auxquels il est connecté les fonctions disponibles que chacun propose (dans notre cas device.get-state, camera.get-image…)
  • Quand l’utilisateur demandes à Claude Desktop quelque chose (disons « Donne moi la température du salon ») il va envoyer au llm la question en précisant dans le contexte de la requête, qu’il a accès à plusieurs fonctions et que si la demande de l’utilisateur le nécessite on peut faire un appel à ces fonctions
  • Le llm répond à Claude Desktop, « j’ai besoin que tu utilises device.get-state avec en paramètre la pièce salon »
  • Claude Desktop appel la fonction du serveur MCP de Gladys device.get-state(salon) et renvoi la donnée demandée au llm
  • le llm construit la réponse avec cette nouvelle donnée et la renvoi à Claude Desktop qui te l’affiche

Il faut bien comprendre que ce n’est pas Gladys qui répond ici, Gladys ne fait que retourner un état et le llm construit la réponse. Je ne sais pas si tu utilises Google Home, Homekit/Siri ou Amazon Alexa avec Gladys mais je pense qu’on peut peut faire un parallèle pour bien comprendre. On a un service Gladys qui expose des appareils au travers d’un protocole, et le client Claude Desktop (qu’on pourrait comparer à l’app Google Home, Apple Maison ou même Siri) fait des requêtes à ce service pour avoir des informations. L’avantage par rapport à ces solutions propriétaires, c’est que le MCP est un protocole ouvert et implémentable par n’importe qui (que ce soit client ou serveur). Donc pour répondre à ta question :

on peut très bien imaginer un client MCP, intégré avec un modèle STT (que ce soit cloud ou local) et communiquant avec Gladys via MCP.

Pour répondre à ton autre question :

Réponse courte le serveur MCP est déjà intégré dans Gladys via le service que j’ai développé, la connexion que tu vas devoir réaliser c’est entre l’agent/client MCP et le serveur MCP (cf tuto à la fin de ce post).
La réponse longue va être un peu technique mais pour expliquer au mieux le choix d’en faire un service et comprendre les tutoriels en dessous, c’est intéressant.
Pour la connexion entre le MCP client et le MCP serveur on a 2 moyens de communication possible :

  • soit en stdio (standart input/output)
  • soit en HTTP (via le réseau)
    Le stdio est la moyen de communication original du MCP, le MCP client va lancer un sous-process qui fait tourner le serveur et écouter les entrées/sorties du process (en schématisant beaucoup c’est comme s’il avait un clavier pour écrire et lisait les logs du terminal pour communiquer). Il y a plus d’agents compatibles qu’avec le http mais le serveur devant tourner sur la même machine que l’agent, ça implique de développer et gérer un nouveau projet en parallèle de Gladys.
    Le HTTP ça permet de faire communiquer le client MCP et le serveur MCP via le réseau quand ils ne sont pas sur la même machine. Ça donne la possibilité de regrouper le serveur MCP et la ressource au même endroit. Intégrer le serveur MCP dans un service Gladys a plusieurs avantages
  • au niveau du code, c’est ce qui m’a semblé le plus simple, pour avoir accès facilement à toutes les données et fonctions de Gladys
  • au niveau structure du projet, ça évite d’avoir à maintenir un deuxième projet MCP-serveur-Gladys en plus de Gladys
  • si un jour les clients MCP sortent sur téléphones (ou enceintes comme tu demandes), il y a des chances que ça se fasse en HTTP car installer un serveur MCP sur ce genre de appareils sera forcément plus compliqué
  • si l’agent que vous utilisez n’est pas compatible MCP via HTTP vous pouvez utiliser mcp-proxy qui s’occupe de faire une passerelle entre stdio et HTTP (je vous explique ci dessous comment l’utiliser).

Pour les tutoriels de connexions, voilà quelques explications pour VSCode (directement en HTTP), Claude Desktop et Perplexity (utilisation du mcp-proxy car Claude Desktop et Perplexity sont aujourd’hui uniquement compatible stdio). Si vous avez d’autres agents, on peut voir ça ensemble.


VSCode avec GitHub Copilot

Vous lancez le Chat Copilot.
En bas sélectionnez bien Agent puis cliquez sur la clé à molette

Dans la liste déroulante qui s’ouvre, tout en bas choisissez « Add more Tools… »

« Add MCP Server »

« HTTP »

Enfin entrez cette url http://GLADYS_IP_ADDRESS/api/v1/service/mcp/proxy en remplaçant GLADYS_IP_ADDRESS par l’adresse IP de votre Gladys.
Choisissez un nom et c’est parti vous devriez pouvoir utiliser dans votre Agent Copilot

Pour plus d’informations : Use MCP servers in VS Code


Claude Desktop et Perplexity ne prennent pas encore en charge les serveurs MCP (ils ont bien annoncé la prise en charge prochainement), il est donc nécessaire de passer par mcp-proxy

Pour l’installation tout est indiqué ici GitHub - sparfenyuk/mcp-proxy: A bridge between Streamable HTTP and stdio MCP transports

Claude Desktop

Une fois mcp-proxy installé, démarrez Claude Desktop
Dans Paramètres → Développeur → MCP Locaux cliquez sur « Modifier la Config »
Dans un éditeur de texte modifiez le fichier claude_desktop_config.json pour qu’il ressemble à

{
    "mcpServers": {
        "mcp-proxy": {
            "command": "FULL_PATH/mcp-proxy",
            "args": [
                "http://GLADYS_IP_ADDRESS/api/v1/service/mcp/proxy",
                "--transport",
                "streamablehttp"
            ],
            "env": {}
        }
    }
}

Pour trouver FULL_PATH, dans un terminal de commande tapez where mcp-proxy (sur macOS/Linux, pour Windows tappez where.exe mcp-proxy) et remplacez FULL_PATH par le chemin obtenu.

Remplacez également GLADYS_IP_ADDRESS par l’IP de votre Gladys

Sauvegardez la configuration puis redémarrez Claude, si tout s’est bien passé vous devriez pouvoir accéder aux fonctions MCP dans le chat

Perplexity

Une fois mcp-proxy installé, démarrez Perplexity
Dans Paramètres → Connecteurs → Ajouter un connecteur
Sélectionnez l’onglet « Avancé »
Donnez un nom « Gladys »

Modifiez la config pour qu’elle ressemble à

{
  "args" : [
    "http://GLADYS_IP_ADDRESS/api/v1/service/mcp/proxy",
    "--transport",
    "streamablehttp"
  ],
  "command" : "FULL_PATH/mcp-proxy",
  "env" : {}
}

Pour trouver FULL_PATH, dans un terminal de commande tapez where mcp-proxy (sur macOS/Linux, pour Windows tappez where.exe mcp-proxy) et remplacez FULL_PATH par le chemin obtenu.

Remplacez également GLADYS_IP_ADDRESS par l’IP de votre Gladys

Sauvegardez la configuration puis attendez que Perplexity détecte correctement toutes les fonctions, si tout s’est bien passé vous devriez pouvoir accéder aux fonctions MCP dans le chat.

Pour plus d’informations : https://www.perplexity.ai/help-center/en/articles/11502712-local-and-remote-mcps-for-perplexity


Voilà j’ai essayé d’être le plus complet et le plus clair possible, j’espère que ça a répondu à tes questions. Même si le protocole a déjà quelques mois, il en est encore à ses débuts, c’est très prometteur en particulier en voyant tous les géants de l’IA l’implémenter. Donc si la configuration de la connexion vous semble compliquée, n’hésitez pas à demander de l’aide et ça permettra d’améliorer les tutoriels selon les retours utilisateurs.

6 « J'aime »

Salut @bertrandda , ta démo est vraiment très instructive et les résultats sont vraiment top !
Et comme j’aime bien bidouiller, je suis en train de tester ton image docker bertrandda/gladys:mcp-server mais mon VSCode (de base) me dit ceci quand je demande la température de mon dyson :

Je vois que vous utilisez Gladys (système domotique) avec une configuration sur http://192.168.xxx.yyy/api/v1/service/mcp/proxy. Cependant, je ne peux pas directement accéder à la température de votre Dyson car :

Je n’ai que le fichier de configuration mcp.json qui montre l’URL du serveur
Je n’ai pas les autorisations nécessaires pour interroger l’API de Gladys
Je ne sais pas si votre Dyson est configuré dans Gladys
Pour obtenir la température de votre Dyson, vous pouvez :

Consulter l’interface web de Gladys directement sur http://192.168.xxx.yyy
Utiliser l’application Dyson officielle sur votre téléphone
Accéder à l’API Gladys avec les bonnes autorisations
Je ne peux pas lire ces informations à partir du seul fichier de configuration que je vois.

Bref n’étant pas dev, je sèche… Si tu as un tips je suis preneur :slight_smile:

EDIT : mon mcp.json si ça aide

{
	"servers": {
		"github": {
			"type": "http",
			"url": "https://api.githubcopilot.com/mcp/",
			"gallery": true
		},
		"gladys-mcp": {
			"url": "http://192.168.xxx.yyy/api/v1/service/mcp/proxy",
			"type": "http"
		}
	},
	"inputs": []
}

EDIT 2 : j’ai l’impression que la communication n’est pas bonne …?

2025-08-03 20:56:51.000 [info] Starting server gladys-mcp
2025-08-03 20:56:51.004 [info] Connection state: Starting
2025-08-03 20:56:51.029 [info] Starting server from LocalProcess extension host
2025-08-03 20:56:51.032 [info] Connection state: Running
2025-08-03 20:56:51.164 [info] Connection state: Error Error sending message to http://192.168.xxx.yyy/api/v1/service/mcp/proxy: TypeError: fetch failed
2025-08-03 20:56:51.165 [error] Server exited before responding to `initialize` request.

Il faut le port dans avec l’IP ? Sur mon Gladys de test c’est 8001
OK il faut mettre le port ! mais j’ai encore une petite erreur semble-t’il.

2025-08-03 21:01:41.138 [info] Starting server gladys-mcp
2025-08-03 21:01:41.140 [info] Connection state: Starting
2025-08-03 21:01:41.151 [info] Starting server from LocalProcess extension host
2025-08-03 21:01:41.157 [info] Connection state: Running
2025-08-03 21:01:41.158 [debug] [editor -> server] {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{"roots":{"listChanged":true},"sampling":{},"elicitation":{}},"clientInfo":{"name":"Visual Studio Code","version":"1.102.3"}}}
2025-08-03 21:01:41.224 [debug] [server -> editor] {"result":{"protocolVersion":"2025-06-18","capabilities":{"resources":{},"tools":{"listChanged":true}},"serverInfo":{"name":"Gladys","title":"Gladys","version":"1.0.O"}},"jsonrpc":"2.0","id":1}
2025-08-03 21:01:41.224 [debug] [editor -> server] {"method":"notifications/initialized","jsonrpc":"2.0"}
2025-08-03 21:01:41.225 [debug] [editor -> server] {"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}
2025-08-03 21:01:41.226 [debug] 404 status connecting to http://192.168.xxx.yyy:8001/api/v1/service/mcp/proxy for async notifications; they will be disabled: {"status":404,"code":"NOT_FOUND","message":"Route /v1/service/mcp/proxy not found"}
2025-08-03 21:01:41.264 [debug] [server -> editor] {"result":{"tools":[{"name":"camera_get-image","title":"Get image from camera","description":"Get image from specific camera or specific room.","inputSchema":{"type":"object","properties":{"room":{"type":"string","enum":["maison"],"description":"Room to get image from."}},"required":["room"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"light_turn-on","title":"Turn on light","description":"Turn on a light in a specific room.","inputSchema":{"type":"object","properties":{"room":{"type":"string","description":"Room to turn on the light in."}},"required":["room"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"light_turn-off","title":"Turn off light","description":"Turn off a light in a specific room.","inputSchema":{"type":"object","properties":{"room":{"type":"string","description":"Room to turn off the light in."}},"required":["room"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"scene_start","title":"Start scene","description":"Start a home automation scene.","inputSchema":{"type":"object","properties":{"scene":{"type":"string","enum":[],"description":"Scene name to start."}},"required":["scene"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"device_get-state","title":"Get states from devices","description":"Get last state of specific device type or in a specific room.","inputSchema":{"type":"object","properties":{"room":{"type":"string","enum":["maison"],"description":"Room to get information from."},"sensor_type":{"type":"array","items":{"type":"string","enum":["temperature-sensor","humidity-sensor"]},"description":"Type of sensor to query, empty array to retrieve all sensors."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}]},"jsonrpc":"2.0","id":2}
2025-08-03 21:01:41.265 [info] Discovered 5 tools
2025-08-03 21:01:41.314 [warning] 1 tools have invalid JSON schemas and will be omitted
1 « J'aime »

Dans mon docker test, je n’ai qu’un dyson que je peux mettre en route et éteindre (via Matterbridge).
Ce serait simple d’ajouter allumer/éteindre une prise ou commutateur (je ne sais pas si c’est différent dans Gladys) ? J’aimerais bien tester des demandes plus complexes comme ça :wink:


En tout cas c’est super prometteur et ça répond mieux (enfin je pense) que ChatGPT dans GladysPlus :

D’ailleurs, quelles seraient les différences entre discuter avec Gladys/ChatGPT et ton service ?

1 « J'aime »

Super que tu aies réussi, il faut bien ajouter le port pour que ça fonctionne correctement avec l’IP.

En effet, je vois 2 erreurs. La ligne avec la 404 est normale, pour l’instant je n’ai implémenté que la déclaration des outils, il y a plusieurs autres fonctionnalités MCP dont ce qui est appelé notifications, je m’en occuperai dans un deuxième temps. La ligne avec l’erreur sur le schéma invalide, n’est pas importante. Tu n’a pas de scène sur ton docker de test, c’est bien ça ?

Bien sûr, j’essaie de le faire prochainement.

Ce sont deux implémentations différentes de l’IA. Techniquement parlant, avec Gladys Plus tu fais une demande, le modèle identifie la demande et renvoi à Gladys l’intention de la demande et Gladys te répond. Ici, avec le service MCP tu discutes avec un agent extérieur à Gladys qui a la capacité de lire/écrire des données Gladys pendant qu’il créé ta réponse. Fonctionnellement je ne sais pas trop, je n’utilise pas ChatGPT de Gladys Plus, mais avec une agent+MCP tu peux enchaîner les questions, même utiliser plusieurs appareils dans des demandes, je pense que si tu configure bien ton agent tu dois avoir plus de possibilité avec les MCP. C’est là que Gladys Plus a un avantage, tu n’as rien à configurer, l’IA est implémentée directement, en plus tu peux l’utiliser dans les scènes.

1 « J'aime »

Salut @bertrandda, très cool ce petit développement :slight_smile:

Effectivement, il faut authentifier la connexion entre le client MCP et Gladys, sinon c’est open bar ^^

@jean_bruder Il y a ElevenLabs (la boîte que j’utilise notamment pour la voix de Gladys Plus !) qui a développé 11ai, un assistant vocal qui se plug sur des MCP, donc c’est compatible avec ce développement :

2 « J'aime »

Effectivement, je n’en ai pas.

Le but serait d’avoir un complément agent+MCP dans Gladys en plus/remplacement de chatGPT ou bien de discuter depuis « l’extérieur » de Gladys avec Gladys ?
J’avoue ne pas avoir de GG Home, Siri ou Alexa car je ne suis pas cloud du tout pour ces trucs là, et c’est peut-être là que ton dev s’inscrit…

Ça reste du cloud dans tous les cas :stuck_out_tongue: La seule façon de faire de l’IA en local pour l’instant, ce serait d’avoir une machine avec un bon GPU, pas mal de RAM et d’installer un modèle open-source qui tourne en local, mais bon, ce n’est pas donné et ça consomme pas mal.

Après, peut-être qu’on aura des mini-PC abordables avec des puces dédiées à l’IA à l’avenir, ça arrive petit à petit côté Beelink avec le Beelink SER9 par exemple (Disponible à 1599€).

Les performances sont plutôt correctes avec des prompts simples (Benchmark : Beelink | Performance Comparison between Beelink SER9 Pro HX370 and SER9 Pro AI), à mon avis, ça va se démocratiser à l’avenir, on est au tout début !

En attendant, le cloud est une bonne option, ça avance tellement vite que ce serait bête de s’équiper de matériel qui serait obsolète dans 6 mois, là où, côté cloud, ça se renouvelle en permanence et les coûts par token ne font que baisser depuis 2 ans !

1 « J'aime »

Merci, je n’avais pas compris ce détail :joy:

Effectivement, très bonne bête mais on va attendre un peu vu le tarif…

Très intéressant ce projet, mais je vois que les MCP doivent être accessibles via une url publique pour que ça fonctionne. Pour l’instant le service ne peux fonctionner que si l’agent est sur le même réseau que Gladys. Une fois que le service sera stable en local, ça vaudra peut être le coup de faire une route Gladys Plus authentifiée qui redirige vers le service MCP de l’utilisateur, qu’en dis tu ?

Carrément ! :slight_smile:

@mutmut je viens de mettre à jour l’image avec l’ajout des commutateurs. Peux tu voir si ça te convient et si ça fonctionne bien ?

@bertrandda image mise à jour mais ça ne semble pas fonctionner même si j’ai bien des commutateurs (1 dyson, 2 pour Matterbridge, 1 commutateur virtuel en mqtt non trouvé) :


et en insistant sur le nom gladys :

mais le dyson ne s’éteint pas.
Il faudrait que je teste avec une vraie prise zigbee pour voir.

Si tu as des retours avec une vraie prise zigbee je suis preneur. J’ai développé ça avec des appareils virtuels MQTT.
Plus globalement, je vois que me baser uniquement sur les selectors des fonctionnalités des appareils n’est peut être pas très pertinent et par un manque d’information provoque des incompréhension du côté de l’agent. Il y a encore surement moyen d’améliorer ça