Remote-MCP-Server in Cloud Run erstellen und bereitstellen

In dieser Anleitung erfahren Sie, wie Sie einen Remote-MCP-Server (Model Context Protocol) in Cloud Run mit dem streamfähigen HTTP-Transport erstellen und bereitstellen. Mit dem streamfähigen HTTP-Transport fungiert der MCP-Server als unabhängiger Prozess, der mehrere Clientverbindungen verarbeiten kann.

Ziele

In dieser Anleitung wird Folgendes beschrieben:

  1. Python-Projekt mit dem uv Paketmanager vorbereiten.
  2. MCP-Server für mathematische Operationen erstellen.
  3. In Cloud Run bereitstellen.
  4. MCP-Client authentifizieren.
  5. Remote-MCP-Server testen.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Verwenden Sie den Preisrechner.

Neuen Nutzern von Google Cloud steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

  1. Melden Sie sich in Ihrem Google Cloud Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie ein Konto, um die Leistung unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Aktivieren Sie die Artifact Registry API, die Cloud Run Admin API und die Cloud Build API.

    Rollen, die zum Aktivieren von APIs erforderlich sind

    Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin), die die Berechtigung serviceusage.services.enable enthält. Informationen zum Zuweisen von Rollen.

    APIs aktivieren

  7. Richten Sie Ihre Cloud Run-Entwicklungsumgebung ein in Ihrem Google Cloud Projekt.
  8. Achten Sie darauf, dass Sie die entsprechenden Berechtigungen zum Bereitstellen von Diensten haben und dass Ihrem Konto die Rollen „Cloud Run-Administrator“ (roles/run.admin) und „Dienstkontonutzer“ (roles/iam.serviceAccountUser) zugewiesen sind.
  9. Weisen Sie Ihrem Konto die Rolle „Cloud Run Aufrufer (roles/run.invoker)“ zu. Mit dieser Rolle kann der Remote-MCP-Server auf den Cloud Run-Dienst zugreifen.
  10. Rollen zuweisen

    Console

    1. Rufen Sie in der Google Cloud Console die Seite IAM auf.

      IAM aufrufen
    2. Wählen Sie das Projekt aus.
    3. Klicken Sie auf „Zugriffsrechte erteilen.
    4. Geben Sie im Feld Neue Hauptkonten Ihre Nutzer-ID ein. Dies ist in der Regel die E-Mail-Adresse, die zum Bereitstellen des Cloud Run-Dienstes verwendet wird.

    5. Wählen Sie in der Liste Rolle auswählen eine Rolle aus.
    6. Klicken Sie auf Add another role, um weitere Rollen zuzuweisen.
    7. Klicken Sie auf Speichern.

    gcloud

    So weisen Sie Ihrem Konto die erforderlichen IAM-Rollen in Ihrem Projekt zu:

       gcloud projects add-iam-policy-binding PROJECT_ID \
           --member=PRINCIPAL \
           --role=ROLE
       

    Ersetzen Sie:

    • PROJECT_NUMBER: Ihre Google Cloud Projekt nummer.
    • PROJECT_ID: Ihre Google Cloud Projekt-ID.
    • PRINCIPAL: die E-Mail-Adresse des Kontos, dem Sie die Rolle zuweisen.
    • ROLE: die Rolle, die Sie dem Bereitsteller Konto hinzufügen.
  11. Wenn Sie einer Domaineinschränkung zur Organisation nicht eingeschränkter Aufrufe für Ihr Projekt unterliegen, müssen Sie auf Ihren bereitgestellten Dienst zugreifen, wie unter Private Dienste testen beschrieben.

  12. Installieren Sie Uv, einen Python-Paket- und Projektmanager.

Python-Projekt vorbereiten

In den folgenden Schritten wird beschrieben, wie Sie Ihr Python-Projekt mit dem uv Paketmanager einrichten.

  1. Erstellen Sie einen Ordner mit dem Namen mcp-on-cloudrun, um den Quellcode für die Bereitstellung zu speichern:

      mkdir mcp-on-cloudrun
      cd mcp-on-cloudrun
    
  2. Erstellen Sie mit dem Tool uv ein Python-Projekt, um eine pyproject.toml-Datei zu generieren:

      uv init --name "mcp-on-cloudrun" --description "Example of deploying an MCP server on Cloud Run" --bare --python 3.10
    

    Mit dem Befehl uv init wird die folgende pyproject.toml-Datei erstellt:

    [project]
    name = "mcp-server"
    version = "0.1.0"
    description = "Example of deploying an MCP server on Cloud Run"
    readme = "README.md"
    requires-python = ">=3.10"
    dependencies = []
    
  3. Erstellen Sie die folgenden zusätzlichen neuen Dateien:

    • server.py für den Quellcode des MCP-Servers
    • test_server.py zum Testen des Remote-Servers
    • Ein Dockerfile für die Bereitstellung in Cloud Run
    touch server.py test_server.py Dockerfile
    

    Ihr Projektverzeichnis sollte die folgende Struktur haben:

    ├── mcp-on-cloudrun
    │   ├── pyproject.toml
    │   ├── server.py
    │   ├── test_server.py
    │   └── Dockerfile
    

MCP-Server für mathematische Operationen erstellen

Um wertvollen Kontext für die Verbesserung der Verwendung von LLMs mit MCP zu liefern, richten Sie mit FastMCP einen MCP-Server für mathematische Operationen ein. FastMCP bietet eine schnelle Möglichkeit, MCP-Server und -Clients mit Python zu erstellen.

Führen Sie die folgenden Schritte aus, um einen MCP-Server für mathematische Operationen wie Addition und Subtraktion zu erstellen.

  1. Führen Sie den folgenden Befehl aus, um FastMCP als Abhängigkeit in der Datei pyproject.toml hinzuzufügen:

    uv add fastmcp==2.13.1 --no-sync
    
  2. Fügen Sie der Datei server.py den folgenden Quellcode des MCP-Servers für mathematische Operationen hinzu:

    import asyncio
    import logging
    import os
    
    from fastmcp import FastMCP 
    
    logger = logging.getLogger(__name__)
    logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
    
    mcp = FastMCP("MCP Server on Cloud Run")
    
    @mcp.tool()
    def add(a: int, b: int) -> int:
        """Use this to add two numbers together.
    
        Args:
            a: The first number.
            b: The second number.
    
        Returns:
            The sum of the two numbers.
        """
        logger.info(f">>> 🛠️ Tool: 'add' called with numbers '{a}' and '{b}'")
        return a + b
    
    @mcp.tool()
    def subtract(a: int, b: int) -> int:
        """Use this to subtract two numbers.
    
        Args:
            a: The first number.
            b: The second number.
    
        Returns:
            The difference of the two numbers.
        """
        logger.info(f">>> 🛠️ Tool: 'subtract' called with numbers '{a}' and '{b}'")
        return a - b
    
    if __name__ == "__main__":
        logger.info(f"🚀 MCP server started on port {os.getenv('PORT', 8080)}")
        # Could also use 'sse' transport, host="0.0.0.0" required for Cloud Run.
        asyncio.run(
            mcp.run_async(
                transport="streamable-http",
                host="0.0.0.0",
                port=os.getenv("PORT", 8080),
            )
        )
    
  3. Fügen Sie dem Dockerfile den folgenden Code hinzu, um das Tool uv zum Ausführen der Datei server.py zu verwenden:

    # 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"]
    

In Cloud Run bereitstellen

Sie können den MCP-Server als Container-Image oder als Quellcode:bereitstellen:

Container-Image

Folgen Sie dieser Anleitung, um einen MCP-Server bereitzustellen, der als Container-Image verpackt ist.

  1. Erstellen Sie ein Artifact Registry-Repository zum Speichern des Container-Images:

    gcloud artifacts repositories create remote-mcp-servers \
    --repository-format=docker \
    --location=us-central1 \
    --description="Repository for remote MCP servers" \
    --project=PROJECT_ID
    
  2. Erstellen Sie das Container-Image und übertragen Sie es per Push mit Cloud Build in Artifact Registry:

    gcloud builds submit --region=us-central1 --tag us-central1-docker.pkg.dev/PROJECT_ID/remote-mcp-servers/mcp-server:latest
    
  3. Stellen Sie das Container-Image des MCP-Servers in Cloud Run bereit:

    gcloud run deploy mcp-server \
    --image us-central1-docker.pkg.dev/PROJECT_ID/remote-mcp-servers/mcp-server:latest \
    --region=us-central1 \
    --no-allow-unauthenticated
    

Quelle

Sie können Remote-MCP-Server aus ihren Quellen in Cloud Run bereitstellen.

Stellen Sie es mit dem folgenden Befehl aus der Quelle bereit:

gcloud run deploy mcp-server --no-allow-unauthenticated --region=us-central1 --source .

MCP-Client authentifizieren

Wenn Sie Ihren Dienst mit dem Flag --no-allow-unauthenticated bereitgestellt haben, muss sich jeder MCP-Client, der eine Verbindung zu Ihrem Remote-MCP-Server herstellt, authentifizieren.

  1. Weisen Sie dem Dienstkonto die Rolle „Cloud Run-Aufrufer“ (roles/run.invoker) zu. Diese Identity and Access Management-Richtlinienbindung sorgt dafür, dass ein starker Sicherheitsmechanismus verwendet wird, um Ihren lokalen MCP-Client zu authentifizieren.

  2. Führen Sie den Cloud Run-Proxy aus, um einen authentifizierten Tunnel zum Remote-MCP-Server auf Ihrem lokalen Computer zu erstellen:

    gcloud run services proxy mcp-server --region=us-central1
    

    Wenn der Cloud Run-Proxy noch nicht installiert ist, werden Sie mit diesem Befehl aufgefordert, den Proxy herunterzuladen. Folgen Sie der Anleitung, um den Proxy herunterzuladen und zu installieren.

Cloud Run authentifiziert den gesamten Traffic zu http://127.0.0.1:8080 und leitet Anfragen an den Remote-MCP-Server weiter.

Remote-MCP-Server testen

Sie testen und verbinden sich mit dem Remote-MCP-Server, indem Sie den FastMCP-Client verwenden und auf die URL http://127.0.0.1:8080/mcp zugreifen.

So testen und rufen Sie den Mechanismus zum Hinzufügen und Subtrahieren auf:

  1. Führen Sie den Cloud Run-Proxy aus, bevor Sie den Testserver ausführen.

  2. Erstellen Sie eine Testdatei mit dem Namen test_server.py und fügen Sie den folgenden Code hinzu:

    import asyncio
    
    from fastmcp import Client
    
    
    async def test_server():
        # Test the MCP server using streamable-http transport.
        # Use "/sse" endpoint if using sse transport.
        async with Client("http://localhost:8080/mcp") as client:
            # List available tools
            tools = await client.list_tools()
            for tool in tools:
                print(f">>> 🛠️  Tool found: {tool.name}")
            # Call add tool
            print(">>> 🪛  Calling add tool for 1 + 2")
            result = await client.call_tool("add", {"a": 1, "b": 2})
            print(f"<<< ✅ Result: {result.content[0].text}")
            # Call subtract tool
            print(">>> 🪛  Calling subtract tool for 10 - 3")
            result = await client.call_tool("subtract", {"a": 10, "b": 3})
            print(f"<<< ✅ Result: {result.content[0].text}")
    
    
    if __name__ == "__main__":
        asyncio.run(test_server())
  3. Führen Sie den Testserver in einem neuen Terminal aus:

    uv run test_server.py
    

    Es sollte folgende Ausgabe angezeigt werden:

     🛠️ Tool found: add
     🛠️ Tool found: subtract
     🪛 Calling add tool for 1 + 2
     ✅ Result: 3
     🪛 Calling subtract tool for 10 - 3
     ✅ Result: 7
    

Bereinigen

Löschen Sie alle Ressourcen , die Sie mit dieser Anleitung bereitgestellt haben, um zusätzliche Kosten für Ihr Google Cloud Konto zu vermeiden.

Projekt löschen

Wenn Sie ein neues Projekt für diese Anleitung erstellt haben, löschen Sie das Projekt. Wenn Sie ein vorhandenes Projekt verwendet haben und es beibehalten möchten, ohne die Änderungen in dieser Anleitung hinzuzufügen , löschen Sie die für die Anleitung erstellten Ressourcen.

Am einfachsten vermeiden Sie weitere Kosten, wenn Sie das zum Ausführen der Anleitung erstellte Projekt löschen.

So löschen Sie das Projekt:

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Herunterfahren), um das Projekt zu löschen.

Anleitungsressourcen löschen

  1. Löschen Sie den Cloud Run-Dienst, den Sie in dieser Anleitung bereitgestellt haben. Für Cloud Run-Dienste fallen erst Kosten an, wenn sie Anfragen erhalten.

    Führen Sie den folgenden Befehl aus, um Ihren Cloud Run-Dienst zu löschen:

    gcloud run services delete SERVICE-NAME

    Ersetzen Sie SERVICE-NAME durch den Namen Ihres Dienstes.

    Sie können Cloud Run-Dienste auch über die Google Cloud Console löschen.

  2. Entfernen Sie die Konfiguration der Standardregion gcloud, die Sie während der Einrichtung für die Anleitung hinzugefügt haben:

     gcloud config unset run/region
    
  3. Entfernen Sie die Projektkonfiguration:

     gcloud config unset project