SAP ADT Commands
Command-line access to SAP ABAP Development Tools (ADT) REST services from an
AI agent workflow. The client covers areas that many existing MCP tools do not
expose: repository search, object creation, message-class and text-element
maintenance, transport lifecycle, and quality checks.
Purpose
Give the agent a safe, scriptable way to inspect and modify ABAP objects on a
target SAP system when no MCP tool covers the operation. Every command
returns JSON so results can be routed into subsequent steps.
When to Use
Activate this skill when the user is working with an SAP ABAP system and any
of the following are true:
- The task requires an ADT operation not exposed by the configured MCP
tooling (search, package browsing, transport management, message-class
edits, text-element edits, CDS creation, and similar).
- The user asks to inspect, create, or modify an ABAP object and only ADT
REST endpoints can do it.
- The user asks for repository-level reporting, such as "list all objects
owned by user X" or "which objects are inactive".
When Not to Use
Do not activate this skill when:
- An existing MCP tool already handles the requested operation. Prefer the
MCP path.
- The user needs SAP GUI-only capabilities such as ATC baseline management,
runtime debugging with breakpoints, ABAP dictionary DDIC screens, or
update-task processing.
- The target system is a production tenant and the user has not confirmed
the intent to run against production.
- The user asks the agent to type or transmit an SAP password directly.
Safety Rules
The agent must:
- Prefer an existing MCP tool when it fully supports the requested
operation.
- Use this client only when the configured MCP tool does not support the
required operation.
- Start with read-only discovery before modifying anything.
- Never ask the user to paste a password into the chat.
- Never place a password directly on a generated command line.
- Use destination-based environment resolution (
--dest) when it is
available.
- Confirm the exact target object, package, transport, and system before a
write operation.
- Treat source writes, deletes, unlocks, activation, transport release,
transport deletion, and object moves as sensitive operations.
- Require explicit human authorization immediately before any destructive
or hard-to-reverse operation.
- Never infer authorization to delete or release something from a broader
task description such as "clean up", "deploy", or "ship".
- Report the exact command, the response, and any remaining risk after
every operation.
- Stop and report when ADT services, authorizations, object locks, or
transport configuration prevent safe execution.
- Never loop retries on authorization failures or malformed requests.
- Never claim a write succeeded unless the tool response confirms it.
Tool Selection
When faced with a task, decide in this order:
- Is there a matching MCP tool? If yes, use it.
- Does this skill implement the operation? See Command Groups below.
- If neither can do it, tell the user what is missing and suggest SAP GUI
(SE38, SE80, SM12, SE01/SE09/SE10, SCI) or Eclipse ADT.
Do not fall through to this client "just in case". Every write here is a
real change on the target system.
Connection Model
The client accepts either explicit flags (--url, --user, --pwd,
--client, --lang) or a destination name:
--dest SID_CLIENT_USER_LANG
Generic example:
--dest DEV_100_DEVELOPER_EN
For --dest DEV_100_DEVELOPER_EN, the client resolves:
url from SAP_DEV_URL
user from SAP_DEV_DEVELOPER_USER, else the DEVELOPER part of the
name
pwd from SAP_DEV_DEVELOPER_PWD (must exist)
client = 100
lang = EN
The one-time setup below is performed by the human. The agent may set the
URL variable when the URL is not secret, but must never set a password
variable itself:
# URL — non-secret; may be scripted by the agent when known
setx SAP_DEV_URL "https://sap.example.com:44300"
# Password — set by the human only
setx SAP_DEV_DEVELOPER_PWD "<password>"
When any required variable is missing, the client returns a JSON error that
names the exact setx commands to run. Treat this as a configuration issue,
not a network failure.
Full details are in
references/connection-and-credentials.md.
Execution Pattern
Every invocation looks like:
python $client --dest DEV_100_DEVELOPER_EN <command> [options]
Where $client holds the repo-root-relative path to the Python source:
$client = ".\skills\sap-adt-commands\scripts\adt-client.py"
The examples below assume the current working directory is the repository
root. When the skill is installed by an AI client (for example via
npx skills add), the on-disk layout is client-specific — resolve the
installed skill directory for that client instead of assuming this path.
Do not define the client variable as a two-element string array such
as $exe = "python", "scripts/adt-client.py" and then invoke it with
& $exe .... That pattern relies on PowerShell array splatting, is
flagged by PSScriptAnalyzer, and breaks in subtle ways when arguments
contain spaces or quotes. Keep the variable as a single script path and
put python on the command line explicitly, or invoke python directly
without a variable.
The output is JSON on stdout. Non-zero exit codes accompany connection or
runtime failures. See
references/development.md for installation,
dependencies, and the optional local build procedure.
Command Groups
Each group has a dedicated reference file. Load a reference only when the
agent is actively working on that group.
Discovery and inspection — read-only browsing, search, source read,
metadata, where-used, history, diff. Load
references/command-discovery-and-inspection.md
when the task begins, before any write.
Commands: discovery, search, objects, packages,
packages-by-responsible, objects-by-user, reports-by-user, source,
object-properties, where-used, history, diff, inactive-objects,
transports, transport-contents, read-message-class,
read-text-elements.
Source and object management — writes, creations, activation, unlock,
and delete. Load
references/command-source-and-object-management.md
when the confirmed task involves modifying or creating ABAP objects.
Commands: write-source, create-package, create-program,
create-class, create-interface, create-function-group,
create-function-module, create-cds, create-transaction,
create-message-class, activate, unlock, delete.
Message classes and text elements — read and edit T100 messages and
program text elements. Load
references/command-messages-and-text-elements.md
when the task involves messages or selection-screen / symbol / heading
texts.
Commands: read-message-class, write-messages, add-message,
update-message, delete-message, read-text-elements,
write-text-elements.
Quality checks and testing — static analysis and unit tests. Load
references/command-quality-and-testing.md
before proposing an activation or release for changes the agent authored.
Commands: atc-check, abap-unit.
Transports and object lifecycle — CTS operations. Load
references/command-transports-and-lifecycle.md
when the task involves creating, moving, releasing, or deleting transport
requests, or when moving objects between tasks.
Commands: transports, create-transport, release-transport,
move-object, transport-contents, delete-transport.
Troubleshooting —
references/troubleshooting.md. Load when
a command fails with an authorization, endpoint availability, lock,
activation, transport, or TLS error.
Development —
references/development.md. Load when
installing Python dependencies or when a contributor wants to build a
local executable with PyInstaller.
Recommended Workflows
Each workflow is a short sequence, not an exhaustive script. Read the
relevant reference file before running write steps.
Browse and inspect
python $client --dest DEV_100_DEVELOPER_EN discovery
python $client --dest DEV_100_DEVELOPER_EN search "Z*" --type PROG/P
python $client --dest DEV_100_DEVELOPER_EN objects ZEXAMPLE_PACKAGE
python $client --dest DEV_100_DEVELOPER_EN objects-by-user DEVELOPER --type CLAS/OC
python $client --dest DEV_100_DEVELOPER_EN object-properties ZEXAMPLE_PROGRAM --type PROG/P
Read and diff source
python $client --dest DEV_100_DEVELOPER_EN source ZEXAMPLE_PROGRAM --type PROG/P
python $client --dest DEV_100_DEVELOPER_EN diff ZEXAMPLE_PROGRAM --type PROG/P
python $client --dest DEV_100_DEVELOPER_EN history ZEXAMPLE_PROGRAM --type PROG/P
Create and activate an object
python $client --dest DEV_100_DEVELOPER_EN create-package ZEXAMPLE_PACKAGE `
--description "Example package" --superpackage ZEXAMPLE_ROOT --transport DEVK900001
python $client --dest DEV_100_DEVELOPER_EN create-program ZEXAMPLE_PROGRAM `
--description "Example report" --package ZEXAMPLE_PACKAGE --transport DEVK900001
python $client --dest DEV_100_DEVELOPER_EN write-source ZEXAMPLE_PROGRAM `
--text "REPORT zexample_program." --type PROG/P --transport DEVK900001
python $client --dest DEV_100_DEVELOPER_EN activate ZEXAMPLE_PROGRAM:PROG/P
Confirm each step with the human when the write is destructive or targets a
tracked transport.
Manage messages
python $client --dest DEV_100_DEVELOPER_EN create-message-class ZEXAMPLE_MSAG `
--description "Example messages" --package ZEXAMPLE_PACKAGE --transport DEVK900001
python $client --dest DEV_100_DEVELOPER_EN add-message ZEXAMPLE_MSAG --id 001 --text "No data found" --transport DEVK900001
python $client --dest DEV_100_DEVELOPER_EN update-message ZEXAMPLE_MSAG --id 001 --text "No data for selection" --transport DEVK900001
python $client --dest DEV_100_DEVELOPER_EN activate ZEXAMPLE_MSAG:MSAG/N
Manage transports
python $client --dest DEV_100_DEVELOPER_EN transports --owner DEVELOPER
python $client --dest DEV_100_DEVELOPER_EN transport-contents DEVK900001
python $client --dest DEV_100_DEVELOPER_EN create-transport --description "TICKET-1234: Feature X" --package ZEXAMPLE_PACKAGE
python $client --dest DEV_100_DEVELOPER_EN move-object ZEXAMPLE_PROGRAM:PROG/P --transport DEVK900002
Never release or delete a transport without contemporaneous human
authorization.
Run quality gates
python $client --dest DEV_100_DEVELOPER_EN atc-check ZEXAMPLE_PROGRAM:PROG/P
python $client --dest DEV_100_DEVELOPER_EN abap-unit ZEXAMPLE_PROGRAM:PROG/P
An UNKNOWN gate is not a PASS. See
references/command-quality-and-testing.md.
Error Handling
- If the client returns
{"error": "Missing connection values ..."}, follow
the connection reference; do not retry blindly.
- On HTTP 401 or 403, stop and report; do not retry with the same
credentials.
- On HTTP 404 for CTS or workarea endpoints, report the endpoint absence
and suggest the SAP GUI fallback (SE01, SE09, SE10, SE80).
- On HTTP 406 for message-class or text-element reads, use the client
default (
Accept: */*); the client already handles this.
- On any partial success from
release-transport, stop and report per-task
results before deciding whether to retry.
Detailed decision trees are in
references/troubleshooting.md.
Bundled Resources
scripts/adt-client.py — Python source (authoritative and only
distributed entry point).
scripts/adt-client.spec — optional PyInstaller build configuration for
contributors who want to package a local executable for their own use.
No prebuilt binary is committed to the default branch.
requirements.txt — Python runtime dependencies.
references/*.md — focused documentation for each command group.
Completion Checklist
Before reporting a task complete, verify:
1---2name: sap-adt-commands3description: Executes SAP ABAP Development Tools (ADT) REST operations for object discovery, source management, object creation, activation, testing, transport handling, history, where-used analysis, message classes, and text elements. Use when working with an SAP ABAP system and the required ADT operation is unavailable through the currently configured MCP tools.4license: Apache-2.05---67# SAP ADT Commands89Command-line access to SAP ABAP Development Tools (ADT) REST services from an10AI agent workflow. The client covers areas that many existing MCP tools do not11expose: repository search, object creation, message-class and text-element12maintenance, transport lifecycle, and quality checks.1314## Purpose1516Give the agent a safe, scriptable way to inspect and modify ABAP objects on a17target SAP system when no MCP tool covers the operation. Every command18returns JSON so results can be routed into subsequent steps.1920## When to Use2122Activate this skill when the user is working with an SAP ABAP system and any23of the following are true:2425- The task requires an ADT operation not exposed by the configured MCP26 tooling (search, package browsing, transport management, message-class27 edits, text-element edits, CDS creation, and similar).28- The user asks to inspect, create, or modify an ABAP object and only ADT29 REST endpoints can do it.30- The user asks for repository-level reporting, such as "list all objects31 owned by user X" or "which objects are inactive".3233## When Not to Use3435Do not activate this skill when:3637- An existing MCP tool already handles the requested operation. Prefer the38 MCP path.39- The user needs SAP GUI-only capabilities such as ATC baseline management,40 runtime debugging with breakpoints, ABAP dictionary DDIC screens, or41 update-task processing.42- The target system is a production tenant and the user has not confirmed43 the intent to run against production.44- The user asks the agent to type or transmit an SAP password directly.4546## Safety Rules4748The agent must:49501. Prefer an existing MCP tool when it fully supports the requested51 operation.522. Use this client only when the configured MCP tool does not support the53 required operation.543. Start with read-only discovery before modifying anything.554. Never ask the user to paste a password into the chat.565. Never place a password directly on a generated command line.576. Use destination-based environment resolution (`--dest`) when it is58 available.597. Confirm the exact target object, package, transport, and system before a60 write operation.618. Treat source writes, deletes, unlocks, activation, transport release,62 transport deletion, and object moves as sensitive operations.639. Require explicit human authorization immediately before any destructive64 or hard-to-reverse operation.6510. Never infer authorization to delete or release something from a broader66 task description such as "clean up", "deploy", or "ship".6711. Report the exact command, the response, and any remaining risk after68 every operation.6912. Stop and report when ADT services, authorizations, object locks, or70 transport configuration prevent safe execution.7113. Never loop retries on authorization failures or malformed requests.7214. Never claim a write succeeded unless the tool response confirms it.7374## Tool Selection7576When faced with a task, decide in this order:77781. Is there a matching MCP tool? If yes, use it.792. Does this skill implement the operation? See **Command Groups** below.803. If neither can do it, tell the user what is missing and suggest SAP GUI81 (SE38, SE80, SM12, SE01/SE09/SE10, SCI) or Eclipse ADT.8283Do not fall through to this client "just in case". Every write here is a84real change on the target system.8586## Connection Model8788The client accepts either explicit flags (`--url`, `--user`, `--pwd`,89`--client`, `--lang`) or a destination name:9091```text92--dest SID_CLIENT_USER_LANG93```9495Generic example:9697```text98--dest DEV_100_DEVELOPER_EN99```100101For `--dest DEV_100_DEVELOPER_EN`, the client resolves:102103- `url` from `SAP_DEV_URL`104- `user` from `SAP_DEV_DEVELOPER_USER`, else the `DEVELOPER` part of the105 name106- `pwd` from `SAP_DEV_DEVELOPER_PWD` (**must exist**)107- `client` = `100`108- `lang` = `EN`109110The one-time setup below is performed by the human. The agent may set the111URL variable when the URL is not secret, but must never set a password112variable itself:113114```powershell115# URL — non-secret; may be scripted by the agent when known116setx SAP_DEV_URL "https://sap.example.com:44300"117118# Password — set by the human only119setx SAP_DEV_DEVELOPER_PWD "<password>"120```121122When any required variable is missing, the client returns a JSON error that123names the exact `setx` commands to run. Treat this as a configuration issue,124not a network failure.125126Full details are in127[references/connection-and-credentials.md](references/connection-and-credentials.md).128129## Execution Pattern130131Every invocation looks like:132133```powershell134python $client --dest DEV_100_DEVELOPER_EN <command> [options]135```136137Where `$client` holds the repo-root-relative path to the Python source:138139```powershell140$client = ".\skills\sap-adt-commands\scripts\adt-client.py"141```142143The examples below assume the current working directory is the repository144root. When the skill is installed by an AI client (for example via145`npx skills add`), the on-disk layout is client-specific — resolve the146installed skill directory for that client instead of assuming this path.147148Do **not** define the client variable as a two-element string array such149as `$exe = "python", "scripts/adt-client.py"` and then invoke it with150`& $exe ...`. That pattern relies on PowerShell array splatting, is151flagged by PSScriptAnalyzer, and breaks in subtle ways when arguments152contain spaces or quotes. Keep the variable as a single script path and153put `python` on the command line explicitly, or invoke `python` directly154without a variable.155156The output is JSON on stdout. Non-zero exit codes accompany connection or157runtime failures. See158[references/development.md](references/development.md) for installation,159dependencies, and the optional local build procedure.160161## Command Groups162163Each group has a dedicated reference file. Load a reference only when the164agent is actively working on that group.165166- **Discovery and inspection** — read-only browsing, search, source read,167 metadata, where-used, history, diff. Load168 [references/command-discovery-and-inspection.md](references/command-discovery-and-inspection.md)169 when the task begins, before any write.170 Commands: `discovery`, `search`, `objects`, `packages`,171 `packages-by-responsible`, `objects-by-user`, `reports-by-user`, `source`,172 `object-properties`, `where-used`, `history`, `diff`, `inactive-objects`,173 `transports`, `transport-contents`, `read-message-class`,174 `read-text-elements`.175176- **Source and object management** — writes, creations, activation, unlock,177 and delete. Load178 [references/command-source-and-object-management.md](references/command-source-and-object-management.md)179 when the confirmed task involves modifying or creating ABAP objects.180 Commands: `write-source`, `create-package`, `create-program`,181 `create-class`, `create-interface`, `create-function-group`,182 `create-function-module`, `create-cds`, `create-transaction`,183 `create-message-class`, `activate`, `unlock`, `delete`.184185- **Message classes and text elements** — read and edit T100 messages and186 program text elements. Load187 [references/command-messages-and-text-elements.md](references/command-messages-and-text-elements.md)188 when the task involves messages or selection-screen / symbol / heading189 texts.190 Commands: `read-message-class`, `write-messages`, `add-message`,191 `update-message`, `delete-message`, `read-text-elements`,192 `write-text-elements`.193194- **Quality checks and testing** — static analysis and unit tests. Load195 [references/command-quality-and-testing.md](references/command-quality-and-testing.md)196 before proposing an activation or release for changes the agent authored.197 Commands: `atc-check`, `abap-unit`.198199- **Transports and object lifecycle** — CTS operations. Load200 [references/command-transports-and-lifecycle.md](references/command-transports-and-lifecycle.md)201 when the task involves creating, moving, releasing, or deleting transport202 requests, or when moving objects between tasks.203 Commands: `transports`, `create-transport`, `release-transport`,204 `move-object`, `transport-contents`, `delete-transport`.205206- **Troubleshooting** —207 [references/troubleshooting.md](references/troubleshooting.md). Load when208 a command fails with an authorization, endpoint availability, lock,209 activation, transport, or TLS error.210211- **Development** —212 [references/development.md](references/development.md). Load when213 installing Python dependencies or when a contributor wants to build a214 local executable with PyInstaller.215216## Recommended Workflows217218Each workflow is a short sequence, not an exhaustive script. Read the219relevant reference file before running write steps.220221### Browse and inspect222223```powershell224python $client --dest DEV_100_DEVELOPER_EN discovery225python $client --dest DEV_100_DEVELOPER_EN search "Z*" --type PROG/P226python $client --dest DEV_100_DEVELOPER_EN objects ZEXAMPLE_PACKAGE227python $client --dest DEV_100_DEVELOPER_EN objects-by-user DEVELOPER --type CLAS/OC228python $client --dest DEV_100_DEVELOPER_EN object-properties ZEXAMPLE_PROGRAM --type PROG/P229```230231### Read and diff source232233```powershell234python $client --dest DEV_100_DEVELOPER_EN source ZEXAMPLE_PROGRAM --type PROG/P235python $client --dest DEV_100_DEVELOPER_EN diff ZEXAMPLE_PROGRAM --type PROG/P236python $client --dest DEV_100_DEVELOPER_EN history ZEXAMPLE_PROGRAM --type PROG/P237```238239### Create and activate an object240241```powershell242python $client --dest DEV_100_DEVELOPER_EN create-package ZEXAMPLE_PACKAGE `243 --description "Example package" --superpackage ZEXAMPLE_ROOT --transport DEVK900001244python $client --dest DEV_100_DEVELOPER_EN create-program ZEXAMPLE_PROGRAM `245 --description "Example report" --package ZEXAMPLE_PACKAGE --transport DEVK900001246python $client --dest DEV_100_DEVELOPER_EN write-source ZEXAMPLE_PROGRAM `247 --text "REPORT zexample_program." --type PROG/P --transport DEVK900001248python $client --dest DEV_100_DEVELOPER_EN activate ZEXAMPLE_PROGRAM:PROG/P249```250251Confirm each step with the human when the write is destructive or targets a252tracked transport.253254### Manage messages255256```powershell257python $client --dest DEV_100_DEVELOPER_EN create-message-class ZEXAMPLE_MSAG `258 --description "Example messages" --package ZEXAMPLE_PACKAGE --transport DEVK900001259python $client --dest DEV_100_DEVELOPER_EN add-message ZEXAMPLE_MSAG --id 001 --text "No data found" --transport DEVK900001260python $client --dest DEV_100_DEVELOPER_EN update-message ZEXAMPLE_MSAG --id 001 --text "No data for selection" --transport DEVK900001261python $client --dest DEV_100_DEVELOPER_EN activate ZEXAMPLE_MSAG:MSAG/N262```263264### Manage transports265266```powershell267python $client --dest DEV_100_DEVELOPER_EN transports --owner DEVELOPER268python $client --dest DEV_100_DEVELOPER_EN transport-contents DEVK900001269python $client --dest DEV_100_DEVELOPER_EN create-transport --description "TICKET-1234: Feature X" --package ZEXAMPLE_PACKAGE270python $client --dest DEV_100_DEVELOPER_EN move-object ZEXAMPLE_PROGRAM:PROG/P --transport DEVK900002271```272273Never release or delete a transport without contemporaneous human274authorization.275276### Run quality gates277278```powershell279python $client --dest DEV_100_DEVELOPER_EN atc-check ZEXAMPLE_PROGRAM:PROG/P280python $client --dest DEV_100_DEVELOPER_EN abap-unit ZEXAMPLE_PROGRAM:PROG/P281```282283An `UNKNOWN` gate is not a `PASS`. See284[references/command-quality-and-testing.md](references/command-quality-and-testing.md).285286## Error Handling287288- If the client returns `{"error": "Missing connection values ..."}`, follow289 the connection reference; do not retry blindly.290- On HTTP 401 or 403, stop and report; do not retry with the same291 credentials.292- On HTTP 404 for CTS or workarea endpoints, report the endpoint absence293 and suggest the SAP GUI fallback (SE01, SE09, SE10, SE80).294- On HTTP 406 for message-class or text-element reads, use the client295 default (`Accept: */*`); the client already handles this.296- On any partial success from `release-transport`, stop and report per-task297 results before deciding whether to retry.298299Detailed decision trees are in300[references/troubleshooting.md](references/troubleshooting.md).301302## Bundled Resources303304- `scripts/adt-client.py` — Python source (authoritative and only305 distributed entry point).306- `scripts/adt-client.spec` — optional PyInstaller build configuration for307 contributors who want to package a local executable for their own use.308 No prebuilt binary is committed to the default branch.309- `requirements.txt` — Python runtime dependencies.310- `references/*.md` — focused documentation for each command group.311312## Completion Checklist313314Before reporting a task complete, verify:315316- [ ] The last written object was activated, or the user explicitly asked to317 leave it inactive.318- [ ] Any transport that received new objects is either still open (and319 documented) or was released with explicit human authorization.320- [ ] `object-properties` or a similar read-only call confirms the final321 state matches the intent.322- [ ] The final response to the user includes the exact commands run, the323 resulting transport numbers, and any inconclusive quality-check324 outcomes.