1. Giới thiệu
Tổng quan
Trong phòng thí nghiệm này, bạn sẽ tạo và triển khai một máy chủ Giao thức ngữ cảnh mô hình (MCP). Máy chủ MCP rất hữu ích khi cung cấp cho LLM quyền truy cập vào các công cụ và dịch vụ bên ngoài. Bạn sẽ định cấu hình dịch vụ này dưới dạng một dịch vụ an toàn, sẵn sàng cho hoạt động sản xuất trên Cloud Run và có thể truy cập từ nhiều ứng dụng. Sau đó, bạn sẽ kết nối với máy chủ MCP từ xa bằng Antigravity CLI.
Bạn sẽ thực hiện
Chúng ta sẽ dùng FastMCP để tạo một máy chủ MCP sở thú có 2 công cụ: get_animals_by_species và get_animal_details. FastMCP cung cấp một cách nhanh chóng và theo kiểu Python để tạo máy chủ và ứng dụng MCP.

Kiến thức bạn sẽ học được
- Triển khai máy chủ MCP lên Cloud Run.
- Bảo mật điểm cuối của máy chủ bằng cách yêu cầu xác thực cho tất cả các yêu cầu, đảm bảo chỉ những ứng dụng và tác nhân được uỷ quyền mới có thể giao tiếp với điểm cuối đó.
- Kết nối với điểm cuối máy chủ MCP bảo mật từ Antigravity CLI
2. Thiết lập dự án
- Nếu chưa có Tài khoản Google, bạn phải tạo một Tài khoản Google.
- Sử dụng tài khoản cá nhân thay vì tài khoản do nơi làm việc hoặc trường học cấp. Tài khoản do nơi làm việc hoặc trường học cấp có thể có những hạn chế khiến bạn không thể bật các API cần thiết cho lớp học này.
- Đăng nhập vào Google Cloud Console.
- Tạo dự án mới hoặc chọn sử dụng lại một dự án hiện có.
- Nếu bạn thấy lỗi về hạn mức dự án, hãy sử dụng lại một dự án hiện có hoặc xoá một dự án hiện có để tạo dự án mới.
3. Mở Trình chỉnh sửa Cloud Shell
- Nhấp vào đường liên kết này để chuyển trực tiếp đến Cloud Shell Editor
- Nếu được nhắc uỷ quyền vào bất kỳ thời điểm nào trong hôm nay, hãy nhấp vào Uỷ quyền để tiếp tục.

- Nếu thiết bị đầu cuối không xuất hiện ở cuối màn hình, hãy mở thiết bị đầu cuối:
- Nhấp vào Xem
- Nhấp vào Terminal (Thiết bị đầu cuối)

- Trong thiết bị đầu cuối, hãy thiết lập dự án bằng lệnh sau:
- Định dạng:
gcloud config set project [PROJECT_ID] - Ví dụ:
gcloud config set project lab-project-id-example - Nếu bạn không nhớ mã dự án của mình, hãy làm như sau:
- Bạn có thể liệt kê tất cả mã dự án bằng cách dùng lệnh:
gcloud projects list | awk '/PROJECT_ID/{print $2}'

- Bạn có thể liệt kê tất cả mã dự án bằng cách dùng lệnh:
- Định dạng:
- Bạn sẽ thấy thông báo sau:
Nếu thấy biểu tượngUpdated property [core/project].
WARNINGvà được yêu cầuDo you want to continue (Y/n)?, thì có thể bạn đã nhập sai mã dự án. Nhấnn, nhấnEnterrồi thử chạy lại lệnhgcloud config set project.
4. Bật API
Trong dòng lệnh, hãy bật các API:
gcloud services enable \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com
Nếu được nhắc uỷ quyền, hãy nhấp vào Uỷ quyền để tiếp tục. 
Lệnh này có thể mất vài phút để hoàn tất, nhưng cuối cùng sẽ tạo ra một thông báo thành công tương tự như thông báo này:
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
5. Chuẩn bị dự án Python
- Tạo một thư mục có tên là
mcp-on-cloudrunđể lưu trữ mã nguồn cho quá trình triển khai:mkdir mcp-on-cloudrun && cd mcp-on-cloudrun - Tạo một dự án Python bằng công cụ
uvđể tạo tệppyproject.toml: Lệnhuv init --description "Example of deploying an MCP server on Cloud Run" --bare --python 3.13uv initsẽ tạo một tệppyproject.tomlcho dự án của bạn.Để xem nội dung của tệp, hãy chạy lệnh sau: Kết quả đầu ra sẽ có dạng như sau:cat pyproject.toml[project] name = "mcp-on-cloudrun" version = "0.1.0" description = "Example of deploying an MCP server on Cloud Run" requires-python = ">=3.13" dependencies = []
6. Tạo máy chủ MCP cho vườn thú
Để cung cấp bối cảnh có giá trị nhằm cải thiện việc sử dụng LLM với MCP, hãy thiết lập một máy chủ MCP sở thú bằng FastMCP – một khung tiêu chuẩn để làm việc với Giao thức ngữ cảnh mô hình. FastMCP cung cấp một cách nhanh chóng để tạo máy chủ và ứng dụng MCP bằng Python. Máy chủ MCP này cung cấp dữ liệu về động vật tại một vườn thú giả tưởng. Để đơn giản, chúng ta sẽ lưu trữ dữ liệu trong bộ nhớ. Đối với máy chủ MCP sản xuất, có thể bạn muốn cung cấp dữ liệu từ các nguồn như cơ sở dữ liệu hoặc API.
- Chạy lệnh sau để thêm FastMCP làm phần phụ thuộc trong tệp
pyproject.toml: Thao tác này sẽ thêm một tệpuv add fastmcp==2.12.4 --no-syncuv.lockvào dự án của bạn. - Tạo và mở một tệp
server.pymới cho mã nguồn máy chủ MCP: Lệnhcloudshell edit ~/mcp-on-cloudrun/server.pycloudshell editsẽ mở tệpserver.pytrong trình chỉnh sửa phía trên cửa sổ dòng lệnh. - Thêm mã nguồn máy chủ MCP sau đây vào tệp
server.py:import asyncio import logging import os from typing import List, Dict, Any from fastmcp import FastMCP logger = logging.getLogger(__name__) logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO) mcp = FastMCP("Zoo Animal MCP Server 🦁🐧🐻") # Dictionary of animals at the zoo ZOO_ANIMALS = [ { "species": "lion", "name": "Leo", "age": 7, "enclosure": "The Big Cat Plains", "trail": "Savannah Heights" }, { "species": "lion", "name": "Nala", "age": 6, "enclosure": "The Big Cat Plains", "trail": "Savannah Heights" }, { "species": "lion", "name": "Simba", "age": 3, "enclosure": "The Big Cat Plains", "trail": "Savannah Heights" }, { "species": "lion", "name": "King", "age": 8, "enclosure": "The Big Cat Plains", "trail": "Savannah Heights" }, { "species": "penguin", "name": "Waddles", "age": 2, "enclosure": "The Arctic Exhibit", "trail": "Polar Path" }, { "species": "penguin", "name": "Pip", "age": 4, "enclosure": "The Arctic Exhibit", "trail": "Polar Path" }, { "species": "penguin", "name": "Skipper", "age": 5, "enclosure": "The Arctic Exhibit", "trail": "Polar Path" }, { "species": "penguin", "name": "Chilly", "age": 3, "enclosure": "The Arctic Exhibit", "trail": "Polar Path" }, { "species": "penguin", "name": "Pingu", "age": 6, "enclosure": "The Arctic Exhibit", "trail": "Polar Path" }, { "species": "penguin", "name": "Noot", "age": 1, "enclosure": "The Arctic Exhibit", "trail": "Polar Path" }, { "species": "elephant", "name": "Ellie", "age": 15, "enclosure": "The Pachyderm Sanctuary", "trail": "Savannah Heights" }, { "species": "elephant", "name": "Peanut", "age": 12, "enclosure": "The Pachyderm Sanctuary", "trail": "Savannah Heights" }, { "species": "elephant", "name": "Dumbo", "age": 5, "enclosure": "The Pachyderm Sanctuary", "trail": "Savannah Heights" }, { "species": "elephant", "name": "Trunkers", "age": 10, "enclosure": "The Pachyderm Sanctuary", "trail": "Savannah Heights" }, { "species": "bear", "name": "Smokey", "age": 10, "enclosure": "The Grizzly Gulch", "trail": "Polar Path" }, { "species": "bear", "name": "Grizzly", "age": 8, "enclosure": "The Grizzly Gulch", "trail": "Polar Path" }, { "species": "bear", "name": "Barnaby", "age": 6, "enclosure": "The Grizzly Gulch", "trail": "Polar Path" }, { "species": "bear", "name": "Bruin", "age": 12, "enclosure": "The Grizzly Gulch", "trail": "Polar Path" }, { "species": "giraffe", "name": "Gerald", "age": 4, "enclosure": "The Tall Grass Plains", "trail": "Savannah Heights" }, { "species": "giraffe", "name": "Longneck", "age": 5, "enclosure": "The Tall Grass Plains", "trail": "Savannah Heights" }, { "species": "giraffe", "name": "Patches", "age": 3, "enclosure": "The Tall Grass Plains", "trail": "Savannah Heights" }, { "species": "giraffe", "name": "Stretch", "age": 6, "enclosure": "The Tall Grass Plains", "trail": "Savannah Heights" }, { "species": "antelope", "name": "Speedy", "age": 2, "enclosure": "The Tall Grass Plains", "trail": "Savannah Heights" }, { "species": "antelope", "name": "Dash", "age": 3, "enclosure": "The Tall Grass Plains", "trail": "Savannah Heights" }, { "species": "antelope", "name": "Gazelle", "age": 4, "enclosure": "The Tall Grass Plains", "trail": "Savannah Heights" }, { "species": "antelope", "name": "Swift", "age": 5, "enclosure": "The Tall Grass Plains", "trail": "Savannah Heights" }, { "species": "polar bear", "name": "Snowflake", "age": 7, "enclosure": "The Arctic Exhibit", "trail": "Polar Path" }, { "species": "polar bear", "name": "Blizzard", "age": 5, "enclosure": "The Arctic Exhibit", "trail": "Polar Path" }, { "species": "polar bear", "name": "Iceberg", "age": 9, "enclosure": "The Arctic Exhibit", "trail": "Polar Path" }, { "species": "walrus", "name": "Wally", "age": 10, "enclosure": "The Walrus Cove", "trail": "Polar Path" }, { "species": "walrus", "name": "Tusker", "age": 12, "enclosure": "The Walrus Cove", "trail": "Polar Path" }, { "species": "walrus", "name": "Moby", "age": 8, "enclosure": "The Walrus Cove", "trail": "Polar Path" }, { "species": "walrus", "name": "Flippers", "age": 9, "enclosure": "The Walrus Cove", "trail": "Polar Path" } ] @mcp.tool() def get_animals_by_species(species: str) -> List[Dict[str, Any]]: """ Retrieves all animals of a specific species from the zoo. Can also be used to collect the base data for aggregate queries of animals of a specific species - like counting the number of penguins or finding the oldest lion. Args: species: The species of the animal (e.g., 'lion', 'penguin'). Returns: A list of dictionaries, where each dictionary represents an animal and contains details like name, age, enclosure, and trail. """ logger.info(f">>> 🛠️ Tool: 'get_animals_by_species' called for '{species}'") return [animal for animal in ZOO_ANIMALS if animal["species"].lower() == species.lower()] @mcp.tool() def get_animal_details(name: str) -> Dict[str, Any]: """ Retrieves the details of a specific animal by its name. Args: name: The name of the animal. Returns: A dictionary with the animal's details (species, name, age, enclosure, trail) or an empty dictionary if the animal is not found. """ logger.info(f">>> 🛠️ Tool: 'get_animal_details' called for '{name}'") for animal in ZOO_ANIMALS: if animal["name"].lower() == name.lower(): return animal return {} if __name__ == "__main__": port = int(os.getenv("PORT", 8080)) logger.info(f"🚀 MCP server started on port {port}") asyncio.run( mcp.run_async( transport="http", host="0.0.0.0", port=port, ) )
Bạn đã hoàn tất việc nhập mã! Đã đến lúc triển khai máy chủ MCP lên Cloud Run.
7. Triển khai lên Cloud Run
Giờ đây, hãy triển khai một máy chủ MCP lên Cloud Run ngay từ mã nguồn.
- Tạo và mở một
Dockerfilemới để triển khai cho Cloud Run:cloudshell edit ~/mcp-on-cloudrun/Dockerfile - Thêm đoạn mã sau vào Dockerfile để sử dụng công cụ
uvnhằm chạy tệpserver.py:# Use the official Python image FROM python:3.13-slim # Install uv COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ # Install the project into /app COPY . /app WORKDIR /app # Allow statements and log messages to immediately appear in the logs ENV PYTHONUNBUFFERED=1 # Install dependencies RUN uv sync EXPOSE $PORT # Run the FastMCP server CMD ["uv", "run", "server.py"] - Tạo một tài khoản dịch vụ có tên là
mcp-server-sa:gcloud iam service-accounts create mcp-server-sa --display-name="MCP Server Service Account" - Chạy lệnh
gcloudđể triển khai ứng dụng lên Cloud Run Sử dụng cờcd ~/mcp-on-cloudrun gcloud run deploy zoo-mcp-server \ --service-account=mcp-server-sa@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \ --no-allow-unauthenticated \ --region=us-west1 \ --source=. \ --labels=dev-tutorial=codelab-mcp--no-allow-unauthenticatedđể yêu cầu xác thực. Điều này rất quan trọng vì lý do bảo mật. Nếu bạn không yêu cầu xác thực, bất kỳ ai cũng có thể gọi máy chủ MCP của bạn và có khả năng gây hại cho hệ thống. - Xác nhận việc tạo một kho lưu trữ Artifact Registry mới. Vì đây là lần đầu tiên bạn triển khai vào Cloud Run từ mã nguồn, nên bạn sẽ thấy:
NhậpDeploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region [us-west1] will be created. Do you want to continue (Y/n)?
Yrồi nhấnEnter. Thao tác này sẽ tạo một kho lưu trữ Artifact Registry cho quá trình triển khai của bạn. Đây là yêu cầu để lưu trữ vùng chứa Docker của máy chủ MCP cho dịch vụ Cloud Run. - Sau vài phút, bạn sẽ thấy một thông báo như sau:
Service [zoo-mcp-server] revision [zoo-mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
Bạn đã triển khai máy chủ MCP. Giờ đây, bạn có thể sử dụng tính năng này.
8. Thêm Máy chủ MCP từ xa vào Antigravity CLI
Giờ đây, bạn đã triển khai thành công một máy chủ MCP từ xa, bạn có thể kết nối với máy chủ đó bằng nhiều ứng dụng như Google Code Assist hoặc Antigravity CLI. Trong phần này, chúng ta sẽ thiết lập kết nối với máy chủ MCP từ xa mới bằng Antigravity CLI.
- Cấp cho tài khoản người dùng của bạn quyền gọi máy chủ MCP từ xa
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member=user:$(gcloud config get-value account) \ --role='roles/run.invoker' - Lưu thông tin xác thực Google Cloud và số dự án của bạn trong các biến môi trường để sử dụng trong tệp Cài đặt Antigravity:
export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)") export ID_TOKEN=$(gcloud auth print-identity-token) - Tạo thư mục
.gemini/antigravity-clinếu thư mục này chưa được tạomkdir -p ~/.gemini/antigravity-cli - Ghi máy chủ MCP từ xa vào tệp cấu hình MCP Antigravity CLI:
cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF { "mcpServers": { "zoo-remote": { "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp", "headers": { "Authorization": "Bearer ${ID_TOKEN}" } } } } EOF - Khởi động Antigravity CLI:
agy
- Xác thực bằng Antigravity CLI: Bạn cần xác thực trong lần khởi động đầu tiên. Chọn OAuth (nhấn
Enter).
- Nhấp vào đường liên kết (nếu không nhấp được, hãy đánh dấu URL trong Cloud Shell để sao chép, sau đó dán vào trình duyệt)
- Đăng nhập vào Tài khoản Google của bạn
- Sao chép mã
- Dán mã vào cửa sổ dòng lệnh của Trình chỉnh sửa Cloud Shell
- Nhấn
Enter.
- Nhấn
Enterđể chấp nhận một số chế độ cài đặt mặc định. - Cho phép Antigravity CLI liệt kê các công cụ MCP có sẵn trong ngữ cảnh của nó
Nhấn phím/mcpESCđể quay lại ô nhập câu lệnh. - Yêu cầu Antigravity CLI tìm một thứ gì đó trong vườn thú
Antigravity CLI sẽ biết cách sử dụng MCP ServerWhere can I find penguins?zoo-remotevà sẽ hỏi xem bạn có muốn cho phép thực thi MCP hay không. - Sử dụng mũi tên xuống, sau đó nhấn
Enterđể chọnYes, always allow all tools from server "zoo-remote"

Đầu ra phải cho thấy câu trả lời chính xác và một hộp hiển thị cho biết máy chủ MCP đã được sử dụng.

Bạn đã hoàn thành! Bạn đã triển khai thành công một máy chủ MCP từ xa lên Cloud Run và thử nghiệm máy chủ đó bằng Antigravity CLI.
Khi bạn đã sẵn sàng kết thúc phiên, hãy nhập /exit rồi nhấn Enter để thoát Antigravity CLI.
Gỡ lỗi
Nếu bạn thấy lỗi như sau:
🔍 Attempting OAuth discovery for 'zoo-remote'... ❌ 'zoo-remote' requires authentication but no OAuth configuration found Error connecting to MCP server 'zoo-remote': MCP server 'zoo-remote' requires authentication. Please configure OAuth or check server settings.
Có thể mã thông báo nhận dạng đã hết thời gian chờ và cần đặt lại ID_TOKEN.
- Nhập
/exitrồi nhấnEnterđể thoát Antigravity CLI. - Thiết lập dự án trong thiết bị đầu cuối
gcloud config set project [PROJECT_ID] - Chạy lại lệnh thông tin đăng nhập Google Cloud để lấy
ID_TOKENmới vì có thể của bạn đã hết hạn và ghi lại tệp cấu hình:export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)") export ID_TOKEN=$(gcloud auth print-identity-token) cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
{ "mcpServers": { "zoo-remote": { "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp", "headers": { "Authorization": "Bearer ${ID_TOKEN}" } } } } EOF ```
9. (Không bắt buộc) Xác minh Lệnh gọi công cụ trong nhật ký máy chủ
Để xác minh rằng máy chủ MCP Cloud Run của bạn đã được gọi, hãy kiểm tra nhật ký dịch vụ.
gcloud run services logs read zoo-mcp-server --region us-west1 --limit=5
Bạn sẽ thấy một nhật ký đầu ra xác nhận rằng một lệnh gọi công cụ đã được thực hiện. 🛠️
2025-08-05 19:50:31 INFO: 169.254.169.126:39444 - "POST /mcp HTTP/1.1" 200 OK 2025-08-05 19:50:31 [INFO]: Processing request of type CallToolRequest 2025-08-05 19:50:31 [INFO]: >>> 🛠️ Tool: 'get_animals_by_species' called for 'penguin'
10. (Không bắt buộc) Thêm lời nhắc MCP vào Máy chủ
Câu lệnh MCP có thể đẩy nhanh quy trình làm việc cho những câu lệnh mà bạn thường chạy bằng cách tạo một câu lệnh ngắn gọn cho một câu lệnh dài hơn.
Antigravity CLI tự động chuyển đổi câu lệnh MCP thành lệnh tuỳ chỉnh để bạn có thể gọi câu lệnh MCP bằng cách nhập /prompt_name, trong đó prompt_name là tên của câu lệnh MCP.
Tạo một câu lệnh MCP để bạn có thể nhanh chóng tìm thấy một con vật trong vườn thú bằng cách nhập /find animal vào Antigravity CLI.
- Thêm mã này vào tệp
server.pycủa bạn ở phía trên trình bảo vệ chính (if __name__ == "__main__":)@mcp.prompt() def find(animal: str) -> str: """ Find which exhibit and trail a specific animal might be located. """ return ( f"Please find the exhibit and trail information for {animal} in the zoo. " f"Respond with '[animal] can be found in the [exhibit] on the [trail].'" f"Example: Penguins can be found in The Arctic Exhibit on the Polar Path." ) - Triển khai lại ứng dụng của bạn lên Cloud Run
gcloud run deploy zoo-mcp-server \ --region=us-west1 \ --source=. \ --labels=dev-tutorial=codelab-mcp - Làm mới ID_TOKEN và tạo lại tệp cấu hình:
export ID_TOKEN=$(gcloud auth print-identity-token) export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)") cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
{ "mcpServers": { "zoo-remote": { "serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp", "headers": { "Authorization": "Bearer ${ID_TOKEN}" } } } } EOF ```
- Sau khi triển khai phiên bản mới của ứng dụng, hãy khởi động Antigravity CLI.
agy - Trong câu lệnh, hãy sử dụng lệnh tuỳ chỉnh mới mà bạn đã tạo:
/find lions
Bạn sẽ thấy Antigravity CLI gọi công cụ get_animals_by_species và định dạng phản hồi theo hướng dẫn của câu lệnh MCP!
╭───────────────────────────╮
│ > /find lions │
╰───────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✔ get_animals_by_species (zoo-remote MCP Server) get_animals_by_species (zoo-remote MCP Server) │
│ │
│ [{"species":"lion","name":"Leo","age":7,"enclosure":"The Big Cat │
│ Plains","trail":"Savannah │
│ Heights"},{"species":"lion","name":"Nala","age":6,"enclosure":"The Big Cat │
│ Plains","trail":"Savannah │
│ Heights"},{"species":"lion","name":"Simba","age":3,"enclosure":"The Big Cat │
│ Plains","trail":"Savannah │
│ Heights"},{"species":"lion","name":"King","age":8,"enclosure":"The Big Cat │
│ Plains","trail":"Savannah Heights"}] │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ Lions can be found in The Big Cat Plains on the Savannah Heights.
11. (Không bắt buộc) Sử dụng Gemini Flash Lite để nhận được câu trả lời nhanh hơn
Antigravity CLI cho phép bạn chọn mô hình và mức độ nỗ lực mà bạn đang sử dụng.
Vì các yêu cầu liên quan đến việc tìm động vật trong sở thú không đòi hỏi phải tư duy hoặc suy luận, nên hãy thử tăng tốc độ bằng cách sử dụng một mô hình nhanh hơn.
Trong phần trước, bạn đã tạo một câu lệnh MCP để có thể nhanh chóng tìm thấy một con vật trong vườn thú bằng cách nhập /find animal vào Antigravity CLI.
- Sau khi triển khai phiên bản mới của ứng dụng, hãy khởi động Antigravity CLI.
agy --model=gemini-3.6-flash --effort=low - Trong câu lệnh, hãy sử dụng lệnh tuỳ chỉnh mới mà bạn đã tạo:
/find lions
Bạn vẫn sẽ thấy Antigravity CLI gọi công cụ get_animals_by_species và định dạng phản hồi theo hướng dẫn của lời nhắc MCP, nhưng câu trả lời sẽ xuất hiện nhanh hơn nhiều!
╭───────────────────────────╮
│ > /find lions │
╰───────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✔ get_animals_by_species (zoo-remote MCP Server) get_animals_by_species (zoo-remote MCP Server) │
│ │
│ [{"species":"lion","name":"Leo","age":7,"enclosure":"The Big Cat │
│ Plains","trail":"Savannah │
│ Heights"},{"species":"lion","name":"Nala","age":6,"enclosure":"The Big Cat │
│ Plains","trail":"Savannah │
│ Heights"},{"species":"lion","name":"Simba","age":3,"enclosure":"The Big Cat │
│ Plains","trail":"Savannah │
│ Heights"},{"species":"lion","name":"King","age":8,"enclosure":"The Big Cat │
│ Plains","trail":"Savannah Heights"}] │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ Lions can be found in The Big Cat Plains on the Savannah Heights.
Gỡ lỗi
Nếu bạn thấy lỗi như sau:
✕ Unknown command: /find lions
Hãy thử chạy /mcp và nếu lệnh này xuất ra zoo-remote - Disconnected, thì có thể bạn phải triển khai lại hoặc chạy lại các lệnh sau:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member=user:$(gcloud config get-value account) \
--role='roles/run.invoker'
export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
export ID_TOKEN=$(gcloud auth print-identity-token)
cat > ~/.gemini/antigravity-cli/mcp_config.json << EOF
{
"mcpServers": {
"zoo-remote": {
"serverUrl": "https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp",
"headers": {
"Authorization": "Bearer ${ID_TOKEN}"
}
}
}
}
EOF
12. Kết luận
Xin chúc mừng! Bạn đã triển khai và kết nối thành công với một máy chủ MCP từ xa an toàn.
Tiếp tục chuyển sang bài thực hành tiếp theo
Lớp học này là lớp học đầu tiên trong một loạt gồm 3 lớp học. Trong phòng thí nghiệm thứ hai, bạn sẽ sử dụng máy chủ MCP mà bạn đã tạo bằng một Tác nhân ADK.
Sử dụng Máy chủ MCP trên Cloud Run với Tác nhân ADK
(Không bắt buộc) Dọn dẹp
Nếu không tiếp tục làm việc trong phòng thí nghiệm tiếp theo và muốn dọn dẹp những gì đã tạo, bạn có thể xoá dự án trên đám mây để tránh phát sinh thêm phí.
Mặc dù Cloud Run không tính phí khi dịch vụ không được sử dụng, nhưng bạn vẫn có thể bị tính phí khi lưu trữ hình ảnh vùng chứa trong Artifact Registry. Khi bạn xoá dự án trên đám mây, hệ thống sẽ ngừng tính phí cho tất cả tài nguyên được dùng trong dự án đó.
Nếu muốn, hãy xoá dự án:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
Bạn cũng có thể muốn xoá các tài nguyên không cần thiết khỏi đĩa cloudshell. Bạn có thể:
- Xoá thư mục dự án của lớp học lập trình:
rm -rf ~/mcp-on-cloudrun - Cảnh báo! Bạn không thể huỷ thao tác tiếp theo này! Nếu muốn xoá mọi thứ trên Cloud Shell để giải phóng dung lượng, bạn có thể xoá toàn bộ thư mục gốc. Hãy cẩn thận để đảm bảo rằng mọi thứ bạn muốn giữ lại đều được lưu ở nơi khác.
sudo rm -rf $HOME