CommencerCommencez gratuitement

Quand les API exigent une authentification

Lorsqu'une API externe requiert une clé d'API, cette clé doit être stockée dans l'environnement du serveur et n'être ajoutée qu'à 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 optionnelle de clé d'API à l'outil convert_currency du serveur de devises.

L'API Frankfurter ne nécessite pas de clé pour une utilisation de base, mais de nombreuses API oui. Vous allez lire une clé optionnelle depuis l'environnement (par exemple CURRENCY_API_KEY) et, si elle est définie, l'ajouter à la requête en tant qu'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é dans la requête.
  • Passez les en-têtes dans la requête API GET.

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