JouleOps MCP Server
JouleOps @ NorthWind Manufacturing
Agentischer KI-Unternehmensassistent mit SAP Joule, SAP HANA Cloud, Python FastAPI und Model Context Protocol (MCP).
JouleOps ist ein szenariobasierter Unternehmensassistent für NorthWind Manufacturing. Er bietet eine kontrollierte Schnittstelle in natürlicher Sprache zum Abrufen operativer Daten aus SAP HANA Cloud und zur Durchführung kontrollierter Geschäftsaktionen über Python-FastAPI-Dienste und einen benutzerdefinierten MCP-Server.
Inhaltsverzeichnis
Related MCP server: SAP OData to MCP Server
Projektübersicht
NorthWind Manufacturing speichert seine operativen Daten in SAP HANA Cloud. JouleOps bietet eine einheitliche agentische Schnittstelle für gängige Werks-, Vertriebs- und Finanzoperationen.
Der vorgesehene End-to-End-Ablauf ist:
User
↓
SAP Joule / Joule Studio Agent
↓
Joule Skill OR MCP Tool
↓
Python FastAPI / MCP Server
↓
SAP HANA Cloud
↓
JSON Result
↓
Joule Agent
↓
Grounded ResponseDas Projekt kombiniert REST-basierte Joule-Skills mit MCP-basierter Tool-Bereitstellung, sodass dieselben Backend-Fähigkeiten über kontrollierte Integrationspfade genutzt werden können.
Problemstellung
Das Projekt adressiert gängige operative Aufgaben bei NorthWind Manufacturing:
Materialbestand und Sicherheitsbestand an einem Werk prüfen.
Offene Kundenaufträge für eine Region und einen Datumsbereich abrufen.
Kundenexposition und überfällige Rechnungen prüfen.
Überfällige Rechnungen zusammenfassen und Inkassoentscheidungen unterstützen.
Wartungstickets erstellen, wenn operative Maßnahmen erforderlich sind.
Anstatt mehrere Systeme manuell abzufragen, können Benutzer diese Anforderungen in natürlicher Sprache über SAP Joule ausdrücken.
Hauptfunktionen
Operative Daten
Materialdetails nach Material und Werk.
Offene Kundenaufträge nach Region und Datumsbereich.
Kundenübersichten.
Zusammenfassungen überfälliger Rechnungen.
Geschäftsaktionen
Wartungstickets erstellen.
Material-/Werk-Kombinationen vor der Ticket-Erstellung verifizieren.
Audit-Datensätze für Geschäftsaktionen schreiben.
MCP
Benutzerdefinierter Python-MCP-Server mit FastMCP.
Streamable-HTTP-Transport.
MCP-Tool-Erkennung und -Ausführung über MCP Inspector.
Wiederverwendung der Backend-Geschäftslogik.
Schutzmaßnahmen
HANA-Anmeldedaten bleiben im Backend.
Pydantic-Validierung.
Parametrisierte SQL-Abfragen.
Audit-Protokollierung.
Rollenbewusste Schreiboperationen.
Kein Raten fehlender erforderlicher Geschäftsparameter.
Architektur
┌──────────────────────┐
│ User / Joule │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ SAP Joule Studio │
│ Agent │
└──────────┬───────────┘
│
┌──────────┴───────────┐
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Joule Skill │ │ MCP Server │
│ REST Action │ │ FastMCP │
└──────┬───────┘ └──────┬───────┘
│ │
└──────────┬──────────┘
▼
┌──────────────────────┐
│ Python Backend │
│ FastAPI + Services │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ SAP HANA Cloud │
│ NORTHWIND │
└──────────────────────┘Verantwortlichkeiten
Komponente Verantwortlichkeit
SAP Joule Interaktion in natürlicher Sprache Joule Studio Agent Intent-Routing, Planung und Tool-Auswahl Joule Skills REST-basierte Aktionen MCP-Server MCP-Tool-Bereitstellung FastAPI Backend-Aktions-/API-Ebene Services Geschäftslogik und HANA-Abfragen HANA Cloud Datenpersistenz AUDIT_LOG Auditierung von Schreiboperationen
Technologie-Stack
Technologie Zweck
Python 3.11+ Backend und MCP
FastAPI REST-API
Pydantic Validierung und Schemas
Uvicorn ASGI-Server
hdbcli SAP-HANA-Konnektivität
SAP HANA Cloud Datenbank
FastMCP / mcp MCP-Server
SAP Joule / Joule Studio Agentische KI
SAP Build SAP-native Integration
MCP Inspector MCP-Tests
Git / GitHub Versionskontrolle
Projektstruktur
jouleops/
│
├── app/
│ ├── api/
│ │ └── routes.py
│ │
│ ├── db/
│ │ └── db.py
│ │
│ ├── models/
│ │ └── models.py
│ │
│ ├── services/
│ │ ├── customers.py
│ │ ├── invoices.py
│ │ ├── materials.py
│ │ ├── sales_orders.py
│ │ └── tickets.py
│ │
│ └── main.py
│
├── mcp/
│ └── server.py
│
├── sql/
│ ├── 01_schema.sql
│ ├── 02_seed.sql
│ └── generate_seed.py
│
├── tests/
│
├── .env
├── .gitignore
├── requirements.txt
└── README.mdDie Anwendung trennt HTTP-Routing, Datenbankkonnektivität, Geschäftsdienste, Datenmodelle und MCP-Integration.
Geschäftsfähigkeiten
1. Materialdetails
GET /materials/{material_id}/{plant_code}Beispiel:
GET /materials/MAT-1023/PLT-PUNRuft Materialinformationen für ein bestimmtes Werk ab.
2. Offene Kundenaufträge
GET /sales-orders/openErforderliche Parameter:
region
date_from
date_toDer Dienst ruft offene Aufträge ab und gruppiert die zurückgegebenen Aufträge nach Kunde.
3. Kundenübersicht
GET /customers/{customer_id}/summaryBeispiel:
GET /customers/C-501/summaryKombiniert Kunden- und Rechnungsinformationen für die Analyse der Kundenexposition.
4. Zusammenfassung überfälliger Rechnungen
GET /customers/{customer_id}/overdue-invoicesBeispiel:
GET /customers/C-501/overdue-invoicesLiefert Informationen zu überfälligen Rechnungen, die der Agent für Inkassoempfehlungen verwendet.
5. Wartungsticket erstellen
POST /ticketsDer Dienst:
Validiert die Anfrage.
Verifiziert, dass das Material am angeforderten Werk existiert.
Erstellt eine Ticket-ID.
Fügt das Ticket in HANA ein.
Fügt einen Audit-Datensatz ein.
Committet die Transaktion.
Gibt das erstellte Ticket zurück.
Datenbank
Die Anwendung verwendet das Schema NORTHWIND in SAP HANA Cloud.
Tabellen
NORTHWIND.MATERIALS
NORTHWIND.SALES_ORDERS
NORTHWIND.CUSTOMERS
NORTHWIND.INVOICES
NORTHWIND.TICKETS
NORTHWIND.AUDIT_LOGMATERIALS
Speichert Material-ID, Beschreibung, Kategorie, Stückpreis, Lagerbestand, Sicherheitsbestand und Werkscode.
SALES_ORDERS
Speichert Auftrags-ID, Kunden-ID, Material-ID, Menge, Status, Erstellungsdatum und Region.
CUSTOMERS
Speichert Kunden-ID, Name, Region, Kreditlimit und offenen Betrag.
INVOICES
Speichert Rechnungs-ID, Kunden-ID, Betrag, Fälligkeitsdatum, Status und Tage überfällig.
TICKETS
Speichert Wartungstickets, die über JouleOps erstellt wurden.
AUDIT_LOG
Speichert Zeitstempel, Benutzerrolle, Tool-Name, maskierte Parameter und Ergebnis für auditierte Operationen.
Datenbankskripte
sql/01_schema.sqlErstellt die Datenbankobjekte.
sql/02_seed.sqlLädt synthetische NorthWind-Daten.
sql/generate_seed.pyGeneriert Seed-Daten bei Bedarf.
REST-API
API vom Projektstammverzeichnis starten:
uvicorn app.main:app --reloadStandardmäßige lokale Adresse:
http://127.0.0.1:8000Swagger-UI:
http://127.0.0.1:8000/docsOpenAPI-Spezifikation:
http://127.0.0.1:8000/openapi.jsonDas generierte OpenAPI-Dokument kann bei der Registrierung der REST-Aktionen in SAP Build verwendet werden.
MCP-Server
Das Projekt stellt ausgewählte Backend-Fähigkeiten über einen benutzerdefinierten FastMCP-Server bereit.
Lokaler MCP-Endpunkt:
http://127.0.0.1:8001/mcpTransport:
Streamable HTTPDer MCP-Server stellt Tools für Operationen wie folgende bereit:
get_customer_summary_tool
get_material_details
get_open_sales_orders_tool
summarize_overdue_invoices
create_maintenance_ticketDie MCP-Tool-Signatur muss mit der zugrunde liegenden Geschäftsoperation übereinstimmen. Beispielsweise erfordern offene Kundenaufträge:
region
date_from
date_toanstatt einer einzelnen customer_id.
Umgebungskonfiguration
Erstellen Sie eine .env-Datei im Projektstammverzeichnis:
HANA_HOST=your-hana-host
HANA_PORT=443
HANA_USER=your-hana-user
HANA_PASSWORD=your-hana-passwordCommitten Sie .env nicht.
Empfohlene .gitignore-Einträge:
.env
.venv/
__pycache__/
*.pycHANA-Anmeldedaten müssen serverseitig bleiben und dürfen niemals in Joule-Prompts, MCP-Beschreibungen, LLM-Kontext oder API-Antworten enthalten sein.
Lokale Einrichtung
1. Repository klonen
git clone <repository-url>
cd jouleops2. Virtuelle Umgebung erstellen
py -m venv .venvAktivieren:
.\.venv\Scripts\Activate.ps13. Abhängigkeiten installieren
pip install -r requirements.txt4. HANA konfigurieren
Erstellen Sie .env und geben Sie die Verbindungsinformationen für SAP HANA Cloud an.
5. Datenbank erstellen
Führen Sie Folgendes aus:
sql/01_schema.sqlgegen das Ziel-HANA-Cloud-Schema.
6. Seed-Daten laden
Führen Sie Folgendes aus:
sql/02_seed.sqloder generieren Sie die erforderlichen Daten mit:
sql/generate_seed.pyProjekt ausführen
FastAPI
uvicorn app.main:app --reloadÜberprüfen:
http://127.0.0.1:8000/docsMCP-Server
Führen Sie den MCP-Server über den in mcp/server.py definierten ASGI-/Anwendungs-Einstiegspunkt aus.
Für eine als app bereitgestellte ASGI-Anwendung lautet der Befehl:
uvicorn mcp.server:app --host 127.0.0.1 --port 8001Der endgültige Befehl sollte dem vom Projekt mcp/server.py exportierten Objekt entsprechen.
Testen
REST-API
Swagger-UI verwenden:
http://127.0.0.1:8000/docsEmpfohlene Prüfungen:
GET /materials/MAT-1023/PLT-PUN
GET /customers/C-501/summary
GET /customers/C-501/overdue-invoices
GET /sales-orders/open
POST /ticketsFür die Ticket-Operation verifizieren Sie beides:
NORTHWIND.TICKETS
NORTHWIND.AUDIT_LOGnach einem erfolgreichen Schreibvorgang.
MCP Inspector
Verwenden Sie MCP Inspector, um den MCP-Server zu inspizieren und auszuführen.
Konfigurieren:
Server ID: jouleops-mcp
Transport: Streamable HTTP
URL: http://127.0.0.1:8001/mcpNach dem Verbinden:
Tools öffnen.
Ein JouleOps-Tool auswählen.
Alle erforderlichen Parameter eingeben.
Das Tool ausführen.
Die JSON-Antwort verifizieren.
HANA-Daten bei Bedarf verifizieren.
Für Schreiboperationen
AUDIT_LOGverifizieren.
SAP-BTP- und Joule-Integration
Der vorgesehene Unternehmensablauf ist:
SAP Joule
↓
Joule Studio Agent
↓
BTP Destination
↓
FastAPI / MCP
↓
SAP HANA CloudFastAPI-Aktionsziel
Die REST-API wird über ein BTP-Ziel für Joule-Studio-Aktionen bereitgestellt.
Das Ziel sollte Folgendes enthalten:
sap-joule-studio-action = trueMCP-Ziel
Der MCP-Server wird über ein HTTP-Ziel bereitgestellt, das für die MCP-Erkennung in Joule Studio konfiguriert ist.
Das Ziel sollte Folgendes enthalten:
sap-joule-studio-mcp-server = trueFür lokale Demonstrationen kann ein Tunnel wie ngrok den lokalen Dienst bereitstellen.
HANA selbst sollte niemals direkt für Joule bereitgestellt werden.
Sicherheit und Schutzmaßnahmen
Keine HANA-Anmeldedaten an das LLM
Nur FastAPI/MCP hält HANA-Anmeldedaten.
Joule
↓
Tool parameters
↓
FastAPI / MCP
↓
HANA credentials
↓
SAP HANA CloudParametrisierte SQL-Abfragen
Abfragen verwenden Parameterbindung:
cursor.execute(
"""
SELECT ...
WHERE MATERIAL_ID = ?
AND PLANT_CODE = ?
""",
(material_id, plant_code),
)anstatt String-Konkatenation.
Audit-Protokollierung
Schreiboperationen sollten Folgendes aufzeichnen:
user role
tool name
masked parameters
outcome
timestampin NORTHWIND.AUDIT_LOG.
Eingabevalidierung
FastAPI-/Pydantic-Modelle validieren strukturierte Eingaben, bevor die Geschäftslogik ausgeführt wird.
Rollenbasierter Zugriff
Die vorgesehenen Rollen sind:
PLANT_SUPERVISOR
SALES_MANAGER
FINANCE
VIEWEREin VIEWER darf keine Wartungstickets erstellen.
Kein Raten
Wenn ein erforderlicher Parameter fehlt, sollte der Agent die fehlenden Informationen anfordern, anstatt zu raten oder Null-Werte an eine Schreiboperation zu senden.
Demo-Szenarien
Szenario 1 --- Bestandsprüfung + automatisches Ticket
Is steel coil MAT-1023 below safety stock in Pune?
If yes, raise a HIGH-priority ticket for the Mechanical team.Erwarteter Ablauf:
get_material_details
↓
Compare stock with safety stock
↓
create_ticket
↓
AUDIT_LOG
↓
ConfirmationSzenario 2 --- Offene Kundenaufträge
Show me last week's open sales orders for the South region,
grouped by customer, with totals.Erwartetes Tool:
get_open_sales_ordersErwartete Parameter:
region
date_from
date_toSzenario 3 --- Kundenexposition
Summarize C-501's overdue invoices and tell me what to do next.Erwartete Tools:
get_customer_summary
summarize_overdue_invoicesSzenario 4 --- MCP-Architektur-Demonstration
Give me an inventory snapshot for the Chennai plant.Dieses Szenario soll eine gleichwertige Geschäftsfähigkeit über ein MCP-Tool demonstrieren.
Szenario 5 --- Eskalation / fehlende Parameter
Create a ticket.Der Agent sollte die erforderlichen Informationen anfordern, anstatt zu raten.
Für einen VIEWER muss die Schreiboperation abgelehnt werden.
Fehlerbehebung
500 Internal Server Error
Prüfen:
.env-Werte.HANA-Host und -Port.
Netzwerkerreichbarkeit von HANA Cloud.
Schema-/Tabellennamen.
SQL-Parameter.
Uvicorn-Protokolle.
HANA-Tabelle nicht gefunden
Verifizieren Sie das Schema und die Tabellen:
SELECT SCHEMA_NAME, TABLE_NAME
FROM SYS.TABLES
ORDER BY SCHEMA_NAME, TABLE_NAME;Das Projekt erwartet die NorthWind-Tabellen unter:
NORTHWINDMCP Inspector kann keine Verbindung herstellen
Verifizieren:
MCP server is running
Port = 8001
Path = /mcp
Transport = Streamable HTTPErwarteter Endpunkt:
http://127.0.0.1:8001/mcpMCP-Tool meldet fehlende Argumente
Prüfen Sie, ob die MCP-Wrapper-Signatur mit der Servicefunktion übereinstimmt.
Zum Beispiel:
def get_open_sales_orders(
region: str,
date_from: date,
date_to: date,
):
...Das MCP-Tool muss alle drei Parameter bereitstellen.
SAP-Build-Aktion gibt 404 Not Found zurück
Der SAP-Build-Aktionsendpunkt muss exakt mit der FastAPI-Route übereinstimmen.
Zum Beispiel:
GET /customers/{customer_id}/overdue-invoicesdarf nicht als Folgendes konfiguriert werden:
/invoices/{customer_id}/overdue-summaryVerwenden Sie die aktuelle FastAPI-OpenAPI-Spezifikation:
http://127.0.0.1:8000/openapi.jsonUngültige OpenAPI-Datei
Verwenden Sie das von der aktuellen FastAPI-Anwendung generierte OpenAPI-Dokument anstelle einer veralteten Spezifikation.
Reproduzierbarkeits-Checkliste
Backend
Python-Umgebung erstellt.
Abhängigkeiten installiert.
.envkonfiguriert.FastAPI startet erfolgreich.
Swagger-UI lädt.
OpenAPI-Spezifikation lädt.
Alle Kern-REST-Operationen funktionieren.
HANA
HANA-Cloud-Instanz verfügbar.
NORTHWIND-Schema vorhanden.Erforderliche Tabellen vorhanden.
Seed-Daten geladen.
Ticket-Erstellung wird persistiert.
Audit-Datensätze werden erstellt.
MCP
MCP-Server startet.
Streamable-HTTP-Endpunkt ist erreichbar.
MCP Inspector verbindet sich.
Tools werden erkannt.
Alle erforderlichen Parameter werden bereitgestellt.
Lesetools liefern gültige Ergebnisse.
Schreibwerkzeuge erstellen Audit-Datensätze.
Joule / SAP Build
JouleOps-Agent konfiguriert.
REST-Aktionen registriert.
MCP-Server verbunden.
BTP-Ziele konfiguriert.
Erforderliche Zieleigenschaften konfiguriert.
Korrekte Tools für repräsentative Prompts ausgewählt.
Fehlende Parameter korrekt behandelt.
RBAC-Verhalten verifiziert.
Quelltransparenz verifiziert.
Demo
Bestands- und Ticket-Szenario getestet.
Szenario für offene Verkaufsaufträge getestet.
Kunden-/Rechnungsszenario getestet.
MCP-Szenario getestet.
Eskalations-/RBAC-Szenario getestet.
Tool-Traces erfasst.
HANA-Ergebnisse verifiziert.
Zukünftige Verbesserungen
Mögliche Erweiterungen umfassen:
FastAPI und MCP auf SAP BTP Cloud Foundry oder Kyma bereitstellen.
CI/CD mit GitHub Actions hinzufügen.
Umfassende automatisierte Tests hinzufügen.
Ein Fiori/SAPUI5-Audit-Dashboard erstellen.
HANA Vector Engine-Funktionen hinzufügen.
Semantische Suche über historische Tickets hinzufügen.
Dokumenten-Grounding für Kredit-/Inkassorichtlinien hinzufügen.
Multi-Agent-Orchestrierung hinzufügen.
Zweisprachige Interaktion hinzufügen.
Produktionsreife Authentifizierung und Autorisierung hinzufügen.
Strukturierte Beobachtbarkeit und Leistungsüberwachung hinzufügen.
Lizenz
Dieses Projekt wurde als Bildungs-/Abschlussprojekt entwickelt, das die Integration von SAP Joule, SAP HANA Cloud, Python FastAPI und Model Context Protocol demonstriert.
Sofern dem Repository keine separate Lizenz hinzugefügt wird, sollte das Projekt als projektspezifische Bildungsarbeit behandelt werden.
Danksagungen
Erstellt mit:
SAP Joule / Joule Studio
SAP Build
SAP HANA Cloud
Python
FastAPI
Pydantic
FastMCP / Model Context Protocol
MCP Inspector
Git / GitHub
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceTransforms SAP S/4HANA or ECC systems into conversational AI interfaces by exposing all OData services as dynamic MCP tools. Enables natural language interactions with ERP data for querying, creating, updating, and deleting business entities through SAP BTP integration.49128MIT
- AlicenseCqualityDmaintenanceTransforms SAP S/4HANA or ECC systems into conversational AI interfaces by exposing all OData services as dynamic MCP tools. Enables natural language interactions with ERP data including querying, creating, updating, and deleting entities through SAP BTP integration.19496MIT
- AlicenseNot gradedqualityDmaintenanceTransforms SAP S/4HANA or ECC systems into conversational AI interfaces by exposing OData services as dynamic MCP tools. Enables natural language interactions with ERP data for querying, creating, updating, and deleting business entities.491MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage SAP Business Data Cloud operations including data shares, Delta Sharing, and data product publishing through an MCP interface.11MIT
Related MCP Connectors
An AI concierge that turns static forms into adaptive AI conversations. From any MCP client.
Connect e-commerce and marketing data to AI assistants via MCP.
Official Microsoft MCP Server to query Microsoft Entra data using natural language
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nilansh-07/jouleops'
If you have feedback or need assistance with the MCP directory API, please join our Discord server