Skip to main content
Glama
nilansh-07

JouleOps MCP Server

by nilansh-07

JouleOps @ NorthWind Manufacturing

使用 SAP Joule、SAP HANA Cloud、Python FastAPI 和模型上下文协议(MCP)构建的智能体式 AI 企业助手。

JouleOps 是面向 NorthWind Manufacturing 的基于场景的企业助手。它提供受治理的自然语言界面,用于从 SAP HANA Cloud 检索运营数据,并通过 Python FastAPI 服务和自定义 MCP 服务器执行受控的业务操作。


目录


Related MCP server: SAP OData to MCP Server

项目概述

NorthWind Manufacturing 将其运营数据存储在 SAP HANA Cloud 中。JouleOps 为常见的工厂、销售和财务运营提供统一的智能体界面。

预期的端到端流程为:

User
  ↓
SAP Joule / Joule Studio Agent
  ↓
Joule Skill OR MCP Tool
  ↓
Python FastAPI / MCP Server
  ↓
SAP HANA Cloud
  ↓
JSON Result
  ↓
Joule Agent
  ↓
Grounded Response

该项目将基于 REST 的 Joule Skills 与基于 MCP 的工具暴露相结合,使相同的后端能力可以通过受治理的集成路径被消费。


问题陈述

该项目解决了 NorthWind Manufacturing 的常见运营任务:

  • 检查工厂的物料库存和安全库存。

  • 按区域和日期范围检索未结销售订单。

  • 查看客户敞口和逾期发票。

  • 汇总逾期发票并支持催收决策。

  • 在需要运营操作时创建维护工单。

用户无需手动查询多个系统,而是可以通过 SAP Joule 以自然语言表达这些需求。


核心功能

运营数据

  • 按物料和工厂查询物料详情。

  • 按区域和日期范围查询未结销售订单。

  • 客户摘要。

  • 逾期发票摘要。

业务操作

  • 创建维护工单。

  • 在创建工单前验证物料/工厂组合。

  • 为业务操作写入审计记录。

MCP

  • 使用 FastMCP 构建的自定义 Python MCP 服务器。

  • 可流式 HTTP 传输。

  • 通过 MCP Inspector 进行 MCP 工具发现和执行。

  • 复用后端业务逻辑。

防护措施

  • HANA 凭据保留在后端。

  • Pydantic 验证。

  • 参数化 SQL。

  • 审计日志。

  • 感知角色的写操作。

  • 不猜测缺失的必需业务参数。


架构

                    ┌──────────────────────┐
                    │      User / Joule    │
                    └──────────┬───────────┘
                               │
                               ▼
                    ┌──────────────────────┐
                    │  SAP Joule Studio    │
                    │       Agent          │
                    └──────────┬───────────┘
                               │
                    ┌──────────┴───────────┐
                    │                      │
                    ▼                      ▼
             ┌──────────────┐      ┌──────────────┐
             │ Joule Skill  │      │ MCP Server   │
             │ REST Action  │      │  FastMCP     │
             └──────┬───────┘      └──────┬───────┘
                    │                     │
                    └──────────┬──────────┘
                               ▼
                    ┌──────────────────────┐
                    │ Python Backend       │
                    │ FastAPI + Services   │
                    └──────────┬───────────┘
                               │
                               ▼
                    ┌──────────────────────┐
                    │   SAP HANA Cloud     │
                    │      NORTHWIND       │
                    └──────────────────────┘

职责

组件 职责


SAP Joule 自然语言交互 Joule Studio Agent 意图路由、规划和工具选择 Joule Skills 基于 REST 的操作 MCP 服务器 MCP 工具暴露 FastAPI 后端操作/API 层 服务层 业务逻辑和 HANA 查询 HANA Cloud 数据持久化 AUDIT_LOG 写操作审计


技术栈

技术 用途


Python 3.11+ 后端和 MCP FastAPI REST API Pydantic 验证和模式 Uvicorn ASGI 服务器 hdbcli SAP HANA 连接 SAP HANA Cloud 数据库 FastMCP / mcp MCP 服务器 SAP Joule / Joule Studio 智能体式 AI SAP Build SAP 原生集成 MCP Inspector MCP 测试 Git / GitHub 版本控制


项目结构

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

该应用将 HTTP 路由、数据库连接、业务服务、数据模型和 MCP 集成分离。


业务能力

1. 物料详情

GET /materials/{material_id}/{plant_code}

示例:

GET /materials/MAT-1023/PLT-PUN

检索特定工厂的物料信息。

2. 未结销售订单

GET /sales-orders/open

必需参数:

region
date_from
date_to

该服务检索未结订单,并按客户对返回的订单进行分组。

3. 客户摘要

GET /customers/{customer_id}/summary

示例:

GET /customers/C-501/summary

结合客户和发票信息,用于客户敞口分析。

4. 逾期发票摘要

GET /customers/{customer_id}/overdue-invoices

示例:

GET /customers/C-501/overdue-invoices

提供逾期发票信息,供智能体用于催收建议。

5. 创建维护工单

POST /tickets

该服务:

  1. 验证请求。

  2. 验证物料在指定工厂存在。

  3. 生成工单 ID。

  4. 将工单插入 HANA。

  5. 插入审计记录。

  6. 提交事务。

  7. 返回创建的工单。


数据库

该应用使用 SAP HANA Cloud 中的 NORTHWIND 模式。

NORTHWIND.MATERIALS
NORTHWIND.SALES_ORDERS
NORTHWIND.CUSTOMERS
NORTHWIND.INVOICES
NORTHWIND.TICKETS
NORTHWIND.AUDIT_LOG

MATERIALS

存储物料 ID、描述、类别、单价、库存数量、安全库存和工厂代码。

SALES_ORDERS

存储订单 ID、客户 ID、物料 ID、数量、状态、创建日期和区域。

CUSTOMERS

存储客户 ID、名称、区域、信用额度和未结金额。

INVOICES

存储发票 ID、客户 ID、金额、到期日、状态和逾期天数。

TICKETS

存储通过 JouleOps 创建的维护工单。

AUDIT_LOG

存储时间戳、用户角色、工具名称、脱敏参数和审计操作的结果。

数据库脚本

sql/01_schema.sql

创建数据库对象。

sql/02_seed.sql

加载合成的 NorthWind 数据。

sql/generate_seed.py

在需要时生成种子数据。


REST API

从项目根目录启动 API:

uvicorn app.main:app --reload

默认本地地址:

http://127.0.0.1:8000

Swagger UI:

http://127.0.0.1:8000/docs

OpenAPI 规范:

http://127.0.0.1:8000/openapi.json

生成的 OpenAPI 文档可用于在 SAP Build 中注册 REST 操作。


MCP 服务器

该项目通过自定义 FastMCP 服务器暴露选定的后端能力。

本地 MCP 端点:

http://127.0.0.1:8001/mcp

传输方式:

Streamable HTTP

MCP 服务器暴露用于以下操作的工具:

get_customer_summary_tool
get_material_details
get_open_sales_orders_tool
summarize_overdue_invoices
create_maintenance_ticket

MCP 工具签名必须与底层业务操作匹配。例如,未结销售订单需要:

region
date_from
date_to

而不是单个 customer_id


环境配置

在项目根目录创建 .env 文件:

HANA_HOST=your-hana-host
HANA_PORT=443
HANA_USER=your-hana-user
HANA_PASSWORD=your-hana-password

不要提交 .env

推荐的 .gitignore 条目:

.env
.venv/
__pycache__/
*.pyc

HANA 凭据必须保留在服务器端,绝不可包含在 Joule 提示词、MCP 描述、LLM 上下文或 API 响应中。


本地设置

1. 克隆仓库

git clone <repository-url>
cd jouleops

2. 创建虚拟环境

py -m venv .venv

激活它:

.\.venv\Scripts\Activate.ps1

3. 安装依赖

pip install -r requirements.txt

4. 配置 HANA

创建 .env 并提供 SAP HANA Cloud 连接信息。

5. 创建数据库

执行:

sql/01_schema.sql

针对目标 HANA Cloud 模式。

6. 加载种子数据

执行:

sql/02_seed.sql

或使用以下命令生成所需数据:

sql/generate_seed.py

运行项目

FastAPI

uvicorn app.main:app --reload

验证:

http://127.0.0.1:8000/docs

MCP 服务器

使用 mcp/server.py 中定义的 ASGI/应用入口点运行 MCP 服务器。

对于暴露为 app 的 ASGI 应用,命令为:

uvicorn mcp.server:app --host 127.0.0.1 --port 8001

最终命令应与项目的 mcp/server.py 导出的对象匹配。


测试

REST API

使用 Swagger UI:

http://127.0.0.1:8000/docs

建议检查项:

GET  /materials/MAT-1023/PLT-PUN
GET  /customers/C-501/summary
GET  /customers/C-501/overdue-invoices
GET  /sales-orders/open
POST /tickets

对于工单操作,验证以下两项:

NORTHWIND.TICKETS
NORTHWIND.AUDIT_LOG

在成功写入之后。

MCP Inspector

使用 MCP Inspector 检查和执行 MCP 服务器。

配置:

Server ID: jouleops-mcp
Transport: Streamable HTTP
URL: http://127.0.0.1:8001/mcp

连接后:

  1. 打开 工具

  2. 选择 JouleOps 工具。

  3. 输入所有必需参数。

  4. 执行工具。

  5. 验证 JSON 响应。

  6. 在适当情况下验证 HANA 数据。

  7. 对于写操作,验证 AUDIT_LOG


SAP BTP 与 Joule 集成

预期的企业流程为:

SAP Joule
   ↓
Joule Studio Agent
   ↓
BTP Destination
   ↓
FastAPI / MCP
   ↓
SAP HANA Cloud

FastAPI 操作目标

REST API 通过 BTP 目标暴露,用于 Joule Studio 操作。

目标应包含:

sap-joule-studio-action = true

MCP 目标

MCP 服务器通过为 Joule Studio MCP 发现配置的 HTTP 目标暴露。

目标应包含:

sap-joule-studio-mcp-server = true

对于本地演示,可以使用 ngrok 等隧道暴露本地服务。

HANA 本身绝不应直接暴露给 Joule。


安全与防护

不向 LLM 提供 HANA 凭据

只有 FastAPI/MCP 持有 HANA 凭据。

Joule
  ↓
Tool parameters
  ↓
FastAPI / MCP
  ↓
HANA credentials
  ↓
SAP HANA Cloud

参数化 SQL

查询使用参数绑定:

cursor.execute(
    """
    SELECT ...
    WHERE MATERIAL_ID = ?
      AND PLANT_CODE = ?
    """,
    (material_id, plant_code),
)

而不是字符串拼接。

审计日志

写操作应记录:

user role
tool name
masked parameters
outcome
timestamp

NORTHWIND.AUDIT_LOG

输入验证

FastAPI/Pydantic 模型在业务逻辑执行前验证结构化输入。

基于角色的访问

预期角色为:

PLANT_SUPERVISOR
SALES_MANAGER
FINANCE
VIEWER

VIEWER 不得被允许创建维护工单。

不猜测

如果缺少必需参数,智能体应请求缺失的信息,而不是猜测或向写操作发送空值。


演示场景

场景 1 --- 库存检查 + 自动工单

Is steel coil MAT-1023 below safety stock in Pune?
If yes, raise a HIGH-priority ticket for the Mechanical team.

预期流程:

get_material_details
        ↓
Compare stock with safety stock
        ↓
create_ticket
        ↓
AUDIT_LOG
        ↓
Confirmation

场景 2 --- 未结销售订单

Show me last week's open sales orders for the South region,
grouped by customer, with totals.

预期工具:

get_open_sales_orders

预期参数:

region
date_from
date_to

场景 3 --- 客户敞口

Summarize C-501's overdue invoices and tell me what to do next.

预期工具:

get_customer_summary
summarize_overdue_invoices

场景 4 --- MCP 架构演示

Give me an inventory snapshot for the Chennai plant.

此场景旨在通过 MCP 工具演示等效的业务能力。

场景 5 --- 升级 / 缺少参数

Create a ticket.

智能体应请求所需信息,而不是猜测。

对于 VIEWER,写操作必须被拒绝。


故障排除

500 内部服务器错误

检查:

  1. .env 值。

  2. HANA 主机和端口。

  3. HANA Cloud 网络可达性。

  4. 模式/表名称。

  5. SQL 参数。

  6. Uvicorn 日志。

找不到 HANA 表

验证模式和表:

SELECT SCHEMA_NAME, TABLE_NAME
FROM SYS.TABLES
ORDER BY SCHEMA_NAME, TABLE_NAME;

项目期望 NorthWind 表位于:

NORTHWIND

MCP Inspector 无法连接

验证:

MCP server is running
Port = 8001
Path = /mcp
Transport = Streamable HTTP

预期端点:

http://127.0.0.1:8001/mcp

MCP 工具报告缺少参数

检查 MCP 包装器签名是否与服务函数匹配。

例如:

def get_open_sales_orders(
    region: str,
    date_from: date,
    date_to: date,
):
    ...

MCP 工具必须暴露所有三个参数。

SAP Build 操作返回 404 未找到

SAP Build 操作端点必须与 FastAPI 路由完全匹配。

例如:

GET /customers/{customer_id}/overdue-invoices

不得配置为:

/invoices/{customer_id}/overdue-summary

使用当前的 FastAPI OpenAPI 规范:

http://127.0.0.1:8000/openapi.json

OpenAPI 文件无效

使用当前 FastAPI 应用生成的 OpenAPI 文档,而不是过时的规范。


可复现性检查清单

后端

  • 已创建 Python 环境。

  • 已安装依赖。

  • 已配置 .env

  • FastAPI 成功启动。

  • Swagger UI 可加载。

  • OpenAPI 规范可加载。

  • 所有核心 REST 操作正常工作。

HANA

  • HANA Cloud 实例可用。

  • NORTHWIND 模式存在。

  • 所需表存在。

  • 种子数据已加载。

  • 工单创建可持久化。

  • 审计记录已创建。

MCP

  • MCP 服务器启动。

  • 可流式 HTTP 端点可访问。

  • MCP Inspector 可连接。

  • 工具可被发现。

  • 所有必需参数已暴露。

  • 读取工具返回有效结果。

  • 写入工具创建审计记录。

Joule / SAP Build

  • JouleOps 智能体已配置。

  • REST 操作已注册。

  • MCP 服务器已连接。

  • BTP 目标已配置。

  • 所需目标属性已配置。

  • 为代表性提示词选择了正确的工具。

  • 缺失参数处理正确。

  • RBAC 行为已验证。

  • 来源透明度已验证。

演示

  • 库存 + 工单场景已测试。

  • 未结销售订单场景已测试。

  • 客户/发票场景已测试。

  • MCP 场景已测试。

  • 升级/RBAC 场景已测试。

  • 工具跟踪已捕获。

  • HANA 结果已验证。


未来改进

潜在的扩展包括:

  • 将 FastAPI 和 MCP 部署到 SAP BTP Cloud Foundry 或 Kyma。

  • 使用 GitHub Actions 添加 CI/CD。

  • 添加全面的自动化测试。

  • 构建 Fiori/SAPUI5 审计仪表板。

  • 添加 HANA Vector Engine 功能。

  • 添加对历史工单的语义搜索。

  • 为信用/收款政策添加文档接地。

  • 添加多智能体编排。

  • 添加双语交互。

  • 添加生产级身份验证和授权。

  • 添加结构化可观测性和性能监控。


许可证

本项目是作为教育/顶点项目实现而开发的,演示了 SAP Joule、SAP HANA Cloud、Python FastAPI 和 Model Context Protocol 的集成。

除非向仓库添加了单独的许可证,否则本项目应被视为特定于项目的教育性作品。


致谢

使用以下工具构建:

  • SAP Joule / Joule Studio

  • SAP Build

  • SAP HANA Cloud

  • Python

  • FastAPI

  • Pydantic

  • FastMCP / Model Context Protocol

  • MCP Inspector

  • Git / GitHub

F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    Not graded
    quality
    D
    maintenance
    Transforms 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.
    49
    128
    MIT
  • A
    license
    C
    quality
    D
    maintenance
    Transforms 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.
    19
    49
    6
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Transforms 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.
    49
    1
    MIT

View all related MCP servers

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

View all MCP Connectors

Latest Blog Posts

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