Quand les API exigent une authentification
Lorsqu'une API externe exige une clé d'API, cette clé doit être stockée dans l'environnement du serveur et 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 la prise en charge facultative d'une clé d'API à l'outil convert_currency du serveur de conversion de devises.
L'API Frankfurter ne requiert pas de clé pour un usage de base, mais de nombreuses API en exigent une. Vous lirez une clé facultative à partir de l'environnement (p. ex., CURRENCY_API_KEY) et, si elle est définie, vous l'ajouterez à la requête comme 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.
Cette activité fait partie du cours
Introduction au Model Context Protocol (MCP)
Instructions de l’exercice
- Lisez la clé d'API
"CURRENCY_API_KEY"à partir des 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"))