Skip to main content
Glama

abap_debug

Destructive

Drive ABAP debugging: arm breakpoints, run programs, step through code, inspect the stack, and change variable values on a live SAP system.

Instructions

ABAP debugger driver: arm breakpoints, run a program, step, inspect the stack. One session at a time; frames observe-only. set_value changes a simple variable at a stop (edit/admin mode).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNoaction="breakpoints"/"watch" op="remove" only — the id to remove.
opNoaction="breakpoints"/"watch" only. breakpoints defaults to "list"; watch defaults to "add" when "variable" is set, else "list".
runNoThe program to trigger (action="start").
stepNocontinue may end the session (status="dead" plus captured output). runToLine/jumpToLine need toLine; jumpToLine also needs server ABAP_ALLOW_DEBUG_JUMP_TO_LINE=true and confirm:"jumpToLine".
forceNostop only — force-terminates a debuggee left attached by an unclean exit (the "Debuggee already attached" error's escape hatch).
frameNo1-based stackPosition from the last STACK section. Read-only.
valueNoaction="set_value" only — the new value as text; empty string allowed.
actionYesstart needs breakpoints+run. step needs stateId+step. stack needs stateId. frame needs stateId+frame. breakpoints needs stateId (op add/remove) or nothing (op list, default). watch needs stateId+variable (op add, default when variable given) or stateId+id (op remove) or stateId (op list). set_value needs stateId+variable+value and changes a simple variable at a stop (edit/admin mode only). keepalive/stop/status need nothing.
toLineNoRequired for step="runToLine"/"jumpToLine". 1-based line in the current frame's source.
confirmNoRequired for step="jumpToLine": echo "jumpToLine". Ignored otherwise.
stateIdNoFrom the most recent start/step/stack/frame response (12-char token; the full id or a prefix of at least 8 chars is accepted too); a stale id is refused.
variableNoaction="watch" — variable path to watch, same syntax abap_debug_value accepts. Presence selects op="add". action="set_value" — the variable path to change, same syntax as abap_debug_value's path.
conditionNoaction="watch" op="add" only — ABAP expression; the watchpoint only suspends when it evaluates true.
breakpointsNo≥1 entry, required for action="start" and for action="breakpoints" op="add"; kinds (line/exception/statement/message) may mix and are validated against SAP before arming; condition and skipCount are optional on every kind, skipCount sent to SAP but NOT enforced.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv0.6.36
    • changedInput schema / properties / action / description
      Previous value: -"start needs breakpoints+run. step needs stateId+step. stack needs stateId. frame needs stateId+frame. breakpoints needs stateId (op add/remove) or nothing (op list, default). watch needs stateId+variable (op add, default when variable given) or stateId+id (op remove) or stateId (op list). keepalive/stop/status need nothing."New value: +"start needs breakpoints+run. step needs stateId+step. stack needs stateId. frame needs stateId+frame. breakpoints needs stateId (op add/remove) or nothing (op list, default). watch needs stateId+variable (op add, default when variable given) or stateId+id (op remove) or stateId (op list). set_value needs stateId+variable+value and changes a simple variable at a stop (edit/admin mode only). keepalive/stop/status need nothing."
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "start",
      -  "step",
      -  "stack",
      -  "frame",
      -  "breakpoints",
      -  "watch",
      -  "keepalive",
      -  "stop",
      -  "status"
      -]New value: +[
      +  "start",
      +  "step",
      +  "stack",
      +  "frame",
      +  "breakpoints",
      +  "watch",
      +  "set_value",
      +  "keepalive",
      +  "stop",
      +  "status"
      +]
    • addedInput schema / properties / value
      Added value: +{
      +  "description": "action=\"set_value\" only — the new value as text; empty string allowed.",
      +  "type": "string"
      +}
    • changedInput schema / properties / variable / description
      Previous value: -"action=\"watch\" only — variable path to watch, same syntax abap_debug_value accepts. Presence selects op=\"add\"."New value: +"action=\"watch\" — variable path to watch, same syntax abap_debug_value accepts. Presence selects op=\"add\". action=\"set_value\" — the variable path to change, same syntax as abap_debug_value's path."
  2. Changed2 schema fields changedv0.6.25
    • changedInput schema / properties / breakpoints / description
      Previous value: -"≥1 entry, required for action=\"start\" and for action=\"breakpoints\" op=\"add\"; kinds (line/exception/statement/message) may mix and are validated against SAP before arming. All kinds take optional condition (ABAP expression, suspend only when true) and skipCount (sent to SAP, NOT enforced — use step:\"continue\")."New value: +"≥1 entry, required for action=\"start\" and for action=\"breakpoints\" op=\"add\"; kinds (line/exception/statement/message) may mix and are validated against SAP before arming; condition and skipCount are optional on every kind, skipCount sent to SAP but NOT enforced."
    • changedInput schema / properties / stateId / description
      Previous value: -"From the most recent start/step/stack/frame response; a stale id is refused."New value: +"From the most recent start/step/stack/frame response (12-char token; the full id or a prefix of at least 8 chars is accepted too); a stale id is refused."
  3. Changed8 schema fields changedv0.6.2
    • changedInput schema / properties / action / description
      Previous value: -"start needs breakpoints+run. step needs stateId+step. stack needs stateId. frame needs stateId+frame. keepalive/stop/status need nothing."New value: +"start needs breakpoints+run. step needs stateId+step. stack needs stateId. frame needs stateId+frame. breakpoints needs stateId (op add/remove) or nothing (op list, default). watch needs stateId+variable (op add, default when variable given) or stateId+id (op remove) or stateId (op list). keepalive/stop/status need nothing."
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "start",
      -  "step",
      -  "stack",
      -  "frame",
      -  "keepalive",
      -  "stop",
      -  "status"
      -]New value: +[
      +  "start",
      +  "step",
      +  "stack",
      +  "frame",
      +  "breakpoints",
      +  "watch",
      +  "keepalive",
      +  "stop",
      +  "status"
      +]
    • changedInput schema / properties / breakpoints / description
      Previous value: -"≥1 entry, required for action=\"start\"; kinds may mix and are validated against SAP before arming. Both kinds take optional condition (ABAP expression, suspend only when true) and skipCount (sent to SAP, NOT enforced — use step:\"continue\")."New value: +"≥1 entry, required for action=\"start\" and for action=\"breakpoints\" op=\"add\"; kinds (line/exception/statement/message) may mix and are validated against SAP before arming. All kinds take optional condition (ABAP expression, suspend only when true) and skipCount (sent to SAP, NOT enforced — use step:\"continue\")."
    • changedInput schema / properties / breakpoints / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "condition": {
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "line",
      -        "type": "string"
      -      },
      -      "line": {
      -        "description": "1-based; SAP may snap it to the nearest executable statement (the start response reports the correction).",
      -        "maximum": 999999,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "object": {
      -        "description": "Class or report to break in — any form abap_read/abap_run accept.",
      -        "type": "string"
      -      },
      -      "skipCount": {
      -        "maximum": 1000000,
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "object",
      -      "line"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "condition": {
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "exceptionClass": {
      -        "description": "Exception class to break on, e.g. CX_SY_ZERODIVIDE.",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "exception",
      -        "type": "string"
      -      },
      -      "skipCount": {
      -        "maximum": 1000000,
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "exceptionClass"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "condition": {
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "line",
      +        "type": "string"
      +      },
      +      "line": {
      +        "description": "1-based; SAP may snap it to the nearest executable statement (the start response reports the correction).",
      +        "maximum": 999999,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "object": {
      +        "description": "Class or report to break in — any form abap_read/abap_run accept.",
      +        "type": "string"
      +      },
      +      "skipCount": {
      +        "maximum": 1000000,
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "object",
      +      "line"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "condition": {
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "exceptionClass": {
      +        "description": "Exception class to break on, e.g. CX_SY_ZERODIVIDE.",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "exception",
      +        "type": "string"
      +      },
      +      "skipCount": {
      +        "maximum": 1000000,
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "exceptionClass"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "condition": {
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "statement",
      +        "type": "string"
      +      },
      +      "skipCount": {
      +        "maximum": 1000000,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "statement": {
      +        "description": "ABAP statement keyword to break on, e.g. RAISE. SAP validates it.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "statement"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "condition": {
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "message",
      +        "type": "string"
      +      },
      +      "msgId": {
      +        "description": "Message class, e.g. 00.",
      +        "type": "string"
      +      },
      +      "msgNo": {
      +        "description": "Message number, e.g. 001.",
      +        "type": "string"
      +      },
      +      "msgTy": {
      +        "description": "Message type letter, e.g. E.",
      +        "type": "string"
      +      },
      +      "skipCount": {
      +        "maximum": 1000000,
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "msgId",
      +      "msgNo",
      +      "msgTy"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / condition
      Added value: +{
      +  "description": "action=\"watch\" op=\"add\" only — ABAP expression; the watchpoint only suspends when it evaluates true.",
      +  "maxLength": 255,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / id
      Added value: +{
      +  "description": "action=\"breakpoints\"/\"watch\" op=\"remove\" only — the id to remove.",
      +  "type": "string"
      +}
    • addedInput schema / properties / op
      Added value: +{
      +  "description": "action=\"breakpoints\"/\"watch\" only. breakpoints defaults to \"list\"; watch defaults to \"add\" when \"variable\" is set, else \"list\".",
      +  "enum": [
      +    "list",
      +    "add",
      +    "remove"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / variable
      Added value: +{
      +  "description": "action=\"watch\" only — variable path to watch, same syntax abap_debug_value accepts. Presence selects op=\"add\".",
      +  "type": "string"
      +}
  4. Changed2 schema fields changedv0.3.2
    • changedInput schema / properties / breakpoints / description
      Previous value: -"≥1 entry, required only for action=\"start\". Line/exception kinds may mix; validated against SAP before arming."New value: +"≥1 entry, required for action=\"start\"; kinds may mix and are validated against SAP before arming. Both kinds take optional condition (ABAP expression, suspend only when true) and skipCount (sent to SAP, NOT enforced — use step:\"continue\")."
    • changedInput schema / properties / breakpoints / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "condition": {
      -        "description": "ABAP condition expression — breakpoint suspends only when true, e.g. \"sy-tabix = 500\".",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "line",
      -        "type": "string"
      -      },
      -      "line": {
      -        "description": "1-based source line to break at. SAP may snap this to the nearest executable statement — if it does, the start response reports the corrected line.",
      -        "maximum": 999999,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "object": {
      -        "description": "The class or report to break in (any form abap_read/abap_run accept: bare name, \"class ZCL_FOO\", a raw ADT URI, ...). Resolved server-side to a source URI.",
      -        "type": "string"
      -      },
      -      "skipCount": {
      -        "description": "Hits to ignore before suspending (0 = every hit). NOT ENFORCED by this backend — every hit still suspends; use step:\"continue\" instead.",
      -        "maximum": 1000000,
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "object",
      -      "line"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "condition": {
      -        "description": "ABAP condition expression — breakpoint suspends only when true, e.g. \"sy-tabix = 500\".",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "exceptionClass": {
      -        "description": "ABAP exception class to break on when it is raised anywhere, e.g. CX_SY_ZERODIVIDE.",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "exception",
      -        "type": "string"
      -      },
      -      "skipCount": {
      -        "description": "Hits to ignore before suspending (0 = every hit). NOT ENFORCED by this backend — every hit still suspends; use step:\"continue\" instead.",
      -        "maximum": 1000000,
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "exceptionClass"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "condition": {
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "line",
      +        "type": "string"
      +      },
      +      "line": {
      +        "description": "1-based; SAP may snap it to the nearest executable statement (the start response reports the correction).",
      +        "maximum": 999999,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "object": {
      +        "description": "Class or report to break in — any form abap_read/abap_run accept.",
      +        "type": "string"
      +      },
      +      "skipCount": {
      +        "maximum": 1000000,
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "object",
      +      "line"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "condition": {
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "exceptionClass": {
      +        "description": "Exception class to break on, e.g. CX_SY_ZERODIVIDE.",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "exception",
      +        "type": "string"
      +      },
      +      "skipCount": {
      +        "maximum": 1000000,
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "exceptionClass"
      +    ],
      +    "type": "object"
      +  }
      +]
  5. First observedv0.3.0

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already signal readOnlyHint=false, openWorldHint=true, and destructiveHint=true. The description adds valuable behavioral context beyond that: session singleton semantics ('one session at a time'), immutable frames, and the edit/admin-mode requirement for set_value. It does not contradict the annotations.

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

Conciseness5/5

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

The description is compact and front-loaded: the first sentence states the core purpose, and the next two sentences add the most important cross-cutting constraints. There is no filler or repetition beyond the schema's own detail.

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

Completeness4/5

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

For a 14-parameter tool with nested objects and no output schema, the description conveys the essential operational model: session control, read-only frames, and limited set_value capability. The rich input schema covers parameter-level semantics, though response/status lifecycle details are left implicit.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents each parameter's role and constraints. The tool description mostly restates set_value's semantics already present in the schema and adds no new parameter-level 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.

Purpose5/5

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

The description opens with a specific role — 'ABAP debugger driver' — and lists concrete operations: arm breakpoints, run a program, step, inspect the stack. This clearly identifies the tool as the debug-session controller and distinguishes it from siblings like abap_run, abap_read, abap_debug_value, and abap_debug_vars.

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

Usage Guidelines4/5

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

The description provides clear usage context: one debug session at a time, frames are observe-only, and set_value only works on a simple variable at a stop in edit/admin mode. It does not explicitly name alternatives or exclusion conditions, but the constraints give an agent enough situational guidance.

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