Skip to main content
Glama
lemaiwo

SAP OData to MCP Server

by lemaiwo

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:#e0f2f1

Core 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 parameters

Protocol 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:

MCP Demo

βš™οΈ 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

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lemaiwo/btp-sap-odata-to-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server