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.
README
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.
| Parameter | Type | Required | Description |
|---|---|---|---|
soldToParty |
string | No | Filter by customer number, e.g. 10100001 |
salesOrganization |
string | No | Filter by sales org, e.g. 1710 |
top |
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 |
|---|---|---|---|
salesOrderType |
string | Yes | Order type, e.g. OR |
salesOrganization |
string | Yes | Sales org, e.g. 1710 |
distributionChannel |
string | Yes | Distribution channel, e.g. 10 |
organizationDivision |
string | Yes | Division, e.g. 00 |
soldToParty |
string | Yes | Customer number, e.g. 10100001 |
transactionCurrency |
string | No | ISO currency, e.g. USD (defaults from customer master) |
purchaseOrderByCustomer |
string | No | Customer PO number |
requestedDeliveryDate |
string | No | Delivery date, YYYY-MM-DD |
Item fields (at least one item required)
| Parameter | Type | Required | Description |
|---|---|---|---|
material |
string | Yes | Product number, e.g. MZ-FG-M500 |
requestedQuantity |
string | Yes | Quantity as a string, e.g. 5 |
requestedQuantitySAPUnit |
string | Yes | SAP unit of measure, e.g. EA, KG |
plant |
string | No | Delivering plant, e.g. 1710 |
salesOrderItemCategory |
string | No | Item category, e.g. TAN (derived from config if omitted) |
salesOrderItemText |
string | No | Line item description (defaults to material description) |
Returns: created sales order header including the generated order number.
Endpoints
| Endpoint | Auth | Description |
|---|---|---|
POST/GET/DELETE /mcp |
Bearer (XSUAA) | Streamable HTTP transport — MCP 2025-11-25 |
GET /sse |
Bearer (XSUAA) | SSE transport — MCP 2024-11-05 |
POST /messages |
Bearer (XSUAA) | SSE message posting |
GET /health |
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=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:
| Field | Value |
|---|---|
| Name | S4HANA_SALESORDER (or your S4_DESTINATION_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-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
| Layer | Technology |
|---|---|
| MCP Framework | @modelcontextprotocol/sdk |
| OData HTTP | @sap-cloud-sdk/http-client |
| Destination resolution | @sap-cloud-sdk/connectivity |
| Inbound auth | @sap/xssec, @sap/xsenv |
| Web server | Express 5 |
| Language | TypeScript (Node.js 20+) |
| Deployment | SAP Cloud Foundry |
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.