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_PASSWORD is one of five mutually exclusive credential methods — the others are a session cookie, an X.509 client certificate, a static bearer token, and OAuth 2.0 client credentials; see doc/CONFIGURATION/connection.md for all five.

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.

The server speaks stdio by default — that's what the plugin install above and the mcpServers block below both use. ABAP_MCP_TRANSPORT=http runs the same binary as a Streamable HTTP service instead (ABAP_MCP_HTTP_HOST/_PORT/_PATH), so it can run next to the SAP system and serve several MCP sessions over the network rather than one process per local conversation. A non-loopback bind with no ABAP_MCP_HTTP_TOKEN set is refused at startup. See doc/CONFIGURATION/transport.md for the variables and doc/SAFETY/remote-transport.md for what the bearer token does and does not guarantee once this is reachable over a network.

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 — and, in whichever other credential method is in play, ABAP_TOKEN, ABAP_OAUTH_CLIENT_SECRET, ABAP_SERVICE_KEY, and ABAP_CLIENT_KEY_PASSPHRASE — are deliberately absent from that block: keep them in the .env the client's working directory supplies, so a 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/FLUID-API/README.md

The fluid API: one package, one manifest format, one wire protocol for the tools that install ABAP to run

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

28 tools
abap_activateA
Destructive

mode=check: syntax check, no lock. mode=activate: check then activate. mode=format: pretty-print (source=text, or object=format-and-save).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDefault activate. format pretty-prints ABAP source: `source` alone formats text (no write), `object` alone formats and saves the object if it changed — never both.
typeNoADT type, e.g. CLAS/OC.
objectNoObject reference.
sourceNoUnsaved draft to check/activate, or text to format.
affectsNoRequired to activate ENHO/XH or ENHS/XS.
corr_nrNoTransport request. $TMP needs none. Not for text format.
objectsNoBatch activate, 2+ objects; omit `object`. mode=activate only.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already mark the tool as non-read-only and destructive. The description adds useful side-effect boundaries: check takes 'no lock', source-only format does 'no write', and object format saves only if the object changed. This is genuinely informative beyond the annotation booleans, though it does not discuss authorization or transport-release consequences.

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 compact sentence that front-loads the three modes and their key constraints. Every clause earns its place, and there is no filler or repetition of schema fields.

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?

For a 7-parameter tool with nested objects, batch activation, enhancement-spot requirements, and transport fields, the description itself is thin: it omits batch mode, the affects requirement scenario, and result/output behavior. The detailed input schema compensates for parameter semantics, but with no output schema and no guidance on expected results, the description remains only minimally 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 description coverage is 100%, so the input schema already defines parameters like object, objects, type, affects, and corr_nr. The description mostly restates mode behavior and the 'never both' constraint from the schema. It adds little new parameter-level meaning, 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 names three concrete operations with explicit verbs and targets: 'mode=check: syntax check', 'mode=activate: check then activate', and 'mode=format: pretty-print'. This makes the tool's purpose clear and specific. It does not explicitly differentiate from sibling tools like abap_write or abap_transport, so some differentiation is left to inference.

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 gives good internal mode-selection context: check avoids locking, activate means check-then-activate, and format has distinct source/object behavior. It also includes the exclusion 'never both' for format modes. However, it never states when this tool should be preferred over sibling ABAP tools, so cross-tool usage guidance is implied rather than explicit.

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

abap_atcC
Read-onlyIdempotent

Run ABAP Test Cockpit static analysis on an object. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description does add one genuinely useful behavioral fact — that a call returns a refusal and sends nothing to the SAP system — but the surrounding ABAP_ALLOW_WRITE/ABAP_MODE text is internally contradictory, which undermines rather than clarifies behavior.

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

Conciseness2/5

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

Only the first sentence is front-loaded and useful; the remaining three are garbled, repetitive, and self-contradictory about whether the tool is locked and whether a write flag matters. This is padding that actively confuses rather than earns its place.

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?

For a zero-parameter tool with annotations and no output schema, the description's one job is to make the operational state clear, and it partly does (it will refuse, nothing reaches SAP). But the contradictory ABAP_ALLOW_WRITE instructions leave an agent unable to tell whether the tool is permanently disabled or can be enabled, which is exactly the ambiguity that should have been resolved.

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 tool takes zero parameters (100% schema coverage), so the baseline is 4 and there is nothing for the description to compensate for. The ABAP_ALLOW_* names it mentions are server-side environment variables, not input parameters, so they add no parameter semantics either way.

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 opening sentence gives a specific verb and resource: 'Run ABAP Test Cockpit static analysis on an object,' which is unambiguous on its own. However, it offers no differentiation from the many abap_* siblings (abap_test, abap_run, abap_quick_fix), and the sentences that follow muddy rather than sharpen the purpose.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus abap_test, abap_run, or abap_quick_fix, nor any prerequisite for a normal invocation. The only usage-adjacent text concerns ABAP_ALLOW_WRITE/ABAP_ALLOW_PACKAGES environment variables, and it is self-negating ('does not enable writes' followed by 'Set ABAP_ALLOW_WRITE=true'), leaving the agent unsure whether the tool can be used at all.

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_bopf_deleteB
Read-onlyIdempotent

Delete a BOPF business object. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior4/5

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

Beyond the annotations, it discloses concrete behavior: the tool is LOCKED on this server and 'returns a refusal and sends nothing to the SAP system', which is exactly the kind of outcome context annotations cannot express. This is consistent with readOnlyHint=true and destructiveHint=false, though the config instructions contradict themselves ('does not enable writes' followed by 'Set ABAP_ALLOW_WRITE=true').

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

Conciseness3/5

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

Three sentences, but the ordering is poor: the most decision-relevant fact (it refuses and sends nothing) is buried at the end, while the middle sentence about ABAP_MODE and ABAP_ALLOW_WRITE is confusing and self-contradictory. Front-loading the lock state would make it much tighter.

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?

With zero params, no output schema, and annotations covering the safety profile, the description only needs to convey behavior, which it largely does. However, the contradictory environment-variable advice leaves an agent unsure whether the lock can be lifted, so it is not fully 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?

The tool takes zero parameters, so per the rubric the baseline is 4. The description adds no parameter detail, but none is needed.

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 opening sentence states a specific verb and resource ('Delete a BOPF business object'), which is enough to separate it from siblings like abap_bopf_edit and abap_bopf_test. The subsequent sentences muddy this by declaring the operation is locked, but the core purpose is still identifiable.

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

Usage Guidelines2/5

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

It never names an alternative tool or states a when-to-use condition relative to siblings. The ABAP_ALLOW_WRITE/ABAP_MODE configuration guidance is not usage guidance for selecting this tool, and it is internally tangled, so the agent gets little help deciding when to call it.

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

abap_bopf_editA
Read-onlyIdempotent

Make one design-time edit to a BOPF business object, or create one. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint, so the bar is lower, but the description adds real context beyond structured fields: the server is LOCKED, the call 'returns a refusal and sends nothing to the SAP system,' and the enabling variables are named. The middle sentence is muddled ('ABAP_ALLOW_WRITE does not enable writes' immediately followed by 'Set ABAP_ALLOW_WRITE=true'), which blunts an otherwise strong disclosure.

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

Conciseness3/5

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

The critical fact (LOCKED / refusal) appears in sentence two rather than being front-loaded, and the enablement sentence is self-contradictory about what ABAP_ALLOW_WRITE actually does. Four sentences deliver essentially two ideas, and the config guidance could be compressed into one clause.

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 zero-parameter tool with no output schema, the description covers the essentials an agent needs: what it nominally does, that this server refuses the call, that nothing reaches SAP, and how writes would be enabled. Only the confused config sentence keeps it from being fully self-sufficient.

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 tool takes zero parameters, so the schema carries no semantic burden and the baseline for empty parameter sets is 4. The variables mentioned (ABAP_ALLOW_WRITE, ABAP_ALLOW_PACKAGES) are server configuration, not inputs, so there is no parameter meaning left to add.

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 a concrete verb and resource: 'Make one design-time edit to a BOPF business object, or create one,' which is far more specific than a restatement of the name. However, it never distinguishes itself from the adjacent siblings abap_bopf (read), abap_bopf_delete, or abap_bopf_test, so an agent must infer the split from names alone.

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?

Usage is implied by the resource type ('design-time edit to a BOPF business object'), and the description states the precondition for actually writing (ABAP_ALLOW_WRITE=true, optional ABAP_ALLOW_PACKAGES). It gives no when-not guidance and never says why an agent would pick this over abap_enh, abap_write, or abap_bopf_delete.

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

abap_bopf_testC
Read-onlyIdempotent

Run a BOPF business object end to end, writing real rows. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior3/5

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

Annotations cover the safety profile (readOnlyHint=true, destructiveHint=false, idempotentHint=true), and the description adds genuinely non-obvious context: the server-side lock, the ABAP_ALLOW_WRITE gate, and that a call produces a refusal with no SAP traffic. However, the headline claim of 'writing real rows' pulls against the read-only/idempotent annotations and muddies rather than clarifies the real behavior.

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

Conciseness2/5

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

The text front-loads a purpose line, then spends most of its length on environment-variable plumbing ('ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package'), which does not earn its place for an agent that cannot set those variables. The result is dense and roundabout rather than crisp.

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?

For a zero-parameter tool with no output schema the description does explain the effective outcome of a call (refusal, no SAP traffic), which is the key behavior. But it omits any sibling routing and never resolves whether the tool is meant to be invoked at all on this locked server, leaving the agent without a decision rule.

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 tool takes no parameters, so per the rubric the baseline is 4. There is nothing for the description to disambiguate on inputs, and it correctly avoids inventing parameters.

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

Purpose3/5

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

The opening clause 'Run a BOPF business object end to end, writing real rows' gives a verb and resource, but it is immediately undercut by the later statement that calling it 'returns a refusal and sends nothing to the SAP system,' leaving the agent unsure whether this tool writes or is a no-op. It also never differentiates itself from close siblings like abap_bopf, abap_bopf_edit, or abap_bopf_delete.

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

Usage Guidelines2/5

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

The description gives configuration advice (set ABAP_ALLOW_WRITE=true) rather than usage guidance — it never says when to prefer this over abap_bopf, abap_bopf_edit, or abap_bopf_delete. The one implicit steer, that the tool is LOCKED on this server, is useful but is framed as operator setup, not agent decision 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
idNoaction="breakpoints"/"watch" op="remove" only — the id to remove.
opNoaction="breakpoints"/"watch" only. breakpoints defaults to "list"; watch defaults to "add" when "variable" is set, else "list".
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. breakpoints needs stateId (op add/remove) or nothing (op list, default). watch needs stateId+variable (op add, default when variable given) or stateId+id (op remove) or stateId (op list). 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 (12-char token; the full id or a prefix of at least 8 chars is accepted too); a stale id is refused.
variableNoaction="watch" only — variable path to watch, same syntax abap_debug_value accepts. Presence selects op="add".
conditionNoaction="watch" op="add" only — ABAP expression; the watchpoint only suspends when it evaluates true.
breakpointsNo≥1 entry, required for action="start" and for action="breakpoints" op="add"; kinds (line/exception/statement/message) may mix and are validated against SAP before arming; condition and skipCount are optional on every kind, skipCount sent to SAP but NOT enforced.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the description is not required to repeat those. It adds valuable context beyond annotations: 'One session at a time' and 'variables read-only, frames observe-only.' These behaviors are not inferable from annotations and help the agent understand session constraints and scope. No contradiction with 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 two sentences with zero fluff. The first sentence front-loads the core actions, and the second adds key constraints. Every phrase earns its place, making it highly efficient and easy to parse.

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 tool's complexity (13 params, nested objects, many actions) and the extremely detailed schema, the description provides a concise yet sufficient overview. It covers the main actions and crucial constraints (single session, read-only variables) without redundant repetition of schema details. It does not mention all actions (e.g., keepalive, status), but the schema handles those, so nothing critical is missing for an agent to understand the tool's role.

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 all 13 parameters are thoroughly documented in the input schema. The description itself does not elaborate on parameter semantics beyond listing high-level actions. Since the schema carries the full burden, the description adds no extra parameter-level meaning. A baseline score of 3 is appropriate.

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 states the tool's purpose: 'ABAP debugger driver: arm breakpoints, run a program, step, inspect the stack.' It also adds distinct constraints like 'One session at a time; variables read-only, frames observe-only,' which helps differentiate it from sibling tools like abap_debug_vars or abap_debug_value that focus on variable inspection. The verb-resource pairing is specific and unambiguous.

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

Usage Guidelines2/5

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

The description does not explicitly guide the agent on when to use this tool versus its many siblings. It does not mention alternatives like abap_debug_vars for variable reading or abap_run for executing programs. While the description implies it is the central debugger controller, there is no explicit when-not-to-use or alternative routing, which is a significant gap given the tool's complexity and the large sibling list.

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

abap_debug_valueB
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 (12-char token; full id or a prefix of at least 8 chars also accepted).

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds 'with a row window for tables', which is also documented in the schema's 'from' and 'count' parameter descriptions. No additional behavioral context is provided, such as how paths are resolved, what happens on unknown paths (though the schema notes this), or any side effects (none due to read-only). The description adds little beyond the purpose itself, so it only slightly goes beyond the 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?

The description is a single sentence that front-loads the core purpose ('render one variable path in detail') and includes a key detail ('row window for tables') that informs both purpose and usage. Every word adds value; it is concise, structured, and easy to parse. There is no fluff or repetition.

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 tool with all parameters documented in the schema, the description is adequate. It states the main function and a notable pagination feature. It does not describe the output format or structure, but since there is no output schema, an agent might benefit from a hint about the return shape. However, given the tool's simplicity and the schema's thorough parameter coverage, the description is sufficiently complete for correct invocation. The only minor gap is the lack of explicit return-value information.

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%, meaning all five parameters have descriptions in the schema. The tool description itself does not elaborate on any parameter beyond what the schema provides—'row window for tables' duplicates the 'tables only' notes for 'from' and 'count'. Therefore, the description contributes no additional parameter meaning, and the baseline score of 3 applies because the schema does the heavy lifting.

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 a specific action ('render one variable path in detail') and a specific resource ('one variable path'). The term 'Tier-2 drill-in' implies this is a deeper dive following a higher-level listing, likely abap_debug_vars among the siblings. It differentiates from the sibling set by indicating a focused, single-variable operation, though it does not name an exact alternative. This is clear and moderately distinguishing, but not at the level of explicitly naming the sibling it differs from.

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?

Usage context is only implied via 'Tier-2 drill-in', which suggests it should be used after an initial variable listing (e.g., abap_debug_vars), but there is no explicit statement of when to use this tool versus alternatives, nor any exclusions or conditions. The phrase 'Tier-2' is a weak implicit signal but leaves the agent to infer the appropriate workflow. No alternative tool is named or contrasted.

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 (12-char token; full id or a prefix of at least 8 chars also accepted).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark the tool as read-only, so safety is covered. The description adds meaningful behavioral context beyond annotations by disclosing that complex values are returned only as stubs, which is critical for an agent to know before invoking the tool.

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?

A single sentence conveys the purpose, timing, and an important output characteristic with no filler. The key behavioral fact is front-loaded.

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, the description covers input context via the schema, and the return behavior via the stub note. Without an output schema, it could also explain what primitive values look like or how to dereference stubs, but the sibling name abap_debug_value plus the stub statement gives enough direction 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 fully documents stateId, scope, and filter. The description adds no parameter-level detail, but none is needed because the structured schema already carries that burden.

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 uses a specific verb ('survey') and resource ('every variable in scope at a debugger stop'), clearly distinguishing this tool from sibling abap_debug_value, which is meant for individual value inspection. The mention of complex values returning as abap_debug_value stubs further disambiguates its role.

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 clearly scopes usage to a debugger stop, which is the essential precondition. It stops short of explicitly saying 'use abap_debug_value instead for inspecting a single value,' though that alternative is strongly implied by the stub behavior.

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 a summary (exception, short text, error analysis, how to correct, source line, top of the call stack, chapter index); section or chapters returns chapter text — where terminated, source extract, system fields, 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.
sectionNoshow: which chapter text to return instead of the default summary. "analysis" = short text, error analysis, how to correct, exception chain; "source" = where terminated + source extract; "stack" = call stack; "environment" = system/user/session fields; "all" = the full default set (where terminated, source extract, system fields, call stack). Alternative to chapters.
chaptersNoshow: comma-separated chapter NAMES, e.g. "kap7,kap8,kap11" — names, never the titles, which are translated. Alternative to section. Without either, show returns a summary; every chapter this dump has is listed in the response.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior, and the description adds substantial operational context: 8-day feed retention, empty list semantics, verbatim key copying, and exactly what sections or chapters return. This goes well beyond the annotations without contradicting them.

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 dense but every sentence earns its place: purpose and scope first, followed by critical caveats, then mode/output details. It is long only because the tool's behavior is complex, and it avoids restating the tool name or echoing the schema for padding.

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 no output schema, the description sufficiently explains return values, list limitations, show summary contents, and chapter section behavior. With 9 parameters and complex filtering/paging semantics, this description provides the key operational warnings an agent needs to avoid misinterpretation.

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 100% of parameters with detailed descriptions, so the baseline is 3. The description adds meaningful operational nuance such as the 8-day window, the chapter-name-versus-title rule, and the warning that an empty list does not mean nothing failed. This goes beyond the schema to improve correct invocation.

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 states it reads ABAP runtime errors (ST22 short dumps) from the system's dump repository, using a specific verb and resource. It also explicitly distinguishes itself from the exception text of a run this server just triggered, helping an agent avoid confusing it with run-related 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 context for when to use each mode, including list versus show, and emphasizes the 8-day retention window so an empty list is not misread. It does not explicitly name sibling alternatives or state when not to use the tool, but the behavior is well-scoped.

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; IDs max 30 chars; lengths and value rules in doc/TOOLS/enhancements.md). create_spot: description. add_badi_def: badiName, interfaceName, singleUse, shortText. add_filter_def: badiName, filterName, filterType, filterText?. create_impl: spotName, badiName, implName, implClass, active, description. set_filter_values: spotName, implName, filterName, filterType, compare, value. exercise: methodName, filterName?, filterValue?, params?[{name, kind?, value?, type?}] (params[].type: required for changing/exporting/receiving, forbidden otherwise; a namespaced type ref is allowed). discover_hook_anchors: hostType, hostName, hostUri. create_hook: hostType(PROG/P only), hostName, hostUri, anchorFullName, anchorFullDescription, responsible?, activate?. set_impl_active: active, implName?(omit only if exactly one entry), description?.
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

A4.2/5.0
Behavior3/5

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

Annotations only say readOnlyHint=false and destructiveHint=false, so the description adds that the default op writes and optionally activates. However, it does not disclose side effects of the other operations (e.g., irreversible delete, forced activation of create ops), which are only present in the schema, not the description.

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 short sentences, front-loaded with the default operation and ending with a clear pointer to the operation parameter. No waste.

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 complex 11-operation tool, the description relies heavily on the detailed schema, which covers all operations and parameter semantics. It is complete enough for selection, though it could briefly warn about destructive or always-activating operations in the description itself.

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%, so the baseline is 3 and the schema already documents all parameters. The description adds little parameter-level meaning beyond pointing to the operation parameter for the other ops.

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 verb ('writes'), a specific resource ('root adtcore:description'), and the exact object types (ENHO/XH, ENHO/XHH, ENHS/XS). It also explicitly differentiates from abap_write for source-body edits, so an agent can distinguish the default operation from 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 Guidelines5/5

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

It gives an explicit when-not: 'ENHO/XHH plug-in source body: use abap_write, not this tool.' It also directs the agent to the operation parameter for the other modes, covering the intended selection path.

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

abap_fluidC
Read-onlyIdempotent

Deploy and run small generated ABAP tools inside $ABAPSMITH_FLUID_API. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds useful context that the tool is locked and returns a refusal without contacting the SAP system, but it is internally confusing about whether setting ABAP_ALLOW_WRITE=true would enable writes. It does not contradict the annotations directly.

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

Conciseness2/5

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

The description is a single dense paragraph with ambiguous pronouns and contradictory statements about locking versus enabling writes. The key locked/refusal behavior is not front-loaded cleanly, and several clauses do not earn their place for a zero-parameter tool.

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?

Given zero parameters, rich annotations, and no output schema, the description needs only to explain the tool's actual effect. It does say the call is refused and nothing is sent to SAP, but the contradictory deploy/run framing and unclear env-var instructions leave the agent without a coherent picture of when or why to use it.

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 tool takes zero input parameters, so the baseline score is 4. The description mentions environment variables rather than input arguments, and the schema itself is empty with 100% coverage.

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

Purpose3/5

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

The opening sentence states a specific verb and resource: 'Deploy and run small generated ABAP tools inside $ABAPSMITH_FLUID_API.' However, the subsequent claim that calling it returns a refusal and sends nothing to the SAP system conflicts with the stated deploy/run purpose, leaving the effective purpose muddled. No sibling differentiation is provided.

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

Usage Guidelines2/5

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

The description discusses environment variables such as ABAP_ALLOW_WRITE and ABAP_ALLOW_PACKAGES, but gives no clear when-to-use guidance or named alternatives among the many abap_* siblings. The instructions are further undermined by the statement that calling the tool is refused on this server.

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

abap_fpm_readC
Read-onlyIdempotent

Read SAP FPM/FBI screen configurations; every call deploys a throwaway bridge class. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description does add genuinely non-obvious behavior: a throwaway bridge class is deployed on every call, and on this server the call returns a refusal without touching SAP. Those additions are valuable, but the middle sentences about ABAP_ALLOW_WRITE/ABAP_MODE are self-contradictory and reduce trust in the rest.

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

Conciseness2/5

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

Purpose is front-loaded, which is good, but the body is rambling and internally contradictory ("ABAP_ALLOW_WRITE does not enable writes" followed by "Set ABAP_ALLOW_WRITE=true"). Sentences do not earn their place; the lock explanation could be one clear line.

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?

For a zero-parameter, no-output-schema tool the definition is nearly complete: it explains that the call returns a refusal and sends nothing to SAP, which is the key operational fact. But the garbled lock/env-variable narrative leaves an agent unsure whether the tool can be invoked at all, and no sibling alternative is named.

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?

There are zero parameters, so the schema is complete by default (baseline 4). However, the description introduces ABAP_ALLOW_WRITE and ABAP_ALLOW_PACKAGES in an imperative tone ("Set ...=true") that could be mistaken for invocation parameters rather than server environment configuration. That ambiguity costs a point.

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 opening clause gives a specific verb and resource: "Read SAP FPM/FBI screen configurations." That is enough to distinguish it from generic siblings like abap_read or abap_search. However, the remaining four sentences are consumed by lock-state and environment-variable talk that obscures rather than sharpens the purpose.

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

Usage Guidelines2/5

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

The description does signal that the tool is LOCKED and that "Calling it returns a refusal and sends nothing to the SAP system," which is a when-not-to-use hint. But it immediately undercuts itself with "Set ABAP_ALLOW_WRITE=true," leaving the agent unable to tell whether the tool is usable. No alternatives or routing guidance to siblings is given.

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

abap_imgRead IMG customizing catalogA
Read-only

Read the IMG customizing catalog: search (query) finds activities; show (activity) returns its path, objects and tables; tree (node/treeId optional) lists a node's children; objects (object, kind optional) returns a customizing object's DDIC tables and fields. search/tree page via after/limit (default 25, ceiling 200) — pass back the exact {"after": ""} a response gives; there is no numeric offset. Fields not valid for the mode are rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoobjects only: a hint for the object's kind, used when the name is ambiguous.
modeYessearch: find activities by title/id text. show: an activity's reference-IMG path, objects and tables. tree: a node's reference-IMG children. objects: an object's DDIC tables and fields.
nodeNotree only: the node to list children of. Omit for that tree's own root.
afterNosearch/tree only: opaque keyset cursor copied from a previous response's paging note. Omit for the first page.
limitNosearch/tree only: max rows to return. Default 25, ceiling 200.
queryNosearch only: a term with no "*" matches as a substring; "*" is an explicit wildcard, "*" alone matches everything.
objectNoobjects only: a view, view cluster, table, or customizing object name.
treeIdNotree only: the tree a node id belongs to, echoed back as treeId on a previous tree response (e.g. after following a REF node). Omit to use the reference-IMG tree.
activityNoshow only: the IMG activity id to display.
languageNoSingle-character SAP language key (SPRAS), e.g. E or D — not EN/DE. Defaults to the server's configured language, else E.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark readOnlyHint and openWorldHint, but the description adds substantial behavioral details: paging via opaque cursor with no numeric offset, exact cursor format to pass back, default/ceiling limits, and mode-specific field rejection. This goes well beyond the structured 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?

The description is compact and front-loaded, starting with the overall purpose, then briefly enumerating modes and key constraints. Every sentence contributes; the paging and validation rules are stated succinctly without 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 tool with 10 parameters and 4 modes, the description covers all modes, parameter applicability, paging, and validation. It does not detail response structures or error behavior, but given the read-only annotations and the lack of an output schema, the core call semantics are complete enough.

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?

Beyond the 100% schema coverage, the description maps each parameter to its mode (query→search, activity→show, node/treeId→tree, object/kind→objects) and explains paging semantics, wildcard behavior, language key format, and field rejection rules—all adding meaning not obvious from the schema alone.

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 states 'Read the IMG customizing catalog' and enumerates four distinct modes (search/show/tree/objects), each with a specific verb and resource. It differentiates from sibling abap_img_edit, which presumably modifies the catalog, making the read-only purpose clear.

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 explains what each mode does and which parameters apply to which mode, giving clear context for selecting the right mode. However, it does not explicitly mention when to prefer this tool over siblings like abap_img_edit or abap_read, nor does it provide when-not-to-use guidance.

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

abap_img_editC
Read-onlyIdempotent

Preview and write IMG/customizing table rows. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.3/5.0
Behavior2/5

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

Annotations declare readOnlyHint=true and destructiveHint=false, which the description contradicts by claiming the tool writes rows. The description also asserts the tool is 'LOCKED' and 'returns a refusal,' which is a behavioral claim, but it muddles rather than clarifies the safety profile. It does disclose the configuration variable as the deciding factor, which is one useful nugget, but the core behavioral claim conflicts with the structured metadata.

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

Conciseness2/5

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

The first sentence is reasonable, but the rest of a five-sentence passage is spent unpacking one environment variable. The parenthetical about ABAP_ALLOW_PACKAGES is rambling and contains meta-commentary about defaults. The structure buries the operational instruction (set a flag to unlock) inside explanatory noise.

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?

For a zero-parameter tool with annotations, the description should be crisp. Instead, it is incomplete because it never clearly states the tool's effect when unlocked, nor why it would be preferable to abap_img. It provides a postcondition ('returns a refusal and sends nothing') only for the locked state, omitting the primary behavior.

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?

With 0 parameters in the schema, the baseline is 4. The description does not invent nonexistent parameters, and the mention of ABAP_ALLOW_WRITE is environment configuration rather than tool input. However, the description never states that this tool takes no parameters, which could confuse an agent and is a missed opportunity.

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

Purpose2/5

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

The description opens with 'Preview and write IMG/customizing table rows,' which gestures at a purpose, but it immediately abandons that to discuss configuration flags. It pairs 'preview' and 'write' as a single verb phrase, which is confusing, and it never states what the tool actually does when it's not refusing. It sits next to abap_img, abap_bopf_edit, and abap_write without explaining the distinction.

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

Usage Guidelines2/5

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

The description explains the environmental precondition (ABAP_ALLOW_WRITE=true) but does not say when an agent should prefer this over abap_img or abap_write, which are the obvious siblings. There is no 'when to use' or 'when not to use' guidance beyond the lock state. The reader learns that it will refuse, but not what the intended use case is.

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. Parameters: mode (list|show|undo|reconcile, default list), entry, object, detail, limit, session, force, activate, outcome, reason. Common calls: mode=list (recent writes with entry ids); mode=show entry= (one entry with its before-image; detail=full for the complete images); mode=undo entry= activate=true (revert it — refuses on drift, delete-gate, or an enhancement object; see abapsmith-recover-a-bad-write); mode=reconcile entry= outcome=<succeeded|failed> reason= (close a stranded pending entry — journal bookkeeping only, nothing is sent to SAP).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNolist (default): recent writes. show: one entry incl. its before-image. undo: revert one entry. reconcile: close a stranded pending entry with an outcome you establish and a stated reason.
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.
detailNoshow only. "summary" (default): header plus a unified diff of before-image → after-image, capped at about 2,000 characters. "full": the complete before-image (and after-image when one was recorded), as before.
objectNoFilter by object name; for undo, targets that object's most recent undoable entry.
reasonNomode=reconcile: how you established that outcome. Required, recorded verbatim on the entry, and the only evidence it will ever carry for the asserted outcome.
outcomeNomode=reconcile: the outcome you are asserting for a `pending` entry. Required. `pending` is the state being left, so it is not offered.
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.4/5.0
Behavior5/5

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

With only destructiveHint=true and readOnlyHint=false in annotations, the description carries the behavioral burden and handles it well: undo refuses on drift, delete-gate, or enhancement objects; force overwrites concurrent changes; reconcile sends nothing to SAP. These details meaningfully extend the annotations without contradicting them.

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: purpose, parameter inventory, then four parenthetical call patterns. It stays dense but readable, and every clause contributes either mode semantics, a safety caveat, or a routing hint.

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 10-parameter, four-mode tool with no output schema, the description covers mode behavior, parameter interactions, safety gates, and the special reconcile non-SAP behavior. It is slightly thin on exact return formatting or error conventions, but provides enough context to invoke the tool correctly in most situations.

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 value by showing parameter combinations for each mode and by adding safety semantics not fully stated in schema descriptions, such as the reconcile bookkeeping-only guarantee and the undo refusal conditions.

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+resource pairing: 'History and undo for writes abapsmith made.' It names the four modes (list, show, undo, reconcile) and provides concrete common-call examples, which clearly distinguishes it from sibling tools like abap_write or abap_transport.

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 common-call patterns give practical guidance for when to use each mode, and the reconcile note explicitly scopes that mode to journal bookkeeping only. However, it never names an alternative tool or states a when-not-to-use condition, leaving the tool-selection decision largely implicit.

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_quick_fixC
Read-onlyIdempotent

List and apply ADT quick fixes at one source position. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds genuinely new behavior: the tool is locked on this server and calling it returns a refusal without sending anything to SAP. However, the surrounding logic is garbled ('ABAP_ALLOW_WRITE does not enable writes... so that variable is what decides it', then 'Set ABAP_ALLOW_WRITE=true'), which muddies an otherwise useful disclosure.

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

Conciseness2/5

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

The useful purpose sentence is followed by three sentences of dense, self-contradictory server-config text about environment variables. That material does not earn its place for an agent selecting a tool, and the structure front-loads a purpose it then undermines.

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?

For a zero-parameter tool with no output schema, the description never explains how a quick fix is identified or what listing returns. Combined with the missing position parameter and the muddled lock explanation, an agent cannot tell what would actually happen or how to invoke it meaningfully.

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?

With zero parameters and 100% schema coverage, the baseline is 4. The description is downgraded because it references configuration knobs (ABAP_ALLOW_WRITE, ABAP_ALLOW_PACKAGES) and a 'source position' that appear nowhere in the empty schema, so it does not clarify the actual (absent) inputs and instead introduces entities the agent cannot supply.

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

Purpose3/5

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

The first sentence gives a verb and resource: 'List and apply ADT quick fixes at one source position.' But the scope phrase 'at one source position' is unactionable given the schema has zero parameters, and nothing distinguishes this from siblings like abap_write, abap_enh, or abap_read. The purpose is stated but immediately buried under server-config discussion.

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

Usage Guidelines2/5

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

There is no when-to-use guidance relative to alternatives, nor any exclusions. The only guidance is operational server state ('LOCKED on this server... calling it returns a refusal'), which tells the agent the tool is inert but not when to prefer this over any sibling.

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, pseudo-DDL, a DEVC/K package listing, or (SUSO/B, TABL/DI) a read-only catalog render; view= selects docu/digest/history/diff/definition/lineage/footprint. A CLAS/INTF/PROG/FUGR source above 150 lines or 8k chars answers with its outline by default — then method=, pattern= (regex, with context), offset/limit, or full=true. To learn a method's signature, use method= with include="definitions" (declaration only); method= also finds inherited members (superclasses and interfaces) and reports foundOn. Returns an etag; capped ~15k tokens, truncation marked. Example: {"object":"ZCL_FOO","type":"CLAS/OC"}.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNodiff: newer side, same forms as `from`.
fromNodiff: older side — version, transport, or "active".
fullNoWhole source even above the default-outline threshold.
lineNo1-based source line. Required with view="definition"; refused otherwise.
typeNoADT type to disambiguate. DEVC/K: package listing (types/depth filter it). SUSO/B: renders the object's DEFINITION (fields, permitted activities) from the catalog — NOT who holds it, no AGR_*/UST* table is read. TABL/DI: <TABLE>/<INDEX> catalog render. Not readable: PROG/PS PROG/PC PROG/PT.
viewNohistory: versions. diff: hunks. definition: element at line/column. lineage: CDS sources down to base tables. footprint: database writes and commits. docu: SAP documentation (type="SIMG" + object=<abap_img activity id> for an IMG activity). digest: one-page overview. Omit for a normal read.
depthNoDEVC/K: subpackage nesting depth, default 1, max 3. view="lineage": levels of underlying views, default 5, max 10.
fieldNoview="lineage" only: trace one field back to its base columns.
limitNoMax lines (chars if format=raw).
typesNoDEVC/K only: filter package contents to these kind codes, e.g. ["CLAS","DDLS"].
columnNo0-based column. Default 0. Only meaningful with view="definition"; refused otherwise.
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).
contextNoLines around each pattern match (default 2) or per diff hunk (default 3).
includeNoClass include. "testclasses"=Unit tests. Default "main".
outlineNoComponent list with line ranges. Default for CLAS/INTF/PROG/FUGR above 150 lines or 8000 chars unless method/include/offset/limit/pattern/full is given.
patternNoRegex (case-insensitive): only matching lines, numbered, with `context` lines around each (like grep -n -C). Max 50 matches unless limit= is given; offset= sets the first line scanned.
versionNoDefault: current (active or newest inactive).
enhancementsNoBAdI/plug-in/enhancement-spot decode (ENHO/XH,XHH,ENHS), not source.

TDQS

A4.3/5.0
Behavior4/5

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

The description is consistent with the readOnlyHint annotation and reinforces it by calling the catalog render 'read-only'. It adds valuable non-obvious behavior beyond annotations: large class/source objects default to an outline, method= reports foundOn for inherited members, responses carry an etag, are capped around 15k tokens, and mark truncation. No contradiction with annotations is present.

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 dense but every sentence contributes: scope, default outline behavior, signature guidance, result-size cap, truncation marking, and an example. It is a single long paragraph rather than structured bullets, but for 21 parameters it remains efficient and front-loads the core read operation before explaining mode variants.

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 21 parameters and no output schema, the description covers the main invocation modes, the default outline threshold, parameter combinations, result-size limits, and an example. It does not fully enumerate every possible response shape for views like diff, docu, or digest, but the schema provides 100% parameter coverage, and the description supplies enough behavioral context for safe invocation.

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, but the description goes further by showing how parameters combine: method= with include="definitions", pattern= with context and offset/limit, and full=true to override the outline default. The concrete example {'object':'ZCL_FOO','type':'CLAS/OC'} also helps agents understand how object and type interact.

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 'Read an ABAP object' and then enumerates concrete read targets: source, pseudo-DDL, DEVC/K package listing, and read-only catalog renders for SUSO/B and TABL/DI. This is a specific verb+resource mapping, and the explicit 'read-only' wording distinguishes it from write/edit siblings like abap_write and abap_edit.

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 explicit mode-level guidance: use method= with include="definitions" for a method signature, pattern= for grep-like matching, and full=true to bypass the default outline threshold. It does not explicitly name alternative sibling tools or say when to prefer abap_search over abap_read, but the major when-to-use cases within this tool are clearly specified.

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

abap_runC
Read-onlyIdempotent

Execute an IF_OO_ADT_CLASSRUN class or report and capture its output. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior3/5

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

The lock details ('ABAP_ALLOW_WRITE does not enable writes, ABAP_MODE decides it', 'calling it returns a refusal and sends nothing to the SAP system') add genuine context beyond the readOnlyHint/idempotentHint annotations. However, it's odd that a run tool is readOnly while describing write-enabling variables, creating some conceptual friction though not a direct contradiction.

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

Conciseness2/5

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

Four sentences, three of which are about a server-side lock rather than the tool. The most important fact (it executes ABAP) is front-loaded but then the lock details dominate, and the 'so that variable is what decides it' phrasing is confusing and referent-ambiguous.

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?

For a zero-param, no-output-schema tool, the core purpose and lock behavior are covered. But the description gives no info on output format, error behavior when unlocked, or how the agent should actually proceed given the lock – leaving a practical gap.

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?

Zero parameters, so baseline 4 applies. The description correctly notes there are no inputs to configure, though it names environment variables that aren't schema parameters.

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

Purpose3/5

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

It states a specific action ('execute an IF_OO_ADT_CLASSRUN class or report and capture its output'), which is clearer than a bare name. But the sentence is immediately buried under lock/refusal text, and it never distinguishes itself from siblings like abap_write or abap_read.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no alternative routing; the only condition given ('set ABAP_ALLOW_WRITE=true') is a lock that the tool itself refuses. The agent is told it will be refused but not how to actually run ABAP through this server.

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

abap_serviceA
DestructiveIdempotent

OData contract a RAP SRVB publishes: entity sets, keys, fields, nav, CRUD/search/page perms; V2/V4 detected. Cannot read entity data — contract only. op="publish"/"unpublish" register or deregister the binding in the OData service runtime (admin-mode ceiling, confirm required to arm). Unpublished bindings named as such.

ParametersJSON Schema
NameRequiredDescriptionDefault
opNoread (default): contract/entity/raw as above. publish/unpublish: register or deregister the binding in the OData service runtime — needs confirm, and is off unless ABAP_ALLOW_SERVICE_PUBLISH permits it.
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.
confirmNoRequired to arm op=publish/unpublish: the binding name, echoed back exactly. Omit it first to get a dry run.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag non-read-only and destructive behavior. The description adds valuable context beyond that: publish/unpublish register/deregister the binding in the OData runtime, require confirm and admin-mode ceiling, and unpublished bindings are named as such. It also notes V2/V4 detection. This provides behavioral nuance the annotations do not convey, with no contradictions.

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 dense sentences with no filler. The main purpose is front-loaded ('OData contract a RAP SRVB publishes'), followed by a key limitation, then side-effect conditions. Every clause earns its place, and the telegraphed style is information-dense without being bloated.

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 five parameters, two enums, and no output schema, the description sufficiently covers the tool's scope, limitations, and operational prerequisites. It explains what the contract includes, what it cannot do, and the publish/unpublish workflow. The schema fills in parameter details, so nothing critical for correct invocation is missing.

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 thorough per-parameter descriptions. The description echoes the op behavior ('op="publish"/"unpublish"') but does not add new parameter-specific meaning beyond what the schema already states. Baseline 3 is appropriate since the schema does the heavy lifting.

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 states a specific verb and resource: 'OData contract a RAP SRVB publishes' and enumerates what the contract contains (entity sets, keys, fields, nav, perms). It clearly distinguishes itself from data-reading tools with 'Cannot read entity data — contract only' and explicitly names its ops (publish/unpublish). This makes its purpose unmistakable among the many abap_* 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 gives clear context for when to use publish/unpublish: 'admin-mode ceiling, confirm required to arm' and 'off unless ABAP_ALLOW_SERVICE_PUBLISH permits it.' It also states an explicit when-not: 'Cannot read entity data — contract only.' However, it does not name an alternative sibling tool (e.g., abap_read) for data reads, so it lacks explicit alternative routing.

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

abap_testC
Read-onlyIdempotent

Run ABAP Unit tests and report each method's verdict. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.6/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds a confusing claim that the tool is 'LOCKED,' that calling it 'returns a refusal,' and that no request is sent — which reads as behavior but contradicts the stated purpose of running tests, and gives no coherent account of what actually happens.

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

Conciseness2/5

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

The useful purpose statement is front-loaded, but it is followed by several garbled sentences about ABAP_ALLOW_WRITE, ABAP_MODE and package scoping that do not clearly resolve into a single actionable meaning. Sentences like 'that variable is what decides it' have no clear antecedent, so the length is not earning its place.

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?

There is no output schema, so the description should explain what running tests returns; instead it says the call is refused, which leaves the agent unable to know the actual outcome. For a zero-param tool with rich annotations, the description needed to clarify invocation behavior and it does the opposite.

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 tool takes zero parameters, so per the rubric the baseline is 4. Schema coverage is reported at 100% with no properties to document, and the description introduces no parameter concepts beyond environment variables that are not inputs.

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

Purpose3/5

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

The opening sentence names a specific verb and resource ('Run ABAP Unit tests and report each method's verdict'), which is clear enough. But the remainder muddles it badly: it claims calling the tool 'returns a refusal and sends nothing to the SAP system,' leaving the agent unsure whether the tool actually runs anything. It also doesn't distinguish this from siblings like abap_bopf_test or abap_atc.

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

Usage Guidelines2/5

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

The description references config variables (ABAP_ALLOW_WRITE, ABAP_ALLOW_PACKAGES, ABAP_MODE) but never states when to use this tool versus alternatives such as abap_bopf_test or abap_run. The 'guidance' is about environment toggles, not about tool selection or preconditions an agent can act on.

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

abap_traceA
Destructive

ABAP runtime tracing (SAT): records everything a traced request's dispatch touches — time per call and every database access. op="run" (default) traces one execution of a class/report and reads the result back; op="start" arms a request to trace a later run yourself; op="list" shows existing runs/requests; op="read" reads a run's hit list, DB accesses, or call tree; op="delete" removes a run or request.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoA trace run id (op=read) or run/request id (op=delete); bare id or the full path a previous list/create answered with.
opNoOperation. Default "run". One of: start, run, list, read, delete.
topNoCap on rows shown. Default 20, max 100. op=read (hitlist/tree) and op=run only.
kindNoWhat to list. Default "runs". One of: runs, requests. op=list only.
rootNoAnchor the tree view at the first call-tree node matching this text (case-insensitive substring on description or calling-program name), overriding the automatic entry-node anchor. op=read view=tree only.
typeNoADT type, e.g. CLAS/OC, when ambiguous. op=start/run only.
viewNoWhat to read. Default "hitlist". One of: hitlist, db, tree. op=read only.
depthNoMax call-tree depth relative to the traced object's own entry node. Default 4, max 12. op=read view=tree only.
objectNoClass or report to trace. Required for op=start and op=run.
aggregateNoAggregate repeated calls (no call tree afterwards). Default true. op=start/run only.
db_eventsNoRecord database events. Default true. op=start/run only.
sql_traceNoRecord SQL statements. Default true. op=start/run only.
executionsNoHow many executions the request stays armed for, default 1, max 5. op=start only — op=run always arms a single execution.
descriptionNoShort label for the trace request (max 60 chars). op=start/run only.
max_secondsNoTrace duration cap in seconds. Default 600, max 1800. op=start/run only.
max_size_kbNoTrace file size cap in KB. Default 30720, max 102400. op=start/run only.
internal_tablesNoRecord internal-table operations. Default false. op=start/run only.
procedural_unitsNoRecord procedural units (FORM/FUNCTION/METHOD calls). Default true. op=start/run only.

TDQS

A4/5.0
Behavior4/5

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

Annotations already flag this as destructive (destructiveHint=true) and not read-only, and the description adds meaningful behavior: op=delete removes runs/requests, op=start arms a request, and op=run traces and reads back results. It covers the key side effects beyond what the annotations alone state.

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, information-dense, and front-loaded: it states the core purpose first, then cleanly maps each operation to its effect. There is no filler, and 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?

Given the tool's complexity (5 operations, 18 parameters, no output schema), the description covers the operation semantics well and even notes defaults like op=run. It does not describe the exact shape of results or prerequisites beyond what the schema already provides, but for selecting and invoking the tool it is largely 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 description coverage is 100%, so the baseline is 3. The description enriches the op parameter by explaining what each operation does, but it does not add meaning for the many other parameters, which are already well-documented in the input 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 opens with a specific resource, ABAP runtime tracing (SAT), and a clear action: recording time per call and database access for a request's dispatch. It then enumerates each operation (run, start, list, read, delete) with concrete effects, making the tool's purpose obvious and distinguishing it from generic ABAP read/run/debug siblings.

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 gives clear within-tool guidance for choosing among operations, such as using op=start to arm a later trace versus op=run to trace immediately. However, it does not address when to choose abap_trace over sibling tools like abap_run, abap_debug, or abap_test, nor does it state exclusions or alternatives.

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, log (a request's export/import log per target system), queue (a target system's import buffer), create (kind="workbench" default, or "copies" with target), addUser, setOwner, delete, removeObject (drop one E071 entry and its CTS lock). list/show/check/users/log/queue are plain reads, always allowed; create/addUser/setOwner need write access; delete/removeObject additionally need the admin-only transport-delete ceiling. Release is a separate tool, abap_transport_release. Semantics of log/queue/copies/removeObject: doc/TOOLS/transports.md.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNooperation="create" only. "workbench" (default): a normal transportable change request. "copies": a snapshot sent to a target system, originals untouched; requires target.
userNoUser: filter for list, new member/owner otherwise. Required for operation=addUser/setOwner.
domainNoTMS transport domain of system, e.g. DOMAIN_A4H. Optional; TMS resolves the local domain when omitted.
objectNoObject name. Required for operation=check/removeObject (removeObject: the entry to remove). Optional anchor for create with kind="workbench" (default); not for kind="copies", which is created empty.
systemNoTarget system whose import queue to read, e.g. QAS. Required for operation="queue".
targetNoTarget system for operation="create" with kind="copies", e.g. A4H. A transport of copies with no target cannot be imported anywhere, so abapsmith refuses to create one.
confirmNoEcho the request number to arm delete or removeObject.
packageNoDevelopment package (devclass). Required for operation=create.
operationYesWhat to do. list/show/check/users/log/queue are plain reads, always allowed. create/addUser/setOwner need write access (ABAP_MODE=edit or admin, or legacy ABAP_ALLOW_WRITE=true when ABAP_MODE is unset); kind="copies" needs no extra ceiling. removeObject and delete share one ceiling: delete additionally needs the admin-only transport-delete ceiling (ABAP_MODE=admin — no legacy flag grants it) and confirm; removeObject needs that same ceiling and confirm. Required args: list/users none; show transport; check object; log transport; queue system; create package+description (plus target when kind="copies"); 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 and for operation=log.
descriptionNoShort text for the new request, max 60 chars. Required for operation=create.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=true), the description discloses concrete behavioral constraints: which operations are always allowed, which need write access, and that delete/removeObject require confirm plus the admin-only ceiling. This is exactly the type of operational context an agent needs to invoke safely.

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 dense but every clause carries necessary information: operation list, access levels, required arguments, and a pointer to deeper docs. It could be broken into sections for readability, but given the tool's complexity, the single-paragraph format is still efficient and front-loaded with the core purpose.

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 multi-operation tool with 11 parameters, no output schema, and destructive operations, the description covers the essential execution context: operations, permissions, required arguments, confirm flow, and where to find detailed semantics. Nothing an agent needs to call it correctly 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 100% of parameters with descriptions, but the tool description adds operation-to-parameter mapping (e.g., 'delete transport+confirm', 'create package+description') and clarifies defaults like kind='workbench' and why copies require target. This adds meaning beyond the schema without duplicating it.

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 'Inspect and manage CTS transport requests' and then lists the full operation set, giving a specific verb and resource. It explicitly distinguishes release as a separate tool, so an agent can tell this apart from abap_transport_release without opening either schema.

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?

The description provides explicit when-to-use guidance by categorizing operations as plain reads versus write/delete operations, and details the exact permission ceilings (write access, admin-only transport-delete ceiling) and required arguments per operation. It also names the sibling tool for release, making the routing decision unambiguous.

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

abap_transport_releaseB
Read-onlyIdempotent

Release one CTS transport request — irreversible. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. ABAP_ALLOW_TRANSPORT_RELEASE does not enable releasing a transport request, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Set ABAP_ALLOW_TRANSPORT_RELEASE=true. Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

The description adds genuinely useful behavioral context beyond the annotations: the tool is locked on this server, will return a refusal, and sends nothing to SAP. But this collides with the annotations, which declare readOnlyHint=true and destructiveHint=false while the description headlines the operation as an irreversible release — so the safety profile an agent reads from structured data conflicts with the stated nature of the action.

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

Conciseness2/5

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

The purpose is front-loaded, but the middle of the description is near-duplicated boilerplate: two consecutive sentences with identical structure explaining that an env var does not enable the action and that ABAP_MODE is unset and "decides it." The repetition wastes space and makes the actual gating logic harder to parse.

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?

For a zero-parameter tool with no output schema, the description covers the critical fact that the tool is disabled and will refuse. It nonetheless leaves the agent unsure what the call returns when the gates are enabled, and the contradictory framing of the action's safety leaves the operational picture incomplete.

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 has zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. The env-var names it mentions (ABAP_ALLOW_WRITE, ABAP_ALLOW_TRANSPORT_RELEASE, ABAP_ALLOW_PACKAGES) are server configuration, not call parameters, so they add no parameter semantics.

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 opening sentence gives a specific verb and resource — "Release one CTS transport request — irreversible" — which clearly separates it from siblings like abap_transport or abap_write. The remainder of the description muddies this by explaining that the operation is actually locked out, but the nominal purpose 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?

The description does convey the gating condition for use (ABAP_ALLOW_WRITE=true and ABAP_ALLOW_TRANSPORT_RELEASE=true plus ABAP_MODE) and warns that calling it as-is yields a refusal. However, it never states when an agent should prefer this over the sibling abap_transport, nor what the agent should do instead in the locked state.

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

abap_uiB
Read-onlyIdempotent

Drive classic SAP dynpro screens via batch input: read one screen, or run a scripted transaction. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds genuinely new context ('LOCKED on this server', 'returns a refusal and sends nothing to the SAP system'), but it is internally confusing and self-contradictory — it first says ABAP_ALLOW_WRITE does not enable writes, then instructs 'Set ABAP_ALLOW_WRITE=true' — so the added value is diluted.

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

Conciseness2/5

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

The first sentence is well front-loaded, but the remaining env-var sentences are jumbled, repetitive, and self-contradictory ('ABAP_ALLOW_WRITE does not enable writes' vs 'Set ABAP_ALLOW_WRITE=true'). They consume space without conveying a coherent, actionable instruction.

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?

For a parameterless tool with no output schema the bar is low, and the description does convey that the tool is locked and returns nothing. However, the muddled env-var discussion leaves the agent unclear about whether the tool does anything at all, and it never explains the two stated modes (read screen vs run transaction) under the locked state.

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 tool takes zero parameters, and schema coverage is 100%, so there is no parameter semantics for the description to carry. Baseline of 4 for a parameterless tool is appropriate.

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 opening sentence gives a specific verb and resource ('Drive classic SAP dynpro screens via batch input') plus the two modes ('read one screen, or run a scripted transaction'), which lets an agent distinguish it from siblings like abap_read or abap_run. It is somewhat muddied by the subsequent environment-variable paragraph, but the core purpose is stated clearly.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to choose this over sibling tools such as abap_read, abap_run, or abap_fluid. The only usage-relevant statement is that calls are refused on this server, which is a behavioral caveat rather than directional guidance.

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

abap_writeC
Read-onlyIdempotent

Create, change or delete an ABAP object: save/check/activate. LOCKED on this server: ABAP_ALLOW_WRITE does not enable writes, and ABAP_MODE is not set, so that variable is what decides it. Set ABAP_ALLOW_WRITE=true (ABAP_ALLOW_PACKAGES is optional — it narrows the default, which is every package). Calling it returns a refusal and sends nothing to the SAP system.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior1/5

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

The description claims create/change/delete operations, but annotations declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, directly contradicting a mutating tool. This is a serious annotation contradiction. The lock/refusal information is useful behavioral context, but the fundamental contradiction dominates.

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

Conciseness3/5

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

The description is somewhat rambling and mixes lock semantics, environment variables, and refusal behavior in a run-on fashion. The core purpose is front-loaded, but the middle sentences are difficult to parse and could be tighter.

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?

Given the zero-parameter schema and no output schema, the description should clarify the write contract (what gets created/changed/deleted, required state). Instead it focuses on a lock state and contradictory operation claims, leaving the actual write behavior under-specified and inconsistent with annotations.

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?

There are zero parameters, so the baseline is 4. The description mentions environment variables (ABAP_ALLOW_WRITE, ABAP_ALLOW_PACKAGES, ABAP_MODE) that affect behavior, which adds meaning beyond the empty schema, though these are not tool parameters.

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 states a specific verb set (create, change, delete) and resource (ABAP object), and mentions save/check/activate phases. It distinguishes the tool from read-oriented siblings like abap_read or abap_search, though it does not explicitly name alternatives.

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?

It implies usage for writing ABAP objects but provides no explicit when-to-use vs when-not-to-use guidance or comparison to siblings like abap_activate or abap_enh. The lock condition is described, which is a form of conditional availability, but usage context for the write itself is thin.

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.

  1. 11 tool updatesv0.6.25
    • Changedabap_debug2 fields changed
      • changedInput schema / properties / breakpoints / description
        Previous value: -"≥1 entry, required for action=\"start\" and for action=\"breakpoints\" op=\"add\"; kinds (line/exception/statement/message) may mix and are validated against SAP before arming. All kinds take optional condition (ABAP expression, suspend only when true) and skipCount (sent to SAP, NOT enforced — use step:\"continue\")."New value: +"≥1 entry, required for action=\"start\" and for action=\"breakpoints\" op=\"add\"; kinds (line/exception/statement/message) may mix and are validated against SAP before arming; condition and skipCount are optional on every kind, skipCount sent to SAP but NOT enforced."
      • changedInput schema / properties / stateId / description
        Previous value: -"From the most recent start/step/stack/frame response; a stale id is refused."New value: +"From the most recent start/step/stack/frame response (12-char token; the full id or a prefix of at least 8 chars is accepted too); a stale id is refused."
    • Changedabap_debug_value1 field changed
      • changedInput schema / properties / stateId / description
        Previous value: -"From the most recent start/step/stack/frame response."New value: +"From the most recent start/step/stack/frame response (12-char token; full id or a prefix of at least 8 chars also accepted)."
    • Changedabap_debug_vars1 field changed
      • changedInput schema / properties / stateId / description
        Previous value: -"From the most recent start/step/stack/frame response."New value: +"From the most recent start/step/stack/frame response (12-char token; full id or a prefix of at least 8 chars also accepted)."
    • Changedabap_dumps2 fields changed
      • changedInput schema / properties / chapters / description
        Previous value: -"show: 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."New value: +"show: comma-separated chapter NAMES, e.g. \"kap7,kap8,kap11\" — names, never the titles, which are translated. Alternative to section. Without either, show returns a summary; every chapter this dump has is listed in the response."
      • addedInput schema / properties / section
        Added value: +{
        +  "description": "show: which chapter text to return instead of the default summary. \"analysis\" = short text, error analysis, how to correct, exception chain; \"source\" = where terminated + source extract; \"stack\" = call stack; \"environment\" = system/user/session fields; \"all\" = the full default set (where terminated, source extract, system fields, call stack). Alternative to chapters.",
        +  "type": "string"
        +}
    • Changedabap_enh2 fields changed
      • changedInput schema / properties / operation / description
        Previous value: -"Default \"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."New value: +"Default \"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."
      • changedInput schema / properties / spec / description
        Previous value: -"Fields per op (?=optional, else required; numbers=max chars). IDs max 30 chars, see enhancement skill.\ncreate_spot: description(60).\nadd_badi_def: badiName, interfaceName, singleUse(bool), shortText(60).\nadd_filter_def: badiName, filterName, filterType(1 upper letter, e.g. C), filterText?(255).\ncreate_impl: spotName, badiName, implName, implClass, active(bool), description(60).\nset_filter_values: spotName, implName, filterName, filterType(as above), compare(=,<>,<,<=,>,>=,EQ,NE,LT,LE,GT,GE), value(255).\nexercise: 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)}].\ndiscover_hook_anchors: hostType, hostName, hostUri.\ncreate_hook: hostType(PROG/P only), hostName, hostUri, anchorFullName, anchorFullDescription(200), responsible?(12), activate?(bool).\nset_impl_active: active(bool), implName?(omit only if exactly one entry), description?(60)."New value: +"Fields per op (?=optional; IDs max 30 chars; lengths and value rules in doc/TOOLS/enhancements.md).\ncreate_spot: description.\nadd_badi_def: badiName, interfaceName, singleUse, shortText.\nadd_filter_def: badiName, filterName, filterType, filterText?.\ncreate_impl: spotName, badiName, implName, implClass, active, description.\nset_filter_values: spotName, implName, filterName, filterType, compare, value.\nexercise: methodName, filterName?, filterValue?, params?[{name, kind?, value?, type?}] (params[].type: required for changing/exporting/receiving, forbidden otherwise; a namespaced type ref is allowed).\ndiscover_hook_anchors: hostType, hostName, hostUri.\ncreate_hook: hostType(PROG/P only), hostName, hostUri, anchorFullName, anchorFullDescription, responsible?, activate?.\nset_impl_active: active, implName?(omit only if exactly one entry), description?."
    • Changedabap_img4 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"single-character SAP language key (SPRAS), e.g. \"E\" for English, \"D\" for German — not a 2-letter ISO code. Defaults to the server's configured language, else \"E\"."New value: +"Single-character SAP language key (SPRAS), e.g. E or D — not EN/DE. Defaults to the server's configured language, else E."
      • changedInput schema / properties / mode / description
        Previous value: -"search: find activities by title/id text. show: one activity's reference-IMG path, maintenance objects and tables. tree: the reference-IMG node children under a node. objects: a view/cluster/table/customizing object's underlying DDIC tables and fields."New value: +"search: find activities by title/id text. show: an activity's reference-IMG path, objects and tables. tree: a node's reference-IMG children. objects: an object's DDIC tables and fields."
      • changedInput schema / properties / query / description
        Previous value: -"search only: a term with no \"*\" matches as a substring of the title or id; \"*\" is an explicit wildcard, and \"*\" alone matches everything."New value: +"search only: a term with no \"*\" matches as a substring; \"*\" is an explicit wildcard, \"*\" alone matches everything."
      • changedInput schema / properties / treeId / description
        Previous value: -"tree only: the tree a node id belongs to (echoed back as treeId on a previous tree response, e.g. after following a REF node into a different tree). Omit to use the reference-IMG tree."New value: +"tree only: the tree a node id belongs to, echoed back as treeId on a previous tree response (e.g. after following a REF node). Omit to use the reference-IMG tree."
    • Changedabap_journal1 field changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "show only. \"summary\" (default): header plus a unified diff of before-image → after-image, capped at about 2,000 characters. \"full\": the complete before-image (and after-image when one was recorded), as before.",
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedabap_read5 fields changed
      • changedInput schema / properties / context / description
        Previous value: -"diff: context lines per hunk. Default 3."New value: +"Lines around each pattern match (default 2) or per diff hunk (default 3)."
      • addedInput schema / properties / full
        Added value: +{
        +  "description": "Whole source even above the default-outline threshold.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / outline / description
        Previous value: -"Component list with line ranges."New value: +"Component list with line ranges. Default for CLAS/INTF/PROG/FUGR above 150 lines or 8000 chars unless method/include/offset/limit/pattern/full is given."
      • addedInput schema / properties / pattern
        Added value: +{
        +  "description": "Regex (case-insensitive): only matching lines, numbered, with `context` lines around each (like grep -n -C). Max 50 matches unless limit= is given; offset= sets the first line scanned.",
        +  "type": "string"
        +}
      • changedInput schema / properties / view / description
        Previous value: -"history: versions. diff: hunks. definition: element at line/column. lineage: CDS view sources down to base tables. footprint: database writes and commits. docu: SAP documentation (flattened ITF; type=\"SIMG\" + object=<abap_img activity id> for an IMG activity's docu). digest: one-page object overview. Omit for normal read."New value: +"history: versions. diff: hunks. definition: element at line/column. lineage: CDS sources down to base tables. footprint: database writes and commits. docu: SAP documentation (type=\"SIMG\" + object=<abap_img activity id> for an IMG activity). digest: one-page overview. Omit for a normal read."
    • Changedabap_search1 field changed
      • changedInput schema / properties / mode / description
        Previous value: -"Default \"objects\". \"source\" scans raw source text (literal/regex, any line) and needs the fluid API; prefer \"where_used\" when you want real static references to one object, since a text scan also matches strings, comments and dead code. \"call_graph\" walks multiple levels of callers or callees instead of just one."New value: +"Default \"objects\". \"source\": raw source-text scan (literal/regex; needs the fluid API; also matches strings, comments and dead code — prefer \"where_used\" for real static references). \"call_graph\": multiple levels of callers or callees."
    • Changedabap_trace4 fields changed
      • changedInput schema / properties / depth / description
        Previous value: -"Max call-tree depth, relative to the traced object's own entry node (that node is depth 0), not the ADT dispatch root. Default 4, max 12. op=read view=tree only."New value: +"Max call-tree depth relative to the traced object's own entry node. Default 4, max 12. op=read view=tree only."
      • changedInput schema / properties / executions / description
        Previous value: -"How many executions the request stays armed for. Default 1, max 5. op=start only — op=run always creates a single-execution request."New value: +"How many executions the request stays armed for, default 1, max 5. op=start only — op=run always arms a single execution."
      • changedInput schema / properties / id / description
        Previous value: -"A trace run id (op=read) or a trace run/request id (op=delete). Accepts either the bare id or the full path a previous list/create answered with."New value: +"A trace run id (op=read) or run/request id (op=delete); bare id or the full path a previous list/create answered with."
      • changedInput schema / properties / root / description
        Previous value: -"Anchor the tree view at the first call-tree node whose description or calling-program name matches this text (case-insensitive substring; matched uppercased). Overrides the automatic anchor, which is the traced object's own entry node. op=read view=tree only."New value: +"Anchor the tree view at the first call-tree node matching this text (case-insensitive substring on description or calling-program name), overriding the automatic entry-node anchor. op=read view=tree only."
    • Changedabap_transport3 fields changed
      • changedInput schema / properties / kind / description
        Previous value: -"Which kind of request operation=\"create\" should create. \"workbench\" (the default) is a normal transportable change request created through ADT. \"copies\" is a transport of copies, which carries a snapshot of objects to a target system while leaving the originals modifiable in this system and their original request untouched. kind=\"copies\" requires target."New value: +"operation=\"create\" only. \"workbench\" (default): a normal transportable change request. \"copies\": a snapshot sent to a target system, originals untouched; requires target."
      • changedInput schema / properties / object / description
        Previous value: -"Object name. Required for operation=check, and for operation=removeObject (the entry to remove). Optional anchor for create with kind=\"workbench\" (the default); not accepted for create with kind=\"copies\" — a transport of copies is created empty."New value: +"Object name. Required for operation=check/removeObject (removeObject: the entry to remove). Optional anchor for create with kind=\"workbench\" (default); not for kind=\"copies\", which is created empty."
      • changedInput schema / properties / operation / description
        Previous value: -"What to do. list/show/check/users/log/queue are plain reads, always allowed. log reads a transport's own export/import log (per target system); queue reads a target system's import queue/buffer. create/addUser/setOwner need write access (ABAP_MODE=edit or admin, or legacy ABAP_ALLOW_WRITE=true when ABAP_MODE is unset); create with kind=\"copies\" (a transport of copies) needs the same write access as an ordinary create — no extra ceiling. 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 — legal but not reliably reproducible; cause unconfirmed), 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; log transport; queue system; create package+description (plus target when kind=\"copies\"); addUser/setOwner transport+user; delete transport+confirm; removeObject transport+object+confirm."New value: +"What to do. list/show/check/users/log/queue are plain reads, always allowed. create/addUser/setOwner need write access (ABAP_MODE=edit or admin, or legacy ABAP_ALLOW_WRITE=true when ABAP_MODE is unset); kind=\"copies\" needs no extra ceiling. removeObject and delete share one ceiling: delete additionally needs the admin-only transport-delete ceiling (ABAP_MODE=admin — no legacy flag grants it) and confirm; removeObject needs that same ceiling and confirm. Required args: list/users none; show transport; check object; log transport; queue system; create package+description (plus target when kind=\"copies\"); addUser/setOwner transport+user; delete transport+confirm; removeObject transport+object+confirm."
  2. 3 tool updatesv0.6.11
    • Changedabap_read5 fields changed
      • changedInput schema / properties / depth / description
        Previous value: -"DEVC/K only: subpackage nesting depth to list. Default 1."New value: +"DEVC/K: subpackage nesting depth, default 1, max 3. view=\"lineage\": levels of underlying views, default 5, max 10."
      • changedInput schema / properties / depth / maximum
        Previous value: -3New value: +9007199254740991
      • addedInput schema / properties / field
        Added value: +{
        +  "description": "view=\"lineage\" only: trace one field back to its base columns.",
        +  "type": "string"
        +}
      • changedInput schema / properties / view / description
        Previous value: -"history: versions. diff: hunks. definition: element at line/column. docu: SAP documentation (flattened ITF; type=\"SIMG\" + object=<abap_img activity id> for an IMG activity's docu). digest: one-page object overview. Omit for normal read."New value: +"history: versions. diff: hunks. definition: element at line/column. lineage: CDS view sources down to base tables. footprint: database writes and commits. docu: SAP documentation (flattened ITF; type=\"SIMG\" + object=<abap_img activity id> for an IMG activity's docu). digest: one-page object overview. Omit for normal read."
      • changedInput schema / properties / view / enum
        Previous value: -[
        -  "history",
        -  "diff",
        -  "definition",
        -  "docu",
        -  "digest"
        -]New value: +[
        +  "history",
        +  "diff",
        +  "definition",
        +  "lineage",
        +  "footprint",
        +  "docu",
        +  "digest"
        +]
    • Changedabap_search7 fields changed
      • addedInput schema / properties / depth
        Added value: +{
        +  "description": "mode=call_graph: levels to expand. Default 2, max 4.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / direction
        Added value: +{
        +  "description": "mode=call_graph: \"callers\" (who calls this, default) or \"callees\" (what this calls).",
        +  "enum": [
        +    "callers",
        +    "callees"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / max / description
        Previous value: -"Default 50 rows (mode=objects/where_used) or 100 hits (mode=source); narrowing `query` (not lowering `max`) is what makes a broad call cheaper."New value: +"Default 50 rows (mode=objects/where_used), 100 hits (mode=source), or 50 children per node (mode=call_graph); narrowing `query` (not lowering `max`) is what makes a broad call cheaper."
      • changedInput schema / properties / mode / description
        Previous value: -"Default \"objects\". \"source\" scans raw source text (literal/regex, any line) and needs the fluid API; prefer \"where_used\" when you want real static references to one object, since a text scan also matches strings, comments and dead code."New value: +"Default \"objects\". \"source\" scans raw source text (literal/regex, any line) and needs the fluid API; prefer \"where_used\" when you want real static references to one object, since a text scan also matches strings, comments and dead code. \"call_graph\" walks multiple levels of callers or callees instead of just one."
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "objects",
        -  "where_used",
        -  "source"
        -]New value: +[
        +  "objects",
        +  "where_used",
        +  "source",
        +  "call_graph"
        +]
      • changedInput schema / properties / query / description
        Previous value: -"Name pattern (mode=objects), target object (mode=where_used), or literal/regex text (mode=source)."New value: +"Name pattern (mode=objects), target object (mode=where_used/call_graph), or literal/regex text (mode=source)."
      • changedInput schema / properties / type / description
        Previous value: -"ADT type filter (mode=objects/where_used only). One of: BDEF CLAS DCLS DDLA DDLS DDLX DEVC DOMA DRUL DTEL ENHO ENHS ENQU FUGR INTF MSAG PROG SHLP SRVB SRVD TABL TRAN TTYP TYPE VIEW XSLT; or a full code, e.g. \"CLAS/OC\"."New value: +"ADT type filter (mode=objects/where_used/call_graph only). One of: BDEF CLAS DCLS DDLA DDLS DDLX DEVC DOMA DRUL DTEL ENHO ENHS ENQU FUGR INTF MSAG PROG SHLP SRVB SRVD TABL TRAN TTYP TYPE VIEW XSLT; or a full code, e.g. \"CLAS/OC\"."
    • Changedabap_transport8 fields changed
      • addedInput schema / properties / domain
        Added value: +{
        +  "description": "TMS transport domain of system, e.g. DOMAIN_A4H. Optional; TMS resolves the local domain when omitted.",
        +  "type": "string"
        +}
      • addedInput schema / properties / kind
        Added value: +{
        +  "description": "Which kind of request operation=\"create\" should create. \"workbench\" (the default) is a normal transportable change request created through ADT. \"copies\" is a transport of copies, which carries a snapshot of objects to a target system while leaving the originals modifiable in this system and their original request untouched. kind=\"copies\" requires target.",
        +  "enum": [
        +    "workbench",
        +    "copies"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / object / description
        Previous value: -"Object name. Required for operation=check, and for operation=removeObject (the entry to remove). Optional anchor for create."New value: +"Object name. Required for operation=check, and for operation=removeObject (the entry to remove). Optional anchor for create with kind=\"workbench\" (the default); not accepted for create with kind=\"copies\" — a transport of copies is created empty."
      • 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; 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 — legal but not reliably reproducible; cause unconfirmed), 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."New value: +"What to do. list/show/check/users/log/queue are plain reads, always allowed. log reads a transport's own export/import log (per target system); queue reads a target system's import queue/buffer. create/addUser/setOwner need write access (ABAP_MODE=edit or admin, or legacy ABAP_ALLOW_WRITE=true when ABAP_MODE is unset); create with kind=\"copies\" (a transport of copies) needs the same write access as an ordinary create — no extra ceiling. 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 — legal but not reliably reproducible; cause unconfirmed), 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; log transport; queue system; create package+description (plus target when kind=\"copies\"); 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",
        -  "removeObject"
        -]New value: +[
        +  "list",
        +  "show",
        +  "check",
        +  "users",
        +  "log",
        +  "queue",
        +  "create",
        +  "addUser",
        +  "setOwner",
        +  "delete",
        +  "removeObject"
        +]
      • addedInput schema / properties / system
        Added value: +{
        +  "description": "Target system whose import queue to read, e.g. QAS. Required for operation=\"queue\".",
        +  "type": "string"
        +}
      • addedInput schema / properties / target
        Added value: +{
        +  "description": "Target system for operation=\"create\" with kind=\"copies\", e.g. A4H. A transport of copies with no target cannot be imported anywhere, so abapsmith refuses to create one.",
        +  "type": "string"
        +}
      • changedInput schema / properties / transport / description
        Previous value: -"Request/task number, e.g. A4HK900123. Required for operation=show/addUser/setOwner/delete/removeObject."New value: +"Request/task number, e.g. A4HK900123. Required for operation=show/addUser/setOwner/delete/removeObject and for operation=log."
  3. 6 tool updatesv0.6.2
    • Changedabap_activate4 fields changed
      • changedInput schema / properties / corr_nr / description
        Previous value: -"Transport request. $TMP needs none."New value: +"Transport request. $TMP needs none. Not for text format."
      • changedInput schema / properties / mode / description
        Previous value: -"Default activate."New value: +"Default activate. format pretty-prints ABAP source: `source` alone formats text (no write), `object` alone formats and saves the object if it changed — never both."
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "check",
        -  "activate"
        -]New value: +[
        +  "check",
        +  "activate",
        +  "format"
        +]
      • changedInput schema / properties / source / description
        Previous value: -"Unsaved draft to check/activate."New value: +"Unsaved draft to check/activate, or text to format."
    • Changedabap_debug8 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"start needs breakpoints+run. step needs stateId+step. stack needs stateId. frame needs stateId+frame. keepalive/stop/status need nothing."New value: +"start needs breakpoints+run. step needs stateId+step. stack needs stateId. frame needs stateId+frame. breakpoints needs stateId (op add/remove) or nothing (op list, default). watch needs stateId+variable (op add, default when variable given) or stateId+id (op remove) or stateId (op list). keepalive/stop/status need nothing."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "start",
        -  "step",
        -  "stack",
        -  "frame",
        -  "keepalive",
        -  "stop",
        -  "status"
        -]New value: +[
        +  "start",
        +  "step",
        +  "stack",
        +  "frame",
        +  "breakpoints",
        +  "watch",
        +  "keepalive",
        +  "stop",
        +  "status"
        +]
      • changedInput schema / properties / breakpoints / description
        Previous 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\")."New value: +"≥1 entry, required for action=\"start\" and for action=\"breakpoints\" op=\"add\"; kinds (line/exception/statement/message) may mix and are validated against SAP before arming. All 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": {
        -        "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"
        -  }
        -]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"
        +  },
        +  {
        +    "properties": {
        +      "condition": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "statement",
        +        "type": "string"
        +      },
        +      "skipCount": {
        +        "maximum": 1000000,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "statement": {
        +        "description": "ABAP statement keyword to break on, e.g. RAISE. SAP validates it.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "statement"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "condition": {
        +        "maxLength": 255,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "message",
        +        "type": "string"
        +      },
        +      "msgId": {
        +        "description": "Message class, e.g. 00.",
        +        "type": "string"
        +      },
        +      "msgNo": {
        +        "description": "Message number, e.g. 001.",
        +        "type": "string"
        +      },
        +      "msgTy": {
        +        "description": "Message type letter, e.g. E.",
        +        "type": "string"
        +      },
        +      "skipCount": {
        +        "maximum": 1000000,
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "msgId",
        +      "msgNo",
        +      "msgTy"
        +    ],
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / condition
        Added value: +{
        +  "description": "action=\"watch\" op=\"add\" only — ABAP expression; the watchpoint only suspends when it evaluates true.",
        +  "maxLength": 255,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / id
        Added value: +{
        +  "description": "action=\"breakpoints\"/\"watch\" op=\"remove\" only — the id to remove.",
        +  "type": "string"
        +}
      • addedInput schema / properties / op
        Added value: +{
        +  "description": "action=\"breakpoints\"/\"watch\" only. breakpoints defaults to \"list\"; watch defaults to \"add\" when \"variable\" is set, else \"list\".",
        +  "enum": [
        +    "list",
        +    "add",
        +    "remove"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / variable
        Added value: +{
        +  "description": "action=\"watch\" only — variable path to watch, same syntax abap_debug_value accepts. Presence selects op=\"add\".",
        +  "type": "string"
        +}
    • Changedabap_read5 fields changed
      • addedInput schema / properties / column
        Added value: +{
        +  "description": "0-based column. Default 0. Only meaningful with view=\"definition\"; refused otherwise.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / line
        Added value: +{
        +  "description": "1-based source line. Required with view=\"definition\"; refused otherwise.",
        +  "maximum": 9007199254740991,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"ADT type to disambiguate. DEVC/K: package listing (types/depth filter it). SUSO/B: renders the object's DEFINITION (fields, permitted activities) from the catalog — NOT who holds it, no AGR_*/UST* table is read. TABL/DI: <TABLE>/<INDEX> catalog render. Not readable: SHLP/DH VIEW/DV TRAN/T PROG/PS PROG/PC PROG/PT."New value: +"ADT type to disambiguate. DEVC/K: package listing (types/depth filter it). SUSO/B: renders the object's DEFINITION (fields, permitted activities) from the catalog — NOT who holds it, no AGR_*/UST* table is read. TABL/DI: <TABLE>/<INDEX> catalog render. Not readable: PROG/PS PROG/PC PROG/PT."
      • changedInput schema / properties / view / description
        Previous value: -"history: versions. diff: hunks. Omit for normal read."New value: +"history: versions. diff: hunks. definition: element at line/column. docu: SAP documentation (flattened ITF; type=\"SIMG\" + object=<abap_img activity id> for an IMG activity's docu). digest: one-page object overview. Omit for normal read."
      • changedInput schema / properties / view / enum
        Previous value: -[
        -  "history",
        -  "diff"
        -]New value: +[
        +  "history",
        +  "diff",
        +  "definition",
        +  "docu",
        +  "digest"
        +]
    • Changedabap_search1 field changed
      • changedInput schema / properties / type / description
        Previous value: -"ADT type filter (mode=objects/where_used only). 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\"."New value: +"ADT type filter (mode=objects/where_used only). One of: BDEF CLAS DCLS DDLA DDLS DDLX DEVC DOMA DRUL DTEL ENHO ENHS ENQU FUGR INTF MSAG PROG SHLP SRVB SRVD TABL TRAN TTYP TYPE VIEW XSLT; or a full code, e.g. \"CLAS/OC\"."
    • Changedabap_service2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "Required to arm op=publish/unpublish: the binding name, echoed back exactly. Omit it first to get a dry run.",
        +  "type": "string"
        +}
      • addedInput schema / properties / op
        Added value: +{
        +  "description": "read (default): contract/entity/raw as above. publish/unpublish: register or deregister the binding in the OData service runtime — needs confirm, and is off unless ABAP_ALLOW_SERVICE_PUBLISH permits it.",
        +  "enum": [
        +    "read",
        +    "publish",
        +    "unpublish"
        +  ],
        +  "type": "string"
        +}
    • Addedabap_trace
  4. 3 tool updatesv0.5.14
    • Changedabap_read3 fields changed
      • addedInput schema / properties / depth
        Added value: +{
        +  "description": "DEVC/K only: subpackage nesting depth to list. Default 1.",
        +  "maximum": 3,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"ADT type to disambiguate. Not readable: SHLP/DH VIEW/DV TRAN/T PROG/PS PROG/PC PROG/PT SUSO/B TABL/DI."New value: +"ADT type to disambiguate. DEVC/K: package listing (types/depth filter it). SUSO/B: renders the object's DEFINITION (fields, permitted activities) from the catalog — NOT who holds it, no AGR_*/UST* table is read. TABL/DI: <TABLE>/<INDEX> catalog render. Not readable: SHLP/DH VIEW/DV TRAN/T PROG/PS PROG/PC PROG/PT."
      • addedInput schema / properties / types
        Added value: +{
        +  "description": "DEVC/K only: filter package contents to these kind codes, e.g. [\"CLAS\",\"DDLS\"].",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedabap_search12 fields changed
      • addedInput schema / properties / case_sensitive
        Added value: +{
        +  "description": "mode=source: default false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_comments
        Added value: +{
        +  "description": "mode=source: also match inside comments (heuristic, line-local). Default false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_subpackages
        Added value: +{
        +  "description": "mode=source: also scan every package transitively under `packages` (TDEVC-PARENTCL).",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / max / description
        Previous value: -"Default 50 rows; narrowing `query` (not lowering `max`) is what makes a broad call cheaper."New value: +"Default 50 rows (mode=objects/where_used) or 100 hits (mode=source); narrowing `query` (not lowering `max`) is what makes a broad call cheaper."
      • changedInput schema / properties / mode / description
        Previous value: -"Default \"objects\"."New value: +"Default \"objects\". \"source\" scans raw source text (literal/regex, any line) and needs the fluid API; prefer \"where_used\" when you want real static references to one object, since a text scan also matches strings, comments and dead code."
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "objects",
        -  "where_used"
        -]New value: +[
        +  "objects",
        +  "where_used",
        +  "source"
        +]
      • addedInput schema / properties / objects
        Added value: +{
        +  "description": "mode=source: object-name pattern (wildcards `*`), e.g. \"ZCL_MY_*\". Alternative/addition to `packages`.",
        +  "type": "string"
        +}
      • addedInput schema / properties / packages
        Added value: +{
        +  "description": "mode=source: package scope (TADIR-DEVCLASS). Required unless `objects` is given.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 20,
        +  "type": "array"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Name pattern (mode=objects) or target object (mode=where_used)."New value: +"Name pattern (mode=objects), target object (mode=where_used), or literal/regex text (mode=source)."
      • addedInput schema / properties / regex
        Added value: +{
        +  "description": "mode=source: treat `query` as a PCRE pattern instead of literal text.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / type / description
        Previous 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\"."New value: +"ADT type filter (mode=objects/where_used only). 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\"."
      • addedInput schema / properties / types
        Added value: +{
        +  "description": "mode=source: object types to scan. One of: PROG CLAS INTF FUGR DDLS. Default: all five.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 10,
        +  "type": "array"
        +}
    • Changedabap_transport1 field changed
      • 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; 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."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 — legal but not reliably reproducible; cause unconfirmed), 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."
  5. 14 tool updatesv0.5.6
    • Addedabap_atc
    • Addedabap_bopf_delete
    • Addedabap_bopf_edit
    • Addedabap_bopf_test
    • Addedabap_fluid
    • Addedabap_fpm_read
    • Addedabap_img_edit
    • Changedabap_journal4 fields changed
      • changedInput schema / properties / mode / description
        Previous value: -"list (default): recent writes. show: one entry incl. its before-image. undo: revert one entry."New value: +"list (default): recent writes. show: one entry incl. its before-image. undo: revert one entry. reconcile: close a stranded pending entry with an outcome you establish and a stated reason."
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "list",
        -  "show",
        -  "undo"
        -]New value: +[
        +  "list",
        +  "show",
        +  "undo",
        +  "reconcile"
        +]
      • addedInput schema / properties / outcome
        Added value: +{
        +  "description": "mode=reconcile: the outcome you are asserting for a `pending` entry. Required. `pending` is the state being left, so it is not offered.",
        +  "enum": [
        +    "succeeded",
        +    "failed"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / reason
        Added value: +{
        +  "description": "mode=reconcile: how you established that outcome. Required, recorded verbatim on the entry, and the only evidence it will ever carry for the asserted outcome.",
        +  "type": "string"
        +}
    • Addedabap_quick_fix
    • Addedabap_run
    • Addedabap_test
    • Addedabap_transport_release
    • Addedabap_ui
    • Addedabap_write
  6. 1 tool updatev0.4.0
    • Addedabap_img
  7. 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."
  8. 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

B3.3/5.0

Scored across 28 tools

Disambiguation4/5

Tools are mostly domain-specific and clearly separated, with descriptions explicitly resolving potential overlaps (e.g., abap_enh vs abap_write, transport vs transport_release). A minor ambiguity exists between abap_activate and abap_write since both can handle activation, but the distinction is understandable from context.

Naming Consistency3/5

All tools share the abap_ prefix, but the suffix pattern is mixed: some use bare nouns (abap_img, abap_bopf), some use verbs (abap_read, abap_run), and others use noun_verb or compound forms (abap_fpm_read, abap_bopf_edit, abap_open_url, abap_quick_fix). This is readable but not a single consistent convention.

Tool Count3/5

28 tools is above the typical well-scoped range, and the server feels heavy even though the ABAP domain is broad. The tools cluster into sensible families (debug, transport, BOPF, IMG), so the count is not chaotic, but it is still borderline-high.

Completeness5/5

The tool set covers the full lifecycle for ABAP development: read/search/write/activate, run/test/ATC, debug/trace/dumps, transport management/release, journal undo, plus specialized areas like BOPF, FPM, IMG, UI automation, and OData services. There are no obvious dead ends or major missing operations for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    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.
    24
    325 npm
    MIT
  • 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 npm
    MIT