odata_mcp_go
A 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.
Generating a tool per entity is the obvious design and it breaks on real SAP services: the README measures an SAP Business Partner service at 485 tools and roughly 37,000 tokens, at which point the assistant reports no API is available at all. Universal Tool Mode replaces the lot with a single odata tool taking action, target and params — 900 tokens, a 97.6% reduction — and it is opt-in precisely because it changes how you interact: standard mode gives you filter_Products and get_Orders, universal mode gives you one door and a parameter. A Go port of the same author's Python bridge, chosen for cross-platform deployment and speed.
Facts
Where it sits
Who is behind it
In the atlas: maintains 6, contributes to 12@oiseemaintainerHåkon HarnesContributes to this
In the atlas: contributes to 1@hakonharnesLouis-Philippe PerrasContributes to this
In the atlas: contributes to 1@lpperras2 contributors
Before choosing this
Conditions
PracticalFunctional boundary
Universal mode trades discoverability for size: one generic tool is harder for a model to pick correctly than a named one, which is why it is not the default. On a small service, standard mode is the better answer.
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
- Runs as
- central serverlocal process
- Transport
- stdioHTTPSSE
- Authentication
- user and password
- Read-only
- nostates it is not
- Guardrails
2 quoted from README show all
Restrict operations with
--read-onlyor--read-only-but-functionsNon-localhost: Token + TLS required, no exceptions
Connections
Python bridge generating MCP tools from OData v2 metadata
Giving an AI agent access to the systems you run over MCP
Python bridge generating MCP tools from OData v2 metadata
Download
Architecture
Download
README
quoted from oisee/odata_mcp_go under MIT, readOData MCP Bridge (Go)
A Go implementation of the OData to Model Context Protocol (MCP) bridge, providing universal access to OData services through MCP tools.
This is a Go port of the Python OData-MCP bridge implementation, designed to be easier to run on different operating systems with better performance and simpler deployment. It supports both OData v2 and v4 services.
🆕 What's New (v1.6.0)
Universal Tool Mode — One Tool to Rule Them All
The biggest addition is Universal Tool Mode (--universal), a game-changer for large OData services:
# Before: 485 tools, ~37,000 tokens, Claude says "no API available"
./odata-mcp https://large-sap-service.com/odata/
# After: 1 tool, ~900 tokens, works perfectly
./odata-mcp --universal https://large-sap-service.com/odata/
| Metric | Standard Mode | Universal Mode | Reduction |
|---|---|---|---|
| Tools (Northwind) | 157 | 1 | 99.4% |
| Tools (SAP BP) | 485 | 1 | 99.8% |
| Token usage | ~37,000 | ~900 | 97.6% |
Why is it opt-in? Universal mode changes how you interact with OData:
- Standard mode: Each entity gets dedicated tools (
filter_Products,get_Orders, etc.) - Universal mode: One
odatatool withaction,target, andparams
We made it opt-in because:
- Backward compatibility — existing configs and workflows continue working
- Discoverability — per-entity tools are self-documenting; LLMs can see exactly what's available
- Simplicity for small services — if you have 20 tools, per-entity mode works great
- Explicit choice — users should consciously choose the trade-off
When to use --universal:
- Service has 50+ entity sets
- Running multiple OData services simultaneously
- Experiencing "no API available" or tool selection failures
- Want minimal token footprint
See Universal Tool Architecture for the full story.
MCP Header Forwarding
New --forward-mcp-headers flag enables passing HTTP headers from MCP clients to OData services:
./odata-mcp --transport streamable-http --forward-mcp-headers https://secured-service.com/odata/
This enables:
- Dynamic authentication — pass credentials per-request instead of at startup
- Multi-tenant scenarios — different users with different tokens
- Custom headers —
X-*headers flow through to OData
Issue Fixes Bonanza
This release fixes 10 open issues:
| Issue | Problem | Fix |
|---|---|---|
| #12 | SAP OData shows no tools | Fixed XML namespace parsing (sap:creatable etc.) |
| #13 | --max-items 99999 crashes | Added validation (max 10,000) |
| #14 | Multiple services = Claude stuck | Universal tool mode |
| #16 | GUID formatting wrong | Auto-detect SAP, add guid'...' prefix |
| #17 | Timeout instead of error | Immediate error response |
| #18 | Wildcard search fails | Parse SearchRestrictions annotation |
| #19 | Timeout hides SAP error | Return actual error message |
| #22 | BaseType not exposed | Added to EntityType model |
| #23 | Header handling | --forward-mcp-headers flag |
| #25 | Windows build no .exe | Fixed Makefile for Windows |
Previous Releases
- AI Foundry Compatibility (v1.5.1):
--protocol-versionflag for AI Foundry's2025-06-18protocol - SAP GUID Filtering (v1.5.0): Automatic
guid'...'formatting for SAP services - Streamable HTTP Transport (v1.5.0): Modern MCP protocol with
--transport streamable-http
Features
- Universal OData Support: Works with both OData v2 and v4 services
- Dynamic Tool Generation: Automatically creates MCP tools based on OData metadata
- Multiple Authentication Methods: Basic auth, cookie auth, and anonymous access
- SAP OData Extensions: Full support for SAP-specific OData features including CSRF tokens
- Comprehensive CRUD Operations: Generated tools for create, read, update, delete operations
- Advanced Query Support: OData query options (select, orderby, etc.)
- Function Import Support: Call OData function imports as MCP tools
- Flexible Tool Naming: Configurable tool naming with prefix/postfix options
- Entity Filtering: Selective tool generation with wildcard support
- Cross-Platform: Native Go binary for easy deployment on any OS
- Read-Only Modes: Restrict operations with
--read-onlyor--read-only-but-functions - MCP Protocol Debugging: Built-in trace logging with
--trace-mcpfor troubleshooting - Service-Specific Hints: Flexible hint system with pattern matching for known service issues
- Full MCP Compliance: Complete protocol implementation for all MCP clients
- Multiple Transports: Support for stdio (default), HTTP/SSE, and Streamable HTTP
- AI Foundry Compatible: Configurable protocol version for AI Foundry and other MCP clients
Installation
Download Binary
Download the appropriate binary for your platform from the releases page.
Pre-built binaries are available for:
- Linux (amd64)
- Windows (amd64)
- macOS (Intel and Apple Silicon)
Build from Source
Quick Build (Go required)
git clone https://github.com/oisee/odata_mcp_go.git
cd odata_mcp_go
go build -o odata-mcp cmd/odata-mcp/main.go
Using Makefile (Recommended)
# Build for current platform
make build
# Build for all platforms
make build-all
# Build for all platforms with WSL integration (copies to /mnt/c/bin)
make build-all-wsl
# Build and test
make dev
# Check current version
make version
# See all options
make help
Using Build Script
# Build for current platform
./build.sh
# Build for all platforms
./build.sh all
# See all options
./build.sh help
Cross-Compilation Examples
# Using Make
make build-linux # Linux (amd64)
make build-windows # Windows (amd64)
make build-macos # macOS (Intel + Apple Silicon)
# WSL-specific builds (copies Windows binary to /mnt/c/bin)
make build-windows-wsl # Build Windows + WSL integration
make build-all-wsl # Build all platforms + WSL integration
# Using build script
./build.sh linux # Linux (amd64)
./build.sh windows # Windows (amd64)
./build.sh macos # macOS (Intel + Apple Silicon)
# Manual Go build
GOOS=linux GOARCH=amd64 go build -o odata-mcp-linux cmd/odata-mcp/main.go
GOOS=windows GOARCH=amd64 go build -o odata-mcp.exe cmd/odata-mcp/main.go
Docker Build
# Build Docker image
make docker
# Or manually
docker build -t odata-mcp .
# Run in container
docker run --rm -it odata-mcp --help
Building in WSL (Windows Subsystem for Linux)
When building in WSL, you can use special targets that automatically copy the Windows binary to your Windows file system:
# Build all platforms and copy Windows binary to C:\bin
make build-all-wsl
# Build only Windows and copy to C:\bin
make build-windows-wsl
Note: These commands will check if /mnt/c/bin exists and skip the copy if not found, so they're safe to use on any system.
Usage
Claude Desktop Configuration
Claude Desktop uses the stdio transport by default. Here are example configurations:
Finding Your Configuration File
The Claude Desktop configuration file location varies by platform:
- Windows:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
Basic Configuration
{
"mcpServers": {
"northwind-v2": {
"command": "C:/bin/odata-mcp.exe",
"args": [
"--service",
"https://services.odata.org/V2/Northwind/Northwind.svc/",
"--tool-shrink"
]
},
"northwind-v4": {
"command": "C:/bin/odata-mcp.exe",
"args": [
"--service",
"https://services.odata.org/V4/Northwind/Northwind.svc/",
"--tool-shrink"
]
}
}
}
With Authentication
{
"mcpServers": {
"my-sap-service": {
"command": "/usr/local/bin/odata-mcp",
"args": [
"--service",
"https://my-sap-system.com/sap/opu/odata/sap/MY_SERVICE/",
"--user",
"myusername",
"--password",
"mypassword",
"--tool-shrink",
"--entities",
"Products,Orders,Customers"
]
}
}
}
Using Environment Variables (More Secure)
{
"mcpServers": {
"my-secure-service": {
"command": "/usr/local/bin/odata-mcp",
"args": [
"--service",
"https://my-service.com/odata/",
"--tool-shrink"
],
"env": {
"ODATA_USERNAME": "myusername",
"ODATA_PASSWORD": "mypassword"
}
}
}
}
Note: Claude Desktop currently doesn't support reading environment variables from your system. The env field in the configuration sets environment variables specifically for that MCP server process.
Security Best Practices for Claude Desktop
- Use environment variables in the
envfield rather than hardcoding credentials inargs - Limit entity access using the
--entitiesflag to only expose necessary data - Use read-only accounts when possible for OData services
- Store configuration file securely with appropriate file permissions
Note: Claude Desktop does not currently support API key authentication for MCP servers. All MCP servers run locally with the same permissions as Claude Desktop itself.
Read-Only Configuration Examples
{
"mcpServers": {
"production-readonly": {
"command": "/usr/local/bin/odata-mcp",
"args": [
"--service",
"https://production.company.com/odata/",
"--read-only",
"--tool-shrink"
],
"env": {
"ODATA_USERNAME": "readonly_user",
"ODATA_PASSWORD": "readonly_pass"
}
},
"dev-with-functions": {
"command": "/usr/local/bin/odata-mcp",
"args": [
"--service",
"https://dev.company.com/odata/",
"--read-only-but-functions",
"--trace-mcp" // Enable debugging
]
}
}
}
Claude Code CLI Compatibility
The Claude Code CLI has stricter property name validation than other Claude tools. If you encounter errors like:
API Error: 400 {"type":"error","error":{"type":"invalid_request_error","message":"tools.17.custom.input_schema.properties: Property keys should match pattern ^[a-zA-Z0-9_.-]{1,64}$"}}
Use the --claude-code-friendly flag to remove the $ prefix from OData parameter names:
{
"mcpServers": {
"northwind-claude-code": {
"command": "/usr/local/bin/odata-mcp",
"args": [
"--service",
"https://services.odata.org/V2/Northwind/Northwind.svc/",
"--claude-code-friendly", // Removes $ from parameter names
"--tool-shrink"
]
}
}
}
This transforms parameter names:
$filter→filter$select→select$expand→expand$orderby→orderby$top→top$skip→skip$count→count
The server internally maps these friendly names back to their OData equivalents when making requests.
Operation Filtering Configuration Examples
{
"mcpServers": {
"large-service-readonly": {
"command": "/usr/local/bin/odata-mcp",
"args": [
"--service",
"https://large-erp.company.com/odata/",
"--disable", "cud", // Disable create, update, delete
"--tool-shrink",
"--entities", "Orders,Products,Customers"
],
"env": {
"ODATA_USERNAME": "readonly_user",
"ODATA_PASSWORD": "readonly_pass"
}
},
"minimal-tools": {
"command": "/usr/local/bin/odata-mcp",
"args": [
"--service",
"https://api.company.com/odata/",
"--enable", "gf", // Only get and filter operations
"--tool-shrink"
]
},
"no-actions": {
"command": "/usr/local/bin/odata-mcp",
"args": [
"--service",
"https://api.company.com/odata/",
"--disable", "a", // Disable all function imports/actions
"--verbose"
]
}
}
}
### AI Foundry Configuration
For AI Foundry integration, use the `--protocol-version` flag to specify the `2025-06-18` protocol:
```json
{
"mcpServers": {
"odata-for-ai-foundry": {
"command": "/usr/local/bin/odata-mcp",
"args": [
"--service",
"https://your-odata-service.com/",
"--protocol-version", "2025-06-18",
"--user", "your-username",
"--password", "your-password"
]
}
}
}
Or via command line:
./odata-mcp --service https://your-service.com/odata --protocol-version "2025-06-18"
See the AI Foundry Compatibility Guide for detailed setup instructions.
Transport Options
The OData MCP bridge supports two transport mechanisms:
- STDIO (default) - Standard input/output communication, used by Claude Desktop
- HTTP/SSE - HTTP server with Server-Sent Events for web-based clients
🔒 SECURITY MODEL: HTTP transport uses a strict security model.
Security Requirements:
- Localhost: Token required (
--mcp-token)- Non-localhost: Token + TLS required, no exceptions
- All interfaces (0.0.0.0/::): Requires
--allow-all-interfaces+ token + TLSToken can be any string - for dev,
--mcp-token devworks fine.
Using Streamable HTTP Transport (Modern MCP Protocol)
New in v1.5.0: Support for Streamable HTTP transport (protocol version 2024-11-05)
# Start server with Streamable HTTP (recommended for modern clients)
./odata-mcp --transport streamable-http https://services.odata.org/V2/Northwind/Northwind.svc/
# Use custom localhost port
./odata-mcp --transport streamable-http --http-addr localhost:3000 https://services.odata.org/V2/Northwind/Northwind.svc/
Streamable HTTP endpoints:
POST /mcp- Main MCP endpoint (supports automatic SSE upgrade)GET /health- Health check endpointPOST /sse- Legacy SSE endpoint (for backward compatibility)
Using HTTP/SSE Transport (Legacy)
# Start server on localhost (default: localhost:8080)
./odata-mcp --transport http --mcp-token "dev" https://services.odata.org/V2/Northwind/Northwind.svc/
# Use custom localhost port
./odata-mcp --transport http --http-addr localhost:3000 --mcp-token "dev" https://services.odata.org/V2/Northwind/Northwind.svc/
# Non-localhost requires token + TLS
./odata-mcp --transport http --http-addr 192.168.1.100:8080 \
--mcp-token "my-secret-token" --tls --tls-cert cert.pem --tls-key key.pem \
https://services.odata.org/V2/Northwind/Northwind.svc/
# All interfaces requires explicit flag + token + TLS
./odata-mcp --transport http --http-addr 0.0.0.0:8080 \
--allow-all-interfaces --mcp-token "my-secret-token" \
--tls --tls-cert cert.pem --tls-key key.pem \
https://services.odata.org/V2/Northwind/Northwind.svc/
Legacy HTTP/SSE endpoints:
GET /health- Health check endpointGET /sse- Server-Sent Events endpoint for real-time communicationPOST /rpc- JSON-RPC endpoint for request/response communication
Testing HTTP/SSE Transport
-
Using the provided HTML client:
# Start the server ./odata-mcp --transport http https://services.odata.org/V2/Northwind/Northwind.svc/ # Open examples/sse_client.html in a web browser -
Using curl:
# Test SSE endpoint curl -N -H 'Accept: text/event-stream' http://localhost:8080/sse # Test RPC endpoint curl -X POST http://localhost:8080/rpc \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' -
Using the test scripts:
# Test SSE with interactive script ./test_sse.sh # Test HTTP/RPC communication ./test_http_rpc.sh
Basic Usage
# Using positional argument
./odata-mcp https://services.odata.org/V2/Northwind/Northwind.svc/
# Using --service flag
./odata-mcp --service https://services.odata.org/V2/Northwind/Northwind.svc/
# Using environment variable
export ODATA_SERVICE_URL=https://services.odata.org/V2/Northwind/Northwind.svc/
./odata-mcp
Authentication
# Basic authentication
./odata-mcp --user admin --password secret https://my-service.com/odata/
# Cookie file authentication
./odata-mcp --cookie-file cookies.txt https://my-service.com/odata/
# Cookie string authentication
./odata-mcp --cookie-string "session=abc123; token=xyz789" https://my-service.com/odata/
# Environment variables
export ODATA_USERNAME=admin
export ODATA_PASSWORD=secret
./odata-mcp https://my-service.com/odata/
Tool Naming Options
# Use custom prefix instead of postfix
./odata-mcp --no-postfix --tool-prefix "myservice" https://my-service.com/odata/
# Use custom postfix
./odata-mcp --tool-postfix "northwind" https://my-service.com/odata/
# Use shortened tool names
./odata-mcp --tool-shrink https://my-service.com/odata/
Entity and Function Filtering
# Filter to specific entities (supports wildcards)
./odata-mcp --entities "Products,Categories,Order*" https://my-service.com/odata/
# Filter to specific functions (supports wildcards)
./odata-mcp --functions "Get*,Create*" https://my-service.com/odata/
Read-Only Modes
# Hide all modifying operations (create, update, delete, and functions)
./odata-mcp --read-only https://my-service.com/odata/
./odata-mcp -ro https://my-service.com/odata/ # Short form
# Hide create/update/delete but allow function imports
./odata-mcp --read-only-but-functions https://my-service.com/odata/
./odata-mcp -robf https://my-service.com/odata/ # Short form
Operation Type Filtering
Fine-grained control over which operation types are available. Operation types are:
C- Create operationsS- Search operationsF- Filter/list operationsG- Get (single entity) operationsU- Update operationsD- Delete operationsA- Actions/function importsR- Read operations (expands to S, F, G)
# Enable only read operations (search, filter, get)
./odata-mcp --enable "r" https://my-service.com/odata/
./odata-mcp --enable "sfg" https://my-service.com/odata/ # Same as above
# Disable all modifying operations
./odata-mcp --disable "cud" https://my-service.com/odata/
# Enable only get and filter operations
./odata-mcp --enable "gf" https://my-service.com/odata/
# Disable actions/function imports
./odata-mcp --disable "a" https://my-service.com/odata/
# Case-insensitive
./odata-mcp --disable "CUD" https://my-service.com/odata/
Note: --enable and --disable cannot be used together.
Universal Tool Mode
For large OData services with many entities, the standard per-entity tool generation can create hundreds of tools, causing:
- Context rot: LLMs struggle to reason when tool count exceeds ~128
- High token usage: Tool schemas can consume 15,000-40,000 tokens
- Tool selection failures: LLMs may report "no API available"
Universal mode solves this by generating a single tool that handles all operations:
# Enable universal tool mode
./odata-mcp --universal https://my-service.com/odata/
# Compare tool counts
./odata-mcp --trace https://my-service.com/odata/ # Standard: many tools
./odata-mcp --universal --trace https://my-service.com/odata/ # Universal: 1 tool
When to use universal mode:
- Service has more than ~50 entity sets
- Using multiple OData services simultaneously
- Experiencing "no API available" errors with large services
Universal tool usage:
{"action": "list", "target": "Products", "params": {"filter": "Price gt 100", "top": 10}}
{"action": "get", "target": "Products", "params": {"key": {"ProductID": 1}}}
{"action": "create", "target": "Orders", "params": {"data": {"CustomerID": "C001"}}}
{"action": "call", "target": "ReleaseOrder", "params": {"OrderID": "O001"}}
Debugging and Inspection
# Enable verbose output
./odata-mcp --verbose https://my-service.com/odata/
# Trace mode - show all tools without starting server
./odata-mcp --trace https://my-service.com/odata/
# Enable MCP protocol trace logging (saves to temp directory)
./odata-mcp --trace-mcp https://my-service.com/odata/
# Linux/WSL: /tmp/mcp_trace_*.log
# Windows: %TEMP%\mcp_trace_*.log
Service Hints
The OData MCP bridge includes a flexible hint system to provide guidance for services with known issues or special requirements:
# Use default hints.json from binary directory
./odata-mcp https://my-service.com/odata/
# Use custom hints file
./odata-mcp --hints-file /path/to/custom-hints.json https://my-service.com/odata/
# Inject hint directly from command line
./odata-mcp --hint "Remember to use \$expand for complex queries" https://my-service.com/odata/
# Combine file and CLI hints (CLI has higher priority)
./odata-mcp --hints-file custom.json --hint '{"notes":["Override note"]}' https://my-service.com/odata/
Configuration
Command Line Flags
| Flag | Description | Default |
|---|---|---|
--service | OData service URL | |
-u, --user | Username for basic auth | |
-p, --password | Password for basic auth | |
--cookie-file | Path to cookie file (Netscape format) | |
--cookie-string | Cookie string (key1=val1; key2=val2) | |
--tool-prefix | Custom prefix for tool names | |
--tool-postfix | Custom postfix for tool names | |
--no-postfix | Use prefix instead of postfix | false |
--tool-shrink | Use shortened tool names | false |
--entities | Comma-separated entity filter (supports wildcards) | |
--functions | Comma-separated function filter (supports wildcards) | |
--sort-tools | Sort tools alphabetically | true |
-v, --verbose | Enable verbose output | false |
--debug | Alias for --verbose | false |
--trace | Show tools and exit (debug mode) | false |
--trace-mcp | Enable MCP protocol trace logging | false |
--read-only, -ro | Hide all modifying operations | false |
--read-only-but-functions, -robf | Hide create/update/delete but allow functions | false |
--enable | Enable only specified operation types (C,S,F,G,U,D,A,R) | |
--disable | Disable specified operation types (C,S,F,G,U,D,A,R) | |
--hints-file | Path to hints JSON file | hints.json in binary dir |
--hint | Direct hint JSON or text from CLI | |
--transport | Transport type: 'stdio', 'http' (SSE), or 'streamable-http' | stdio |
--http-addr | HTTP server address (with --transport http/streamable-http) | localhost:8080 |
--mcp-token | Authentication token for HTTP transport (required) | |
--mcp-token-file | Path to file containing authentication token | |
--tls | Enable TLS for HTTP transport | false |
--tls-cert | Path to TLS certificate file | |
--tls-key | Path to TLS key file | |
--allow-all-interfaces | Allow binding to 0.0.0.0/:: (requires --mcp-token and --tls) | false |
--legacy-dates | Enable legacy date format conversion | true |
--no-legacy-dates | Disable legacy date format conversion | false |
--convert-dates-from-sap | Convert SAP date formats in responses | false |
--response-metadata | Include __metadata blocks in responses | false |
--pagination-hints | Add pagination information to responses | false |
--max-response-size | Maximum response size in bytes | 5MB |
--max-items | Maximum number of items in response | 100 |
--verbose-errors | Provide detailed error context | false |
--claude-code-friendly, -c | Remove $ prefix from OData parameters for Claude Code CLI compatibility | false |
--protocol-version | Override MCP protocol version (e.g., '2025-06-18' for AI Foundry) | 2024-11-05 |
--forward-mcp-headers | Forward HTTP headers from MCP connection to OData service (Streamable HTTP only) | false |
--universal | Use single universal OData tool instead of per-entity tools (reduces context for large services) | false |
Environment Variables
| Variable | Description |
|---|---|
ODATA_SERVICE_URL or ODATA_URL | OData service URL |
ODATA_USERNAME or ODATA_USER | Username for basic auth |
ODATA_PASSWORD or ODATA_PASS | Password for basic auth |
ODATA_COOKIE_FILE | Path to cookie file |
ODATA_COOKIE_STRING | Cookie string |
.env File Support
Create a .env file in the working directory:
ODATA_SERVICE_URL=https://my-service.com/odata/
ODATA_USERNAME=admin
ODATA_PASSWORD=secret
Generated Tools
The bridge automatically generates MCP tools based on the OData service metadata:
Entity Set Tools
For each entity set, the following tools are generated (if the entity set supports the operation):
filter_{EntitySet}- List/filter entities with OData query optionscount_{EntitySet}- Get count of entities with optional filtersearch_{EntitySet}- Full-text search (if supported by the service)get_{EntitySet}- Get a single entity by keycreate_{EntitySet}- Create a new entity (if allowed)update_{EntitySet}- Update an existing entity (if allowed)delete_{EntitySet}- Delete an entity (if allowed)
Function Import Tools
Each function import is mapped to an individual tool with the function name.
Service Information Tool
odata_service_info- Get metadata and capabilities of the OData service
Examples
Northwind Service (v2)
# Connect to the public Northwind OData v2 service
./odata-mcp --trace https://services.odata.org/V2/Northwind/Northwind.svc/
# This will show generated tools like:
# - filter_Products_for_northwind
# - get_Products_for_northwind
# - filter_Categories_for_northwind
# - get_Orders_for_northwind
# - etc.
Northwind Service (v4)
# Connect to the public Northwind OData v4 service
./odata-mcp --trace https://services.odata.org/V4/Northwind/Northwind.svc/
# OData v4 is automatically detected and handled appropriately
# Supports v4 specific features like:
# - $count parameter instead of $inlinecount
# - contains() filter function
# - New data types (Edm.Date, Edm.TimeOfDay, etc.)
SAP OData Service
# Connect to SAP service with CSRF token support
./odata-mcp --user admin --password secret \
https://my-sap-system.com/sap/opu/odata/sap/SERVICE_NAME/
Differences from Python Version
While maintaining the same CLI interface and functionality, this Go implementation offers:
- Better Performance: Native compiled binary with lower memory usage
- Easier Deployment: Single binary with no runtime dependencies
- Cross-Platform: Native binaries for Windows, macOS, and Linux
- Type Safety: Go's type system provides better reliability
- Simpler Installation: No need for Python runtime or package management
Versioning
This project uses automatic versioning based on git tags and commit history:
- Tagged releases: Uses git tags (e.g.,
v1.0.0) - Development builds: Uses
0.1.<commit-count>format - Uncommitted changes: Appends
-dirtysuffix
# Check current version
make version
# Create a release
git tag -a v1.0.0 -m "Release v1.0.0"
git push origin v1.0.0
See VERSIONING.md for detailed versioning guide.
Releasing
This project uses automated GitHub Actions for releases. See RELEASING.md for the release process.
Troubleshooting
MCP Client Issues
If you're experiencing issues with MCP clients (Claude Desktop, RooCode, GitHub Copilot):
-
Enable trace logging to diagnose protocol issues:
./odata-mcp --trace-mcp https://my-service.com/odata/Then check the trace file in your temp directory.
-
Common issues and solutions:
- Tools not appearing: Ensure the service URL is correct and accessible
- Validation errors: Update to the latest version which includes MCP compliance fixes
- Connection failures: Check authentication credentials and network connectivity
-
Service-specific hints: The
odata_service_infotool now includes automatic hints for known problematic services
See TROUBLESHOOTING.md for detailed troubleshooting guide.
Service Hints System
The OData MCP bridge includes a sophisticated hint system that helps users work around known service issues and provides implementation guidance.
Hint File Format
Create a hints.json file with the following structure:
{
"version": "1.0",
"hints": [
{
"pattern": "*/sap/opu/odata/*",
"priority": 10,
"service_type": "SAP OData Service",
"known_issues": ["List of known issues"],
"workarounds": ["List of workarounds"],
"field_hints": {
"FieldName": {
"type": "Edm.String",
"format": "Expected format",
"example": "12345",
"description": "Field description"
}
},
"examples": [
{
"description": "Example description",
"query": "filter_EntitySet with $filter=...",
"note": "Additional note"
}
]
}
]
}
Pattern Matching
The hint system supports wildcard patterns:
*matches any sequence of characters?matches a single character- Multiple patterns can match the same service (hints are merged by priority)
Default Hints
The bridge includes default hints for common services:
- SAP OData Services (
*/sap/opu/odata/*): General SAP OData guidance including the critical workaround for HTTP 501 errors using$expand - SAP PO Tracking (
*SRA020_PO_TRACKING_SRV*): Specific hints for purchase order tracking including field formatting - Northwind Demo (
*Northwind*): Identifies the public demo service
Using Hints
Hints appear in the odata_service_info tool response under implementation_hints:
# View hints for your service
./odata-mcp https://my-service.com/odata/
# Then call the odata_service_info tool in your MCP client
# The response includes:
{
"implementation_hints": {
"service_type": "SAP OData Service",
"known_issues": [...],
"workarounds": [...],
"field_hints": {...},
"examples": [...],
"hint_source": "Hints file: hints.json"
}
}
Security
This project includes comprehensive security measures to prevent credential leaks. See SECURITY.md for details.
Important: Never commit .zmcp.json or any files containing real credentials.
Documentation
- QUICK_REFERENCE.md - Quick command reference
- HINTS.md - Complete guide to the service hints system
- TROUBLESHOOTING.md - Common issues and solutions
- SECURITY.md - Security considerations
- CHANGELOG.md - Version history and changes
Contributing
Contributions are welcome! Please feel free to submit issues and pull requests.
For questions and community discussion, visit our GitHub Discussions.
Development
For development setup and testing:
# Run tests
make test
# Run with verbose output for debugging
./odata-mcp --verbose --trace-mcp https://my-service.com/odata/
# Check MCP compliance
./simple_compliance_test.sh
License
This project is licensed under the MIT License - see the LICENSE file for details.
History
Features 9, Other 2
Notes
Added
- Initial Go implementation of OData MCP Bridge
- Support for OData v2 services
- Dynamic tool generation based on metadata
- Basic auth and cookie authentication
- SAP OData extensions with CSRF token support
- Comprehensive CRUD operations
- Advanced query support with OData query options
- Function import support
- Cross-platform builds for Linux, Windows, and macOS
Notes
- This is a Go port of the Python OData-MCP bridge
- Maintains CLI compatibility with the original implementation
Others providing
Compare all 39 on the Agent access to your systems page →- 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
- mcp-integration-suitemcp-integration-suiteAn experimental Node MCP server covering the general CPI functions of the Integration Suite, which its author recommends running alongside the TPM server for Trading Partner Management.independent, btpMCP server for the general Integration Suite functionsfrom BTP/BAIP
- mcp-is-tpmmcp-is-tpmA Java MCP server for Trading Partner Management in the Integration Suite, where trading partners, their agreements and their B2B configuration live, paired by its author with the general server.independent, btpJava MCP server for Integration Suite Trading Partner Managementfrom BTP/BAIP
- @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 loopfrom ABAP
- 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 appsfrom ABAP
- SF-MCPSF-MCPSixty-two purpose-built tools over SAP SuccessFactors' OData APIs — employee data, permissions, compliance reports and HR administration, asked for in plain language.independent, successfactorsMCP server with 62 tools over SAP SuccessFactors OData APIsfrom SAP SuccessFactors
- hybris-mcp-litehybris-mcp-liteA read-only MCP server that answers questions about a local SAP Commerce Cloud instance by calling HAC, so types, beans, configuration, cronjobs, logs and FlexibleSearch come back in the editor.independent, commerceRead-only MCP server over a local SAP Commerce Cloud's HACfrom SAP Commerce
- calmcpcalmcpAn MCP server in front of the SAP Cloud ALM APIs: four read tools over tasks, projects, features, documents, tests and analytics, run over stdio locally or Streamable HTTP on Cloud Foundry.independent, btpMCP server with read tools over the SAP Cloud ALM APIsfrom BTP/BAIP
- CostingGeek/sap-mcpCostingGeek/sap-mcpA Python server that fetches sales orders from SAP's business data graph and hands them to Claude Desktop — the only entry here pointed at that API rather than at one system's own services.independent, btpPython MCP server fetching sales orders from SAP's business data graphfrom BTP/BAIP
- mcp-sap-focusedrunmcp-sap-focusedrunSAP Focused Run's Landscape Management Database as MCP tools — hosts, systems, databases, cloud tenants, technical instances, ABAP clients, software components and product versions.independent, btpMCP tools over SAP Focused Run's Landscape Management Databasefrom BTP/BAIP
- 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 writesfrom ABAP
- cloud-alm-itsm-mcpcloud-alm-itsm-mcpQueries installations through SAP Cloud ALM's ITSM API — filtered by system type or customer number, with OAuth token handling and caching done for you.independent, btpMCP server querying installations via the SAP Cloud ALM ITSM APIfrom BTP/BAIP
- hana-mcp-serverhana-mcp-serverSchema discovery and guard-railed SQL against SAP HANA and HANA Cloud, with an optional layer of business metadata so an agent reads a coded column the way the business does.independent, btpMCP server for schema discovery and guarded SQL on SAP HANAfrom BTP/BAIP
- sap_analytics_cloud_mcpsap_analytics_cloud_mcpThe SAP Analytics Cloud REST API as ninety tools across eleven service areas — content, data import and export, user management, transport, scheduling and translation.independent, btpMCP server for the SAP Analytics Cloud REST APIfrom BTP/BAIP
- mcp-sap-cpimcp-sap-cpiThe runtime half of Cloud Integration: failed messages with their full processing logs and traces, artifact deployment, security material, and a health summary.independent, btpMCP server for Cloud Integration runtime: messages, logs, deploymentfrom BTP/BAIP
- AI Core MCP ServerAI Core MCP ServerAn MCP server that exposes SAP AI Core's APIs as tools, defined entirely in one JSON config file for a proxy, so deployments, configurations and scenarios are managed through an assistant.independent, btpSAP AI Core APIs as MCP tools from one JSON config filefrom BTP/BAIP
- BTP CF MCP ServerBTP CF MCP ServerThe Cloud Foundry V3 API on SAP BTP as MCP tools — apps, orgs, spaces, services, routes and quotas — declared in one JSON config file and run by odata-mcp-proxy.independent, btpCloud Foundry V3 API on SAP BTP as MCP toolsfrom BTP/BAIP
- BTP MCP ServerBTP MCP ServerBTP Core Services as MCP tools, and the only server in this corner that renders dashboards inside the chat — a subaccount overview with drill-down, a geomap of data-centre locations, consumption and users.independent, btpBTP Core Services as MCP tools with in-chat dashboardsfrom BTP/BAIP
- 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 toolsfrom BTP/BAIP
- CI MCP ServerCI MCP ServerAn MCP server that exposes SAP Cloud Integration's OData APIs as tools, defined entirely in one JSON config file, so an assistant works integration content, logs and configurations in natural language.independent, btpSAP Cloud Integration OData APIs as MCP toolsfrom BTP/BAIP
- odata-mcp-proxyodata-mcp-proxyA config-driven proxy that turns OData and REST endpoints into MCP tools from a JSON file — no code — and runs on BTP Cloud Foundry against BTP Destinations.independent, btpConfig-driven proxy turning OData and REST endpoints into MCP toolsfrom BTP/BAIP
- sap-pi-mcp-serversap-pi-mcp-serverThe only entry pointed at SAP PI and PO rather than at Cloud Integration — monitoring and Integration Directory metadata from the middleware that came before.independent, btpMCP server for SAP PI and PO monitoring and directory metadatafrom BTP/BAIP
- sap-bdc-mcp-serversap-bdc-mcp-serverAn MCP server over SAP's BDC Connect SDK that creates, validates, publishes and deletes Databricks Delta shares as data products in SAP Business Data Cloud.independent, btpMCP server managing Delta shares in SAP Business Data Cloudfrom BTP/BAIP
- @mariodefe/sap-datasphere-mcp@mariodefe/sap-datasphere-mcpForty-five tools across a Datasphere tenant — discovery, metadata, analytics, ETL extraction, database users, lineage and column profiling — with config-driven PII masking applied before anything reaches the model.independent, btpMCP server with forty-five tools across a Datasphere tenantfrom BTP/BAIP
- 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 operationsfrom BTP/BAIP
- 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 metadatafrom BTP/BAIP
- sap-bdc-mcpsap-bdc-mcpDiscovery and contract tooling for SAP Business Data Cloud — ORD discovery, CSN contract checks and non-executing share planning — behind redaction, policy gates and bounded output.independent, btpMCP tooling for SAP Business Data Cloud discovery and contractsfrom BTP/BAIP
- mcp-sap-datasphere-servermcp-sap-datasphere-serverThe read-only Datasphere server: explore spaces, list assets, preview rows, profile columns and summarise analytical models — and nothing that changes anything, by design.independent, btpRead-only MCP server for exploring SAP Dataspherefrom BTP/BAIP
- 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.from ABAP
- cap-mcp-bridgecap-mcp-bridgePoints at a running CAP or OData V4 service, reads its $metadata, and turns what it finds into MCP tools — list, describe, query with validated filters, expand, and invoke functions and actions.independent, capMCP server generating tools from a CAP or OData V4 service's metadatafrom CAP
- MCP Server for SAP BTP AdministrationMCP Server for SAP BTP AdministrationSAP-hosted MCP endpoint that exposes BTP account administration — accounts, security, services and connectivity — as tools an AI client discovers and calls on your behalf.sap official, btpSAP-hosted MCP endpoint for BTP account administrationfrom BTP/BAIP
- SAP LeanIX MCP ServerSAP LeanIX MCP ServerHosted MCP endpoint onto an SAP LeanIX instance, exposing selected enterprise-architecture APIs as tools — fact sheets, applications, completeness and custom reports.sap official, btpHosted MCP endpoint onto an SAP LeanIX instancefrom BTP/BAIP
- SAP-samples/hana-cli-claude-pluginSAP-samples/hana-cli-claude-pluginA Claude Code plugin that registers the MCP server of hana-cli, so Claude Code can work on SAP HANA Cloud and on-premise SAP HANA databases.sap official, btpClaude Code plugin registering hana-cli's MCP serverfrom BTP/BAIP
- SAP-samples/hana-developer-cli-tool-exampleSAP-samples/hana-developer-cli-tool-exampleA developer-centric command line for SAP HANA, built for local development outside SAP tooling and connecting to a local, cloud or remote HANA instance the same way.sap official, btpDeveloper-centric command line for SAP HANAfrom BTP/BAIP
- 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 toolsfrom ABAP
- 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 reviewfrom ABAP
- cpi-mcp-servercpi-mcp-serverA Go server over Cloud Integration's design-time content — integration packages and integration flows, listed and searched by id, version, name, vendor or mode.independent, btpGo MCP server over Cloud Integration packages and integration flowsfrom BTP/BAIP
- 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 skillsfrom ABAP
- 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 allowlistfrom ABAP
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-go- JSON
- /artifacts/oisee-odata-mcp-go.json
- MCP
- Connecting an agent