btp-sap-odata-to-mcp-server
BTP CloudFoundry Node.js MCP server for SAP OData services integration
Documentation
SAP OData to MCP Server for BTP๐
๐ฏ Project Goal
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
๐๏ธ Architecture Overview - 3-Level Progressive Discovery
graph TB
A[AI Agent/LLM] --> B[MCP Client]
B --> C[SAP MCP Server]
C --> D[SAP BTP Destination]
D --> E[SAP System]
C --> F[Level 1: Lightweight Discovery]
F --> G[Minimal Service/Entity List]
C --> H[Level 2: Full Metadata]
H --> I[Complete Entity Schemas]
C --> J[Level 3: CRUD Execution]
J --> K[Authenticated Operations]
style A fill:#e1f5fe
style C fill:#f3e5f5
style E fill:#e8f5e8
style F fill:#fff3e0
style H fill:#e8eaf6
style J fill:#e0f2f1Core Components:
1. ๐ Level 1 - Discovery: Lightweight search returning minimal service/entity lists (token-optimized)
2. ๐ Level 2 - Metadata: Full schema details on-demand for selected entities
3. โก Level 3 - Execution: Authenticated CRUD operations using metadata from Level 2
4. ๐ MCP Protocol Layer: Full compliance with MCP 2025-06-18 specification
5. ๐ HTTP Transport: Session-based Streamable HTTP for web applications
6. ๐ BTP Integration: Seamless authentication via SAP BTP Destination service
3-Level Approach Benefits:
- Token Efficient: Level 1 returns 90% less data than full schemas
- Progressive Detail: Fetch full schemas only when needed
- Better LLM Experience: Smaller responses, clearer workflow
- Reduced Context: From 200+ tools down to just 3
โจ Key Features
๐จ Natural Language to OData
- 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
๐ Dynamic CRUD Operations
- 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
๐ Production-Ready
- 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
๐ Real-Time Metadata
- Service Catalog: Live discovery of available services
- Entity Schemas: Dynamic schema generation from OData metadata
- Capability Detection: Automatic detection of CRUD capabilities per entity
๐๏ธ System Architecture
โโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ โ โ โ
โ ๐ค 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 โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ฏ Use Cases
๐ Business Intelligence Queries
User: "Show me top 10 customers by revenue this quarter"
โ Tool: r-CustomerService-Customer
โ Parameters: $filter, $orderby, $top๐ Data Maintenance
User: "Update supplier ABC123 to have status 'Active'"
โ Tool: u-SupplierService-Supplier
โ Parameters: SupplierId="ABC123", Status="Active"๐ Analytical Insights
User: "How many open purchase orders are there?"
โ Tool: r-PurchaseOrderService-PurchaseOrder
โ Parameters: $filter=Status eq 'Open'&$count=true๐ง System Administration
User: "List all inactive users in the system"
โ Tool: r-UserService-User
โ Parameters: $filter=Status eq 'Inactive'๐ ๏ธ Installation & Setup
Prerequisites
- 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
๐ Usage Examples
Natural Language Queries
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')` |
๐ Available Tools - 3-Level Architecture
The server exposes 3 progressive discovery tools instead of hundreds of individual CRUD tools:
Level 1: discover-sap-data
Purpose: Lightweight search for services and entities
Returns: Minimal data (serviceId, serviceName, entityName, entityCount)
Usage:
// Search for customer entities
discover-sap-data({ query: "customer" })
// Get all available services
discover-sap-data({ query: "" })
// Search in specific category
discover-sap-data({ query: "sales", category: "sales" })Fallback: If no matches found, returns ALL services with entity lists
Level 2: get-entity-metadata
Purpose: Get complete schema for a specific entity
Returns: Full schema with properties, types, keys, capabilities
Usage:
// Get full schema for Customer entity
get-entity-metadata({
serviceId: "API_BUSINESS_PARTNER",
entityName: "Customer"
})Output: All properties, types, nullable flags, maxLength, keys, capabilities
Level 3: execute-sap-operation
Purpose: Perform authenticated CRUD operations
Operations: read, read-single, create, update, delete
Usage:
// Read customers
execute-sap-operation({
serviceId: "API_BUSINESS_PARTNER",
entityName: "Customer",
operation: "read",
filterString: "CustomerName eq 'ACME'"
})
// Update customer
execute-sap-operation({
serviceId: "API_BUSINESS_PARTNER",
entityName: "Customer",
operation: "update",
parameters: { CustomerID: "123", CustomerName: "New Name" }
})Workflow Example
1. discover-sap-data โ "customer"
โ Returns: List of customer-related entities
2. get-entity-metadata โ "API_BUSINESS_PARTNER", "Customer"
โ Returns: Full schema with all properties
3. execute-sap-operation โ read/create/update/delete
โ Executes operation with proper parametersProtocol Version: 2025-06-18
Supported Capabilities:
- โ Tools with `listChanged` notifications
- โ Resources with `listChanged` notifications
- โ Logging with level control
- โ Session Management for HTTP transport
- โ Error Handling with proper error codes
Transport Support
- โ Streamable HTTP (recommended)
- โ Stdio for command line usage
- โ Session-based with automatic cleanup
- โ DNS Rebinding Protection
๐ Security & Authentication
SAP BTP Integration
- 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
HTTP Security
- Helmet.js security headers
- CORS protection with configurable origins
- DNS rebinding attack prevention
- Request rate limiting (configurable)
Session Security
- Automatic session expiration (24h default)
- Secure session ID generation
- Session cleanup on server restart
- Memory leak prevention
๐ API Reference
Health Check
GET /health
{
"status": "healthy",
"activeSessions": 3,
"discoveredServices": 25,
"version": "2.0.0"
}Server Info
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
}Documentation
GET /docs
{
"title": "SAP MCP Server API",
"endpoints": {...},
"mcpCapabilities": {...},
"usage": {...}
}๐ฌ Demo
See the MCP server in action:

โ๏ธ Environment Variable: Disable ReadEntity Tool Registration
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.
โก Quick Start
- For local development and testing, see LOCAL_RUN.md
- For deployment to SAP BTP, see DEPLOYMENT.md
Frequently asked questions
What is btp-sap-odata-to-mcp-server?
btp-sap-odata-to-mcp-server is BTP CloudFoundry Node.js MCP server for SAP OData services integration
How do I install btp-sap-odata-to-mcp-server?
Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.
Is btp-sap-odata-to-mcp-server open source?
Yes โ it is hosted on GitHub at https://github.com/lemaiwo/btp-sap-odata-to-mcp-server and has 73 stars.
Related MCP tools
Playwright MCP server TypeScript-based implementation. Trusted by 22000+ developers. Trusted by 22000+ developers. Trusted by 22000+ developers.
Official Notion MCP Server TypeScript-based implementation. Trusted by 3400+ developers. Trusted by 3400+ developers. Trusted by 3400+ developers.
Directory for Awesome MCP Servers TypeScript-based implementation. Trusted by 1900+ developers. Trusted by 1900+ developers.
๐งฉ MCP Gateway - A lightweight gateway service that instantly transforms existing MCP Servers and APIs into MCP servers with zero code changes.
MCP Aggregator, Orchestrator, Middleware, Gateway in one docker TypeScript-based implementation. Trusted by 1400+ developers.
MCP Server for kubernetes management commands TypeScript-based implementation. Trusted by 1100+ developers. Trusted by 1100+ developers.
Run your own MCP server? See who uses it and what to fix.
Measure it with TrackMCP