btp-sap-odata-to-mcp-server
Exposes every OData service on an S/4HANA or ECC system as MCP tools, in three discovery levels so a large catalogue does not have to be loaded at once.
Pointing an agent at a whole ERP's OData catalogue is a token problem before it is anything else, and the three levels are the answer: level one is a lightweight list of services and entities, level two fetches full metadata for the one you chose, level three executes authenticated CRUD against it. "Show me 10 banks" becomes $top=10 on the Bank entity; "update bank 1 to have street number 5" becomes a PATCH. Deployed as a Node application on BTP Cloud Foundry, reaching the system through a BTP Destination.
Facts
Where it sits
Who is behind it
In the atlas: maintains 25, contributes to 39, wrote 12@lemaiwomaintainerArun KrishnamoorthyContributes to this
In the atlas: contributes to 2, wrote 2@arunkrishnamoorthyMarian ZeisContributes to this
In the atlas: maintains 35, contributes to 86, wrote 25@marianfooSebastiano MarchesiniContributes to this
In the atlas: contributes to 1, wrote 1@smarchesini-avvale3 contributors
Before choosing this
Conditions
PracticalFunctional boundary
It puts create, update and delete on business entities behind natural language. Whatever the destination's principal may change, an agent may change — and "create a new customer" is a sentence, not a form somebody signed off.
PolicySAP API Policy 4.2026a§ 1.1, 1.2, 2.2.2from Agent access to your systemsAn MCP server uses SAP APIs to supply tools, resources or data to an agent.
- § 1.1 Published APIs. Published APIs are made available for the documented purposes identified by SAP, including integration, extensions and data exchange.
- § 1.2 Non-Published APIs. Customer and third-party applications must not access non-published APIs except where documentation permits it or SAP otherwise authorizes it.
- § 2.2.2 AI call sequences and data extraction. Outside SAP-endorsed architectures, data services or expressly identified pathways, the policy prohibits specified agentic API use and systematic or large-scale extraction.
MCP does not replace the API's documented-use boundary. Check that every endpoint is published for the intended use and whether the policy's AI-call or extraction provisions apply to the design.
SAP API Policy 4.2026a →What it declares
Every artifact
- Type
- MCP server
- Origin
- Independently maintained
- Runtime
- Node.js
- Runs on
- Cloud Foundry
As an MCP server
- Runs as
- central serverlocal process
- Transport
- HTTPstdio
- Authentication
- BTP destinationprincipal propagationOAuth / OIDC
- Tools
- 3
- Read-only
- nostates it is not
- Guardrails
6 quoted from README show all
Request rate limiting (configurable)
DNS rebinding attack prevention
CORS protection with configurable origins
Automatic session expiration (24h default)
Safe entity deletion with confirmation
DISABLEREADENTITY_TOOL=true
Connections
Giving an AI agent access to the systems you run over MCP
Download
Architecture
Download
README
quoted from lemaiwo/btp-sap-odata-to-mcp-server under MIT, readSAP 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
Core Components:
- 🔍 Level 1 - Discovery: Lightweight search returning minimal service/entity lists (token-optimized)
- 📋 Level 2 - Metadata: Full schema details on-demand for selected entities
- ⚡ Level 3 - Execution: Authenticated CRUD operations using metadata from Level 2
- 🔌 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
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 parameters
Protocol Version: 2025-06-18
Supported Capabilities:
- ✅ Tools with
listChangednotifications - ✅ Resources with
listChangednotifications - ✅ 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=true
This 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
History
Others providing
Compare all 12 on the Agent access to your systems page →- @abap2ui5/mcp-server@abap2ui5/mcp-serverAn MCP server that puts the abap2UI5 development loop on the machine an agent runs on: check the view the ABAP builds, photograph it, deploy the class into a sandbox, boot the app headless and read the errors.community org, abapMCP server for the abap2UI5 check, deploy and run loop
- abap2UI5 for VS Codeabap2UI5 for VS CodeA VS Code extension for abap2UI5 apps: F9 starts the app class in a preview beside the source, Ctrl+F3 activates the class and reloads it, and the abap2UI5 linter runs in the editor while you type.community org, abapVS Code extension to preview, activate and lint abap2UI5 apps
- abapsmithabapsmithAn MCP server that lets an LLM develop in ABAP on a live system over ADT, with writes off by default and every mutation recorded in a local journal that can undo it.independent, abapABAP MCP server over ADT with a local journal that can undo writes
- midasol/sap-mcp-servermidasol/sap-mcp-serverA Python MCP server for SAP Gateway with four read-only tools that authenticate, query, fetch one entity and list services, and one of the few here that publishes its test results.independent, btpPython MCP server for SAP Gateway OData operations
- odata_mcp_goodata_mcp_goA Go binary that bridges any OData v2 or v4 service to MCP — and can collapse the whole service into one tool when the generated tool list is too large to be usable.independent, btpGo binary bridging any OData v2 or v4 service to MCP
- odata_mcpodata_mcpThe Python original: reads an OData v2 service's metadata and generates MCP tools from it, with the SAP-specific conversions the raw protocol leaves to you.independent, btpPython bridge generating MCP tools from OData v2 metadata
- sap-mcp-serversap-mcp-serverReads SAP ECC and S/4HANA for an agent over Gateway OData and RFC, with a Node bridge that speaks the RFC protocol without the proprietary SAP NetWeaver RFC SDK.independent, abapReads SAP ECC and S/4HANA for an agent over Gateway OData and RFC, with a Node bridge that speaks the RFC protocol without the proprietary SAP NetWeaver RFC SDK.
- Skybuffer AI MCP serverSkybuffer AI MCP serverAn ABAP add-on that serves SAP business data, transactions and development context as MCP tools from an ICF node inside SAP ECC and S/4HANA, each call running as the signed-in user under PFCG authorization checks.independent, abapABAP add-on serving business data and transactions as MCP tools
- sap-security-mcpsap-security-mcpAn entirely read-only security analysis surface: nineteen tools, five resources and eight prompts for audits, SOX and segregation-of-duties review, behind OAuth 2.0 with PKCE. The vendor hosts an endpoint, and the README documents running it yourself.independent, abapRead-only security analysis MCP server for SAP audits and SoD review
- KlystronKlystronAn MCP server written in ABAP that runs inside the application server behind an ICF service and exposes typed tools for ABAP development, quality, transports, customizing, roles, Basis operations and integration, with a client-side plugin of SAP skills.independent, abapMCP server in ABAP inside the application server, with agent skills
- pyrfc-mcppyrfc-mcpAn MCP server for calling an SAP system's RFC-enabled function modules from an agent, built so that discovering a function does not authorise calling it: a read or a write is denied unless the function name matches an allowlist the server is configured with.independent, abapMCP server calling RFC-enabled function modules behind an allowlist
Details
Sources
Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.
Compatibility and provenance
History in the atlas
- The concern it answers is reaching into an SAP system from outside, split out of MCP servers on this day; the sentence on the edge is unchanged.
- Triaged out of data/crawled/mcp-candidates.json, the sap-ai-mcp-servers sweep. Written from the repository's own README; the catalogue is credited as where it was found and its words are not reused.
- First seen.
For your agent
- Ref
artifact:lemaiwo-btp-sap-odata-to-mcp-server- JSON
- /artifacts/lemaiwo-btp-sap-odata-to-mcp-server.json
- MCP
- Connecting an agent