Leçon 8 — Guides pas à pas

10-7. Chemin 4 : déclarer le serveur MCP dans Agent Registry

4 min de lecture

Ce guide répond à : à quoi sert Agent Registry pour un serveur MCP ? Comment y déclarer sheets-mcp et ses 17 outils, par script, Terraform ou console ? Comment un agent ADK le retrouve-t-il par son nom ?

Testé en vrai (14 octobre 2026) : ./scripts/deployer.sh registre a créé « Google Sheets (MCP) », et la liste du registre montre les 17 outils avec leurs annotations. Au 1er essai, Agent Registry a exigé le schéma des paramètres (inputSchema) de chaque outil : c'est corrigé dans gen_toolspec.py.


Deux entrées : « Google Sheets (MCP) » (17 outils) et « Google Slides (MCP) » (20 outils), depuis terraform/toolspec-sheets.json et toolspec-slides.json. Les exemples ci-dessous parlent de Sheets ; Slides est identique.

1. À quoi ça sert

Agent Registry est le catalogue des agents et des serveurs MCP de l'organisation. Y déclarer sheets-mcp, c'est :

  • le rendre visible : console → Agent Registry → onglet MCP servers, avec la description et les outils ;
  • gouverner : savoir quels outils existent, lesquels sont en lecture seule ou destructifs ;
  • le retrouver par son nom depuis un agent ADK, sans écrire son URL en dur : si l'URL change, on met le registre à jour, pas les agents.

Le registre ne remplace ni le connecteur (10-5) ni l'agent (10-6) : il les accompagne.

2. Pourquoi une liste d'outils (toolspec.json)

Une déclaration manuelle enregistre l'URL, mais Agent Registry n'interroge pas le serveur. Pour que les outils soient visibles, il faut les fournir : c'est terraform/toolspec.json. Il est généré depuis le code, donc il ne peut pas diverger :

python3 scripts/gen_toolspec.py

Résultat obtenu : terraform/toolspec.json : 17 outils, 6917 octets (maximum Agent Registry : 10 Ko).

Format (extrait) :

{"tools":[{"name":"read_range","description":"Lit les valeurs d'une plage (liste de lignes).",
  "inputSchema":{"properties":{"spreadsheet_id":{"type":"string"},"range_a1":{"type":"string"},"render":{"enum":[…],"type":"string"}},
                 "required":["spreadsheet_id","range_a1"],"type":"object"},
  "annotations":{"title":"Lire une plage","readOnlyHint":true}}, …]}

Le bouton Import tools de la console ne marche que pour un serveur public. Le nôtre est privé, d'où ce fichier.

3. Déclarer

Script : ./scripts/deployer.sh registre. Il lance :

gcloud agent-registry services create sheets-mcp --location=europe-west1 --project=$PROJET \
  --display-name="Google Sheets (MCP)" --description="Lecture et modification de Google Sheets au nom de l'utilisateur…" \
  --mcp-server-spec-type=tool-spec --mcp-server-spec-content="$(cat terraform/toolspec.json)" \
  --interfaces="url=$MCP_URL,protocolBinding=jsonrpc"
gcloud agent-registry mcp-servers list --location=europe-west1 --project=$PROJET

Terraform : google_agent_registry_service.mcp (register_in_agent_registry = true, par défaut).

Console : Agent Registry → europe-west1 → MCP servers → Add MCP server :

  • nom, description ;
  • endpoint …/mcp ;
  • collez toolspec.json ;
  • Next → cochez les outils → Save.

Région : une région (europe-west1) ou global. La déclaration manuelle n'est pas possible en eu ni en us (documentation Google).

Droit : roles/agentregistry.editor sur le projet. ./scripts/deployer.sh verifier le contrôle.

Déclaration automatique : gcloud run deploy … --functional-type=mcp-server déclare un service Cloud Run tout seul, dans le même projet. Nous déclarons à la main, pour publier la liste des outils d'un serveur privé et garder une déclaration relisible.

4. Un agent ADK qui retrouve le serveur par son nom

Le projet 04 le fait (04-mcp-server-cloud-run-registry/agent/shop_agent/agent.py) :

from google.adk.integrations.agent_registry import AgentRegistry
registry = AgentRegistry(project_id=PROJET, location="europe-west1", header_provider=entetes)
serveur = next(s for s in registry.list_mcp_servers().get("mcpServers", []) if s.get("displayName") == "Google Sheets (MCP)")
outils = registry.get_mcp_toolset(serveur["name"])

Notre agent (10-6) garde une URL fixe (MCP_URL) : c'est plus simple, et il n'a pas de dépendance au registre au démarrage. Passez au registre quand plusieurs agents partagent le serveur.

4 bis. La découverte par Agent Gateway (vue dans la console Acme)

La console Gemini Enterprise de Acme montre, dans la section « MCP servers » de l'app :

  • « MCP servers from your project's configured Agent Gateway registries, or a custom … » ;
  • le bandeau « Configure Agent Gateway to discover and use MCP servers from your … ».

Autrement dit, quand une Agent Gateway est configurée pour l'app et reliée à des registres, les serveurs MCP déclarés dans Agent Registry (comme sheets-mcp, partie 3) apparaissent directement dans cette liste. Il n'y a alors plus besoin de les saisir à la main.

Ce qui reste pareil :

  • le serveur est privé : le compte de l'app doit avoir run.invoker (10-5, étape 3) ;
  • le jeton de l'utilisateur doit venir d'un client OAuth accepté par le serveur.

Statut : vu dans la console, pas encore testé (il faut une app et une Agent Gateway). Le chemin manuel « Custom MCP Server » (10-5) marche sans gateway. Référence : Route Gemini Enterprise traffic through Agent Gateway.

5. Si ça bloque

SymptômeCause → solution
PERMISSION_DENIED à la créationroles/agentregistry.editor manquant, ou l'API agentregistry.googleapis.com bloquée par l'organisation (l'étape est facultative)
INVALID_ARGUMENT sur la locationeu ou us : prendre europe-west1 (REGISTRE_LOCATION)
invalid MCP tool spec content: tools.0: inputSchema is requiredAncien gen_toolspec.py : prendre la version actuelle (schémas inclus)
Aucun outil affichétoolspec.json absent ou vide : python3 scripts/gen_toolspec.py, puis supprimer et redéclarer
Taille refuséePlus de 10 Ko : raccourcir les descriptions (le script s'arrête de lui-même au-delà)

Source : Register MCP servers.

Suivant