Când API-urile necesită autentificare
Când un API extern necesită un API key, acesta trebuie să se afle în mediul serverului și să fie atașat doar în antetul cererii de ieșire. Clientul nu trimite și nici nu primește cheia. În acest exercițiu vei adăuga suport opțional pentru API key în instrumentul convert_currency al serverului de valute.
Frankfurter API nu necesită o cheie pentru utilizare de bază, însă multe API-uri o cer. Vei citi o cheie opțională din mediu (de ex., CURRENCY_API_KEY) și, dacă este setată, o vei adăuga la cerere ca antet Authorization: Bearer.
Un server MCP a fost deja instanțiat și stocat în variabila mcp. Modulul os a fost deja importat pentru tine.
Acest exercițiu face parte din cursul
Introducere în Model Context Protocol (MCP)
Instrucțiuni pentru exercițiu
- Citește API key-ul
"CURRENCY_API_KEY"din variabilele de mediu și adaugă-l în antetul"Authorization"cu valoarea"Bearer "plus cheia, în cadrul cererii. - Pasează antetele în cererea GET către API.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
@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"))