كيفية نشر خادم MCP آمن على Cloud Run

1- مقدمة

نظرة عامة

في هذا الدرس التطبيقي، ستنشئ خادم Model Context Protocol (MCP) وتنشره. تفيد خوادم MCP في منح النماذج اللغوية الكبيرة إمكانية الوصول إلى الأدوات والخدمات الخارجية. ستضبطه كخدمة آمنة وجاهزة للإنتاج على Cloud Run يمكن الوصول إليها من عدة برامج. بعد ذلك، ستتصل بخادم MCP البعيد من Gemini CLI.

الإجراءات التي ستنفذّها

سنستخدم FastMCP لإنشاء خادم MCP لحديقة حيوانات يتضمّن أداتَين: get_animals_by_species وget_animal_details. يوفر FastMCP طريقة سريعة ومكتوبة بلغة Python لإنشاء خوادم MCP وبرامجها.

رسم بياني لخادم MCP في حديقة الحيوان

أهداف الدورة التعليمية

  • نشر خادم MCP على Cloud Run
  • تأمين نقطة نهاية الخادم من خلال طلب المصادقة لجميع الطلبات، ما يضمن إمكانية تواصل البرامج والوكلاء المفوّضين فقط معه
  • الاتصال بنقطة نهاية خادم MCP الآمنة من Gemini CLI

2. إعداد المشروع

  1. إذا لم يكن لديك حساب Google، عليك إنشاء حساب Google.
    • استخدِم حسابًا شخصيًا بدلاً من حساب عمل أو حساب تديره مؤسسة تعليمية. قد تتضمّن حسابات العمل والحسابات التي تديرها المؤسسات التعليمية قيودًا تمنعك من تفعيل واجهات برمجة التطبيقات اللازمة لهذا الدرس التطبيقي.
  2. سجِّل الدخول إلى Google Cloud Console.
  3. أنشئ مشروعًا جديدًا أو اختَر إعادة استخدام مشروع حالي.
    • إذا ظهرت لك رسالة خطأ بشأن حصة المشروع، أعِد استخدام مشروع حالي أو احذف مشروعًا حاليًا لإنشاء مشروع جديد.

3. فتح Cloud Shell Editor

  1. انقر على هذا الرابط للانتقال مباشرةً إلى Cloud Shell Editor
  2. إذا طُلب منك منح الإذن في أي وقت اليوم، انقر على منح الإذن للمتابعة. انقر لتفويض Cloud Shell
  3. إذا لم تظهر المحطة في أسفل الشاشة، افتحها:
    • انقر على عرض
    • انقر على المحطةفتح نافذة طرفية جديدة في "محرِّر Cloud Shell"
  4. في المحطة، اضبط مشروعك باستخدام هذا الأمر:
    • التنسيق:
      gcloud config set project [PROJECT_ID]
      
    • مثال:
      gcloud config set project lab-project-id-example
      
    • إذا لم تتمكّن من تذكُّر رقم تعريف مشروعك:
      • يمكنك عرض جميع أرقام تعريف مشاريعك باستخدام:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      ضبط رقم تعريف المشروع في نافذة Cloud Shell Editor
  5. يجب أن تظهر لك هذه الرسالة:
    Updated property [core/project].
    
    إذا ظهرت لك WARNING وطُلب منك Do you want to continue (Y/n)?، فمن المحتمل أنّك أدخلت رقم تعريف المشروع بشكل غير صحيح. اضغط على n، ثم اضغط على Enter، وحاوِل تشغيل الأمر gcloud config set project مرة أخرى.

4. تفعيل واجهات برمجة التطبيقات

في المحطة، فعِّل واجهات برمجة التطبيقات:

gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com

إذا طُلب منك منح الإذن، انقر على منح الإذن للمتابعة. انقر لتفويض Cloud Shell

قد يستغرق هذا الأمر بضع دقائق حتى يكتمل، ولكن من المفترض أن يعرض في النهاية رسالة نجاح مشابهة لهذه الرسالة:

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.

5. إعداد مشروع Python

  1. أنشئ مجلدًا باسم mcp-on-cloudrun لتخزين رمز المصدر للنشر:
    mkdir mcp-on-cloudrun && cd mcp-on-cloudrun
    
  2. أنشئ مشروع Python باستخدام أداة uv لإنشاء ملف pyproject.toml:
    uv init --description "Example of deploying an MCP server on Cloud Run" --bare --python 3.13
    
    ينشئ الأمر uv init ملف pyproject.toml لمشروعك.لعرض محتويات الملف، شغِّل ما يلي:
    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. إنشاء خادم MCP لحديقة الحيوانات

لتوفير سياق قيِّم لتحسين استخدام النماذج اللغوية الكبيرة مع MCP، يمكنك إعداد خادم MCP لحديقة حيوانات باستخدام FastMCP، وهو إطار عمل عادي للتعامل مع Model Context Protocol. يوفر FastMCP طريقة سريعة لإنشاء خوادم MCP وبرامجها باستخدام Python. يوفر خادم MCP هذا بيانات عن الحيوانات في حديقة حيوانات خيالية. لتبسيط العملية، نخزّن البيانات في الذاكرة. بالنسبة إلى خادم MCP للإنتاج، من المحتمل أن تريد توفير بيانات من مصادر مثل قواعد البيانات أو واجهات برمجة التطبيقات.

  1. شغِّل الأمر التالي لإضافة FastMCP كإعداد مطلوب في ملف pyproject.toml:
    uv add fastmcp==2.12.4 --no-sync
    
    سيؤدي ذلك إلى إضافة ملف uv.lock إلى مشروعك.
  2. أنشئ ملف server.py جديدًا وافتحه لرمز مصدر خادم MCP:
    cloudshell edit ~/mcp-on-cloudrun/server.py
    
    سيفتح الأمر cloudshell edit ملف server.py في المحرّر أعلى المحطة.
  3. أضِف رمز مصدر خادم MCP لحديقة الحيوانات التالي في ملف 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,
            )
        )
    

اكتمل الرمز البرمجي. حان وقت نشر خادم MCP على Cloud Run.

7. النشر على Cloud Run

يمكنك الآن نشر خادم MCP على Cloud Run مباشرةً من رمز المصدر.

  1. أنشئ ملف Dockerfile جديدًا وافتحه للنشر على Cloud Run:
    cloudshell edit ~/mcp-on-cloudrun/Dockerfile
    
  2. أدرِج الرمز البرمجي التالي في ملف Dockerfile لاستخدام أداة uv لتشغيل ملف server.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"]
    
  3. أنشئ حساب خدمة باسم mcp-server-sa:
    gcloud iam service-accounts create mcp-server-sa --display-name="MCP Server Service Account"
    
  4. شغِّل أمر gcloud لنشر التطبيق على Cloud Run
    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 لطلب المصادقة. هذا الإجراء مهم لأسباب أمنية. إذا لم تطلب المصادقة، يمكن لأي مستخدم استدعاء خادم MCP الخاص بك وإلحاق ضرر محتمل بنظامك.
  5. أكِّد إنشاء مستودع جديد في Artifact Registry. بما أنّ هذه هي المرة الأولى التي تنشر فيها على Cloud Run من رمز المصدر، سيظهر لك ما يلي:
    Deploying 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)?
    
    اكتب Y واضغط على Enter، وسيؤدي ذلك إلى إنشاء مستودع Artifact Registry لعملية النشر. هذا الإجراء مطلوب لتخزين حاوية Docker لخادم MCP لخدمة Cloud Run.
  6. بعد بضع دقائق، ستظهر لك رسالة مثل:
    Service [zoo-mcp-server] revision [zoo-mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
    

لقد نشرت خادم MCP. يمكنك الآن استخدامه.

8. إضافة خادم MCP البعيد إلى Gemini CLI

بعد نشر خادم MCP بعيد بنجاح، يمكنك الاتصال به باستخدام تطبيقات مختلفة مثل Google Code Assist أو Gemini CLI. في هذا القسم، سننشئ اتصالاً بخادم MCP البعيد الجديد باستخدام Gemini CLI.

  1. امنح حساب المستخدم إذن استدعاء خادم MCP البعيد
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member=user:$(gcloud config get-value account) \
        --role='roles/run.invoker'
    
  2. احفظ بيانات اعتماد Google Cloud ورقم تعريف المشروع في متغيرات البيئة لاستخدامها في ملف إعدادات Gemini:
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  3. أنشئ مجلدًا باسم .gemini إذا لم يتم إنشاؤه بعد
    mkdir -p ~/.gemini
    
  4. افتح ملف إعدادات Gemini CLI
    cloudshell edit ~/.gemini/settings.json
    
  5. استبدِل ملف إعدادات Gemini CLI لإضافة خادم MCP على Cloud Run
    {
        "ide": {
            "hasSeenNudge": true
        },
        "mcpServers": {
            "zoo-remote": {
                "httpUrl": "https://zoo-mcp-server-$PROJECT_NUMBER.us-west1.run.app/mcp",
                "headers": {
                    "Authorization": "Bearer $ID_TOKEN"
                }
            }
        },
        "security": {
            "auth": {
                "selectedType": "cloud-shell"
            }
        }
    }
    
  6. ابدأ Gemini CLI في Cloud Shell
    gemini
    
    قد تحتاج إلى الضغط على Enter لقبول بعض الإعدادات التلقائية.العرض الأوّلي في Gemini CLI
  7. اطلب من Gemini إدراج أدوات MCP المتاحة له ضمن سياقه
    /mcp
    
  8. اطلب من Gemini العثور على شيء في حديقة الحيوانات
    Where can I find penguins?
    
    من المفترض أن يعرف Gemini CLI استخدام خادم MCP zoo-remote وسيطلب منك السماح بتنفيذ MCP.
  9. استخدِم السهم المتّجه للأسفل، ثم اضغط على Enter للاختيار
    Yes, always allow all tools from server "zoo-remote"
    
    ‫Gemini CLI allow zoo remote tools

يجب أن يعرض الناتج الإجابة الصحيحة ومربّع عرض يوضّح أنّه تم استخدام خادم MCP.

عرض نتيجة خادم MCP الخاص بحديقة الحيوان في Gemini CLI

لقد أنجزت المهمة بنجاح. لقد نشرت خادم MCP بعيدًا على Cloud Run واختبرته باستخدام Gemini CLI.

عندما تصبح مستعدًا لإنهاء جلستك، اكتب /quit ثم اضغط على Enter للخروج من Gemini CLI.

تصحيح الأخطاء

إذا ظهرت لك رسالة خطأ مثل هذه:

🔍 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.

من المحتمل أنّ رمز تعريفك قد انتهت مهلته ويتطلب ضبط ID_TOKEN مرة أخرى.

  1. اكتب /quit ثم اضغط على Enter للخروج من Gemini CLI.
  2. اضبط مشروعك في المحطة
    gcloud config set project [PROJECT_ID]
    
  3. أعِد تشغيل أمر بيانات اعتماد Google Cloud للحصول على ID_TOKEN جديد لأنّ الرمز الحالي قد يكون منتهي الصلاحية.
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    

9- (اختياري) التحقّق من استدعاءات الأدوات في سجلات الخادم

للتحقّق من أنّه تم استدعاء خادم MCP على Cloud Run، اطّلِع على سجلات الخدمة.

gcloud run services logs read zoo-mcp-server --region us-west1 --limit=5

يجب أن يظهر لك سجلّ ناتج يؤكّد أنّه تم إجراء استدعاء أداة. 🛠️

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- (اختياري) إضافة طلب MCP إلى الخادم

يمكن أن يؤدي طلب MCP إلى تسريع سير العمل للطلبات التي تشغّلها غالبًا من خلال إنشاء اختصار لطلب أطول.

يحوّل Gemini CLI تلقائيًا طلبات MCP إلى أوامر مخصّصة تبدأ بشرطة مائلة حتى تتمكّن من استدعاء طلب MCP عن طريق كتابة /prompt_name حيث prompt_name هو اسم طلب MCP.

أنشئ طلب MCP حتى تتمكّن من العثور بسرعة على حيوان في حديقة الحيوانات عن طريق كتابة /find animal في Gemini CLI.

  1. أضِف هذا الرمز البرمجي إلى ملف server.py أعلى الحارس الرئيسي (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."
        )
    
  2. أعِد نشر تطبيقك على Cloud Run
    gcloud run deploy zoo-mcp-server \
        --region=us-west1 \
        --source=. \
        --labels=dev-tutorial=codelab-mcp
    
  3. أعِد تحميل `ID_TOKEN` لخادم MCP البعيد
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  4. بعد نشر الإصدار الجديد من تطبيقك، ابدأ Gemini CLI.
    gemini
    
  5. في الطلب، استخدِم الأمر المخصّص الجديد الذي أنشأته:
    /find lions
    

يجب أن يظهر لك أنّ Gemini CLI يستدعي أداة get_animals_by_species ويُنسِّق الردّ وفقًا للتعليمات الواردة في طلب 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- (اختياري) استخدام Gemini Flash Lite للحصول على ردود أسرع

يتيح لك Gemini CLI اختيار النموذج الذي تستخدمه.

  • Gemini 2.5 Pro هو أحدث نموذج مفكِّر من Google، وهو قادر على الاستدلال بشأن المشاكل المعقّدة في الرموز البرمجية والرياضيات والعلوم والتكنولوجيا والهندسة والرياضيات (STEM)، بالإضافة إلى تحليل مجموعات البيانات الكبيرة وقواعد الرموز البرمجية والمستندات باستخدام السياق الطويل.
  • Gemini 2.5 Flash هو أفضل نموذج من Google من حيث السعر والأداء، وهو يقدّم إمكانات شاملة. ‫2.5 Flash هو الخيار الأفضل للمهام التي تتطلّب التفكير ومعالجة البيانات على نطاق واسع، والمهام التي تتطلّب وقت استجابة منخفضًا، والمهام التي تتطلّب معالجة كميات كبيرة من البيانات، وحالات الاستخدام التي تستند إلى الذكاء الاصطناعي الوكيل.
  • Gemini 2.5 Flash Lite هو أسرع نموذج Flash من Google، وهو محسّن لتحقيق فعالية من حيث التكلفة ومعدّل أعلى لنقل البيانات.

بما أنّ الطلبات المتعلقة بالعثور على حيوانات حديقة الحيوانات لا تتطلب التفكير أو الاستدلال، حاوِل تسريع العملية باستخدام نموذج أسرع.

في القسم السابق، أنشأت طلب MCP حتى تتمكّن من العثور بسرعة على حيوان في حديقة الحيوانات عن طريق كتابة /find animal في Gemini CLI.

  1. بعد نشر الإصدار الجديد من تطبيقك، ابدأ Gemini CLI.
    gemini --model=gemini-2.5-flash-lite
    
  2. في الطلب، استخدِم الأمر المخصّص الجديد الذي أنشأته:
    /find lions
    

يجب أن يظهر لك أنّ Gemini CLI يستدعي أداة get_animals_by_species ويُنسِّق الردّ وفقًا للتعليمات الواردة في طلب 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.

تصحيح الأخطاء

إذا ظهرت لك رسالة خطأ مثل هذه:

✕ Unknown command: /find lions

حاوِل تشغيل /mcp وإذا ظهر لك zoo-remote - Disconnected، قد تحتاج إلى إعادة النشر أو تشغيل الأوامر التالية مرة أخرى:

 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)

12- الخاتمة

تهانينا! لقد نشرت خادم MCP بعيدًا آمنًا وتصلت به بنجاح.

متابعة الدرس التطبيقي التالي

هذا الدرس التطبيقي هو الأول في سلسلة من ثلاثة أجزاء. في الدرس التطبيقي الثاني، ستستخدم خادم MCP الذي أنشأته مع وكيل ADK.

استخدام خادم MCP على Cloud Run مع وكيل ADK

(اختياري) التنظيف

إذا كنت لا تريد متابعة الدرس التطبيقي التالي وأردت تنظيف ما أنشأته، يمكنك حذف مشروع على السحابة الإلكترونية لتجنُّب تكبّد رسوم إضافية.

على الرغم من أنّ Cloud Run لا يفرض رسومًا عندما لا تكون الخدمة قيد الاستخدام، قد يتم تحصيل رسوم منك مقابل تخزين صورة الحاوية في Artifact Registry. يؤدي حذف مشروع على السحابة الإلكترونية إلى إيقاف الفوترة لجميع الموارد المستخدَمة في هذا المشروع.

إذا أردت، احذف المشروع:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

قد تحتاج أيضًا إلى حذف الموارد غير الضرورية من قرص Cloud Shell. يمكنك إجراء ما يلي:

  1. احذف دليل مشروع الدرس التطبيقي:
    rm -rf ~/mcp-on-cloudrun
    
  2. تحذير! لا يمكن التراجع عن الإجراء التالي. إذا أردت حذف كل شيء على Cloud Shell لإخلاء مساحة، يمكنك حذف دليل الصفحة الرئيسية بالكامل. احرص على حفظ كل ما تريد الاحتفاظ به في مكان آخر.
    sudo rm -rf $HOME