Als API's authenticatie vereisen
Als een externe API een API-sleutel vereist, hoort die sleutel in de omgeving van de server te staan en alleen te worden toegevoegd in de uitgaande request-header. De client verzendt of ontvangt de sleutel nooit. In deze oefening voeg je optionele API-sleutelondersteuning toe aan de convert_currency-tool van de currency-server.
De Frankfurter API vereist geen sleutel voor basaal gebruik, maar veel API's doen dat wel. Je leest een optionele sleutel uit de omgeving (bijv. CURRENCY_API_KEY) en voegt die, als deze is gezet, toe aan de request als een Authorization: Bearer-header.
Er is al een MCP-server geïnstantieerd en opgeslagen in de variabele mcp. De module os is al voor je geïmporteerd.
Deze oefening maakt deel uit van de cursus
Introductie tot Model Context Protocol (MCP)
Oefeninstructies
- Lees de API-sleutel
"CURRENCY_API_KEY"uit de omgevingsvariabelen en voeg deze toe aan de"Authorization"-header met als waarde"Bearer "plus de sleutel aan de request. - Geef de headers mee in de API-GET-request.
Interactieve oefening met praktijkervaring
Probeer deze oefening door deze voorbeeldcode aan te vullen.
@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"))