Skip to main content
Glama

abapsmith

An MCP server that lets an LLM develop in SAP ABAP on a live system over ADT (/sap/bc/adt/*).

Capabilities

Area

What the server does

Read

Source, outline, single method, line windows, raw properties, version history, diff. DDIC rendered as pseudo-DDL. Every response carries an etag.

Search

Object-name patterns and where-used.

Classes & interfaces

Create, read, update, delete, activate.

Programs & function groups

Programs, function groups, function modules: create, read, update, delete, activate. Includes and transformations: read.

DDIC

Domains, data elements, structures, table types, tables: create, read, update, delete, activate. Message classes: create, read, update, delete. Lock objects: read, update, activate.

CDS

DDL sources and metadata extensions: create, read, update, delete, activate.

RAP & services

Behavior definitions, behavior pool classes, service definitions, service bindings: create, read, update, activate. OData contract read (V2 and V4), metadata only.

BOPF

Business objects, nodes, associations, actions, determinations, validations, queries: create, read, delete. Dangling-reference check. End-to-end run through a generated bridge.

Enhancements

Enhancement spots, BAdI definitions and implementations, filters, source-code plug-ins.

Debugger

Arm breakpoints, trigger a run, step, read the call stack, inspect any variable in scope down to one field or table row.

ABAP Unit

Run existing tests. Four distinct outcomes — "nothing ran" is never reported as a pass.

ATC

Run ABAP Test Cockpit static analysis, return the findings. No IDE needed.

Quick fixes

List and apply ADT position-driven quick fixes as a gated, journalled write. Deterministic proposals only.

Transports

List, show, check, users, create, add user, set owner, delete. Release is separately gated and dry-run unless confirmed.

Run

Classes via IF_OO_ADT_CLASSRUN, and classic reports through a generated bridge, with list output and selection-screen parameters captured.

Activate

Check-only or activate, single object or batched.

Dumps

Read ST22 runtime errors. Variable contents are opt-in.

Data preview

Rows from one DDIC table or view. Opt-in, denylisted, refused on a productive system.

Classic dynpro

Read a screen's fields, flow logic and GUI status; drive a transaction by batch input (opt-in, admin only).

Undo

Local write journal: list, show, and undo a mutation, restoring the exact prior source. Drift is detected and refused.

Per-object-type detail, and the evidence behind every claim above: doc/CAPABILITIES/README.md.

Every response is capped and truncation is line-wise, marked, and names the call that fetches the rest.

Related MCP server: mcp-abap-abap-adt-api

Requirements

  • Node >= 20

  • An ABAP system with ADT enabled (/sap/bc/adt/* reachable over HTTP)

  • A user with S_DEVELOP. A dedicated technical user is recommended.

Install

Claude Code

This repository is a plugin marketplace, so there is nothing to clone and nothing to build:

/plugin marketplace add Freight-Art/abapsmith
/plugin install abapsmith@abapsmith

That installs the MCP server together with the task-shaped skills in skills/, which carry the wire lore an agent needs before it calls a tool. The server runs from bundle/ — a committed, dependency-free build, because plugin installation performs no build step.

To stay on a particular release, or to step back to one after an update, add the marketplace at its tag instead of at main; every release is a vX.Y.Z tag with a CHANGELOG section of the same name:

/plugin marketplace add Freight-Art/abapsmith#v0.3.1
/plugin install abapsmith@abapsmith

/plugin update follows whatever the marketplace points at, so a marketplace added at a tag stays on that tag until you add it again at another one.

The plugin deliberately declares no env block, so configure the connection the way the next section describes: a .env in the directory you start Claude Code from, or exported shell variables. Both reach the server. Wire it into an MCP client is then only for other clients.

Any other MCP client

Not published to a registry — build from a clone.

git clone https://github.com/Freight-Art/abapsmith.git
cd abapsmith
npm install
npm run build

npm run build emits dist/index.js, which is the server entry point.

Configure

Five variables connect to a system. Put them in a .env in the directory the server runs from — it is loaded automatically — or in your MCP client's env block. Copy .env.example for the annotated version.

ABAP_URL=https://abap.example.com:44300
ABAP_USER=DEVELOPER
ABAP_PASSWORD=your-password
ABAP_CLIENT=001
ABAP_SID=A4H
ABAP_MODE=read          # read (default) | edit | admin

ABAP_MODE is the single permission knob. read is an absolute ceiling that no other variable lifts. edit allows write, activate and run. admin adds transport release, transport and cascade delete, and SAP-original enhancement targets. Three capabilities sit outside the ladder and stay off in every mode, admin included, until named explicitly: ABAP_ALLOW_DATA_PREVIEW, ABAP_ALLOW_DUMP_VARIABLES, ABAP_ALLOW_UI_PRESS.

Every other variable — allowlists, pool sizing, journal retention, timeouts, debugger identity — is in doc/CONFIGURATION/README.md.

Wire it into an MCP client

For clients other than Claude Code, which the plugin install above already wires up:

{
  "mcpServers": {
    "abap": {
      "command": "node",
      "args": ["/absolute/path/to/abapsmith/dist/index.js"],
      "env": {
        "ABAP_URL": "https://abap.example.com:44300",
        "ABAP_USER": "DEVELOPER",
        "ABAP_CLIENT": "001",
        "ABAP_SID": "A4H",
        "ABAP_MODE": "read"
      }
    }
  }
}

ABAP_PASSWORD is deliberately absent from that block: keep it in the .env the client's working directory supplies, so the secret never lands in a JSON file that is easy to commit or sync alongside the rest of an editor config. Start on ABAP_MODE=read and opt into edit once you intend to write.

Documentation

doc/CAPABILITIES/README.md

Every object type, framework and capability, with the evidence behind each claim

doc/TOOLS/README.md

Full per-tool parameter reference

doc/CONFIGURATION/README.md

Every environment variable, its default, and its failure mode

doc/SAFETY/README.md

The gate, the modes, and the boundaries that are not security controls

doc/JOURNAL/README.md

Journal format, undo semantics, drift detection, retention

doc/CONCURRENCY/README.md

Session pool, lanes, object gate

doc/LIMITATIONS/README.md

What is unproven, unimplemented, or structurally impossible here

doc/DESIGN-NOTES/README.md

Decisions that are load-bearing and not obvious from the code

doc/TESTING/README.md

Suite layout, fixtures, and how the live tests are gated

CONTRIBUTING.md

Build, test, and the bar for a change

SECURITY.md

Reporting a vulnerability

CHANGELOG.md

What changed, release by release

License

MIT — see LICENSE. Third-party attribution: THIRD-PARTY-NOTICES.md.

Thanks

Big thanks to two projects whose ideas shaped this one:

Available Tools

13 tools
abap_activateB
Destructive

mode=check: syntax check, no lock. mode=activate: check then activate.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDefault activate.
typeNoADT type, e.g. CLAS/OC.
objectNoObject reference.
sourceNoUnsaved draft to check/activate.
affectsNoRequired to activate ENHO/XH or ENHS/XS.
corr_nrNoTransport request. $TMP needs none.
objectsNoBatch activate, 2+ objects; omit `object`. mode=activate only.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already state destructiveHint=true and readOnlyHint=false, and the description adds useful detail that check mode takes no lock while activate proceeds to activation. It does not contradict the annotations, but it also does not disclose what activation actually changes, whether locks are held during activation, or what side effects might occur.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely compact, front-loaded, and contains no waste: each clause maps to one mode. It loses the fifth point only because it is slightly too terse to carry the behavioral nuance that this complex tool likely needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a mutation tool with seven parameters, nested objects, a 50-item batch mode, enhancement-spot requirements, transport request handling, and no output schema. A two-clause description leaves out the high-level activation workflow, batch-vs-single-object semantics, and side effects, so an agent must reconstruct most of the tool's operating context from the schema and sibling names.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 without any extra parameter explanation. The description adds some behavioral meaning for mode (no lock versus check-then-activate), but it does not clarify the meaning or usage of type, object, source, affects, corr_nr, or the batch objects array beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the operation: syntax-check or activate an ABAP object, with mode-specific behavior. It is specific enough to know what the tool does, but it never explicitly names the resource (ABAP development objects) or distinguishes itself from siblings like abap_read/abap_enh, so it stops shy of a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear mode-level guidance: check is syntax-check with no lock, activate is check-then-activate. However, it gives no explicit guidance on when to choose this tool over siblings or when activation should be avoided, leaving usage decisions largely implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_bopfA
Read-only

Reads a BOPF business object's design-time model: show (default, digest) | raw (v4 XML) | search (needs object_type) | check_refs (up to max_sites, default 25).

ParametersJSON Schema
NameRequiredDescriptionDefault
boNoBOPF business object name. Required for show/raw/check_refs.
modeNoDefault "show" (digest). "raw" is the expensive escape hatch.
queryNosearch: free-text filter.
max_sitesNocheck_refs: cap on sites probed. Default 25.
max_resultsNosearch: cap on returned hits.
object_typeNosearch: required, e.g. "BOBF"; omitting it 400s.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals safety, and the description aligns with it ('Reads'). It adds real behavioral context beyond the annotation by labeling raw as expensive and by framing check_refs as probing up to max_sites, which warns of potential cost/scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tight sentence front-loads the core read operation and then uses pipe-separated modes to pack all behavior into a scannable line. Every phrase ('default', 'expensive escape hatch', 'needs object_type', 'default 25') earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with six fully schema-described parameters, the description covers all modes, defaults, and key prerequisites. The only gap is that search/check_refs return shapes are not described and there is no output schema to carry that burden, but invocation decision-making is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds useful semantic color: 'digest' and 'v4 XML' explain what show/raw return, and it restates mode-specific prerequisites and defaults in a compact form. This exceeds the baseline without duplicating every schema detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening verb 'Reads' plus the resource 'a BOPF business object's design-time model' makes the action and object precise. Listing the four modes (show/raw/search/check_refs) further distinguishes it from generic siblings like abap_read and abap_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete mode-selection context: show is the default digest, raw is an expensive escape hatch, search requires object_type, and check_refs is capped by max_sites. It does not explicitly state when to choose this over abap_read/abap_search, so it falls short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_debugA
Destructive

ABAP debugger driver: arm breakpoints, run a program, step, inspect the stack. One session at a time; variables read-only, frames observe-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
runNoThe program to trigger (action="start").
stepNocontinue may end the session (status="dead" plus captured output). runToLine/jumpToLine need toLine; jumpToLine also needs server ABAP_ALLOW_DEBUG_JUMP_TO_LINE=true and confirm:"jumpToLine".
forceNostop only — force-terminates a debuggee left attached by an unclean exit (the "Debuggee already attached" error's escape hatch).
frameNo1-based stackPosition from the last STACK section. Read-only.
actionYesstart needs breakpoints+run. step needs stateId+step. stack needs stateId. frame needs stateId+frame. keepalive/stop/status need nothing.
toLineNoRequired for step="runToLine"/"jumpToLine". 1-based line in the current frame's source.
confirmNoRequired for step="jumpToLine": echo "jumpToLine". Ignored otherwise.
stateIdNoFrom the most recent start/step/stack/frame response; a stale id is refused.
breakpointsNo≥1 entry, required for action="start"; kinds may mix and are validated against SAP before arming. Both kinds take optional condition (ABAP expression, suspend only when true) and skipCount (sent to SAP, NOT enforced — use step:"continue").

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavioral context beyond the annotations: 'One session at a time' reveals a stateful singleton constraint, and 'variables read-only, frames observe-only' clarifies what the driver can and cannot mutate. It does not contradict the readOnlyHint=false or destructiveHint=true annotations because stepping and stopping a debuggee are active operations even though user-visible variables are read-only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The primary verb set is front-loaded, and the second sentence packages three critical constraints compactly. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex nine-parameter tool with nested breakpoint objects and no output schema, yet the rich input-schema descriptions cover action requirements, return-referenced fields like stateId and status, and edge cases like force and jumpToLine. The description supplies the high-level orientation and the singleton/read-only constraints, which combined with the schema is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters in detail, including action dependencies, defaults, required fields, and constraints like 'stale id is refused.' The description itself adds little parameter-level meaning beyond orienting the agent to the debugger domain, which matches the baseline-3 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool is an 'ABAP debugger driver' and lists concrete verbs: 'arm breakpoints, run a program, step, inspect the stack.' This makes the core purpose obvious. However, it does not explicitly distinguish itself from sibling tools like abap_debug_vars or abap_debug_value, though 'variables read-only, frames observe-only' hints at the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides useful context: 'One session at a time' warns against concurrent sessions, and 'variables read-only, frames observe-only' signals limitations. But it does not name alternative tools or state explicit when-to-use/when-not-to-use conditions, leaving the agent to infer the routing decision.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_debug_valueA
Read-only

Tier-2 drill-in: render one variable path in detail, with a row window for tables.

ParametersJSON Schema
NameRequiredDescriptionDefault
fromNoFirst row — tables only. Default 1.
pathYesVariable path, e.g. LT_ITEMS[42]-MATNR. Field symbols keep their angle brackets, e.g. <LS_ITEM>. Unknown paths return empty, not NOT_FOUND.
countNoTables only. Default 20, max 200. Page with "from".
depthNoMax nesting depth. Default 3.
stateIdYesFrom the most recent start/step/stack/frame response.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnlyHint and openWorldHint, lowering the bar for behavioral disclosure. The description adds the row-window behavior for tables and the single-path scope, but does not disclose output shape or how unknown/open-world results are rendered; no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence. 'Tier-2 drill-in' immediately orients the agent, and the row-window clause earns its place as a distinguishing behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only drill-in with fully documented parameters, the description is nearly sufficient. The main gap is an explicit link to sibling tools and the exact usage moment, but schema descriptions for stateId and path cover invocation mechanics, and no output schema is needed for a render-style result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description only gestures at table row windowing (reinforcing from/count) without adding semantic detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('render') and a clear object ('one variable path in detail'), and 'Tier-2 drill-in' signals this is the focused follow-up to broader debug tools. It does not explicitly name a sibling, but the scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Tier-2 drill-in' implies the agent should first obtain a stateId/variable list from a tier-1 tool (likely abap_debug_vars), but it never explicitly states when to choose this over abap_debug or abap_debug_vars, and gives no exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_debug_varsA
Read-only

Survey of every variable in scope at a debugger stop; complex values come back as abap_debug_value stubs.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoDefault all.
filterNoSubstring match on name.
stateIdYesFrom the most recent start/step/stack/frame response.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true and openWorldHint=true, annotations already cover safety. The description adds valuable behavioral context by disclosing that complex values are returned as abap_debug_value stubs rather than fully expanded, which is meaningful for an agent deciding next steps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. It front-loads the core function and tacks on the key behavioral caveat about complex-value stubs, earning its place with zero redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only survey tool with one required parameter and a rich schema, the description covers the essential behavior and return-value format. It could mention pagination or ordering, but given the annotations and the sibling abap_debug_value for expansions, it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with all parameters (scope, filter, stateId) already described in the schema. The description adds no additional parameter-level semantics beyond the overall behavior, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool surveys every variable in scope at a debugger stop, which is a specific verb-noun pairing. It also hints at differentiation from abap_debug_value by mentioning complex values return as stubs, though it doesn't explicitly name the sibling in the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'at a debugger stop' gives clear contextual timing for use, and the stub mention implies that abap_debug_value should be used for expanding complex values. However, it does not explicitly state when not to use this tool or name alternatives beyond the subtle stub reference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_dumpsRead ABAP runtime errors (ST22 short dumps)A
Read-onlyIdempotent

Read ABAP runtime errors (ST22 short dumps) from the system's dump repository — not the exception text of a run this server just triggered. mode=list filters the dump feed; mode=show returns one dump, chapter by chapter. The feed reaches back 8 DAYS ONLY: an empty list means "no dumps in the last 8 days matching this filter", never "nothing failed". Copy key from a list row VERBATIM. show returns the header, source extract, system fields and call stack, and nothing else unless the operator enabled more.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNolist: newest dump to include, YYYYMMDDHHMMSS. No page cursor exists; to page backwards, set to= the oldest timestamp already seen.
keyNoshow, required: key exactly as a list row printed it. Do not trim, re-encode or rebuild it — internal spaces are significant.
maxNolist: rows to request (default 20).
fromNolist: oldest dump to include, YYYYMMDDHHMMSS in the server's local time.
modeNo"list" (default) filters the dump feed; "show" returns one dump by key.
queryNolist: server-side FQL filter, e.g. and ( equals ( user , DEVELOPER ) , equals ( runtimeError , MESSAGE_TYPE_X ) ). Operator FIRST, then attribute, then the value, UNQUOTED. One and(...)/or(...) wrapper is mandatory even for a single predicate; max 2 levels deep. Validated locally before sending.
offsetNoshow: 1-based first line of the returned chapter text.
chaptersNoshow: comma-separated chapter NAMES, e.g. "kap7,kap8,kap11" — names, never the titles, which are translated. Default: where terminated, source extract, system fields, call stack. Every chapter this dump has is listed in the response.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds meaningful operational transparency beyond those annotations: the dump feed only reaches back 8 days, an empty list is not proof of no failures, show returns only specific chapters unless the operator enabled more, and key values must be copied verbatim because spaces are significant.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core purpose, and every sentence adds a distinct operational fact. It packs mode routing, retention semantics, key-handling warnings, and return-content expectations without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 8 parameters, no output schema, and nuanced list/show behavior, the description covers the essential semantics needed to select modes, interpret empty results, construct keys, and know what show returns. The annotations cover safety and idempotence, and the description covers the behavioral edge cases that could otherwise lead to false conclusions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents every parameter (100% coverage), but the description goes beyond it with critical operational details: no page cursor exists and paging is done by setting to to the oldest timestamp seen, keys must not be trimmed or re-encoded, and chapters are selected by untranslated names rather than titles. These details are essential for correct invocation and are not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action and resource: 'Read ABAP runtime errors (ST22 short dumps) from the system's dump repository'. It also distinguishes itself from a different kind of read ('not the exception text of a run this server just triggered') and enumerates the two modes, list and show, so an agent can tell exactly what the tool does without inspecting siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly describes when to use list vs show, explains the 8-day retention implication for interpreting empty lists, and instructs verbatim key copying. It does not explicitly name a sibling tool or exclusion relative to abap_read/abap_search, but the mode-level guidance and the 'not the exception text' exclusion give solid contextual direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_enhA

Default op writes the root adtcore:description of an existing ENHO/XH, ENHO/XHH or ENHS/XS, optionally activating it. ENHO/XHH plug-in source body: use abap_write, not this tool. See operation for the other ops.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYeswrite_description/delete/set_impl_active: container name (never the nested badiImplementation entry - use spec.implName). create_spot/add_badi_def/add_filter_def: spotName. create_impl/set_filter_values: enhName. exercise: badiName. create_hook: new name. discover_hook_anchors: unused.
specNoFields per op (?=optional, else required; numbers=max chars). IDs max 30 chars, see enhancement skill. create_spot: description(60). add_badi_def: badiName, interfaceName, singleUse(bool), shortText(60). add_filter_def: badiName, filterName, filterType(1 upper letter, e.g. C), filterText?(255). create_impl: spotName, badiName, implName, implClass, active(bool), description(60). set_filter_values: spotName, implName, filterName, filterType(as above), compare(=,<>,<,<=,>,>=,EQ,NE,LT,LE,GT,GE), value(255). exercise: methodName, filterName?, filterValue?, params?[{name, kind?(importing/changing/exporting/receiving, default importing, max 1 receiving), value?(req for importing/changing, else forbidden), type?(params[].type: req for changing/exporting/receiving, else forbidden; namespaced type ref)}]. discover_hook_anchors: hostType, hostName, hostUri. create_hook: hostType(PROG/P only), hostName, hostUri, anchorFullName, anchorFullDescription(200), responsible?(12), activate?(bool). set_impl_active: active(bool), implName?(omit only if exactly one entry), description?(60).
typeNoRequired for write_description/delete; unused otherwise.
affectsNoObject affected; required except discover_hook_anchors.
corr_nrNoTransport request (write_description/delete/set_impl_active only).
activateNowrite_description only: activate after a changed write. create_hook uses spec.activate; set_impl_active always activates.
operationNoDefault "write_description". Six create ops: always $TMP, always activate. discover_hook_anchors: read-only. delete needs ABAP_ALLOW_ENHANCEMENT_DELETE=true, irreversible. set_impl_active: reversible.
descriptionNoRequired for write_description/create_hook (new adtcore:description, max 60). Unused otherwise.
expect_etagNoRefuse if etag differs (write_description/delete/set_impl_active only).

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are minimal (readOnlyHint=false, destructiveHint=false), and the description adds optional activation and the source-body scope limit. However, most behavioral details (create ops always $TMP and activate, delete irreversibility, read-only discovery) live only in the operation schema, not in the description; the description itself does not go much beyond the annotations plus the abap_write warning. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the default operation is front-loaded, the key exception follows immediately, and the pointer to operation is efficient. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema is rich enough to support correct invocation, and the description covers the default op plus a critical exception. But with 11 operations, nested parameters, and no output schema, a one-sentence summary of the tool's breadth (creating spots/BAdIs, setting filters, hooks, deletion) would help an agent recognize when abap_enh applies. The current description leans heavily on the agent opening the operation enum.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline of 3 applies; the description's 'root adtcore:description' and 'existing' wording adds only minor context on top of the already-detailed schema. It does not clarify any parameter beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names the default action (writes the root adtcore:description) and the target object types (ENHO/XH, ENHO/XHH, ENHS/XS), so the primary behavior is clear. It also explicitly distinguishes this tool from abap_write for plug-in source bodies. However, it does not provide a high-level statement of the tool's full 11-operation role, leaving the overall purpose to be inferred from the operation enum in the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says not to use this tool for ENHO/XHH plug-in source bodies and routes that case to abap_write. The phrase 'See operation for the other ops' directs the agent to the operation enum for the remaining variants. Broader when-to-use-versus-sibling guidance is absent, but the most important exclusion is covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_journalA
Destructive

History and undo for writes abapsmith made. mode=list: recent writes with entry ids. mode=show: one entry with its before-image. mode=undo: revert it — refuses on drift, delete-gate, or an enhancement object; see abapsmith-recover-a-bad-write for details.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNolist (default): recent writes. show: one entry incl. its before-image. undo: revert one entry.
entryNoJournal entry id from mode=list. Required for show and undo unless `object` is given.
forceNomode=undo: proceed even though the object changed on the server after abapsmith wrote it. This OVERWRITES whatever that other change was. Read the object first.
limitNomode=list: entries to return. Default 20.
objectNoFilter by object name; for undo, targets that object's most recent undoable entry.
sessionNomode=list: filter to one session's entries. "current" resolves to this running server's own session id (see the echoed `session` in the response header).
activateNomode=undo: re-activate after restoring. Default true.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses critical behavioral details: undo refuses on drift, delete-gate, or enhancement objects, and force overwrites other server changes with an explicit 'Read the object first' warning. This is exactly the extra safety context an agent needs for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph that front-loads the core purpose, then uses a compact mode-by-mode breakdown. Every clause adds information, and the pointer to a recovery reference is appropriately brief.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given seven parameters, no output schema, and only destructiveHint as an annotation, the description carries a large burden—and it succeeds. It explains all three modes, entry requirements, undo safety constraints, the force overwrite risk, and where to find more details. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers all parameters with descriptions, so the baseline is 3. The description adds cross-parameter semantics, especially the meaning of mode values, the relationship between entry/object, and the force behavior. That added context lifts it above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'History and undo for writes abapsmith made.' It then enumerates three distinct modes (list, show, undo) with concrete purposes, making it clear what the tool does and how it differs from the broader abap_* sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context for each mode: list for recent writes, show for a before-image, undo for reverting. It also warns about conditions where undo refuses to run. It does not explicitly name sibling tools as alternatives, so it loses a point, but the mode-based guidance is strong enough for an agent to decide when to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_open_urlGet a browser-openable URL for an ABAP object, keyword, or Web Dynpro appA
Read-only

Browser-openable URL: ADT source/HTML (object=, type=/line=), keyword doc (keyword=), or Web Dynpro URL (webdynpro=). Exactly one required. Does not open a browser.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineNoDeep-link line. Only with `object`.
typeNoADT type. Only with `object`.
objectNoObject to open, fuzzy like `abap_read`'s `object`.
keywordNoABAP keyword, e.g. "SELECT".
webdynproNoWeb Dynpro application name.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and open-world safe. The description adds useful behavioral context beyond annotations: it will not actually open a browser, and it requires exactly one of the mutually exclusive modes. No contradiction with the annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the output, lists the input modes, then gives the two most important caveats in short sentences. Every sentence earns its place and nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple URL-generation tool with read-only annotations, the description is mostly sufficient: it defines what the URL is for, which parameter to use, and the key side-effect note. It could go slightly further by specifying the shape of the returned URL or error behavior for invalid combinations, but the title and schema fill in most gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds extra meaning by grouping the parameters into ADT source/HTML (object/type/line), keyword doc (keyword), and Web Dynpro URL (webdynpro), and by clarifying that exactly one is required even though the schema lists no required fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the deliverable as a browser-openable URL and enumerates the three supported input modes (ADT source/HTML, keyword doc, Web Dynpro URL). The explicit note 'Does not open a browser' prevents a likely misinterpretation and distinguishes this tool from read/search-type siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Exactly one required' gives a clear usage constraint, and 'Does not open a browser' tells the agent what the tool will not do. However, it does not explicitly name sibling alternatives or state exactly when to prefer this tool over another, so usage guidance is strong but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_readRead ABAP objectA
Read-only

Read an ABAP object: source or pseudo-DDL. Returns an etag. Capped ~15k tokens — use outline/method/offset for large objects. Example: {"object":"ZCL_FOO","type":"CLAS/OC"}.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNodiff: newer side, same forms as `from`.
fromNodiff: older side — version, transport, or "active".
typeNoADT type to disambiguate. Not readable: SHLP/DH VIEW/DV TRAN/T PROG/PS PROG/PC PROG/PT SUSO/B TABL/DI.
viewNohistory: versions. diff: hunks. Omit for normal read.
limitNoMax lines (chars if format=raw).
formatNoraw: XML, not pseudo-DDL (DTEL/DE DOMA/DD TTYP/DA MSAG/N ENQU/DL SRVB/SVB only).
methodNoOnly this method/component.
objectYesName, "class X", "table Y", or ADT URI.
offsetNo1-based first line (chars if format=raw).
contextNodiff: context lines per hunk. Default 3.
includeNoClass include. "testclasses"=Unit tests. Default "main".
outlineNoComponent list with line ranges.
versionNoDefault: current (active or newest inactive).
enhancementsNoBAdI/plug-in/enhancement-spot decode (ENHO/XH,XHH,ENHS), not source.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds valuable behavioral facts beyond the annotations: it returns an etag, is capped at ~15k tokens, and can return outlines or partial components. This gives the agent useful expectations about output size and response characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no wasted words. It front-loads the core purpose, then gives the most operationally important constraint (token cap) and a practical example. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of 14 parameters and no output schema, the description does a good job covering the key operational concern — truncation at ~15k tokens — and the workaround for large objects. The schema already documents each parameter thoroughly, so the description doesn't need to repeat them. It could mention diff/history modes or the return format beyond 'etag', but these are secondary given schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds extra semantic value by showing a concrete example ('{"object":"ZCL_FOO","type":"CLAS/OC"}') and by linking outline/method/offset to the token cap. This helps the agent understand how the parameters work together beyond the schema's individual field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is explicit: 'Read an ABAP object: source or pseudo-DDL.' It names a specific verb, resource, and scope, and adds distinguishing context like 'Returns an etag' and the large-object strategy. This is enough to tell it apart from sibling tools like abap_search or abap_enh.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: reading ABAP object source or pseudo-DDL. It also provides internal usage guidance for large objects — 'use outline/method/offset' — which helps the agent choose the right parameters. It does not explicitly name alternative siblings or exclusion criteria, but the purpose is clear enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_serviceA
Read-onlyIdempotent

OData contract a RAP SRVB publishes: entity sets, keys, fields, nav, CRUD/search/page perms; V2/V4 detected. Cannot read entity data — contract only. Unpublished bindings named as such.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNocontract (default): sets/keys/perms. entity: expand one set, needs entity. raw: EDMX.
entityNoSet/type to expand. Required for mode=entity.
bindingYesSRVB name, not the CDS view or SRVD.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context beyond this: it only exposes contract metadata, never entity data; it detects V2/V4; and unpublished bindings are labeled as such. This gives the agent a clear model of what the tool will and will not do.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and every sentence earns its place: the first defines the contract contents, the second states the hard limitation, and the third handles the unpublished-binding edge case. The most important scoping constraint, 'contract only,' is front-loaded near the beginning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description explains what the return concept covers: entity sets, keys, fields, navigation, CRUD/search/page permissions, and V2/V4 detection. It also flags the key limitation and an edge case. Minor gaps like exact response structure or how modes map to output shapes are left to the schema, but the description is sufficient for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents binding, mode, and entity. The description adds context about the contract contents and V2/V4 detection, but it does not substantially expand the meaning of individual parameters beyond what the schema already provides. A baseline of 3 is appropriate since the schema carries the parameter-semantics load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as returning the OData contract a RAP SRVB publishes, including entity sets, keys, fields, navigation, and permissions. It explicitly distinguishes itself from data-reading tools by stating 'Cannot read entity data — contract only.' The resource and scope are specific enough that an agent can tell this apart from siblings like abap_read or abap_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear when-not-to-use signal by stating 'Cannot read entity data — contract only,' which tells the agent this is for contract metadata, not entity data retrieval. It also notes unpublished bindings are named as such, which helps set expectations. However, it does not explicitly name an alternative tool or state 'use X instead,' so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abap_transportA
Destructive

Inspect and manage CTS transport requests: list, show, check (does an object need a transport?), users, create, addUser, setOwner, delete, removeObject (drop one E071 entry and its CTS lock so its request can then be deleted — if the object still exists, its lock goes too, and CTS refuses this for some entries, leaving the request undeletable). Reads are always allowed; mutating operations obey the write allowlists. Release is a separate tool, abap_transport_release.

ParametersJSON Schema
NameRequiredDescriptionDefault
userNoUser: filter for list, new member/owner otherwise. Required for operation=addUser/setOwner.
objectNoObject name. Required for operation=check, and for operation=removeObject (the entry to remove). Optional anchor for create.
confirmNoEcho the request number to arm delete or removeObject.
packageNoDevelopment package (devclass). Required for operation=create.
operationYesWhat to do. create/addUser/setOwner need write access (ABAP_MODE=edit or admin, or legacy ABAP_ALLOW_WRITE=true when ABAP_MODE is unset); delete additionally needs the admin-only transport-delete ceiling (ABAP_MODE=admin — no legacy flag grants it) and confirm; removeObject (drop one E071 entry and its CTS lock, e.g. for an object already deleted from the system, so its request can then be deleted — if the object still exists, its lock goes too; CTS refuses this when the request holds 2 or more E071 rows for that object (same PGMID+OBJECT+OBJ_NAME, e.g. a create and a delete both recorded under one request), leaving the request undeletable through abapsmith) needs that same admin-only transport-delete ceiling and confirm. Required args: list/users none; show transport; check object; create package+description; addUser/setOwner transport+user; delete transport+confirm; removeObject transport+object+confirm.
transportNoRequest/task number, e.g. A4HK900123. Required for operation=show/addUser/setOwner/delete/removeObject.
descriptionNoShort text for the new request, max 60 chars. Required for operation=create.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag destructiveHint=true, but the description goes well beyond that: it discloses auth requirements (ABAP_MODE=edit/admin, legacy ABAP_ALLOW_WRITE, admin-only transport-delete ceiling with 'no legacy flag grants it'), the side effects of removeObject (drops one E071 entry and its CTS lock; 'if the object still exists, its lock goes too'), and the failure mode where CTS refuses removal, 'leaving the request undeletable.' This is precisely the behavioral context the rubric rewards beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the verb+resource and operation list, with the release routing placed at the end. However, the removeObject caveat appears both in the description and nearly verbatim in the operation parameter description, a redundancy that costs density; the length is largely justified by nine operations and a complex permission matrix.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive multi-operation tool with no output schema, the description covers required arguments per operation, permission ceilings, and the removeObject failure mode thoroughly. The main gap is that return values for list/show/users are never hinted at, and there is no guidance on edge states like deleting a request that still has tasks, which an agent would need to predict outcomes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, and the parameter descriptions are already rich (per-operation required args, confirm echo semantics, A4HK900123 example). The description adds meaning beyond the schema by defining what operations do — check = 'does an object need a transport?' and the full removeObject workflow — helping an agent map parameters to intent rather than just parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Inspect and manage CTS transport requests' and enumerates all nine operations (list, show, check, users, create, addUser, setOwner, delete, removeObject). It differentiates from its closest sibling by name ('Release is a separate tool, abap_transport_release') and defines ambiguous operations such as check ('does an object need a transport?').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the release use case away ('Release is a separate tool, abap_transport_release') and states the permission model: 'Reads are always allowed; mutating operations obey the write allowlists.' The operation parameter description further specifies per-operation prerequisites (admin-only transport-delete ceiling, confirm echo, required args per operation), leaving no ambiguity about when each operation is permitted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 4 tool updatesv0.3.2
    • Changedabap_debug2 fields changed
      • changedInput schema / properties / breakpoints / description
        Previous value: -"≥1 entry, required only for action=\"start\". Line/exception kinds may mix; validated against SAP before arming."New value: +"≥1 entry, required for action=\"start\"; kinds may mix and are validated against SAP before arming. Both kinds take optional condition (ABAP expression, suspend only when true) and skipCount (sent to SAP, NOT enforced — use step:\"continue\")."
      • changedInput schema / properties / breakpoints / items / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "condition": {
        -        "description": "ABAP condition expression — breakpoint suspends only when true, e.g. \"sy-tabix = 500\".",
        -        "maxLength": 255,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "line",
        -        "type": "string"
        -      },
        -      "line": {
        -        "description": "1-based source line to break at. SAP may snap this to the nearest executable statement — if it does, the start response reports the corrected line.",
        -        "maximum": 999999,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "object": {
        -        "description": "The class or report to break in (any form abap_read/abap_run accept: bare name, \"class ZCL_FOO\", a raw ADT URI, ...). Resolved server-side to a source URI.",
        -        "type": "string"
        -      },
        -      "skipCount": {
        -        "description": "Hits to ignore before suspending (0 = every hit). NOT ENFORCED by this backend — every hit still suspends; use step:\"continue\" instead.",
        -        "maximum": 1000000,
        -        "minimum": 0,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "object",
        -      "line"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "condition": {
        -        "description": "ABAP condition expression — breakpoint suspends only when true, e.g. \"sy-tabix = 500\".",
        -        "maxLength": 255,
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "exceptionClass": {
        -        "description": "ABAP exception class to break on when it is raised anywhere, e.g. CX_SY_ZERODIVIDE.",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "exception",
        -        "type": "string"
        -      },
        -      "skipCount": {
        -        "description": "Hits to ignore before suspending (0 = every hit). NOT ENFORCED by this backend — every hit still suspends; use step:\"continue\" instead.",
        -        "maximum": 1000000,
        -        "minimum": 0,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "exceptionClass"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "condition": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "line",
        +        "type": "string"
        +      },
        +      "line": {
        +        "description": "1-based; SAP may snap it to the nearest executable statement (the start response reports the correction).",
        +        "maximum": 999999,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "object": {
        +        "description": "Class or report to break in — any form abap_read/abap_run accept.",
        +        "type": "string"
        +      },
        +      "skipCount": {
        +        "maximum": 1000000,
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "object",
        +      "line"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "condition": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "exceptionClass": {
        +        "description": "Exception class to break on, e.g. CX_SY_ZERODIVIDE.",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "exception",
        +        "type": "string"
        +      },
        +      "skipCount": {
        +        "maximum": 1000000,
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "exceptionClass"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedabap_read1 field changed
      • changedInput schema / properties / format / description
        Previous value: -"raw: XML, not pseudo-DDL (DOMA/DTEL/TTYP/MSAG/ENQU only)."New value: +"raw: XML, not pseudo-DDL (DTEL/DE DOMA/DD TTYP/DA MSAG/N ENQU/DL SRVB/SVB only)."
    • Changedabap_search1 field changed
      • changedInput schema / properties / type / description
        Previous value: -"ADT type filter. One of: BDEF CLAS DDLS DDLX DEVC DOMA DTEL ENHO ENHS ENQU FUGR INTF MSAG PROG SRVB SRVD TABL TTYP XSLT; or a full code, e.g. \"CLAS/OC\"."New value: +"ADT type filter. One of: BDEF CLAS DCLS DDLA DDLS DDLX DEVC DOMA DRUL DTEL ENHO ENHS ENQU FUGR INTF MSAG PROG SRVB SRVD TABL TTYP TYPE XSLT; or a full code, e.g. \"CLAS/OC\"."
    • Changedabap_transport5 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Echo the request number to arm delete."New value: +"Echo the request number to arm delete or removeObject."
      • changedInput schema / properties / object / description
        Previous value: -"Object name to check. Required for operation=check; optional anchor for create."New value: +"Object name. Required for operation=check, and for operation=removeObject (the entry to remove). Optional anchor for create."
      • changedInput schema / properties / operation / description
        Previous value: -"What to do. create/addUser/setOwner need write access (ABAP_MODE=edit or admin, or legacy ABAP_ALLOW_WRITE=true when ABAP_MODE is unset); delete additionally needs the admin-only transport-delete ceiling (ABAP_MODE=admin — no legacy flag grants it) and confirm. Required args: list/users none; show transport; check object; create package+description; addUser/setOwner transport+user; delete transport+confirm."New value: +"What to do. create/addUser/setOwner need write access (ABAP_MODE=edit or admin, or legacy ABAP_ALLOW_WRITE=true when ABAP_MODE is unset); delete additionally needs the admin-only transport-delete ceiling (ABAP_MODE=admin — no legacy flag grants it) and confirm; removeObject (drop one E071 entry and its CTS lock, e.g. for an object already deleted from the system, so its request can then be deleted — if the object still exists, its lock goes too; CTS refuses this when the request holds 2 or more E071 rows for that object (same PGMID+OBJECT+OBJ_NAME, e.g. a create and a delete both recorded under one request), leaving the request undeletable through abapsmith) needs that same admin-only transport-delete ceiling and confirm. Required args: list/users none; show transport; check object; create package+description; addUser/setOwner transport+user; delete transport+confirm; removeObject transport+object+confirm."
      • changedInput schema / properties / operation / enum
        Previous value: -[
        -  "list",
        -  "show",
        -  "check",
        -  "users",
        -  "create",
        -  "addUser",
        -  "setOwner",
        -  "delete"
        -]New value: +[
        +  "list",
        +  "show",
        +  "check",
        +  "users",
        +  "create",
        +  "addUser",
        +  "setOwner",
        +  "delete",
        +  "removeObject"
        +]
      • changedInput schema / properties / transport / description
        Previous value: -"Request/task number, e.g. A4HK900123. Required for operation=show/addUser/setOwner/delete."New value: +"Request/task number, e.g. A4HK900123. Required for operation=show/addUser/setOwner/delete/removeObject."
  2. 13 tool updatesv0.3.0
    • First observedabap_activate
    • First observedabap_bopf
    • First observedabap_debug
    • First observedabap_debug_value
    • First observedabap_debug_vars
    • First observedabap_dumps
    • First observedabap_enh
    • First observedabap_journal
    • First observedabap_open_url
    • First observedabap_read
    • First observedabap_search
    • First observedabap_service
    • First observedabap_transport

TDQS

A3.9/5.0
Disambiguation5/5

Each tool targets a distinct ABAP resource or action: source access, search, enhancements, transports, debugging, BOPF, OData, dumps, and journaling. Even the debug-related trio is clearly layered by description. No two tools appear to do the same thing.

Naming Consistency4/5

All tools share the abap_ prefix and use consistent snake_case, which makes them predictable. However, the convention is not uniformly verb_noun: abap_read and abap_activate are actions, while abap_transport and abap_service are resource-style names.

Tool Count5/5

13 tools is a reasonable breadth for an ABAP system toolkit covering source access, search, activation, transports, debugging, dumps, BOPF, and OData introspection. Each tool has a distinct purpose and earns its place without bloating the surface.

Completeness3/5

The set covers most read, search, activate, debug, and transport workflows well, but there are notable dead ends: abap_enh directs source-body writes to an abap_write tool that is not present, and transport management omits the release operation despite describing it as separate. These gaps prevent agents from completing some obvious lifecycle steps.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    C
    maintenance
    Enables AI agents to read, write, activate, and transport ABAP code in SAP systems via ABAP ADT REST API, without needing SAP GUI.
    4
    24
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to perform ABAP Development Tools operations on SAP ERP (ECC and S/4HANA) systems, including source code editing, object activation, syntax checks, and ABAP unit tests.
    2
    MIT

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/Freight-Art/abapsmith'

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