Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp4odatalist the latest sales orders for customer 10100001"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp4odata
An MCP (Model Context Protocol) server that exposes SAP S/4HANA OData services as tools for LLMs. Deployed on SAP Cloud Foundry (BTP).
Overview
LLM / MCP Client
│ Bearer token (XSUAA)
▼
mcp4odata (CF app)
│ SAP Cloud SDK → BTP Destination Service
▼
SAP S/4HANA (CE_SALESORDER_0001, OData v4)Inbound auth: XSUAA Bearer token validation via
@sap/xssecOutbound connectivity: SAP Cloud SDK
executeHttpRequest()with BTP Destination ServiceTwo MCP transports: Streamable HTTP (MCP 2025-11-25) and SSE fallback (MCP 2024-11-05)
Tools
salesorder_get_list
Retrieves a list of S/4HANA sales order headers.
Parameter | Type | Required | Description |
| string | No | Filter by customer number, e.g. |
| string | No | Filter by sales org, e.g. |
| integer | No | Max results, 1–100 (default: 20) |
Returns: array of sales order headers — order number, type, sold-to party, total net amount, currency, requested delivery date.
salesorder_create
Creates a new S/4HANA sales order with one or more line items (deep-insert POST).
Header fields
Parameter | Type | Required | Description |
| string | Yes | Order type, e.g. |
| string | Yes | Sales org, e.g. |
| string | Yes | Distribution channel, e.g. |
| string | Yes | Division, e.g. |
| string | Yes | Customer number, e.g. |
| string | No | ISO currency, e.g. |
| string | No | Customer PO number |
| string | No | Delivery date, |
Item fields (at least one item required)
Parameter | Type | Required | Description |
| string | Yes | Product number, e.g. |
| string | Yes | Quantity as a string, e.g. |
| string | Yes | SAP unit of measure, e.g. |
| string | No | Delivering plant, e.g. |
| string | No | Item category, e.g. |
| string | No | Line item description (defaults to material description) |
Returns: created sales order header including the generated order number.
Endpoints
Endpoint | Auth | Description |
| Bearer (XSUAA) | Streamable HTTP transport — MCP 2025-11-25 |
| Bearer (XSUAA) | SSE transport — MCP 2024-11-05 |
| Bearer (XSUAA) | SSE message posting |
| None | Health check (used by CF) |
Local Development
Prerequisites
Node.js 20+
SAP BTP subaccount with XSUAA and Destination service instances
Setup
npm install
cp .env.example .env
# Fill in VCAP_SERVICES with your XSUAA and Destination credentials.env structure (see .env.example for the full template):
VCAP_SERVICES='{ "xsuaa": [...], "destination": [...] }'
S4_DESTINATION_NAME=S4HANA_SALESORDER
PORT=3000Run
npm run dev # tsx watch mode
npm run build # compile TypeScript → dist/Test with MCP Inspector
Point the inspector at http://localhost:3000/mcp with a valid XSUAA Bearer token.
BTP Destination Configuration
Create an HTTP destination in the BTP cockpit with:
Field | Value |
Name |
|
Type | HTTP |
URL | Your S/4HANA base URL |
Authentication | OAuth2ClientCredentials |
Token Service URL | XSUAA token endpoint for S/4HANA |
The SAP Cloud SDK reads the Destination service binding from VCAP_SERVICES, fetches the destination, and injects the Authorization header automatically.
Cloud Foundry Deployment
Prerequisites
brew install cloudfoundry/tap/cf-cli@8
cf login -a https://api.cf.<region>.hana.ondemand.com
cf target -o <org> -s <space>Create required service instances
cf create-service xsuaa application xsuaa-mcp4odata -c xsuaa-config.json
cf create-service destination lite destination-mcp4odataDeploy
npm run build
cf push
cf logs mcp4odata --recentUseful CF commands
cf env mcp4odata # inspect bound service credentials
cf set-env mcp4odata S4_DESTINATION_NAME # override env variable
cf restage mcp4odata # restage after env changesProject Structure
src/
├── server.ts # Express app, MCP transports, route setup
├── auth/
│ └── middleware.ts # XsuaaTokenVerifier — inbound Bearer token validation
├── odata/
│ └── client.ts # getSalesOrders(), createSalesOrder() via SAP Cloud SDK
└── tools/
├── get-sales-orders.ts # salesorder_get_list tool
└── create-sales-order.ts # salesorder_create tool
manifest.yml # CF deployment manifest
.env.example # Local dev environment templateTech Stack
Layer | Technology |
MCP Framework |
|
OData HTTP |
|
Destination resolution |
|
Inbound auth |
|
Web server | Express 5 |
Language | TypeScript (Node.js 20+) |
Deployment | SAP Cloud Foundry |
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.