Transform your SAP S/4HANA or ECC system into a conversational AI interface by exposing all OData services as dynamic MCP tools. This enables natural language interactions with your ERP data:
- "Show me 10 banks" β Automatically queries the Bank entity with $top=10
- "Update bank with ID 1 to have street number 5" β Executes PATCH operation on Bank entity
- "Create a new customer with name John Doe" β Performs POST to Customer entity
- "List all purchase orders from this week" β Applies $filter for date range on PurchaseOrder entity
graph TB
A[AI Agent/LLM] --> B[MCP Client]
B --> C[SAP MCP Server]
C --> D[SAP BTP Destination]
D --> E[SAP SAP System]
C --> F[Dynamic Service Discovery]
F --> G[OData Catalog API]
C --> H[CRUD Tool Generation]
H --> I[Entity Metadata Parser]
style A fill:#e1f5fe
style C fill:#f3e5f5
style E fill:#e8f5e8
- π Service Discovery Engine: Automatically discovers all available OData services from SAP
- βοΈ Dynamic Tool Generator: Creates MCP tools for CRUD operations on each discovered entity
- π MCP Protocol Layer: Full compliance with MCP 2025-06-18 specification
- π HTTP Transport: Session-based Streamable HTTP for web applications
- π BTP Integration: Seamless authentication via SAP BTP Destination service
- Smart Query Translation: Converts natural language to proper OData queries
- Context-Aware Operations: Understands entity relationships and constraints
- Parameter Inference: Automatically maps user intent to tool parameters
- Read Operations: Entity sets with filtering, sorting, pagination
- Create Operations: New entity creation with validation
- Update Operations: Partial and full entity updates
- Delete Operations: Safe entity deletion with confirmation
- Session Management: Automatic session creation and cleanup
- Error Handling: Comprehensive error handling with user-friendly messages
- Logging: Detailed logging for debugging and monitoring
- Security: DNS rebinding protection, CORS, Helmet security
- Service Catalog: Live discovery of available services
- Entity Schemas: Dynamic schema generation from OData metadata
- Capability Detection: Automatic detection of CRUD capabilities per entity
βββββββββββββββββββββββ βββββββββββββββββββββββββββββ βββββββββββββββββββββββ
β β β β β β
β π€ AI Agent β β π₯οΈ SAP MCP Server β β π’ SAP β
β - Claude βββββΊβ - Service Discovery βββββΊβ - OData Services β
β - GPT-4 β β - CRUD Tool Registry β β - Business Logic β
β - Local LLMs β β - Session Management β β - Master Data β
β β β - BTP Authentication β β β
βββββββββββββββββββββββ βββββββββββββββββββββββββββββ βββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββ
β β
β βοΈ SAP BTP Platform β
β - Destination Service β
β - Connectivity Service β
β - XSUAA Security β
β β
βββββββββββββββββββββββββββββ
User: "Show me top 10 customers by revenue this quarter"
β Tool: r-CustomerService-Customer
β Parameters: $filter, $orderby, $top
User: "Update supplier ABC123 to have status 'Active'"
β Tool: u-SupplierService-Supplier
β Parameters: SupplierId="ABC123", Status="Active"
User: "How many open purchase orders are there?"
β Tool: r-PurchaseOrderService-PurchaseOrder
β Parameters: $filter=Status eq 'Open'&$count=true
User: "List all inactive users in the system"
β Tool: r-UserService-User
β Parameters: $filter=Status eq 'Inactive'
- Node.js 18.x or higher
- SAP S/4HANA or ECC system with OData services enabled
- SAP BTP account with Destination and Connectivity services
- TypeScript knowledge for customization
The MCP server automatically translates these natural language commands to the appropriate tool calls:
| Natural Language | Generated Tool Call | OData Query |
|---|---|---|
| "Show me 10 banks" | r-BankService-Bank |
GET /BankSet?$top=10 |
| "Find banks in Germany" | r-BankService-Bank |
GET /BankSet?$filter=Country eq 'DE' |
| "Update bank 123 name to ABC Corp" | u-BankService-Bank |
PATCH /BankSet('123') |
| "Create a new customer John Doe" | c-CustomerService-Customer |
POST /CustomerSet |
| "Delete order 456" | d-OrderService-Order |
DELETE /OrderSet('456') |
{operationAbbreviation}-{serviceId}-{entityName}
Where operationAbbreviation is:
- r: read (query entities or get single entity)
- c: create (create new entity)
- u: update (update existing entity)
- d: delete (delete entity)
Examples:
- r-API_BUSINESS_PARTNER-BusinessPartner
- c-API_CUSTOMER_MATERIAL_SRV-CustomerMaterial
- u-API_SALES_ORDER_SRV-SalesOrder
- d-API_SALES_ORDER_SRV-SalesOrder
- β
Tools with
listChangednotifications - β
Resources with
listChangednotifications - β Logging with level control
- β Session Management for HTTP transport
- β Error Handling with proper error codes
- β Streamable HTTP (recommended)
- β Stdio for command line usage
- β Session-based with automatic cleanup
- β DNS Rebinding Protection
- Uses BTP Destination service for S/4HANA or ECC authentication
- Supports Principal Propagation and OAuth2
- Automatic token refresh and session management
- Secure credential storage in BTP
- Helmet.js security headers
- CORS protection with configurable origins
- DNS rebinding attack prevention
- Request rate limiting (configurable)
- Automatic session expiration (24h default)
- Secure session ID generation
- Session cleanup on server restart
- Memory leak prevention
GET /health
{
"status": "healthy",
"activeSessions": 3,
"discoveredServices": 25,
"version": "2.0.0"
}GET /mcp
{
"name": "btp-sap-odata-to-mcp-server",
"protocol": { "version": "2025-06-18" },
"capabilities": { "tools": {}, "resources": {} },
"features": ["Dynamic service discovery", "CRUD operations"],
"activeSessions": 3
}GET /docs
{
"title": "SAP MCP Server API",
"endpoints": {...},
"mcpCapabilities": {...},
"usage": {...}
}See the MCP server in action:
To disable registration of the ReadEntity tool for all entities in all services, set the following in your .env file:
DISABLE_READ_ENTITY_TOOL=trueThis will prevent registration of the ReadEntity tool for all entities and services.
- For local development and testing, see LOCAL_RUN.md
- For deployment to SAP BTP, see DEPLOYMENT.md
