Wie Sie einen eigenen MCP Server auf SAP BTP einrichten

Wie Sie einen eigenen MCP Server auf SAP BTP einrichten

MCP-Server sind der Schlüssel für einen produktiven Einsatz von AI-Agenten. Sie bieten eine standardisierte Schnittstelle für den Zugriff der LLMs auf externe Werkzeuge und Datenquellen. In diesem Beitrag zeige ich Ihnen, wie Sie selbstständig einen MCP Server erstellen und auf SAP BTP Cloud Foundry hosten können.

Operatives Reporting und strategische Planung in gewohnter Excel Umgebung. Mit der zweiten Auflage meines Praxishandbuchs lernen Sie, SAP Analysis for Microsoft Office einzurichten, aktuelle Daten aus SAP Systemen in Excel auszuwerten und professionelle Berichte zu erstellen.

Im Beitrag Vibe Coding mit SAP AI Core habe ich die Verwendung von MCP Servern vorgestellt. In diesem Beitrag werden wir einen eigenen MCP Server erstellen und auf SAP BTP hosten.

Um die Funktionsweise zu erklären, erstelle ich einen einfachen MCP Server, der die aktuelle Zeit ausgibt. Abgelegt als time_server.py.

from mcp.server.fastmcp import FastMCP
from datetime import datetime

# Create an instance of the FastMCP server
mcp = FastMCP("TimeServer", stateless_http=True)

@mcp.tool(description="Provides the current time in ISO format as a string")
def get_current_time() -> str:
    """
    Use this tool to get the current time in ISO format as a string.

    Returns:
    str: Current time in ISO format. The full format looks like 'YYYY-MM-DD HH:MM:SS.mmmmmm'. The default separator between date and time is 'T'. e.g 2025-10-17T17:04:22.739427. 
    """
    return datetime.now().isoformat()

Darüber hinaus erstelle ich einen Ressourcen MCP Server, der den Inhalt von denis_reis_cv.md bereitstellt. Gespeichert als cv_server.py.

from mcp.server.fastmcp import FastMCP
from pathlib import Path
import anyio

# Create an instance of the FastMCP server
mcp = FastMCP("CvServer", stateless_http=True)

@mcp.resource(
    uri="data://cv",
    name="DenisReisCv",
    description="Provides the CV of Denis Reis.",
    mime_type="text/markdown",
)
async def get_cv() -> str:
    """
    Retrieves the professional CV of Denis Reis.
    
    Returns:
        str: The complete CV content in markdown format, or an error message if unavailable.
    
    Raises:
        Returns error message strings rather than exceptions for graceful degradation.
    """
    try:
        # Get the directory where this script is located
        script_dir = Path(__file__).parent
        cv_path = script_dir / "denis_reis_cv.md"
        
        # Use anyio to perform file I/O in a thread pool to avoid blocking the event loop
        cv_content = await anyio.Path(cv_path).read_text(encoding="utf-8")
        return cv_content
    except FileNotFoundError:
        return "Error: CV file not found."
    except Exception as e:
        return f"Error reading CV: {str(e)}"

def main():
    # Initialize and run the server
    mcp.run(transport='stdio')

if __name__ == "__main__":
    main()

Diese beiden Server werden über die server.py Datei gestartet. Beachten Sie, dass der Time MCP über <host>/time/mcp und der CV MCP über <host>/cv/mcp erreichbar sein wird.

import contextlib
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import os

from time_server import mcp as time_mcp
from cv_server import mcp as cv_mcp

# Create a combined lifespan to manage both session managers
@contextlib.asynccontextmanager
async def lifespan(app: FastAPI):
    async with contextlib.AsyncExitStack() as stack:
        await stack.enter_async_context(time_mcp.session_manager.run())
        await stack.enter_async_context(cv_mcp.session_manager.run())
        yield


app = FastAPI(lifespan=lifespan)
app.mount("/time", time_mcp.streamable_http_app())
app.mount("/cv", cv_mcp.streamable_http_app())

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["POST", "GET", "OPTIONS"],
    allow_headers=["*"],
)

PORT = os.environ.get("PORT", 10000)

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=PORT)

Um die MCP Server als Remote Streamable HTTP Server bereitzustellen, richten wir diese auf SAP BTP ein. Die Erstellung einer Cloud Foundry App auf BTP habe ich Wie Sie eine App auf SAP BTP Cloud Foundry erstellen detailliert beschrieben.

Definieren Sie die folgenden Dateien:

manifest.yml

---
applications:
- name: mcp_demo
  random-route: false
  routes:
  - route: https://mcp_demo.cfapps.eu10-004.hana.ondemand.com
  path: ./
  memory: 512M
  disk_quota: 1024M
  instances: 2
  buildpacks: 
  - python_buildpack
  command: python server.py

Procfile

web: python server.py

requirements.txt

anyio==4.7.0
fastapi==0.119.0
mcp==1.18.0
uvicorn==0.37.0

runtime.txt

python-3.13.x

Folgen Sie anschließend den Anweisungen, um die App über cf push bereitzustellen.

Nach der erfolgreichen Bereitstellung können die MCP Server über die URLs https://mcp_demo.cfapps.eu10-004.hana.ondemand.com/time/mcp sowie https://mcp_demo.cfapps.eu10-004.hana.ondemand.com/cv/mcp erreicht werden.


Planung mit SAP Business Planning and Consolidation leicht gemacht

Planung mit SAP Business Planning and Consolidation leicht gemacht!

So erleichtern Sie die Entscheidungsfindung und gewinnen einen umfassenden Überblick über Ihr Geschäft! Mit diesem Buch lernen Sie, SAP BPC für die Unternehmensplanung einzurichten, zu nutzen und zu erweitern. Anhand zahlreicher Abbildungen werden die Grundprinzipien der BPC-Embedded-Anwendungen dargestellt.

MCP Server testen

Sie können den MCP Inspector nutzen, um Ihre MCP Server zu testen.

npx @modelcontextprotocol/inspector

Alternativ können Sie die beiden MCP Server direkt in Ihren Agenten einsetzen, z.B. GitHub Copilot in VS Code. Gehen Sie dazu im Agent Modus auf Einstellungen.

Github Copilot Werkzeuge konfigurieren

Wählen Sie anschließend Add MCP Server aus.

MCP Server hinzufügen

Wählen Sie nun als Typ HTTP aus.

HTTP MCP Server auswählen

Geben Sie nun die URL des MCP Servers, den Sie gerade auf BTP bereitgestellt haben ein.

URL eingeben

Vergeben Sie anschließend eine eindeutige ID.

MCP ID vergeben

Selektieren Sie schließlich, ob der MCP Server Global oder nur in dem aktuellen Workspace verfügbar sein soll.

Globale bzw Lokale Ausführung

Nun wird die Konfiguration aktualisiert und Sie sehen, dass der Server erfolgreich gestartet wurde und ein Tool / Werkzeug identifiziert wurde.

json Konfiguration

Anbei die json Konfiguration:

{
	"servers": {
		"mcp-time": {
			"url": "https://mcp_demo.cfapps.eu10-004.hana.ondemand.com/time/mcp",
			"type": "http"
		},
		"mcp-cv": {
			"url": "https://mcp_demo.cfapps.eu10-004.hana.ondemand.com/cv/mcp",
			"type": "http"
		}
	},
	"inputs": []
}

Sie können die Verfügbaren Tools auch über die Configure Tools Einstellung einsehen.

Github Copilot Werkzeuge konfigurieren
Werkzeuge einsehen

Die Ressourcen können unter Extensions MCP Servers – Installed eingesehen werden.

Installierte MCP Server

Wählen Sie dazu die Option Browse Resources aus.

Ressourcen anzeigen

Wählen Sie anschließend die gewünschte Ressource aus.

Ressource auswählen

Der Inhalt der Ressource wird angezeigt.

Inhalt wird angezeigt

Wenn Sie nun eine Frage an den Github Copilot Agenten richten, wird er die ihm zur Verfügung stehenden Tools nutzen.

Ihre User beklagen sich über langsame Berichte?

  • In meinem Newsletter lernen Sie, wie Sie Abhilfe schaffen.
  • Entdecken Sie die Möglichkeiten der Performanceoptimierung.
  • Praktische Anleitungen ermöglichen Ihnen schnelle Erfolge bei der Optimierung von SAP Systemen.
  • Viele Tipps und Tricks zu SAP BI Themen.
  • Holen Sie die maximale Performance aus Ihrem SAP BI!
  • Bei der Anmeldung zu meinem Newsletter erhalten Sie das Buch „High Performance SAP BI“ als Willkommensgeschenk.
Fordere SAP Performance Tricks an

Jetzt anfordern!

* Pflichtfeld
 
Kein SPAM. Ich hasse Spam genau so wie du.
0 Kommentare

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

This site uses Akismet to reduce spam. Learn how your comment data is processed.