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

Resources

Looking for Admin?

Admins can modify the Dockerfile, update the server description, and track usage metrics. If you are the server author, to access the admin panel.

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