odata_mcp
The 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.
Tools generated from metadata rather than hand-written, with full CRUD, the standard query parameters, and function imports. What distinguishes it is the accumulated handling of what SAP OData actually returns: /Date(milliseconds)/ converted to ISO 8601, Edm.Decimal fields converted to strings so precision survives, base64 and standard GUIDs converted both ways, response size limiting with selective field retrieval, and pagination hints that suggest the next call's parameters. Basic, cookie and OAuth 2.0 authentication with CSRF handling; stdio or HTTP/SSE.
Facts
Where it sits
Who is behind it
In the atlas: maintains 6, contributes to 12@oiseemaintainerZafar IqbalContributes to this
In the atlas: contributes to 1@ziqbal1 contributor
Before choosing this
Conditions
PracticalFunctional boundary
OData v2 only, and untouched since August 2025 — the same author's Go portodata_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, btp is where v4 support and the tool-explosion work went.
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
As an MCP server
- Transport
- stdioHTTPSSE
- Authentication
- user and passwordOAuth / OIDC
- Read-only
- nostates it is not
- Guardrails
2 quoted from README show all
Creating read-only MCP endpoints for users
The HTTP/SSE transport does not include authentication.
Connections
Go binary bridging any OData v2 or v4 service to MCP
Giving an AI agent access to the systems you run over MCP
Go binary bridging any OData v2 or v4 service to MCP
Download
Architecture
Download
README
quoted from oisee/odata_mcp under MIT, readOData MCP Wrapper
A bridge between OData v2 services and the Model Context Protocol (MCP), dynamically generating MCP tools based on OData metadata.
Overview
The OData MCP Wrapper enables seamless integration between OData v2 services and the MCP (MCP). It automatically analyzes OData service metadata and generates corresponding MCP tools, allowing AI agents to interact with OData services through a standardized interface.
Key Features
- Modular Architecture: Split into focused modules for maintainability
- Enhanced Error Handling: Comprehensive OData error parsing and propagation
- Smart Tool Naming: Service-aware tool naming preserving original names
- Automatic Tool Generation: Creates MCP tools from OData metadata
- Full CRUD Support: Create, Read, Update, Delete operations for entity sets
- Query Capabilities: Standard OData query parameters (filter, select, expand, orderby, etc.)
- Function Import Support: Handles OData function imports
- Authentication: Basic auth, cookie-based auth, and OAuth 2.0 with CSRF token management (OAuth newly added!)
- GUID Optimization: Automatic base64 ↔ standard GUID conversion
- Response Optimization: Size limiting and selective field retrieval
- Legacy Date Support: Automatic conversion between SAP /Date(milliseconds)/ and ISO 8601
- Decimal Field Handling: Automatic numeric to string conversion for Edm.Decimal fields
- Pagination Hints: Suggested next call parameters for easy pagination
- Flexible Response Control: Options for metadata inclusion and error verbosity
- Multiple Transport Options: STDIO (default) and HTTP/SSE for web-based clients
- Read-Only Modes: Options to hide modifying operations for safer exploration
- Service-Specific Hints: Implementation guidance for known problematic services
- MCP Protocol Tracing: Debug logging for troubleshooting client issues
Installation
Prerequisites
- Python 3.8+
- FastMCP package
Installation Steps
-
Clone the repository:
git clone https://github.com/oisee/odata_mcp.git cd odata_mcp -
Install dependencies:
pip install -r requirements.txt
Configuration
Environment Variables
Create a .env file in the project directory:
# OData service URL (required)
ODATA_SERVICE_URL=https://your-odata-service.com/odata/
ODATA_URL=https://your-odata-service.com/odata/ # Alternative
# Basic Authentication (if required)
ODATA_USERNAME=your_username
ODATA_USER=your_username # Alternative
ODATA_PASSWORD=your_password
ODATA_PASS=your_password # Alternative
# Cookie Authentication (alternative to basic auth)
ODATA_COOKIE_FILE=/path/to/cookie.txt
ODATA_COOKIE_STRING="session=abc123; token=xyz789"
# OAuth 2.0 Authentication (alternative to basic/cookie auth)
OAUTH_CLIENT_ID=your-oauth-client-id
OAUTH_CLIENT_SECRET=your-oauth-client-secret
OAUTH_TOKEN_URL=https://login.microsoftonline.com/tenant-id/oauth2/v2.0/token
OAUTH_SCOPE=https://graph.microsoft.com/.default # Optional
Usage
Command Line Options
| Option | Description | Default |
|---|---|---|
--service | OData service URL (overrides positional arg and env var) | - |
-u, --user | Username for basic authentication | - |
-p, --password | Password for basic authentication | - |
--cookie-file | Path to cookie file (Netscape format) | - |
--cookie-string | Cookie string (key1=val1; key2=val2) | - |
--oauth-client-id | OAuth 2.0 Client ID | - |
--oauth-client-secret | OAuth 2.0 Client Secret | - |
--oauth-token-url | OAuth 2.0 Token Endpoint URL | - |
--oauth-scope | OAuth 2.0 Scope | - |
--oauth-tenant | Azure AD Tenant ID for Microsoft Graph | common |
-v, --verbose, --debug | Enable verbose output to stderr | False |
--tool-prefix | Custom prefix for tool names | - |
--tool-postfix | Custom postfix for tool names | _for_<service_id> |
--no-postfix | Use prefix instead of postfix | False |
--tool-shrink | Use shortened tool names | False |
--entities | Comma-separated entities (supports wildcards with *) | All entities |
--functions | Comma-separated functions (supports wildcards with *) | All functions |
--sort-tools | Sort tools alphabetically | True |
--no-sort-tools | Disable alphabetical sorting of tools | - |
--pagination-hints | Add suggested_next_call in pagination responses | False |
--legacy-dates | Convert /Date(ms)/ to/from ISO 8601 | True |
--no-legacy-dates | Disable legacy date format conversion | - |
--verbose-errors | Include detailed error messages | False |
--response-metadata | Include __metadata blocks in responses | False |
--max-response-size | Maximum response size in bytes | 5242880 (5MB) |
--max-items | Maximum items per response | 100 |
--trace | Print all tools and exit (debugging) | False |
--trace-mcp | Enable detailed MCP protocol trace logging | False |
--read-only, -ro | Hide all modifying operations (create, update, delete, functions) | False |
--read-only-but-functions, -robf | Hide create, update, delete but allow functions | False |
--enable | Enable only specific operation types (see Operation Type Filtering) | - |
--disable | Disable specific operation types (see Operation Type Filtering) | - |
--hints-file | Path to hints JSON file | hints.json |
--hint | Direct hint JSON or text to inject | - |
--info-tool-name | Custom name for the service info tool | odata_service_info |
--transport | Transport type: 'stdio' or 'http' (SSE) | stdio |
--http-addr | HTTP server address (with --transport http) | :8080 |
Service Info Tool
The wrapper automatically creates a service info tool that provides comprehensive metadata about the OData service:
- Default name:
odata_service_info(with service-specific postfix) - Alias:
readme(automatically created for better discoverability) - Custom name: Use
--info-tool-nameto specify a custom name
This tool is marked as the RECOMMENDED STARTING POINT and provides:
- Service URL and description
- Available entity sets and their operations
- Entity types with properties and relationships
- Function imports with parameters
- Implementation hints and known issues
- List of all registered MCP tools
Example:
# Default naming (creates both odata_service_info and readme aliases)
python odata_mcp.py --service https://example.com/odata/
# Custom naming (no readme alias)
python odata_mcp.py --service https://example.com/odata/ --info-tool-name get_started
Read-Only Modes
The wrapper supports read-only modes for safer exploration of OData services:
--read-only(-ro): Hides all modifying operations (create, update, delete, and function imports)--read-only-but-functions(-robf): Hides create, update, and delete operations but still allows function imports
These modes are mutually exclusive and useful when:
- Exploring unfamiliar OData services
- Preventing accidental data modifications
- Creating read-only MCP endpoints for users
Operation Type Filtering
The wrapper supports fine-grained control over which operation types are generated using --enable and --disable flags. This helps reduce tool count for services with many entities.
Operation Types
- C: Create operations
- S: Search operations
- F: Filter operations (includes count)
- G: Get (retrieve single entity) operations
- U: Update operations
- D: Delete operations
- A: Actions/Function imports
- R: Read operations (expands to S, F, and G)
Examples
# Enable only read operations (search, filter, get)
python odata_mcp.py --service https://example.com/odata/ --enable "R"
# Enable only filter and get operations
python odata_mcp.py --service https://example.com/odata/ --enable "FG"
# Disable create, update, and delete operations
python odata_mcp.py --service https://example.com/odata/ --disable "CUD"
# Disable actions/function imports
python odata_mcp.py --service https://example.com/odata/ --disable "A"
Notes:
- Operation codes are case-insensitive
--enableand--disableare mutually exclusive- The special
Rcode in--enableexpands to S, F, and G operations - This filtering is more flexible than
--read-onlymodes as it allows specific operation combinations
Service-Specific Hints
The wrapper includes a flexible hint system to provide guidance for services with known issues or special requirements:
# Use default hints.json from script directory
python odata_mcp.py https://my-service.com/odata/
# Use custom hints file
python odata_mcp.py --hints-file /path/to/custom-hints.json https://my-service.com/odata/
# Inject hint directly from command line
python odata_mcp.py --hint "Remember to use \$expand for complex queries" https://my-service.com/odata/
# Combine file and CLI hints (CLI has higher priority)
python odata_mcp.py --hints-file custom.json --hint '{"notes":["Override note"]}' https://my-service.com/odata/
Hints are matched by URL patterns and appear in the odata_service_info tool response under implementation_hints.
Default hints are provided for:
- SAP OData Services: General SAP-specific issues and workarounds
- SAP PO Tracking Service (SRA020_PO_TRACKING_SRV): Specific guidance for purchase order tracking
- Northwind Demo Services: Identifies public demo services
Hint File Structure
The hints.json file follows this structure:
{
"version": "1.0",
"hints": [
{
"pattern": "*/sap/opu/odata/*",
"priority": 10,
"service_type": "SAP OData Service",
"known_issues": [...],
"workarounds": [...],
"field_hints": {
"FieldName": {
"type": "Edm.String",
"format": "Expected format",
"example": "12345"
}
},
"examples": [
{
"description": "Example description",
"query": "filter_EntitySet with $filter=...",
"note": "Additional note"
}
],
"notes": [...]
}
]
}
Patterns support wildcards (* and ?) and are matched against the service URL. Multiple hints can match; they are merged by priority (higher values override).
MCP Protocol Tracing
Use --trace-mcp to enable detailed protocol debugging. This creates a log file with all MCP messages:
- Linux/WSL:
/tmp/mcp_trace_*.log - Windows:
%TEMP%\mcp_trace_*.log
Useful for diagnosing client compatibility issues.
OAuth 2.0 Authentication
The OData MCP wrapper supports OAuth 2.0 authentication for modern, secure access to protected OData services. This feature addresses GitHub Discussion #9 requesting OIDC authentication support.
Supported OAuth Flows
- Client Credentials Flow: Server-to-server authentication (recommended)
- Automatic Token Refresh: Tokens are automatically refreshed when expired
- Multiple Providers: Microsoft Graph, SAP, and custom OAuth providers
Configuration
Environment Variables
# OAuth 2.0 credentials
OAUTH_CLIENT_ID=your-application-client-id
OAUTH_CLIENT_SECRET=your-application-client-secret
OAUTH_TOKEN_URL=https://login.microsoftonline.com/tenant-id/oauth2/v2.0/token
OAUTH_SCOPE=https://graph.microsoft.com/.default # Optional
Command Line Arguments
python odata_mcp.py --oauth-client-id CLIENT_ID \
--oauth-client-secret CLIENT_SECRET \
--oauth-token-url TOKEN_URL \
--oauth-scope SCOPE \
--service SERVICE_URL
Microsoft Graph Integration
The wrapper includes built-in support for Microsoft Graph API:
# Automatic Graph configuration (detects graph.microsoft.com)
python odata_mcp.py --service https://graph.microsoft.com/v1.0/ \
--oauth-client-id YOUR_CLIENT_ID \
--oauth-client-secret YOUR_CLIENT_SECRET \
--oauth-tenant YOUR_TENANT_ID
# Or use environment variables
export OAUTH_CLIENT_ID="your-client-id"
export OAUTH_CLIENT_SECRET="your-client-secret"
python odata_mcp.py --service https://graph.microsoft.com/v1.0/ \
--oauth-tenant YOUR_TENANT_ID
Setting Up OAuth with Microsoft Graph
-
Register Application in Azure Portal:
- Go to Azure Portal → Azure Active Directory → App registrations
- Click "New registration"
- Set application name and supported account types
- No redirect URI needed for client credentials flow
-
Configure API Permissions:
- Go to "API permissions" → Add permission → Microsoft Graph → Application permissions
- Add required permissions (e.g.,
User.Read.All,Group.Read.All) - Grant admin consent for permissions
-
Get Credentials:
- Client ID: Found in app overview page
- Client Secret: Create in "Certificates & secrets" → New client secret
- Tenant ID: Found in app overview or Azure AD overview
-
Test Connection:
python test_oauth.py # Use the provided test script
SAP OAuth Configuration
For SAP systems with OIDC enabled:
python odata_mcp.py --service https://your-sap-system.com:8443/sap/opu/odata/sap/YOUR_SERVICE/ \
--oauth-client-id YOUR_SAP_CLIENT_ID \
--oauth-client-secret YOUR_SAP_CLIENT_SECRET \
--oauth-token-url https://your-sap-system.com:8443/sap/bc/sec/oauth2/token \
--oauth-scope "odata_read odata_write"
Testing OAuth Setup
Use the provided test script to verify OAuth configuration:
# Test with your credentials
export OAUTH_CLIENT_ID="your-client-id"
export OAUTH_CLIENT_SECRET="your-client-secret"
python test_oauth.py
# Skip Graph API tests if you don't have Graph permissions
python test_oauth.py --skip-graph
Troubleshooting OAuth
Common Issues:
-
Token acquisition failed:
- Verify client ID and secret are correct
- Check token URL is accessible
- Ensure proper scope configuration
-
Insufficient permissions:
- Verify API permissions in Azure Portal
- Ensure admin consent is granted
- Check scope matches required permissions
-
Token expired errors:
- Tokens are automatically refreshed, but check network connectivity
- Verify token URL and refresh token support
Debug Mode:
python odata_mcp.py --oauth-client-id CLIENT_ID \
--oauth-client-secret CLIENT_SECRET \
--service SERVICE_URL \
--verbose # Shows OAuth token acquisition logs
Command Line Examples
# Using environment variables
python odata_mcp.py
# Using command line arguments (basic auth)
python odata_mcp.py --service https://your-service.com/odata/ \
--user USERNAME \
--password PASSWORD \
--verbose
# Using cookie authentication
python odata_mcp.py --service https://your-service.com/odata/ \
--cookie-file cookie.txt \
--verbose
# Using OAuth 2.0 authentication
python odata_mcp.py --service https://your-service.com/odata/ \
--oauth-client-id YOUR_CLIENT_ID \
--oauth-client-secret YOUR_CLIENT_SECRET \
--oauth-token-url https://login.microsoftonline.com/tenant/oauth2/v2.0/token \
--verbose
# Microsoft Graph with OAuth (simplified)
python odata_mcp.py --service https://graph.microsoft.com/v1.0/ \
--oauth-client-id YOUR_CLIENT_ID \
--oauth-client-secret YOUR_CLIENT_SECRET \
--oauth-tenant YOUR_TENANT_ID \
--verbose
# Additional options
python odata_mcp.py --tool-prefix myprefix \
--tool-postfix myservice \
--no-postfix
# Generate tools only for specific entities
python odata_mcp.py --service https://your-service.com/odata/ \
--entities "Products,Categories,Orders" \
--verbose
# Use wildcards in entity filtering
python odata_mcp.py --service https://your-service.com/odata/ \
--entities "Product*,Order*,Customer" \
--verbose
# Control tool sorting (default is alphabetical)
python odata_mcp.py --service https://your-service.com/odata/ \
--no-sort-tools \
--verbose
# Enable pagination hints for easier navigation
python odata_mcp.py --service https://your-service.com/odata/ \
--pagination-hints \
--verbose
# SAP-specific options for legacy systems
python odata_mcp.py --service https://sap-service.com/odata/ \
--legacy-dates \
--response-metadata \
--verbose-errors
# Debug mode - show all tools without starting server
python odata_mcp.py --service https://your-service.com/odata/ \
--trace
# Run with HTTP/SSE transport for web clients
python odata_mcp.py --service https://your-service.com/odata/ \
--transport http \
--http-addr :8080
# HTTP transport on specific interface
python odata_mcp.py --service https://your-service.com/odata/ \
--transport http \
--http-addr 127.0.0.1:3000
# Read-only mode - hide all modifying operations
python odata_mcp.py --service https://your-service.com/odata/ \
--read-only \
--verbose
# Read-only but allow functions
python odata_mcp.py --service https://your-service.com/odata/ \
--read-only-but-functions \
--verbose
# Enable MCP protocol trace logging for debugging
python odata_mcp.py --service https://your-service.com/odata/ \
--trace-mcp \
--verbose
Generated Tools
The wrapper dynamically generates MCP tools for each entity set. Use --entities to limit tool generation to specific entities only (useful for large services):
- List/Filter:
filter_EntitySetName- Query entities with filtering, sorting, pagination - Count:
count_EntitySetName- Get entity count with optional filtering - Search:
search_EntitySetName- Full-text search (if supported) - Get:
get_EntitySetName- Retrieve single entity by key - Create:
create_EntitySetName- Create new entity - Update:
update_EntitySetName- Update existing entity - Delete:
delete_EntitySetName- Delete entity
Example Usage
# List entities with filtering
await filter_ProductSet(
filter="Price gt 20",
orderby="Price desc",
top=10
)
# Get specific entity
await get_ProductSet(ID="12345")
# Create new entity
await create_ProductSet(
Name="New Product",
Price=99.99,
CategoryID="CAT001"
)
# Update entity
await update_ProductSet(
ID="12345",
Price=89.99
)
# Get service information
await odata_service_info()
Transport Options
The OData MCP bridge supports three transport mechanisms:
1. STDIO Transport (Default)
- Standard input/output communication
- Used by Claude Desktop and other MCP clients
- No additional configuration required
2. HTTP/SSE Transport
- HTTP server with Server-Sent Events
- Enables web-based clients to interact with OData services
- Endpoints:
GET /health- Health checkGET /sse- Server-Sent Events streamPOST /rpc- JSON-RPC endpoint
3. Streamable HTTP Transport (New)
- Modern bidirectional HTTP transport for MCP
- Required for Microsoft Copilot Studio integration
- Replaces SSE transport (which will be deprecated in August 2025)
- Single endpoint at
/mcpfor all communication - More efficient and secure than SSE
Using Streamable HTTP Transport
# Start with default port 8080 (recommended for Microsoft Copilot Studio)
python odata_mcp.py --transport streamable-http --service https://your-service.com/odata/
# Use custom port
python odata_mcp.py --transport streamable-http --http-addr localhost:3000 --service https://your-service.com/odata/
# With authentication
python odata_mcp.py --transport streamable-http -u username -p password --service https://your-service.com/odata/
The Streamable HTTP server will be available at http://localhost:8080/mcp (or your custom port).
Using HTTP/SSE Transport
# Start with default port 8080
python odata_mcp.py --transport http --service https://your-service.com/odata/
# Use custom port
python odata_mcp.py --transport http --http-addr :3000 --service https://your-service.com/odata/
# Bind to specific interface
python odata_mcp.py --transport http --http-addr 192.168.1.100:8080 --service https://your-service.com/odata/
Testing HTTP/SSE Transport
-
Using the provided HTML client:
# Start the server python odata_mcp.py --transport http --service https://services.odata.org/V2/Northwind/Northwind.svc/ # Open examples/sse_client.html in a web browser -
Using the test script:
./test_http_transport.sh -
Using curl:
# Test health endpoint curl http://localhost:8080/health # Test RPC endpoint curl -X POST http://localhost:8080/rpc \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'
⚠️ Security Warning: The HTTP/SSE transport does not include authentication. Only use it in secure, trusted environments or behind a reverse proxy with proper authentication.
Architecture
The project uses a modular architecture for maintainability:
odata_mcp_lib/ # Core modular library
├── __init__.py # Clean API exports
├── constants.py # OData type mappings & namespaces
├── models.py # Pydantic data models
├── guid_handler.py # GUID conversion utilities
├── metadata_parser.py # OData metadata parsing
├── client.py # HTTP client with error handling
├── bridge.py # MCP bridge implementation
├── name_shortener.py # Tool name shortening logic
└── transport/ # Transport implementations
├── __init__.py # Transport base classes
├── stdio.py # STDIO transport
└── http_sse.py # HTTP/SSE transport
odata_mcp.py # Main executable
examples/
├── sse_client.html # Web-based SSE client
test_odata_mcp.py # Test suite
test_http_transport.sh # HTTP transport test script
Key Components
- MetadataParser: Fetches and parses OData
$metadataXML - ODataClient: Manages HTTP communication and CSRF tokens
- ODataMCPBridge: Generates MCP tools from metadata
- GUIDHandler: Converts between base64 and standard GUID formats
Testing
Unit Tests
# Run basic unit tests
python test_odata_mcp.py
# Run with live service (requires valid OData service)
RUN_LIVE_TESTS=true python test_odata_mcp.py
OAuth Testing
# Test OAuth implementation without credentials
python test_oauth.py --skip-graph
# Run comprehensive OAuth test suite
python test_oauth_comprehensive.py
# Test with Microsoft Graph (requires Azure AD app)
export OAUTH_CLIENT_ID="your-client-id"
export OAUTH_CLIENT_SECRET="your-secret"
python test_oauth.py
Integration Testing
# Test with public Northwind service
python odata_mcp.py --service https://services.odata.org/V2/Northwind/Northwind.svc/ --trace
# Test OAuth with mock credentials (verifies flow)
python odata_mcp.py \
--service https://graph.microsoft.com/v1.0/ \
--oauth-client-id test-id \
--oauth-client-secret test-secret \
--verbose 2>&1 | grep OAuth
For complete testing documentation, see OAuth Testing Report.
Import Compatibility
New Code (Recommended)
from odata_mcp_lib import MetadataParser, ODataClient, ODataMCPBridge
Legacy Code (Backward Compatible)
from odata_mcp_compat import MetadataParser, ODataClient, ODataMCPBridge
TODO & Roadmap
High Priority
- Enhanced testing suite with comprehensive coverage
- Module-specific unit tests leveraging new architecture
- CI/CD pipeline setup for automated testing
- Performance benchmarking and optimization
Short-term Goals (3-6 months)
- OData v4 support
- Enhanced batch operations
- Cookie-based authentication (completed)
- OAuth 2.0 authentication (completed)
- Response caching for performance
- Input validation improvements
Medium-term Goals (6-12 months)
- Schema validation for input/output data
- Advanced query capabilities (complex filters, aggregations)
- Navigation property enhancements
- Custom tool generation templates
Long-term Goals (12+ months)
- GraphQL interface layer
- Cross-service federation
- Advanced security features (field-level security, data masking)
- Comprehensive monitoring and metrics
- Horizontal scaling support
Recently Completed ✅
- Modular Architecture: Split monolithic codebase into 7 focused modules
- Enhanced Error Handling: Comprehensive OData error parsing
- Smart Tool Naming: Service-aware naming preserving original names
- Backward Compatibility: Zero breaking changes maintained
- Code Cleanup: Removed redundant files and improved organization
- GUID Optimization: Automatic base64 ↔ standard format conversion
- Response Optimization: Size limiting and field selection
- Cookie Authentication: Support for SSO/MYSAPSSO2 tokens (see COOKIE_AUTH.md)
- Legacy Date Support: SAP /Date(milliseconds)/ format conversion
- Decimal Field Handling: Automatic conversion for Edm.Decimal types
- Pagination Hints: Suggested next call parameters for easy pagination
- Enhanced Trace Mode: Comprehensive debugging output
- Feature Parity: Matched Go implementation features
- HTTP/SSE Transport: Web-based client support via Server-Sent Events
- Transport Abstraction: Clean interface for multiple transport types
- Read-Only Modes: Options to hide modifying operations (--read-only, --read-only-but-functions)
- Service Hints: Implementation guidance for known problematic services
- MCP Trace Logging: Protocol debugging support with --trace-mcp
- OAuth 2.0 Authentication: Modern secure authentication with automatic token refresh
Troubleshooting
Common Issues
-
Connection Failures
- Verify OData service URL and network connectivity
- Check authentication credentials
- Use
--verbosefor detailed error information
-
Import Errors
- Use
from odata_mcp_lib import ...for new imports - Use
from odata_mcp_compat import ...for legacy compatibility
- Use
-
Tool Generation Issues
- Ensure service metadata is accessible
- Check for valid entity sets in the metadata
- Review verbose logs for parsing errors
-
GUID/Binary Field Issues
- GUID fields are automatically converted from base64
- Binary fields may be excluded by default for performance
Performance Tips
- Use
$selectto limit returned fields - Apply
$topfor pagination - Use
$filterto reduce result sets - Consider excluding binary fields for large datasets
Community & Discussions
Join our community discussions to:
- Ask questions about OData MCP integration
- Share ideas and feature requests
- Get help with service-specific configurations
- Connect with other developers using the wrapper
🗣️ Join the Discussion - Welcome to the community!
Additional Documentation
- Architecture Guide - System design and module structure
- Implementation Guide - Development patterns and guidelines
- Cookie Authentication - Detailed cookie auth documentation
- OAuth 2.0 Authentication - Complete OAuth implementation guide
- OAuth Testing Report - Test coverage and verification
License
Copyright (c) 2025. All rights reserved.
Project Status: Production Ready ✅
Architecture: Modular and Maintainable ✅
Version: 1.4 (OAuth 2.0 Support)
OAuth Status: Fully Implemented & Tested ✅
History
Features 4, Changed 2
Notes
Changed
- Complete refactoring into modular architecture
- Backward compatibility maintained through compatibility layer
Added
- Transport abstraction layer
- Name shortening utilities
- Comprehensive test suite
- Enhanced trace mode
Others providing
Compare all 12 on the Agent access to your systems page →- 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
- @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
- btp-sap-odata-to-mcp-serverbtp-sap-odata-to-mcp-serverExposes 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.independent, btpExposes S/4HANA or ECC OData services as MCP tools
- 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
- 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
Contributors
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:oisee-odata-mcp- JSON
- /artifacts/oisee-odata-mcp.json
- MCP
- Connecting an agent