Khi API yêu cầu xác thực
Khi một API bên ngoài yêu cầu API key, khóa này nên được đặt trong môi trường của máy chủ và chỉ được đính kèm trong header của yêu cầu đi ra. Client không bao giờ gửi hoặc nhận khóa. Trong bài tập này, bạn sẽ thêm hỗ trợ API key tùy chọn cho công cụ convert_currency của currency server.
Frankfurter API không yêu cầu key cho mục đích sử dụng cơ bản, nhưng nhiều API khác thì có. Bạn sẽ đọc một key tùy chọn từ môi trường (ví dụ: CURRENCY_API_KEY) và, nếu có, thêm nó vào yêu cầu dưới dạng header Authorization: Bearer.
Một máy chủ MCP đã được khởi tạo và lưu trong biến mcp. Mô-đun os đã được import sẵn cho bạn.
Bài tập này là một phần của khóa học
Giới thiệu về Model Context Protocol (MCP)
Hướng dẫn bài tập
- Đọc API key
"CURRENCY_API_KEY"từ các biến môi trường và thêm vào header"Authorization"với giá trị"Bearer "cộng với key trong yêu cầu. - Truyền headers vào yêu cầu API GET.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
@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"))