CommencerCommencez gratuitement

Quand les API nécessitent une authentification

Lorsqu'une API externe exige une clé d'API, la clé doit se trouver dans l'environnement du serveur et être ajoutée uniquement dans l'en-tête de la requête sortante. Le client n'envoie ni ne reçoit jamais la clé. Dans cet exercice, vous allez ajouter une prise en charge facultative de clé d'API à l'outil convert_currency du serveur de conversion de devises.

L'API Frankfurter ne nécessite pas de clé pour un usage de base, mais beaucoup d'API oui. Vous allez lire une clé facultative depuis l'environnement (par exemple CURRENCY_API_KEY) et, si elle est définie, l'ajouter à la requête sous la forme d'un en-tête Authorization: Bearer.

Un serveur MCP a déjà été instancié et stocké dans la variable mcp. Le module os a déjà été importé pour vous.

Cet exercice fait partie du cours

<cours>Introduction au Model Context Protocol (MCP)</cours>
Voir le cours

Instructions de l’exercice

  • Lisez la clé d'API "CURRENCY_API_KEY" depuis les variables d'environnement et ajoutez-la à l'en-tête "Authorization" avec la valeur "Bearer " suivie de la clé pour la requête.
  • Passez les en-têtes dans la requête GET vers l'API.

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

@mcp.tool()
def convert_currency(amount: float, from_currency: str, to_currency: str) -> str:
    """Convert an amount from one currency to another using current exchange rates."""
    url = f"https://api.frankfurter.dev/v1/latest?base={from_currency}&symbols={to_currency}"
    # Read optional API key from the server's environment
    headers = {}
    api_key = os.environ.get(____)
    if api_key:
        headers["Authorization"] = f"Bearer {____}"
    try:
        # Pass headers (and timeout) to the request; key never goes in the URL
        r = requests.get(url, ____=____, timeout=10)
        r.raise_for_status()
        data = r.json()
        rate = data["rates"].get(to_currency)
        if rate is None:
            return f"Could not find exchange rate for {from_currency} to {to_currency}"
        return f"{amount} {from_currency} = {amount * rate:.2f} {to_currency} (Rate: {rate})"
    except requests.exceptions.RequestException as e:
        return f"Error converting currency: {e}"

print(convert_currency(10, "USD", "EUR"))
Modifier et exécuter le code