sap-abap-mcp-server
Provides integration with SAP S/4HANA systems via the ABAP Development Tools REST API, enabling repository search, reading and editing ABAP source, inspecting Data Dictionary objects, querying table contents, running syntax and ATC checks, managing transports, debugging sessions, and executing ABAP server-side.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sap-abap-mcp-serverRead the first 10 rows from table T001."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
sap-abap-mcp-server
This repository has been emptied. Its previous contents were removed and are no longer part of its history.
It is kept in place as a staging repo for unrelated material.
Available Tools
51 toolssap_abap_docsABAP Keyword DocumentationARead-onlyIdempotent
Look up the system's own ABAP keyword documentation (F1 help, release-correct for this system) by keyword, reduced to readable text. Follow links from a previous result via the uri argument to navigate to sub-topics.
Args:
query (string): keyword or phrase to look up, OR
uri (string): a topic key from a previous result's links.
max_chars (number): 1000-20000 (default 8000).
response_format.
Returns (json): { query?, uri?, title?, text, truncatedAtMaxChars, links: [{title, uri}] }.
Examples:
"What does LOOP AT ... GROUP BY do on this release?" -> query='LOOP AT GROUP BY'.
"Show me the SELECT statement documentation" -> query='SELECT', then uri='ABAPSELECT' from the links to open the statement itself. Notes:
This is the documentation installed on THIS system, so it matches its ABAP release rather than the newest online version.
Language is fixed to EN this round.
The source is HTML reduced to text, so formatting (tables, syntax diagrams) is approximate — follow a link for depth rather than raising max_chars far.
A broad keyword returns a hit list: mostly links with little body text. Pick a link's uri and call again.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | No | A topic key taken from a previous result's links (e.g. 'ABAPSELECT') — navigates directly to that topic. Provide query OR uri. | |
| query | No | Keyword or phrase (e.g. 'SELECT', 'FIELD-SYMBOLS', 'LOOP AT GROUP BY'). | |
| max_chars | No | Cap on the reduced documentation text (1000-20000, default 8000). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, and the description adds meaningful behavioral context beyond that: release-specific content matching this system, fixed EN language, HTML-to-text formatting approximation, and the hit-list behavior for broad queries. No contradiction with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args, Returns, Examples, and Notes. The opening sentence immediately communicates the tool's purpose, and every section provides useful operational detail without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 compensates by explicitly listing the return shape and fields. It also covers the two-step navigation pattern, broad-query behavior, language constraint, release correctness, and text-format limitations, giving an agent enough context to invoke the tool and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters. The description adds extra semantics by explaining the query-vs-uri relationship, giving concrete example values like 'LOOP AT GROUP BY' and 'ABAPSELECT', and advising to follow links for depth instead of raising max_chars. This goes beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: look up the system's own ABAP keyword documentation (F1 help, release-correct for this system). It clearly distinguishes this from generic web documentation or other ABAP tools by emphasizing the system-local, release-correct scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear workflow: query for a keyword, then follow a returned link's uri to navigate to sub-topics. It also advises not to raise max_chars too far and instead follow links, and it explains that broad keywords return hit lists. It does not explicitly contrast with sibling tools, but the usage context is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_activateActivate ABAP ObjectsADestructive
Activate one or more inactive ABAP objects. This MODIFIES the SAP system (makes the working version live).
Args:
objects (array): each { object_type, object_name, function_group? }. Activating related objects together resolves cross-dependencies.
response_format ('markdown' | 'json').
Returns (json): { activated: boolean, objects: [{type,name}], messages: [{type,text,line?}] }. 'activated' is true only when there are no error (E) messages.
Examples:
"Activate CL_FOO and its interface" -> objects=[{class,CL_FOO},{interface,IF_FOO}]. Error Handling:
Activation errors (syntax, unresolved deps) are returned as messages with type 'E'.
| Name | Required | Description | Default |
|---|---|---|---|
| objects | Yes | One or more objects to activate together. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-read-only, and the description reinforces this by explicitly saying it MODIFIES the SAP system. It adds valuable behavioral detail: activating related objects together resolves cross-dependencies, errors are returned as messages with type 'E', and 'activated' is true only when no error messages exist. This exceeds the minimal annotation signal without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for arguments, return values, examples, and error handling. Each section is concise and earns its place, and the most important warning about modifying the system is front-loaded in the first line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately documents the JSON return structure, error semantics, and an example. The only minor gap is a slight ambiguity between 'Returns (json)' and the default response_format of 'markdown', which could confuse an agent about the default response shape. Overall, the tool is callable with the information provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 beyond the schema by explaining that activating related objects together resolves cross-dependencies, providing a natural-language-to-object mapping example, and clarifying the semantic meaning of response_format. This is meaningful supplementary guidance rather than repetition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Activate one or more inactive ABAP objects.' It further clarifies the operational effect by stating 'This MODIFIES the SAP system (makes the working version live),' which clearly distinguishes it from read-only sibling tools like sap_get_source or sap_search_objects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is implied through 'inactive ABAP objects' and the example, but the description does not explicitly say when to prefer this tool over alternatives such as sap_syntax_check, sap_create_object, or sap_list_inactive. No exclusions or alternative routing are provided, so the guidance is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_atc_runRun ATC CheckARead-only
Run an ATC (ABAP Test Cockpit) check on an ABAP object and return the findings (priority, check, message, line). Use before releasing a transport.
Supply either:
object_uri: the full ADT URI (from sap_search_objects), OR
object_type + object_name (and function_group if needed).
Args:
object_uri / object_type + object_name.
check_variant (string): ATC variant; omit for the system default.
max_results (number): 1-1000 (default 100).
response_format.
Returns (json): { objectUri, checkVariant, worklistId, timestamp?, stats: {prio1, prio2, prio3}, findingCount, objects: [{uri, type, name, packageName?, findings: [{uri, location?, line?, priority, checkId?, checkTitle?, messageId?, messageTitle}]}] }. Priority 1 = error, 2 = warning, 3 = information.
Examples:
"ATC-check ZCL_FOO before I release the transport" -> object_type='class', object_name='ZCL_FOO'.
"Run the Z_STRICT variant on ZFI_POST" -> object_type='program', object_name='ZFI_POST', check_variant='Z_STRICT'. Notes:
Each run records a server-side ATC worklist (visible in ATC administration). It is harmless and reused per check variant.
Large objects can exceed SAP_TIMEOUT_MS — check one object at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| object_uri | No | ADT URI of the object to check (e.g. '/sap/bc/adt/oo/classes/zcl_foo'). Get this from sap_search_objects results. Takes precedence over object_type+object_name. | |
| max_results | No | Maximum findings to return (1-1000, default 100). | |
| object_name | No | Object name — used with object_type when object_uri is not given. | |
| object_type | No | Object type — used to derive URI when object_uri is not given. | |
| check_variant | No | ATC check variant. Omit to use the system default (read from ATC customizing). | |
| function_group | No | Required when object_type='function'. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description discloses a non-obvious server-side side effect: each run records an ATC worklist that is harmless and reused per check variant. It also warns that large objects can exceed SAP_TIMEOUT_MS and recommends checking one object at a time, which is valuable behavioral context not available from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, then organized into input options, return format, examples, and notes. It is long but justified by seven parameters and no output schema; however, a few 'Args' lines repeat schema information, preventing a perfect conciseness score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description fully documents the JSON return shape, priority semantics, worklist side effect, timeout behavior, response_format options, and example parameter mappings. An agent has everything needed to select inputs and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds helpful examples and the either/or grouping of object_uri vs object_type+object_name, but it largely restates the schema's existing parameter descriptions, defaults, and preconditions rather than contributing substantial new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Run an ATC (ABAP Test Cockpit) check on an ABAP object and return the findings...' and ties it to the workflow trigger 'before releasing a transport.' This clearly distinguishes it from sibling tools like sap_syntax_check, sap_run_unit_tests, and sap_release_transport.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit context for when to use the tool: before releasing a transport, and it explains the two input modes (object_uri vs object_type + object_name) with examples. It does not explicitly name when not to use it or point to a specific alternative tool, so it stops 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.
sap_bapi_callCall BAPI with Commit/RollbackADestructive
Call a BAPI function module. Automatically calls BAPI_TRANSACTION_COMMIT on success or BAPI_TRANSACTION_ROLLBACK on ABAP error (type E/A in the RETURN table).
WARNING: BAPI calls can create, change, or delete business objects. Use only in development/sandbox unless you are certain of the effect.
Args:
bapi_name (string): BAPI name (must be RFC-enabled).
params (object): BAPI parameters (default: {}).
response_format.
Returns (json): { functionName, result, return?: [{type, id, number, message}], committed }. committed=true means BAPI_TRANSACTION_COMMIT was called. committed=false means an error occurred and it was rolled back.
Examples:
"Create a purchase order" -> bapi_name='BAPI_PO_CREATE1', params={...header/item tables...}.
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | BAPI import / table parameters as a JSON object. | |
| bapi_name | Yes | BAPI function module name (e.g. 'BAPI_GOODSMVT_CREATE'). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true and readOnlyHint=false, and the description adds autocommit/rollback behavior, ABAP error-type handling, and a warning about creating/changing/deleting business objects. No contradiction exists; the description significantly enriches the annotation profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with the warning first, followed by args, return format, and an example. Each section contributes, though the Args section partially duplicates schema parameter descriptions. Overall it is efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with no output schema, the description explains the return JSON structure including the committed flag, RETURN table entries, and transaction outcomes. It is sufficiently complete for an agent to invoke the tool correctly and understand side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 the constraint that bapi_name must be RFC-enabled and provides a concrete example mapping 'Create a purchase order' to BAPI_PO_CREATE1, which adds practical guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the verb 'Call' and resource 'BAPI function module', and clearly highlights commit/rollback semantics. It does not explicitly distinguish from sibling sap_rfc_call, but the BAPI-specific transaction handling makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a warning to use only in development/sandbox unless certain of the effect, which is useful context. However, it does not state when to choose this tool over alternatives like sap_rfc_call or sap_read_table, nor does it provide any when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_browse_packageBrowse Package ContentsARead-onlyIdempotent
List the repository objects and sub-packages inside an ABAP package. Useful for exploring what's in a package before making changes or doing an audit.
Args:
package_name (string).
response_format.
Returns (json): { packageName, count, nodes: [{uri, type, name, description?, expandable?}] }. type: DEVC/K (sub-package), PROG/P (program), CLAS/OC (class), INTF/OI (interface), FUGR (function group), etc.
Examples:
"What's in package ZDEV?" -> package_name='ZDEV'.
Browse $TMP to see local objects.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | Yes | Package name (e.g. 'ZDEV', '$TMP', 'ZFI_REPORTS'). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent, and non-destructive; the description adds behavior beyond that by specifying the JSON response shape and node type taxonomy. There is no contradiction with the annotations, and the examples reinforce safe 'browse' usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, then compactly covers inputs, return shape, and examples. The Args section is somewhat redundant with the schema, but the overall length is justified by the useful return-shape and type details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by documenting the returned object and node list. The only ambiguity is that it says 'Returns (json)' while response_format can default to markdown, but the examples and return structure still give an agent enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters with examples and defaults. The description's Args list and examples add little beyond the schema, meeting the baseline but not exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the repository objects and sub-packages inside an ABAP package.' This clearly identifies the tool's scope and differentiates it from global search or source-retrieval siblings like sap_search_objects and sap_get_source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool: 'exploring what's in a package before making changes or doing an audit.' It does not explicitly name alternatives or exclusion conditions, so it stops short of the strongest guidance, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_connection_testTest SAP ConnectionARead-onlyIdempotent
Verify connectivity and authentication to the configured SAP S/4HANA system via ADT.
Performs a CSRF/session handshake and reads the ADT discovery document. Use this first to confirm SAP_BASE_URL, SAP_CLIENT, SAP_USER, and SAP_PASSWORD are correct and that the /sap/bc/adt ICF service is active.
Args:
response_format ('markdown' | 'json'): Output format (default: 'markdown').
Returns (json): { baseUrl, client, user, language, authenticated: boolean, workspaces: string[] }.
Examples:
Use when: "Can you connect to SAP?" / first call in a session. Error Handling:
401 -> bad user/password. 404 -> ADT service not active (SICF). TLS errors -> set SAP_VERIFY_SSL=false.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, and the description adds valuable behavioral detail beyond those: it performs a handshake, reads the discovery document, and maps errors (401, 404, TLS) to config problems. This gives an agent a clear model of what happens when the tool is called.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with clear sections for purpose, arguments, return value, usage, and error handling. It is thorough but not verbose, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-optional-parameter tool with rich annotations, the description covers invocation, return shape, usage timing, and error interpretation. Without an output schema, documenting the JSON return structure is especially helpful and makes the description complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already has a clear enum and default in the schema. The description repeats the response_format options without adding new semantic meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Verify connectivity and authentication') and a specific resource ('configured SAP S/4HANA system via ADT'). It also describes the mechanism (CSRF/session handshake, ADT discovery document), which makes the tool's role clear and distinguishable from sibling SAP tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool first to confirm environment configuration and ICF service availability, and gives a natural-language trigger ('Can you connect to SAP?'). It does not explicitly contrast it with related siblings like sap_rfc_ping, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_create_objectCreate ABAP Repository ObjectA
Create a new ABAP repository object (program, include, class, interface, or function group). The object must not already exist. After creation, use sap_write_source to add source code and sap_activate to make it live.
Args:
object_type ('program'|'include'|'class'|'interface'|'function_group').
object_name (string): new object name.
description (string): short description (≤70 chars).
package (string): default '$TMP' (local, no transport). Use a Z-package for real development.
transport (string): required when package ≠ '$TMP'.
response_format.
Returns (json): { objectType, objectName, uri, transport?, message }.
Examples:
"Create program ZTEST in $TMP" -> object_type='program', object_name='ZTEST', description='Test', package='$TMP'.
"Create class ZCL_HANDLER in ZDEV package" -> object_type='class', object_name='ZCL_HANDLER', package='ZDEV', transport='DEVK900123'. Notes:
After creation the object is empty and inactive. Write source with sap_write_source then activate.
Function modules cannot be created directly — create the function_group first, then use SE37 or sap_write_source on the group.
| Name | Required | Description | Default |
|---|---|---|---|
| package | No | Package to create the object in. '$TMP' = local (no transport needed). Use a Z-package for transportable objects. | $TMP |
| transport | No | Transport request (e.g. 'DEVK900123'). Required for non-$TMP packages. | |
| description | Yes | Short description (shown in SE80 object list). | |
| object_name | Yes | Name for the new object (e.g. 'ZNEW_PROG', 'ZCL_FOO'). Must not already exist. | |
| object_type | Yes | Kind of object to create: 'program', 'include', 'class', 'interface', or 'function_group'. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is not read-only and not idempotent, and the description adds concrete behavioral detail: the object must not already exist, it is empty and inactive after creation, and function modules cannot be created directly. This is meaningful context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Overview, Args, Returns, Examples, and Notes, and it is front-loaded with the key purpose and workflow. It is slightly long because the Args block duplicates schema details, but each section still contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters and no output schema, the description includes the return shape, default and required parameter rules, examples, and important workflow caveats. An agent has enough information to call the tool correctly without needing extra documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description is not required to compensate for missing parameter docs. It adds value with natural-language examples, the package/transport conditional, and the '$TMP' vs Z-package distinction, though some of this restates schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Create') and resource ('ABAP repository object'), lists the allowed object types, and clarifies it is the creation step separate from sap_write_source and sap_activate. This clearly distinguishes the tool from its siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains the workflow: the object must not already exist, then sap_write_source adds source, and sap_activate makes it live. It also handles the function-module edge case by directing users to create a function_group first, so an agent knows exactly when and how to use the tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_create_transportCreate Transport RequestA
Create a new workbench or customizing transport request. Returns the transport number to use in sap_write_source, sap_create_object, or sap_delete_object.
Args:
description (string): shown in SE09/SE10.
category ('Workbench' | 'Customizing', default 'Workbench').
response_format.
Returns (json): { number, description, category, message }.
Examples:
"Create a transport for my changes" -> description='My feature XYZ'.
Use the returned number as the 'transport' param for write/create/delete operations.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | 'Workbench' for repository objects (ABAP code, DDIC). 'Customizing' for IMG/client-dependent settings. | Workbench |
| description | Yes | Short description for the new transport request. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, idempotentHint=false) correctly imply a mutating, non-idempotent operation. The description adds behavioral context: the description parameter is 'shown in SE09/SE10', the return value is a JSON object with specific fields, and the returned number is expected to be passed to downstream tools. This goes beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured into purpose, arguments, return value, and examples. Every sentence provides useful information without redundancy, and the practical usage example is front-loaded near the end for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description clearly documents the return JSON structure and how to use the returned transport number. It also explains where the description parameter appears (SE09/SE10). This is sufficient for correct invocation, though it does not cover potential error conditions or prerequisite permissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all parameters with full coverage, including enums, defaults, and descriptions. The tool description adds only an illustrative example (natural-language request to description string) and repeats the downstream usage, which is helpful but not necessary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair: 'Create a new workbench or customizing transport request.' It also distinguishes this from sibling tools by specifying the return value used in sap_write_source, sap_create_object, or sap_delete_object, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: create a transport request, then use the returned number as the transport parameter for subsequent write/create/delete operations. It also provides a natural-language example, but it does not explicitly state when not to use this tool (e.g., when listing or releasing transports with sibling tools).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_debug_attachStart ABAP Debug ListenerA
Open a debug session handle and confirm this server may listen for a user's execution.
BEHAVIOUR CHANGED (the old 'attach to a terminal/session id' had no counterpart in the ADT protocol — there is no debug-session resource). ADT debugging is listener-based: you arm a listener for a USER, and the first line that user executes under a breakpoint traps and freezes their work process. This call validates the scope and creates the handle; sap_debug_wait is what actually registers the listener and blocks.
Workflow:
sap_debug_attach (this call — validates, returns session_id)
sap_set_breakpoint (one or more)
run the ABAP code AS THAT USER (SAP GUI, a transaction, an RFC…)
sap_debug_wait (registers the listener, blocks until the code traps)
sap_debug_variables / sap_debug_eval / sap_debug_step
sap_debug_detach (ALWAYS — clears breakpoints, releases the debuggee, deletes the listener)
Args:
user (string): user to trap. Default SAP_USER. The old 'terminal_id' argument is gone; it named a target the protocol does not have.
mode ('user' | 'terminal'): debugging scope (default 'user').
take_over (boolean): take the scope over from another IDE (default false).
response_format.
Returns (json): { sessionId, state: 'LISTENING', user, mode, message }. sessionId (e.g. 'dbg-1') is a handle in THIS server, not a SAP object. It does not survive a server restart.
Error Handling:
Conflict (HTTP 409): another session holds the debugging scope — the message carries SAP's conflictText and the holding user. Re-run with take_over=true to seize it. A listener this server itself left behind (crashed run) is detected and cleared automatically.
One debug session at a time: detach the current one first.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'user' (default): trap any execution by that user. 'terminal': trap only this terminal id — reference-only, not verified on this system. | user |
| user | No | ABAP user whose execution should be trapped. Default: SAP_USER. Debugging another user freezes THEIR session — only do it with their knowledge. | |
| take_over | No | If another IDE (e.g. Eclipse) holds the debugging scope, delete its listener and take over. Default false: report the conflict instead. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnly=false, idempotent=false, destructive=false), so the description carries the disclosure burden — and delivers. It flags a protocol change ('the old attach to a terminal/session id had no counterpart in the ADT protocol'), explains the trap-and-freeze side effect on the user's work process, notes sessionId is a server-local handle that 'does not survive a server restart,' and documents 409 conflict behavior including automatic clearing of crashed listeners. Nothing contradicts the annotations; the destructive take_over path is explicitly disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with labeled sections (workflow, args, returns, error handling) and the core purpose front-loaded in the first sentence. The workflow and error-handling sections earn their length for a multi-step lifecycle tool, though the Args section partially duplicates a schema that already covers all parameters at 100%.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description documents the return shape explicitly — '{ sessionId, state: LISTENING, user, mode, message }' — and explains sessionId semantics. It covers both error paths (409 conflict with take_over recovery; single-session constraint), the mandatory detach step, and the prerequisite of running code as the target user before sap_debug_wait. Nothing essential is missing for a tool with this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions are already rich — mode's 'reference-only, not verified on this system' caveat and user's 'freezes THEIR session — only do it with their knowledge' warning are in the schema itself. The description's Args section mostly echoes this, adding only the historical context that 'terminal_id' is gone and restating defaults. Baseline 3 is correct 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.
Does the description clearly state what the tool does and how it differs from similar tools?
First sentence uses a specific verb and resource: 'Open a debug session handle and confirm this server may listen for a user's execution.' It explicitly differentiates from the nearest sibling — 'sap_debug_wait is what actually registers the listener and blocks' — and the numbered workflow positions this call as step 1 of a 6-step debug lifecycle. An agent can distinguish it from sap_debug_wait, sap_debug_detach, and the other debug-family tools without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit numbered workflow (attach → set breakpoint → execute as user → wait → inspect → detach) that states exactly when this call runs and in what order. It names the alternative explicitly, gives conditional guidance for conflicts ('Re-run with take_over=true to seize it'), and warns 'One debug session at a time: detach the current one first.' Usage context and exclusions are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_debug_detachDetach ABAP Debugger SessionAIdempotent
End a debug session and leave nothing behind on SAP. ALWAYS call this when done — a frozen debuggee is a real user session that cannot continue, and an armed listener keeps trapping that user's execution.
Cleanup, in order, each step best-effort and reported individually:
clear the breakpoints this server set (empty full-set sync);
release the frozen debuggee ('continue'; if that fails for any reason other than the program having ended, drop its ABAP session to force the release);
log the stateful debug connection off;
delete the listener registration;
verify — re-check the scope and confirm nothing remains.
Args:
session_id (string).
response_format.
Returns (json): { sessionId, breakpointsCleared, debuggeeReleased, listenerDeleted, verified, message }. verified=false means the check could not confirm the listener is gone: call again.
Idempotent — safe to call twice, and safe to call on a session that already ended.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID from sap_debug_attach. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations, disclosing the exact ordered cleanup steps, best-effort semantics, individual reporting, the fallback of dropping an ABAP session, and the meaning of verified=false. It also reinforces the idempotentHint annotation with concrete detail about repeated failed calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but well-organized: leading warning, numbered cleanup steps, argument list, return summary, and idempotence note. Every sentence earns its place, and critical information is front-loaded in the first line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a cleanup tool with no output schema, the description fully explains return fields, failure semantics, retry behavior, and side effects. It even covers the preconditions implicitly by referencing the session_id from sap_debug_attach and the stateful debug connection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents both session_id and response_format. The description's Args list adds little beyond what the schema provides, though it does reinforce the required nature of session_id and the output format choices.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'End a debug session and leave nothing behind on SAP.' It clearly distinguishes the tool from its debug siblings by focusing exclusively on teardown and cleanup, and the detailed cleanup list removes any ambiguity about what detach does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states 'ALWAYS call this when done,' giving an unambiguous trigger condition, and explains the real-world harm of not calling it. It also provides idempotence guidance, saying it is safe to call twice and safe on an already-ended session, which covers the main edge cases for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_debug_evalEvaluate ABAP Debug ExpressionARead-onlyIdempotent
Read one variable at the current stop point, without listing all locals.
Note: the ABAP debugger resolves variable IDs, not computed expressions. 'LV_AMOUNT', 'SY-SUBRC' and 'GT_RESULT' work; 'strlen( lv_text )' does not — there is no evaluate-expression service in this API.
Args:
session_id (string).
expression (string): variable name.
response_format.
Returns (json): { sessionId, expression, value, type? }. Error Handling:
Not in scope at the current stop point -> use sap_debug_variables to see what is visible here.
| Name | Required | Description | Default |
|---|---|---|---|
| expression | Yes | ABAP variable name to read (e.g. 'SY-SUBRC', 'LV_AMOUNT', 'GT_RESULT'). | |
| session_id | Yes | Session ID from sap_debug_attach. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent; the description adds important behavioral context: variable IDs are resolved, not expressions, and scope determines visibility. It also documents the response shape. The only minor weakness is that 'Returns (json)' is not fully reconciled with the response_format parameter, but this does not undermine the behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by a high-value limitation note, compact arg summary, return shape, and targeted error handling. Every sentence earns its place; no fluff or duplication beyond the concise Args list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape, error behavior, and a route to the correct sibling. The dependency on a previous sap_debug_attach session is covered by the schema's session_id description. The slight return-format ambiguity is a minor issue against an otherwise complete definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter meaning is mostly carried by the schema. The description adds value by clarifying that expression means an ABAP variable ID rather than a computed expression and by giving concrete examples, slightly exceeding the schema's baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Read one variable at the current stop point') and distinguishes itself from the sibling sap_debug_variables by noting it does not list all locals. It also clarifies that the tool resolves variable IDs, not computed expressions, despite the title's word 'Evaluate'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when and when-not guidance: use for one specific variable at the current stop point; explicitly advises using sap_debug_variables when a variable is not in scope. Also warns against computed expressions because no evaluate-expression service exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_debug_stateGet ABAP Debugger StateARead-onlyIdempotent
Report the state of a debug session, plus a fresh call stack when a debuggee is stopped.
Args:
session_id (string).
response_format.
Returns (json): { sessionId, state, program?, include?, line?, stack: [{index, program, include?, line?, name?}], debuggee?, reachedBreakpoints? }. States: LISTENING (armed, nothing trapped yet) · STOPPED (debuggee frozen) · RUNNING (a step has not come back yet) · TIMEOUT / CANCELLED / ENDED / DETACHED. Only STOPPED calls SAP; the other states are answered from this server.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID from sap_debug_attach. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description explains state semantics (LISTENING, STOPPED, RUNNING, TIMEOUT, etc.) and discloses the key behavioral detail that only a STOPPED debuggee triggers an SAP call, otherwise the response is served locally. This materially helps an agent anticipate tool behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and structured clearly: purpose, args, return shape, states, and server-behavior note. Every sentence adds necessary information without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by fully specifying the JSON return shape, the required session context, and the meaning of every possible state. An agent has enough information to invoke this tool correctly for state inspection and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both parameters already documented in the input schema, including the session_id provenance and response_format enum/default. The description only repeats the parameter names and adds no additional meaning, so it holds at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Report the state of a debug session, plus a fresh call stack when a debuggee is stopped.' This distinguishes it from sibling debug tools like sap_debug_step or sap_debug_wait by focusing on observation rather than manipulation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context like 'Only STOPPED calls SAP; the other states are answered from this server,' which helps an agent understand the cost/behavior of the call. However, it never explicitly says when to prefer this tool over alternatives such as sap_debug_wait or sap_debug_step, so the selection guidance is more implied than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_debug_stepExecute ABAP Debugger StepA
Move the stopped debuggee: stepOver, stepInto, stepOut, stepReturn, continue, or stop.
Requires state='STOPPED'. The call returns when the debuggee stops again — 'continue' therefore BLOCKS for as long as the program runs to its next breakpoint, which can be minutes. Steps run on their own timeout (SAP_DEBUG_STEP_TIMEOUT_MS, default 600000 ms), not the 60s global one.
Args:
session_id (string).
command ('stepOver'|'stepInto'|'stepOut'|'stepReturn'|'continue'|'stop').
response_format.
Returns (json): { sessionId, command, state, program?, include?, line?, reachedBreakpoints?, message }.
state='STOPPED': stopped again; program/line say where, reachedBreakpoints says on which breakpoint.
state='ENDED': the debuggee ran to completion (a NORMAL outcome of 'continue', and the only outcome of 'stop'). The listener stays armed — call sap_debug_wait to catch the next trap, or sap_debug_detach to finish.
state='RUNNING': the step did not come back inside the timeout; the debuggee is probably still running. Check with sap_debug_state or release it with sap_debug_detach.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | Step command: 'stepOver' (next line, skip into calls), 'stepInto' (enter called method/form), 'stepOut'/'stepReturn' (run to the end of the current method), 'continue' (release the debuggee until the next breakpoint or the end), 'stop' (terminate the debuggee). | |
| session_id | Yes | Session ID from sap_debug_attach. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing blocking behavior, the dedicated step timeout versus the global timeout, the fact that 'continue' can block for minutes, and the debuggee state transitions (STOPPED, ENDED, RUNNING). It also notes that the listener stays armed after ENDED, which is important hidden behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: preconditions, timeout behavior, argument summary, and return-state semantics. The most important operational information is front-loaded, and the return-state explanation is clearly structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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's detailed explanation of the returned JSON and state values is essential and sufficient. It explains all possible states, the timeout scenario, and follow-up actions, making the tool safely callable even though it is asynchronous and potentially long-running.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including the command enum meanings, session_id provenance, and response_format default. The description mostly restates parameter names without adding significant semantic value beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Move the stopped debuggee' with an explicit enumerated command list. It clearly distinguishes this tool from siblings like sap_debug_wait, sap_debug_state, and sap_debug_detach by the action it performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states a hard precondition ('Requires state='STOPPED'') and explains how to proceed in each resulting state, including concrete alternatives such as sap_debug_wait to catch the next trap, sap_debug_state to check a running debuggee, and sap_debug_detach to finish. This gives the agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_debug_variablesList ABAP Debug VariablesARead-onlyIdempotent
Read ABAP variable values at the current stop point.
Requires state='STOPPED' (a debuggee attached by sap_debug_wait).
Args:
session_id (string).
names (string[]): specific variables; omit for all locals (the '@ROOT' hierarchy).
response_format.
Returns (json): { sessionId, count, variables: [{name, id?, type?, value?, kind?, tableLines?}] }. kind: 'elementary' | 'structure' | 'table' | 'reference'. Values SAP truncated are marked as truncated; tables report tableLines.
Error Handling:
'No debuggee attached' -> the session is not STOPPED; run the code and call sap_debug_wait first.
| Name | Required | Description | Default |
|---|---|---|---|
| names | No | Variable names/ids to read (e.g. 'LV_AMOUNT', 'SY-SUBRC'). Omit for all locals at the current stop point. | |
| session_id | Yes | Session ID from sap_debug_attach. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only/idempotent/non-destructive, and the description adds concrete behavior: returns the JSON shape, variable kind enum, truncation marker, tableLines reporting, and the 'No debuggee attached' error path. This materially enriches the annotation-only picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, prerequisite, args, return format, and error handling are each in clearly tagged sections with no filler. Front-loads the intent in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies a return contract including variable fields and kind values, plus the common failure mode. This is sufficient for an agent to invoke it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are fully documented structurally; the description mostly restates them. It does add the '@ROOT' hierarchy detail for omitted names, but otherwise adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read ABAP variable values at the current stop point.' This clearly identifies it as a read-only inspection tool among the debug family, though it does not explicitly contrast itself with sap_debug_eval's expression evaluation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the precondition: 'Requires state='STOPPED' (a debuggee attached by sap_debug_wait).' Error handling reinforces when it is valid ('run the code and call sap_debug_wait first'). It gives clear context but no explicit when-not-to-use or sibling alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_debug_waitWait for an ABAP DebuggeeA
Register the debug listener and block until the watched user's code traps on a breakpoint — then attach to it and return the stop position and call stack.
BEHAVIOUR CHANGED: this is now a real server-side long-poll (POST /sap/bc/adt/debugger/listeners), not a state-polling loop, and it performs the attach itself. Registration is a side effect of this call: once made, the listener stays armed on SAP across timeouts until sap_debug_detach deletes it.
Args:
session_id (string): from sap_debug_attach.
timeout_ms (int): client-side cap (default 60000, max 300000).
poll_interval_ms (int): ignored, kept for compatibility.
response_format.
Returns (json): { sessionId, state, program?, include?, line?, stack, debuggee?, reachedBreakpoints?, message }.
state='STOPPED': a debuggee is attached and FROZEN. Inspect with sap_debug_variables, move with sap_debug_step, and release promptly — this is a real user session halted mid-execution, and SAP kills an abandoned debuggee after its own timeout.
state='TIMEOUT': nothing trapped in time; the listener is still armed, so call again (after making sure the code actually runs as that user).
state='CANCELLED': the listener was deleted elsewhere — call sap_debug_attach again.
Error Handling:
Conflict: another IDE took the scope over mid-wait; the message carries SAP's conflictText.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID returned by sap_debug_attach. | |
| timeout_ms | No | How long to block waiting for a trap (default 60s, max 300s). On timeout the listener stays armed — just call again. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
| poll_interval_ms | No | Accepted for compatibility and ignored: this is a single server-side long-poll, not a polling loop. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the sparse annotations, the description candidly discloses side effects and hazards: registration persists as a side effect, the listener remains armed on SAP across timeouts until sap_debug_detach deletes it, the call performs the attach itself, and a STOPPED debuggee is a real frozen user session that SAP may kill. It also documents the server-side long-poll behavior and conflict error. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with a crisp opening, a behavior-change note, structured Args and Returns sections, state-by-state guidance, and an error-handling note. Every block adds operational value; the length is justified by the tool's stateful, side-effecting behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateful long-poll with no output schema, the description covers return fields, all three states, cleanup via sap_debug_detach, and conflict handling. The only notable gap is that it says 'Returns (json)' while response_format defaults to markdown in the schema, leaving how the markdown output is shaped slightly unclear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning by explaining session_id origin, timeout as a client-side cap with post-timeout behavior, and poll_interval_ms as ignored compatibility. It does not repeat in depth what response_format does, but that is already fully covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb and resource: 'Register the debug listener and block until the watched user's code traps on a breakpoint — then attach to it and return the stop position and call stack.' It clearly differentiates this from other debugger tools by describing a blocking long-poll and its attach/return behavior, and it names sap_debug_detach as the complementary cleanup call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear operational context: block until a breakpoint traps, handle TIMEOUT by calling again, handle CANCELLED by re-attaching, and release STOPPED debuggees promptly. It does not explicitly distinguish when to use this wait tool versus alternatives such as sap_debug_state, but the context is sufficient for most selections.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_delete_breakpointsDelete ABAP Debugger BreakpointsADestructive
Delete specific external breakpoints, or clear the whole external breakpoint set.
Args:
ids (string[]): structured ids from sap_list_breakpoints / sap_set_breakpoint. Omit to clear everything.
response_format.
Returns (json): { deleted, message }.
Examples:
"Clear all my breakpoints" -> (no ids). Sends an empty full-set sync, which clears the server side even for breakpoints this server no longer remembers (e.g. after a restart) — this is the reliable way to be sure nothing is left.
"Delete that breakpoint" -> ids=["KIND=0.SOURCETYPE=ABAP.MAIN_PROGRAM=…LINE_NR=12"]. Notes:
'deleted' counts what this server knew about; the no-ids path may remove more on the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Specific breakpoint IDs to delete (the 'id' from sap_list_breakpoints / sap_set_breakpoint). Omit to clear the whole external breakpoint set for this identity. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description reveals important behavioral details: the no-ids path sends an 'empty full-set sync' that clears server-side breakpoints even if this server no longer remembers them, and 'deleted' counts only what this server knew about. This significantly helps an agent predict side effects and interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a lead sentence, labeled args, return shape, examples, and notes. Every section adds operational value, and the most important behavioral caveat about the full-set sync is highlighted with a concrete example.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description provides the return shape '{ deleted, message }' and explains the semantics of 'deleted'. It covers both invocation modes, the side-effect difference between them, and practical guidance for reliable cleanup, so an agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning by explaining that ids are 'structured ids from sap_list_breakpoints / sap_set_breakpoint' and by giving a concrete example id format. It also reinforces the omitting behavior, making the parameter semantics easier to apply correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Delete specific external breakpoints, or clear the whole external breakpoint set.' It clearly covers both modes of the tool and distinguishes it from related breakpoint tools by focusing on deletion rather than listing or setting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The examples provide clear usage scenarios: 'Clear all my breakpoints' maps to omitting ids, and 'Delete that breakpoint' maps to providing a structured id. It also explains when the no-ids path is preferable for a complete cleanup. It does not explicitly contrast with sap_set_breakpoint or sap_list_breakpoints as alternatives, but the intended usage is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_delete_objectDelete ABAP Repository ObjectADestructive
Delete an ABAP repository object. This PERMANENTLY REMOVES the object from SAP.
The tool locks the object, deletes it, and records the change in the transport if provided. This cannot be undone (except by restoring from a transport or backup).
Args:
object_type, object_name (and function_group for functions).
transport: required for non-local objects.
response_format.
Returns (json): { objectType, objectName, message }.
Examples:
"Delete program ZOLD_PROG from $TMP" -> object_type='program', object_name='ZOLD_PROG'.
"Delete class ZCL_OLD from transport DEVK900123" -> object_type='class', object_name='ZCL_OLD', transport='DEVK900123'. Notes:
Run sap_where_used first to verify nothing depends on this object.
Deleting a function group removes all its function modules too.
| Name | Required | Description | Default |
|---|---|---|---|
| transport | No | Transport number. Required for non-$TMP (transportable) objects. | |
| object_name | Yes | Object name. Must exist. | |
| object_type | Yes | Kind of object to delete. | |
| function_group | No | Required when object_type='function'. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description expands this with concrete behaviors: the tool locks and deletes the object, records it in a transport when provided, cannot be undone except via restore, and deleting a function group removes all function modules. This is exactly the side-effect disclosure an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the permanent-destruction warning, then organized into Args, Returns, Examples, and Notes. Every section contributes essential behavioral or invocation information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema, the description is unusually complete: it states return fields, side effects, transport requirements, preconditions, and examples. An agent can safely determine when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the base expectation is 3. The description adds value with natural-language examples mapping phrases to object_type/object_name/transport, and it restates the non-local transport requirement. The only minor weakness is that 'Returns (json)' is slightly ambiguous given response_format defaults to markdown.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Delete an ABAP repository object. This PERMANENTLY REMOVES the object from SAP.' This unambiguously distinguishes the tool from siblings such as sap_create_object, sap_write_source, and sap_activate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical usage context: transport is required for non-local objects, sap_where_used should be run first, and function-group deletion has cascade effects. It does not explicitly name when-not-to-use alternatives, but the destructive operation and prerequisites make the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_api_releaseCheck API Release StateARead-onlyIdempotent
Check whether an ABAP object is a released API and under which compatibility contract (C1 = cloud development / key-user apps). Reads the ADT apireleases resource. Objects of non-releasable types (e.g. programs) get a normal 'not releasable' answer.
Supply either:
object_uri: the full ADT URI (from sap_search_objects), OR
object_type + object_name (and function_group if needed).
Args:
object_uri / object_type + object_name.
response_format.
Returns (json): { objectUri, releasable, isAnyContractReleased?, contracts: [{contract, state, useInSAPCloudPlatform?, useInKeyUserApps?, changedBy?, changedAt?}], message? }. state is one of RELEASED, DEPRECATED, NOT_RELEASED, NOT_TO_BE_RELEASED, NOT_TO_BE_RELEASED_STABLE.
Examples:
"Is IF_OO_ADT_CLASSRUN a released API?" -> object_type='interface', object_name='IF_OO_ADT_CLASSRUN'.
"Can I use CL_GUI_ALV_GRID in cloud development?" -> object_type='class', object_name='CL_GUI_ALV_GRID'.
"Is the CDS view I_PRODUCT released?" -> object_uri='/sap/bc/adt/ddic/ddl/sources/i_product'. Notes:
On an on-premise system 'released' is SAP's upgrade-stability contract: C1 means the object is usable in cloud development and key-user extensibility. NOT_RELEASED on a Z object is the expected state, not a problem.
releasable=false ("No entry found for object type ...") is the normal answer for programs, includes and other non-API object types — not an error.
The table ARS_W_API_STATE holds the same data and is readable via sap_read_table, but this endpoint resolves object URIs and non-releasable types itself.
| Name | Required | Description | Default |
|---|---|---|---|
| object_uri | No | Full ADT object URI (takes precedence). Required form for objects outside the standard source types, e.g. a CDS view: '/sap/bc/adt/ddic/ddl/sources/i_product'. | |
| object_name | No | Object name — used with object_type when object_uri is not given. | |
| object_type | No | Object type — used to derive URI when object_uri is not given. | |
| function_group | No | Required when object_type='function'. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the bar is lower, but the description adds substantial value beyond them: the underlying resource, on-premise upgrade-stability semantics, and — most importantly — which outcomes are expected rather than failures (releasable=false for programs/includes, NOT_RELEASED on Z objects as the normal state). The return JSON shape and the full state enum are enumerated, giving the agent a complete behavioral model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well organized with clear sections (purpose, supply modes, args, returns, examples, notes) and front-loaded with the core purpose and distinguishing behavior. There is mild redundancy — the C1 contract is explained twice and the Args block restates the either/or rule — but the length is largely justified by the tool's conceptual nuance and the absence of an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since no output schema exists, the description fully carries the return-value documentation, including the JSON shape and every state enum value. It covers both input modes, the response_format switch, edge-case semantics for non-releasable types, and points to the sibling alternative for the same data. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 a real layer on top by grouping the five parameters into two mutually exclusive supply modes (object_uri OR object_type+object_name with conditional function_group), noting the URI provenance from sap_search_objects, and mapping natural-language queries to concrete parameter values in the examples. It complements rather than repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Check whether an ABAP object is a released API') against a concrete resource (the ADT apireleases resource), and explains the C1 compatibility contract in the opening sentence. It differentiates from siblings by noting the endpoint resolves object URIs and non-releasable types itself, unlike sap_read_table on ARS_W_API_STATE. An agent can separate this from its 48 siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete usage triggers via three natural-language examples ('Is IF_OO_ADT_CLASSRUN a released API?', 'Can I use CL_GUI_ALV_GRID in cloud development?'), which helps an agent recognize when the tool applies. It explicitly names the alternative (sap_read_table on ARS_W_API_STATE) and states when this endpoint is preferred, plus gives the decision rule between object_uri and object_type+object_name. It also sets expectations on which outcomes are normal rather than errors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_auth_objectRead Authorization Object (SU21)ARead-onlyIdempotent
Read an authorization object's definition (SU21) via ADT: description, object class, and fields. Use with sap_get_transaction (TSTCA rows) and sap_sql_query (USR12/AGR_1251) for authorization audits.
Args:
name (string): the authorization object.
include_activities (boolean): append the system-wide ACTVT catalog (large — several hundred entries).
response_format.
Returns (json): { name, type, description?, objectClass?, objectClassDescription?, fields: [{name, description, ...}], activities?, activitiesError?, raw? }.
Examples:
"What does S_TCODE check?" -> name='S_TCODE'.
"Which fields does S_DEVELOP have, and what do the ACTVT values mean?" -> name='S_DEVELOP', include_activities=true. Notes:
This reads the object DEFINITION. For where it is actually checked, combine with sap_get_transaction (SE93 start checks), sap_sql_query over USOBT_C/USOBX_C (SU24 defaults), AGR_1251 (role values) and USR12 (user values).
The activity catalog is global, not per-object, and is fetched separately; if that call fails the main result is still returned with activitiesError set.
'raw' appears only when this release structures the fields differently than expected — report it if you see it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Authorization object name (e.g. 'S_TCODE', 'S_DEVELOP'). Case-insensitive. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
| include_activities | No | Also fetch the global activity catalog (ACTVT values with texts) from the companion listvalues endpoint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only and idempotent, and the description adds meaningful behavioral detail: it reads only the definition, not where checks occur; the activity catalog is global and fetched separately; partial failures surface as activitiesError; the 'raw' field signals unexpected release-specific structures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear sections (Args, Returns, Examples, Notes) and is well front-loaded with purpose. It is somewhat long and partly duplicates schema parameter descriptions, but every section contributes meaningful context not found elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema, the description compensates by documenting the return structure, optional activities/activitiesError keys, the raw field caveat, and guidance for combining with other tools. This is complete enough for an agent to call the tool correctly and interpret unusual results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all three parameters at 100%, but the description adds value with usage examples that tie user intents to parameter settings, such as include_activities=true for interpreting ACTVT values. It also clarifies the large size and global nature of the activity catalog.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource (authorization object definition via SU21/ADT) and names the concrete outputs: description, object class, and fields. This clearly distinguishes it from sibling tools like sap_sql_query or sap_get_transaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it for authorization audits and names companion tools (sap_get_transaction, sap_sql_query) for complementary lookup scenarios. The examples also map natural-language questions to concrete parameter choices.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_badiBrowse BAdI DefinitionARead-onlyIdempotent
Read the definition of a BAdI (Business Add-In) from the Enhancement Framework, including its interface and active implementations.
Args:
name (string): BAdI definition name.
response_format.
Returns (json): { name, description?, interfaceName?, implCount, implementations: [{name, active, description?}], raw? }. raw is set when structured parsing yields nothing (ADT response varies by release).
Examples:
"What implementations exist for MB_DOCUMENT_BADI?" -> name='MB_DOCUMENT_BADI'.
"Is there a BAdI for FI document posting?" -> name='BADI_FBAS_RFDT'. Notes:
This reads definition metadata only. Use sap_get_source to read the actual implementation class source.
Enhancement spot browsing follows the same pattern; try the spot name if the BAdI name isn't found.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | BAdI definition name (e.g. 'BADI_FBAS_RFDT', 'MB_DOCUMENT_BADI'). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which the description complements. It adds behavioral context beyond annotations: the output may fall back to raw when parsing yields nothing, and the tool is open-world (try spot name). 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized clearly: a one-sentence purpose, Args, Returns, Examples, then Notes. It is front-loaded with the core action and distinguishes from siblings early. Every sentence adds value—no repetition or filler—and the structure makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully equips an agent to call the tool correctly: it defines return shape (even without a formal output schema), provides examples, notes the raw fallback, and directs to sap_get_source for source code. Given the read-only metadata nature and 100% parameter schema coverage, nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers both parameters with descriptions and examples (100% coverage), giving a baseline of 3. The description adds realistic example values in the Examples section and clarifies that response_format defaults to markdown in the schema, but the description does not restate the parameter details. These real-world examples help an agent pick appropriate values, so a 4 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('read') and resource ('BAdI definition') and enumerates the contents (interface, active implementations). The examples clarify real use cases and the name distinguishes it from sap_get_source, which reads implementation source. The purpose is unambiguous and well-defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'This reads definition metadata only. Use sap_get_source to read the actual implementation class source,' naming the alternative and the condition. Also advises trying the spot name if the BAdI name isn't found. This is clear, actionable guidance on when to use and when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_ddicInspect DDIC ObjectARead-onlyIdempotent
Inspect a Data Dictionary object's definition.
Behavior by type (read-only, release-independent via the DDIC repository tables):
'table' / 'structure': returns the field list (fieldname, position, keyflag, rollname, datatype, leng, decimals, checktable).
'dataelement': returns attributes (domain, datatype, length, decimals).
'domain': returns the domain attributes plus fixed values.
'cds': returns the CDS view DDL source text.
Args:
object_type ('table'|'structure'|'dataelement'|'domain'|'cds').
object_name (string).
response_format ('markdown' | 'json').
Returns (json): { objectType, objectName, detail, rawSource? }.
Examples:
"What fields are in TKEDRS?" -> object_type='table', object_name='TKEDRS'.
"Fixed values of domain BOOLE_D" -> object_type='domain', object_name='BOOLE_D'. Error Handling:
Empty fields -> object may not exist or is not active (as4local='A').
| Name | Required | Description | Default |
|---|---|---|---|
| object_name | Yes | DDIC object name (e.g. 'T001', 'BUKRS', 'I_JOURNALENTRY'). | |
| object_type | Yes | DDIC kind: 'table', 'structure', 'dataelement', 'domain', or 'cds'. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds meaningful behavioral details: it is read-only, release-independent, accesses DDIC repository tables, and behaves differently by object type. It also discloses error handling, such as empty fields indicating a non-existent or inactive object, which exceeds what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear headers, concise bullet points, and an immediately useful summary sentence up front. Each section—types, args, returns, examples, error handling—earns its place without redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by fully specifying the return shape: { objectType, objectName, detail, rawSource? }. It covers all object types, all parameters, examples, and error scenarios. An agent has enough information to select and invoke this tool correctly in the vast majority of cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all parameters at 100%, so the baseline is 3. The description adds value by enumerating what each object type returns, providing concrete examples mapping to values, and clarifying result details. This goes beyond simply restating the schema but does not dramatically deepen parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Inspect a Data Dictionary object's definition.' It then details distinct behaviors for table, structure, dataelement, domain, and cds, making it unambiguous what this tool does and effectively distinguishing it from sibling tools like sap_get_source or sap_read_table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: any time a DDIC object's definition or metadata is needed. It includes natural-language examples that map user requests to parameters. It does not explicitly state when not to use it or name alternatives, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_dumpRead Runtime ErrorARead-onlyIdempotent
Read one ABAP runtime error (short dump) in full: metadata plus the formatted ST22 analysis text. Get the dump_uri from sap_list_dumps.
Args:
dump_uri (string): the 'uri' from a sap_list_dumps entry, passed through unchanged.
response_format.
Returns (json): { uri, errorId, title?, author?, exception?, terminatedProgram?, serverInstance?, datetime?, text, lineCount }. 'text' is the full ST22 report (error analysis, source extract, call stack).
Examples:
"Why did that dump happen?" -> sap_list_dumps first, then sap_get_dump with its uri. Error Handling:
404 -> the dump was reorganised (housekeeping) or the URI is wrong; re-run sap_list_dumps.
| Name | Required | Description | Default |
|---|---|---|---|
| dump_uri | Yes | Dump URI from sap_list_dumps (starts with /sap/bc/adt/runtime/dump/). Pass it verbatim — it contains encoded spaces. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds meaningful behavioral detail beyond that: it documents the full returned JSON structure, explains that 'text' is the complete ST22 report, and discloses the 404 housekeeping/reorganization failure mode. There is no contradiction between the description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured with separate sections for summary, args, returns, examples, and error handling. Everything included earns its place, and the purpose is front-loaded in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 compensates by explicitly listing the JSON return fields and describing the content of 'text'. It also explains how to obtain dump_uri and how to handle a 404, giving an agent enough context to invoke the tool correctly even without prior knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters fully, including the dump_uri prefix, the encoded-space caution, and the response_format enum with default. The description mostly repeats the pass-through/verbatim idea and merely names response_format, so it adds little semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('one ABAP runtime error (short dump) in full'), and distinguishes itself from the sibling sap_list_dumps by focusing on a single dump. It also anchors the workflow by saying the dump_uri comes from sap_list_dumps, so an agent can tell exactly what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage pattern: call sap_list_dumps first, then sap_get_dump with the returned URI. The example and 404 recovery guidance reinforce when and how to use it. It does not explicitly state when not to use it, but the prerequisite and workflow make the intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_message_classRead Message ClassARead-onlyIdempotent
Read all messages in an ABAP message class (T100 content + metadata).
Args:
name (string): message class name.
response_format.
Returns (json): { name, description?, language?, count, messages: [{id, text, selfExplanatory?}] }.
Examples:
"What messages are in ZFI_MSGS?" -> name='ZFI_MSGS'.
"Find the text for message 001 in class VR" -> name='VR' then look for id='001'.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Message class name (e.g. 'ZFI_MSGS', 'VR'). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and non-destructive. The description adds a concrete return shape with optional fields (description?, language?, selfExplanatory?) and an example of how to locate a message by id. It does not mention error behavior or pagination, but the core read-only nature is clear. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized into summary, args, returns, and examples. It is under 150 words and every section adds value. The only minor repetition is the response_format name without a type, but the schema covers it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Though there is no output schema, the description provides a clear return shape and examples. It leaves open how the default 'markdown' response_format renders (the return shape is shown as json only) and does not address large message sets or not-found cases. Given the tool's simplicity and annotations, this is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented. The description adds example name values ('ZFI_MSGS', 'VR') and clarifies post-processing ('look for id='001''). It does not significantly expand on the response_format semantics, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States it reads all messages in an ABAP message class (T100 content + metadata). The verb 'read' and resource 'ABAP message class' are specific and distinct from sibling tools like sap_get_text_elements. Examples clarify the exact object ('ZFI_MSGS').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description shows example queries and how to map them to the 'name' parameter, which implies when to use it. However, it never explicitly contrasts this tool with alternatives or lists conditions where another sibling (e.g., sap_get_text_elements, sap_read_table) would be preferred. So usage guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_revisionsObject Version HistoryARead-onlyIdempotent
List the version history (revisions) of an ABAP object, or fetch the source of a specific old version.
Args:
object_type, object_name (and function_group for functions).
version (string): omit to list revisions; supply to read that revision's source.
response_format.
Returns (json): { objectType, objectName, versionsUri, count, revisions: [{ version, author?, updated?, contentUri }], version?, source?, lineCount? }.
Examples:
"What versions exist of ZFI_POST?" -> object_type='program', object_name='ZFI_POST'.
"Show version 00002 of ZFI_POST" -> ..., version='00002'.
"What changed since the last transport?" -> read an old version, then compare with sap_get_source. Notes:
Version records exist only where SAP created them (transport release, SE38/ADT version generation). A freshly created $TMP object may legitimately have none.
Requesting an unknown version returns the list of available version numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Version number from a previous call (e.g. '00000' = oldest entry, or as listed). When given, returns that version's full source instead of the list. | |
| object_name | Yes | Object name (e.g. 'ZFI_POST', 'ZCL_FOO'). | |
| object_type | Yes | Kind of object: 'program', 'include', 'class', 'interface', or 'function'. | |
| function_group | No | Required only when object_type='function': the enclosing function group. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description adds valuable behavioral detail: version records exist only when SAP created them, fresh $TMP objects may have none, and an unknown version returns the list of available numbers. This prevents misleading expectations without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: Args, Returns, Examples, and Notes. The main purpose is front-loaded, and every section earns its place without redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description fully compensates by specifying the JSON return shape, covering both operation modes, providing examples, and documenting edge cases. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning by explaining the dual-mode behavior of the version parameter ('omit to list revisions; supply to read that revision's source') and gives natural-language examples that map intents to parameter values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description starts with a specific verb+resource: 'List the version history (revisions) of an ABAP object, or fetch the source of a specific old version.' This clearly distinguishes sap_get_revisions from sap_get_source by emphasizing historical revisions versus current source, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage patterns with examples: when to omit version, when to supply it, and how to compare with sap_get_source. It does not formally state 'do not use for current source,' but the examples and notes make the intended use clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_screen_sourceRead Dynpro / Screen SourceARead-onlyIdempotent
Read the flow logic (PBO/PAI) source code of a dynpro/screen. Screens are separate from program source — this is the screen ABAP (not the element list).
Args:
program (string): the program owning the screen.
screen_number (int or string): e.g. 100, '0100'.
response_format.
Returns (json): { program, screenNumber, sourceUri, source, lineCount }.
Examples:
"Read screen 100 of ZPROG" -> program='ZPROG', screen_number=100. Notes:
Returns only the flow logic (PBO/PAI). The screen layout (element list) is not available via ADT.
404 means the screen doesn't exist on this program.
| Name | Required | Description | Default |
|---|---|---|---|
| program | Yes | Program name (e.g. 'ZPROG', 'SAPMV45A'). | |
| screen_number | Yes | Screen number as an integer or string (e.g. 100 or '0100'). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent behavior. The description adds meaningful limitations: it returns only flow logic, not the layout, and notes that 404 means the screen doesn't exist. This goes 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and information-dense. The core purpose is front-loaded, followed by concise parameter explanations, a useful example, and only two highly relevant notes. No sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description specifies the exact return shape. It covers parameter usage, an example, a scope limitation, and an error condition. The tool is simple enough that this is a complete picture for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all parameters with 100% coverage, including types, constraints, and examples. The description adds minimal extra meaning beyond restating the same information, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads the PBO/PAI flow logic source of a dynpro/screen, and explicitly distinguishes this from program source and the element list. This level of specificity makes the tool's purpose unambiguous and differentiates it from siblings like sap_get_source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that screens are separate from program source and that this tool returns screen ABAP, not the element list. This gives clear context for when to use it, though it does not explicitly name alternative tools such as sap_get_source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_sourceRead ABAP SourceARead-onlyIdempotent
Read the ABAP source code of a program, include, class, interface, or function module.
Args:
object_type ('program'|'include'|'class'|'interface'|'function').
object_name (string): e.g. 'ZFI_POST', 'CL_FOO'.
function_group (string): required only for object_type='function'.
response_format ('markdown' | 'json').
Returns (json): { objectType, objectName, sourceUri, etag?, source, lineCount }. 'etag' identifies the version and enables concurrency-safe writes.
Examples:
"Show me class CL_FOO" -> object_type='class', object_name='CL_FOO'.
"Read function module Z_CALC in group ZFG1" -> object_type='function', object_name='Z_CALC', function_group='ZFG1'. Error Handling:
404 -> wrong name/type, or missing function_group for a function module.
| Name | Required | Description | Default |
|---|---|---|---|
| object_name | Yes | Object name (e.g. 'ZFI_POST', 'CL_FOO', 'Z_MY_FM'). | |
| object_type | Yes | Kind of object: 'program', 'include', 'class', 'interface', or 'function'. | |
| function_group | No | Required only when object_type='function': the enclosing function group. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
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 useful behavioral context beyond that: it specifies the JSON return shape, mentions the etag for concurrency-safe writes, and documents 404 error cases. This is meaningful transparency without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args, Returns, Examples, and Error Handling sections. It is front-loaded with the core purpose, and every section earns its place without redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description fully compensates by defining the return object, explaining etag semantics, and documenting error conditions. Combined with strong annotations and full parameter schema coverage, nothing critical is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value with natural-language examples mapping 'Show me class CL_FOO' to parameters, clarifies that function_group is only required for object_type='function', and explains response_format choices. This goes slightly beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Read the ABAP source code of a program, include, class, interface, or function module.' It clearly identifies the object types and the read-only nature, and the title 'Read ABAP Source' differentiates it from sibling tools like sap_write_source or sap_get_screen_source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear read-operation context with examples and error handling, so an agent can infer when to use it. It does not explicitly name alternatives or state when not to use it, but the read-only framing and sibling names make the intended usage obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_text_elementsRead Text ElementsARead-onlyIdempotent
Read a program's / class's / function group's text elements: text symbols (TEXT-nnn), selection texts (parameter/select-option labels), and list headings.
Args:
object_type: 'program' | 'class' | 'function_group'.
object_name (string).
kind (string): one of 'symbols', 'selections', 'headings'; omit for all three.
response_format.
Returns (json): { objectType, objectName, kinds: [{ kind, entries: [{id, text, maxLength?, ddicReference?}], raw, note? }] }. Symbol ids are the 3-character numbers behind TEXT-nnn; selection ids are parameter / select-option names; heading ids are listHeader and columnHeader_1..4.
Examples:
"Why is my selection screen blank?" -> object_type='program', object_name='ZFI_POST', kind='selections'.
"What are ZCL_FOO's text symbols?" -> object_type='class', object_name='ZCL_FOO', kind='symbols'. Notes:
A kind the object does not use returns an empty list, not an error (a class typically has symbols only).
Texts come from the object's ORIGINAL (master) language pool, which is not necessarily English — SAP standard objects often return German.
ddicReference marks a selection text inherited from the DDIC data element rather than maintained locally.
Write them back with sap_set_text_elements.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Read only one kind ('symbols' | 'selections' | 'headings'). Omit for all three. | |
| object_name | Yes | Object name (e.g. 'ZFI_POST', 'ZCL_FOO'). | |
| object_type | Yes | 'program', 'class', or 'function_group' (pass the function GROUP name, not a module). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
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 meaningful behavioral context beyond that: texts come from the original master language pool (often German), unused kinds return empty lists, ddicReference indicates inherited selection texts, and the exact JSON return shape is documented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with Args, Returns, Examples, and Notes sections, each earning its place. It is longer than minimal, but every section conveys non-obvious information needed for correct use, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description fully compensates by documenting the return shape, ID semantics, edge cases, language-pool behavior, and examples. An agent has enough information to call the tool correctly and interpret the result accurately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all four parameters with 100% coverage, including enums, defaults, and illustrative object names. The description's Args section mostly restates the schema; the examples and notes add usage context but little new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('program's / class's / function group's text elements'), and enumerates the exact kinds of text elements returned. It is immediately distinguishable from sibling tools like sap_get_source and sap_set_text_elements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete examples mapping user questions to the right object_type and kind values, notes that unused kinds return empty lists rather than errors, and explicitly refers to sap_set_text_elements for writing texts back. This gives an agent clear routing guidance without relying on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_get_transactionRead Transaction (SE93)ARead-onlyIdempotent
Read a transaction code's SE93 definition: started program/screen, transaction type (decoded from the CINFO bit field), short text, package, parameter/OO target, SM01 lock, and the SE93 authorization checks (TSTCA). Core tool for authorization audits.
Args:
tcode (string): the transaction code.
response_format.
Returns (json): { tcode, exists, cinfo?, transactionType?, flags?, hasCheckObject?, lockedViaSM01?, reportWithVariant?, program?, screen?, description?, packageName?, author?, parameter?, targetClass?, targetMethod?, authChecks: [{TCODE, OBJCT, FIELD, VALUE}], authCheckCount }. transactionType is one of dialog | menu | parameter | report | object.
Examples:
"What does SE38 actually start?" -> tcode='SE38'.
"Which authorizations does VA01 check at start?" -> tcode='VA01', read authChecks. Notes:
The type is decoded from CINFO, which is a BIT FIELD: a transaction commonly carries several flags at once (SE38 = 84 = report transaction + has check object), so 'flags' can list more than the headline type.
'program' is legitimately empty for parameter and OO transactions — look at 'parameter' / targetClass+targetMethod instead.
authChecks are the SE93-maintained TSTCA rows (the checks performed at transaction START), not the full set of authority checks a program performs. Code-level AUTHORITY-CHECK statements live in the source — use sap_get_source or sap_where_used for those.
Short text is read in English (TSTCT SPRSL='E'); a transaction with no English text returns no description.
| Name | Required | Description | Default |
|---|---|---|---|
| tcode | Yes | Transaction code (e.g. 'SE38', '/BOBF/CUST_UI'). Case-insensitive; stored upper-case. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description adds substantial behavioral detail beyond that: CINFO is a bit field so multiple flags can coexist, 'program' is legitimately empty for parameter/OO transactions, authChecks are limited to TSTCA start checks, and short text is English-only returning no description if absent. These clarify real edge cases without contradicting 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a precise summary, then organized into Args, Returns, Examples, and Notes. Each note addresses a non-obvious behavior or output nuance, and there is no filler or repetition beyond the minimal, useful Args line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the full burden of documenting return values, and it does so comprehensively: the full JSON shape, the transactionType enum, nested authChecks structure, and edge-case behaviors are all covered. With annotations covering safety/idempotency, nothing essential is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, including tcode examples and case-insensitive behavior, and response_format's enum/default. The description's 'Args' section only restates the parameter names and terse meanings without adding anything beyond the schema, so the baseline of 3 applies; no additional parameter-level insight is contributed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read a transaction code's SE93 definition', and enumerates exactly what is returned (program/screen, transaction type, TSTCA checks, SM01 lock). It also distinguishes itself as the 'Core tool for authorization audits' and later contrasts code-level checks with sap_get_source and sap_where_used, so an agent can tell it apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use context ('Core tool for authorization audits') and clear exclusions: authChecks are only SE93-maintained TSTCA start-of-transaction checks, not full program-level authority checks, and for those the agent is directed to 'use sap_get_source or sap_where_used'. Examples also demonstrate query intent with tcode='SE38' and tcode='VA01'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_job_scheduleSchedule Background JobADestructive
Create and schedule an ABAP background job via JOB_OPEN + JOB_SUBMIT + JOB_CLOSE.
WARNING: This immediately starts an ABAP program in background if immediate=true. Only use in development/sandbox or when you are certain of the effect.
Args:
job_name (string): job name visible in SM37.
program (string): ABAP program to execute.
variant (string): program variant (optional).
immediate (boolean): start immediately (default true).
response_format.
Returns (json): { jobName, jobCount, message }. Use jobCount + jobName to monitor in SM37.
Examples:
"Schedule ZMONTHLY_CLOSE now" -> job_name='ZMONTHLY_CLOSE', program='ZMONTHLY_CLOSE'.
"Schedule with variant PROD" -> ..., variant='PROD'.
| Name | Required | Description | Default |
|---|---|---|---|
| program | Yes | ABAP program to run (e.g. 'ZMONTHLY_CLOSE'). | |
| variant | No | Variant name for the program (leave blank for no variant). | |
| job_name | Yes | Background job name (e.g. 'ZMONTHLY_CLOSE'). | |
| immediate | No | Start immediately (true) or create without start time (false, default true). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description adds specific behavioral context: immediate=true immediately starts an ABAP program, and jobCount/jobName can be used for SM37 monitoring. This goes beyond the structured annotation by explaining the side-effect timing and safe-use boundary, though it does not detail error or authorization behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the action and warning, followed by a compact arg list, return shape, and two examples. The only rough edge is the bare 'response_format.' line in the Args list, which adds some noise but no significant bulk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given five parameters and no output schema, the description covers the operation, side effects, safety warning, return JSON shape, and monitoring instructions. The schema fills in types, defaults, and constraints. It does not explain the immediate=false path in the description, but the schema's default documentation covers that, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All five parameters have schema descriptions (100% coverage), so the baseline is 3. The description adds value by explaining the role of job_name (visible in SM37), clarifying variant as optional, and giving concrete natural-language-to-parameter mappings in the examples, exceeding the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence, 'Create and schedule an ABAP background job via JOB_OPEN + JOB_SUBMIT + JOB_CLOSE,' names a specific verb, resource, and underlying SAP function modules. This clearly distinguishes it from siblings like sap_run_report (foreground execution) and sap_run_console.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit when-not restriction: 'Only use in development/sandbox or when you are certain of the effect.' It also includes natural-language examples like 'Schedule ZMONTHLY_CLOSE now' to illustrate typical user inputs. It does not explicitly name alternative sibling tools, but the background-job semantics plus safety warning make the appropriate context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_list_breakpointsList ABAP Debugger BreakpointsARead-onlyIdempotent
List the external (ADT) breakpoints set through this MCP server.
IMPORTANT — this is a client-side list. SAP offers no enumeration for external breakpoints: GET /sap/bc/adt/debugger/breakpoints answers HTTP 200 with an empty body even while breakpoints exist, and Eclipse works the same way (client-side truth, full-set sync on write). So this returns what this server has set since it started; breakpoints set from Eclipse, or by this server before a restart, are not listed. To cross-check the server side, run sap_sql_query on ABDBG_EXTDBPS (key RQ_USER).
Returns (json): { user, client, count, breakpoints: [{id, clientId, uri, line, objectName, condition, enabled}], note }. 'id' is the structured id SAP assigned (KIND=…LINE_NR=…), used by sap_delete_breakpoints.
Examples:
"Show my current breakpoints" -> (no args).
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral traits beyond the readOnly/idempotent annotations: the list is client-side, SAP's own endpoint returns an empty body, Eclipse behaves the same way, and restart clears the server's local knowledge. It also explains the returned structure and gives a concrete cross-check method, providing rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and the critical 'IMPORTANT' caveat, then gives a compact return schema and a concrete example. Every paragraph earns its place, including the HTTP endpoint detail that supports the client-side claim. The structure is well organized and not redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description fully documents the return shape, field meanings, the special 'id' field used by sap_delete_breakpoints, and the limitation regarding restart and Eclipse-set breakpoints. For a read-only list tool with this complexity, nothing an agent needs to invoke it correctly or interpret its output is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the single optional response_format parameter clearly documented in the schema. The description adds an example of calling with no arguments and shows the JSON return shape, but it does not need to further explain the parameter semantics because the schema already fully covers them. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('List') and resource ('external (ADT) breakpoints set through this MCP server'), which distinguishes it from related tools like sap_set_breakpoint and sap_delete_breakpoints. It also clarifies the scope as client-side and server-local, leaving no ambiguity about what is being listed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is explicit about when this tool is appropriate: it lists only breakpoints set by this server since startup, not Eclipse breakpoints or pre-restart breakpoints. It even gives an alternative approach (sap_sql_query on ABDBG_EXTDBPS) for cross-checking the server side, making the usage boundaries very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_list_dumpsList Runtime Errors (ST22)ARead-onlyIdempotent
List recent ABAP runtime errors (ST22 short dumps): error ID, terminated program, user, time, and the dump URI for sap_get_dump.
Args:
max_items (number): 1-100 (default 20).
from_date / to_date (string): YYYYMMDDHHMMSS window.
user (string): only dumps caused by this user.
response_format.
Returns (json): { count, dumps: [{ errorId, program?, user, published, shortText?, uri }], filteredBy? }. Pass 'uri' verbatim to sap_get_dump — it contains encoded characters.
Examples:
"Did anything dump today?" -> from_date='20260727000000'.
"Show my last 5 dumps" -> max_items=5, user='DEVELOPER'. Notes:
from_date/to_date are the only server-side filters. The server returns a fixed page of the most recent dumps regardless of max_items, so user filtering and max_items are applied to that page here — use from_date/to_date when hunting older dumps.
Dumps are reorganised by housekeeping jobs, so old entries eventually disappear.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Filter by the user who caused the dump. | |
| to_date | No | Only dumps at/before this timestamp, format YYYYMMDDHHMMSS. | |
| from_date | No | Only dumps at/after this timestamp, format YYYYMMDDHHMMSS. | |
| max_items | No | Maximum dumps to fetch (1-100, default 20). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the bar is lower, but the description adds substantial behavioral context beyond that: the server returns a fixed page regardless of max_items, user filtering and max_items are applied to that page locally, and housekeeping jobs eventually remove old dumps. This is exactly the kind of non-obvious behavior an agent needs to know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into Args, Returns, Examples, and Notes, with the core purpose stated first. Every section adds distinct value: format defaults, return shape, concrete examples, and important behavioral caveats. It is longer than average but avoids redundancy and front-loads the most actionable details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though there is no output schema, the description fully specifies the return JSON shape with field names and optional markers. It also covers pagination behavior, data retention, date format, default/max values, and how to chain into sap_get_dump. An agent has everything needed to decide when to call it and how to interpret the results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for all five parameters, so the schema already documents formats and defaults. The description adds meaningful semantics on top: it clarifies that from_date/to_date are server-side filters while max_items and user are applied to the returned page, and that the URI may contain encoded characters and should be passed verbatim. This goes beyond what the schema descriptions state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes the exact operation: listing recent ABAP runtime errors (ST22 short dumps), including the fields returned (error ID, program, user, time, and URI). The title and description align, and the resource is unambiguous. It also distinguishes itself from sap_get_dump by pointing out that the URI is meant to be passed to that sibling tool, so an agent can tell listing from fetching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context: examples show when to use date filters, max_items, and user filtering. The Notes explicitly explain that from_date/to_date are the only server-side filters and that max_items/user filtering happen client-side, which clarifies when to use which parameter. It doesn't explicitly say 'use sap_get_dump instead when you have a URI', but the return-URI note strongly implies the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_list_inactiveList Inactive ObjectsARead-onlyIdempotent
List all inactive ABAP objects for the system (objects edited but not yet activated), with owner and transport. Use to find leftovers before activating or transporting.
Args:
user (string): optional filter on the owning user.
response_format.
Returns (json): { count, objects: [{ uri, type, name, parentUri?, user?, deleted?, transport? }] }.
Examples:
"What did I forget to activate?" -> user='DEVELOPER'.
"Is anything inactive before I release DEVK900123?" -> no args. Notes:
The user filter is applied client-side on the returned list.
Activate what you find with sap_activate.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Only objects left inactive by this user. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, so the description does not need to repeat those. It adds useful behavioral context beyond annotations: the user filter is applied client-side, and the return shape included fields such as uri, type, name, and transport.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with Args, Returns, Examples, and Notes, keeping each section to one or two lines. The first sentence immediately states the core purpose, and every sentence adds information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description supplies a JSON return contract with count and objects. It covers purpose, usage scenarios, examples, filter behavior, and the next step (sap_activate). For a tool with only two optional parameters, this is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both user and response_format. The description adds meaningful nuance by explaining the user filter is client-side and by showing a concrete example (user='DEVELOPER') and a no-argument usage. Response_format is only name-dropped, but its enum and default in the schema cover it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states 'List all inactive ABAP objects for the system (objects edited but not yet activated), with owner and transport.' This is a specific verb and resource with clear scope and definition. It also distinguishes itself from sibling tools like sap_list_transports and sap_activate by focusing on inactive objects awaiting activation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use: 'Use to find leftovers before activating or transporting.' The description also points to sap_activate as the follow-up action. It does not explicitly rule out alternatives, but the purpose is specific enough that this is a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_list_transportsList Transport RequestsARead-onlyIdempotent
List workbench/customizing transport requests (and their tasks) owned by a user, via the CTS ADT service.
Args:
user (string): defaults to the logon user (SAP_USER).
response_format ('markdown' | 'json').
Returns (json): { user, count, transports: [{ number, description, status, owner, tasks: [...] }], raw? }. Status codes: 'D'/'L' = modifiable, 'O'/'R' = released.
Examples:
"What transports do I have open?" -> (no args).
Use the returned request number as 'transport' for sap_write_source. Error Handling:
The CTS response shape varies by release; when structured parsing yields nothing, 'raw' XML is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | SAP user whose transports to list. Defaults to the configured SAP_USER. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining response shape, status code meanings ('D'/'L' = modifiable, 'O'/'R' = released), parameter defaults, and a fallback behavior ('raw' XML returned when structured parsing yields nothing). This is valuable behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (Args, Returns, Examples, Error Handling), and every sentence adds relevant information. The purpose is front-loaded in the first sentence, and the additional details are organized and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only listing tool with no output schema: it explains return shape, status codes, defaults, an example invocation, and error-handling fallback. It also connects to a downstream tool (sap_write_source), giving the agent enough context to use the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, and schema descriptions already document both 'user' and 'response_format' with defaults. The description mostly restates this information, though it adds a small amount of context through examples and the note about defaulting to SAP_USER. Baseline 3 is appropriate because the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a specific resource ('workbench/customizing transport requests (and their tasks) owned by a user'), and the service used ('via the CTS ADT service'). It clearly distinguishes this from sibling tools like sap_create_transport and sap_release_transport by focusing on listing existing transports.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear usage context with the example 'What transports do I have open?' and notes that the returned request number can be used as 'transport' for sap_write_source. It does not explicitly name alternative tools or state when not to use it, but the listing intent is clear enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_read_feedRead ADT FeedARead-onlyIdempotent
List the ADT feeds available on this system (system messages, gateway error log, ATC verdicts, ...), or read one feed's entries. For short dumps prefer sap_list_dumps, which is purpose-built.
Args:
feed_path (string): omit to list feeds; pass a href to read that feed.
max_items (number): 1-100 (default 20), applied when reading.
response_format.
Returns (json), listing: { count, feeds: [{ title, href, description? }] }. Returns (json), reading: { feedPath, count, entries: [{ title?, author?, published?, updated?, summary?, categories, uri? }] }.
Examples:
"What monitoring feeds does this system publish?" -> no arguments.
"Any gateway errors?" -> feed_path='/sap/bc/adt/gw/errorlog'. Notes:
Entry shape varies by feed; 'summary' is a best-effort plain-text rendering of what is often an escaped HTML document, capped at 500 characters per entry. Use response_format='json' for the full structure.
feed_path must start with /sap/bc/adt/ — this tool is not a general HTTP proxy.
Not every feed honours the server-side item limit, so max_items is also enforced here.
For ABAP runtime errors use sap_list_dumps / sap_get_dump instead; they parse the dump-specific fields.
| Name | Required | Description | Default |
|---|---|---|---|
| feed_path | No | Feed href from a previous no-argument call (e.g. '/sap/bc/adt/runtime/systemmessages'). Omit to list the available feeds. | |
| max_items | No | Maximum entries to return when reading a feed (1-100, default 20). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this readOnly/idempotent/non-destructive, and the description adds meaningful behavioral context: feed_path must start with /sap/bc/adt/, max_items is enforced client-side because some feeds ignore the server limit, and summary is a best-effort 500-character plain-text rendering of potentially escaped HTML. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into intro, args, returns, examples, and notes, with the most important purpose and sibling distinction front-loaded. Each note covers an edge case or constraint that matters for correct invocation, and there is no filler or redundant restating beyond what is useful for quick reference.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description fills the gap by specifying the JSON return shapes for both listing and reading modes. It also covers response format semantics, path constraints, limit behavior, and alternatives, making it complete enough for an agent to invoke the tool correctly in both modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with types, defaults, and constraints, so the baseline is 3. The description adds value by clarifying that feed_path must be an ADT href, that max_items applies only when reading and is enforced locally, and that response_format='json' yields the full structure. This extra nuance justifies a 4 rather than a 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'List the ADT feeds available on this system... or read one feed's entries.' It also distinguishes itself from a sibling by directing short dumps to sap_list_dumps. The dual-mode behavior is stated upfront, so an agent knows exactly what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: omit feed_path to list feeds, pass an href to read one, and prefer sap_list_dumps or sap_get_dump for ABAP runtime errors. It also states the tool is not a general HTTP proxy and clarifies the path prefix requirement, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_read_tableRead Table ContentsARead-onlyIdempotent
Read the CONTENTS of any table or view the user is authorized for, via the ADT SQL Data Preview. This is the primary tool for reading customizing (T*) tables and business data.
Args:
table (string): table/view name.
fields (string[]): optional columns; omit for all.
where (string): optional WHERE clause without the 'WHERE' keyword. Use single quotes for literals.
max_rows (number): 1-1000 (default 100).
response_format ('markdown' | 'json').
Returns (json): { query, columns: [{name,type,length,description,key}], rows: [{col: value}], rowCount, totalRows, truncated }.
Examples:
"Show company codes" -> table='T001', fields=['BUKRS','BUTXT'].
"CO-PA derivation rules for strategy 1" -> table='TKEDRS', where="kalsm = '...'".
"FI documents for company 1000 in 2026" -> table='BKPF', where="bukrs = '1000' AND gjahr = '2026'", max_rows=50. Notes & Error Handling:
Read-only (SELECT only). Authorization is enforced by SAP (S_TABU_*).
403 -> the user lacks display authorization for this table.
Large tables: always pass 'where' and/or 'fields' and a small 'max_rows'.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table or view name (e.g. 'T001', 'BSEG', 'TKEDRS'). | |
| where | No | Optional ABAP-SQL WHERE clause WITHOUT the 'WHERE' keyword, e.g. "bukrs = '1000' AND gjahr = '2026'". | |
| fields | No | Optional list of columns to return. Omit for all columns ('*'). | |
| max_rows | No | Maximum rows to return (1-1000, default 100). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only/idempotent behavior, and the description adds meaningful behavioral details beyond them: authorization is enforced by SAP (S_TABU_*), 403 means missing display authorization, and large tables should be queried with fields/where/max_rows. This is exactly the kind of context that helps an agent invoke the tool safely.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear sections (Args, Returns, Examples, Notes & Error Handling) and front-loads the core purpose. Every section earns its place: examples clarify usage, the returns block compensates for the missing output schema, and the notes handle real failure modes without excessive verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a table-reading tool with no output schema, the description is remarkably complete: it explains return structure, authorization behavior, error meaning, large-result handling, parameter options, and provides concrete examples. An agent has everything needed to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all parameters at 100% with descriptions, so the baseline is 3. The description adds value through concrete examples (e.g., 'T001', 'BKPF', where-clause patterns), the single-quote literal rule, and the max_rows range reminder, which go beyond the schema's dry parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reading the contents of any authorized table or view via ADT SQL Data Preview. It clearly identifies itself as the primary tool for reading customizing tables and business data, though it does not explicitly name or contrast a sibling like sap_sql_query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: it is the primary reader for table contents and business data, with examples mapping natural language requests to concrete table/where-clause combinations. It lacks explicit exclusions or named alternatives, but the intended use cases are well conveyed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_release_transportRelease Transport RequestADestructive
Release (export) a transport request. This starts the transport release job.
WARNING: Releasing a transport is IRREVERSIBLE. The request becomes read-only. Ensure all objects in it are correct and activated before releasing.
Args:
number (string): transport number from sap_list_transports or sap_create_transport.
response_format.
Returns (json): { number, released, jobId?, message }.
Examples:
"Release transport DEVK900123" -> number='DEVK900123'.
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes | Transport request number (e.g. 'DEVK900123'). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The warning that releasing is IRREVERSIBLE and that the request becomes read-only provides concrete behavioral consequences beyond the destructiveHint annotation. It also discloses that the operation starts a transport release job and that the response may include a jobId, which is meaningful context for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well organized: purpose, warning, args, returns, and example. The irreversible warning is front-loaded, and every sentence adds value without unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description provides a JSON return shape, covers the irreversible side effect, explains where the transport number comes from, and includes an example. It could go slightly further on what `jobId?` implies for tracking, but the description is still sufficient for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters (100% coverage), and the description adds useful provenance for the `number` parameter by pointing to sap_list_transports or sap_create_transport. The example phrase maps natural language to the field, while `response_format` is only named but fully covered by the enum schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action, 'Release (export) a transport request', on a clear resource. It also anchors the input provenance to sap_list_transports or sap_create_transport, which differentiates this from create/list/activation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: use after obtaining a transport from sap_list_transports or sap_create_transport, and after ensuring all objects are correct and activated. It does not explicitly name exclusions or alternative tools, but the sequencing and warning are strong enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_rfc_callCall RFC Function ModuleADestructive
Call any RFC-enabled function module and return all exported parameters. Use sap_rfc_describe first to discover parameters.
WARNING: This can execute arbitrary function modules including write operations. Confirm authorization before calling write FMs in production.
Args:
function_name (string): RFC FM name.
params (object): import/changing parameters (default: {}).
response_format.
Returns (json): { functionName, result: { ...exported parameters } }.
Examples:
Read material: function_name='BAPI_MATERIAL_GET_DETAIL', params={"MATERIAL":"ROH-001"}.
RFC_READ_TABLE: function_name='RFC_READ_TABLE', params={"QUERY_TABLE":"T001","DELIMITER":"|"}.
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | Import / changing parameters as a JSON object. Tables: pass as arrays of objects. | |
| function_name | Yes | RFC-enabled function module name. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by explicitly warning that the tool 'can execute arbitrary function modules including write operations' and that authorization should be confirmed in production. This aligns with destructiveHint=true and readOnlyHint=false and gives the agent crucial safety context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose, prerequisite, warning, argument summary, return format, and examples. Every sentence contributes operational value; the warning is prominent without bloating the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an open-world, arbitrary-execution tool with no output schema, the description covers the essential return shape, the need for discovery via sap_rfc_describe, and the write-risk warning. Minor gaps like error behavior and table parameter handling are not fully explained, but the schema and examples cover most practical invocation needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema already covers all three parameters with 100% description coverage. The description adds value through concrete examples (BAPI_MATERIAL_GET_DETAIL and RFC_READ_TABLE) and clarifies that params contain import/changing parameters with default {}. This is a meaningful supplement, not just a schema repeat.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Call any RFC-enabled function module and return all exported parameters.' This clearly distinguishes the tool from siblings like sap_bapi_call (BAPI-specific) and sap_read_table by emphasizing arbitrary RFC function modules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to 'Use sap_rfc_describe first to discover parameters', which routes the agent to the correct discovery predecessor. It also advises confirming authorization before writing in production. It does not explicitly name alternatives like sap_bapi_call, but the guidance is sufficient for typical invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_rfc_describeDescribe RFC Function ModuleARead-onlyIdempotent
Get the parameter list (import, export, changing, table) of any RFC-enabled function module.
Args:
function_name (string): name of the function module.
response_format.
Returns (json): { name, parameters: [{ name, direction, type, length?, description?, optional? }] }. direction: I=import, E=export, C=changing, T=table.
Examples:
"What parameters does BAPI_SALESORDER_CREATEFROMDAT2 take?" -> function_name='BAPI_SALESORDER_CREATEFROMDAT2'.
| Name | Required | Description | Default |
|---|---|---|---|
| function_name | Yes | RFC-enabled function module name (e.g. 'BAPI_MATERIAL_GET_DETAIL'). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds useful behavioral detail by specifying the return structure, direction codes, and optional metadata fields, which 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded, and well organized into Args, Returns, direction legend, and Example. Every section adds useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with two parameters and no output schema, so the description appropriately carries the burden of explaining the return format. It fully covers what an agent needs to invoke the tool and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema fully documents function_name and response_format. The description adds a concrete example value and clarifies via context that function_name is the module to inspect, but it does not materially extend the schema semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: "Get the parameter list (import, export, changing, table) of any RFC-enabled function module." This clearly distinguishes the tool from sibling call/inspection tools like sap_rfc_call, sap_rfc_system_info, or sap_get_ddic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example question, "What parameters does BAPI_SALESORDER_CREATEFROMDAT2 take?", gives a clear usage context. It does not explicitly name alternatives or when-not-to-use cases, but the intended lookup scenario is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_rfc_pingTest RFC ConnectionARead-onlyIdempotent
Test the RFC connection to SAP using STFC_CONNECTION. Requires node-rfc and the SAP NW RFC SDK.
Configure via RFC_ASHOST + RFC_SYSNR (direct) or RFC_MSHOST + RFC_R3NAME (load-balanced) in .env.
Returns (json): { connected, systemId?, message }.
Notes:
If the SDK is not installed this tool returns a clear error with setup instructions.
Credentials are reused from SAP_CLIENT, SAP_USER, SAP_PASSWORD.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: it discloses the dependency on node-rfc and the SAP NW RFC SDK, explains what happens if the SDK is missing, describes the JSON return shape, and clarifies that credentials are reused from environment variables. This gives an agent a realistic picture of the tool's runtime behavior and requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: purpose first, then dependencies, configuration, return shape, and bulleted notes. Every sentence adds relevant information with no fluff or repetition of schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only ping tool with one optional parameter and no output schema, the description is complete. It covers what the tool does, how to configure it, what it returns, credential handling, and the failure mode when the SDK is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter response_format already has a full description and enum in the schema. The tool description adds no additional meaning to parameters, though it does mention a JSON return shape that is slightly inconsistent with the markdown/json response_format choice.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Test the RFC connection to SAP') and the specific function module used (STFC_CONNECTION), making the tool's purpose unambiguous. However, it does not explicitly distinguish itself from the sibling tool 'sap_connection_test', which appears to serve a similar connectivity-checking purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides configuration prerequisites (direct vs. load-balanced connections) and notes about SDK installation, but it gives no guidance on when to use this tool versus alternative siblings like sap_connection_test or sap_rfc_system_info. There are no explicit exclusions or conditions for choosing this tool over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_rfc_system_infoRFC System InformationARead-onlyIdempotent
Call RFC_SYSTEM_INFO to retrieve SAP system metadata (SID, host, release).
Returns (json): { sysId, client, host, programId?, releaseVersion?, language? }.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful context beyond annotations by naming the specific RFC function and detailing the response structure with optional fields. However, it says 'Returns (json)' while the response_format parameter defaults to 'markdown', creating ambiguity about the actual output format. This is a transparency gap, though it does not contradict the read-only/idempotent annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with two sentences that deliver the core purpose and return structure without fluff. The 'Returns (json)' phrase is slightly misleading but the overall structure is efficient and front-loaded with the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one well-documented parameter, the description provides sufficient context: it explains the metadata retrieved and the exact response fields, compensating for the lack of an output schema. The only minor gap is the output format ambiguity, which is covered by the parameter schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single response_format parameter is fully documented with enum values, default, and a clear description. The tool description adds no additional parameter semantics, so the baseline of 3 is appropriate because the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Call RFC_SYSTEM_INFO to retrieve SAP system metadata (SID, host, release)'. It also lists the exact metadata fields returned, which differentiates it from sibling tools like sap_connection_test or sap_rfc_ping that concern connectivity rather than system metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when SAP system metadata is needed, but it does not explicitly compare to alternatives or state when not to use this tool. There is no mention of sibling tools or exclusions, so guidance is only implicit through the stated purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_run_consoleRun ABAP (ADT Console)ADestructive
Execute an ABAP snippet server-side via the ADT class-run endpoint — no RFC SDK required. The snippet becomes the body of IF_OO_ADT_CLASSRUN~MAIN in a reusable local ($TMP) runner class, so it can CALL FUNCTION any function module / BAPI and print results with out->write( ). This is the SDK-free substitute for the sap_rfc_* tools.
Args:
abap_code (string): ABAP for the method body. 'out->write( v )' returns data; 'out' is ref to if_oo_adt_classrun_out.
class_name (string): runner class (default 'ZMCP_CONSOLE', $TMP local).
response_format.
Returns (json): { className, activated, output, message }.
Examples:
Call a function module: CALL FUNCTION 'RFC_SYSTEM_INFO' IMPORTING rfcsi_export = DATA(ls). out->write( ls-rfcsaprl ).
Quick value: out->write( |Client { sy-mandt }, user { sy-uname }| ). Notes:
Requires S_DEVELOP (creates/activates a temp class). Dev/sandbox only — not production.
For data-changing BAPIs, add CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' in the same snippet.
Prefer sap_read_table / sap_sql_query for plain data reads.
| Name | Required | Description | Default |
|---|---|---|---|
| abap_code | Yes | ABAP statements for the method body. Use 'out->write( value )' to return data ('out' is ref to if_oo_adt_classrun_out). Can CALL FUNCTION any FM/BAPI. | |
| class_name | No | Runner class name (default 'ZMCP_CONSOLE', created local in $TMP). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, and the description confirms this by stating the tool 'creates/activates a temp class' and requires S_DEVELOP. It adds important behavioral context: environment restriction, commit requirement for data-changing BAPIs, and temp-class lifecycle.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with Args, Examples, and Notes sections, front-loading the core purpose and then providing actionable usage details. Every section earns its place without redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explicitly documents the return shape as { className, activated, output, message }. It also covers auth requirements, environmental constraints, examples, and sibling alternatives, making it fully actionable for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries most parameter meaning. The description adds value beyond the schema with concrete examples for abap_code, including a full CALL FUNCTION pattern and inline output formatting, which clarify exactly how the parameter should be used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Execute an ABAP snippet server-side') and resource ('ADT class-run endpoint'), and explicitly distinguishes itself as the SDK-free substitute for the sap_rfc_* tools. The scope is clear and differentiated from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to prefer sap_read_table / sap_sql_query for plain data reads, identifies itself as the RFC substitute, and warns it is dev/sandbox only, not production. This gives clear when-to-use and 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.
sap_run_reportRun ABAP ReportADestructive
EXECUTES an ABAP report (program) on the SAP system and returns its list output as text. This runs real code with real side effects — the report may post documents, change configuration, lock objects or run for minutes. It is not a preview and there is no dry run.
The report runs synchronously (SUBMIT ... EXPORTING LIST TO MEMORY AND RETURN) inside the HTTP work process, so the output comes back in the same call, typically in under a second for a small report.
Args:
program_name (string): the report to run.
confirm_non_custom (boolean): must be true for any program not starting with Z or Y. Namespaced programs (/ABC/...) count as non-custom and need it too.
strip_list_header (boolean, default true): remove the ABAP list header lines.
max_chars (number): cap on returned characters (default 20000, max 60000).
response_format.
Returns (json): { programName, exists, authorized, ok, output, rawOutput, lineCount, bytes, durationMs, truncated, message }. ok=false means the run did not happen or produced no usable result — ALWAYS read ok, never assume success.
Examples:
"Run my report ZFI_CHECK and show the output" -> program_name='ZFI_CHECK'.
"Run the standard report RSUSR002" -> program_name='RSUSR002', confirm_non_custom=true (and be sure that is wanted). SELECTION-SCREEN PARAMETERS CANNOT BE PASSED:
The SAP endpoint's SUBMIT has no WITH clause, so a report with a selection screen runs on its DEFAULT values, silently. No client can work around this. If a report needs input, give its parameters DEFAULT values, generate a variant-free wrapper report, or use sap_job_schedule. Clean output via RESULT_TEXT (the reason to prefer this over scraping a list):
The handler ends with IMPORT result_text FROM MEMORY ID 'RESULT_TEXT'. A report that does EXPORT result_text = lv_string TO MEMORY ID 'RESULT_TEXT'. gets that exact string back — no list header, no 255-byte padding, no CRLF records. For a report you generate, emit JSON that way and read it back verbatim.
Use one channel or the other. A report that both WRITEs and exports gets the result string appended after the list, and the handler never clears RESULT_TEXT — a value left by an earlier run can reappear, so do not treat its presence as proof this run produced it. Notes:
HTTP 200 does not mean success: SAP answers "program does not exist" and authorization refusals with 200 and a plain sentence. This tool classifies the body and reports exists/authorized/ok accordingly, keeping the untouched body in rawOutput.
Empty output is a legitimate result for a report that WRITEs nothing, and is also what a report that terminates early looks like — the endpoint cannot tell them apart.
Only classic list output (WRITE) is captured. ALV grids and screens have no GUI to render into and are not tested on this system.
The only server-side gate is S_DEVELOP (OBJTYPE=PROG, ACTVT=16), which a developer passes for EVERY program including SAP standard. The Z/Y namespace rule enforced here is the real safety boundary.
A timeout does not cancel the report — it keeps running server-side. For long-running work use sap_job_schedule, which runs in the background and returns a job id.
| Name | Required | Description | Default |
|---|---|---|---|
| max_chars | No | Cap on returned output characters (default 20000). | |
| program_name | Yes | Report/program name (e.g. 'ZFI_FSV_RECREATE'). Case-insensitive. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
| strip_list_header | No | Drop the standard ABAP list header (date / title / page number and the dashed rule) from the output. | |
| confirm_non_custom | No | Required true to run a program outside the Z*/Y* namespace (SAP standard reports and namespaced /ABC/ programs). Running standard reports can post documents, change configuration or run for a long time; the server refuses without this flag. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, but the description goes far beyond that: real side effects, no dry run, HTTP 200 not implying success, timeout not cancelling the report, RESULT_TEXT not being cleared, and only classic list output being captured. This fully discloses the behavioral risks and edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense, organized into labeled sections with no filler. Every paragraph addresses a distinct concern: core behavior, arguments, return shape, examples, selection-screen limitation, RESULT_TEXT usage, and operational caveats. For a high-risk tool with this much behavioral nuance, the length is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description fully documents the JSON return fields and stresses that ok=false must always be checked. It also covers auth, empty-output ambiguity, server-side execution after timeout, and the correct alternative for background execution. Nothing critical is missing for an agent to call this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaningful nuance beyond the schema, especially that namespaced programs like /ABC/ count as non-custom and require confirm_non_custom, and it clarifies max_chars defaults and caps. Some parameter explanation duplicates the schema, but the edge-case clarity justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('EXECUTES an ABAP report'), the resource, and the return value ('list output as text'). It clearly distinguishes this from siblings like sap_syntax_check or sap_run_unit_tests by focusing on executing a report program, and explicitly notes it is not a preview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance and names the alternative: use sap_job_schedule for reports needing selection parameters or long-running work. It also tells the agent when confirm_non_custom is required and warns that standard reports may have side effects, so the agent can decide before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_run_unit_testsRun ABAP Unit TestsARead-only
Execute ABAP Unit tests for an object and return pass/fail results per test method.
Runs all test classes (FOR TESTING) contained in or associated with the object. Useful for verifying changes before activating or releasing.
Args:
object_type, object_name (and function_group for functions).
response_format.
Returns (json): { objectName, total, passed, failed, errors, skipped, testClasses: [{name, methods: [{name, outcome, alerts: [{kind, title, details?}]}]}] }.
Examples:
"Run tests for ZCL_FOO" -> object_type='class', object_name='ZCL_FOO'.
"Did my last edit break anything?" -> run tests for the changed class. Notes:
Object must have test classes defined. No tests = total=0.
Requires S_DEVELOP authorization.
| Name | Required | Description | Default |
|---|---|---|---|
| object_name | Yes | Object name (e.g. 'ZCL_FOO' for a class with local test classes). | |
| object_type | Yes | Object kind containing the test classes. | |
| function_group | No | Required when object_type='function'. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds meaningful behavioral context beyond that: it runs all test classes (FOR TESTING), returns total=0 when no tests exist, requires S_DEVELOP authorization, and provides the exact JSON return structure. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: a one-sentence summary, a short context paragraph, then compact Args/Returns/Examples/Notes sections. Each section earns its place and there is no fluff or tautological repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description provides the full JSON return structure, covers the required parameters, notes the conditional function_group parameter, clarifies response_format behavior, states authorization requirements, and handles the no-test-classes edge case. This is complete enough for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds some value by giving concrete examples ('Run tests for ZCL_FOO' -> object_type='class', object_name='ZCL_FOO') and noting the function_group conditional requirement, but it does not substantially augment what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific action and resource: 'Execute ABAP Unit tests for an object and return pass/fail results per test method.' It clearly distinguishes this tool from static checks like sap_syntax_check or sap_atc_run because it is explicitly about running ABAP Unit tests and reporting test outcomes per method.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance: 'Useful for verifying changes before activating or releasing' and includes a natural-language example ('Did my last edit break anything?'). It also notes the key prerequisite that the object must have test classes. It does not explicitly name an alternative tool, but the use context is strongly implied and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_search_objectsSearch Repository ObjectsARead-onlyIdempotent
Quick-search the ABAP repository for objects (programs, classes, interfaces, function modules, tables, CDS, packages, etc.) by name pattern.
Args:
query (string): Name pattern; '' is a wildcard (e.g. 'ZFI', 'CL_POST').
max_results (number): 1-200 (default 50).
response_format ('markdown' | 'json').
Returns (json): { query, count, objects: [{ uri, type, name, packageName?, description? }] }. 'type' is the ADT type code, e.g. PROG/P (program), CLAS/OC (class), INTF/OI (interface), FUGR/FF (function module), TABL/DT (table), DDLS/DF (CDS).
Examples:
"Find custom FI programs" -> query 'ZFI*'.
"Locate the T001 table" -> query 'T001'.
Don't use to read source (use sap_get_source) or table data (use sap_read_table). Error Handling:
Empty list -> no objects match the pattern; broaden the wildcard.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search pattern; '*' acts as a wildcard. E.g. 'ZFI*', 'CL_*POSTING*', 'T001'. | |
| max_results | No | Maximum objects to return (1-200, default 50). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false. The description goes further by documenting wildcard syntax, the JSON return shape, ADT type codes, and the empty-result behavior, which are not inferable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with clear sections (intro, Args, Returns, Examples, Error Handling) and front-loads the purpose. The Args block is somewhat redundant with the 100%-covered schema, but it is compact and every other section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no output schema, the description supplies the return shape, type-code mapping, bounds, examples, error behavior, and exclusions, making it actionable without needing hidden context. The markdown output format is not detailed, but the json option is fully defined and annotations cover safety.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, and the description largely restates the schema's parameter descriptions (query wildcard, max_results bounds, response_format enum). It adds examples, but these are illustrative rather than new parameter semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Quick-search the ABAP repository for objects ... by name pattern,' listing concrete object kinds. It also disambiguates itself from related siblings by saying not to use it to read source or table data, so an agent can distinguish it from sap_get_source and sap_read_table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names when not to use the tool ('Don't use to read source...' and '...or table data') and gives the alternative tools. The example prompts ('Find custom FI programs' -> query 'ZFI*') also demonstrate when the tool should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_set_breakpointSet ABAP Debugger BreakpointA
Set an external (ADT) breakpoint at a line in an ABAP object, for the user the debug session listens for (default SAP_USER).
Args:
object_type, object_name, line (required).
condition (optional): ABAP expression; break only when true. Best-effort — the condition attribute is not verified on this system.
function_group: required for object_type='function'.
response_format.
Returns (json): { success, breakpoints: [{id, clientId, uri, line, objectName, condition}], failed, message }. SAP resolves the source line to the line of the generated include, so the id may name a different LINE_NR than you asked for. That is normal.
Examples:
"Break on ZTEST line 42" -> object_type='program', object_name='ZTEST', line=42.
"Break on ZCL_FOO line 15 when SY-SUBRC <> 0" -> add condition="SY-SUBRC <> 0". Notes:
Works standalone: external breakpoints persist in SAP (table ABDBG_EXTDBPS) whether or not a debug session exists. They only TRAP execution while a listener is armed — call sap_debug_attach, then sap_debug_wait.
The ADT write is a FULL-SET SYNC: every call re-sends this server's whole breakpoint registry as the complete set for its identity. A consequence worth knowing: the first sap_set_breakpoint after a server restart drops breakpoints an earlier run left behind.
The breakpoint is keyed to the debug session's user. To trap another user's execution, pass that user to sap_debug_attach BEFORE setting breakpoints.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Line number to break on. | |
| condition | No | Optional ABAP condition expression (e.g. "SY-TABIX = 5"). Break only when true. | |
| object_name | Yes | Object name (e.g. 'ZPROG', 'ZCL_FOO'). | |
| object_type | Yes | Object kind: 'program', 'include', 'class', 'interface', or 'function'. | |
| function_group | No | Required when object_type='function'. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide hints (readOnly=false, openWorld=true, etc.), so the description carries the burden of behavioral disclosure. It delivers extensive context: the FULL-SET SYNC write semantics and restart consequence, best-effort condition handling, the generated-include line mapping, the persistence table, and the requirement for an armed listener. This goes far beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then organized into Args, Returns, Examples, and Notes. Every sentence serves a purpose — behavioral caveats, workflow prerequisites, and parameter mapping — with no filler or repetition. Length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description explains the JSON return shape and the important line-number mapping caveat. It also covers persistence, session requirements, and user keying. For a setter tool with subtle side effects, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 beyond the schema by correlating natural-language examples ('Break on ZTEST line 42') to concrete parameter assignments and by explaining the function_group requirement and the condition caveat. This is meaningful enrichment over the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Set an external (ADT) breakpoint at a line in an ABAP object') and adds the user-scoping qualifier, which distinguishes it from sibling breakpoint tools like sap_list_breakpoints and sap_delete_breakpoints. The sentence about trapping execution only while a listener is armed further clarifies its distinct role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational context: breakpoints persist but only trap when a listener is armed, and it explicitly instructs to call sap_debug_attach then sap_debug_wait. It also explains the user-keying prerequisite for trapping another user's execution. It doesn't explicitly name alternatives for when to use a different tool, but the workflow guidance is sufficient for correct use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_set_text_elementsWrite Text ElementsAIdempotent
Write a program's / class's / function group's text elements: text symbols (TEXT-nnn), selection texts (parameter/select-option labels), or list headings. Entries are MERGED over the existing ones by id — ids you omit are preserved.
Args:
object_type, object_name, kind (one kind per call).
entries: [{ id, text, max_length? }].
transport (string): required for transportable packages.
activate (boolean): activate the owning object afterwards (default false).
response_format.
Returns (json): { objectType, objectName, kind, written, merged, transport?, activated, verified, notPersisted, message }. Every write is read back and compared: verified=true means the values are actually stored. notPersisted lists ids the server accepted but did not store.
Examples:
"Set text symbol 001" -> kind='symbols', entries=[{id:'001', text:'Processing complete', max_length:30}].
"Title the list output" -> kind='headings', entries=[{id:'listHeader', text:'Posting log'}]. Validation (checked before any call to SAP):
Symbol ids are exactly 3 characters; selection texts are at most 30 characters; heading ids must be listHeader (<= 71 chars) or columnHeader_1..4 (<= 255 chars). Notes:
The underlying PUT replaces the whole pool section for that kind, so this tool reads the current entries and merges yours over them. Editing one symbol therefore does not delete the others.
KNOWN LIMITATION on this release: kind='selections' is accepted with HTTP 200 but the values are NOT stored — the read-back still shows '?...'. The tool reports this honestly (verified=false, notPersisted listing the ids) instead of claiming success. Maintain selection texts in SE38 (Goto > Text elements > Selection texts) until this is resolved. 'symbols' and 'headings' write correctly.
Texts are stored in the object's ORIGINAL (master) language. On an object whose master language is not English, entries land in that language's pool.
Activation is not required for the texts to become visible; 'activate' is offered for the owning object's sake.
Read the result back with sap_get_text_elements.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which pool section to write: 'symbols', 'selections' or 'headings'. One kind per call. | |
| entries | Yes | Entries to write. Merged over the existing ones by id. | |
| activate | No | Activate the owning object afterwards. | |
| transport | No | Transport request (e.g. DEVK900123). Required for objects in transportable packages; ignored for local ($TMP) objects. | |
| object_name | Yes | Object name (e.g. 'ZFI_POST'). | |
| object_type | Yes | 'program', 'class', or 'function_group' (pass the function GROUP name, not a module). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Thoroughly discloses merge semantics (PUT replaces pool section, omitted ids preserved), known limitation for selections with verified=false and notPersisted, master-language behavior, activation behavior, and read-back verification. Far exceeds what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: Args, Returns, Examples, Validation, Notes. Structured for scannability with front-loaded purpose and critical limitation clearly flagged.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex write tool with 7 parameters, 3 kinds, transport requirements, and a known server-side limitation, the description covers everything needed to call it correctly. It even documents return fields, compensating for the absent output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains every parameter. The description adds value by clarifying merge behavior and validation constraints (3-char symbols, heading id rules, max_length), but it doesn't need to compensate for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Write') and exact resource types (text symbols, selection texts, list headings). It clearly distinguishes itself as the write counterpart to the sibling sap_get_text_elements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit examples, validation rules checked before calling SAP, a known limitation with a workaround (SE38), and follow-up guidance to read results back with sap_get_text_elements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_sql_queryRun ABAP-SQL QueryARead-onlyIdempotent
Run a freestyle, read-only ABAP-SQL SELECT (including joins) via the ADT Data Preview. Use this when sap_read_table is not expressive enough.
Args:
sql (string): a SELECT statement. Only SELECT is permitted.
max_rows (number): 1-1000 (default 100).
response_format ('markdown' | 'json').
Returns (json): same shape as sap_read_table.
Examples:
"Join BKPF and BSEG for company 1000" -> sql="SELECT k
belnr, kgjahr, bhkont, bdmbtr FROM bkpf AS k INNER JOIN bseg AS b ON kbukrs = bbukrs AND kbelnr = bbelnr AND kgjahr = bgjahr WHERE k~bukrs = '1000'". Error Handling:Rejects anything that is not a SELECT.
SAP syntax errors are returned with the server message.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | A read-only ABAP-SQL SELECT statement (no trailing period needed). Joins are supported. | |
| max_rows | No | Maximum rows to return (1-1000, default 100). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds useful behavioral details beyond those: execution via ADT Data Preview, rejection of anything that is not a SELECT, and propagation of SAP syntax error messages. This gives an agent a clearer picture of how the tool behaves at runtime, though it doesn't discuss edge cases like timeouts or very broad queries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized into Args, Returns, Examples, and Error Handling sections. The first sentence front-loads the purpose and usage condition, and each section earns its place. The long example SQL is justified because it illustrates exactly the complexity this tool is meant to handle.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, freestyle SQL tool with no output schema, the description covers the essential needs: purpose, usage guidance, parameters, an example, output shape via 'same shape as sap_read_table', and error behavior. Combined with full schema coverage and safety annotations, it is nearly complete; minor missing details such as response size limits or authorization requirements are not critical given the read-only constraint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all three parameters at 100%, so the baseline is 3. The description adds plain-language restatements plus a concrete SQL example for the 'sql' parameter, demonstrating join syntax, aliases, and table references—value beyond the schema's property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific verb and resource: 'Run a freestyle, read-only ABAP-SQL SELECT (including joins) via the ADT Data Preview.' It also explicitly contrasts with a sibling tool, saying to use this when 'sap_read_table is not expressive enough', which makes the tool's distinct role obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to choose this tool over the most relevant alternative: 'Use this when sap_read_table is not expressive enough.' It reinforces the boundary by emphasizing 'read-only' and 'Only SELECT is permitted,' signaling it is not for writes or arbitrary commands.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_syntax_checkSyntax-Check ABAP ObjectARead-onlyIdempotent
Run an ABAP syntax check (check run) against an object and return errors, warnings, and info messages.
Args:
object_type ('program'|'include'|'class'|'interface'|'function').
object_name (string).
function_group (string): required for functions.
version ('active'|'inactive', default 'active').
response_format ('markdown' | 'json').
Returns (json): { objectType, objectName, version, errorCount, warningCount, messages: [{type, text, uri?}] }.
Examples:
After editing inactive source -> version='inactive' to validate before activation. Error Handling:
404 -> object/version not found.
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Which version to check: 'active' (saved/activated) or 'inactive' (latest edited). | active |
| object_name | Yes | Object name. | |
| object_type | Yes | Object kind to check. | |
| function_group | No | Required when object_type='function'. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description doesn't need to restate safety. The description adds useful details: it returns error/warning/info messages, and 404 indicates object/version not found. However, it doesn't disclose details like response size limits, whether markdown is formatted for chat, or what the URI in messages refers to.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core purpose, followed by args, return format, example, and error handling. The structured layout helps parsing. It could be slightly tighter, but there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only check tool with 100% param coverage and a return schema embedded in the description, this is complete enough. The output structure is spelled out. Minor gaps: no mention of how markdown output looks, no pagination/limit behavior, and no explicit note about requiring an active SAP connection, though siblings imply that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds the function_group requirement and the version='inactive' validation scenario, but doesn't add much beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool runs an ABAP syntax check against an object and returns errors, warnings, and info messages. The list of object types and the example use case (validating inactive source before activation) distinguish its purpose from sibling tools like sap_activate or sap_atc_run.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete example of when to use version='inactive', which is a clear usage signal. It does not explicitly name sibling alternatives or state when not to use this tool, but the context of syntax checking is clear enough relative to siblings like sap_atc_run, sap_where_used, or sap_get_source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_user_getGet SAP User DetailARead-onlyIdempotent
Read SAP user details (address, logon data, lock status, roles, profiles) via BAPI_USER_GET_DETAIL.
Args:
username (string): SAP user name (max 12 chars).
response_format.
Returns (json): { username, firstName?, lastName?, email?, validFrom?, validTo?, locked?, roles: string[], profiles: string[] }.
Examples:
"What roles does user JSMITH have?" -> username='JSMITH'.
"Is user VENNELAKA locked?" -> username='VENNELAKA'.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | SAP user name (e.g. 'VENNELAKA', 'JSMITH'). | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful behavioral detail beyond that: it names the BAPI, documents the JSON response shape, and indicates optional fields. No contradictions with annotations are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear Args, Returns, and Examples sections. It is compact, front-loads the core purpose, and every section contributes to correct tool usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool, the description sufficiently covers purpose, parameters, return format, and example usage. It doesn't detail error behavior or authentication requirements, but the annotations and schema already cover the safety profile and parameter constraints, so the missing pieces are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already described in the schema. The description adds value by giving example usernames and mapping natural-language questions to the username parameter, which helps an agent infer correct invocation from user requests.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads SAP user details and names the specific attributes it returns (address, logon data, lock status, roles, profiles). It also identifies the underlying BAPI, which differentiates it from the many read/search tools among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete natural-language examples showing when to call it ('What roles does user JSMITH have?', 'Is user VENNELAKA locked?'). It provides clear context for its intended use, though it doesn't explicitly contrast it with alternative sibling tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_where_usedWhere-Used ListARead-onlyIdempotent
Find all repository objects that reference a given object (where-used list). Essential before changing or deleting anything.
Supply either:
object_uri: the full ADT URI (from sap_search_objects), OR
object_type + object_name (and function_group if needed).
Args:
object_uri / object_type + object_name.
max_results (default 100).
response_format.
Returns (json): { objectUri, count, refs: [{uri, type, name, packageName?, description?}], truncated }.
Examples:
"What uses CL_FOO?" -> object_type='class', object_name='CL_FOO'.
"Where is this function group called?" -> object_uri='/sap/bc/adt/functions/groups/zfg1'.
| Name | Required | Description | Default |
|---|---|---|---|
| object_uri | No | ADT URI of the object to query (e.g. '/sap/bc/adt/oo/classes/zcl_foo'). Get this from sap_search_objects results. Takes precedence over object_type+object_name. | |
| max_results | No | Maximum references to return (1-500, default 100). | |
| object_name | No | Object name — used with object_type when object_uri is not given. | |
| object_type | No | Object type — used to derive URI when object_uri is not given. | |
| function_group | No | Required when object_type='function'. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this read-only/idempotent, so the description adds the return shape and truncated flag, which is useful. However, it says 'Returns (json)' while response_format defaults to markdown in the schema, leaving the actual default output ambiguous and creating a mild description-vs-schema inconsistency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with supply options, return shape, and examples. Minor redundancy exists between the 'Supply either' bullets and the 'Args:' line, but overall it is compact and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description covers input modes, max_results, response_format, return shape, and usage context with helpful examples. The only meaningful gap is not clarifying that the default response is markdown rather than the JSON shape shown.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value by explaining the object_uri vs object_type+object_name alternatives, noting function_group is needed for functions, and mapping natural-language examples to parameter values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb+resource: 'Find all repository objects that reference a given object (where-used list).' It distinguishes this from sibling sap_search_objects by framing it as reference lookup and names sap_search_objects as the source for object_uri.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Essential before changing or deleting anything' clearly states when to use it, and 'Supply either object_uri... OR object_type + object_name' explains the primary calling modes. It doesn't explicitly list when not to use it or compare with other reference tools, so it falls just short of full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap_write_sourceWrite ABAP SourceADestructive
Replace the source code of an EXISTING program, include, class, interface, or function module. This MODIFIES the SAP system.
The tool runs the full stateful flow: lock -> write source -> (optionally activate) -> unlock. It captures the current ETag to avoid overwriting concurrent changes.
Args:
object_type ('program'|'include'|'class'|'interface'|'function').
object_name (string): must already exist (this tool does not create objects).
function_group (string): required for functions.
source (string): the complete replacement source.
transport (string): required for non-local objects; get one from sap_list_transports.
activate (boolean, default false): activate after writing.
response_format ('markdown' | 'json').
Returns (json): { objectType, objectName, sourceUri, bytesWritten, transport?, activated, activationMessages: [{type,text}], message }.
Examples:
"Update class CL_FOO and activate" -> object_type='class', object_name='CL_FOO', source='...', transport='DEVK900123', activate=true. Error Handling:
423 -> object locked by someone else. 412 -> ETag changed (re-read first).
Missing transport on a transportable object -> returns an actionable error; the lock is released automatically.
Activation errors are returned in activationMessages (the source is still written but inactive).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | The full new source code to write (replaces existing source). | |
| activate | No | If true, activate the object after writing. If false, it stays inactive. | |
| transport | No | Transport request (e.g. 'DEVK900123'). Required for transportable (non-local) objects. | |
| object_name | Yes | Object name. The object must already exist. | |
| object_type | Yes | Object kind to write. | |
| function_group | No | Required when object_type='function'. | |
| response_format | No | Output format: 'markdown' (human-readable, default) or 'json' (structured). | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the destructiveHint annotation: it reveals the full stateful lock-write-activate-unlock flow, ETag-based concurrency protection, automatic lock release on errors, and that activation errors leave the source written but inactive. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: args, return shape, example, and error handling. It is well-structured with headers and bullets, making the dense information easy for an agent to scan and act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, 7 parameters, no output schema, and destructive behavior, the description is remarkably complete. It covers the write flow, concurrency, transports, activation behavior, error codes, return fields, and a concrete example, leaving little for an agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents every parameter. The description's Args list mostly restates schema information, though it does add practical context like 'required for functions' and 'required for non-local objects.' That is useful but not a major semantic addition beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Replace the source code of an EXISTING program, include, class, interface, or function module.' It also explicitly says the tool does not create objects, which distinguishes it clearly from sap_create_object and other siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool, including the requirement that the object already exist and that a transport is needed for non-local objects, with direction to sap_list_transports. It does not enumerate all alternatives, but the 'does not create objects' note and transport guidance are strong practical cues.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools map cleanly to a specific resource or lifecycle step, and the debug, transport, DDIC, and repository tools are clearly separated. A few pairs overlap in intent—sap_connection_test/sap_rfc_ping, sap_read_table/sap_sql_query, sap_rfc_call/sap_bapi_call—but detailed descriptions and explicit cross-references keep misselection unlikely.
All tools share the sAP_ prefix and most follow an action_noun pattern such as sap_get_source, sap_create_transport, or sap_debug_step. Read operations vary among get/list/read/search/browse, and a few names like sap_where_used, sap_connection_test, and sap_abap_docs break the dominant pattern, preventing a perfect score.
51 tools is an extreme surface for a single MCP server and imposes a heavy tool-selection burden on an agent. The broad ABAP domain supports many capabilities, but the debugger, RFC/BAPI, monitoring, and repository subdomains could reasonably be split into more focused servers.
The core ABAP development lifecycle is thoroughly covered: repository search/read/create/write/activate/delete, transports, syntax/unit/ATC checks, DDIC and table access, a full debugger lifecycle, RFC/BAPI calls, jobs, dumps, and documentation. Notable gaps such as passing selection-screen parameters to reports or directly creating function modules are documented limitations with workarounds rather than dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
One MCP URL for all your connectors — scoped writes, enforced constraints, and a full audit trail.
List, read, edit, and deploy your GenMB AI-generated apps from any MCP client.
Related MCP Servers
- AlicenseCqualityNot gradedmaintenanceAn MCP server that facilitates seamless interaction with SAP ABAP systems to manage development objects, transport requests, and source code. It provides a comprehensive suite of tools for performing syntax checks, object searches, and code modifications via the ADT API.100
- AlicenseNot gradedqualityCmaintenanceA standalone MCP server for SAP ABAP development and customizing that connects directly to your SAP system via ADT REST API, enabling AI assistants to search, read, write, activate, transport, debug, and run quality checks on ABAP code, as well as manage customizing/IMG configurations with governed transport recording.MIT
- AlicenseCqualityCmaintenanceEnables interaction with SAP ABAP systems via ADT APIs, allowing management of ABAP objects, transport requests, and code analysis through MCP clients.100124MIT
- FlicenseNot gradedqualityCmaintenanceConnects to SAP ABAP Development Tools (ADT) via MCP, enabling AI assistants to manage SAP systems through natural language.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/appmaster3000/sap-abap-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server