bw-modeling-mcp
bw-modeling-mcp lets an AI assistant work directly inside a live SAP BW/4HANA or BW 7.5 system — reading, creating, changing, activating, running and monitoring real BW modeling objects and data.
Read definitions of aDSOs, InfoObjects, InfoAreas, InfoSources, transformations, DTPs, queries, CompositeProviders, DataSources, Open Hub Destinations, process chains, planning objects, hierarchies and more.
Explore and search: universal search, where-used/xref, repository contents, data flows, DTP dependencies, source systems and DataSources, query roles, metadata tables and system profile.
Query and preview data: run BW queries or InfoProviders via BICS, look up characteristic values, preview DataSource rows, and read/save Analysis for Office workbooks.
Create and change modeling objects: aDSOs, InfoObjects and hierarchies, InfoSources, CompositeProviders, transformations and routines, DTPs and filter routines, DataSources, Open Hub Destinations, queries plus CKF/RKF/structures/variables, planning objects and process chains.
Activate, check and unlock objects and process chains — including checking whether an object would activate without changing it.
Execute and control runs: start DTPs, execute process chains, repeat failed chain steps, activate or delete load requests, and start/restart/reset remodeling requests.
Monitor operations: load requests, process chain runs and step details, remodeling requests, and query statistics.
Move data: push records into a write-interface aDSO and perform selective deletion with simulation support.
Manage repository and transports: create InfoAreas, move objects, reassign packages, create transport tasks and list changeable transports.
Write safely against live systems using the lock → read → modify → PUT → activate → unlock cycle; saves and activations are separate, and changes are real.
Run locally via stdio or centrally on SAP BTP Cloud Foundry with XSUAA OAuth, principal propagation and role-based access (Reader, Analyst, Developer); supports BW/4HANA fully and BW 7.5 reads/most writes with the documented enhancement.
Focused tool surface: 21 tools covering 134 operations, with
bw_describereturning full parameter definitions on demand.
Provides tools for interacting with SAP BW/4HANA systems, enabling reading, creating, and modifying BW modeling objects such as InfoObjects, aDSOs, Transformations, DTPs, queries, DataSources, roles, and more via the internal REST API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bw-modeling-mcp show data flow for DSO ZCUST_DSO"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
bw-modeling-mcp
A Model Context Protocol (MCP) server that enables AI assistants like Claude to work directly inside SAP BW/4HANA or SAP BW 7.5 on HANA systems — reading, creating and modifying BW modeling objects via the same internal SAP APIs that Eclipse BWMT and the BW/4HANA Cockpit use: the BW Modeling REST API (/sap/bw/modeling/) for objects, queries and live data, the ADT API (/sap/bc/adt/) for the ABAP and AMDP routines BW generates, the BW/4HANA manage API for the request monitor and runtime, and the Push API (/sap/bw4/) for data loads.
This is not a simulation. Every tool call connects to a live BW system — write operations produce real changes.
☁️ Running on SAP BTP Cloud Foundry

Besides stdio, the server can run as an HTTP service on SAP BTP Cloud Foundry with XSUAA
OAuth in front and a BTP destination behind — either a shared technical user
(BasicAuthentication) or principal propagation, where each caller reaches BW as
themselves and BW applies their own authorizations.
Three role collections decide what a user is offered: BW MCP Reader (everything that only reads), BW MCP Analyst (a small reporting client — run queries and understand what they return) and BW MCP Developer (everything, including changes).
stdio is unchanged — npm start behaves exactly as before. Setup:
docs/CENTRAL-HOSTING-SETUP.md (step-by-step) and
docs/CLOUD-FOUNDRY.md (reference).
What central hosting changes
Scenario | stdio only | Hosted on BTP |
One analyst, one BW system | runs on the analyst's machine | server-side, the analyst logs in with their own identity |
Several analysts, one server | not possible, no central auth | all log in via BTP, each caller's identity reaches BW |
Tool permissions | none — whoever runs it can call every tool | granted per role, independent of BW authorizations: a BW developer can be read-only in the MCP, or the querying tools can be withheld from someone who may otherwise view data |
BW authorizations | enforced through the user's own credentials | unchanged, still fully enforced — with principal propagation each caller acts as themselves, never as a shared identity |
Audit trail | limited | XSUAA logs every login; with principal propagation the BW session log shows the real user |
A new tool stays unavailable to read-only callers until it is explicitly classified as a
read, so the surface never widens by accident; write implies read, never the reverse.
The three role collections are a starting point and can be split further in xs-security.json.
Principal propagation additionally needs a certificate rule and ICM trust on the BW side.
Related MCP server: abap-adt-mcp
System Compatibility
System | Support |
SAP BW/4HANA (all versions) | ✅ Full support |
SAP BW Bridge (SAP BTP ABAP stack) | ✅ Via cookie authentication ( |
SAP BW on HANA (7.5) | ✅ Modelling reads after a small ABAP enhancement, and modelling writes for every object type that has a REST resource there — InfoObjects, aDSOs, InfoAreas, InfoSources, CompositeProviders, Open Hub Destinations, queries and their reusable components, aggregation levels. The tool surface adjusts to what the system publishes, and the objects without a REST resource — including planning, chain runs and the APD — are read from their metadata tables. |
📖 Featured Blog Posts
A two-part blog series about this project (both available in German and English):
Agentic AI meets SAP BW — the full story behind this project: why I built it, what's inside, what happens when Claude walks through a complete BW data lineage on its own. https://www.nextlytics.com/blog/agentic-ai-meets-sap-bw
Agentic AI in practice: MCP server for SAP BW/4HANA — how the server is operated company-wide on SAP BTP Cloud Foundry with role-based access and per-user identity, plus two real customer projects. https://www.nextlytics.com/blog/agentic-ai-in-practice-mcp-server-for-sap-bw/4hana
🆕 What's New — v2.0.0 · 21 Tools Instead of 134
The largest release so far, in two directions at once: the model now works with a tool surface a third the size, and the write paths have been checked operation by operation against what BW actually accepts — so a change the server reports as saved also activates.
🎯 Focused tool surface, now the default
21 tools instead of 134. Each focused tool stands for a group of operations and selects one through its
typeoroperationparameter:bw_readreads any object type,bw_write_adsocreates and changes aDSOs,bw_activatechecks, activates and unlocks. Nothing was removed — every operation is still there, with the same parameters and behaviourA third of the context. The tool definitions take about a third of the space they took before, which leaves the model more room for the actual work. In our tool-selection benchmark it picked the right operation as often on the focused surface as on the full one
bw_describeon demand. The focused tools carry short parameter notes;bw_describe(tool, operation)returns the complete definition of one operation when the model needs it, and a wrong or missingoperationis refused with the allowed values before anything reaches BWRoles and platform still apply per operation: a Reader sees only the reading operations, and a BW 7.5 system only what it can answer
Upgrading to 2.0
The one breaking change: clients now see the focused tool names.
Allowlists and permission settings that name full tools (
bw_get_adso,bw_update_transformation, …) need the focused names (bw_read,bw_write_transformation, …) — or setBW_TOOL_MODE=fullto keep the full surface exactly as it wasScripts and automations that call the server directly with full tool names keep working without a change: a full tool name sent to the server is answered in either mode
Skills and prompts that name full tools in their text are best moved to the focused names — an agent can only pick from the tools it is shown — or run with
BW_TOOL_MODE=fullHosted on SAP BTP: role collections and scopes are unchanged
The mapping from every full tool to its focused tool and operation is in Tool modes
On every release (BW/4HANA and BW 7.5)
✅ Check before you activate
New
bw_check(operationcheckofbw_activate) — runs the activation checks on the saved version of an object, as "Check" in the modeling tools does, without activating anything and without a lock. The answer says whether the object would activate and why not. It is a read operation, so read-only users can use it too
🧱 Writes that activate the first time
aDSO — a type change now writes the type as a whole and drops what the new type cannot carry; removing a field removes its key, partition and index entries with it; an InfoObject brings its compounding parents along; key fields are checked before they are saved, and every one of these is reported in the answer
CompositeProvider —
update_joingives both sides of a join key the common target field BW requires, a compounded field brings its compounding parent, and mapping an input again no longer leaves duplicate fields behindInfoObject — attributes can be key figures, units and time characteristics, display attributes can be time-dependent, and a navigation attribute BW would refuse is refused before anything is written
🆕 New capabilities
Open Hub Destinations can be created from an aDSO or CompositeProvider and changed — table and file destinations, write mode, key, fields and file properties (
bw_create_open_hub,bw_update_open_hub)Partitions and data tiering of an aDSO — static range partitions or dynamic partitioning (
manage_partitions), hot and warm storage per object or per partitionMaster data, text and hierarchy properties of a characteristic — text lengths, language- and time-dependent texts, hierarchies with version and time dependency
BW/4HANA
🔀 Transformations and DTPs
The rule of a field can be changed from any type to any other — direct, time conversion, constant, formula, routine with several source fields, lookup — and a lookup binds every key field of the object it reads from
bw_update_dtptakes the execution settings: package size and parallel extraction, request selection, error handling, SAP HANA execution and the batch manager. Each value is checked against what the server admits for that DTP, so an inadmissible setting is refused with the admissible ones instead of an HTTP 500 without a message
📤 Open Hub from a query
A query can be released as an InfoProvider and used as the template and source of an Open Hub Destination, so the result of a query lands in a table or file through a DTP
Also in this release
Query structures: where a hierarchy holds a text node and a characteristic value of the same name,
node_typesays which one a restriction means, andswitch_hierarchykeeps the kind of each node (#52)Fixed:
bw_update_infoobjectreported a refused activation as success — the answer now carries the server's messages and says that the change is saved but not active; a characteristic with a compounded attribute can be changed again;bw_run_dtpsays when a delta found nothing to load instead of reporting a started request;bw_get_requestrefuses a malformed request id instead of returning the whole process history; texts with&or quotes no longer break a save
Earlier releases — the "What's New" notes for v1.10.0 and older are archived in WHATS_NEW.md; the full structured history is in CHANGELOG.md.
What it can do
An overview by area. Every tool in detail — parameters, behaviour, and the sequences it belongs in — is in the Tools Reference (134 operations behind 21 focused tools).
Combining with an ADT MCP Server
bw-modeling-mcp works best alongside an ADT MCP server such as vibing-steampunk or ARC-1. The two do not overlap as much as it may look.
This server owns the BW object and, with it, the body of the ABAP that BW generated for that object: the class behind a transformation routine, the program behind a DTP filter routine. Write those through bw_set_transformation_routine, bw_set_transformation_expert_routine and bw_set_dtp_filter_routine rather than through ADT — they do not only replace the source, they save the transformation master back afterwards, which is what re-registers the code in the transportable metadata. A class-only edit survives until the next regeneration or transport and is then gone.
The ADT MCP server covers ABAP as a subject in its own right: your own reports, classes, function modules and DDIC tables, repository search and navigation, arbitrary table reads, debugging, ATC, unit tests, dumps and transports. Together they cover the full cycle from BW object to ABAP logic.
Requirements
SAP BW/4HANA system with the internal SAP APIs enabled (SAP BW 7.5 works for modeling reads and most modelling writes once the enhancement in bw75/BW75-SUPPORT.md is in place)
Node.js 22 or later
An MCP-compatible AI client (Claude Desktop, Claude Code, etc.)
Installation
Two ways to run. Locally as a stdio server (one user, one machine — the steps below), or centrally hosted on SAP BTP Cloud Foundry behind XSUAA OAuth for a whole team → see docs/CENTRAL-HOSTING-SETUP.md. The installation and configuration below cover local stdio use. Upgrading from 1.x: see Upgrading to 2.0.
# Option 1: Install via npm (recommended)
npm install -g bw-modeling-mcp
# Option 2: Clone and build
git clone https://github.com/dnic-dev/bw-modeling-mcp.git
cd bw-modeling-mcp
npm install
npm run buildConfiguration
For local (stdio) use, the server is configured via environment variables. For central BTP hosting, connection and credentials come from the BTP destination and service bindings instead — see docs/CENTRAL-HOSTING-SETUP.md.
Variable | Description | Required |
| BW system URL (e.g. | yes |
| SAP user name | yes (or |
| SAP password | yes (or |
| SAP client (e.g. | yes |
| Language for object texts (e.g. | no |
| Path to a browser-exported cookie file for SAML-/OAuth-fronted systems (e.g. BW Bridge). Netscape or | no |
| Server name advertised in the MCP | no |
| Free-text label of the connected BW system (e.g. | no |
|
| no |
|
| no |
|
| no |
Cookie authentication (BW Bridge / SAP BTP): For BW systems that sit behind a SAML or OAuth login (such as BW Bridge on the SAP BTP ABAP stack), Basic Auth is not available. Export the authenticated session cookies from your browser into a file and point BW_COOKIE_FILE at it. The login/session approach is analogous to vibing-steampunk and ARC-1. When the session expires, refresh the cookie file and restart the server.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"bw-modeling-mcp": {
"command": "node",
"args": ["/path/to/bw-modeling-mcp/dist/stdio.js"],
"env": {
"BW_URL": "https://your-bw-host:50001",
"BW_USER": "YOUR_USER",
"BW_PASSWORD": "YOUR_PASSWORD",
"BW_CLIENT": "001",
"BW_LANGUAGE": "EN"
}
}
}
}Claude Code (VS Code extension)
Add .mcp.json to your project root:
{
"mcpServers": {
"bw-modeling-mcp": {
"command": "node",
"args": ["/path/to/bw-modeling-mcp/dist/stdio.js"],
"env": {
"BW_URL": "https://your-bw-host:50001",
"BW_USER": "YOUR_USER",
"BW_PASSWORD": "YOUR_PASSWORD",
"BW_CLIENT": "001",
"BW_LANGUAGE": "EN"
}
}
}
}How it works
The server talks to four SAP APIs, and only one of them needs a protocol worth describing.
The BW Modeling REST API (/sap/bw/modeling/) is a full-document API: there is no way to
change one attribute of an object. Every write therefore runs the same six steps.
Lock — acquires an exclusive lock and returns a
lockHandleRead — fetches the current complete XML of the object
Modify — applies the change to that XML
PUT — sends the whole document back, never a fragment
Activate — promotes the inactive version to the active one
Unlock — releases the lock
Two consequences are worth knowing. Saving and activating are separate: a document the server accepts can still fail to activate, so a successful write proves less than it appears to. And because the whole document travels, a read that came from a stale session buffer will silently write old values back — the tools read fresh for exactly this reason.
The other three need none of it. The ADT API (/sap/bc/adt/) is used narrowly and always for
an object BW generated itself: the body of a transformation routine (its generated class), the
body of a DTP filter routine (its generated program), the DataPreview service behind
bw_read_metadata_tables, plus transport checks and activation runs. Everything else ABAP —
writing your own reports, classes or DDIC tables, searching the repository, reading arbitrary
tables, debugging — is the job of an ABAP ADT MCP server alongside this one, see
Combining with an ADT MCP Server. The BW/4HANA manage API (/sap/bc/http/sap/bw4/) answers the request
monitor, the remodeling monitor and runtime operations. The Push API (/sap/bw4/v1/push/)
takes a JSON record array straight into a write-interface aDSO.
Session cookies and CSRF tokens are handled for all four.
See ARCHITECTURE.md for the full technical architecture and the complete endpoint reference.
Contributing
Issues and feature requests are welcome — please use the Issue templates.
If you have access to a BW/4HANA system and want to help expand coverage, I am happy to hear from you. The best way to contribute is to try it out and report what works, what doesn't, and what's missing.
License
MIT
Available Tools
21 toolsbw_activateA
Activate an object with the lock handle a write returned, check it without activating, release a lock, or activate a process chain. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_activate", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), name, transport, lock_handle, +3 more.
bw_dataA
Work with data rather than definitions: filter values, DataSource preview, push into a write-interface aDSO, selective deletion, save an Analysis for Office workbook. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_data", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), mode, name, role, +18 more.
bw_deleteB
Delete a BW object permanently. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_delete", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), object_name, object_type.
bw_describeA
Describe the focused tools: without arguments the catalogue of every tool and its operations; with tool and the operation value (type for bw_read, operation otherwise) the complete parameter definition of that operation.
Inputs: tool, type, operation.
bw_findA
Find BW objects and their relations: search by name, cross references, folder contents, data flows, source systems and DataSources, roles and their queries, metadata tables, system profile. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_find", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), name, path, role, +18 more.
bw_manageB
Repository management: InfoAreas, moving objects, package and transport assignment, transport tasks. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_manage", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), name, user, package, +12 more.
bw_monitorA
Monitor loads and runs: requests, process chain runs and their steps, remodeling requests, query statistics. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_monitor", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), to, top, from, +25 more.
bw_query_dataC
Run a query or read a provider and return its data. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_query_data", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), state, format, to_row, +6 more.
bw_readA
Read the definition of one BW object. type selects the object type, name is its technical name. The type enum lists every operation with what it requires; bw_describe(tool: "bw_read", type: "…") gives the complete parameter definition of one.
Inputs: name (required), type (required), kind, format, +8 more.
bw_runB
Execute: run a DTP, start a process chain or repeat a failed step, activate or delete a request, run a remodeling request. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_run", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), name, start, action, +13 more.
bw_write_adsoC
Create or change an aDSO: structure, keys, settings, planning mode. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_adso", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), mode, label, action, +17 more.
bw_write_composite_providerB
Create or change a CompositeProvider. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_composite_provider", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), label, action, inputs, +25 more.
bw_write_datasourceB
Create a DataSource, set its fields, change its delta process. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_datasource", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), fields, transport, description, +6 more.
bw_write_dtpB
Create or change a DTP, including its filters and a filter routine. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_dtp", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), package, dtp_name, transport, +40 more.
bw_write_infoobjectA
Create or change an InfoObject and its hierarchies. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_infoobject", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), name, nodes, length, +33 more.
bw_write_infosourceB
Create or change an InfoSource. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_infosource", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), name, fields, package, +8 more.
bw_write_open_hubB
Create or change an Open Hub Destination. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_open_hub", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), fields, package, directory, +25 more.
bw_write_planningA
Create or change planning objects: aggregation levels, planning functions, sequences, filters, conversion types. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_planning", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), kind, name, rule, +33 more.
bw_write_process_chainA
Create or change a process chain: steps, edges, DTP and program steps, error links, decision variants. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_process_chain", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), to, dtp, dtps, +37 more.
bw_write_queryA
Create or change a query and its reusable components: layout, filter, key figures, characteristics, cells, exceptions, settings, restricted and calculated key figures, structures, variables, role assignments. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_query", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), unit, action, formula, +55 more.
bw_write_transformationB
Create a transformation, change the rule of a field, and set or remove its routines and runtime. The operation enum lists every operation with what it requires; bw_describe(tool: "bw_write_transformation", operation: "…") gives the complete parameter definition of one.
Inputs: operation (required), fields, source, formula, +28 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 21 tools
The write_* tools are mostly distinct by BW object type, but several broad tools overlap: bw_run, bw_activate, bw_monitor, bw_data, and bw_query_data have fuzzy boundaries around execution, activation, monitoring, and data access. The operation enums and bw_describe help, but an agent can still struggle to pick the right tool without inspecting operations.
All tools use a consistent bw_ prefix and snake_case, with most following a predictable verb_noun pattern such as bw_write_adso or bw_query_data. Minor deviations exist, notably bw_data as a noun and broad verbs like bw_manage, but the convention is still readable and predictable.
At 21 tools, the surface is on the heavy side, but SAP BW is a broad modeling domain and the write_* tools map to distinct object types rather than duplicating functionality. Each tool has a plausible role, though the count sits at the upper end of practical.
The surface covers major BW modeling objects and lifecycle actions: read/find, write for key object types, activate, delete, run, monitor, query data, and repository management. Minor gaps may exist for less common object types or administrative operations, but core modeling workflows appear well covered.
Maintenance
Related MCP Connectors
Connect your AI assistants to Keboola and expose your data, transformations, SQL queries, ...
Amazon Ads, Seller Central, Vendor Central and AMC data for AI agents. Read-only by default.
List datasets, schemas, run APL queries, and use prompts for exploration, anomalies, and monitoring.
Build and manage data pipelines, add custom connectors, and chat with your data.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to access SAP ADT APIs for reading, writing, debugging, deploying, and testing ABAP code through natural language or DSL automation.522MIT
- AlicenseAqualityDmaintenanceEnables AI agents to read, write, activate, and transport ABAP code in SAP systems via ABAP ADT REST API, without needing SAP GUI.24323 npmMIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that enables AI assistants like Claude to work directly inside SAP BW/4HANA systems — reading, creating and modifying BW modeling objects via the internal REST API used by Eclipse BWMT.545 npmMIT
- FlicenseBqualityBmaintenanceEnables AI assistants to explore and query SAP BW/4HANA modeling objects and metadata, such as InfoAreas, InfoObjects, ADSOs, CompositeProviders, and Queries.15-