MCP Hub
Back to servers

mcp4odata

Exposes SAP S/4HANA OData services as tools for LLMs, enabling users to list and create sales orders via the Model Context Protocol. It integrates with SAP BTP using the SAP Cloud SDK to provide secure access to enterprise data through natural language.

glama
Updated
Mar 7, 2026

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/xssec
  • Outbound connectivity: SAP Cloud SDK executeHttpRequest() with BTP Destination Service
  • Two 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.

ParameterTypeRequiredDescription
soldToPartystringNoFilter by customer number, e.g. 10100001
salesOrganizationstringNoFilter by sales org, e.g. 1710
topintegerNoMax 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

ParameterTypeRequiredDescription
salesOrderTypestringYesOrder type, e.g. OR
salesOrganizationstringYesSales org, e.g. 1710
distributionChannelstringYesDistribution channel, e.g. 10
organizationDivisionstringYesDivision, e.g. 00
soldToPartystringYesCustomer number, e.g. 10100001
transactionCurrencystringNoISO currency, e.g. USD (defaults from customer master)
purchaseOrderByCustomerstringNoCustomer PO number
requestedDeliveryDatestringNoDelivery date, YYYY-MM-DD

Item fields (at least one item required)

ParameterTypeRequiredDescription
materialstringYesProduct number, e.g. MZ-FG-M500
requestedQuantitystringYesQuantity as a string, e.g. 5
requestedQuantitySAPUnitstringYesSAP unit of measure, e.g. EA, KG
plantstringNoDelivering plant, e.g. 1710
salesOrderItemCategorystringNoItem category, e.g. TAN (derived from config if omitted)
salesOrderItemTextstringNoLine item description (defaults to material description)

Returns: created sales order header including the generated order number.


Endpoints

EndpointAuthDescription
POST/GET/DELETE /mcpBearer (XSUAA)Streamable HTTP transport — MCP 2025-11-25
GET /sseBearer (XSUAA)SSE transport — MCP 2024-11-05
POST /messagesBearer (XSUAA)SSE message posting
GET /healthNoneHealth 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=3000

Run

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:

FieldValue
NameS4HANA_SALESORDER (or your S4_DESTINATION_NAME)
TypeHTTP
URLYour S/4HANA base URL
AuthenticationOAuth2ClientCredentials
Token Service URLXSUAA 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-mcp4odata

Deploy

npm run build
cf push
cf logs mcp4odata --recent

Useful 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 changes

Project 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 template

Tech Stack

LayerTechnology
MCP Framework@modelcontextprotocol/sdk
OData HTTP@sap-cloud-sdk/http-client
Destination resolution@sap-cloud-sdk/connectivity
Inbound auth@sap/xssec, @sap/xsenv
Web serverExpress 5
LanguageTypeScript (Node.js 20+)
DeploymentSAP Cloud Foundry

Reviews

No reviews yet

Sign in to write a review