Skip to main content
Glama
sangvucitek

Vibing Steampunk (vsp)

by sangvucitek

Vibing Steampunk (vsp)

AI-Agentic Development Unlocked for ABAP — ECC, S/4HANA, everywhere ADT is available.

ADT ↔ MCP Bridge: Gives Claude (and other AI assistants) full access to SAP ADT APIs. Read code, write code, debug, deploy, run tests — all through natural language (or DSL for automation).

See also: OData ↔ MCP Bridge for SAP data access.

Want to review or test? Start here: Reviewer Guide — 8 hands-on tasks, no SAP needed.

Vibing ABAP Developer

Hot Right Now

Package Analysis Suite

Five analysis commands that answer real questions about your ABAP packages:

vsp health --package '$ZDEV'                    # tests + ATC + boundaries + staleness
vsp health --package '$ZDEV' --report html      # full HTML report with details
vsp slim '$ZDEV' --level methods                # dead code detection (method-level)
vsp api-surface '$ZDEV' --include-subpackages   # Clean Core: which standard APIs do you use?
vsp boundaries '$ZDEV'                          # directional boundary crossing analysis
vsp boundaries '$ZDEV' --format mermaid         # visual graph with package subgraphs

Transport & Change History

vsp changelog '$ZDEV' --since 20260101          # what changed in this package?
vsp changes '$ZDEV' --attribute SAPTEST         # group transports by CR attribute (E070A)

Directional Boundary Crossings

Not just "crossed" or "not crossed" — which direction the dependency flows:

Direction

Meaning

Verdict

UPWARD

child → parent

OK

COMMON

anything → _00 package

OK

SIBLING

module → module

BAD — extract to common

DOWNWARD

parent → child

BAD — inverts hierarchy

EXTERNAL

cross-hierarchy

WARN — isolation violation

CIRCULAR

A→B + B→A siblings

BAD — coupled modules

Export to 7 formats: text, json, md, mermaid, html, dot (Graphviz), plantuml, graphml (Gephi/yEd).

Side Effect & LUW Analysis

The parser detects transactional patterns in ABAP source:

What

Detected

DB read/write

SELECT, INSERT, UPDATE, DELETE, MODIFY

LUW ownership

COMMIT WORK, ROLLBACK WORK

Deferred execution

IN UPDATE TASK, IN BACKGROUND TASK

Async

STARTING NEW TASK (aRFC), SUBMIT VIA JOB

External calls

RFC DESTINATION, HTTP client, APC/WebSocket

Transactions

CALL TRANSACTION, LEAVE TO TRANSACTION

Transformations

CALL TRANSFORMATION

LUW classification: safe / participant / owner / unsafe.

Health Reports

Full health reports with test details, ATC findings, and boundary crossings:

vsp health --package '$ZDEV' --details          # text with all details
vsp health --package '$ZDEV' --report md        # → _ZDEV.md
vsp health --package '$ZDEV' --report html      # → _ZDEV.html
vsp health --package '$ZDEV' --report my.html   # → my.html

Tests discover embedded local test classes across the full package hierarchy — the same as Eclipse Ctrl+Shift+F10.

More

  • vsp graph co-change CLAS ZCL_FOO for transport-based co-change analysis

  • vsp graph where-used-config ZKEKEKE for heuristic TVARVC usage discovery

  • .vsp.json transport_attribute for per-system CR correlation config

  • Analysis & Refactoring Guide for what these commands do

  • Graph Guide for examples, data sources, and current limits

0x101 Stars!

Read the latest article: VSP IS ONLY 5% EXPLORED — 257 stars, 147 tools, compilers, graph analysis, and why 95% of the surface is still unexplored.

Previous: Agentic ABAP at 100 Stars

What's New — Analysis & Intelligence Sprint

Sprint goal: move from CRUD tool to ABAP intelligence platform. Package-level analysis, directional boundary crossings, side effect detection, transport correlation.

The full version history is in CHANGELOG.md.

Recommended for most setups. Single SAP(action, target, params) tool replaces up to 147 individual tool definitions. Minimal token overhead, maximum capability.

SAP(action="read",   target="CLAS ZCL_TRAVEL")
SAP(action="edit",   target="CLAS ZCL_TRAVEL", params={"source": "..."})
SAP(action="create", target="DEVC", params={"name": "$ZOZIK", "description": "New pkg"})
SAP(action="help",   target="debug")

Metric

Focused (100 tools)

Expert (147 tools)

Hyperfocused (1 tool)

MCP schema tokens

~14,000

~40,000

~200

Reduction

99.5%

All safety controls (--read-only, --allowed-ops, --allowed-packages) work identically — the universal tool routes through the same handler → ADT client → checkSafety() chain.

Thanks to Filipp Gnilyak for the hyperfocused mode concept.

Context Compression — Built-in ABAP Understanding

GetSource auto-appends a compressed dependency prologue — public API signatures of every referenced class, interface, and FM. One MCP call = source + full surrounding context.

How it works:

graph LR
    A["GetSource<br/>ZCL_TRAVEL"] --> B["10 regex patterns<br/>scan source"]
    B --> C["TYPE REF TO<br/>NEW · => · ~<br/>INHERITING FROM<br/>INTERFACES<br/>CALL FUNCTION<br/>CAST · RAISING"]
    C --> D["Fetch deps<br/>5 parallel"]
    D --> E["Extract contract<br/>PUBLIC SECTION only"]
    E --> F["Source +<br/>Compressed Prologue"]

Compression by object type:

What

Keeps

Strips

Typical ratio

Class

CLASS DEFINITION + PUBLIC SECTION

Protected, Private, Implementation

7–30x

Interface

Full INTERFACE...ENDINTERFACE

1x (already compact)

Function Module

FUNCTION line + *" signature block

Body

5–15x

Real-world exampleZCL_ABAPGIT_ADT_LINK (abapGit codebase):

  • 8 dependencies detected → 8 resolved, 0 failed

  • Dependencies include: ZIF_ABAPGIT_DEFINITIONS (massive interface), ZCX_ABAPGIT_EXCEPTION, CL_WB_OBJECT (14 methods), IF_ADT_URI_MAPPER (8 methods), etc.

  • All compressed to public signatures only — no implementation bodies, no private sections

Method-Level Surgery — Read and Edit Individual Methods

Why pull an entire 1000-line class when you only need one 30-line method?

# Read just the FACTORIAL method — not the whole class
SAP(action="read", target="CLAS ZCL_CALCULATOR", params={"method": "FACTORIAL"})

# Edit just that method — vsp handles the rest
SAP(action="edit", target="CLAS ZCL_CALCULATOR", params={
  "method": "FACTORIAL",
  "source": "  METHOD factorial.\n    ...\n  ENDMETHOD."
})

What happens under the hood on edit:

sequenceDiagram
    participant LLM as AI Agent
    participant VSP as vsp
    participant SAP as SAP System

    LLM->>VSP: SAP(edit, CLAS ZCL_FOO, method=BAR, source=...)
    VSP->>SAP: GetClassMethods() → find BAR boundaries
    VSP->>SAP: GetClassSource() → full class
    Note over VSP: Replace lines 42-58<br/>with new METHOD block
    VSP->>SAP: SyntaxCheck(full reconstructed source)
    VSP->>SAP: Lock → UpdateSource → Unlock → Activate
    VSP->>LLM: ✓ Method BAR updated, class activated

The AI only sends/receives the method block (~30 lines). vsp fetches the full class internally, splices in the new method at the right line range, validates, and pushes back. 95% token reduction vs full-class round-trips.

Context compression scopes to the method too — when reading a single method, dependency analysis runs on that method's code only, so the prologue contains exactly the types and interfaces relevant to the method you're working on, not the entire class's dependency tree.

Operation

Tokens (full class)

Tokens (method-level)

Savings

Read source

~1,000

~50

20x

Read + context

~1,600

~250

6x

Edit round-trip

~2,000

~100

20x

Built-in ABAP parser based on abaplint by Lars Hvam — the same parser that powers abaplint's 392 ABAP statement types.

Native Go ABAP Lexer — abaplint in Go

The abaplint lexer has been mechanically ported from TypeScript to native Go (pkg/abaplint). This is the same lexer that powers abaplint — 48 token types, all 6 lexer modes (normal, string, backtick, template, comment, pragma), with full whitespace-context encoding.

Verified via oracle-based differential testing against the real TypeScript abaplint:

=== DIFFERENTIAL KPI ===
Files:   29/29 passed (100.0%)
Tokens:  22,612 total
  Full match:  22,612 (100.0%)  — str + type + row + col
  Str match:   22,612 (100.0%)
  Type match:  22,612 (100.0%)
  Pos match:   22,612 (100.0%)

Zero dependencies, zero FFI. Pure Go, ~3.5M tokens/sec, ready for lint rules in Phase 2.

ABAP LSP — Real-Time Diagnostics

vsp lsp --stdio gives Claude Code (and other editors) automatic error detection and navigation for ABAP files. No explicit tool calls — the LSP pushes diagnostics on every save and compressed dependency context on file open.

See LSP setup for configuration.

WASM-to-ABAP Compiler (Research)

Compile WebAssembly binaries to native ABAP — advanced prototype, verified on selected corpora. Three paths:

.wasm binary → pkg/wasmcomp (Go)  → ABAP source files     ← AOT compiler
.ts source   → pkg/ts2abap (Go)   → clean OO ABAP classes  ← direct transpiler
.wasm binary → zcl_wasm_compiler  → ABAP (on SAP itself!)  ← self-hosting, 785 lines

Demonstrated on SAP A4H: QuickJS (1,410 functions) compiled to 101K lines ABAP. abaplint parser (26.5MB) compiled to 396K lines. Self-hosting compiler parses WASM, generates ABAP, and executes via GENERATE SUBROUTINE POOL — all within SAP. This is research/prototype work, not a production-ready toolchain.

What

Size

Status

QuickJS → ABAP

101K lines

Compiled

abaplint → ABAP

396K lines

Compiled

abaplint lexer (TS→ABAP)

495 lines

Running on SAP

Self-hosting compiler

785 lines

Running on SAP

Batch deploy

vsp deploy *.clas.abap

40 classes, 0 failures

Branch: feat/wasm-abap. See reports/2026-03-20-001 for full details.

Full CLI Toolchain — SAP from the Terminal

35+ commands. No SAP GUI, no Eclipse, no IDE. Most work with standard ADT; lint/parse/compile work fully offline.

# Package analysis
vsp health --package '$ZDEV'                     # tests + ATC + boundaries + staleness
vsp health --package '$ZDEV' --report html       # full HTML report
vsp slim '$ZDEV' --level methods                 # dead code detection
vsp api-surface '$ZDEV' --include-subpackages    # Clean Core API inventory
vsp boundaries '$ZDEV' --format mermaid          # boundary crossings (visual)
vsp boundaries '$ZDEV' --report dot              # Graphviz export
vsp changelog '$ZDEV' --since 20260101           # transport history
vsp changes '$ZDEV' --attribute SAPTEST          # CR-level grouping

# Graph & dependencies
vsp graph CLAS ZCL_FOO --direction callers       # who uses this class?
vsp graph co-change CLAS ZCL_FOO                 # transport-based co-change
vsp graph where-used-config ZKEKEKE              # TVARVC readers (heuristic)

# Source & editing
vsp source CLAS ZCL_MY_CLASS                     # read source
vsp source CLAS ZCL_MY_CLASS --method GET_DATA   # read single method
vsp context CLAS ZCL_FOO --depth 2               # source + dependency contracts
vsp analyze ZCL_MY_CLASS                         # 13 lint rules (offline)

# Tables & search
vsp query T000 --top 5                           # query any table
vsp search "ZCL_*" --type CLAS --max 50          # object search
vsp grep "SELECT.*mara" --package '$TMP'         # source code search

# Testing & quality
vsp test --package '$ZDEV'                       # run unit tests
vsp atc CLAS ZCL_MY_CLASS                        # ATC code check

# Deployment & tooling
vsp deploy zcl_test.clas.abap '$TMP'             # deploy file to SAP
vsp export '$ZORK' '$ZLLM' -o packages.zip       # export abapGit ZIP
vsp install abapgit                              # install abapGit on SAP
vsp install zadt-vsp                             # install ZADT_VSP handler

# Offline tools
vsp lint --file myclass.clas.abap                # offline ABAP linter
vsp parse --stdin --format json < source.abap    # ABAP parser
vsp compile wasm program.wasm --class ZCL_DEMO   # WASM→ABAP compiler

See CLI Guide for the complete reference with feature requirements matrix.

Other Highlights

  • Lua Scripting Engine: vsp lua — interactive REPL + scripts with 50+ SAP bindings. Query tables, lint code, parse ABAP, debug with breakpoints, record execution, replay state. See example scripts.

  • YAML Workflows: vsp workflow run pipeline.yaml — CI/CD automation with variable substitution, step chaining, and error handling. See example workflows.

  • Bootstrap from CLI: vsp install abapgit + vsp install zadt-vsp — deploy dependencies to SAP systems directly from the command line. No SAP GUI needed.

Key Features

Feature

Description

Package Health

vsp health — tests, ATC, boundary crossings, staleness in one report (text/md/html)

Dead Code Detection

vsp slim — method-level dead/internal/live classification via WBCROSSGT reverse refs

Boundary Analysis

vsp boundaries — directional crossings (UPWARD/SIBLING/DOWNWARD/EXTERNAL/CIRCULAR)

Side Effect Detection

DB read/write, COMMIT/ROLLBACK, UPDATE TASK, RFC, async — LUW classification

Transport History

vsp changelog + vsp changes — transport correlation and CR-level grouping

API Surface

vsp api-surface — Clean Core inventory: which standard APIs does your code use?

Graph Export

7 formats: mermaid, HTML, DOT (Graphviz), PlantUML, GraphML (Gephi), JSON, MD

Static Analysis

vsp analyze — 13 lint rules in pure Go, no external dependencies

Hyperfocused Mode

1 universal SAP tool, ~200 tokens vs ~40K for 147 tools

Context Compression

Auto-compressed dependency contracts — 7–30x compression, built-in ABAP parser

Method-Level Surgery

Read/edit individual methods — 95% token reduction vs full-class round-trips

ABAP LSP

Built-in Language Server — real-time diagnostics, go-to-definition, context push

AI Debugger

Breakpoints, listener, attach, step, inspect stack & variables

RAP OData E2E

Create CDS views, Service Definitions, Bindings → Publish OData services

AI-Powered RCA

Root cause analysis with dumps, traces, profiler + code intelligence

DSL & Workflows

Fluent Go API + YAML automation for CI/CD pipelines

File Deployment

Bypass token limits — deploy large files directly from filesystem

Surgical Edits

EditSource tool matches Claude's Edit pattern for precise changes

Quick Start

#Download binary from releases
curl -LO https://github.com/oisee/vibing-steampunk/releases/latest/download/vsp-linux-amd64
chmod +x vsp-linux-amd64

#Or build from source
git clone https://github.com/oisee/vibing-steampunk.git && cd vibing-steampunk
make build

Windows 11 with VS Code + Claude Code extension:

1. Get the latest vsp release:

https://github.com/oisee/vibing-steampunk/releases.

If you have trouble downloading executable files in your browser, use curl -o url or wget to download the file. Name the file vsp.exe.

Put the file in a local folder and open the folder in VS Code.

Add the vsp folder to your PATH environment variable for your user. Either through command line or Windows Registry Editor regedit. Add the vsp folder to KEY_CURRENT_USER\Environment\Path.

Restart your VS Code to recognize the updated PATH before progressing to the next steps.

2. Initialize the config files:

Open a terminal in VS Code, then run ./vsp config init to create config template files:

  • .env.example

  • .vsp.json.example

  • .mcp.json.example

3. Adjust your config files:

Make sure you delete the comment lines. Refer to the example files in this README.

4. Set up authentication

For basic auth: Set up a password for your user to allow for basic authentication. Go to SU01 > Logon Data, generate an initial password. Then log in again (without SNC/SSO in SAPGUI) and change the initial password. You are now set up for basic authentication via config file in vsp. Set your environment variables SAP_USER and SAP_PASSWORD accordingly.

You now need to obtain the SAP hostname for your SAP_URL environment variable: Log in to any web-based application (e.g. Fiori Launchpad) and obtain the URL from your browser. Attention: SAP_URL is not not your message/group server from SAP Logon!

Alternatively use cookie authentication: If you cannot set a password for your user, you may still use cookie authentication to access your SAP system from vsp.

Extract cookies manually and save them in cookies.txt in your vsp folder. Use cookies SAP_SESSIONID_SYS_CLI and sap-usercontext on your previously determined URL (caution: use https:// prefix for secure connections). Refer to below guide on how to manually extract cookies from your browser.

Template cookie file:

# Netscape HTTP Cookie File
# https://curl.haxx.se/rfc/cookie_spec.html

https://your.domain.com	FALSE	/	TRUE	0	SAP_SESSIONID_SYS_CLI  YOUR_CONTENT
https://your.domain.com	FALSE	/	TRUE	0	sap-usercontext        YOUR_CONTENT

Replace the hostname, SYS with your system ID (e.g. DS1) and CLI with your client number (e.g. 100).

For BTP/Cloud based systems: Use cookies __VCAP_ID__ and JSESSIONID on your domain https://xyz.ondemand.com. This also works for BTP trial accounts. Also refer to this article.

Obtaining cookies from your browser session:

The easiest way to do so is to use Edge as it allows you to display cookie contents from its settings page. From there you can copy & paste them into the newly created cookies.txt file.

Open any transaction in WebDynpro or Fiori Launchpad. For older environments like ECC it should work with BRF+ transactions that open in a browser. Login with your credentials. Once logged in it’s a matter of extracting the created session cookies.

In Edge, go to Settings > Privacy, search and services > Cookies > See all cookies and site data. Search for your top-level domain. There should be two cookies for your system as described above (SAP_SESSIONID and sap-usercontext or VCAP_ID and JSESSIONID if your system is cloud-based). Copy the content values for each cookie to your local file and save.

The created cookies are session cookies. They will eventually expire after a timeout and the values in cookies.txt need to be updated. Usually Claude will tell you if this is the case.

5. Test the connection:

Use the terminal with this command: ./vsp -s dev search "zcl_*" --type CLAS --max 50.

You will get prompted with a list of found objects if the connection could be established.

CLI Coding Agents

VSP works with 8 CLI coding agents — not just Claude! Full setup guides with config templates:

Agent

Model Access

Availability

Config

Gemini CLI

Gemini models

Free tier available; paid/API-backed usage also available

.gemini/settings.json

Claude Code

Claude models

Paid usage or subscription-backed access

.mcp.json

GitHub Copilot

Multi-model (plan-dependent)

Free tier available; paid plans unlock more limits/models

.copilot/mcp-config.json

OpenAI Codex

OpenAI coding models / ChatGPT-linked access

Limited or plan-dependent access; API usage also available

codex.toml

Qwen Code

Qwen models

Free tier available; BYOK/API-backed usage also available

.qwen/settings.json

OpenCode

Multi-provider BYOK

Depends on your provider/account

opencode.json

Goose

Multi-provider BYOK

Depends on your provider/account

~/.config/goose/config.yaml

Mistral Vibe

Mistral API or local models

Local/Ollama path can be free; API usage is provider-billed

.vibe/config.toml

Availability, pricing, and model lineups change quickly. Check the linked agent guides and official product docs before copying limits or plan claims into downstream docs.

Full setup guide with config examples | Русский | Українська | Español

For the new graph analysis capabilities, see Graph Guide.

CLI Mode

vsp works in two modes:

  1. MCP Server Mode (default) - Exposes tools via Model Context Protocol for Claude

  2. CLI Mode - Direct command-line operations without MCP

CLI Commands

# Source operations
vsp -s a4h source CLAS ZCL_MY_CLASS              # read source
vsp -s a4h source read CLAS ZCL_MY_CLASS          # same, explicit
vsp -s a4h source write CLAS ZCL_FOO < file.abap  # write from stdin
vsp -s a4h source edit CLAS ZCL_FOO --old "X" --new "Y"  # surgical edit
vsp -s a4h source context CLAS ZCL_FOO            # source + dependency contracts
vsp -s a4h context CLAS ZCL_FOO                   # shortcut for above

# Search
vsp -s a4h search "ZCL_*"
vsp -s dev search "Z*ORDER*" --type CLAS --max 50

# Graph analysis
vsp -s a4h graph CLAS ZCL_FOO                      # call graph
vsp -s a4h graph co-change CLAS ZCL_FOO           # transport-based co-change
vsp -s a4h graph co-change PROG ZREPORT --format json
vsp -s a4h graph where-used-config ZKEKEKE        # TVARVC readers (heuristic)
vsp -s a4h graph where-used-config ZKEKEKE --format mermaid > config.mmd

# Testing & code quality
vsp -s a4h test CLAS ZCL_MY_CLASS                 # run unit tests
vsp -s a4h test --package '$TMP'                  # package-level tests
vsp -s a4h atc CLAS ZCL_MY_CLASS                  # ATC code check

# Deployment
vsp -s a4h deploy zcl_test.clas.abap '$TMP'       # deploy file to SAP
vsp -s a4h export '$ZORK' '$ZLLM' -o packages.zip # export abapGit ZIP

# Bootstrap SAP system (no SAP GUI needed)
vsp -s a4h install abapgit                        # install abapGit
vsp -s a4h install zadt-vsp                       # install ZADT_VSP handler
vsp -s a4h install abapgit --edition full         # full dev edition (576 objects)
vsp -s a4h install list                           # show installable components

# Transport management
vsp -s a4h transport list                         # list transports
vsp -s a4h transport get A4HK900094               # transport details

# System management
vsp systems                                       # list configured systems
vsp config init                                   # create example configs

# Start ABAP LSP server (for Claude Code / editors)
vsp lsp --stdio

Graph-MVP highlights:

  • vsp graph co-change <type> <name> for transport-based co-change analysis

  • vsp graph where-used-config <variable> for heuristic TVARVC usage analysis

  • SAP(action="analyze", params={"type":"co_change", ...}) for MCP co-change

  • SAP(action="analyze", params={"type":"impact", ...}) for reverse dependency impact

  • SAP(action="analyze", params={"type":"where_used_config", ...}) for MCP TVARVC usage

System Profiles (.vsp.json)

Configure multiple SAP systems in .vsp.json:

{
  "default": "dev",
  "systems": {
    "dev": {
      "url": "http://dev.example.com:50000",
      "user": "DEVELOPER",
      "client": "001"
    },
    "a4h": {
      "url": "http://a4h.local:50000",
      "user": "ADMIN",
      "client": "001",
      "insecure": true
    },
    "prod": {
      "url": "https://prod.example.com:44300",
      "user": "READONLY",
      "client": "100",
      "read_only": true,
      "cookie_file": "/path/to/cookies.txt"
    }
  }
}

Password Resolution:

  • Set via environment variable: VSP_<SYSTEM>_PASSWORD (e.g., VSP_DEV_PASSWORD)

  • Or use cookie authentication: cookie_file or cookie_string

Config Locations (searched in order):

  1. .vsp.json (current directory)

  2. .vsp/systems.json

  3. ~/.vsp.json

  4. ~/.vsp/systems.json

CLI Flags

vsp --url https://host:44300 --user admin --password secret
vsp --url https://host:44300 --cookie-file cookies.txt
vsp --mode expert          # Enable all 147 tools
vsp --mode hyperfocused    # Single SAP tool (~200 tokens instead of ~40K)

Environment Variables

export SAP_URL=https://host:44300
export SAP_USER=developer
export SAP_PASSWORD=secret
export SAP_CLIENT=001

.env File

# .env (auto-loaded from current directory)
SAP_URL=https://host:44300
SAP_USER=developer
SAP_PASSWORD=secret

Flag

Env Variable

Description

--url

SAP_URL

SAP system URL

--user

SAP_USER

Username

--password

SAP_PASSWORD

Password

--client

SAP_CLIENT

Client (default: 001)

--mode

SAP_MODE

hyperfocused (recommended), focused, or expert

--cookie-file

SAP_COOKIE_FILE

Netscape cookie file

--insecure

SAP_INSECURE

Skip TLS verification

--terminal-id

SAP_TERMINAL_ID

SAP GUI terminal ID for cross-tool debugging

--allow-transportable-edits

SAP_ALLOW_TRANSPORTABLE_EDITS

Enable editing transportable objects

--allowed-transports

SAP_ALLOWED_TRANSPORTS

Whitelist transports (wildcards: A4HK*)

--allowed-packages

SAP_ALLOWED_PACKAGES

Whitelist packages (wildcards: Z*,$TMP)

Usage with Claude

Claude Desktop

Add to ~/.config/claude/claude_desktop_config.json:

{
  "mcpServers": {
    "abap-adt": {
      "command": "/path/to/vsp",
      "env": {
        "SAP_URL": "https://your-sap-host:44300",
        "SAP_USER": "your-username",
        "SAP_PASSWORD": "your-password"
      }
    }
  }
}

Claude Code

Add .mcp.json to your project:

{
  "mcpServers": {
    "abap-adt": {
      "command": "/path/to/vsp",
      "env": {
        "SAP_URL": "https://your-sap-host:44300",
        "SAP_USER": "your-username",
        "SAP_PASSWORD": "your-password"
      }
    }
  }
}

ABAP LSP for Claude Code

vsp includes a built-in LSP server that gives Claude Code automatic error detection when editing ABAP files — no explicit tool calls needed.

Add to Claude Code settings (.claude/settings.json or global settings):

{
  "lsp": {
    "abap": {
      "command": "vsp",
      "args": ["lsp", "--stdio"],
      "extensionToLanguage": {
        ".abap": "abap",
        ".asddls": "abap",
        ".asbdef": "abap"
      }
    }
  }
}

SAP credentials are resolved from environment variables or .env file — same as MCP mode.

Supported LSP features:

Feature

Method

Source

Real-time syntax errors

textDocument/publishDiagnostics

ADT SyntaxCheck

Go-to-definition

textDocument/definition

ADT FindDefinition

Supported file patterns (abapGit naming convention):

Extension

Object Type

.clas.abap

Class (main source)

.clas.testclasses.abap

Class test includes

.clas.locals_def.abap

Class local definitions

.prog.abap

Program / Report

.intf.abap

Interface

.fugr.abap

Function Group

.ddls.asddls

CDS View

Namespace convention (#dmo#cl_flight.clas.abap/DMO/CL_FLIGHT) is handled automatically.

Transportable Packages Configuration

To work with transportable packages (non-$ prefixed), you must explicitly enable transport support:

{
  "mcpServers": {
    "abap-adt": {
      "command": "/path/to/vsp",
      "env": {
        "SAP_URL": "https://your-sap-host:44300",
        "SAP_USER": "your-username",
        "SAP_PASSWORD": "your-password",
        "SAP_CLIENT": "001",
        "SAP_ALLOW_TRANSPORTABLE_EDITS": "true",
        "SAP_ALLOWED_TRANSPORTS": "DEVK*,A4HK*",
        "SAP_ALLOWED_PACKAGES": "ZPROD,$TMP,$*,Z*"
      }
    }
  }
}

Env Variable

Purpose

SAP_ALLOW_TRANSPORTABLE_EDITS

Enable editing objects in transportable packages

SAP_ENABLE_TRANSPORTS

Enable full transport management (create, release)

SAP_ALLOWED_TRANSPORTS

Whitelist transport patterns (wildcards supported)

SAP_ALLOWED_PACKAGES

Whitelist package patterns (wildcards supported)

CreatePackage with software component:

CreatePackage(
  name="ZPROD_005",
  description="Sub-package",
  parent="ZPROD",
  transport="DEVK900123",
  software_component="HOME"
)

Without these flags, operations on transportable packages will be blocked by the safety system.

Tool Modes

One axis, three values — --mode or SAP_MODE:

graph LR
    F["focused<br/>100 tools<br/>~14K tokens"] --> E["expert<br/>147 tools<br/>~40K tokens"]
    E --> H["hyperfocused<br/>1 tool<br/>~200 tokens<br/><i>recommended</i>"]
    style H fill:#2d6a4f,color:#fff,stroke:#4ade80,stroke-width:2px
    style F fill:#264653,color:#fff
    style E fill:#264653,color:#fff

Aspect

Focused

Expert

Hyperfocused (recommended)

Tools

100 essential

147 complete

1 universal SAP()

Schema tokens

~14K

~40K

~200

How AI calls it

GetSource(type, name)

Same, + granular tools

SAP(action, target, params)

Documentation

In tool schemas

In tool schemas

SAP(action="help")

Best for

Legacy setups

Edge cases, debugging

Most setups — any model, minimal overhead

Safety controls

All apply

All apply

All apply (same code path)

vsp --mode hyperfocused  # recommended — single SAP(action, target, params) tool
vsp --mode focused       # 100 curated tools (individual tool names)
vsp --mode expert        # all 147 tools individually

DSL & Automation

YAML Workflows

# ci-pipeline.yaml
name: CI Pipeline
vars:
  package: "$TMP"
steps:
  - action: search
    query: "ZCL_*"
    types: [class]
    package: "{{ .package }}"
    save_as: classes

  - action: test
    objects: "{{ .classes }}"
    parallel: 4

  - action: fail_if
    condition: tests_failed
    message: "Unit tests failed"
vsp workflow run ci-pipeline.yaml --var package='$ZRAY'

Go Library

// Fluent search
objects, _ := dsl.Search(client).
    Query("ZCL_*").Classes().InPackage("$TMP").Execute(ctx)

// Test orchestration
summary, _ := dsl.Test(client).
    Objects(objects...).Parallel(4).Run(ctx)

// Batch import from directory (abapGit-compatible)
result, _ := dsl.Import(client).
    FromDirectory("./src/").
    ToPackage("$ZRAY").
    RAPOrder().  // DDLS → BDEF → Classes → SRVD
    Execute(ctx)

// Export classes with all includes
result, _ := dsl.Export(client).
    Classes("ZCL_TRAVEL", "ZCL_BOOKING").
    ToDirectory("./backup/").
    Execute(ctx)

// RAP deployment pipeline
pipeline := dsl.RAPPipeline(client, "./src/", "$ZRAY", "ZTRAVEL_SB")

See docs/DSL.md for complete documentation.

RAP OData Service Creation

VSP supports full RAP OData E2E development since v2.6.0. Create complete OData services via AI assistant:

Step-by-Step Workflow

1. Create CDS View (DDLS)

WriteSource(
  object_type="DDLS",
  name="ZTRAVEL",
  package="$TMP",
  description="Travel Entity",
  source=`
@EndUserText.label: 'Travel'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define root view entity ZTRAVEL as select from ztravel_tab {
  key travel_id as TravelId,
  description as Description,
  start_date as StartDate,
  end_date as EndDate,
  status as Status
}
`
)

2. Create Behavior Definition (BDEF)

WriteSource(
  object_type="BDEF",
  name="ZTRAVEL",
  package="$TMP",
  description="Travel Behavior",
  source=`
managed implementation in class ZBP_TRAVEL unique;
strict ( 2 );

define behavior for ZTRAVEL alias Travel
persistent table ztravel_tab
lock master
authorization master ( instance )
{
  field ( readonly ) TravelId;
  field ( mandatory ) Description;

  create;
  update;
  delete;

  mapping for ztravel_tab {
    TravelId = travel_id;
    Description = description;
    StartDate = start_date;
    EndDate = end_date;
    Status = status;
  }
}
`
)

3. Create Service Definition (SRVD)

WriteSource(
  object_type="SRVD",
  name="ZTRAVEL_SD",
  package="$TMP",
  description="Travel Service Definition",
  source=`
@EndUserText.label: 'Travel Service'
define service ZTRAVEL_SD {
  expose ZTRAVEL;
}
`
)

4. Create Service Binding (SRVB)

WriteSource(
  object_type="SRVB",
  name="ZTRAVEL_SB",
  package="$TMP",
  description="Travel OData V4 Binding",
  service_definition="ZTRAVEL_SD",
  binding_version="V4"
)

Binding Options

Parameter

Values

Description

binding_version

V2, V4

OData protocol version

binding_category

0, 1

0=Web API, 1=UI

For Transportable Packages

Add transport parameter to all WriteSource calls:

WriteSource(
  object_type="DDLS",
  name="ZTRAVEL",
  package="ZPROD",
  transport="DEVK900123",
  ...
)

ExecuteABAP

Run arbitrary ABAP code via unit test wrapper:

ExecuteABAP:
  code: |
    DATA(lv_msg) = |Hello from SAP at { sy-datum }|.
    lv_result = lv_msg.

Risk levels: harmless (read-only), dangerous (write), critical (full access)

See ExecuteABAP Report for details.

AI-Powered Root Cause Analysis

vsp enables AI assistants to investigate production issues autonomously:

User: "Investigate the ZERODIVIDE crash in production"

AI Workflow:
  1. GetDumps      → Find recent crashes by exception type
  2. GetDump       → Analyze stack trace and variable values
  3. GetSource     → Read code at crash location
  4. GetCallGraph  → Trace call hierarchy
  5. GrepPackages  → Find similar patterns
  6. Analysis      → Identify root cause
  7. Propose Fix   → Generate solution + test case

Example Output:

"The crash occurs in ZCL_PRICING=>CALCULATE_RATIO when LV_TOTAL=0. This happens for archived orders with no line items. Here's the fix..."

See AI-Powered RCA Workflows for the complete vision.

Tools Reference

Focused Mode Tools (100):

  • Search: SearchObject, GrepObjects, GrepPackages

  • Read: GetSource, GetTable, GetTableContents, RunQuery, GetPackage, GetFunctionGroup, GetCDSDependencies

  • Debugger: DebuggerListen, DebuggerAttach, DebuggerDetach, DebuggerStep, DebuggerGetStack, DebuggerGetVariables

    • Note: Breakpoints now managed via WebSocket (ZADT_VSP)

  • Write: WriteSource, EditSource, ImportFromFile, ExportToFile, MoveObject

  • Dev: SyntaxCheck, RunUnitTests, RunATCCheck, LockObject, UnlockObject

  • Intelligence: FindDefinition, FindReferences, GetContext

  • System: GetSystemInfo, GetInstalledComponents, GetCallGraph, GetObjectStructure, GetFeatures

  • Diagnostics: GetDumps, GetDump, ListTraces, GetTrace, GetSQLTraceState, ListSQLTraces

  • Git: GitTypes, GitExport (requires abapGit on SAP)

  • Reports: RunReport, GetVariants, GetTextElements, SetTextElements

  • Install: InstallZADTVSP, InstallAbapGit, ListDependencies

See README_TOOLS.md for complete tool documentation (147 tools).

Capability

ADT (Eclipse)

abap-adt-api (TS)

vsp

Programs, Classes, Interfaces

Y

Y

Y

Functions, Function Groups

Y

Y

Y

Tables, Structures

Y

Y

Y

CDS Views

Y

Y

Y

Syntax Check, Activation

Y

Y

Y

Unit Tests

Y

Y

Y

CRUD Operations

Y

Y

Y

Find Definition/References

Y

Y

Y

Code Completion

Y

Y

Y

ATC Checks

Y

Y

Y

Call Graph

Y

Y

Y

System Info

Y

Y

Y

Surgical Edit (Edit pattern)

-

-

Y

File-based Deploy

-

-

Y

ExecuteABAP

-

-

Y

RAP OData (DDLS/SRVD/SRVB)

Y

-

Y

OData Service Publish

Y

-

Y

abapGit Export

Y

-

Y (WebSocket)

Debugging

Y

Y

N

Credits

Project

Author

Contribution

abap-adt-api

Marcello Urbani

TypeScript ADT library, definitive API reference

mcp-abap-adt

Mario Andreschak

First MCP server for ABAP ADT

vsp is a Go rewrite with:

  • Single binary, zero dependencies

  • 147 tools (vs 13 original)

  • ~50x faster startup

Optional: WebSocket Handler (ZADT_VSP)

vsp can optionally deploy a WebSocket handler to SAP for enhanced functionality like RFC calls:

# 1. Create package
vsp CreatePackage --name '$ZADT_VSP' --description 'VSP WebSocket Handler'

# 2. Deploy objects (embedded in binary)
vsp WriteSource --object_type INTF --name ZIF_VSP_SERVICE --package '$ZADT_VSP' \
    --source "$(cat embedded/abap/zif_vsp_service.intf.abap)"
vsp WriteSource --object_type CLAS --name ZCL_VSP_RFC_SERVICE --package '$ZADT_VSP' \
    --source "$(cat embedded/abap/zcl_vsp_rfc_service.clas.abap)"
vsp WriteSource --object_type CLAS --name ZCL_VSP_APC_HANDLER --package '$ZADT_VSP' \
    --source "$(cat embedded/abap/zcl_vsp_apc_handler.clas.abap)"

# 3. Manually create APC app in SAPC + activate in SICF
#    See embedded/abap/README.md for details

After deployment, connect via WebSocket to call RFCs:

{"id":"1","domain":"rfc","action":"call","params":{"function":"BAPI_USER_GET_DETAIL","USERNAME":"TESTUSER"}}

See WebSocket Handler Report for complete documentation.

Documentation

Document

Description

docs/architecture.md

Architecture diagrams (Mermaid)

README_TOOLS.md

Complete tool reference (94 tools)

MCP_USAGE.md

AI agent usage guide

docs/DSL.md

DSL & workflow documentation

ARCHITECTURE.md

Technical architecture (detailed)

CLAUDE.md

AI development guidelines

embedded/abap/README.md

WebSocket handler deployment

docs/cli-agents/

CLI coding agents setup guide (8 agents, 4 languages)

Roadmap: Quick/Mid/Far Wins

Prioritized feature backlog

Observations Since v2.12.5

Recent changes & research summary

Uses ABAP SQL syntax, not standard SQL:

Feature

Status

ORDER BY col ASCENDING

Works

ORDER BY col DESCENDING

Works

ORDER BY col ASC/DESC

FAILS - use ASCENDING/DESCENDING

LIMIT n

FAILS - use max_rows parameter

Development

# Build
make build          # Current platform
make build-all      # All 9 platforms

# Test
go test ./...                              # Unit tests (821)
go test -tags=integration -v ./pkg/adt/    # Integration tests (34+)
vibing-steampunk/
├── cmd/vsp/main.go           # CLI (cobra/viper)
├── pkg/adt/
│   ├── client.go             # ADT client + read ops
│   ├── crud.go               # CRUD operations
│   ├── devtools.go           # Syntax check, activate, tests
│   ├── codeintel.go          # Definition, refs, completion
│   ├── workflows.go          # High-level workflows
│   └── http.go               # HTTP transport (CSRF, auth)
├── internal/mcp/server.go    # MCP tool handlers (147 tools)
├── internal/lsp/             # ABAP LSP server (diagnostics, go-to-def)
└── pkg/dsl/                  # DSL & workflow engine

Project Status

Metric

Value

Tools

147 (100 focused, 147 expert)

Unit Tests

821

Platforms

9 (Linux, macOS, Windows × amd64/arm64/386)

Completed (v2.15.0)

  • DSL & Workflow Engine

  • CDS Dependency Analysis (GetCDSDependencies)

  • ATC Code Quality Checks (RunATCCheck)

  • ExecuteABAP (code injection via unit tests)

  • System Info & Components (GetSystemInfo, GetInstalledComponents)

  • Call Graph & Object Structure (GetCallGraph, GetObjectStructure)

  • Short Dumps / Runtime Errors - GetDumps, GetDump (RABAX)

  • ABAP Profiler / Traces - ListTraces, GetTrace (ATRA)

  • SQL Trace - GetSQLTraceState, ListSQLTraces (ST05)

  • RAP OData E2E - DDLS, SRVD, SRVB create + publish (v2.6.0)

  • External Breakpoints - Line, exception, statement, message (v2.7.0)

  • Debug Session - Listener, attach, detach, step, stack, variables (v2.8.0)

  • Tool Group Disablement - --disabled-groups 5THD (v2.10.0)

  • UI5/BSP Read - UI5ListApps, UI5GetApp, UI5GetFileContent (v2.10.1)

  • Feature Detection - GetFeatures tool + system capability probing (v2.12.4)

  • WriteSource SRVB - Create Service Bindings via unified API (v2.12.4)

  • Call Graph & RCA - GetCallersOf, GetCalleesOf, TraceExecution (v2.13.0)

  • Lua Scripting - REPL, 40+ bindings, debug session management (v2.14.0)

  • WebSocket Debugging - ZADT_VSP handler, TPDAPI integration (v2.15.0)

  • Force Replay - Variable history, state injection (v2.15.0)

Parked (Needs Further Work)

  • AMDP Debugger - Experimental: Session works, breakpoint triggering under investigation (Report)

  • UI5/BSP Write - ADT filestore is read-only, needs custom plugin via /UI5/CL_REPOSITORY_LOAD

  • abapGit Export - WebSocket integration complete (v2.16.0) - GitTypes, GitExport tools (Report)

  • abapGit Import - Requires ZCL_ABAPGIT_OBJECTS=>deserialize with virtual repository

Completed (v2.36.0)

  • API Release State (ARS) - GetAPIReleaseState tool for Clean Core compliance checks

  • gCTS Integration - 10 tools for gCTS repository management

  • i18n Tools - 7 tools for translation management with per-request language override

  • Browser SSO - --browser-auth for Kerberos/SAML/Keycloak authentication

  • HTTP Streamable Transport - --transport http for non-stdio deployments

  • mcp-go v0.47.0 - Latest MCP SDK

Planned

  • Message Server Logs

  • Background Job Management

Future Considerations

  • AMDP Session Persistence (enable full HANA debugging)

  • Graph Engine & Boundary Analysis - initial implementation in pkg/graph/ (boundary analysis, dynamic call detection, 11 tests); SQL/ADT adapters pending

  • Test Intelligence (smart test execution based on changes)

  • Standard API Surface Scraper

Research Reports:

Lua Scripting (New in v2.14)

Automate debugging workflows with Lua scripts:

# Interactive REPL
vsp lua

# Run a script
vsp lua examples/scripts/debug-session.lua

# Execute inline
vsp lua -e 'print(json.encode(searchObject("ZCL_*", 10)))'

Example: Set breakpoint and debug

-- Set breakpoint
local bpId = setBreakpoint("ZTEST_PROGRAM", 42)
print("Breakpoint: " .. bpId)

-- Wait for debuggee
local event = listen(60)
if event then
    attach(event.id)
    print("Stack:")
    for i, frame in ipairs(getStack()) do
        print("  " .. frame.program .. ":" .. frame.line)
    end
    stepOver()
    detach()
end

Available Functions:

  • Search: searchObject, grepObjects

  • Source: getSource, writeSource, editSource

  • Debug: setBreakpoint, listen, attach, detach, stepOver, stepInto, stepReturn, continue_, getStack, getVariables

  • Checkpoints: saveCheckpoint, getCheckpoint, listCheckpoints, injectCheckpoint

  • Diagnostics: getDumps, getDump, runUnitTests, syntaxCheck

  • Call Graph: getCallGraph, getCallersOf, getCalleesOf

  • Utilities: print, sleep, json.encode, json.decode

See examples/scripts/ for more examples.

RCA, Replay & Test Extraction

The Vision: AI-Powered Debugging Pipeline

┌─────────────────────────────────────────────────────────────────────────────┐
│  1. SET BREAKPOINT    →  2. RUN PROGRAM    →  3. CAPTURE CONTEXT           │
│     setBreakpoint()       (trigger via         saveCheckpoint()             │
│     on FM/method          unit test/RFC)       for each hit                 │
├─────────────────────────────────────────────────────────────────────────────┤
│  4. EXTRACT TEST CASES  →  5. AI NORMALIZE  →  6. GENERATE UNIT TESTS      │
│     inputs + outputs       deduplicate,         ABAP Unit classes           │
│     from checkpoints       explain patterns     with mocks                  │
└─────────────────────────────────────────────────────────────────────────────┘

Example: Capture FM Execution for Test Generation

-- Step 1: Set breakpoint on function module entry
local bpId = setBreakpoint("SAPL<FGROUP>", 10)  -- Entry point

-- Step 2: Prepare to capture multiple executions
local captures = {}

-- Step 3: Loop to capture test cases
for i = 1, 10 do
    local event = listen(120)  -- Wait for debuggee
    if not event then break end

    attach(event.id)

    -- Capture input parameters at entry
    local vars = getVariables()
    local testCase = {
        id = i,
        inputs = extractInputs(vars),  -- IV_*, IT_*, IS_*
        timestamp = os.time()
    }

    -- Step to end to capture outputs
    continue_()
    local event2 = listen(5)
    if event2 then
        attach(event2.id)
        testCase.outputs = extractOutputs(getVariables())  -- EV_*, ET_*, ES_*, RETURN
    end

    -- Save checkpoint for replay
    saveCheckpoint("testcase_" .. i, testCase)
    table.insert(captures, testCase)

    detach()
end

-- Step 4: Export for AI processing
print(json.encode(captures))

AI Processing Pipeline

After capturing test cases, AI can:

  1. Normalize & Deduplicate - Group similar inputs, identify unique scenarios

  2. Explain Patterns - "TestCase 3 tests error path when IV_AMOUNT < 0"

  3. Generate Unit Tests - Create ABAP Unit test class with proper mocks

User: "Analyze captured test cases and generate unit tests"

AI Workflow:
  1. Load checkpoints     → listCheckpoints("testcase_*")
  2. Analyze patterns     → Cluster by input signatures
  3. Identify edge cases  → Empty tables, zero values, error conditions
  4. Generate mock specs  → Which FMs/DB tables need mocking
  5. Create ABAP Unit     → ZCL_TEST_<FM> with test methods
  6. Deploy tests         → WriteSource to SAP system

What Works Today (v2.14)

Feature

Status

Command/Function

Set breakpoints

setBreakpoint(program, line)

Listen for debuggee

listen(timeout)

Attach/detach

attach(id), detach()

Step execution

stepOver(), stepInto(), continue_()

Get variables

getVariables()

Get stack trace

getStack()

Save checkpoints

saveCheckpoint(name, data)

Load checkpoints

getCheckpoint(name)

Call graph analysis

getCallersOf(), getCalleesOf()

Short dump analysis

getDumps(), getDump(id)

Coming in Future Phases

Feature

Phase

Description

Variable history recording

5.2

✅ Track all variable changes during execution

Force Replay (state injection)

5.5

✅ Inject saved state into live debug session

Test case extraction

6.1

Automated input/output extraction from recordings

ABAP test generator

6.3

Generate ABAP Unit classes from test cases

Mock framework

6.4

ZCL_VSP_MOCK for DB/RFC mocking

Isolated playground

7.1

Fast test execution with mocked dependencies

Time-travel debugging

8.1

Navigate backwards through execution

Document

Description

VISION.md

The dream: AI as a senior developer

ROADMAP.md

Detailed implementation timeline

TAS & Scripting

Technical design for TAS-style debugging

Test Extraction

Playground and mock architecture

Force Replay

State injection design

Implications Analysis

Paradigm shift: archaeology → observation

AI-Powered RCA

Root cause analysis workflows


Vision & Roadmap

Where we're going: TAS-style debugging, time-travel, AI-powered RCA

Phase

Target

Features

5

Q1 2026

Lua scripting ✅, variable history, checkpoints, Force Replay

6

Q2 2026

Test case extraction, ABAP test generator, mock framework

7

Q3 2026

Isolated playground with mocks, patch & re-run

8

Q4 2026

Time-travel debugging, temporal queries

9+

2027

AI-suggested breakpoints, multi-agent debugging, self-healing

Read more:

License

MIT

Contributing

Contributions welcome! See ARCHITECTURE.md and CLAUDE.md for guidelines.

A
license - permissive license
-
quality - not tested
-
maintenance - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sangvucitek/MCP_SAP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server