---
title: AgentGateway: un proxy de serveur mcp
author: Frederic AOUSTIN
version: 1.O
---

# AgentGateway: un proxy de serveur mcp

![category](developpement)
![tag](python)
![tag](ia)


Rapidement quand on travaille sur produire une plateforme IA, on ajoute plusieurs serveurs MCP.

Très rapidement on se retrouve avec plusieurs services qu'il faut pouvoir centraliser.
En effet j'utilise docker et si je veux rendre mes serveurs mcp accessible sur l'exterieur je vais démultiplier l'usage des ports ce qui n'est pas une bonne chose.

Il faut donc pouvoir mettre en place un proxy qui va centraliser l'ensemble des demandes 

Nous allons mettre en place l'architecture suivante

```mermaid
flowchart LR
    user["Utilisateur"]
    mcp["AgentGateway"]
    mcp1["Mcp Serveur 1"]
    mcp2["Mcp Serveur 2"]
    mcp --> mcp1
    mcp --> mcp2
    user --> mcp
```

J'avais déjà abordé un proxy de ce type qui se nomme [mcpo](./?md=20260628122600).

La principale différence entre **mcpo** et **AgentGateway** est le fait que AgentGateway est un proxy qui va permettre de contacter les serveurs mcp via le protocole mcp.
Alors que mcpo permet de transformer des appels API-REST en appel mcp.

**AgentGateway** est donc beaucoup plus simple par la suite à intégrer dans des agents IA qui parle le mcp.

De plus **AgentGateway** permet de gérer des droits fin ce que ne fait pas mcpo (avec mcpo soit vous avez accès à tous via un token soit à rien)

Un des avantage de **AgentGateway** est qu'il ne nécessite pas de base de donnée (un simple fichier de configuration) et qu'il se recharge automatique après chaque modification de son fichier de conf.

## Installation

Nous allons comme d'habitude utiliser docker ... dans notre exemple AgentGateway sera exposé à l'exterieur derrière un serveur traefick

    mcp:
        image: cr.agentgateway.dev/agentgateway:v1.6.0
        container_name: mcp
        restart: unless-stopped
        volumes:
            - ./data/sam/mcp:/config:ro
        command: ["-f", "/config/config.yaml"]
        environment:
            - MCPFREE_API_KEY=YYYYYYYYYYYYYYYYYYYYY
            - MCPWEATHER_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        networks:
            meet.jitsi:
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.mcp.entrypoints=websecure"
            - "traefik.http.routers.mcp.tls=true"
            - "traefik.http.routers.mcp.rule=Host(`mcp.mydomain.fr`)"
            - "traefik.http.services.mcp-service.loadbalancer.server.port=3000"
            - "traefik.http.routers.mcp-insecure.entrypoints=web"
            - "traefik.http.routers.mcp-insecure.rule=Host(`mcp.mydomain.fr`)"
            - "traefik.http.routers.mcp-insecure.middlewares=https-redirect"

On indique dans la configuration des API_KEY qui seront utilisé pour se connecter aux serveurs mcp.

Notre fichier *./data/sam/mcp/config.yaml* contient

```yaml
# yaml-language-server: $schema=https://agentgateway.dev/schema/config
mcp:
  port: 3000
  policies:
    apiKey:
      mode: strict              # toute requête sans clé valide est rejetée
      keys:
      - key: sk-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
        metadata: { client: goose }
      - key: sk-YYYYYYYYYYYYYYYYYYYYYYYYYYYY
        metadata: { client: opencode }
      - key: sk-WWWWWWWWWWWWWWWWWWWWWWWWWWWW
        metadata: { client: openwebui }
    mcpAuthorization:
      rules:
      # Goose : tous les serveurs
      - 'apiKey.client == "goose"'
      # OpenCode : seulement serveur1 et serveur2
      - 'apiKey.client == "opencode" && mcp.tool.target in ["mcpfree", ]'
      # Open WebUI : seulement mcpfree
      - 'apiKey.client == "openwebui" && mcp.tool.target in ["mcpfree", ]'
  targets:
  - name: mcpfree
    mcp:
      host: http://mcpfree:8000/mcp
    policies:
      backendAuth:
        key: "$MCPFREE_API_KEY"
  - name: mcpweather
    mcp:
      host: http://mcpweather:8000/mcp
    policies:
      backendAuth:
        key: "$MCPWEATHER_API_KEY"
```

On voit qu'on gère dans cet exemple 3 tokens d'accès (pour goose, opencode et opwebui).

Seul goose à accès à l'ensemble des outils dans cet exemple


Pour tester le serveur il suffit d'utiliser notre client [mcp](./upload/mcp)

```bash
mcp --url https://mcp.mydomain.fr --token sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX list
```


ce qui est bien avec ce serveur est que vous pouvez le déclarer dans openwebui et par la suite chaque serveur mcp que vous ajouterez ne sera pas à déclarer dans openwebui (en contre partie vous avez une gestion moins fine dans openwebui des accès au serveur mcp)
