SAP S/4HANA MCP Server
by Nidhideep
README.md
# SAP S4 MCP Server
MCP server for SAP S/4HANA OData access. Discover services, query entities, fetch metadata, and manage data — built on the [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) TypeScript SDK.
## Tools
| Tool | Description |
|------|-------------|
| `discover_sap_services` | Discovers available services from the SAP Gateway Service Catalog |
| `get_entity_metadata` | Fetches and summarizes OData service metadata optimized for LLM consumption |
| `get_field_values` | Fetches dropdown/value-list values from SAP OData entities |
| `execute_odata_query` | Executes OData CRUD operations (GET returns CSV, writes return JSON) |
## Prerequisites
- Node.js >= 18.0.0
- SAP S/4HANA system with OData services enabled
- SAP user with appropriate OData authorizations
## Setup
```bash
git clone https://github.com/Nidhideep/sap-s4-mcp-server
cd sap-s4-mcp-server
npm install
cp .env.example .env
# Edit .env with your SAP connection details
npm run build
```
## Environment Variables
Copy `.env.example` to `.env` and fill in the values.
### OData Connection (required)
| Variable | Description | Example |
|----------|-------------|---------|
| `S4_ODATA_HOST` | Full SAP S/4HANA URL including scheme and port | `https://my-s4.sap:44301` |
| `S4_ODATA_CLIENT` | SAP client number | `100` |
| `AUTH_METHOD` | `basic` or `token` | `basic` |
| `S4_ODATA_USER` | SAP user (when AUTH_METHOD=basic) | `ODATA_USER` |
| `S4_ODATA_PASSWORD` | Password (when AUTH_METHOD=basic) | |
| `S4_ODATA_TOKEN` | Bearer token (when AUTH_METHOD=token) | |
### Operational
| Variable | Description | Default |
|----------|-------------|---------|
| `LOG_LEVEL` | `debug`, `info`, `warn`, `error` | `info` |
| `DRY_RUN` | When `true`, all write operations are blocked | `false` |
## MCP Client Configuration
### Claude Code
```bash
claude mcp add sap-s4-mcp-server -- node /absolute/path/to/sap-s4-mcp-server/dist/src/index.js
```
Then set env vars via `.mcp.json` (copy from `.mcp.example.json`).
### Claude Desktop / Cline
Copy `.mcp.example.json` to `.mcp.json`, fill in real values, and add to your MCP client config:
```json
{
"mcpServers": {
"sap-s4-mcp-server": {
"command": "node",
"args": ["/absolute/path/to/sap-s4-mcp-server/dist/src/index.js"],
"env": {
"S4_ODATA_HOST": "https://your-s4.example.com:44301",
"S4_ODATA_CLIENT": "100",
"AUTH_METHOD": "basic",
"S4_ODATA_USER": "your_user",
"S4_ODATA_PASSWORD": "your_password"
}
}
}
}
```
## Recommended Workflow
1. **Discover** — `discover_sap_services` to find the service name
2. **Understand** — `get_entity_metadata` to see entity sets and field names
3. **Validate inputs** — `get_field_values` to look up valid dropdown values
4. **Query or write** — `execute_odata_query` with the correct service, entity, and fields
## Project Structure
```
src/
index.ts # Server entry point (stdio transport)
server.ts # Tool registration
tools/
s4-discover-services.tool.ts # Gateway catalog discovery
s4-metadata.tool.ts # OData $metadata parser
s4-field-values.tool.ts # Value-list / dropdown fetcher
s4-odata-query.tool.ts # CRUD query executor
config/
env.ts # Zod-validated environment config
auth.ts # Auth headers + CSRF token fetch
policy.ts # DRY_RUN enforcement + audit log
docs/
authentication.md
governance.md
troubleshooting.md
examples/
example-workflow.md
```
## Development
```bash
npm run dev # Watch mode with tsx
npm run typecheck # Type-check without building
npm run build # Compile to dist/
```
## Governance
- `DRY_RUN=true` blocks all write operations — safe for read-only environments
- All write operations are audit-logged to stderr
- CSRF tokens are fetched automatically before every write
- No credentials are ever committed — use `.env` (gitignored) or MCP client env injection
TDQS
A4.4/5.0
Scored across 4 tools
Disambiguation5/5
Each tool has a distinct purpose: service discovery, query execution, metadata retrieval, and field values. No overlap, clear differentiation.
Naming Consistency5/5
All tool names follow a consistent verb_noun pattern in snake_case: discover, execute, get, get. Uniform and predictable.
Tool Count5/5
Four tools cover the essential workflow for interacting with SAP OData services efficiently. Not over- or under-scoped.
Completeness5/5
The tool set enables a complete cycle: discover services, understand metadata, fetch valid input values, and perform CRUD operations. No critical gaps.
Maintenance
ActivityInactive
ResponsivenessNo issues