Un connecteur MCP permet à Claude de lire vos données Google Search Console et Google Analytics 4 directement dans la conversation : requêtes, clics, pages, sessions, canaux d'acquisition. Plus besoin d'exporter des fichiers pour les analyser.
Ce guide vous accompagne de A à Z, quel que soit votre hébergement : hébergement mutualisé avec Node.js, serveur privé, plateforme cloud ou simple test depuis votre ordinateur. Comptez 1 à 2 heures la première fois. Si vous préférez être accompagné, n'hésitez pas à me contacter.
Vous voulez des données SEO exploitables directement par l'IA ?
Prendre rendez-vous avec un FreelanceOn crée un petit serveur (Node.js) qui s'authentifie auprès de Google avec votre compte, puis on l'ajoute dans Claude comme « connecteur personnalisé ». Claude appelle ensuite ce serveur pour récupérer vos données.
https://<votre-domaine>/mcp).Le serveur expose 7 outils : 3 pour Search Console (gsc_list_sites, gsc_search_analytics, gsc_list_sitemaps) et 4 pour Analytics 4 (ga_list_properties, ga_run_report, ga_run_realtime_report, ga_get_metadata).
Si vous n'avez pas d'avis, prenez la plateforme cloud (cas C) : c'est le chemin le plus court. Si vous avez déjà un hébergement web qui propose Node.js (cas A) ou un serveur privé (cas B), utilisez-le.
| Cas | Pour qui | Avantages | Limites | Difficulté |
|---|---|---|---|---|
| A. Hébergement mutualisé avec Node.js | Vous avez déjà un hébergement web dont le panneau (cPanel) propose une application Node.js | Pas de coût en plus, HTTPS automatique, sous-domaine dédié | Le pare-feu de l'hébergeur peut bloquer certaines requêtes (voir Dépannage), peu de contrôle | Moyenne |
| B. Serveur privé virtuel (VPS) | À l'aise avec un terminal (SSH) | Contrôle total, performances stables, pas de mise en veille | Il faut installer et sécuriser le serveur soi-même (Node.js, proxy HTTPS, redémarrage automatique) | Élevée |
| C. Plateforme cloud (Render, Railway, Fly.io et équivalents) | Vous voulez déployer sans gérer de serveur | Déploiement depuis un dépôt Git, HTTPS fourni, variables secrètes intégrées | Les offres gratuites mettent souvent l'application en veille (première requête lente) ; offres et tarifs changent | Faible à moyenne |
| D. Fonctions serverless (Cloudflare Workers, Vercel, etc.) | Développeurs qui veulent du serverless | Pas de serveur à maintenir | Le code fourni ne s'y exécute pas tel quel : il faut le réécrire | Élevée |
| E. Votre ordinateur + tunnel HTTPS (Cloudflare Tunnel, ngrok) | Tests rapides | Aucun hébergement à payer, installation rapide | L'ordinateur doit rester allumé ; l'adresse peut changer selon l'offre | Faible |
| F. Connecteur local de Claude Desktop (sans HTTP) | Usage uniquement dans l'application de bureau | Pas d'hébergement ni de HTTPS | Ne fonctionne pas sur claude.ai dans le navigateur ; code différent, non fourni ici | Moyenne |
Les cas A, B, C et E utilisent exactement le même code. Seules les étapes de déploiement changent.
Besoin d'aide pour mettre en place votre connecteur ?
Prendre rendez-vous avec un FreelanceCette étape crée l'identité de votre application auprès de Google. Elle est identique quel que soit l'hébergement. Les intitulés exacts des menus changent parfois : cherchez le mot-clé si un nom diffère.
mcp-seo) et créez-le.Une application laissée en mode Test voit ses jetons expirer au bout de 7 jours : le connecteur cesserait alors de fonctionner. Dans l'écran de consentement, passez l'état de Test à En production (bouton Publier l'application).
Pour un usage personnel, aucune validation par Google n'est nécessaire. Au moment de vous connecter, Google affichera un avertissement « application non vérifiée » : c'est normal, c'est votre propre application. Cliquez sur Avancé, puis sur Continuer.
redirect_uri_mismatch.Gardez ces deux valeurs secrètes : ne les envoyez jamais par e-mail ou messagerie, et ne les mettez pas dans un dépôt Git public.
Cette étape produit un « refresh token » : une clé de lecture seule qui permet à votre serveur d'interroger Google sans que vous vous reconnectiez. Elle se fait sur votre ordinateur, pas sur le serveur.
node -v dans un terminal.npm install
.env (copie de .env.example) contenant au minimum :
GOOGLE_CLIENT_ID=<ID client de l'étape 1.5>
GOOGLE_CLIENT_SECRET=<Code secret de l'étape 1.5>
Sous Windows, vérifiez que le fichier ne s'appelle pas .env.txt (affichez les extensions de fichiers dans l'Explorateur).
node get-refresh-token.js
GOOGLE_REFRESH_TOKEN=.... Copiez la valeur dans un gestionnaire de mots de passe.Traitez ce jeton comme un mot de passe : quiconque le possède peut lire vos données Search Console et Analytics. S'il fuite, révoquez-le sur la page des autorisations de votre compte Google, puis recommencez cette étape.
Droits d'accès à vérifier. Le compte utilisé doit être ajouté comme utilisateur de chaque site dans Search Console (Paramètres → Utilisateurs et autorisations) et avoir au moins le rôle Lecteur sur chaque propriété Analytics (Admin → Gestion des accès). Le connecteur ne voit que ce que ce compte voit.
Vous préférez déléguer la mise en place technique ?
Prendre rendez-vous avec un FreelanceLe serveur se configure uniquement par des variables d'environnement : aucun secret n'est écrit dans le code. Vous les saisirez dans le panneau de votre hébergeur (cas A à C) ou dans un fichier .env (cas B et E).
| Variable | Obligatoire | Valeur |
|---|---|---|
MCP_USERNAME | Oui | Identifiant que vous choisissez pour vous connecter au connecteur |
MCP_PASSWORD | Oui | Mot de passe long et unique que vous choisissez (20 caractères ou plus) |
GOOGLE_CLIENT_ID | Oui | ID client de l'étape 1.5 |
GOOGLE_CLIENT_SECRET | Oui | Code secret de l'étape 1.5 |
GOOGLE_REFRESH_TOKEN | Oui | Jeton de l'étape 2 |
PUBLIC_BASE_URL | Oui | Adresse publique du serveur, sans / à la fin : https://<votre-domaine> |
PORT | Selon l'hébergeur | Port d'écoute. Beaucoup de plateformes l'imposent et le fournissent déjà ; sinon 3000 |
ALLOWED_REDIRECT_HOSTS | Non | Liste de domaines autorisés pour la connexion, séparés par des virgules. Par défaut : claude.ai, claude.com, anthropic.com, localhost |
Pour générer un mot de passe solide, dans un terminal :
node -e "console.log(require('crypto').randomBytes(24).toString('base64url'))"
Trois points qui causent la plupart des pannes :
PUBLIC_BASE_URL doit correspondre exactement à l'adresse que vous mettrez dans Claude : même nom de domaine, https://, pas de / final. Sinon la connexion échoue.gsc-mcp.log).MCP_USERNAME, MCP_PASSWORD ou GOOGLE_CLIENT_SECRET déconnecte toutes les sessions existantes. C'est voulu : reconnectez-vous ensuite dans Claude.Le serveur écrit un journal dans gsc-mcp.log, à côté de server.js. Il ne contient ni mot de passe ni jeton, et il sert au dépannage.
Suivez uniquement la partie qui correspond à votre cas. Dans tous les cas, le résultat attendu est le même : l'adresse https://<votre-domaine>/ affiche « Serveur MCP GSC en ligne » avec un cadenas valide dans le navigateur.
mcp.<votre-domaine>). Attendez que le certificat HTTPS soit émis ; dans SSL/TLS Status, le sous-domaine doit avoir un cadenas valide. Un certificat provisoire (auto-signé) fait échouer la connexion de Claude.server.js.server.js, package.json et get-refresh-token.js dans ce dossier (gestionnaire de fichiers, SFTP ou Git). N'envoyez pas le fichier .env.source ...nodevenv.../bin/activate), puis lancez npm install. Sans cette activation, la commande npm est introuvable.https://<votre-domaine>/.Point d'attention : certains hébergeurs filtrent les requêtes POST vers des chemins qu'ils jugent suspects (réponse 406 avec une page /406.shtml). Si Claude n'arrive pas à s'inscrire, voir la section Dépannage.
A pointant mcp.<votre-domaine> vers l'adresse IP du serveur.node -v./opt/gsc-mcp, puis :
cd /opt/gsc-mcp
npm install --omit=dev
nano .env # collez les variables de l'étape 3
chmod 600 .env # seul le propriétaire peut lire le fichier
/etc/systemd/system/gsc-mcp.service :
[Unit]
Description=Serveur MCP Search Console + Analytics
After=network.target
[Service]
WorkingDirectory=/opt/gsc-mcp
EnvironmentFile=/opt/gsc-mcp/.env
ExecStart=/usr/bin/node server.js
Restart=always
User=<utilisateur-sans-privileges>
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now gsc-mcp
sudo systemctl status gsc-mcp
Si which node ne renvoie pas /usr/bin/node, adaptez le chemin dans ExecStart.
Caddyfile :
mcp.<votre-domaine> {
reverse_proxy localhost:3000
}
.gitignore fourni exclut déjà .env.npm install. Commande de démarrage : npm start.PORT à la plateforme si elle le définit.https://mon-service.<plateforme>.app). Copiez-la dans PUBLIC_BASE_URL, sans / final, puis redéployez. Si vous reliez ensuite votre propre domaine, mettez PUBLIC_BASE_URL à jour.https://<adresse>/ pour vérifier.Les jetons de connexion sont signés et ne dépendent d'aucun stockage : un redéploiement ou une mise en veille ne vous déconnecte pas. Sur une offre gratuite qui met le service en veille, le premier appel de Claude peut être lent ou échouer ; relancez-le. Vérifiez les offres et tarifs en vigueur sur le site de la plateforme.
cloudflared tunnel --url http://localhost:3000
.env, mettez cette adresse dans PUBLIC_BASE_URL, puis démarrez le serveur dans un second terminal : node server.js.L'adresse d'un tunnel gratuit change à chaque lancement : il faudra supprimer puis rajouter le connecteur dans Claude à chaque fois. Pour un usage durable, choisissez les cas A, B ou C.
Le code fourni est un serveur Express classique. Il ne s'exécute pas tel quel sur des fonctions serverless (cas D) ; il faudrait le réécrire pour la plateforme choisie. Un connecteur local pour Claude Desktop (cas F) utilise un autre mécanisme (sans adresse web) et ne fonctionne pas dans le navigateur : ce n'est pas l'objet de ce guide.
Avant de commencer, ouvrez https://<votre-domaine>/ dans le navigateur : la page doit s'afficher avec un cadenas sans avertissement.
https://<votre-domaine>/mcp. Attention au /mcp final.MCP_USERNAME et MCP_PASSWORD (ceux que vous avez définis à l'étape 3, pas vos identifiants Google).Dans Search Console, une propriété s'écrit soit https://<site>/ (préfixe d'URL), soit sc-domain:<site> (propriété de domaine). Demandez d'abord la liste des sites pour utiliser la forme exacte.
Après une modification du serveur. Si vous changez le code ou l'adresse, supprimez le connecteur dans Claude puis ajoutez-le à nouveau : cela renouvelle l'inscription et la liste des outils. Si seuls les outils Analytics manquent, vérifiez que le serveur est bien en version 1.2 ou plus récente (affichée sur la page d'accueil du serveur).
Vous voulez exploiter ces données pour votre stratégie SEO ?
Prendre rendez-vous avec un FreelanceLe serveur est public sur Internet : seul le mot de passe que vous avez choisi empêche un inconnu de l'utiliser. Traitez-le comme un accès à vos données.
webmasters.readonly et analytics.readonly) empêchent toute modification. Ne les remplacez pas par des autorisations plus larges..env, l'ID client, le code secret ou le jeton dans un dépôt Git, un e-mail, une capture d'écran ou une conversation. Le fichier .gitignore fourni exclut .env.localhost). Élargissez la liste ALLOWED_REDIRECT_HOSTS seulement si vous en comprenez la raison.MCP_PASSWORD (cela déconnecte toutes les sessions), puis révoquez le jeton Google sur la page des autorisations de votre compte Google et répétez l'étape 2.npm audit dans le dossier du projet.Le serveur est prévu pour une seule personne (un identifiant, un mot de passe). Pour donner l'accès à une équipe, ne partagez pas ce mot de passe : créez un connecteur par personne, ou faites évoluer l'authentification.
Premier réflexe : lire le journal. Le serveur écrit gsc-mcp.log à côté de server.js (ouvrez-le dans le gestionnaire de fichiers ou en SSH). Faites une tentative de connexion dans Claude, puis regardez les dernières lignes :
POST /mcp ou POST /oauth/client apparaissent : Claude atteint votre serveur, le problème est plus loin ;npm install oublié, mauvais fichier de démarrage).Test de référence depuis un terminal (remplacez le domaine). Il doit répondre 401 Unauthorized avec un en-tête WWW-Authenticate : c'est la bonne réponse, elle prouve que le serveur est joignable et protégé.
curl -i -X POST https://<votre-domaine>/mcp -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{}}"
| Symptôme | Cause probable | Solution |
|---|---|---|
npm : commande introuvable en SSH sur un mutualisé | L'environnement Node de l'application n'est pas activé | Copiez la commande source ...nodevenv.../bin/activate affichée dans la page de l'application, collez-la, puis relancez npm install |
Cannot find package 'dotenv' | npm install n'a pas été lancé dans ce dossier, ou package.json est absent | Placez-vous dans le dossier du projet, vérifiez que package.json y est, lancez npm install |
| Claude : « Impossible d'atteindre cette adresse » | Serveur arrêté, adresse fausse, ou certificat invalide | Ouvrez https://<votre-domaine>/ ; relancez le test de référence ; vérifiez /mcp à la fin de l'adresse dans Claude |
curl : SEC_E_UNTRUSTED_ROOT ou erreur de certificat | Certificat provisoire ou auto-signé | Lancez l'émission du certificat (AutoSSL / Let's Encrypt) pour ce sous-domaine, vérifiez l'enregistrement DNS, attendez quelques minutes. Ne contournez pas avec curl -k : Claude, lui, refusera |
Réponse 406 et page /406.shtml sur un POST | Pare-feu de l'hébergeur (type ModSecurity) qui bloque la requête avant votre programme | Contactez le support de l'hébergeur : demandez une exception pour ce sous-domaine. Le serveur utilise /oauth/client, /oauth/token et /mcp pour limiter ce risque |
| Claude : « Impossible de s'inscrire auprès du service de connexion » | L'inscription (POST /oauth/client) est bloquée, ou PUBLIC_BASE_URL ne correspond pas à l'adresse réelle | Cherchez POST /oauth/client dans gsc-mcp.log ; testez la route avec curl ; corrigez PUBLIC_BASE_URL (sans / final) |
Page /authorize ouverte à la main : erreur | Normal : elle doit être ouverte par Claude, qui fournit les paramètres | Utilisez le bouton de connexion de Claude |
| La fenêtre de connexion ne s'ouvre pas | Pop-up bloquée par le navigateur | Autorisez les pop-up pour le site de Claude, puis réessayez |
| « Identifiants incorrects » | Mauvais MCP_USERNAME / MCP_PASSWORD | Reprenez les valeurs de l'étape 3 ; après 10 échecs, attendez 15 minutes |
redirect_uri non autorisé (dans le journal) | Claude utilise une adresse absente de la liste | Ajoutez le domaine indiqué dans ALLOWED_REDIRECT_HOSTS |
Google : redirect_uri_mismatch | Identifiant OAuth créé en type « Application Web » | Recréez-le en type « Application de bureau » (étape 1.5) |
| Google : accès refusé ou « application non vérifiée » bloquant | Votre compte n'est pas dans les utilisateurs test, ou l'application n'est pas publiée | Étape 1.3 et 1.4 ; sur l'avertissement : Avancé → Continuer |
invalid_grant | Jeton Google expiré ou révoqué (7 jours si l'application est restée en mode Test) | Publiez l'application (1.4), puis régénérez le jeton (étape 2) et mettez à jour GOOGLE_REFRESH_TOKEN |
insufficient authentication scopes | Une des deux autorisations n'a pas été cochée | Régénérez le jeton en cochant les deux cases (étape 2, point 8) |
| « API has not been used » ou « is disabled » | Une des trois API n'est pas activée | Étape 1.2, dans le même projet que l'ID client |
| Erreur de permission (403) sur un site ou une propriété | Le compte Google n'y a pas accès | Ajoutez-le dans Search Console (utilisateurs) ou Analytics (rôle Lecteur) |
| Les outils Analytics n'apparaissent pas | Ancienne version du serveur, ou connecteur pas rafraîchi | Vérifiez la version affichée sur la page d'accueil du serveur (1.2 ou plus) ; supprimez puis rajoutez le connecteur |
| Déconnecté après une modification | Vous avez changé MCP_USERNAME, MCP_PASSWORD ou GOOGLE_CLIENT_SECRET | Normal : reconnectez-vous dans Claude |
Si un problème persiste, notez le message exact (sans mot de passe, jeton ni identifiant secret) et les dernières lignes de gsc-mcp.log. C'est ce qu'il faut fournir pour obtenir de l'aide.
Version 1.2.1, à télécharger : gsc-mcp-kit.zip.
| Fichier | Rôle |
|---|---|
server.js | Le serveur : connexion protégée, protocole MCP, outils Search Console et Analytics |
package.json | Liste des dépendances et commande de démarrage (npm start) |
get-refresh-token.js | Script à lancer une fois sur votre ordinateur pour obtenir le jeton Google |
.env.example | Modèle des variables à copier en .env (cas B et E) ou à saisir dans le panneau de l'hébergeur |
.gitignore | Empêche d'envoyer .env, node_modules et les journaux dans Git |
| Outil | Ce qu'il fait |
|---|---|
gsc_list_sites | Liste les sites accessibles dans Search Console |
gsc_search_analytics | Clics, impressions, CTR et position par requête, page, pays, appareil ou date |
gsc_list_sitemaps | Liste les sitemaps d'un site |
ga_list_properties | Liste les comptes et propriétés Analytics 4, avec leur identifiant |
ga_run_report | Rapport Analytics sur une période (dimensions, métriques, filtre, tri) |
ga_run_realtime_report | Rapport Analytics en temps réel (30 dernières minutes) |
ga_get_metadata | Noms valides des dimensions et métriques d'une propriété |
server.js (et package.json si fourni) par la nouvelle version.package.json a changé, relancez npm install.systemctl restart gsc-mcp, ou redéploiement).Limites connues. Le serveur lit les données ; il n'envoie ni ne modifie rien (pas de soumission de sitemap ni d'inspection d'URL). Il est mono-utilisateur. Les noms exacts des menus Google Cloud, de Claude et des plateformes d'hébergement évoluent : en cas de différence, cherchez le mot-clé plutôt que l'intitulé exact.
Nos conseils répondant à des problématiques SEO :
Besoin d'une estimation pour votre projet ?
Si vous souhaitez me contacter directement ou prendre un rendez-vous :