JouleOps MCP Server
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该服务:
验证请求。
验证物料在指定工厂存在。
生成工单 ID。
将工单插入 HANA。
插入审计记录。
提交事务。
返回创建的工单。
数据库
该应用使用 SAP HANA Cloud 中的 NORTHWIND 模式。
表
NORTHWIND.MATERIALS
NORTHWIND.SALES_ORDERS
NORTHWIND.CUSTOMERS
NORTHWIND.INVOICES
NORTHWIND.TICKETS
NORTHWIND.AUDIT_LOGMATERIALS
存储物料 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:8000Swagger UI:
http://127.0.0.1:8000/docsOpenAPI 规范:
http://127.0.0.1:8000/openapi.json生成的 OpenAPI 文档可用于在 SAP Build 中注册 REST 操作。
MCP 服务器
该项目通过自定义 FastMCP 服务器暴露选定的后端能力。
本地 MCP 端点:
http://127.0.0.1:8001/mcp传输方式:
Streamable HTTPMCP 服务器暴露用于以下操作的工具:
get_customer_summary_tool
get_material_details
get_open_sales_orders_tool
summarize_overdue_invoices
create_maintenance_ticketMCP 工具签名必须与底层业务操作匹配。例如,未结销售订单需要:
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__/
*.pycHANA 凭据必须保留在服务器端,绝不可包含在 Joule 提示词、MCP 描述、LLM 上下文或 API 响应中。
本地设置
1. 克隆仓库
git clone <repository-url>
cd jouleops2. 创建虚拟环境
py -m venv .venv激活它:
.\.venv\Scripts\Activate.ps13. 安装依赖
pip install -r requirements.txt4. 配置 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/docsMCP 服务器
使用 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连接后:
打开 工具。
选择 JouleOps 工具。
输入所有必需参数。
执行工具。
验证 JSON 响应。
在适当情况下验证 HANA 数据。
对于写操作,验证
AUDIT_LOG。
SAP BTP 与 Joule 集成
预期的企业流程为:
SAP Joule
↓
Joule Studio Agent
↓
BTP Destination
↓
FastAPI / MCP
↓
SAP HANA CloudFastAPI 操作目标
REST API 通过 BTP 目标暴露,用于 Joule Studio 操作。
目标应包含:
sap-joule-studio-action = trueMCP 目标
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
VIEWERVIEWER 不得被允许创建维护工单。
不猜测
如果缺少必需参数,智能体应请求缺失的信息,而不是猜测或向写操作发送空值。
演示场景
场景 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 内部服务器错误
检查:
.env值。HANA 主机和端口。
HANA Cloud 网络可达性。
模式/表名称。
SQL 参数。
Uvicorn 日志。
找不到 HANA 表
验证模式和表:
SELECT SCHEMA_NAME, TABLE_NAME
FROM SYS.TABLES
ORDER BY SCHEMA_NAME, TABLE_NAME;项目期望 NorthWind 表位于:
NORTHWINDMCP Inspector 无法连接
验证:
MCP server is running
Port = 8001
Path = /mcp
Transport = Streamable HTTP预期端点:
http://127.0.0.1:8001/mcpMCP 工具报告缺少参数
检查 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.jsonOpenAPI 文件无效
使用当前 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
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