MCP serverMCP servertypeExposes tools to a coding agent over MCP.See every one →What this type is →independently maintainedindependently maintainedoriginPublished by one person or a small company outside SAP. Says nothing about quality; the readings say that.See every one →

@mcp-abap-adt/core

A descendant of the Andreschak and fr0ster servers rebuilt on its own architecture, published as an npm scope and a Claude Code plugin, with Korean and Japanese documentation beside the English.

The README credits both projects it started from and says plainly that it went its own way afterwards. What it offers is the familiar surface — read, create, update and delete ABAP objects from Claude Code, Cline, Cursor, Windsurf or any MCP client, across ABAP Cloud, on-premise and legacy systems — packaged as @mcp-abap-adt/core with a Claude Code plugin, and documented in three languages, which is not true of anything else in this group.

Facts

Latestv20.1.0ReleasedLast pushLicenceMIT

Where it sits

Lives in
Provides
Agent access to your codeABAPAgent access to your codecapabilityLetting a coding agent read the project or the system you actually have, reach its model, its objects and its checks, and act on it. In file-based environments that works out of the box; complex systems need dedicated access capabilities. Whatever the environment, the agent also needs project- and framework-specific context, so it understands the thing in front of it rather than guessing from what it remembers of its training data. The transport is incidental: an MCP server, a language server or a CLI answer the same question, and what differs between them is how much of the real thing the agent can see. Distinct from [MCP servers](capability:mcp-servers), which is a protocol adapter on your own running service, and from [agent guidance](capability:agent-guidance), which is knowledge handed over as files rather than read from the thing itself.

Who is behind it

paek seunghyunpaek seunghyunPersonMaintains this
In the atlas: maintains 2, contributes to 2
@babamba2
Oleksii KyslytsiaOleksii KyslytsiaPersonMaintains this
In the atlas: maintains 2, contributes to 2
@fr0ster
maintainersHenry MaoPersonContributes to this
In the atlas: contributes to 4
@calclavia
mario-andreschakPersonContributes to this
In the atlas: maintains 3, contributes to 5
@mario-andreschak
Frank FiegelPersonContributes to this
In the atlas: contributes to 3
@punkpeye
raaleksandr-epamPersonContributes to this
In the atlas: contributes to 2
@raaleksandr-epam
4 contributors

Before choosing this

Conditions

PracticalFunctional boundary

A descendant rather than a distinct idea: if what you need is the ADT surface itself, its ancestors are entered here too and one of them may already be in your stack.

PolicySAP API Policy 4.2026a§ 1.1, 1.2, 2.2.2from Agent access to your codeAn MCP server calls ADT or another SAP API of a running system for 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.

An agent that plans and executes ADT calls is the case section 2.2.2 names. Check that the endpoints are published for the intended use, and that the design runs within a pathway SAP identifies for it.

SAP API Policy 4.2026a →

What it declares

Every artifact

Type
MCP server
Origin
Independently maintained
Runtime
Node.js

As an MCP server

Runs as
central serverlocal process
Transport
stdioHTTPSSE
Authentication
user and passwordOAuth / OIDCservice key
Tools
287
Read-only
nostates it is not
Guardrails
4 quoted from README show all
  • opt-in server-side blocklist (SC4SAP_POLICY=on) that blocks row extraction from sensitive tables

  • Use the HandlerExporter to select handler groups when embedding, or set environment flags to disable groups.

  • The server respects SAP authorization — whatever your user cannot do in SE80/ADT, it cannot do here either.

  • we recommend a dedicated development user and running against non-prod first.

For agent access to your code

Read
sourcesearchwhere-usedDDICCDStable data
Change
writecreateactivatetransportsgit
Check
syntaxATCABAP Unit
Run
run codedumps
property statedstated nonot said

Connections4

Install

npm add @mcp-abap-adt/core

Derived from the package name. No recipe recorded; the README has the configuration.

Where @mcp-abap-adt/core runs@mcp-abap-adt/core — README, checked 2026-09-11: “**Multiple transport protocols**: stdio, HTTP (StreamableHTTP), SSE”stdio or HTTP or SSEYour MCP client, actorYour MCP client@mcp-abap-adt/core, module@mcp-abap-adt/core
SAPnot SAP's, or the project's ownstated in the document

README

quoted from babamba2/abap-mcp-adt-powerup under MIT, read
babamba2/abap-mcp-adt-powerup/README.mdOn GitHub

MCP ABAP ADT ( For sc4sap application )

🌐 Language / 언어 / 言語: English · 한국어 · 日本語

npm version License: MIT Node.js MCP Claude Code Plugin

Acknowledgments

This project was originally inspired by mario-andreschak/mcp-abap-adt and fr0ster/mcp-abap-adt. We started with the core concept and evolved it into an independent project with our own architecture and features. Huge thanks to the original authors and all contributors whose work made this possible.


Model Context Protocol (MCP) server for SAP ABAP development — enables AI assistants and code editors to interact with SAP systems via ABAP Developer Toolkit (ADT) APIs.

Read, create, update, and delete ABAP objects directly from Claude Code, Cline, Cursor, Windsurf, or any MCP-compatible client. Supports ABAP Cloud (BTP), On-Premise, and Legacy SAP systems.


Table of Contents


Features

  • 288 MCP Tools for comprehensive SAP ABAP development
  • 30+ ABAP object types supported (Classes, Interfaces, CDS Views, Tables, RAP, and more)
  • Multiple transport protocols: stdio, HTTP (StreamableHTTP), SSE
  • Flexible authentication: JWT/XSUAA (OAuth2), Basic Auth, Service Key
  • Multi-environment: ABAP Cloud (BTP), On-Premise, Legacy (BASIS < 7.50)
  • Runtime diagnostics: Profiling, dump analysis, SQL queries
  • Handler groups: Read-Only, High-Level, Low-Level, Compact, System, Search
  • Embeddable: Use as a standalone server or embed handlers into existing MCP servers
  • Auto-configurator: @mcp-abap-adt/configurator for automated client setup
  • Health endpoint: GET /mcp/health for HTTP/SSE transports
  • Optional data-fetch prevention: opt-in server-side blocklist (SC4SAP_POLICY=on) that blocks row extraction from sensitive tables (PII, credentials, payroll, banking) regardless of caller — see Optional: Data Fetch Prevention

Supported SAP Environments

EnvironmentAuth MethodsNotes
ABAP Cloud (BTP)JWT/XSUAA, Service KeyFull RAP/CDS support
On-Premise (S/4HANA)Basic Auth, JWTFull feature surface — Programs, Classes, CDS, Screens, GUI Statuses
Legacy (ECC / BASIS < 7.50)Basic AuthClassic ABAP only — see matrix below

Legacy detection (BASIS < 7.50 / pre-S/4HANA) applies when any of:

  • SAP_SYSTEM_TYPE=legacy (explicit opt-in, back-compat)
  • SAP_VERSION=ECC
  • ABAP_RELEASE numeric < 750 (e.g., 740, 731)

Under legacy mode the client routes through AdtClientLegacy, which restricts endpoint probes to those actually present on BASIS 7.4x. Modern DDIC CRUD and RAP/Service endpoints deliberately refuse with a clear "not supported on this SAP system" message instead of a cryptic 404.

Legacy (ECC / BASIS < 7.50) Compatibility Matrix

Verified on ECC 7.40 (SAP_VERSION=ECC, ABAP_RELEASE=740, SAP_SYSTEM_TYPE=onprem).

CategoryToolECC 7.40Reason
Session / DiscoveryGetSession, SearchObject, GetObjectInfo, GetObjectStructure✅Basic ADT present on all releases
Inactive objectsGetInactiveObjects✅—
Package readGetPackageContents, GetPackageTree✅ADT repository informationsystem
Package metadataGetPackage⚠️Needs client library 3.15.0+. Resolved through the informationsystem search: name / type / description only (legacy_limited: true); super-package, components and transport layer are not returned. A missing package gives "not found". Package create/update/delete stay SE80/SE21
DDIC readGetTable, GetStructure, GetDataElement, GetDomain❌/sap/bc/adt/ddic/{tables,structures,dataelements,domains} added in BASIS 7.50
DDIC writeCreateTable, CreateStructure, CreateDataElement, CreateDomain (+ Update/Delete)❌Same endpoint gap — create from SAP GUI (SE11) instead
CDS view (DDLS)GetView, CreateView, UpdateView✅DDL endpoint (/sap/bc/adt/ddic/ddl/sources/) present and activates cleanly from BASIS 7.40 SP05+
Classic view (VIEW/DV)GetView for classic DDIC views❌Classic view endpoint falls in the same DDIC gap as Tables/Structures — use SE11 in SAP GUI
ABAP source readGetProgram, GetClass, GetInterface, GetInclude, GetFunctionGroup, GetFunctionModule✅/sap/bc/adt/{programs,oo/classes,oo/interfaces,programs/includes,functions/groups} all present
ABAP source writeCreate* / Update* for Program, Class, Interface, Include, FunctionGroup, FunctionModule✅UpdateFunctionModule defaults transport_request to "local" when omitted (consistent with FunctionGroup/Class)
AST / Semantic analysisGetAbapSemanticAnalysis, GetAbapAST✅Client-side parse, no SAP call
WhereUsedGetWhereUsed, GetUsageSnippets✅Needs client library 3.15.0+. No scope step on 7.40 (server default scope; enable_all_types ignored); tables / structures / data elements / domains / DDIC views / table types / transactions / function modules go through workbench VIT URIs; function module by plain name; SAP_TIMEOUT_LONG (120 s) because VBAK-sized searches take ~60 s
EnhancementsGetEnhancements, GetEnhancementSpot, GetEnhancementImpl❌/sap/bc/adt/enhancements discovery endpoints return 404 on BASIS < 7.50 — use SE18/SE19 or CMOD/SMOD in SAP GUI
TransportListTransports, GetTransport, CreateTransport✅CTS endpoints present
RuntimeRuntimeListDumps, RuntimeAnalyzeDump, RuntimeGetDumpById✅/sap/bc/adt/runtime/dumps present
Screen / GUI StatusGetScreen, GetGuiStatus, GetTextElement (+ Create/Update)ℹ️RFC-dispatched via SAP_RFC_BACKEND (odata default / soap / native / gateway / zrfc); the chosen backend's prerequisites (backend classes, SICF node, SDK) must be in place
RAP / Behavior*BehaviorDefinition, *BehaviorImplementation❌S/4HANA only — RAP does not exist on ECC
Service binding*ServiceDefinition, *ServiceBinding❌S/4HANA / ABAP Cloud only
Metadata extensions*MetadataExtension❌S/4HANA / ABAP Cloud only
Table contentsGetTableContents, GetSqlQueryℹ️Works server-side but gated by the per-profile data-extraction policy — see Optional: Data Fetch Prevention

Legend: ✅ works fully · ⚠️ works with caveats · ❌ refuses with a clear "not supported on this SAP system" error (not a bug — SAP platform limit) · ℹ️ works, but depends on prior setup / policy.


Quick Start

1. Install
npm install -g @mcp-abap-adt/core
2. Configure environment
# Create .env file in your working directory
cat > .env << 'EOF'
SAP_URL=https://your-sap-system.com
SAP_CLIENT=100
SAP_AUTH_TYPE=basic
SAP_USERNAME=your_username
SAP_PASSWORD=your_password
EOF
3. Run
# stdio (for MCP clients like Claude Code, Cline, Cursor)
mcp-abap-adt

# HTTP server
mcp-abap-adt --transport=http --port 3000

# SSE server
mcp-abap-adt --transport=sse --port 3000

Installation

npm install -g @mcp-abap-adt/core
From source
git clone --recurse-submodules https://github.com/babamba2/abap-mcp-adt-powerup.git
cd abap-mcp-adt-powerup
npm install
npm run build
npm start
Platform-specific guides

Claude Code Plugin

This repository is also distributed as a Claude Code plugin via the marketplace.

Install via marketplace
# Add this marketplace (once)
/plugin marketplace add babamba2/abap-mcp-adt-powerup

# Install the plugin
/plugin install abap-mcp-adt-powerup

After install, configure the SAP connection through environment variables (see Configuration) or use the auto-configurator:

npx @mcp-abap-adt/configurator
Manual plugin directory

If you're editing this repo locally, it already resolves as a plugin from:

~/.claude/plugins/marketplaces/abap-mcp-adt-powerup

Reload Claude Code (/plugin → Reload) to pick up changes.


Configuration

Environment Variables (.env)
# SAP connection
SAP_URL=https://your-abap-system.com
SAP_CLIENT=100
SAP_LANGUAGE=en

# System type: cloud (default), onprem, or legacy
SAP_SYSTEM_TYPE=cloud

# TLS: set to 0 for self-signed certificates (dev only)
TLS_REJECT_UNAUTHORIZED=0

# Authentication
SAP_AUTH_TYPE=xsuaa          # 'xsuaa' for JWT, 'basic' for username/password
SAP_JWT_TOKEN=your_jwt_token # For JWT auth
# SAP_USERNAME=your_username # For basic auth
# SAP_PASSWORD=your_password # For basic auth

# On-premise context (required for create/update on on-prem)
# SAP_MASTER_SYSTEM=DEV
# SAP_RESPONSIBLE=your_username

# Timeouts (milliseconds)
SAP_TIMEOUT_DEFAULT=45000    # General operations (default: 45s)
SAP_TIMEOUT_CSRF=15000       # CSRF token requests (default: 15s)
SAP_TIMEOUT_LONG=60000       # Long-running operations (default: 60s)
CLI Options
mcp-abap-adt [options]

Options:
  --transport=<type>    Transport protocol: stdio (default), http, sse
  --port <number>       Server port for http/sse (default: 3000)
  --host <address>      Bind address for http/sse (default: localhost)
  --env <destination>   Destination name for multi-system setups
  --env-path <path>     Path to .env file
YAML Configuration

Alternative to CLI arguments. See YAML Config Guide.


Authentication

Basic Auth (On-Premise)
SAP_AUTH_TYPE=basic
SAP_USERNAME=developer
SAP_PASSWORD=secret123
JWT / XSUAA (Cloud / On-Premise)
SAP_AUTH_TYPE=xsuaa
SAP_JWT_TOKEN=eyJhbGciOiJSUzI1NiIs...
Service Key (BTP)

Place your service key JSON file and configure via the configurator (@mcp-abap-adt/configurator).

Header-based Auth (HTTP/SSE transports)

For multi-tenant or proxy setups, pass SAP connection details via HTTP headers (x-sap-*). See Authentication Guide.


Available Tools

The server provides 288 tools organized into handler groups:

Tool Categories
CategoryCountDescription
Read-Only52Query and retrieve objects without modification
High-Level113User-friendly CRUD operations
Low-Level122Direct ADT API operations with granular control
Compact22Streamlined access to common operations
System-Runtime analysis, profiling, dumps, SQL queries
Search-Object discovery, where-used analysis
Supported ABAP Object Types
Object TypeReadCreateUpdateDelete
Classes (CLAS)OOOO
Interfaces (INTF)OOOO
Programs (PROG)OOOO
IncludesOOOO
Tables (TABL)OOOO
StructuresOOOO
CDS Views (DDLS)OOOO
DomainsOOOO
Data Elements (DTEL)OOOO
Function Groups (FUGR)OOOO
Function Modules (FUNC)OOOO
Packages (DEVC)OOOO
TransportsOO--
Service Definitions (SRVD)OOOO
Service Bindings (SRVB)OOOO
Behavior Definitions (BDEF)OOOO
Behavior Implementations (BIMP)OOOO
Metadata Extensions (DDLX)OOOO
Screens (DYNP)OOOO
GUI StatusesOOOO
Text ElementsOOOO
Unit TestsOOOO
CDS Unit TestsOOOO
EnhancementsO---
Runtime & System Tools
  • Runtime Profiling - Profile class and program execution with trace analysis
  • Dump Analysis - List and analyze ABAP runtime dumps
  • SQL Queries - Execute SQL queries via ADT (GetSqlQuery)
  • Table Contents - Read table data (GetTableContents)
  • Object Search - Find objects by name, type, package (SearchObject)
  • Where-Used - Cross-reference analysis (GetWhereUsed)
  • Type Info - Retrieve type information (GetTypeInfo)
  • Inactive Objects - List objects pending activation (GetInactiveObjects)
  • AST / Semantic Analysis - Parse ABAP syntax tree and semantic info

For the complete tool reference, see AVAILABLE_TOOLS.md.


Transport Protocols

stdio (Default)

Standard input/output transport for MCP clients. Used by Claude Code, Cline, Cursor, and other MCP-compatible tools.

mcp-abap-adt
# or explicitly:
mcp-abap-adt --transport=stdio
HTTP (StreamableHTTP)

REST API with JSON streaming responses. Ideal for web clients and multi-user deployments.

mcp-abap-adt --transport=http --port 3000 --host 0.0.0.0

Health check: GET /mcp/health

SSE (Server-Sent Events)

Long-polling transport with session management.

mcp-abap-adt --transport=sse --port 3000

Client Configuration

Claude Code
{
  "mcpServers": {
    "mcp-abap-adt": {
      "command": "npx",
      "args": ["-y", "@mcp-abap-adt/core"],
      "env": {
        "SAP_URL": "https://your-sap-system.com",
        "SAP_CLIENT": "100",
        "SAP_AUTH_TYPE": "basic",
        "SAP_USERNAME": "developer",
        "SAP_PASSWORD": "secret"
      }
    }
  }
}
Cline / Cursor / VS Code
{
  "mcpServers": {
    "mcp-abap-adt": {
      "command": "npx",
      "args": ["-y", "@mcp-abap-adt/core"],
      "env": {
        "SAP_URL": "https://your-sap-system.com",
        "SAP_CLIENT": "100",
        "SAP_AUTH_TYPE": "xsuaa",
        "SAP_JWT_TOKEN": "eyJhbGciOiJSUzI1NiIs..."
      }
    }
  }
}
Auto-Configuration

Use the configurator for automated setup:

npx @mcp-abap-adt/configurator

See Client Configuration Guide for more examples.


Handler Architecture

The server organizes tools into composable handler groups:

handlers/
├── behavior_definition/    # BDEF CRUD
├── behavior_implementation/# BIMP CRUD
├── class/                  # CLAS CRUD
├── compact/                # Shorthand tools
├── common/                 # Shared handlers
├── data_element/           # DTEL CRUD
├── ddlx/                   # Metadata Extension CRUD
├── domain/                 # Domain CRUD
├── enhancement/            # Enhancement read-only
├── function/               # Function-related
├── function_group/         # FUGR CRUD
├── function_module/        # FUNC CRUD
├── gui_status/             # GUI Status CRUD
├── include/                # Include CRUD
├── interface/              # INTF CRUD
├── metadata_extension/     # DDLX CRUD
├── package/                # DEVC CRUD
├── program/                # PROG CRUD
├── screen/                 # Screen/Dynpro CRUD
├── search/                 # Object search & where-used
├── service_binding/        # SRVB CRUD
├── service_definition/     # SRVD CRUD
├── structure/              # Structure CRUD
├── system/                 # Runtime diagnostics
├── table/                  # TABL CRUD
├── text_element/           # Text Element CRUD
├── transport/              # Transport management
├── unit_test/              # Unit test CRUD & run
└── view/                   # CDS View CRUD

Each handler category contains subdirectories:

  • high/ - High-level, user-friendly operations
  • low/ - Low-level, direct ADT API operations
  • readonly/ - Safe read-only queries
Embedding Handlers

For integrating into existing MCP servers (e.g., CAP/CDS applications):

import { HandlerExporter } from '@mcp-abap-adt/core/handlers';

const exporter = new HandlerExporter({
  includeReadOnly: true,
  includeHighLevel: true,
  includeLowLevel: false,
  includeSystem: true,
  includeSearch: true,
});

exporter.registerOnServer(mcpServer, () => connection);

Docker Deployment

Using Docker Compose
# Build and run
npm run docker:build
npm run docker:up

# Or with pre-built package
npm run docker:build:package
npm run docker:up:package
Manual Docker Build
cd docker
docker-compose build
docker-compose up -d

See Docker Deployment Guide for full details.


Development

Prerequisites
  • Node.js >= 20.0.0
  • npm >= 9.0.0
  • TypeScript 5.9+
Setup
git clone --recurse-submodules https://github.com/babamba2/abap-mcp-adt-powerup.git
cd abap-mcp-adt-powerup
npm install
npm run build
Scripts
CommandDescription
npm run buildLint + compile TypeScript
npm run build:fastCompile only (skip lint)
npm run devBuild + launch MCP Inspector (stdio)
npm run dev:httpBuild + launch HTTP dev server
npm run dev:sseBuild + launch SSE dev server
npm run lintRun Biome linter with auto-fix
npm run formatFormat code with Biome
npm startRun MCP server (stdio)
npm run start:httpRun MCP server (HTTP)
npm run start:sseRun MCP server (SSE)
npm run docs:toolsRegenerate tool documentation
Project Structure
mcp-abap-adt/
├── bin/                    # CLI entry points
│   ├── mcp-abap-adt.js    # Main CLI
│   └── mcp-abap-adt-v2.js # V2 server variant
├── src/
│   ├── handlers/           # 30 handler categories (288 tools)
│   ├── lib/
│   │   ├── auth/           # Auth broker, JWT/XSUAA
│   │   ├── config/         # Configuration management
│   │   ├── handlers/       # Handler registry & utilities
│   │   ├── stores/         # Session/token storage
│   │   ├── types/          # TypeScript interfaces
│   │   └── utils.ts        # Core utilities
│   ├── server/
│   │   ├── BaseMcpServer.ts         # MCP server extension
│   │   ├── StdioServer.ts           # stdio transport
│   │   ├── SseServer.ts             # SSE transport
│   │   ├── StreamableHttpServer.ts  # HTTP transport
│   │   └── launcher.ts              # Server startup
│   └── utils/              # Utility modules
├── docker/                 # Docker deployment
├── docs/                   # Documentation
├── tests/                  # Test configuration
├── tools/                  # Dev tools & scripts
└── package.json
Key Dependencies
PackagePurpose
@mcp-abap-adt/adt-clientsADT REST API clients
@mcp-abap-adt/connectionSAP connection management
@mcp-abap-adt/auth-brokerAuthentication token management
@mcp-abap-adt/auth-providersAuth strategy implementations
@modelcontextprotocol/sdkMCP protocol SDK
fast-xml-parserXML parsing for ADT responses

Testing

Integration Tests

Integration tests run against a real SAP system in two modes:

  • Soft mode (default): Calls handlers directly, no MCP subprocess
  • Hard mode: Spawns full MCP server via stdio, calls tools through MCP protocol
Setup
# Create test config from template
npm run test:init

# Edit only the lines marked "# <- CHANGE"
# - environment.env (session .env file)
# - environment.system_type (onprem/cloud/legacy)
# - environment.default_package
# - environment.default_transport
Running Tests
# Unit tests
npm test

# All integration tests (soft mode)
npm run test:integration

# High-level handler tests only
npm run test:high

# Low-level handler tests only
npm run test:low

# Type check test files
npm run test:check

See Testing Guide for full details.


Troubleshooting

self-signed certificate in certificate chain

Your SAP system uses a self-signed TLS certificate. For development only:

TLS_REJECT_UNAUTHORIZED=0

For production, install the SAP CA certificate into the Node.js trust store.

401 Unauthorized / 403 Forbidden
  • Basic Auth: confirm SAP_USERNAME / SAP_PASSWORD and that the user has ADT authorization (S_DEVELOP, S_RFC, S_TCODE).
  • JWT/XSUAA: the token may be expired — refresh via the configurator or service key.
  • Client mismatch: verify SAP_CLIENT matches the logon client.
CSRF token validation failed on Update/Create

The session lost its CSRF token. Most handlers refresh automatically; if it persists:

  • Increase SAP_TIMEOUT_CSRF (default 15s).
  • Confirm cookies are not being stripped by a proxy.
transport required on On-Premise

Create or update on on-prem systems requires a transport request. Set:

SAP_MASTER_SYSTEM=DEV
SAP_RESPONSIBLE=your_username

…and pass transport=<TRKORR> to the handler, or use a local package ($TMP).

Claude Code doesn't see the MCP server
  1. Restart Claude Code after editing config.
  2. Check logs: ~/.claude/logs/ (stderr from the MCP process).
  3. Run mcp-abap-adt directly in a shell — it must start without errors before Claude can connect.
Programs not available on Cloud

Programs (PROG) are on-premise / legacy only. Use Classes or CDS on ABAP Cloud.


FAQ

Q. Does this work with S/4HANA Cloud, public edition? Yes — via ABAP Cloud (BTP) with JWT/XSUAA or a service key. RAP/CDS objects are fully supported; classic objects (Programs, Screens, GUI Statuses) are not available on cloud.

Q. Can I use this without Claude Code? Yes. Any MCP-compatible client works: Cline, Cursor, Windsurf, VS Code MCP extension, or a custom client built with @modelcontextprotocol/sdk.

Q. How do I limit which tools are exposed? Use the HandlerExporter to select handler groups when embedding, or set environment flags to disable groups. See Handler Management.

Q. Is it safe to use against a productive SAP system? The server respects SAP authorization — whatever your user cannot do in SE80/ADT, it cannot do here either. Still, we recommend a dedicated development user and running against non-prod first.

Q. How do I run against multiple SAP systems? Use --env <destination> with per-destination .env files, or the YAML config. For HTTP/SSE deployments, pass x-sap-* headers per request.

Q. Does it support RFC? Yes, for legacy systems where ADT HTTP APIs are unavailable. Set connection_type: rfc in the test config (or equivalent env) — requires the SAP NW RFC SDK installed locally.


Documentation

GuideDescription
InstallationPlatform-specific installation
Client ConfigurationMCP client setup
AuthenticationAuth methods & destinations
Available ToolsComplete tool reference (288 tools)
CLI OptionsCommand-line reference
YAML ConfigYAML configuration guide
ArchitectureSystem architecture overview
Stateful SessionsLock/update/unlock flow
Handler ArchitectureTool & handler structure
Docker DeploymentContainer deployment
Testing GuideTest setup & execution
Handler ManagementEnable/disable handler groups

Optional: Data Fetch Prevention

Row-returning tools (GetTableContents, GetSqlQuery) can expose sensitive business data — PII, credentials, payroll, banking, transactional finance. This server ships with an opt-in server-side blocklist that stops such calls before they ever reach SAP, regardless of the caller (Claude, other LLMs, direct JSON-RPC, external scripts).

The feature is disabled by default — nothing is blocked unless you explicitly turn it on.

Enable
export SC4SAP_POLICY=on                    # or: strict | standard | minimal | custom
export SC4SAP_POLICY_PROFILE=strict        # optional, default when SC4SAP_POLICY=on
export SC4SAP_BLOCKLIST_PATH=/path/to/table_exception.md   # optional extra list
export SC4SAP_ALLOW_TABLE=TAB1,TAB2        # session-scoped emergency exemption (logged)
Profiles
ProfileBlocks
strict (default when SC4SAP_POLICY=on)PII + credentials + HR + transactional finance + audit logs + workflow
standardPII + credentials + HR + transactional finance
minimalPII + credentials + HR + Tax (business tables allowed)
customUser-supplied list only (blocklist-custom.txt)
Behavior

When a blocked table is accessed, the server responds with isError: true and a categorized reason — no SAP round-trip occurs. Schema/DDIC metadata calls (GetTable, GetStructure, GetView, GetDataElement, GetDomain), existence checks (SearchObject), and aggregate-only GetSqlQuery remain allowed.

Built-in blocklist covers 100+ tables / patterns across Banking (BNKA, KNBK, LFBK, REGUH), Customer/Vendor PII (KNA1, LFA1, BUT000, BUT0ID), Addresses (ADRC, ADR6, ADRP), Authentication (USR02, RFCDES, AGR_1251), HR/Payroll (PA* / HRP* / PCL*), Tax IDs, Protected Business Data (VBAK/BKPF/ACDOCA), Audit logs, and customer Z* PII patterns.

This feature is designed for but not coupled to the sc4sap plugin — any MCP client can benefit from it.


Contributing

We welcome contributions! Please see the development documentation for setup instructions.

Contributors

License

MIT — Copyright (c) 2026 백승현 (Paek Seunghyun) & Oleksii Kyslytsia

MIT, read

History

Latest

v4.8.13

Features 6, Changed 1, Fixes 1

Notes
Added
  • GetSmartFormLayout (read-only, on-premise and legacy systems): page and window layout of a SmartForm. Per page the format, orientation, next page, CPI / LPI and style; per window its type (MAIN, SECONDARY, ...), position and size as stored (value + unit) and converted to millimetres (CM, MM, IN, PT, TW, and LN / CH through the page LPI / CPI). Reads the active version (a form that was never activated is read from its saved version and active is false). language takes a 1-character SAP key or a 2-letter ISO code. Layout only: no texts, code or form interface. Runs through ZMCP_ADT_DISPATCH action SSF_LAYOUT, so it works on the OData backend (BASIS 7.40) and over SOAP RFC (BASIS 7.31). Needs the new ZMCP_SSF_LAYOUT FM and the SSF_LAYOUT dispatcher branch; without them the tool answers with an install hint.
  • GetSmartFormContent (read-only, on-premise and legacy systems): what a SmartForm prints, for preview rendering. Per page and window (position in mm) the content tree: text nodes with their lines (paragraph format, inline character formats, &symbols&), include texts, templates with line heights and cells (width, border widths, shading colour), loops and tables with header / footer events, graphics, addresses, print conditions; code nodes only as markers, never program lines. Also the form interface and global data with their types (data), the SmartStyles as CSS, SE78 graphics with a fixed key as BMP with their printed size, and include texts with a fixed key. Everything is written under the MCP output directory (smartforms/<form>/, full result in <form>.content.json); summary: true answers with an overview (windows, data declarations, &symbols&, graphics, files) because the full tree easily exceeds a tool answer. Runs through ZMCP_ADT_DISPATCH action SSF_CONTENT (FM ZMCP_SSF_CONTENT).
  • RenderSmartForm (on-premise and legacy systems): the output of a SmartForm exactly as SAP prints it, for given interface values. Calls the form's generated function module with GETOTF (no dialog, no print, no spool) and writes the OTF and the PDF under the MCP output directory (smartforms/<form>/<form>.sap.otf.txt / .sap.pdf). values / values_file take the interface in internal format; device or families choose the device type, so the output has the printer fonts the form was made for. The form's own program lines run as in a real print and may read the database — pass invented sample values only. Runs through ZMCP_ADT_DISPATCH action SSF_RENDER (FM ZMCP_SSF_RENDER); without them the tool answers with an install hint.
  • CreateSmartForm (writes, on-premise and legacy systems, DEV profiles only): creates — or with overwrite replaces — a Z/Y SmartForm from Form Builder XML (the format of SMARTFORMS > Utilities > Download and of GetSmartFormContent's form XML). The form is checked and stored active, its function module generated (also for a replaced form); when the check finds errors it is stored inactive and the errors come back. package_name defaults to $TMP; another package needs transport_request. The XML travels raw-deflate compressed in parts of 5000 base64 characters, because the OData Dispatch function import carries its parameters in the URL. Runs through ZMCP_ADT_DISPATCH action SSF_UPLOAD_XML (FM ZMCP_SSF_UPLOAD); without them the tool answers with an install hint.
  • DeleteSmartForm (writes, destructive, DEV profiles only): deletes a Z/Y SmartForm of a local package ($TMP, $…) with its generated function module — a dry run unless confirm: true; transportable forms are refused. Runs through action SSF_DELETE_FORM (FM ZMCP_SSF_DELETE).
  • GetSmartFormContent reads more of what decides the print:
    • SmartStyle paragraphs and character formats as stored (value + unit, family, size, tabs), with the SE73 bar-code definition (barcodeDef: symbology, module, height) of bar-code formats.
    • Table / template patterns with their outer frame flag (frame.border), box sides switched on with thickness 0 (on), and the reference of a template line type that takes another line's height.
    • Styles named only in output options (template / window STDSTYLE) are read too.
    • The device type and its printer fonts for the form's families (printer).
    • Texts with no translation in the logon language are taken from the form's master language, as SAP prints them. This needs ZMCP_SSF_CONTENT with IV_LANGUAGE for the FORM part; an older FM keeps the logon-language texts.
Fixed
  • npm run docs:tools cut a description at the first quote of the other kind ('… (e.g. "ZMY_FORM")', "… dump's …"): string values now end at the quote they opened with, escapes are resolved. The user-guide tool lists are regenerated with the full texts.
Changed
  • Dependencies updated within their major versions: @modelcontextprotocol/sdk 1.32.1, axios 1.20, fast-xml-parser 5.11, zod 4.6, js-yaml 4.3, pino 10.4, pino-pretty 13.2, and the dev tooling (Biome 2.5, ts-jest, tsx, express, yaml). jest stays on 30.2: 30.5 pulls in @parcel/watcher, whose install script fails under the nested jest tree on Windows (path over 260 characters).
  1. v4.8.12

    Features 4, Changed 1, Fixes 4

    Notes
    Changed
    • ADT source writes on BASIS < 7.40 now explain the invalid-lock-handle failure. Some 7.31 systems never send a sap-contextid cookie, so no stateful ADT session exists and the lock is gone before the write: the PUT fails with HTTP 423 ExceptionResourceInvalidLockHandle in every session mode. No client-side setting fixes it. The error now carries a hint that ADT source writes cannot work on that system and that the source has to be edited in SE38 / SE24 / SE37. Applies to every tool error that mentions an invalid lock handle when ABAP_RELEASE < 740.
    Fixed
    • ReloadProfile switched the profile but not the connection. The stdio server kept the connection context it built at boot, so after a switch every tool still talked to the previous system until Claude Code was restarted. A profile switch now rebinds the stdio connection context and drops the RFC sessions of the previous system (SOAP / OData CSRF session, native RFC pool, ZRFC proxy session). Every SAP_RFC_* key of the previous profile is cleared, so a profile that does not set one no longer inherits it. The default MCP_OUTPUT_DIR (.sc4sap/work/<alias>/mcp-output) follows the new alias; a user-chosen directory is left alone. When part of the switch fails, the result is ok: false with restartRequired: true and errors.
    • ListTransports / GetTransport returned nothing on BASIS < 7.40. The ADT transport organizer does not exist there: the list URL answers an empty body, which parsed to 0 transports. On these releases the request header, tasks and objects are read from E070 / E07T / E071 with the standard RFC_READ_TABLE over SOAP RFC. No custom ABAP is needed.
    • GetWhereUsed failed on BASIS < 7.40. There is no repository information system resource. The search now runs in SAP through ZMCP_ADT_DISPATCH action WHERE_USED (cross-reference tables, DDIC usage) and returns the same shape, with a note that says so.
    • Read-only DDIC helpers on BASIS 7.31. There is no SAP Gateway there, so the OData service cannot exist. The table / data element / domain read helpers now also run over SOAP RFC.
    Added
    • GetTcodeUsage (read-only, ECC): was each transaction used in the last N months, from the ST03N workload monthly aggregates. One boolean per transaction plus coverage (months that actually hold data). No user names leave SAP. destination (or SAP_USAGE_RFCDEST in the profile) reads another system's aggregates over an SM59 destination. Needs the ZMCP_WL_TCODE_USAGE FM and the WlTcodeUsage function import.
    • GetJobUsage (read-only, ECC): is each program a step of a background job that is scheduled now or ran inside the window (TBTCO / TBTCP). One boolean per program. Needs the ZMCP_WL_JOB_USAGE FM and the WlJobUsage function import.
    • GetTransaction transaction_names: several transactions in one call. The result also shows the kind of transaction (program, parameter transaction with its target t-code and parameters, variant transaction).
    • Legacy table reads (ZMCP_ADT_DISPATCH TABLE_READ) also allow TSTC, TSTCP, DD03L and DD04L.
  2. v4.8.11

    Features 4, Fixes 6

    Notes
    Fixed
    • GetWhereUsed on ECC (BASIS < 7.50) returned nothing or failed. Every call failed with 404 because the scope step does not exist on 7.40. DDIC objects returned 500. A successful answer was parsed as 0 references. The client library 3.15.0 fixes all three. It searches without a scope, addresses tables, structures, data elements, domains, DDIC views, table types, transactions and function modules through workbench VIT URIs, and parses both namespace prefixes. Needs @babamba2/mcp-abap-adt-clients 3.15.0.
      • On ECC a function module may be given by plain name (GROUP|FM still works). The ECC search uses SAP_TIMEOUT_LONG (default 120 s), because a widely used standard table such as VBAK takes about 60 s.
    • ActivateObjects / ActivateObject reported success:false on ECC after a successful activation. On BASIS 7.40 /sap/bc/adt/activation/runs returns 404 and the sync POST /sap/bc/adt/activation answers a clean activation with HTTP 200 and an empty body (no <chkl:messages>), which was read as "not activated". An empty body now counts as activated without messages. The result is then checked against GET /sap/bc/adt/activation/inactiveobjects: an object still listed there is marked failed with an error that says so. The response carries notes when the result was inferred this way. The per-type activation tools (ActivateProgram, ActivateClass, ...) also treat an empty body as success.
    • GetInactiveObjects returned 0 objects on ECC. BASIS 7.40 sends a plain <adtcore:objectReferences> list, which the parser did not know. Needs client library 3.15.0. Each object now also carries uri. available_in now includes legacy.
    • GetPackage failed on ECC (BASIS < 7.50). The client library threw for every package read. With client library 3.15.0 the package is resolved through the Information System search and the tool returns name, type and description with legacy_limited: true; a missing package returns "Package not found.". Needs @babamba2/mcp-abap-adt-clients 3.15.0.
    • CreateGuiStatus wrote MODAL = 'N', which is not a status type. RSMPE_STAT-MODAL stores D (normal screen or list status), P (dialog box) and C (context menu). status_type N / P / C now maps to D / P / C (high and low tool). The description now goes to STA.INT_NOTE, the status short text shown in SE41. The TIT row is still written. UpdateGuiStatus / PatchGuiStatus rewrite an incoming or existing MODAL = 'N' to D and log a warning for any other unknown code.
    • GetGuiStatusList returned 0 statuses for a GUI status written by the dispatcher. ADT's object structure lists only the statuses known to the workbench navigation index, and a CUA written through CUA_WRITE is not in it. When ADT lists no status, the list now comes from the CUA_FETCH STA rows (source: "cua_fetch", each entry with description and status_type). Without the dispatcher the result stays empty and notes says why.
    Added
    • GetWhereUsed options (all optional, default off): max_results (cap), customer_only (Z / Y name, or package Z* / Y* / $*; /namespace/ objects such as SAP industry solutions or generated /1BCDWB/ modules are dropped, use package: "/ACME/*" for a customer namespace), package (exact or prefix *), timeout_ms. The filters run after the SAP search, so they shrink the answer but not the search time.
    • GetWhereUsed response fields (additive): returned_references, truncated, filtered_out, notes, and object_identifier per reference. Calls without the new options return the same references as before.
    • GetWhereUsed error hints for unresolvable object types, timeouts and unsupported types. available_in now includes legacy.
    • GetUsageSnippets (read-only, new tool): line-level where-used hits. For each referencing object it returns the source lines with uri (…/source/main#start=<line>,<col>), line, column and the source line. Input is either object_identifiers from GetWhereUsed, or object_name + object_type (runs the where-used search first, with customer_only / package / max_objects). Works on ECC 7.40 and S/4HANA. Needs client library 3.15.0. With an older library the tool reports this.
  3. v4.8.10

    Features 1, Fixes 1

    Notes
    Added
    • RunUnitTest container_type (CLAS | PROG | FUGR, default CLAS). On BASIS < 7.50 (ECC), PROG / FUGR run the local test classes of a report or function group. Every test class of the container runs; test_class is not a filter there. On S/4HANA only CLAS is supported, and PROG / FUGR return a clear error instead of running the wrong object.
      • PROG / FUGR need @babamba2/mcp-abap-adt-clients 3.14.0. An older library ignores container_type and runs the name as a class.
    Fixed
    • RunUnitTest on ECC returned no result. The legacy run is synchronous and its result was lost between handlers, so GetUnitTestResult came back empty. RunUnitTest now returns the result inline as run_result (run_id: "legacy-sync"). GetUnitTestResult / GetUnitTestStatus called with legacy-sync return an error that points to run_result instead of an empty success.
  4. v4.8.9

    Features 1

    Notes
    Added
    • GetSqlQuery / GetTableContents on BASIS < 7.50 (ECC). The ADT data preview does not exist there, so the client library refused both. They now fall back to the ZMCP_ADT_DISPATCH action TABLE_READ (abap/zmcp_adt_dispatch_ecc.abap, FORM table_read) and answer with path: "ecc-dispatch-table-read".
      • Only a single-table SELECT f1, f2 | * FROM tab [WHERE …] [ORDER BY …] is translated; JOIN, UNION, GROUP BY and aggregates are refused with a clear message. The ABAP side rejects sub-queries in the condition.
      • Read-only and allow-listed to customizing / repository tables: MODACT, MODATTR, MODSAP (CMOD), GB31, GB92, GB93, T001D, T001Q (GGB validations / substitutions), TBE24, TBE34, TPS34 (BTE), TFRM, TFRMT (VOFM routines), T100 (messages). Any other table gets an error naming the list. The protected-table checks run first, as before.
      • Rows are capped at 5000 (the ABAP limit). truncated is true only when more rows exist: one extra row is read to tell.
      • Systems without the TABLE_READ action keep the original "not supported on this SAP system" error.
  5. v4.8.8

    Changed 1

    Notes
    Changed
    • Shorter tool parameter descriptions, same meaning: the repeated version / transport sentences (88 places) and the [read-only] tag on parameter descriptions (26 places; tool-level descriptions keep it) are trimmed, and the output parameter text is shorter. The 171 high-level tool definitions went from 117,837 to 114,819 characters. No behaviour change.
  6. v4.8.7

    Features 2, Changed 2, Fixes 5

    Notes
    Fixed
    • GetTableContents / GetSqlQuery returned values in the wrong rows. ADT sends an empty cell as a self-closing <dataPreview:data/>; the parser merged it with the next cell, so every later value in that column moved up one row and the last rows came back empty. On T000, client 100 showed another client's logical system. Empty cells now stay in place. Anything extracted with these tools from tables with empty cells (customizing / SPRO extraction included) is worth re-extracting.
    • The data preview returned one row more than max_rows / row_number; rows are now cut to the limit and the response says truncated: true. XML entities (&amp; …) in values and descriptions are decoded.
    • GetProgFullCode could not read function groups — it returned the group's metadata XML instead of source. The main program now comes from source/main; nested includes are resolved (they never were), INCLUDE x. " comment lines are recognised, and each include is fetched once.
    • GetObjectInfo enrichment never worked: it called SearchObject with a parameter the handler does not read and parsed its JSON answer as XML. It now reads the JSON results.
    • Hidden filePath writes were not confined. writeResultToFile promised "inside ./output" but wrote anywhere; every write now has to stay inside MCP_OUTPUT_DIR (default ./output).
    Added
    • output: "file" on GetProgram, GetClass, GetInterface, GetFunctionModule, GetInclude and GetProgFullCode: the source is written unchanged under MCP_OUTPUT_DIR/src/ and the response carries the path, line count and an outline of METHOD / FORM / MODULE / FUNCTION / event blocks with line ranges. A 66 KB class came back as ~3 KB. Default stays inline.
    • GetTableContents: fields (keep only some columns) and include_metadata (column type, length, description).
    Changed
    • GetTableContents is compact by default: column names only, empty cells left out of each row (the response says so), no JSON indentation, 20 rows instead of 100. GetSqlQuery keeps its response shape (scripts read columns) but drops the indentation.
    • SearchObject no longer returns rawXML unless include_raw_xml: true (it repeated every parsed field and was over half the response), omits empty description / package, decodes entities, defaults to 50 results instead of 100 and flags truncated: true when the limit is hit.
  7. v4.8.6

    Features 2, Fixes 4, Other 1

    Notes
    Added
    • chapters parameter on RuntimeGetDumpById and RuntimeAnalyzeDump (implies view="formatted"): keeps the ST22 header plus the requested chapters without box borders or padding. "developer" = Short Text, What happened?, Error analysis, Chain of Exception Objects, Information on where terminated, Source Code Extract, Active Calls/Events, User and Transaction. A real S/4HANA dump went from 51.5 KB to 3.4 KB.
    • RuntimeListDumps drops each entry’s HTML summary unless include_summary=true (also on the compact DumpList handler). A 20-entry list went from ~250 KB to ~30 KB.
    Fixed
    • Dump key facts pointed at the wrong chapter. RuntimeGetDumpById (response_mode summary/both) and RuntimeAnalyzeDump returned the first title / line in the payload — the chapter-index entry "System environment", line 81. They now read the dump root (runtime error, exception, terminated program, user, date, host), the termination link (object + line) and the chapter index; the formatted view falls back to its header block.
    • SAP_RFC_BACKEND was frozen before the profile loaded. The RFC backend is resolved on every call, so the sc4sap profile value and ReloadProfile take effect.
    • SAP_RFC_BACKEND=zrfc was rejected although zrfcProxy.ts implements it; the selector now routes it.
    • pino / pino-pretty skipped by npm install --omit=dev. They were listed in both dependencies and devDependencies, so the lockfile marked them dev-only and fresh installs failed at MCP start. The devDependency entries are gone.
    Note
    • RuntimeListDumps can return an empty list on some S/4HANA systems while ST22 shows dumps; RuntimeListFeeds with feed_type: "dumps" and a time window returns them.
  8. v4.8.5

    Fixes 3, Other 2

    Notes
    Fixed
    • Tier readonly guard let four mutating tools through on QA and PRD. readonlyGuard.ts matched mutations by the prefixes Create / Update / Delete and held a three-entry runtime-execution set. ActivateObjects, PatchGuiStatus, WriteTextElementsBulk and RuntimeCreateProfilerTraceParameters matched neither and were callable against QA and PRD profiles. Patch, Write and Activate are now mutation prefixes (each matches exactly one registered tool today, so a future sibling is covered when it ships), and the profiler-trace setup call joins the runtime set alongside the RuntimeRun* executions it configures. Create still matches by startsWith, so RuntimeCreate* is not swept in by accident.
    • This is the server-side half of a two-layer defence and the client-side sc4sap PreToolUse hook carried the same two lists verbatim, so for these four tools neither layer blocked — while the hook still told the user the server guard was backing it up. Both halves were fixed together; the sc4sap side ships in its own release.
    • No behaviour change on DEV: checkToolAllowed returns null on its first line for that tier. On QA/PRD no usable capability is lost — activation and text-pool writes are already unreachable once Create* / Update* are denied, and profiler-trace setup pairs with runs that were blocked already.
    Tests
    • readonlyGuard.test.ts grows the mutation and runtime lists, and pins five near-miss reads (RuntimeAnalyzeProfilerTrace, RuntimeGetProfilerTraceData, RuntimeListProfilerTraceFiles, RuntimeGetGatewayErrorLog, RuntimeListSystemMessages) as explicitly allowed, so collapsing the runtime set into a bare Runtime prefix fails loudly instead of silently killing reads on QA and PRD.
    Known gap
    • RuntimeCallDispatch remains unblocked on every tier, with a test asserting so. It invokes an arbitrary ZMCP_ADT_DISPATCH action and the action name is a runtime argument, so this layer — which sees only the tool name — cannot separate a write action from a read one. Tracked separately; when it is addressed that test should flip rather than quietly disappear.
  9. v4.8.4

    Features 4

    Notes
    Added
    • ECC 7.40 DDIC read fallback via OData RFC. 4 handlers (GetTable / GetStructure / GetDataElement / GetDomain) activate on SAP_VERSION=ECC, routing DDIC reads through server-side FMs (ZMCP_ADT_DDIC_TABL_READ / _DTEL_READ / _DOMA_READ) invoked via OData FunctionImports on ZMCP_ADT_SRV. TABL_READ covers both Table and Structure (TABL/STRU share TABL DDIC category). Validated 2026-04-29 on HKT-DEV (path=ecc-odata-rfc).
    • GetBadiImplementations — new read-only handler to find Z/Y implementations of classic BAdI definitions. ECC-only: routes through ZMCP_ADT_DDIC_BADI bridge FM (SXS_ATTR-based lookup). Returns kind=classic with implementation list (impl_name, impl_class, package, methods_redefined) or kind=unknown for kernel BAdIs / non-existent definitions. Use during symptom analysis when a standard BAdI is implicated.
    • lib/odataRfc.ts: 4 new adapters (callDdicTablRead / DdicDtelRead / DdicDomaRead / DdicBadi) + DdicReadResult / DdicBadiResult types.
    • lib/rfcBackend.ts: 4 new wrappers + informative error for non-odata backends.
  10. v4.8.3

    Fixes 1

    Notes
    Fixed
    • Keychain password resolution in broker-based auth path. EnvFileSessionStore (from @babamba2/mcp-abap-adt-auth-stores) reads SAP_PASSWORD raw from the .env file and does not know about keychain:<service>/<account> references, so authBroker.getConnectionConfig() returned the literal reference string as the Basic Auth password → 401 → account lockout after 3 tries. profile.ts activateProfile() only fixed process.env.SAP_PASSWORD, which the v2 broker architecture (lib/utils.ts:515 "No fallback to getConfig()") does not read. brokerFactory.ts now calls resolveSecret() on both createBrokerWithEnvFileStore (Variant 2, --env=path) and loadEnvFileIntoSessionStore (Variant 3, cwd .env) and seeds the session store's inMemoryUpdates so downstream reads return plaintext.
  11. v4.8.1

    Features 3

    Notes
    Added
    • ECC 7.40 DDIC write fallback via OData RFC. 9 handlers (Domain/DataElement/Table × CRUD) activate on SAP_VERSION=ECC, routing DDIC writes through server-side FMs (ZMCP_ADT_DDIC_{TABL,DTEL,DOMA,ACTIVATE}) invoked via OData FunctionImports on ZMCP_ADT_SRV. Full implementations: Domain C/U/D + DataElement C/U/D (type_kind=domain only) + Table Delete. Inform-only: Table Create/Update (CDS-DDL translator deferred).
    • lib/odataRfc.ts: callDdicTabl / DdicDtel / DdicDoma / DdicActivate + DdicResult type.
    • lib/rfcBackend.ts: 4 new wrappers + informative error for non-odata backends.
  12. v4.5.2

    Features 1

    Notes
    Added
    • Pre-commit hook via husky + lint-staged — auto-fixes formatting and lint issues before commit so CI stays green.
  13. v4.5.1

    Changed 2

    Notes
    Changed
    • Rewrite ListTransports handler to use AdtClient.getRequest().list() with proper Accept negotiation instead of direct connection.makeAdtRequest(). Update @mcp-abap-adt/adt-clients to 3.13.0.
    • Add integration tests for ListTransports handler.
  14. v4.5.0

    Changed 1, Fixes 1

    Notes
    Fixed
    • Give SAP_AUTH_TYPE priority over SAP_JWT_TOKEN in test helpers — fixes onprem basic-auth tests failing when OS has stale BTP JWT token (#24).
    Changed
    • Update @mcp-abap-adt/adt-clients to 3.12.0 — adds 415 Content-Type negotiation with auto-retry and caching. Accept correction enabled by default (#22, #23).
  15. v4.4.2

    Fixes 1

    Notes
    Fixed
    • Guarantee unlock via try-finally in all update handlers — prevents locked objects when errors occur between lock and unlock (#22). Affected: UpdateProgram, UpdateClass, UpdateInterface, UpdateView, UpdateTable, UpdateStructure, UpdateDomain, UpdateServiceDefinition, UpdateDataElement.
  16. v4.4.1

    Features 1

    Notes
    Improved
    • Rewrite SearchObject tool description with operation-first approach for better RAG discoverability (#21). Description now leads with action verbs (find, search, locate, check exists) instead of object type lists, so embedding vectors match user intent queries like "is there a program named X?".
  17. v4.4.0

    Features 1

    Notes
    Improved
    • Enrich 15 tool descriptions with domain-specific keywords for better vector RAG discoverability (#20). Tools like SearchObject, GetTypeInfo, GetTransaction, GetTableContents, and others now include ABAP object type names (DEVC, CLAS, TABL, DDLS, BDEF, DDLX, etc.) so embedding-based tool discovery returns correct results.
  18. v4.3.2

    Features 1

    Notes
    Improved
    • Suppress ping request logging in StreamableHttpServer and SseServer — ping is now silent unless debug logging is enabled, reducing log noise.
  19. v4.3.1

    Features 1

    Notes
    Improved
    • StreamableHttpServer request logging now includes MCP method, tool name, destination, and completion status. Helps diagnose issues like #19 where health polls generate excessive tools/list noise.
  20. v4.3.0

    Features 2

    Notes
    Added
    • GET /mcp/health endpoint for HTTP and SSE transports — lightweight health check without MCP protocol overhead. Returns status, uptime, version, transport, and activeSessions (SSE only). Resolves #18.
    • Unit tests for health endpoint (both transports).
  21. v4.2.1

    Fixes 1

    Notes
    Fixed
    • Shorten server.json description to fit MCP registry 100-character limit.
  22. v4.2.0

    Features 4, Fixes 6

    Notes
    Added
    • 16 new Read* tools — read source code and metadata for all object types with CRUD handlers: ReadClass, ReadInterface, ReadProgram, ReadTable, ReadStructure, ReadView, ReadDomain, ReadDataElement, ReadFunctionModule, ReadFunctionGroup, ReadPackage, ReadServiceDefinition, ReadServiceBinding, ReadMetadataExtension, ReadBehaviorDefinition, ReadBehaviorImplementation.
    • transport_request parameter for UpdateBehaviorDefinition (low), UpdateMetadataExtension (high).
    • record_changes parameter for CreatePackage (high + low).
    • Transported Object CRUD integration test reproducing GitHub #11 (transport lock issue on legacy systems).
    Fixed
    • SAP_SYSTEM_TYPE now propagated from test config to process.env, so createAdtClient correctly selects AdtClientLegacy on legacy systems.
    • transport_request passed in class update tests for transportable packages.
    • UpdateDataElement now passes transportRequest to adt-clients.
    • BDEF low test resilience: guaranteed BIMPL unlock via try/finally, delay after delete in cleanup, skip create if BDEF already exists (transport re-create limitation).
    • Removed duplicate GetFunction handler (delegates to GetFunctionModule).
    • Auto-detect JWT auth for --env-path, SAP_CLIENT auto-resolve.
  23. v4.1.1

    Fixes 1

    Notes
    Fixed
    • Unit test systemContext.test.ts updated to match SAP_SYSTEM_TYPE env var approach (removed obsolete isModernAdtSystem mock).
  24. v4.1.0

    Features 3, Changed 2, Fixes 2

    Notes
    Added
    • SAP_SYSTEM_TYPE environment variable (cloud | onprem | legacy) to explicitly control SAP system type. Default: cloud.
    • --system-type CLI argument as alternative to the env var.
    • Eager HTTP session initialization — connect() is now called for all connection types (not just RFC), establishing CSRF token and cookies before the first request.
    Changed
    • Removed unreliable auto-detection via /sap/bc/adt/core/discovery. System type is now determined solely by SAP_SYSTEM_TYPE.
    • Migration note: on-premise users must set SAP_SYSTEM_TYPE=onprem in .env to access on-premise-only tools (e.g., Programs).
    Fixed
    • 403 errors on first request to SAP systems (e.g., E96) that require pre-established session cookies.
    • Inconsistent legacy detection across different shell environments, proxy configs, and ICM sessions.
  25. v4.0.0dated in the atlas

    Breaking 3, Features 9, Changed 6, Fixes 7

    Notes
    Added
    • Legacy system support (BASIS < 7.50): automatic detection of legacy systems, AdtClientLegacy factory, RFC connection transport via SADT_REST_RFC_ENDPOINT.
    • RFC connection type: --connection-type=rfc CLI flag and SAP_CONNECTION_TYPE=rfc env var for legacy systems requiring SAP NW RFC SDK.
    • available_in mechanism: each handler's TOOL_DEFINITION declares supported environments (onprem, cloud, legacy). Unsupported tools are hidden from clients at registration time.
    • Legacy available_in on 102 handlers: Class, Interface, View, Program, Function Group/Module, Package (read/update/delete), Include, Unit Test, and common utilities.
    • FunctionGroup/FunctionModule on cloud: previously restricted to on-premise only.
    • Runtime profiling and dumps on cloud: class-based profiling now works on ABAP Cloud.
    • Shared dependencies management: npm run shared:setup / shared:teardown / shared:check for test objects.
    • Test infrastructure: test:init / test:reinit scripts, explicit connection config (env, system_type, connection_type) in test-config.yaml, available_in support in test cases for system-aware skipping.
    • AVAILABLE_TOOLS_LEGACY.md: generated documentation listing 115 legacy-compatible tools.
    Changed
    • BREAKING: Node 18 dropped — minimum Node.js version is now 20.0.0.
    • BREAKING: @mcp-abap-adt/adt-clients upgraded from 2.x to 3.11.2 (major API changes).
    • BREAKING: @mcp-abap-adt/connection upgraded to 1.5.3.
    • CI matrix: Node 20 + 25 on 3 OS for push/PR; Node 20/22/24/25 for release.
    • Guaranteed unlock: force-release DDIC locks, unlock-on-error in CreateDataElement/CreateDomain.
    • TADIR conflict retry: automatic retry on 409 TADIR conflict during create operations.
    Fixed
    • Circular reference in CDS unit test handlers.
    • i18n check handling (adt-clients 3.8.7).
    • MetadataExtension high/low test object conflicts (separate config keys).
    • Function test lock conflicts (separate high/low test objects).
    • Package tests use update() for lock/unlock.
    • Jest 30 deprecated --testPathPattern migrated to --testPathPatterns.
    • SAP_USER → SAP_USERNAME in configuration examples.
  26. v3.2.1

    Fixes 1

    Notes
    Fixed
    • Integration test cleanup: close MCP connections, reuse auth session, random ports.
  27. v3.2.0

    Features 1, Changed 1

    Notes
    Added
    • GetTableContents handler: fully implemented — was a stub returning "temporarily unavailable", now reads table data via ADT Data Preview API with field extraction and SQL query generation.
    Changed
    • parseSqlQueryXml: exported from handleGetSqlQuery for reuse in GetTableContents.
  28. v3.1.0

    Features 1, Fixes 3

    Notes
    Added
    • BehaviorImplementation low-level MCP tools: registered ValidateBehaviorImplementationLow, CreateBehaviorImplementationLow, LockBehaviorImplementationLow in LowLevelHandlersGroup.
    Fixed
    • System context not passed to AdtClient: createAdtClient() now forwards responsible and masterSystem from resolved system context to AdtClient options. Fixes package creation on BTP Cloud failing with "Enter a valid user, not , as the person responsible".
    • ValidatePackageLow schema: added missing super_package property to inputSchema.properties (was in required but not declared — MCP SDK rejected the parameter in hard mode).
    • CreatePackageLow handler: removed incorrect createResult check — AdtPackage.create() returns { errors: [] } without createResult (packages are containers with no response body).
  29. v3.0.0dated in the atlas

    Breaking 1, Changed 1

    Notes
    Changed
    • BREAKING: Separate Create and Update — Create handlers no longer accept source code. Use Update after Create to set source code.
  30. v2.7.5

    Fixes 1

    Notes
    Fixed
    • MCP Registry publish: sync server.json version with npm package version (2.5.2 → 2.7.5).
  31. v2.7.4

    Features 2

    Notes
    Added
    • System context HTTP headers for HTTP/SSE transport:
      • x-sap-master-system and x-sap-responsible headers allow per-request system context override.
      • Priority: HTTP headers → process.env → cloud getSystemInformation() API.
      • Enables on-prem transport request binding for HTTP/SSE connections without .env file.
    • System context cache isolation: cache is reset before each non-stdio request to prevent stale values leaking between requests targeting different SAP systems.
  32. v2.7.3

    Fixes 1

    Notes
    Fixed
    • Release workflow lint gate for v2.7.2:
      • Applied Biome formatting/import ordering fixes in updated hard-mode test infrastructure and integration suites.
      • Kept hard-mode behavior unchanged; this patch is focused on CI/release pipeline stability.
  33. v2.7.2

    Features 1, Fixes 2

    Notes
    Added
    • YAML-driven MCP hard mode test infrastructure:
      • Added environment.integration_hard_mode support for integration tests.
      • Added real MCP client execution path for stdio, sse, and http transports.
      • Added MCP CRUD smoke/matrix scripts in tools/.
    Fixed
    • Real MCP integration gaps in tests:
      • Lambda-based integration suites now support hard mode via real MCP tool calls.
      • LowTester hard mode now bootstraps MCP session (GetSession) so low-level lock/unlock flows receive required session_id.
      • Hard mode test object names now include per-run suffix to prevent object name collisions between runs.
    • System context bootstrap on server startup:
      • Launcher now hydrates on-prem system context env values earlier so real MCP runs consistently resolve context.
  34. v2.7.1

    Features 1

    Notes
    Added
    • SAP_MASTER_SYSTEM and SAP_RESPONSIBLE documented in CLI help (--help) and .env.example.
  35. v2.7.0

    Features 3, Changed 2

    Notes
    Added
    • System context support for on-premise systems (issue #11):
      • masterSystem and responsible are now passed to all ADT create/update XML requests via IAdtSystemContext.
      • On-prem resolution: SAP_MASTER_SYSTEM env var → getSystemInformation() API fallback (cloud).
      • Responsible resolution: SAP_RESPONSIBLE env var → SAP_USERNAME fallback → API.
      • Ensures correct transport request binding on on-premise systems.
    • New .env variables for on-premise configuration:
      • SAP_MASTER_SYSTEM — SAP system ID (e.g., E19, DEV). Required for on-prem create/update operations.
      • SAP_RESPONSIBLE — Responsible user (optional, falls back to SAP_USERNAME).
    • Test infrastructure: resolveTestSystemContext() resolves system context from YAML config for integration tests.
    Changed
    • Upgraded @mcp-abap-adt/adt-clients from ^2.0.0 to ^2.2.0.
    • Renamed default_system → default_master_system in test config template.
  36. v2.6.1

    Changed 1, Fixes 1

    Notes
    Fixed
    • UpdateProgram missing transport_request: Added transport_request to schema, interface, and .update() call — same fix as other handlers in 2.6.0.
    Changed
    • Upgraded @mcp-abap-adt/adt-clients to 1.2.2.
  37. v2.6.0

    Features 1, Changed 1, Fixes 1, Docs 1

    Notes
    Added
    • ListTransports tool (read-only):
      • Lists transport requests for the current or specified user.
      • Filters by modifiable status (default: modifiable only).
      • Use before create/update to find the correct transport request.
    Fixed
    • transportRequest forwarding in all high-level handlers (issue #11):
      • Create handlers now forward transportRequest to the internal update (PUT) step: CreateFunctionModule, CreateTable, CreateInterface, CreateView, CreateProgram, CreateDomain, CreateDataElement.
      • Standalone update handlers now forward transportRequest: UpdateStructure, UpdateDomain, UpdateServiceDefinition.
      • Added transport_request to tool schemas where it was missing: UpdateClass, UpdateView, UpdateBehaviorDefinition.
    Changed
    • Upgraded @mcp-abap-adt/adt-clients from 0.3.22 to 1.2.1.
    Documentation
    • Regenerated tools documentation:
      • docs/user-guide/AVAILABLE_TOOLS.md
      • docs/user-guide/AVAILABLE_TOOLS_HIGH.md
      • docs/user-guide/AVAILABLE_TOOLS_LOW.md
      • docs/user-guide/AVAILABLE_TOOLS_COMPACT.md
      • docs/user-guide/AVAILABLE_TOOLS_READONLY.md
  38. v2.5.2

    Features 2, Fixes 3, Docs 1

    Notes
    Fixed
    • --mcp precedence over local .env:
      • Fixed CLI fallback logic so .env from current working directory is no longer auto-loaded when --mcp=<destination> is provided.
      • Startup auth source display now correctly prioritizes service-key: <destination> over .env.
    • JWT auth error diagnostics:
      • Improved HTTP/SSE request-time error reporting for missing JWT tokens by surfacing token provider failure reason in BaseMcpServer.
    • Auth broker runtime behavior:
      • Fixed v2 auth-broker config to respect --unsafe instead of always forcing safe in-memory stores.
    Added
    • Browser OAuth callback port override:
      • Added --browser-auth-port=<port> and MCP_BROWSER_AUTH_PORT to override auth callback server port (useful when default ports are occupied).
    • Inspector runtime dependency safety:
      • Added explicit express-rate-limit dev dependency to avoid missing transitive package issues during dev:http inspector startup.
    Documentation
    • Updated auth and CLI docs for --mcp behavior and browser auth callback port override:
      • README.md
      • docs/user-guide/AUTHENTICATION.md
      • CLI help text via ServerConfigManager.
  39. v2.5.1

    Changed 2, Docs 1

    Notes
    Changed
    • Compact handler descriptions:
      • Reworked compact handler descriptions to be explicit and deterministic for tool routing.
      • Added per-object_type required parameter mapping directly in handler descriptions (TYPE(param*) format).
      • Clarified read vs validate intent to avoid HandlerGet / HandlerValidate confusion.
    • Compact schemas metadata:
      • Added missing parameter descriptions in compact schemas to remove No description in generated tool docs.
    Documentation
    • Regenerated tools documentation:
      • docs/user-guide/AVAILABLE_TOOLS.md
      • docs/user-guide/AVAILABLE_TOOLS_HIGH.md
      • docs/user-guide/AVAILABLE_TOOLS_COMPACT.md
  40. v2.5.0

    Features 2, Changed 1

    Notes
    Added
    • Compact facade CRUD routing:
      • Added compact facade CRUD operations routed by object_type.
      • Added compact router/matrix coverage for supported object/action combinations.
    • Compact lifecycle and test handlers:
      • Added compact handlers for validation, unlock, and unit test workflows.
    Changed
    • Compact routing architecture:
      • Removed legacy HandlerAction path and standardized on dedicated compact handlers.
  41. v2.4.2

    Features 2, Changed 2

    Notes
    Added
    • Service Binding high-level tools:
      • Added CreateServiceBinding, GetServiceBinding, UpdateServiceBinding, DeleteServiceBinding, ListServiceBindingTypes, ValidateServiceBinding.
      • Added serviceBindingPayloadUtils for response parsing/format normalization.
    • Runtime profiling tools:
      • Added RuntimeAnalyzeProfilerTrace, RuntimeRunClassWithProfiling, RuntimeRunProgramWithProfiling.
    Changed
    • System read-only handlers:
      • Migrated GetAllTypes, GetObjectStructure, and GetSqlQuery to AdtClient flow.
    • Lint/type hygiene:
      • Removed explicit any usage in new service binding/runtime handlers and high-level handler registrations.
  42. v2.4.1

    Changed 2, Fixes 2

    Notes
    Fixed
    • Dev HTTP/SSE launch scripts:
      • Fixed dist entry path to dist/server/launcher.js in tools/dev-http-v2.js and tools/dev-sse-v2.js.
      • Fixed dev:http transport argument to --transport=http.
    • HTTP/SSE server startup reliability:
      • Updated standalone server startup flow to listen on listening/error events, preventing false "started" logs followed by silent exits.
      • Kept strong server references in launcher to avoid premature process shutdown.
    Changed
    • Runtime profiling + dumps explorer:
      • Refocused tool workflow to class-based profiling run flow.
      • Improved ABAP user resolution/validation and diagnostics for dumps/traces filtering.
      • Improved object validation/update flow and trace feed handling in interactive tool.
    • Tools documentation:
      • Updated tools/README.md to reflect class-focused profiling flow and ABAP user resolution behavior.
  43. v2.4.0

    Features 2, Changed 2, Docs 2

    Notes
    Added
    • Runtime diagnostics tools:
      • Added runtime profiling tools: RuntimeCreateProfilerTraceParameters, RuntimeListProfilerTraceFiles, RuntimeGetProfilerTraceData.
      • Added runtime dump tools: RuntimeListDumps, RuntimeGetDumpById.
    • Architecture documentation:
      • Added comprehensive architecture document: docs/architecture/ARCHITECTURE.md.
    Changed
    • Runtime payload format:
      • Runtime profiling and dump handlers now return parsed JSON payloads (instead of raw XML strings in payload).
      • Runtime dump read uses dump_id input (RuntimeGetDumpById) instead of URI-based input.
    • Dependencies:
      • Updated @mcp-abap-adt/adt-clients to ^0.3.16.
    Documentation
    • Regenerated tools docs (docs/user-guide/AVAILABLE_TOOLS*.md) with runtime diagnostics tools.
    • Updated README.md feature list with runtime diagnostics capabilities.
  44. v2.3.1

    Fixes 3

    Notes
    Fixed
    • YAML config flag compatibility:
      • Added --conf support as an alias for --config in argument parsing.
      • Fixed YAML template flow: when config file is missing, template generation now exits cleanly instead of continuing into inspection-only mode.
    • YAML env config clarity:
      • Added env-path YAML option to map directly to --env-path.
      • Clarified env as destination name and removed duplicate allowed-origins entry in template.
    • HTTP/SSE connection context resolution:
      • Enforced priority: x-mcp-destination header -> server default destination (--mcp / --env-path) -> 400 error.
      • HTTP default-destination broker initialization now uses the resolved destination key.
  45. v2.3.0

    Changed 3, Docs 1

    Notes
    Changed
    • .env parsing policy:
      • Inline comments are no longer parsed from values.
      • # is treated as a comment only when it starts the line.
      • This avoids accidental truncation of secrets containing # (for example passwords/tokens).
    • Update tool error handling:
      • Added unified ADT/SAP error extraction for update handlers to improve 409 conflict diagnostics.
      • XML exception payloads (exc:exception) are now surfaced as detailed user-facing errors in previously generic update flows.
    • GetTypeInfo structure fallback:
      • Added optional structure lookup fallback (include_structure_fallback, default: true).
      • Fallback is executed only when type lookups return 404 or empty result.
      • Non-404 errors no longer silently fall through to unrelated lookups.
    Documentation
    • Updated .env comments guidance in:
      • README.md
      • docs/user-guide/AUTHENTICATION.md
  46. v2.2.7

    Fixes 1

    Notes
    Fixed
    • CI (Biome): Applied formatting fixes required by npx biome check src --diagnostic-level=error.
      • src/handlers/function_module/high/handleGetFunctionModule.ts
      • src/lib/config/envResolver.ts
  47. v2.2.6

    Changed 3

    Notes
    Changed
    • Function Module handlers: Fixed parameter propagation for function module operations:
      • GetFunctionModule and DeleteFunctionModule now require and pass function_group_name.
      • GetFunction (read-only) now requires and passes function_group.
      • UpdateFunctionModule (high/low) now forwards transport_request to ADT update calls.
    • CLI env resolution: Updated env argument behavior:
      • --env=<name> now resolves to platform sessions path: {sessions}/<name>.env.
      • Added --env-path=<path|file> for explicit .env file usage.
      • MCP_ENV_PATH now maps to explicit env file path behavior (same as --env-path).
    • Errors: Improved function module update error messages for transport-related 400 responses and XML SAP errors.
  48. v2.2.5

    Changed 3

    Notes
    Changed
    • Tools docs generator: Reworked tools/generate-tools-docs.js to scan only handler code in src/handlers/**.
    • Tools docs structure: Updated docs/user-guide/AVAILABLE_TOOLS.md hierarchy to Group (level) → Object (folder) → Tools.
    • Coverage fix: Ensured BDEF and other handler folders are included consistently in generated tools documentation.
  49. v2.2.4

    Changed 3

    Notes
    Changed
    • Discoverability metadata: Updated npm keywords and package metadata to improve MCP search relevance for ABAP, ABAP Cloud, JWT/XSUAA, and service-key flows.
    • Registry description: Shortened server.json description to meet the MCP publisher 100-character constraint.
    • README positioning: Clarified first-screen value proposition around full CRUD, On-Premise + ABAP Cloud support, and auth options.
  50. v2.2.3

    Features 1, Changed 3

    Notes
    Added
    • Docs: Added dedicated Terminology and Authentication guides, with links from README.
    Changed
    • README: Reworked first-screen content and links to emphasize configurator usage and destinations.
    • Docs structure: Moved GitHub configuration README into deployment docs and fixed internal links.
    • Client configuration docs: Linked to the configurator repo and usage guide.
  51. v2.2.2

    Features 3, Changed 4, Fixes 1

    Notes
    Added
    • Client support: Added OpenCode and Copilot configuration support.
    • Claude config: Added .mcp.json project configuration and docs.
    • Configurator options: Added URL, headers, and timeout options in mcp-abap-adt-configure.
    Changed
    • Configurator split: Removed mcp-abap-adt-configure from core. Use @mcp-abap-adt/configurator (repo: mcp-abap-adt-conf) with mcp-conf instead.
    • Codex/Goose handling: Improved transport handling and timeout defaults for non-stdio transports.
    • Default-disabled entries: Updated JSON config handling and docs to keep new entries disabled by default.
    • Streamable HTTP: Refactored server handling for per-request connections.
    Fixed
    • Goose config: Corrected enabled state handling in writeGooseConfig.
  52. v2.2.0

    Features 3, Changed 3

    Notes
    Added
    • MCP Registry metadata: Added server.json and mcpName for registry publishing.
    • Client configurator: Added mcp-abap-adt-configure to add/enable/disable/remove MCP entries across clients.
    • Auto-config docs: Added docs/installation/CLIENT_INSTALLERS.md with usage and common tasks.
    Changed
    • Default logger loading: Lazy-load logger to avoid bundler issues with optional transports.
    • Claude config: Write MCP settings under projects.<full_path>.mcpServers for Claude CLI on Linux.
    • Config defaults: New entries for Cline/Codex/Windsurf/Goose are disabled by default; enable explicitly.
  53. v2.1.7

    Fixes 1

    Notes
    Fixed
    • UpdateLocalTestClass: Added detailed SAP error information for 409 conflict errors to improve troubleshooting (#6)
  54. v2.1.6

    Changed 1, Fixes 1

    Notes
    Fixed
    • GetIncludesList, GetObjectsList, GetObjectsByType, GetEnhancements, GetObjectInfo: Migrate from deprecated fetchNodeStructure stub to AdtClient.getUtils().fetchNodeStructure() - fixes "not implemented" errors
    Changed
    • LowTester logging: Unified to compact format with emojis, matching LambdaTester output style
  55. v2.1.5

    Features 1

    Notes
    Added
    • Startup diagnostics: Display SAP connection configuration at server startup when using --env parameter
      • Shows source file, SAP URL, client, auth type, and UAA URL
      • Tokens and secrets are safely masked (first/last 4 chars for long values, full mask for short)
      • Helps diagnose auth issues by showing which config is actually used
  56. v2.1.4

    Fixes 1

    Notes
    Fixed
    • CreateLocalTestClass: Return full SAP error details on failure (including the original response payload).
  57. v2.1.3dated in the atlas

    Removed 3, Changed 2

    Notes
    Changed
    • Documentation: Restored the stateful ADT flow guide without file-based session persistence references.
    • Available tools: Regenerated docs/user-guide/AVAILABLE_TOOLS.md and restored links across docs.
    Removed
    • Lock/session persistence: Removed filesystem lock registry and session persistence helpers/config from core and tests.
    • CLI commands: adt-lock-object, adt-unlock-object, adt-manage-locks, adt-manage-sessions, and adt-unlock-objects removed from package bins.
    • User guides: Removed usage/scenario docs tied to legacy session flows.
  58. v2.1.2

    Removed 1, Changed 2

    Notes
    Changed
    • Lock registry types: LockState.objectType now uses AdtObjectType with normalization for legacy entries.
    • adt-lock-object: No longer registers lock handles in .locks/active-locks.json; session save only.
    Removed
    • CLI commands: adt-unlock-object, adt-manage-locks, adt-manage-sessions, and adt-unlock-objects removed from package bins.
  59. v2.1.1

    Changed 2

    Notes
    Changed
    • @mcp-abap-adt/auth-broker: bumped to ^0.3.0 - auto-detect service key format, credentials wrapper support, debug logging
    • @mcp-abap-adt/auth-stores: bumped to ^0.3.0
  60. v2.1.0

    Fixes 2

    Notes
    Fixed
    • Updated @mcp-abap-adt/auth-broker so installs now pull 0.2.17 instead of the stale 0.2.14 release that was hiding upstream fixes.
    • Removed the accidental @mcp-abap-adt/core dependency that caused consumers to download the old 1.4.1 tarball.
  61. v2.0.3

    Changed 1, Fixes 1

    Notes
    Changed
    • @mcp-abap-adt/auth-broker: bumped to 0.2.15 so the locked dependency pulls in the latest fixes referenced by the release.
    Fixed
    • CI workflow package install: .github/workflows/ci.yml now looks for mcp-abap-adt-core-*.tgz, matching the actual npm pack output before testing global install.
  62. v2.0.2

    Changed 1, Fixes 1

    Notes
    Changed
    • GetWhereUsed handler: Now uses getWhereUsedList() from adt-clients and returns parsed JSON with structured references instead of raw XML
    Fixed
    • Release workflow: Simplified to use npm registry instead of uploading tgz artifacts
  63. v2.0.1

    Docs 2

    Notes
    Documentation
    • Added glama.ai badge with security/license/quality grades
    • Updated README example to use EmbeddableMcpServer instead of deprecated HandlerExporter.registerOnServer()
  64. v2.0.0dated in the atlas

    Breaking 1, Removed 1, Features 1, Changed 1, Other

    Notes
    Added
    • EmbeddableMcpServer: New server class for external integration (e.g., cloud-llm-hub)
      • Accepts injected AbapConnection from consumer
      • Extends BaseMcpServer with proper handler registration
      • Configurable exposition levels: readonly, high, low, system, search
      • Export via @mcp-abap-adt/core/server
    Changed
    • HandlerExporter: Now serves only as registry factory
      • Use createRegistry() to get IHandlersRegistry for custom scenarios
      • getHandlerEntries() and getToolNames() still available for inspection
    Removed
    • BREAKING: HandlerExporter.registerOnServer() method removed
      • Had bug with handler signature (passed context twice)
      • Replace with EmbeddableMcpServer for cleaner architecture
    Migration Guide
    // Before (v1.x - broken)
    import { HandlerExporter } from '@mcp-abap-adt/core/handlers';
    const exporter = new HandlerExporter({ includeReadOnly: true, includeHighLevel: true });
    const mcpServer = new McpServer({ name: 'mcp-abap-adt', version: '1.0.0' });
    exporter.registerOnServer(mcpServer, () => connection, logger);
    
    // After (v2.x)
    import { EmbeddableMcpServer } from '@mcp-abap-adt/core/server';
    const server = new EmbeddableMcpServer({
      connection,
      logger,
      exposition: ['readonly', 'high'],
    });
    await server.connect(transport);
  65. v1.4.3

    Docs 3

    Notes
    Documentation
    • CLI Help: Extended --help output with comprehensive environment variables documentation
      • Added MCP Server Configuration section (MCP_TRANSPORT, MCP_HTTP_HOST, MCP_HTTP_PORT, MCP_SSE_HOST, MCP_SSE_PORT, MCP_ENV_PATH, MCP_UNSAFE, MCP_USE_AUTH_BROKER, MCP_BROWSER)
      • Added Debug Options section (DEBUG_HANDLERS, DEBUG_CONNECTORS, DEBUG_CONNECTION_MANAGER, HANDLER_LOG_SILENT)
      • Extended SAP Connection section with JWT/OAuth2 variables (SAP_REFRESH_TOKEN, SAP_UAA_URL, SAP_UAA_CLIENT_ID, SAP_UAA_CLIENT_SECRET, SAP_LANGUAGE)
    • CLI_OPTIONS.md: Added missing environment variables documentation
      • Added MCP_UNSAFE, MCP_USE_AUTH_BROKER, MCP_BROWSER to General section
      • Added JWT/OAuth2 authentication variables to SAP Connection section
      • New Auth-Broker section with AUTH_BROKER_PATH and debug variables
      • New Debug section with handler and connector logging options
    • INSTALLATION.md: Expanded Environment Variables section with full reference and link to CLI_OPTIONS.md
  66. v1.4.2

    Fixes 1

    Notes
    Fixed
    • Version path: Fixed incorrect path to package.json in --version command
  67. v1.4.1

    Features 4, Changed 2

    Notes
    Changed
    • Package renamed: Changed from @fr0ster/mcp-abap-adt to @mcp-abap-adt/core for npm publishing
    • Package now public: Removed private: true flag to allow npm publishing
    Added
    • Inspection-only mode: Server can now start in stdio mode without connection parameters for tool inspection (used by glama.ai)
    • MockAbapConnection: Added mock connection class for inspection-only mode that returns descriptive error when tools are executed
    • Docker inspection support: Added Dockerfile.inspect and docker-compose.inspect.yml for local testing of inspection mode
    • CLAUDE.md: Added project documentation for Claude Code assistance
  68. v1.3.0

    Features 3, Changed 4

    Notes
    Added
    • Added integration test tests/integration/handleGetFunction.int.test.js for handleGetFunction.
    • Significantly expanded integration test coverage in src/index.test.ts for all main tools (GetProgram, GetClass, GetFunctionGroup, GetFunction, GetTable, GetStructure, GetTableContents, GetPackage, GetInclude, GetTypeInfo, GetInterface, GetTransaction, GetEnhancements, GetSqlQuery, SearchObject).
    • Added new checks for advanced scenarios (e.g., SQL generation, error handling, enhancement XML parsing).
    Changed
    • Updated documentation regarding testing and integration scenarios.
  69. v1.2.9

    Removed 1, Features 1, Changed 3

    Notes
    Changed
    • v1 McpHandlers Refactoring: Rewrote McpHandlers to use HandlerExporter internally. This ensures the legacy embeddable server (v1) stays in sync with all tools available in v2 while reducing code duplication.
    • Shared Schema Utilities: Replaced duplicated jsonSchemaToZod logic in v1 with a central implementation from src/lib/handlers/utils/schemaUtils.ts.
    • Documentation Generator: Updated tools/generate-tools-docs.js category mapping to support the standardized GetBehaviorDefinition naming.
    Removed
    • GetBdef compatibility adapter: Removed the manual adapter for GetBdef in v1 server. All tools now use standard names (e.g., GetBehaviorDefinition).
    Added
    • tsx added to devDependencies for improved TypeScript execution and testing.
  70. v1.2.8

    Features 1, Changed 6, Fixes 4

    Notes
    Added
    • GetPackageContents tool: New read-only tool to retrieve objects inside an ABAP package (moved from legacy GetPackage).
    Changed
    • GetPackage tool: Migrated to high-level API (AdtClient.getPackage().read()). Now returns package metadata and supports version parameter (active/inactive).
    • GetFunction tool: Updated to support version parameter and migrated to new adt-clients signature.
    • High-level handlers: Improved parameter handling and consistency with new adt-clients versioning requirements.
    • Test cleanup documentation updated to clarify afterEach behavior and multi-object cleanup requirements.
    • Test runners (LowTester/HighTester) now emit step-level flow logs for validate/create/lock/update/unlock/activate.
    • Package cleanup can use a fresh connection with optional connection_config for locked session cases.
    Fixed
    • Package create now treats ADT "import" 404 as success when the package is readable.
    • Function group/module low-level create handles transient 400/empty responses with read verification.
    • Table create now validates and creates with explicit descriptions to satisfy ADT requirements.
    • Package low-level tests avoid double-unlock during cleanup.
  71. v1.2.7

    Changed 3, Fixes 3

    Notes
    Changed
    • GetPackageTree now builds the tree from node-structure traversal to preserve package/subpackage hierarchy and ordering.
    • Package tree nodes now include adtType, normalized type, codeFormat, and restoreStatus for parity with backup tooling.
    • Migrated handler usage to AdtClient now that CrudClient/ReadOnlyClient are removed in @mcp-abap-adt/adt-clients.
    Fixed
    • Updated handler typings to match @mcp-abap-adt/adt-clients@0.3.2 (I* config/state interfaces).
    • SearchObject now uses AdtUtils.searchObjects instead of the removed SharedBuilder export.
    • Restored encodeSapObjectName helper in utils to avoid relying on unstable client exports.
  72. v1.2.6

    Fixes 2

    Notes
    Fixed
    • Fixed LICENSE file - corrected copyright attribution (removed incorrect fork author)
    • Fixed TypeScript compilation errors in test files:
      • Updated handlers.test.ts to use high-level handlers instead of removed readonly handlers
      • Removed non-existent getAuthHeaders import from utils.test.ts
      • Fixed sessionHelpers.ts - added type assertions for connection methods not in IAbapConnection interface (getConfig, connect)
      • Fixed ClassCrudClientDirect.test.ts - added type assertions for connect() and reset() methods
      • Fixed BehaviorImplementationLowHandlers.test.ts - removed invalid session_id and session_state parameters from UnlockClassArgs
  73. v1.2.5

    Removed 1, Changed 1, Fixes 3

    Notes
    Removed
    • Removed duplicate readonly handlers that duplicate high-level CRUD operations
      • Deleted handleGetClass.ts (replaced by high-level GetClass)
      • Deleted handleGetDomain.ts (replaced by high-level GetDomain)
      • Deleted handleGetDataElement.ts (replaced by high-level GetDataElement)
      • Deleted handleGetTable.ts (replaced by high-level GetTable)
      • Deleted handleGetStructure.ts (replaced by high-level GetStructure)
      • Deleted handleGetView.ts (replaced by high-level GetView)
      • Deleted handleGetServiceDefinition.ts (replaced by high-level GetServiceDefinition)
      • Deleted handleGetProgram.ts (replaced by high-level GetProgram)
      • Deleted handleGetInterface.ts (replaced by high-level GetInterface)
      • Deleted handleGetFunctionGroup.ts (replaced by high-level GetFunctionGroup)
      • Deleted handleGetBdef.ts (replaced by high-level GetBehaviorDefinition)
    Changed
    • v1 server now uses high-level handlers instead of readonly duplicates
      • GetClass, GetDomain, GetDataElement, GetTable, GetStructure, GetView, GetServiceDefinition, GetProgram, GetInterface, GetFunctionGroup now use high-level handlers internally
      • GetBdef now uses GetBehaviorDefinition high-level handler with parameter adapter for backward compatibility
      • All high-level handlers support version parameter (active/inactive) for better flexibility
    Fixed
    • Fixed TypeScript type errors in handleGetAbapSystemSymbols.ts
      • Added proper JSON parsing for GetClass and GetInterface responses
      • Fixed type assertions for class and interface data
    • Fixed TypeScript type error in utils.ts
      • Added type assertion for makeAdtRequest return type
    • Fixed documentation generator (tools/generate-tools-docs.js)
      • Updated regex pattern to support multi-line imports in handler groups
      • Now correctly detects all handlers including system and search handlers
      • Documentation now includes all 219 tools (76 high-level, 116 low-level, 27 read-only)
  74. v1.2.4

    Features 2, Changed 1, Fixes 2, Dependencies 4

    Notes
    Changed
    • Migrated from ESLint+Prettier to Biome
      • Removed ESLint and Prettier dependencies
      • Added @biomejs/biome for faster linting and formatting
      • Configured Biome with strict rules for production code
      • Relaxed rules for test files (noImplicitAnyLet, noExplicitAny)
      • Updated package.json scripts: lint, lint:check, format
      • Updated npm run build to include Biome check before TypeScript compilation
    Fixed
    • Fixed TypeScript errors in production code:
      • handleGetAbapAST.ts - Fixed regex match types and while loop patterns in 4 methods
      • handleGetObjectInfo.ts - Added type annotation for packageName
      • handleDescribeByList.ts - Added type annotation for parsed
      • handleValidateDataElement.ts - Added type assertion for AxiosResponse
      • handleCreateClass.ts - Added ClassBuilderState type import
      • handleDeleteObject.ts - Changed any to unknown for response
      • handleGetEnhancementSpot.ts - Fixed array types and while loops
      • handleGetProgFullCode.ts - Fixed 3 while loops with regex.exec() pattern
    • All production code now passes strict Biome rules (no implicit any, no assignments in expressions)
    Added
    • Added Biome check to CI workflow (.github/workflows/ci.yml)
    • Added Biome check to Release workflow (.github/workflows/release.yml)
    Dependencies
    • Updated @mcp-abap-adt/adt-clients to ^0.2.6
    • Updated @mcp-abap-adt/adt-interfaces to ^0.2.6
    • Added @biomejs/biome ^2.3.10 as devDependency
    • Removed eslint and prettier dependencies
  75. v1.2.3

    Fixes 1

    Notes
    Fixed
    • Removed unused import of IAbapConnectionExtended from @mcp-abap-adt/interfaces
      • Interface was removed in interfaces package v1.1.0
  76. v1.2.2dated in the atlas

    Breaking 1, Removed 7, Features 1, Changed 1, Other

    Notes
    Changed
    • BREAKING: Removed legacy-server.ts
      • Full removal of 3000+ line legacy server with CLI, AuthBroker, .env parsing, etc.
      • v1 module now exports only lightweight EmbeddableMcpServer class
    Added
    • EmbeddableMcpServer - lightweight MCP server for embedding
      • Minimal class (~100 lines) for external HTTP server integration
      • Constructor takes context: HandlerContext with connection and logger
      • Handlers registered immediately in constructor - no run() method needed
      • Access underlying McpServer via .mcpServer getter
      • Configurable exposition levels: readonly, high, low, system
    Removed
    • mcp_abap_adt_server class (was 3000+ lines with CLI, transports, AuthBroker)
    • setAbapConnectionOverride() function
    • ServerOptions interface
    • All CLI argument parsing
    • All transport management (stdio, SSE, streamable-http)
    • AuthBroker integration
    • .env file loading logic
    Migration Guide

    For embedding in external servers (cloud-llm-hub, etc.):

    // Before (1.2.x)
    import { mcp_abap_adt_server } from '@fr0ster/mcp-abap-adt/server/v1';
    const server = new mcp_abap_adt_server({ connection, allowProcessExit: false });
    server.registerHandlers({ connection, logger });
    
    // After (1.2.2)
    import { EmbeddableMcpServer } from '@fr0ster/mcp-abap-adt/server/v1';
    const server = new EmbeddableMcpServer({
      context: { connection, logger },
      exposition: ['readonly', 'high']
    });
    const mcpServer = server.mcpServer; // Use with transport
  77. v1.2.1

    Features 1

    Notes
    Added
    • Subpath export ./utils for internal utilities access
      • @fr0ster/mcp-abap-adt/utils - exports sessionContext, getManagedConnection, and other utilities
      • Required for cloud-llm-hub integration to access session context
  78. v1.2.0

    Breaking 1, Features 3, Changed 2, Other 2

    Notes
    Changed
    • GetWhereUsed now supports any ADT object type (e.g. table/TABL, bdef/BDEF, etc.), not just class, program, include, function, interface, package.
    • Updated documentation in README.md and jsdoc for supported object types and usage examples.
  79. v1.1.32

    Features 1

    Notes
    Added
    • v2 HTTP Server Injection: Added support for external HTTP application injection in v2 servers
      • New IHttpApplication interface for Express-like HTTP applications
      • StreamableHttpServer and SseServer now support app option in constructor
      • New registerRoutes(app, options?) method for embedding into existing Express/CDS/CAP servers
      • Enables integration with cloud-llm-hub and other CAP-based applications
      • Helper methods: getPath(), getSsePath(), getPostPath()
  80. v1.1.31

    Fixes 1

    Notes
    Fixed
    • CLI --version flag: Fixed package.json path resolution for both v1 and v2 servers
      • Path now correctly resolves from dist/server/v1/ and dist/server/v2/ to root package.json
  81. v1.1.30

    Removed 3, Features 6, Changed 3, Fixes 3, Dependencies 6, Docs 6

    Notes
    Added
    • MCP Server v2 Architecture:

      • New modular server architecture with BaseMcpServer, StdioServer, StreamableHttpServer
      • Handler registration system with Dependency Injection pattern
      • HandlerContext for unified connection and logging access in handlers
      • ServerConfigManager for centralized configuration management
      • AuthBrokerConfig for V2 server configuration
      • StdioLogger for minimal logging in stdio transport
      • Transport-specific server implementations (stdio, SSE, HTTP)
    • Headless Browser Mode: Added --browser CLI parameter for SSH and remote sessions

      • --browser=headless: Logs authentication URL and waits for manual callback
      • --browser=none: Logs URL and rejects immediately (for automated tests)
      • --browser=system: Opens system default browser (default)
      • --browser=chrome|edge|firefox: Opens specific browser
      • Environment variable: MCP_BROWSER
      • Ideal for SSH sessions, Docker containers, and CI/CD environments
    • YAML Configuration Support:

      • Load server configuration from YAML files
      • Enhanced command-line transport handling
      • Improved configuration validation
    • Structured Logging:

      • Handler logging with configurable options and integration
      • Structured logging for handler functions
      • Logger cleanup and enhanced handler implementations
    • Testing Improvements:

      • Jest configuration and enhanced testing framework
      • Unified test refactoring roadmap with base tester classes
      • Integration tests for low-level view handlers
      • Read-only handler tests for WhereUsed analysis
      • AuthBrokerFactory for test configuration
    • Infrastructure & Handlers:

      • Added tabletypes to integrated terminal profiles
      • Handler migration to infrastructure module
      • Basic auth support in MCP destination handling
    Changed
    • Token Refresh Architecture (Breaking):

      • Removed legacy createDestinationAwareConnection() wrapper (~150 lines)
      • Token refresh now handled internally by JwtAbapConnection via DI ITokenRefresher
      • getConnectionForSession() creates tokenRefresher from AuthBroker and passes to createAbapConnection()
      • Removed all reset() calls from 23+ handler files (no longer needed)
      • Removed unused disposeConnection() and getAuthHeaders() functions
      • Simplified HandlerContext to use IAbapConnection instead of deprecated IAbapConnectionExtended
    • Handler Refactoring:

      • All handlers updated to utilize HandlerContext for connection and logging
      • Standardized import statements across handlers
      • Enhanced error handling and logging across all handlers
      • Replaced direct connection creation with managed connection
    • Configuration Module:

      • Extracted configuration logic into dedicated module
      • Improved YAML configuration loading and command line parsing
      • Enhanced connection handling and configuration validation
    Fixed
    • Network error handling in createDestinationAwareConnection
    • Handler results properly awaited and errors handled in BaseMcpServer
    • Basic auth support in MCP destination handling
    Removed
    • Legacy test files and deprecated test scripts (85 files)
    • Obsolete v2 components from earlier iterations
    • Deprecated tools: update-crudclient-api.js, update-handlers-with-tool-definitions.js, etc.
    Documentation
    • Comprehensive documentation for various components and usage scenarios
    • MCP Server architecture and implementation roadmap
    • Handler refactoring roadmap
    • YAML configuration support documentation
    • Issue roadmap system for structured issue tracking
    • Updated development guidelines
    Dependencies
    • @mcp-abap-adt/interfaces: ^0.2.3 → ^0.2.6
      • Removed deprecated IAbapConnectionExtended interface
      • Added ITokenRefresher interface for DI
    • @mcp-abap-adt/connection: ^0.2.3 → ^0.2.5
      • createAbapConnection() now accepts 4th parameter tokenRefresher
      • JwtAbapConnection handles token refresh internally
    • @mcp-abap-adt/auth-providers: ^0.2.1 → ^0.2.3 (headless mode, cross-platform fixes)
    • @mcp-abap-adt/auth-broker: ^0.2.4 → ^0.2.9
      • Added createTokenRefresher() factory method
      • Headless mode passthrough
    • @mcp-abap-adt/auth-stores: ^0.2.5 → ^0.2.8 (EnvFileSessionStore with JWT persistence)
    • @mcp-abap-adt/clients: ^0.2.4 → ^0.2.5
  82. v1.1.29

    Features 1, Docs 1

    Notes
    Added
    • Parameter Passing Unit Tests Roadmap: Added comprehensive roadmap for unit tests to verify parameter passing
      • Created doc/roadmaps/parameter_passing_unit_tests_roadmap.md
      • Detailed test strategy for verifying all parameters pass correctly from MCP handlers through CrudClient to Builder classes and finally to low-level functions
      • Test implementation plan with 4 phases covering infrastructure, individual object types, and integration tests
      • Test examples for ViewBuilder, CrudClient, and low-level functions
      • Coverage goals (100% for parameter passing) and success criteria
      • Addresses issue where parameters like transportRequest can be lost during the call chain
    Documentation
    • Roadmap Documentation: Added roadmap for future unit test development
      • Comprehensive plan for preventing parameter loss regression
      • Test file structure and organization guidelines
      • Maintenance and CI/CD integration recommendations
  83. v1.1.28

    Changed 2, Other 2

    Notes
    Changed
    • Header Constants Migration: Replaced all hardcoded header strings with constants from @mcp-abap-adt/interfaces
      • All header references now use constants (e.g., HEADER_SAP_URL, HEADER_SAP_AUTH_TYPE, HEADER_MCP_DESTINATION, etc.)
      • Improved type safety and consistency across packages
      • Updated error messages and hints to use header constants
    • Updated dependencies:
      • @mcp-abap-adt/header-validator: ^0.1.6 → ^0.1.7
        • Added comprehensive header sets documentation
        • Enhanced validation for Basic Auth and UAA refresh token sets
        • All header references migrated to constants from @mcp-abap-adt/interfaces
      • @mcp-abap-adt/interfaces: ^0.1.1 → ^0.1.2
        • Added HTTP header constants for all headers used across packages
        • Added header groups and authentication type constants
    Technical
    • Code Quality: Improved maintainability by centralizing header name definitions
    • Type Safety: Better compile-time checking for header names
  84. v1.1.27

    Changed 1

    Notes
    Changed
    • Updated dependencies:
      • @mcp-abap-adt/auth-broker: ^0.1.9 → ^0.1.10
        • Added constructor validation for stores and tokenProvider parameters
        • Ensures required dependencies are present upon AuthBroker instantiation
  85. v1.1.26

    Features 2, Changed 1, Fixes 1

    Notes
    Added
    • Comprehensive usage documentation – Added complete MCP function call documentation:
      • Created doc/user-guide/usage/ directory with structured documentation
      • Simple Objects (22 files): High-level and low-level handlers for 11 object types:
        • Classes, Interfaces, Programs, Function Groups, Function Modules
        • Tables, Structures, CDS Views, Domains, Data Elements, Service Definitions
        • Each object has separate -high.md and -low.md files with exact MCP call examples
      • RAP Business Objects documentation:
        • Complete workflow for creating RAP BO with all components
        • Deferred group activation guide
        • Step-by-step examples with exact MCP function calls
      • All documentation uses compact, laconic format with only exact MCP calls and parameters
      • No unnecessary descriptions, maximum clarity
    • Test syntax checking – Added npm run test:check command:
      • Performs TypeScript syntax check on test files without running tests
      • Uses tsc --noEmit -p tsconfig.test.json
      • Helps catch type errors before running tests
    Changed
    • Updated dependencies to latest versions:
      • @mcp-abap-adt/adt-clients: ^0.1.35 → ^0.1.36
      • @mcp-abap-adt/auth-broker: ^0.1.8 → ^0.1.9
      • @mcp-abap-adt/auth-providers: ^0.1.1 → ^0.1.2
      • @mcp-abap-adt/auth-stores: ^0.1.3 → ^0.1.4
      • @mcp-abap-adt/connection: ^0.1.14 → ^0.1.15
      • @mcp-abap-adt/header-validator: ^0.1.4 → ^0.1.6
      • @mcp-abap-adt/interfaces: ^0.1.1 (unchanged)
      • @mcp-abap-adt/logger: ^0.1.0 → ^0.1.1
    Fixed
    • TypeScript type errors in TableLowHandlers.test.ts – Fixed type inference issues:
      • Corrected lockSessionForCleanup variable declaration and usage
      • Fixed type narrowing in catch and finally blocks
  86. v1.1.25

    Features 1, Changed 1, Fixes 2, Docs 4

    Notes
    Added
    • --mcp=<destination> parameter – Default MCP destination name for auth-broker:
      • Allows using auth-broker (service keys) with stdio and SSE transports
      • When specified, this destination is used when x-mcp-destination header is not provided in requests
      • For stdio transport: Server initializes auth-broker with the specified destination at startup
      • For SSE transport: Server uses the specified destination as fallback when header is missing
      • For HTTP transport: Server uses the specified destination as fallback when header is missing
      • Example: mcp-abap-adt --transport=stdio --mcp=TRIAL
      • This enables auth-broker usage with stdio and SSE transports, which previously required .env file configuration
    Changed
    • Auth-broker support for stdio and SSE transports – Extended getOrCreateAuthBroker() to support stdio and SSE transports:
      • Previously, auth-broker was only available for HTTP/streamable-http transport
      • Now works with all transport types when --mcp parameter is specified
      • For stdio: Auth-broker is initialized at server startup with the destination from --mcp parameter
      • For SSE: Auth-broker works the same way as HTTP transport (via headers or --mcp fallback)
    Fixed
    • --mcp parameter now skips .env file loading – When --mcp is specified:
      • .env file is not automatically loaded (even if it exists in current directory)
      • .env file is not considered mandatory for stdio and SSE transports
      • Auth-broker configuration takes precedence over .env file
      • This ensures that --mcp parameter works correctly without conflicts from .env file settings
    • SSE transport with --mcp parameter – Fixed issue where SSE transport was using .env configuration instead of auth-broker when --mcp was specified:
      • Server now initializes auth-broker at startup for SSE transport when --mcp is provided
      • applyAuthHeaders() now handles empty headers correctly when defaultMcpDestination is set
      • Configuration from auth-broker takes precedence over .env file
    Documentation
    • Updated CLI_OPTIONS.md with --mcp parameter documentation and examples
    • Updated CLIENT_CONFIGURATION.md with information about using --mcp parameter for stdio and SSE transports
    • Added examples for Cline configuration with stdio transport and --mcp parameter
    • Updated help text in both src/index.ts and bin/mcp-abap-adt.js with --mcp parameter information
  87. v1.1.24

    Features 1, Changed 1, Dependencies 1

    Notes
    Changed
    • Safe session storage by default – Session data is now stored in-memory using SafeSessionStore by default:
      • Session tokens are no longer persisted to disk by default (secure by default)
      • Session data is lost after server restart (requires re-authentication)
      • Use --unsafe flag to enable file-based session storage (legacy behavior)
      • File-based storage (UnixFileSessionStore/WindowsFileSessionStore) is only used when --unsafe is specified
    Added
    • --unsafe flag – Enables file-based session storage (persists tokens to disk):
      • When specified, session data is saved to platform-specific locations:
        • Unix: ~/.config/mcp-abap-adt/sessions/{destination}.env
        • Windows: %USERPROFILE%\Documents\mcp-abap-adt\sessions\{destination}.env
      • Can be set via environment variable: MCP_UNSAFE=true
      • Use this flag if you need session persistence across server restarts
    Dependencies
    • Updated @mcp-abap-adt/auth-broker to ^0.1.5:
      • Benefits from new SafeSessionStore implementation (in-memory, secure)
      • Updated to use new ISessionStore interface (replaces SessionStore)
  88. v1.1.23

    Fixes 1

    Notes
    Fixed
    • Help text correction – fixed incorrect help message for x-mcp-destination header:
      • Removed incorrect statement that x-mcp-destination requires x-sap-url header
      • Updated help text to correctly state that URL is automatically derived from service key (same as x-sap-destination)
      • Help text now accurately reflects that x-sap-url is not required and will be ignored if provided
  89. v1.1.22

    Features 2, Dependencies 2

    Notes
    Dependencies
    • Updated @mcp-abap-adt/adt-clients to ^0.1.33:
      • Benefits from optimized CSRF token endpoint (/sap/bc/adt/core/discovery)
      • Faster connection initialization for all CRUD operations
    • Updated @mcp-abap-adt/auth-broker to ^0.1.4:
      • Benefits from optimized CSRF token endpoint in connection layer
      • Faster authentication flows when managing JWT tokens
    Added
    • ABAP Unit class test tools: Added [low-level] handlers to cover the new CrudClient APIs for class test includes and ABAP Unit orchestration:
      • LockClassTestClassesLow, UpdateClassTestClassesLow, UnlockClassTestClassesLow, ActivateClassTestClassesLow
      • RunClassUnitTestsLow, GetClassUnitTestStatusLow, GetClassUnitTestResultLow
      • All new tools live in class/low/ and are registered with the server and documentation generator.
    • Package creation options: CreatePackage (high- and low-level) now accepts optional package_type, software_component, transport_layer, application_component, and responsible parameters and forwards them directly to CrudClient, enabling Cloud systems to pass values such as ZLOCAL while keeping the transport layer empty.
  90. v1.1.21

    Features 4, Changed 2, Fixes 1, Dependencies 2

    Notes
    Fixed
    • x-mcp-destination validation – fixed issue where x-mcp-destination header was incorrectly requiring x-sap-url:
      • x-mcp-destination now works identically to x-sap-destination - URL is automatically derived from service key
      • x-sap-url is now optional for x-mcp-destination (and will be ignored with a warning if provided)
      • Fixed issue on Windows where x-mcp-destination was being ignored
      • Updated header validator to check headers in both lowercase and original case for better compatibility
    Added
    • Custom auth-broker path – added --auth-broker-path command-line option:

      • Allows specifying custom base path for service keys and sessions
      • Automatically creates service-keys and sessions subdirectories in the specified path
      • Example: --auth-broker-path=~/prj/tmp/ uses ~/prj/tmp/service-keys/ and ~/prj/tmp/sessions/
      • Directories are created automatically if they don't exist
      • Can be used together with --auth-broker flag
    • Automatic directory creation – service keys and sessions directories are now created automatically:

      • Directories are created at server startup if they don't exist
      • Prevents errors when saving sessions for the first time
      • Works for both default platform paths and custom --auth-broker-path
    • Enhanced startup information – improved auth-broker path display at server startup:

      • Shows all search paths for service keys (in order of priority)
      • Shows all save paths for sessions
      • Formatted with clear visual separators for better readability
      • Only displayed when --auth-broker flag is used
    • Diagnostic logging – added platform-aware logging for better debugging:

      • Logs platform information when processing authentication headers
      • Logs all header keys that start with x-sap or x-mcp
      • Logs search paths when creating AuthBroker instances
      • Helps diagnose issues on different platforms (especially Windows)
    Changed
    • Header validation logic – improved validation order and case handling:

      • x-mcp-destination is now checked immediately after x-sap-destination, regardless of x-sap-url presence
      • Added case-insensitive header checking for better compatibility
      • Both x-sap-destination and x-mcp-destination now check headers in both lowercase and original case
    • Documentation updates – comprehensive documentation improvements:

      • Added --auth-broker-path parameter documentation in help text
      • Updated CLIENT_CONFIGURATION.md with custom path examples
      • Updated INSTALLATION.md with new command-line option
      • Updated SERVICE_KEY_SETUP.md with custom path usage examples
      • Added Cline configuration example in help text
    Dependencies
    • Updated @mcp-abap-adt/auth-broker to ^0.1.3 – upgraded to latest version
    • Updated @mcp-abap-adt/header-validator to ^0.1.3 – upgraded to latest version
  91. v1.1.20

    Changed 1

    Notes
    Changed
    • Help documentation improvements – updated help messages with detailed instructions for saving service keys:
      • Added platform-specific instructions for Linux, macOS, and Windows
      • Replaced example JSON structure with instructions to copy service key from SAP BTP
      • Fixed backslash escaping in Windows PowerShell commands
      • Updated both launcher help (bin/mcp-abap-adt.js) and server help (src/index.ts)
      • Updated documentation files: SERVICE_KEY_SETUP.md and CLIENT_CONFIGURATION.md
  92. v1.1.19

    Features 2, Changed 5, Fixes 3

    Notes
    Changed
    • Handler refactoring – migrated handlers to use CrudClient and SharedBuilder from @mcp-abap-adt/adt-clients:

      • handleSearchObject now uses SharedBuilder.search() instead of manual URL construction
      • Eliminates redundant URL concatenation and potential duplication errors
      • Better code reuse and consistency across handlers
    • URL handling simplification – removed unnecessary URL cleaning logic:

      • URLs from .env files and service keys are expected to be clean
      • Removed aggressive URL cleaning that was causing issues
      • Only basic trimming is performed where needed
    • Transport-specific auth-broker handling – auth-broker is now ignored for stdio and sse transports:

      • AuthBroker initialization is skipped for non-HTTP transports
      • Prevents unnecessary errors and resource usage
      • .env file is used directly for stdio and sse transports
    Fixed
    • URL duplication in stdio transport – fixed incorrect URL formation when using stdio transport:
      • Resolved getaddrinfo ENOTFOUND ...comhttps errors
      • Proper URL handling in connection initialization
      • Correct .env file parsing for stdio mode
    Added
    • Lazy AuthBroker initialization – AuthBroker instances are now created on-demand per destination:

      • AuthBroker is only created when a destination is actually needed (not at server startup)
      • Each destination gets its own AuthBroker instance, cached in a map for reuse
      • Reduces memory usage and startup time when auth-broker is not needed
      • Default AuthBroker instance for non-destination requests
    • Improved method filtering – only tools/call requires SAP configuration:

      • All other MCP methods (tools/list, tools/get, initialize, ping, notifications/initialized, etc.) work without SAP config
      • Prevents unnecessary authentication errors for metadata requests
      • Better separation between metadata operations and actual tool execution
    Changed
    • AuthBroker instance management – switched from single instance to per-destination map:

      • authBrokers map stores AuthBroker instances keyed by destination name
      • defaultAuthBroker for requests without specific destination
      • Lazy initialization via getOrCreateAuthBroker() method
      • Better isolation between different destinations
    • Platform store imports – fixed ES module compatibility:

      • Replaced require() with static imports in getPlatformStores()
      • Fixes "UnixFileSessionStore is not a constructor" error
      • Proper ES module support for platform-specific stores
    Fixed
    • ES module compatibility – fixed "UnixFileSessionStore is not a constructor" error:

      • Changed getPlatformStores() to use static imports instead of require()
      • Properly handles ES module exports for Unix/Windows store implementations
      • AuthBroker now correctly initializes on Unix systems
    • Request processing logic – improved handling of requests that don't require SAP connection:

      • Only tools/call method triggers SAP configuration validation
      • All other methods bypass authentication checks
      • Prevents false errors for metadata and initialization requests
  93. v1.1.17

    Features 3, Changed 2, Fixes 2, Dependencies 1

    Notes
    Added
    • Cross-platform session storage – optional persistent session management:

      • Session storage now disabled by default (stateless mode)
      • Enable via MCP_ENABLE_SESSION_STORAGE=true environment variable
      • Custom session directory via MCP_SESSION_DIR=/path/to/sessions
      • Platform-specific defaults: Windows temp dir, /tmp on Linux, /var/folders on macOS
      • Prevents ENOENT errors when running from different working directories
    • Cline configuration documentation – comprehensive setup guide:

      • Created doc/installation/CLINE_CONFIGURATION.md with detailed configuration for all transport types
      • Added example configs in doc/installation/examples/ for NPX, global install, and local development
      • Platform-specific notes for macOS, Linux, and Windows
      • Session storage configuration examples and best practices
      • Troubleshooting guide for common connection issues
    • Cross-platform fixes documentation – created doc/development/CROSS_PLATFORM_FIXES.md:

      • Documented dotenv removal and stdio transport fixes
      • Cross-platform path handling with os.tmpdir() and path.join()
      • Platform-specific session storage locations
      • Testing instructions for all three transports (stdio, HTTP, SSE)
    Changed
    • Session storage architecture – improved reliability and cross-platform support:

      • Moved from relative .sessions path to absolute paths using os.tmpdir()
      • Session storage now optional and controlled by environment variables
      • Removed FileSessionStorage usage from individual handlers (e.g., handleDeletePackage)
      • All session management now centralized in connection manager (utils.ts)
    • Environment variable documentation – comprehensive env var reference:

      • Added table of all available environment variables in Cline configuration docs
      • Documented MCP_ENABLE_SESSION_STORAGE and MCP_SESSION_DIR usage
      • Platform-specific default values and examples
      • Guidance on when to enable/disable session storage
    Fixed
    • Session directory creation errors – fixed ENOENT: no such file or directory, mkdir '/.sessions':

      • Replaced relative .sessions path with absolute paths
      • Session directory now uses OS-specific temp directory by default
      • Works correctly when running as global npm package or via npx
      • No longer depends on current working directory
    • Handler session management – simplified connection handling:

      • Removed custom FileSessionStorage creation in handleDeletePackage
      • Deprecated force_new_connection parameter (now ignored)
      • All connections use centralized session management
      • Restart server to force new session instead of per-handler sessions
    Dependencies
    • No dependency changes in this release
  94. v1.1.16

    Removed 1, Changed 3, Fixes 1, Dependencies 2

    Notes
    Removed
    • dotenv dependency – completely removed dotenv package from dependencies:
      • Eliminated dotenv as a dependency to prevent stdout pollution in stdio mode
      • Resolved "[dotenv@17."... is not valid JSON error that was breaking stdio transport
      • Server now uses manual .env file parsing for all transport modes
    Changed
    • .env file parsing – replaced dotenv library with manual parsing:

      • Manual .env file parsing for all transport modes (stdio, http, sse)
      • Supports both Unix (\n) and Windows (\r\n) line endings
      • Handles comments, quoted values, and empty lines correctly
      • Cross-platform compatible (works on Linux, Windows, macOS)
      • No external dependencies for environment variable loading
    • stdio mode auto-detection – improved stdio mode detection:

      • Auto-detects stdio mode when stdin is not a TTY (piped by MCP Inspector or other tools)
      • Checks !process.stdin.isTTY in addition to command-line arguments and environment variables
      • Allows seamless connection from MCP Inspector and other stdio-based clients without explicit --transport=stdio flag
    • stderr handling in stdio mode – restored stderr for error logging:

      • Following reference implementation pattern, stderr is now available for error logging in stdio mode
      • stdout remains reserved exclusively for MCP JSON-RPC protocol
      • console.error() and console.warn() now work correctly in stdio mode (write to stderr)
    Fixed
    • stdio transport connection – fixed issue where server was not connecting properly in stdio mode:
      • Server now correctly detects stdio mode when launched by MCP Inspector
      • Tools are properly registered and available when connecting via stdio
      • Resolved connection issues that prevented tools from being listed
    Dependencies
    • Updated @mcp-abap-adt/connection to ^0.1.12:
      • Connection package no longer reads .env files or depends on dotenv
      • Consumers must pass SapConfig directly to connection constructors
    • Updated @mcp-abap-adt/adt-clients to ^0.1.27:
      • Updated to work with connection@0.1.12
      • Fixed example scripts to use manual .env parsing
  95. v1.1.15

    Fixes 1

    Notes
    Fixed
    • Git tag management – fixed issues with release tag creation and management:
      • Corrected tag placement on the latest commit with CHANGELOG updates
      • Ensured proper tag synchronization between local and remote repositories
      • Fixed tag deletion and recreation workflow for release management
  96. v1.1.14

    Features 1, Changed 2, Fixes 1

    Notes
    Added
    • Command-line flags --version/-v and --help/-h – added support for standard command-line flags:
      • --version or -v – displays package version and exits
      • --help or -h – displays help message and exits
      • Flags are processed before any other initialization, allowing quick version/help checks
    Changed
    • .env file search logic – improved .env file discovery and loading:

      • Search location: Now searches for .env file only in the current working directory (where the command is executed)
      • No recursive search: Removed fallback searches in parent directories or project root
      • Explicit path support: Still supports --env=/path/to/.env or MCP_ENV_PATH environment variable for custom locations
      • Cross-platform paths: Uses path.resolve() and path.join() for proper path handling on Windows, Linux, and macOS
    • Transport mode and .env file relationship – refined logic for transport mode selection and .env file requirements:

      • Default behavior: If transport is not explicitly specified and no .env file is found, server starts in HTTP mode (no .env required)
      • Explicit transport with .env: If transport is explicitly set to stdio or sse but .env file is missing, server exits with clear error message
      • Explicit transport without .env: If transport is explicitly set to http or streamable-http, server starts without .env file (as expected)
      • Error messages: Improved error messages that clearly indicate what transport mode requires .env file and how to specify custom .env location
    Fixed
    • Cross-platform compatibility – ensured all file path operations work correctly on Windows, Linux, and macOS:
      • All path operations use Node.js path module methods (path.join(), path.resolve(), path.isAbsolute())
      • Proper handling of Windows path separators (\) vs Unix path separators (/)
      • Version reading from package.json uses cross-platform path resolution
  97. v1.1.13

    Changed 1, Fixes 1, Dependencies 1

    Notes
    Fixed
    • Handler parameter schemas alignment with CrudClient – comprehensive fix to ensure all handler input schemas match actual CrudClient method parameters:
      • Data Element handlers:
        • Added type_name parameter to handleCreateDataElement schema (was missing but used in code)
        • Added search_help, search_help_parameter, set_get_parameter to handleUpdateDataElement schema (now properly passed to builder)
        • Updated field label descriptions to clarify they are applied during update step after creation
      • Domain handlers:
        • Removed unsupported parameters from handleCreateDomain low-level handler: domain_type, application, master_system, responsible
      • Program handlers:
        • Removed master_system and responsible from both high and low-level handlers (these are set automatically by system)
      • Class handlers:
        • Removed master_system and responsible from high-level handler schema (set automatically by system)
        • Removed master_system and responsible from low-level handler schema and code
      • Interface handlers:
        • Removed master_system and responsible from both high and low-level handlers (set automatically by system)
      • Structure, View, Table handlers:
        • Removed master_system and responsible from low-level create handlers (set automatically by system)
      • Behavior Definition, Metadata Extension handlers:
        • Removed master_system and responsible from low-level create handlers (set automatically by system)
      • Impact: All handler schemas now accurately reflect what parameters are actually supported and used by CrudClient methods, preventing confusion and ensuring correct API usage
    Changed
    • Data Element handlers – search help support – enhanced data element handlers to support search help configuration:
      • handleCreateDataElement now accepts search_help, search_help_parameter, set_get_parameter parameters
      • handleUpdateDataElement now accepts search_help, search_help_parameter, set_get_parameter parameters
      • These parameters are properly passed through to DataElementBuilder and included in update operations
      • Enables full configuration of search help and parameter settings for data elements
    Dependencies
    • Updated @mcp-abap-adt/adt-clients to ^0.1.26 – upgraded to latest version which includes:
      • Added searchHelp, searchHelpParameter, setGetParameter to DataElementBuilderConfig
      • Updated DataElementBuilder.update() to pass search help parameters to UpdateDataElementParams
      • Full support for search help configuration in data element operations
  98. v1.1.11

    Changed 1, Fixes 1, Dependencies 1, Docs 1, Other 1

    Notes
    Fixed
    • DomainHighHandlers - Update workflow detection bug – fixed critical issue where domain update operations were incorrectly using CREATE workflow instead of UPDATE workflow:
      • Root cause: DomainBuilder.update() method determines which workflow to use (CREATE vs UPDATE) by checking if this.state.createResult exists. When CrudClient.getDomainBuilder() reuses a builder instance from a previous createDomain() call, the builder still has createResult in its state, causing update() to incorrectly use CREATE workflow (upload() function) instead of UPDATE workflow (updateDomain() function).
      • Solution: Modified handleUpdateDomain to pass packageName directly to lockDomain() call, ensuring the builder is created with correct configuration from the start. This prevents builder reuse issues and ensures proper workflow detection.
      • Additional fix: Removed redundant validation step from handleUpdateDomain handler. The validation was checking if domain exists, but lockDomain() will fail if domain doesn't exist anyway, making the validation step unnecessary and potentially causing confusion.
      • Impact: Domain update operations now correctly use UPDATE workflow for existing domains, preventing "Domain already exists" errors that were occurring when the system tried to create an already-existing domain.
    Changed
    • DomainHighHandlers test logging – completely refactored test logging system for better information density and clarity:
      • Removed verbose debugLog() system – eliminated all debugLog() calls that were cluttering test output with verbose JSON structures and nested data objects
      • Introduced concise logging – replaced with simple, informative console.log() statements that provide clear, actionable information:
        • Clear operation names (e.g., "High Create: Creating domain...", "High Update: Updating domain...")
        • Success/failure status with object names
        • Skip reasons when tests are skipped
        • Visual infographics (emojis) for quick visual scanning of test output
      • Simplified error handling – removed redundant try-catch blocks and verbose error logging, now relies on Jest's native error handling which provides better stack traces
      • More informative output – each log statement now provides essential information (operation type, object name, status) without JSON noise
      • Consistent with other tests – matches logging patterns used in BehaviorDefinitionHighHandlers, PackageHighHandlers, and other high-level handler tests
      • Better maintainability – removed ~50 lines of verbose debug logging code, making tests easier to read and maintain
      • Improved debugging – concise logs make it easier to identify which operation failed and why, without scrolling through JSON dumps
    Dependencies
    • Updated @mcp-abap-adt/adt-clients to ^0.1.25 – upgraded to latest version which includes:
      • Improved DomainBuilder.update() workflow detection logic
      • Better handling of CREATE vs UPDATE workflow selection based on builder state
      • Enhanced error messages for domain operations
    Documentation
    • Test Issues Roadmap – comprehensive update to development roadmap:
      • Issue #10 (DomainHighHandlers) – changed status from "Expected Skip" to "Fixed" with detailed explanation
      • Updated statistics: 8 fixed issues (was 7), 1 expected skip (was 3)
      • Added detailed problem analysis: Documented root cause, solution approach, and code changes
      • Improved issue tracking: Better categorization of issues vs expected skips vs cloud limitations
    Development Process
    • Issue Roadmap System – introduced systematic problem analysis and resolution tracking:
      • New workflow: Test failures are now systematically analyzed and documented in doc/development/TEST_ISSUES_ROADMAP_*.md
      • Issue classification: Problems are categorized as Simple (⚡) or Complex (🔍), with clear distinction between real issues and expected skips
      • Problem analysis: Each issue includes detailed error messages, root cause analysis, solution approach, and code references
      • Progress tracking: Roadmap maintains statistics on fixed vs pending vs expected issues, providing clear visibility into test suite health
      • Solution documentation: All fixes are documented with code references, making it easier to understand what was changed and why
      • Continuous improvement: Roadmap is updated after each test run, ensuring it reflects current state and helps prioritize future work
      • Benefits: Enables faster problem resolution, prevents duplicate work, and provides historical context for similar issues
  99. v1.1.10

    Features 2, Changed 2, Fixes 1

    Notes
    Added
    • Client Connection Isolation: Implemented per-session connection isolation to prevent data mixing between different clients

      • Each client session now maintains its own isolated SAP connection based on sessionId and configuration hash
      • Connections are cached per unique combination of sessionId + sapUrl + authentication parameters
      • Uses AsyncLocalStorage to pass session context to handlers, ensuring each request uses the correct connection
      • Prevents race conditions where concurrent requests from different clients could overwrite each other's connection settings
      • Backward compatible: falls back to global connection cache for non-HTTP transports (stdio)
    • Non-Local Connection Restrictions: Added security restrictions for non-local connections

      • SSE Transport: Always restricted to localhost connections only (127.0.0.1, ::1, localhost)
      • HTTP Transport: Non-local connections are restricted when:
        • .env file exists (was found at startup)
        • AND request does not include SAP connection headers (x-sap-url, x-sap-auth-type)
      • Non-local connections with SAP headers are allowed (enables multi-tenant scenarios)
      • Local connections are always allowed regardless of .env file presence
      • Clear error messages guide users when connections are rejected
    Changed
    • Connection Management: Refactored getManagedConnection() to support session-based connection caching

      • Added generateConnectionCacheKey() function to create unique cache keys from sessionId and config signature
      • Implemented getConnectionForSession() to retrieve or create session-specific connections
      • Added automatic cleanup of old connection cache entries (older than 1 hour)
      • Each session uses unique sessionId for its AbapConnection to prevent session mixing
    • Session Tracking: Enhanced streamableHttpSessions to store SAP configuration per session

      • Added sapConfig field to session objects to track configuration per client
      • applyAuthHeaders() now stores configuration in session object
      • Session cleanup automatically removes associated connection from cache
    Security
    • Connection Isolation: Prevents one client from receiving another client's data when multiple clients connect to different SAP systems
    • Access Control: Restricts non-local access when .env file is present, requiring explicit SAP headers for remote connections
  100. v1.1.10

    Security 2, Features 2, Changed 2

    Notes
    Added
    • Client Connection Isolation: Implemented per-session connection isolation to prevent data mixing between different clients

      • Each client session now maintains its own isolated SAP connection based on sessionId and configuration hash
      • Connections are cached per unique combination of sessionId + sapUrl + authentication parameters
      • Uses AsyncLocalStorage to pass session context to handlers, ensuring each request uses the correct connection
      • Prevents race conditions where concurrent requests from different clients could overwrite each other's connection settings
      • Backward compatible: falls back to global connection cache for non-HTTP transports (stdio)
    • Non-Local Connection Restrictions: Added security restrictions for non-local connections

      • SSE Transport: Always restricted to localhost connections only (127.0.0.1, ::1, localhost)
      • HTTP Transport: Non-local connections are restricted when:
        • .env file exists (was found at startup)
        • AND request does not include SAP connection headers (x-sap-url, x-sap-auth-type)
      • Non-local connections with SAP headers are allowed (enables multi-tenant scenarios)
      • Local connections are always allowed regardless of .env file presence
      • Clear error messages guide users when connections are rejected
    Changed
    • Connection Management: Refactored getManagedConnection() to support session-based connection caching

      • Added generateConnectionCacheKey() function to create unique cache keys from sessionId and config signature
      • Implemented getConnectionForSession() to retrieve or create session-specific connections
      • Added automatic cleanup of old connection cache entries (older than 1 hour)
      • Each session uses unique sessionId for its AbapConnection to prevent session mixing
    • Session Tracking: Enhanced streamableHttpSessions to store SAP configuration per session

      • Added sapConfig field to session objects to track configuration per client
      • applyAuthHeaders() now stores configuration in session object
      • Session cleanup automatically removes associated connection from cache
    Security
    • Connection Isolation: Prevents one client from receiving another client's data when multiple clients connect to different SAP systems
    • Access Control: Restricts non-local access when .env file is present, requiring explicit SAP headers for remote connections
  101. v1.1.9

    Features 4, Changed 5, Docs 2

    Notes
    Added
    • DDLX (Metadata Extension) Management Tools:

      • CreateMetadataExtension: Create new ABAP Metadata Extensions (DDLX) with automatic activation
      • UpdateMetadataExtension: Update source code of existing Metadata Extensions
      • Full CRUD workflow: Create → Lock → Check → Unlock → Activate
      • Support for transport request validation
      • Integrated with CrudClient API for consistent behavior
    • BDEF (Behavior Definition) Management Tools:

      • CreateBehaviorDefinition: Create new ABAP Behavior Definitions (BDEF) with support for Managed, Unmanaged, Abstract, and Projection implementation types
      • UpdateBehaviorDefinition: Update source code of existing Behavior Definitions
      • Full CRUD workflow: Create → Lock → Check → Unlock → Activate
      • Support for root entity specification and implementation type selection
      • Transport request validation integrated
    • Full Low-Level CRUD Coverage:

      • Added dedicated create, lock, unlock, check, validate, delete, and update handlers for classes, programs, interfaces, function groups/modules, domains, data elements, packages, tables, views, structures, transports, and more to cover every CrudClient method.
      • Each handler now has a consistent naming scheme (CreateX, UpdateX, etc.) to match the high-level counterparts.
    • System Management Tools:

      • GetInactiveObjects: Retrieve list of inactive ABAP objects (objects that have been modified but not activated)
      • Provides count and detailed list of objects waiting for activation
      • Useful for monitoring development progress and identifying objects requiring attention
    Changed
    • Handler Organization Refactoring: All handlers reorganized into categorized subdirectories with explicit high/, low/, and readonly/ layers for better maintainability. Each low-level handler description now starts with [low-level], and every read handler was moved to the new readonly/ folders and tagged [read-only]. This improves discoverability, enforces single-responsibility boundaries, and makes it clear which tools mutate SAP data.

      • bdef/ - Behavior Definition handlers (GetBdef, CreateBehaviorDefinition, UpdateBehaviorDefinition)
      • class/ - Class handlers (GetClass, CreateClass, UpdateClass, ValidateClass, CheckClass)
      • common/ - Common handlers (ActivateObject, DeleteObject, CheckObject, LockObject, UnlockObject, ValidateObject)
      • data_element/ - Data Element handlers (GetDataElement, CreateDataElement, UpdateDataElement)
      • ddlx/ - Metadata Extension handlers (CreateMetadataExtension, UpdateMetadataExtension)
      • domain/ - Domain handlers (GetDomain, CreateDomain, UpdateDomain)
      • enhancement/ - Enhancement handlers (GetEnhancements, GetEnhancementImpl, GetEnhancementSpot)
      • function/ - Function handlers (GetFunction, GetFunctionGroup, CreateFunctionGroup, CreateFunctionModule, UpdateFunctionModule, ValidateFunctionModule, CheckFunctionModule)
      • include/ - Include handlers (GetInclude, GetIncludesList)
      • interface/ - Interface handlers (GetInterface, CreateInterface, UpdateInterface)
      • package/ - Package handlers (GetPackage, CreatePackage)
      • program/ - Program handlers (GetProgram, CreateProgram, UpdateProgram)
      • search/ - Search handlers (SearchObject, GetObjectsByType, GetObjectsList)
      • structure/ - Structure handlers (GetStructure, CreateStructure)
      • system/ - System handlers (GetTypeInfo, GetTransaction, GetSqlQuery, GetWhereUsed, GetObjectInfo, GetSession, GetAbapAST, GetAbapSemanticAnalysis, GetAbapSystemSymbols, GetAllTypes, GetObjectStructure, GetObjectNodeFromCache, GetInactiveObjects)
      • table/ - Table handlers (GetTable, GetTableContents, CreateTable, ValidateTable, CheckTable)
      • transport/ - Transport handlers (GetTransport, CreateTransport)
      • view/ - View handlers (GetView, CreateView, UpdateView)
      • This reorganization improves code navigation, reduces merge conflicts, and makes the codebase more maintainable
    • Dependencies Updated:

      • @mcp-abap-adt/adt-clients: ^0.1.9 → ^0.1.12
      • @mcp-abap-adt/connection: ^0.1.4 → ^0.1.9
      • Updated to leverage new CrudClient methods for DDLX and BDEF operations
    • Index and Tools Registry Updates:

      • src/index.ts: Updated all handler imports to reflect new subdirectory structure
      • src/lib/toolsRegistry.ts: Updated tool definitions imports to match new handler locations
      • All 81 handler files moved and imports updated consistently
    • Tooling Improvements:

      • tools/generate-tools-docs.js now outputs a navigation tree that mirrors the document structure, separates high-/low-/read-only tools, and adds summary counts for each level.
      • doc/user-guide/AVAILABLE_TOOLS.md regenerated to include the new navigation, level-specific anchors, and the [read-only] marker.
      • Test suite, configs, and helper scripts updated to follow the new directory layout and renamed high-level handlers (UpdateClass, UpdateProgram, etc.).
    • Low-Level Tool Names:

      • Every low-level handler now advertises a unique MCP tool name suffixed with Low (e.g., CreateClassLow, UpdateDomainLow, LockPackageLow). This prevents Tool <name> is already registered errors when both low/high versions exist and keeps the server compatible with clients that look up tools by name.
    Documentation
    • Added implementation_plan.md: Plan for future refactoring of read handlers to src/readers directory
    • Removed roadmap.md: Work items are complete, so the standalone roadmap is no longer required
  102. v1.1.8

    Notes

    Documentation for this tag is intentionally minimal; see the Git tag v1.1.8 for its exact contents.

  103. v1.1.6

    Docs 1

    Notes
    Documentation
    • Comprehensive CLI documentation: Added detailed documentation for all command line options and configuration
      • Updated README.md with global installation guide and CLI usage examples
      • Enhanced INSTALLATION.md with complete CLI options reference
      • Created new CLI_OPTIONS.md with comprehensive command line reference
      • Documented environment file priority and auto-discovery behavior
      • Added troubleshooting section for common CLI issues
  104. v1.1.5

    Features 1, Changed 1, Fixes 4

    Notes
    Added
    • --help flag: Added comprehensive help message showing all CLI options, environment variables, and usage examples
      • Shows transport options (stdio, http, sse)
      • Lists all HTTP and SSE configuration options
      • Documents SAP connection environment variables
      • Includes practical usage examples
    Fixed
    • Global installation .env loading: Fixed .env file discovery for globally installed packages
      • Now correctly prioritizes process.cwd()/.env (user's working directory) over package directory
      • Works correctly when installed via npm install -g
      • Better error messages showing current directory and suggesting --env flag
    • --env argument parsing: Fixed custom .env file path support
      • Both --env=/path/to/.env and --env /path/to/.env formats now work correctly
      • Relative paths are resolved from current working directory
      • Clear feedback messages showing which .env file is being used
    • Runtime dependencies: Moved dotenv from devDependencies to dependencies
      • Fixes "Cannot find module 'dotenv'" error when installed globally
      • Ensures all runtime dependencies are available in production
    Changed
    • All handlers refactored to use CrudClient – replaced Builder pattern with unified CrudClient API
      • 18 handlers converted: Create (Program, DataElement, Domain, FunctionGroup, FunctionModule, Package, Structure, Table, Transport, View), Update (ClassSource, DataElement, InterfaceSource), Check (Class, FunctionModule, Table, Object), Validate (Class, Object), Lock/Unlock (Object)
      • Removed direct Builder instantiation from all handlers
      • All CRUD operations now use CrudClient methods (createProgram, lockClass, updateInterface, etc.)
      • Session ID no longer exposed - internal to CrudClient implementation
      • Simplified error handling with try-catch around lock/update/unlock sequences
    Fixed
    • utils.ts deprecated methods – added TODO comments for missing ReadOnlyClient methods
      • fetchNodeStructure() - marked for future implementation
      • getSystemInformation() - marked for future implementation
      • Both throw errors with clear TODO messages instead of attempting non-existent method calls
  105. v1.1.3

    Features 1, Changed 1

    Notes
    Added
    • Parameter Optionality Sync Tool: Created tools/sync-optional-from-interfaces.js to extract optional parameter information from TypeScript interfaces
      • Extracts required vs optional fields from @mcp-abap-adt/adt-clients builder interfaces
      • Provides single source of truth for parameter optionality
      • Prevents drift between TypeScript interfaces and MCP tool definitions
      • Documentation added in doc/development/SYNC_OPTIONAL_PARAMS.md
    Changed
    • CreateDomain Handler: Synced parameter optionality with DomainBuilderConfig interface
      • Only domain_name is required (was incorrectly requiring package_name)
      • Marked all optional parameters with (optional) prefix in descriptions
      • Ensures consistency with TypeScript interface definitions
  106. v1.1.2

    Features 1, Fixes 1

    Notes
    Fixed
    • STDIO Transport: Fixed STDIO transport broken by mixing old Server and new McpServer APIs
      • Removed legacy Server class and setupHandlers() method
      • Unified all transports (STDIO, HTTP, SSE) to use single McpServer instance
      • Fixed STDIO connection to use mcpServer.server.connect(transport) pattern
      • Removed unused imports: Server, CallToolRequestSchema, ListToolsRequestSchema
    Added
    • SSE Development Tool: Created tools/dev-sse.js for proper SSE server development workflow
      • Launches SSE server on port 3001 (default)
      • Automatically starts MCP Inspector with correct SSE endpoint (http://localhost:3001/sse)
      • Mirrors dev-http.js functionality for consistent development experience
      • Updated npm run dev:sse to use new development script
  107. v1.4.0

    Features 6

    Notes
    Added
    • All MCP handler functions now support an optional filePath parameter. If provided, the handler will save the result to the specified file path (any absolute or relative path, with any extension).
    • All CLI test scripts now accept the --filePath=... argument to save the result to a file.
    • The result written to file is exactly what is returned to the user (no extra formatting or caching).
    • Improved error logging and debug output for file writing operations.
    • Updated documentation and usage examples in README.md to reflect new file output support.
    • Implemented utility writeResultToFile for safe file writing with directory restriction and logging.
  108. v1.3.0

    Features 3, Changed 1

    Notes
    Added
    • Added integration test tests/integration/handleGetFunction.int.test.js for handleGetFunction.
    • Significantly expanded integration test coverage in src/index.test.ts for all main tools (GetProgram, GetClass, GetFunctionGroup, GetFunction, GetTable, GetStructure, GetTableContents, GetPackage, GetInclude, GetTypeInfo, GetInterface, GetTransaction, GetEnhancements, GetSqlQuery, SearchObject).
    • Added new checks for advanced scenarios (e.g., SQL generation, error handling, enhancement XML parsing).
    Changed
    • Updated documentation regarding testing and integration scenarios.
  109. v1.2.0

    Changed 2

    Notes
    Changed
    • GetWhereUsed now supports any ADT object type (e.g. table/TABL, bdef/BDEF, etc.), not just class, program, include, function, interface, package.
    • Updated documentation in README.md and jsdoc for supported object types and usage examples.
  110. v1.1.0

    Features 1

    Notes
    Added
    • New GetTransaction tool to retrieve ABAP transaction details.
      • Allows fetching transaction details using the ADT endpoint /sap/bc/adt/repository/informationsystem/objectproperties/values.
      • Added documentation in README.md.
  111. v0.1.2

    Changed 4

    Notes
    Changed
    • Added Jest Test Script index.test.ts available through npm test
    • Enhanced makeAdtRequest method to support:
      • Custom headers through an optional parameter
      • Query parameters through an optional params parameter
    • Improved handleGetPackage method to use ADT's nodeContent API
      • Now uses POST request with proper XML payload
      • Added specific content type headers for nodeContent endpoint
      • Added filtering to return only objects with URI
    • Improved CSRF token handling in utils.ts
      • Added automatic CSRF token fetching for POST/PUT requests
      • Enhanced token extraction to work with error responses
      • Added cookie management for better session handling
      • Implemented singleton axios instance for consistent state
      • Added proper cleanup for test environments
  112. v0.1.1

    Features 1

    Notes
    Added
    • New GetInterface tool to retrieve ABAP interface source code
      • Allows fetching source code of ABAP interfaces using the ADT endpoint /sap/bc/adt/oo/interfaces/
      • Similar functionality to GetClass but for interfaces
      • Added documentation in README.md
  113. v0.1.0

    Features 4

    Notes
    Added
    • Initial release of the MCP ABAP ADT server
    • Basic ABAP object retrieval functionality
    • Support for programs, classes, function modules, and more
    • Documentation and setup instructions
735downloads per week, npm
Weekly downloads for @mcp-abap-adt/core26 complete calendar weeks from 2026-04-20 to 2026-10-18; the latest total is 735.20 Apr – 26 Apr: 76527 Apr – 3 May: 2344 May – 10 May: 31711 May – 17 May: 58818 May – 24 May: 90425 May – 31 May: 1,1461 Jun – 7 Jun: 6198 Jun – 14 Jun: 90415 Jun – 21 Jun: 1,16022 Jun – 28 Jun: 1,83729 Jun – 5 Jul: 1,6056 Jul – 12 Jul: 75913 Jul – 19 Jul: 1,26520 Jul – 26 Jul: 1,23627 Jul – 2 Aug: 5183 Aug – 9 Aug: 1,08510 Aug – 16 Aug: 1,37017 Aug – 23 Aug: 57524 Aug – 30 Aug: 60931 Aug – 6 Sept: 3807 Sept – 13 Sept: 52514 Sept – 20 Sept: 35221 Sept – 27 Sept: 40328 Sept – 4 Oct: 2,9705 Oct – 11 Oct: 1,88412 Oct – 18 Oct: 735
Agent access to your code
  1. @abap2ui5/mcp-serverMCP server for the abap2UI5 check, deploy and run loopfrom ABAP
  2. arc-1-bopf-enharc-1 extension for reading and maintaining BOPF enhancementsfrom ABAP
  3. HammerNative macOS code editor for ABAP and CDSfrom ABAP
  4. arc-1-lspEdition of ARC-1 that runs ADT calls through adt-lsfrom ABAP
  5. arc-1MCP server over the ADT REST API for ABAP objectsfrom ABAP
  6. arc1-abap-bridgeVS Code bridge between arc-1 and ADT for VS Codefrom ABAP
  7. arc1-adt-abap-mcp-extEclipse add-on enabling the ADT MCP server with read-only toolsfrom ABAP
  8. capforgeMCP server scaffolding CAP and CDS checked by cds compilefrom CAP
  9. ABAP Accelerator MCP ServerAWS's ABAP MCP server for Amazon Q Developer and Kirofrom ABAP
  10. Modernization Agents for SAP on AWSAWS agents for ABAP, PI/PO and BW modernisation workfrom ABAP
  11. @cap-js/mcp-serverMCP server for CAP development: model and docs searchfrom CAP
  12. chandrashekhar-mahajan/abap-mcp-serverABAP MCP server with ADT tools and five authentication strategiesfrom ABAP
  13. dassian-adtFork of mcp-abap-abap-adt-api with 25 tools and session recoveryfrom ABAP
  14. erpl-adtC++ binary speaking the ADT REST API as a CLI and MCP serverfrom ABAP
  15. bw-modeling-mcpMCP server for BW/4HANA modelling objectsfrom BTP/BAIP
  16. EPOD ADT MCP ServerMCP server for ABAP on the ADT session, in Eclipse or standalonefrom ABAP
  17. ZARC1_EXTENSION_FORMSarc-1 extension for SAPscript and Smart Forms objectsfrom ABAP
  18. fgalastri/MCP_ABAPValidates an ABAP class before it is deployed by converting the global class to a local one and syntax-checking that — plus CDS DDL and table metadata retrieval.from ABAP
  19. fr0ster/mcp-abap-adtABAP MCP server with full CRUD on on-premise and ABAP Cloudfrom ABAP
  20. abapsmithABAP MCP server over ADT with a local journal that can undo writesfrom ABAP
  21. sap-ai-dev-toolkitMCP proxy pinning an agent's ABAP tools to one SAP systemfrom ABAP
  22. aibap.mcpGo MCP server that writes, activates and runs ABAP classes via ADTfrom ABAP
  23. BellaEclipse plugin bringing Claude into ABAP Development Toolsfrom ABAP
  24. Maherd18/sap-mcp-serverPolicy-checked MCP server for ABAP development over ADTfrom ABAP
  25. sapdumpmcpMCP server reading ABAP short dumps over ADTfrom ABAP
  26. ABAP remote filesystemVS Code extension editing ABAP systems over ADT as a filesystemfrom ABAP
  27. mcp-abap-abap-adt-apiWrite-oriented MCP server over abap-adt-apifrom ABAP
  28. mcp-abap-adtRead-oriented MCP server fetching ABAP programs, classes, tablesfrom ABAP
  29. SAP MCP Connection ManagerWindows desktop manager handing SAP connections to assistants over MCPfrom ABAP
  30. ABAPilotMCP connector for ECC and on-premise S/4HANA with a licensed SAP sidefrom ABAP
  31. vibing-steampunkADT-to-MCP bridge in Go reaching past what ADT exposesfrom ABAP
  32. ADT MCP ServerLocal HTTP MCP server started from ABAP Development Tools for VS Codefrom ABAP
  33. ABAP Development Tools for VS CodeSAP's ABAP tools in VS Code for editing, debugging, ATC and transportsfrom ABAP
  34. SAP Joule for Developers, ABAP AI capabilitiesSAP's AI for ABAP development in ADT for Eclipse and VS Codefrom ABAP
  35. @sap/mdk-mcp-serverMCP server with five tools for Mobile Development Kit workfrom BTP/BAIP
  36. @sap-ux/fiori-mcp-serverMCP server for creating and editing Fiori applicationsfrom UI5
  37. ABAPDocMCPMCP server turning a transport request into a WRICEF specificationfrom ABAP
  38. claude-sap-kitClaude Code plugin adding Custom_* tools to arc-1from ABAP
  39. Skybuffer AI MCP serverABAP add-on serving business data and transactions as MCP toolsfrom ABAP
  40. @ui5/mcp-serverMCP server for UI5 development with ten toolsfrom UI5
  41. abap-adt-cliCLI that pulls and pushes ABAP packages as local files over ADTfrom ABAP
  42. workskong/mcp-abap-adtLight MCP adapter for ABAP over ADT, documented in Koreanfrom ABAP
  43. KlystronMCP server in ABAP inside the application server, with agent skillsfrom ABAP
  44. pyrfc-mcpMCP server calling RFC-enabled function modules behind an allowlistfrom ABAP
  45. ABAP-AI-CODE-TOOLSabapGit package adding create, modify and delete tools to ABAP AI Codefrom ABAP
  46. ABAP AI CodeAgentic coding assistant in ABAP that runs as an SAP GUI reportfrom ABAP
  47. VERTEXADT extension for Eclipse and VS Code showing three SAP GUI toolsfrom ABAP

Details

Sources4
sap-ai-mcp-serversdiscovered herechecked
npm registry, @mcp-abap-adt/coreversion, releases, installschecked
github.com/git+https://github.com/fr0ster/mcp-abap-adt.gittree, pushes, contributors, CIchecked
README.mdquoted, and what the entry declareschecked

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
runtimesnode
latestv20.1.0
first release
releases and cadence153, ~0d median
discovered viasap-ai-mcp-servers
first seen in the atlas
ecosystem and domainabap, ai-and-agents
Flavors2
ABAP Cloud
“Supports ABAP Cloud (BTP), On-Premise, and Legacy SAP systems.” — babamba2/abap-mcp-adt-powerup — READMEchecked
Standard ABAP
“Supports ABAP Cloud (BTP), On-Premise, and Legacy SAP systems.” — babamba2/abap-mcp-adt-powerup — READMEchecked
Contributors4

From the repository’s contributor list, .

History in the atlas2
  1. 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.
  2. First seen.
For your agent
Ref
artifact:babamba2-abap-mcp-adt-powerup
JSON
/artifacts/babamba2-abap-mcp-adt-powerup.json
MCP
Connecting an agent