JouleOps MCP Server
JouleOps @ NorthWind Manufacturing
Asistente empresarial de IA agéntico con SAP Joule, SAP HANA Cloud, Python FastAPI y Model Context Protocol (MCP).
JouleOps es un asistente empresarial basado en escenarios para NorthWind Manufacturing. Proporciona una interfaz gobernada de lenguaje natural para recuperar datos operativos de SAP HANA Cloud y realizar acciones empresariales controladas a través de servicios Python FastAPI y un servidor MCP personalizado.
Índice
Related MCP server: SAP OData to MCP Server
Resumen del proyecto
NorthWind Manufacturing almacena sus datos operativos en SAP HANA Cloud. JouleOps proporciona una única interfaz agéntica para operaciones comunes de planta, ventas y finanzas.
El flujo integral previsto es:
User
↓
SAP Joule / Joule Studio Agent
↓
Joule Skill OR MCP Tool
↓
Python FastAPI / MCP Server
↓
SAP HANA Cloud
↓
JSON Result
↓
Joule Agent
↓
Grounded ResponseEl proyecto combina Joule Skills basados en REST con la exposición de herramientas basadas en MCP, de modo que las mismas capacidades de backend puedan consumirse a través de rutas de integración gobernadas.
Planteamiento del problema
El proyecto aborda tareas operativas comunes en NorthWind Manufacturing:
Consultar el stock de material y el stock de seguridad en una planta.
Recuperar pedidos de venta abiertos para una región y un rango de fechas.
Revisar la exposición de clientes y las facturas vencidas.
Resumir las facturas vencidas y respaldar las decisiones de cobro.
Crear tickets de mantenimiento cuando se requiere una acción operativa.
En lugar de consultar manualmente varios sistemas, los usuarios pueden expresar estos requisitos en lenguaje natural a través de SAP Joule.
Características principales
Datos operativos
Detalles de material por material y planta.
Pedidos de venta abiertos por región y rango de fechas.
Resúmenes de clientes.
Resúmenes de facturas vencidas.
Acción empresarial
Crear tickets de mantenimiento.
Verificar las combinaciones de material/planta antes de crear tickets.
Escribir registros de auditoría para las acciones empresariales.
MCP
Servidor MCP de Python personalizado con FastMCP.
Transporte HTTP transmisible (streamable).
Descubrimiento y ejecución de herramientas MCP mediante MCP Inspector.
Reutilización de la lógica empresarial del backend.
Salvaguardas
Las credenciales de HANA permanecen en el backend.
Validación con Pydantic.
SQL parametrizado.
Registro de auditoría.
Operaciones de escritura conscientes del rol.
Sin suposiciones de parámetros empresariales obligatorios faltantes.
Arquitectura
┌──────────────────────┐
│ User / Joule │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ SAP Joule Studio │
│ Agent │
└──────────┬───────────┘
│
┌──────────┴───────────┐
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Joule Skill │ │ MCP Server │
│ REST Action │ │ FastMCP │
└──────┬───────┘ └──────┬───────┘
│ │
└──────────┬──────────┘
▼
┌──────────────────────┐
│ Python Backend │
│ FastAPI + Services │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ SAP HANA Cloud │
│ NORTHWIND │
└──────────────────────┘Responsabilidades
Componente Responsabilidad
SAP Joule Interacción en lenguaje natural Joule Studio Agent Enrutamiento de intenciones, planificación y selección de herramientas Joule Skills Acciones basadas en REST MCP Server Exposición de herramientas MCP FastAPI Capa de acciones/API de backend Services Lógica empresarial y consultas a HANA HANA Cloud Persistencia de datos AUDIT_LOG Auditoría de operaciones de escritura
Pila tecnológica
Tecnología Propósito
Python 3.11+ Backend y MCP
FastAPI API REST
Pydantic Validación y esquemas
Uvicorn Servidor ASGI
hdbcli Conectividad con SAP HANA
SAP HANA Cloud Base de datos
FastMCP / mcp Servidor MCP
SAP Joule / Joule Studio IA agéntica
SAP Build Integración nativa de SAP
MCP Inspector Pruebas de MCP
Git / GitHub Control de versiones
Estructura del proyecto
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.mdLa aplicación separa el enrutamiento HTTP, la conectividad de base de datos, los servicios empresariales, los modelos de datos y la integración MCP.
Capacidades empresariales
1. Detalles de material
GET /materials/{material_id}/{plant_code}Ejemplo:
GET /materials/MAT-1023/PLT-PUNRecupera información de material para una planta específica.
2. Pedidos de venta abiertos
GET /sales-orders/openParámetros obligatorios:
region
date_from
date_toEl servicio recupera los pedidos abiertos y agrupa los pedidos devueltos por cliente.
3. Resumen de cliente
GET /customers/{customer_id}/summaryEjemplo:
GET /customers/C-501/summaryCombina la información de cliente y facturas para el análisis de exposición de clientes.
4. Resumen de facturas vencidas
GET /customers/{customer_id}/overdue-invoicesEjemplo:
GET /customers/C-501/overdue-invoicesProporciona información de facturas vencidas utilizada por el agente para recomendaciones de cobro.
5. Crear ticket de mantenimiento
POST /ticketsEl servicio:
Valida la solicitud.
Verifica que el material exista en la planta solicitada.
Crea un ID de ticket.
Inserta el ticket en HANA.
Inserta un registro de auditoría.
Confirma la transacción.
Devuelve el ticket creado.
Base de datos
La aplicación utiliza el esquema NORTHWIND en SAP HANA Cloud.
Tablas
NORTHWIND.MATERIALS
NORTHWIND.SALES_ORDERS
NORTHWIND.CUSTOMERS
NORTHWIND.INVOICES
NORTHWIND.TICKETS
NORTHWIND.AUDIT_LOGMATERIALS
Almacena ID de material, descripción, categoría, precio unitario, cantidad de stock, stock de seguridad y código de planta.
SALES_ORDERS
Almacena ID de pedido, ID de cliente, ID de material, cantidad, estado, fecha de creación y región.
CUSTOMERS
Almacena ID de cliente, nombre, región, límite de crédito y saldo pendiente.
INVOICES
Almacena ID de factura, ID de cliente, importe, fecha de vencimiento, estado y días de retraso.
TICKETS
Almacena los tickets de mantenimiento creados a través de JouleOps.
AUDIT_LOG
Almacena marca de tiempo, rol de usuario, nombre de herramienta, parámetros enmascarados y resultado de las operaciones auditadas.
Scripts de base de datos
sql/01_schema.sqlCrea los objetos de base de datos.
sql/02_seed.sqlCarga datos sintéticos de NorthWind.
sql/generate_seed.pyGenera datos semilla cuando es necesario.
API REST
Inicie la API desde la raíz del proyecto:
uvicorn app.main:app --reloadDirección local predeterminada:
http://127.0.0.1:8000Swagger UI:
http://127.0.0.1:8000/docsEspecificación OpenAPI:
http://127.0.0.1:8000/openapi.jsonEl documento OpenAPI generado puede utilizarse al registrar las acciones REST en SAP Build.
Servidor MCP
El proyecto expone capacidades seleccionadas del backend a través de un servidor FastMCP personalizado.
Punto de conexión MCP local:
http://127.0.0.1:8001/mcpTransporte:
Streamable HTTPEl servidor MCP expone herramientas para operaciones como:
get_customer_summary_tool
get_material_details
get_open_sales_orders_tool
summarize_overdue_invoices
create_maintenance_ticketLa firma de la herramienta MCP debe coincidir con la operación empresarial subyacente. Por ejemplo, los pedidos de venta abiertos requieren:
region
date_from
date_toen lugar de un único customer_id.
Configuración del entorno
Cree un archivo .env en la raíz del proyecto:
HANA_HOST=your-hana-host
HANA_PORT=443
HANA_USER=your-hana-user
HANA_PASSWORD=your-hana-passwordNo confirme .env.
Entradas recomendadas para .gitignore:
.env
.venv/
__pycache__/
*.pycLas credenciales de HANA deben permanecer en el lado del servidor y nunca deben incluirse en los prompts de Joule, las descripciones de MCP, el contexto del LLM ni las respuestas de la API.
Configuración local
1. Clonar el repositorio
git clone <repository-url>
cd jouleops2. Crear un entorno virtual
py -m venv .venvActívelo:
.\.venv\Scripts\Activate.ps13. Instalar dependencias
pip install -r requirements.txt4. Configurar HANA
Cree .env y proporcione la información de conexión de SAP HANA Cloud.
5. Crear la base de datos
Ejecute:
sql/01_schema.sqlcontra el esquema de HANA Cloud de destino.
6. Cargar datos semilla
Ejecute:
sql/02_seed.sqlo genere los datos necesarios con:
sql/generate_seed.pyEjecución del proyecto
FastAPI
uvicorn app.main:app --reloadVerifique:
http://127.0.0.1:8000/docsServidor MCP
Ejecute el servidor MCP utilizando el punto de entrada ASGI/aplicación
definido en mcp/server.py.
Para una aplicación ASGI expuesta como app, el comando es:
uvicorn mcp.server:app --host 127.0.0.1 --port 8001El comando final debe coincidir con el objeto exportado por el mcp/server.py
del proyecto.
Pruebas
API REST
Utilice Swagger UI:
http://127.0.0.1:8000/docsComprobaciones recomendadas:
GET /materials/MAT-1023/PLT-PUN
GET /customers/C-501/summary
GET /customers/C-501/overdue-invoices
GET /sales-orders/open
POST /ticketsPara la operación de ticket, verifique ambos:
NORTHWIND.TICKETS
NORTHWIND.AUDIT_LOGdespués de una escritura correcta.
MCP Inspector
Utilice MCP Inspector para inspeccionar y ejecutar el servidor MCP.
Configure:
Server ID: jouleops-mcp
Transport: Streamable HTTP
URL: http://127.0.0.1:8001/mcpDespués de conectarse:
Abra Tools.
Seleccione una herramienta de JouleOps.
Introduzca todos los parámetros obligatorios.
Ejecute la herramienta.
Verifique la respuesta JSON.
Verifique los datos de HANA cuando corresponda.
Para operaciones de escritura, verifique
AUDIT_LOG.
Integración con SAP BTP y Joule
El flujo empresarial previsto es:
SAP Joule
↓
Joule Studio Agent
↓
BTP Destination
↓
FastAPI / MCP
↓
SAP HANA CloudDestino de acción FastAPI
La API REST se expone a través de un BTP Destination para las acciones de Joule Studio.
El destino debe contener:
sap-joule-studio-action = trueDestino MCP
El servidor MCP se expone a través de un destino HTTP configurado para el descubrimiento MCP de Joule Studio.
El destino debe contener:
sap-joule-studio-mcp-server = truePara demostraciones locales, un túnel como ngrok puede exponer el servicio local.
HANA nunca debe exponerse directamente a Joule.
Seguridad y salvaguardas
Sin credenciales de HANA para el LLM
Solo FastAPI/MCP posee las credenciales de HANA.
Joule
↓
Tool parameters
↓
FastAPI / MCP
↓
HANA credentials
↓
SAP HANA CloudSQL parametrizado
Las consultas utilizan enlace de parámetros:
cursor.execute(
"""
SELECT ...
WHERE MATERIAL_ID = ?
AND PLANT_CODE = ?
""",
(material_id, plant_code),
)en lugar de concatenación de cadenas.
Registro de auditoría
Las operaciones de escritura deben registrar:
user role
tool name
masked parameters
outcome
timestampen NORTHWIND.AUDIT_LOG.
Validación de entrada
Los modelos de FastAPI/Pydantic validan las entradas estructuradas antes de que se ejecute la lógica empresarial.
Acceso basado en roles
Los roles previstos son:
PLANT_SUPERVISOR
SALES_MANAGER
FINANCE
VIEWERUn VIEWER no debe tener permitido crear tickets de mantenimiento.
Sin suposiciones
Si falta un parámetro obligatorio, el agente debe solicitar la información faltante en lugar de adivinar o enviar valores nulos a una operación de escritura.
Escenarios de demostración
Escenario 1 --- Verificación de stock + ticket automático
Is steel coil MAT-1023 below safety stock in Pune?
If yes, raise a HIGH-priority ticket for the Mechanical team.Flujo esperado:
get_material_details
↓
Compare stock with safety stock
↓
create_ticket
↓
AUDIT_LOG
↓
ConfirmationEscenario 2 --- Pedidos de venta abiertos
Show me last week's open sales orders for the South region,
grouped by customer, with totals.Herramienta esperada:
get_open_sales_ordersParámetros esperados:
region
date_from
date_toEscenario 3 --- Exposición de clientes
Summarize C-501's overdue invoices and tell me what to do next.Herramientas esperadas:
get_customer_summary
summarize_overdue_invoicesEscenario 4 --- Demostración de la arquitectura MCP
Give me an inventory snapshot for the Chennai plant.Este escenario está pensado para demostrar una capacidad empresarial equivalente a través de una herramienta MCP.
Escenario 5 --- Escalada / parámetros faltantes
Create a ticket.El agente debe solicitar la información obligatoria en lugar de adivinar.
Para un VIEWER, la operación de escritura debe rechazarse.
Solución de problemas
500 Internal Server Error
Compruebe:
Los valores de
.env.El host y el puerto de HANA.
La accesibilidad de red de HANA Cloud.
Los nombres de esquema/tablas.
Los parámetros SQL.
Los registros de Uvicorn.
Tabla de HANA no encontrada
Verifique el esquema y las tablas:
SELECT SCHEMA_NAME, TABLE_NAME
FROM SYS.TABLES
ORDER BY SCHEMA_NAME, TABLE_NAME;El proyecto espera las tablas de NorthWind en:
NORTHWINDMCP Inspector no puede conectarse
Verifique:
MCP server is running
Port = 8001
Path = /mcp
Transport = Streamable HTTPPunto de conexión esperado:
http://127.0.0.1:8001/mcpLa herramienta MCP informa de argumentos faltantes
Compruebe que la firma del envoltorio MCP coincida con la función del servicio.
Por ejemplo:
def get_open_sales_orders(
region: str,
date_from: date,
date_to: date,
):
...La herramienta MCP debe exponer los tres parámetros.
La acción de SAP Build devuelve 404 Not Found
El punto de conexión de la acción de SAP Build debe coincidir exactamente con la ruta de FastAPI.
Por ejemplo:
GET /customers/{customer_id}/overdue-invoicesno debe configurarse como:
/invoices/{customer_id}/overdue-summaryUtilice la especificación OpenAPI actual de FastAPI:
http://127.0.0.1:8000/openapi.jsonArchivo OpenAPI no válido
Utilice el documento OpenAPI generado por la aplicación FastAPI actual en lugar de una especificación desactualizada.
Lista de verificación de reproducibilidad
Backend
Entorno de Python creado.
Dependencias instaladas.
.envconfigurado.FastAPI se inicia correctamente.
Swagger UI se carga.
La especificación OpenAPI se carga.
Todas las operaciones REST principales funcionan.
HANA
Instancia de HANA Cloud disponible.
El esquema
NORTHWINDexiste.Las tablas necesarias existen.
Datos semilla cargados.
La creación de tickets persiste.
Se crean registros de auditoría.
MCP
El servidor MCP se inicia.
El punto de conexión HTTP transmisible es accesible.
MCP Inspector se conecta.
Las herramientas se descubren.
Todos los parámetros obligatorios están expuestos.
Las herramientas de lectura devuelven resultados válidos.
Las herramientas de escritura crean registros de auditoría.
Joule / SAP Build
Agente de JouleOps configurado.
Acciones REST registradas.
Servidor MCP conectado.
BTP Destinations configurados.
Propiedades de destino obligatorias configuradas.
Herramientas correctas seleccionadas para prompts representativos.
Parámetros faltantes gestionados correctamente.
Comportamiento de RBAC verificado.
Transparencia de fuentes verificada.
Demo
Escenario de stock + ticket probado.
Escenario de pedido de venta abierto probado.
Escenario de cliente/factura probado.
Escenario MCP probado.
Escenario de escalado/RBAC probado.
Trazas de herramientas capturadas.
Resultados de HANA verificados.
Mejoras futuras
Las posibles extensiones incluyen:
Desplegar FastAPI y MCP en SAP BTP Cloud Foundry o Kyma.
Añadir CI/CD usando GitHub Actions.
Añadir pruebas automatizadas exhaustivas.
Crear un panel de auditoría Fiori/SAPUI5.
Añadir capacidades de HANA Vector Engine.
Añadir búsqueda semántica sobre tickets históricos.
Añadir anclaje documental para políticas de crédito/cobro.
Añadir orquestación multiagente.
Añadir interacción bilingüe.
Añadir autenticación y autorización de nivel de producción.
Añadir observabilidad estructurada y monitorización del rendimiento.
Licencia
Este proyecto fue desarrollado como una implementación educativa/proyecto final que demuestra la integración de SAP Joule, SAP HANA Cloud, Python FastAPI y Model Context Protocol.
A menos que se añada una licencia separada al repositorio, el proyecto debe tratarse como trabajo educativo específico del proyecto.
Agradecimientos
Construido con:
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