Skip to main content
Glama

abap-mcp

Install in VS Code Install in VS Code Insiders npm

Make your AI coding agent an expert SAP ABAP & RAP consultant — local by default. No SAP system, no credentials, one command to install.

abap-mcp is a Model Context Protocol server that gives any AI coding agent — Claude Code, GitHub Copilot, Cursor, Codex, Windsurf — real ABAP senses, built on abaplint (the open-source ABAP parser/linter). The agent brings the reasoning; abap-mcp brings ground truth: a deterministic parser, objective scores, and validated generators that keep the AI honest. It works on ABAP source wherever your agent works — a git checkout, an abapGit export, a code review, CI — long before anything reaches a system.

  • New to ABAP or RAP? Your agent becomes the senior consultant looking over your shoulder: every snippet linted against Clean ABAP as you write (lint_abap), every finding explained with its rationale and examples (explain_abap_rule), and scaffold_rap_bo starts you from a canonical, self-validated RAP business object instead of a blank editor.

  • Senior ABAP consultant? It's your assessment and task engine: point your agent at a repo and get a scored, categorized ABAP Cloud readiness report with an A–D tech-debt grade (check_cloud_readiness), a phased migration backlog with efforts and exit criteria (plan_cloud_migration), an objective before/after verdict on every rework (compare_abap), released-API replacements (check_released_api), and CI gates that hold the line while the migration proceeds.

The default stdio edition is 100% local: the analysis engine makes zero network calls and reads no user files. Sources go in as text and structured findings come back. The released-API list and abaplint rule data are package-bundled. An optional guarded Streamable HTTP edition makes the same tools available to remote clients such as ChatGPT web; in that mode, source text is sent to the machine you host. See privacy and data handling.

Why this exists

Every other ABAP MCP server is either a bridge to a live SAP system (ADT/RFC — needs credentials, a system, and trust) or a documentation search. But AI coding agents spend most of their time where the files are — editing abapGit repos, reviewing diffs, generating code — long before anything reaches a system. This server gives agents the missing feedback loop at that layer:

  • "Does this ABAP parse? Is it clean? How does it perform?"lint_abap (+ focus packs)

  • "Fix this block automatically — casing, obsolete syntax."fix_abap (deterministic, parser-guaranteed)

  • "How far is this classic report from ABAP Cloud? Grade it."check_cloud_readiness (A–D)

  • "Plan the migration — what do we tackle first?"plan_cloud_migration (phased backlog)

  • "This class has no tests — start me a harness."scaffold_abap_unit (failing-by-default)

  • "What depends on what? Migrate which object first?"get_object_dependencies (+ Mermaid)

  • "Did this rework make the code better or worse?"compare_abap

  • "Is MARA a released API? What do I use instead?"check_released_api

  • "Start me a correct RAP business object."scaffold_rap_bo

  • "What's in this 4,000-line class? Draw it."get_abap_outline (+ Mermaid)

Related MCP server: dassian-adt

Install — 60 seconds

The only requirement is Node.js 20+. No SAP system, no credentials, no API keys. New to AI tooling (or ABAP)? Follow the from-zero walkthrough in docs/INSTALL.md — or let the installer do it:

npx abap-mcp setup     # detects VS Code / Claude Code and registers the server; guides Eclipse

Otherwise, pick your client:

Codex CLI · Codex IDE extension · ChatGPT desktop — one command configures all three on the same Codex host:

codex mcp add abap-mcp -- npx -y abap-mcp

Restart ChatGPT desktop or the IDE extension, then use /mcp to confirm abap-mcp is connected. In ChatGPT desktop you can alternatively open Settings → MCP servers → Add server, choose STDIO, and enter command npx with arguments -y abap-mcp.

Codex plugin (MCP server + review/mentor/migration skills)

codex plugin marketplace add palimkarakshay/abap-mcp
codex plugin add abap-mcp@abap-mcp

ChatGPT web cannot start a local npx process. It needs a deployed HTTPS /mcp endpoint or a secure development tunnel. This repository ships the HTTP entry point and hardening controls, but does not operate a public service. Follow the OpenAI setup and self-hosting guide.

Claude Code

claude mcp add abap-mcp -- npx -y abap-mcp

VS Code (Copilot agent mode) — one click on the Install in VS Code badge above, or one command:

code --add-mcp '{"name":"abap-mcp","command":"npx","args":["-y","abap-mcp"]}'

For a whole team, commit examples/vscode/mcp.json as .vscode/mcp.json in your abapGit repo — everyone who opens the folder gets the server offered automatically.

Eclipse (via the GitHub Copilot plugin) — Copilot Chat in Eclipse speaks MCP: open the Copilot menu → Edit preferencesMCP, and add the same "abap-mcp" server block (command npx, args ["-y", "abap-mcp"]). Steps and prerequisites: GitHub's MCP docs, Eclipse tab. Stock ADT without Copilot has no MCP client today.

Cursor · Windsurf · any MCP client — add this to its mcp.json / .mcp.json (project or global):

{
  "mcpServers": {
    "abap-mcp": { "command": "npx", "args": ["-y", "abap-mcp"] }
  }
}

Claude Desktop — Settings → Developer → Edit Config, add the same mcpServers block to claude_desktop_config.json, restart.

From a clone (contributing / hacking):

npm install && npm run build
claude mcp add abap-mcp -- node /path/to/abap-mcp/dist/cli.js

Connected? Ask your agent "list your ABAP tools" — you should see all thirteen, lint_abap through get_abap_outline.

First things to ask

  • "Here's my functional spec — build the RAP implementation from it." (or run /mcp__abap-mcp__abap-from-spec)

  • "Lint this class against ABAP Cloud and explain the worst finding like I'm new to ABAP."

  • "How cloud-ready is this repo? Grade it and plan the migration in phases."

  • "Is MARA a released API? What do I use instead?"

  • "Scaffold a RAP BO for entity Booking on table zbooking, draft enabled."

  • "I reworked zcl_pricing — compare old vs new: did it actually get better?"

Guided workflows built in (MCP prompts)

The consultant's playbook ships both as four MCP prompts and as four Codex plugin skills. In Claude Code the prompts appear as slash commands (/mcp__abap-mcp__…); prompt-capable clients list them natively, while the Codex plugin discovers the corresponding skills:

Prompt

What it sets up

abap-from-spec

The blank-page killer. Hand it a functional/tech spec — or a plain-language requirement — and the agent builds working, validated modern ABAP/RAP: spec → build plan with an ASSUMPTION register → deterministic scaffold_rap_bo foundation → behavior logic → every file gated through fix_abap + lint_abap until clean → filled unit tests → delivery in activation order. Nothing unlinted is ever delivered.

abap-review

A full senior-consultant code review: lint → triage → explain each finding's why → minimal fixes → prove the rework with compare_abap. Optional focus (Performance / Security / Styleguide).

abap-mentor

Over-the-shoulder mentoring mode for the rest of the session: every snippet is quietly linted and readiness-checked, findings become plain-language guidance, new objects start from validated scaffolds.

abap-migration-plan

A client-ready phased migration plan driven by plan_cloud_migration — current state, phases with S/M/L efforts and exit criteria, released-API work separated — then offers to execute phase 1.

CLI — same engine, no AI required

Every tool is also a subcommand, so it works in terminals and CI where no MCP client exists:

npx abap-mcp lint src/                          # lint files or whole directories
npx abap-mcp fix src/ --write                   # apply abaplint's deterministic auto-fixes in place
npx abap-mcp lint src/ --focus Performance      # themed pass: Performance | Security | Styleguide
npx abap-mcp lint src/ --rules-file org.json    # your org's abaplint rule pack, same engine
npx abap-mcp readiness src/ --fail-below 80     # repo-level ABAP Cloud readiness, scored + graded A–D
npx abap-mcp plan src/                          # phased migration backlog: work items, S/M/L efforts, exit criteria
npx abap-mcp unittest src/ --out tests/         # failing-by-default ABAP Unit skeletons for untested classes
npx abap-mcp deps src/ --mermaid                # dependency graph (+released-API flags) as a Mermaid diagram
npx abap-mcp compare old/ new/                  # rework verdict: findings resolved/introduced, grade movement
npx abap-mcp scaffold --entity Travel --table ztravel --key travel_id --out ./out
npx abap-mcp outline src/zcl_monster.clas.abap  # navigate big objects (--mermaid for a diagram)
npx abap-mcp released MARA I_Product            # released-API status + CDS successor
npx abap-mcp explain exit_or_check              # rule rationale

Directories are walked recursively (abapGit naming), batched automatically, and readiness merges batches into one scored, categorized repo report. Exit codes are CI-friendly (1 on error findings / failed threshold).

Agentic workflows, recipes & CI

docs/examples/abap2xlsx-assessment.md — what all of this produces on a real, well-known open-source repo (100 files, three commands, no system). docs/COOKBOOK.md — practical recipes: the fix-until-clean loop, PR review without a transport, whole-repo migration triage, CI gates, per-persona use cases. examples/claude-code/ — drop-in agentic workflows that turn the tools into that over-the-shoulder consultant: an abap-code-reviewer subagent, an abap-cloud-migrator sweep loop (readiness score as the loop condition), an abap-tech-debt-assessor (the graded A–D client deliverable), per-repo .mcp.json, and a GitHub Actions quality gate for abapGit repos.

Tools

Tool

What it does

lint_abap

abaplint static analysis over ABAP/CDS/BDEF sources → structured findings with rule docs links. Presets: style (default, snippet-friendly), full, syntax-only; per-rule overrides for org rule packs; focus lens (Performance / Security / Styleguide) for themed reviews.

check_cloud_readiness

Dual-parse diff (classic baseline vs Cloud): statements that are valid today but illegal in ABAP Cloud become categorized blockers (dynpro, list output, native SQL, …) with a transparent score and a density-banded A–D tech-debt grade; code broken at the baseline is reported separately, not counted as migration work. Also surfaces a separate, dated released-API cross-check (releasedApiFindings): direct access to non-released classic tables and deprecated-API usage found in the source, with CDS successor hints — informational, not folded into the score.

fix_abap

abaplint's own machine-applicable corrections, applied and verified: keyword casing, obsolete statements with defined modern replacements (MOVE=, …). Batches re-parse after every pass and a batch that would break the parse is discarded — output is parser-guaranteed, never guessed. Unfixable findings return as remaining for judgment-tier rework (prove it with compare_abap).

plan_cloud_migration

The task-manager layer over readiness: arranges every blocker into a phased, consulting-ordered backlog — repair-the-baseline first, then mechanical quick wins, core rework, UI re-architecture, and a separate snapshot-dated released-API phase. Each work item carries an S/M/L effort band, a remediation recipe and sample locations; each phase carries objective, re-checkable exit criteria. Deterministic: same readiness numbers, rearranged — no new judgments.

compare_abap

Before/after verdict on a rework: lint findings resolved vs introduced (matched by content, so moved code isn't noise), blocker/score/grade movement, and classes/methods/FORMs added or removed. The objective referee for refactors and AI rewrites.

check_released_api

Looks up objects (tables, CDS views, function modules, classes, …) in SAP's bundled Cloudification snapshot → released / deprecated / not-released per object, plus a curated CDS successor for common classic tables. The released-API half of readiness, offline.

scaffold_rap_bo

Generates the canonical RAP managed-BO stack (root view, behavior definition strict(2) + optional draft, behavior class + handler locals, projection, metadata extension, OData V4 service definition) plus suggested table DDL, activation order and next steps.

scaffold_abap_unit

Generates the local ABAP Unit test class for each global class: setup + one skeleton test per public method, every skeleton failing loudly with a TODO so generated-but-empty tests can't masquerade as coverage. Round-tripped through abaplint with the class under test.

get_object_dependencies

Dependency graph over the provided sources — parser-level table/function references (annotated with released-API state + CDS successors), inherits/implements structure, and honestly-labeled textual cross-references. Optional Mermaid flowchart. The sequencing companion to plan_cloud_migration.

list_abap_rules

Browse abaplint's ~180 rules (filter by text or tag).

explain_abap_rule

One rule in depth — rationale (often Clean ABAP), examples, docs URL.

format_abap

Offline pretty-printer (keyword case + indentation).

get_abap_outline

Classes/methods/visibility/interfaces/FORMs of a source — navigate big objects without reading them whole. Optional Mermaid classDiagram output for instant structure visuals.

Honesty box — what this is not

  • Not ATC. The objective readiness score is still language-level: statements ABAP Cloud removed. Released-API coverage is now partial and offline: check_released_api and the releasedApiFindings in readiness reflect SAP's published Cloudification list as of the bundled snapshot date — they cover tables and function modules referenced in your source, not every API, and are only as current as the snapshot. A target system's own released-API list (ATC check API_RELEASE_STATE_CHECK / SAP_CP_READINESS) remains authoritative; treat an "absent from the list" result as "not released as of the snapshot", not as proof.

  • Scaffold validation is tiered. Generated classes and CDS views are round-tripped through abaplint at Cloud level before they're returned (the generator and the linter share one parser). Behavior/service definitions are outside abaplint's checked surface — they are golden-tested canonical templates, and ADT activation is the final arbiter. Each generated file is labeled validated: "abaplint" | "template".

  • Text-in only, by design. The analysis engine does no user-filesystem walking or outbound network access; it parses strings you explicitly pass. With stdio those strings are handled by the local child process. With Streamable HTTP they travel to the endpoint operator, so use HTTPS, authentication, and the documented privacy controls. For whole directories, use the CLI below, abaplint in CI, or the mcp-kit wrap-abaplint recipe.

Develop

npm install
npm run check     # typecheck + tests + build + routing eval — the CI gate
node dist/cli.js  # stdio MCP server
npm run start:http # guarded Streamable HTTP on http://127.0.0.1:3000/mcp
npx @modelcontextprotocol/inspector --cli node dist/cli.js --method tools/list

Tool and prompt descriptions are CI-graded (a rubric test enforces verb-first names, when-to-use, non-goals, described params, worked examples — the mcp-kit discipline).

Design

The decision log — why offline, why abaplint, why a dual-parse readiness diff, why the scaffolder validates its own output, what was deliberately left out — lives in docs/DESIGN.md.

  • abap-kit by Furkan Coşgun (MIT) — a CLI that scaffolds complete offline ABAP projects (abapGit layout, abaplint + transpiler config, the open-abap runtime) and can execute ABAP Unit tests locally via the abaplint transpiler. Complementary by design: abap-kit builds and runs the project harness; abap-mcp gives your AI agent the analysis, planning and scaffolding tools inside it — abap-kit create + abap-mcp setup is a complete offline ABAP+AI workspace. Its transpile-and-run pipeline is also the natural foundation for a future run_abap_unit tool here.

Credits

  • abaplint by Lars Hvam — the parser and rule engine underneath every tool here (MIT).

  • SAP/abap-atc-cr-cv-s4hc — SAP's official ABAP Cloudification Repository (object release list), Apache-2.0. The bundled released-API snapshot (src/data/released-apis.json, refreshed with each weekly release — tool output carries its snapshotDate) is a compact transform of that data, redistributed under Apache-2.0 with attribution; see docs/DESIGN.md and scripts/build-released-api-index.mjs for the pipeline.

  • mcp-kit — the production-MCP patterns this server follows (typed tool specs, transport discipline, description lint).

MIT © Akshay Palimkar. Not affiliated with or endorsed by SAP SE. "SAP", "ABAP" and "RAP" are trademarks of SAP SE; this is an independent open-source tool for developers working with them.

Available Tools

13 tools
check_cloud_readinessCheck ABAP Cloud readinessA
Read-onlyIdempotent

Assess how far ABAP source is from ABAP Cloud (Clean Core tier 1) by parsing it twice — once at a classic baseline (default v758) and once at version Cloud — and diffing: findings that appear only at Cloud are genuine cloud blockers (statements ABAP Cloud removed), reported in categories (dynpro, list output, native SQL, report events, …) with a transparent score, an A–D tech-debt grade and a verdict; findings already present at the baseline are reported separately as broken code, not migration work. It also reports snapshot-dated released-API observations for direct table and function-module references the parser can extract; those stay separate from the language-level blocker count and score. Use this when someone asks 'is this code cloud-ready / Clean Core compliant / S/4HANA-cloud safe', before porting classic ABAP into an ABAP Cloud environment, or for a graded tech-debt assessment of an abapGit export. It is static and parser-level: its released-API scan is not exhaustive dependency discovery, it does not connect to any SAP system or run ATC, and a 'ready' verdict means no detected language-level blockers — not a certification. A target system's ATC remains authoritative. Example: check_cloud_readiness({ "files": [ { "source": "REPORT zold.\nWRITE: / 'hi'." } ] }).

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesSource files to analyze, up to 32 per call, 100k chars each.
baselineVersionNoClassic ABAP version the code is assumed to run on today; used to separate broken-anyway code from cloud blockers.v758

Output Schema

ParametersJSON Schema
NameRequiredDescription
gradeYesClean Core tech-debt grade banded on blocker density: A = no blockers, B = ≤ 0.5 blockers/file, C = ≤ 2 blockers/file, D = more. The same objective count as the score, sized for assessment reports.
scoreYes100 − 5×blockers, floored at 0. Transparent, not an oracle.
verdictYesBanded verdict from the blocker count (0 / ≤5 / ≤20 / >20).
fileCountYesFiles analyzed — the denominator of the grade's density banding.
scopeNoteYesExactly what this check does and does not cover.
categoriesYes
baselineVersionYesThe baseline used.
brokenAtBaselineYesFindings that fail even at the baseline version — fix first, they are not migration items.
cloudBlockerCountYesStatements valid at the baseline but not in ABAP Cloud.
releasedApiFindingsYesReleased-API observations from the bundled SAP Cloudification snapshot (deprecated-API usage, direct non-released table access with successor hints). Informational — NOT counted in cloudBlockerCount or score.
releasedApiSnapshotDateYesDate of the bundled released-API snapshot the releasedApiFindings reflect.

TDQS

A4.4/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint and idempotentHint annotations by detailing the analysis behavior: two parsing passes, diffing, separate reporting of pre-existing broken code, snapshot-dated released-API observations, and explicit limitations (static, parser-level, not exhaustive, no ATC, verdict not certification). This gives the agent an accurate mental model of what the tool does and does not do.

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

Conciseness4/5

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

The description is a long single paragraph, but nearly every clause carries a distinct piece of information: purpose, method, output categories, use cases, limitations, and an example. It is dense rather than padded, though a shorter front-loaded summary could make it slightly easier to scan.

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

Completeness5/5

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

Given the tool's moderate complexity, an output schema, and 100% parameter schema coverage, the description supplies the crucial non-schema context: what the verdict means, what is excluded, the example invocation, and the separating of baseline vs cloud findings. An agent has everything needed to invoke it correctly and interpret results.

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

Parameters3/5

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

Schema coverage is 100%, so the input schema already defines files, source, filename, baselineVersion, its enum, default, and limits. The description adds useful context on how baselineVersion participates in the two-pass diff and gives an example call, but that is supplementary; the schema carries the parameter semantics.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Assess how far ABAP source is from ABAP Cloud', and immediately explains the two-pass parsing and diffing method. It distinguishes itself from siblings by describing its static parser-level nature and explicitly separating cloud blockers from broken code, so an agent can tell it apart from check_released_api or lint_abap.

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

Usage Guidelines4/5

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

It provides explicit use triggers: 'when someone asks is this code cloud-ready / Clean Core compliant / S/4HANA-cloud safe, before porting classic ABAP into an ABAP Cloud environment, or for a graded tech-debt assessment of an abapGit export.' It also warns when not to trust it: not exhaustive dependency discovery, no SAP connection, no ATC, verdict is not certification. However, it never names sibling alternatives for those other cases, so the guidance stops short of fully explicit routing.

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

check_released_apiCheck ABAP released-API statusA
Read-onlyIdempotent

Look up ABAP repository objects (DB tables, CDS view entities, function modules, classes, interfaces, …) in SAP's published ABAP Cloudification list and report, per object, whether it is a 'released' API (safe to use in ABAP Cloud / Clean Core), 'deprecated' (released but being retired), or 'not-released' (a classic/internal object that is not a public API — e.g. most classic DDIC tables) — with a curated CDS successor hint for common tables. This reflects SAP's official Cloudification list as bundled in this package (snapshot 2026-08-24); it ships offline with the server. Use this when you need to know if your code may reference a given object in ABAP Cloud, or which released CDS view to use instead of a classic table. This explicit lookup complements check_cloud_readiness's limited, source-extracted released-API observations and can check objects that do not appear in the supplied source. It does not connect to any SAP system, does not run ATC, and is only as current as the bundled snapshot — a system's own released-API list (ATC check API_RELEASE_STATE_CHECK / SAP_CP_READINESS) remains authoritative; treat an 'absent from the list' result as 'not-released as of the snapshot', not as proof. Example: check_released_api({ "objects": ["MARA", "I_Product", "BAPI_MATERIAL_GET_DETAIL"] }).

ParametersJSON Schema
NameRequiredDescriptionDefault
objectsYesObjects to check, 1–200 per call. Each is a bare name string or a { name, type? } object, e.g. ["MARA", { "name": "I_Product", "type": "CDS_STOB" }].

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceYesURL of the SAP Apache-2.0 source the snapshot was built from.
resultsYes
snapshotDateYesDate of the bundled SAP Cloudification snapshot these results reflect.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already indicate read-only and idempotent behavior, and the description adds meaningful context beyond that: the tool ships offline, uses a specific snapshot date (2026-08-24), does not connect to any SAP backend, and does not modify any system or source file. This gives the agent an accurate safety and freshness profile.

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

Conciseness5/5

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

The description is dense but well organized: it front-loads the object types and result categories, then provides the offline/snapshot constraint, the use case, and the sibling distinction. Every sentence conveys a distinct, necessary fact with no filler.

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

Completeness5/5

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

For a lookup tool with one input and a known set of output statuses, the description is complete: it covers accepted object types, result categories, CDS successor hints, data source/snapshot, offline behavior, non-mutating behavior, and the relationship to check_cloud_readiness. The output schema handles detailed return structure, so the description does not need to duplicate it.

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?

The single parameter 'objects' is already fully described in the input schema, including the 1–200 limit, bare string vs object forms, examples, and optional disambiguation types. The description adds no additional parameter-level syntax or format details, so the schema carries the heavy lifting.

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

Purpose5/5

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

The description states a specific verb and resource: "Look up ABAP repository objects ... in SAP's published ABAP Cloudification list" and reports per-object status ('released', 'deprecated', 'not-released') plus a CDS successor hint. It also differentiates itself from the sibling check_cloud_readiness, 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.

Usage Guidelines4/5

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

It gives a clear when-to-use: "when you need to know if your code may reference a given object in ABAP Cloud, or which released CDS view to use instead of a classic table." It also names the relevant alternative, check_cloud_readiness, and explains how this tool complements it, though it does not explicitly state when not to use the tool.

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

compare_abapCompare two ABAP versionsA
Read-onlyIdempotent

Compare a BEFORE and an AFTER version of ABAP source and report what a rework actually changed: lint findings resolved and introduced (matched by content, so moved-but-unchanged code is not noise), cloud-blocker / score / A–D grade movement from the same dual-parse diff as check_cloud_readiness, and structural changes — classes, methods and FORMs added or removed. Use this when reviewing a refactor, a modernization step or an AI-generated rewrite of an existing object and you need an objective better-or-worse verdict instead of eyeballing a diff. It is not a textual diff tool (use git diff to see the edits) and it cannot judge functional equivalence — behavior can change while every number improves; it does not connect to any SAP system. Example: compare_abap({ "before": [ { "source": "REPORT zr.\nWRITE 1." } ], "after": [ { "source": "REPORT zr.\nWRITE 2." } ] }).

ParametersJSON Schema
NameRequiredDescriptionDefault
afterYesThe AFTER sources — the reworked version being judged. Up to 32 files, 100k chars each.
focusNoCurated rule-pack lens: report only rules carrying this abaplint tag — "Performance" for a tuning pass, "Security" for a security sweep, "Styleguide" for Clean ABAP adherence. Parser errors always surface. Ignored with preset "syntax-only". Combine with rules to re-tune individual rules in the pack.
rulesNoabaplint rule overrides applied to both sides, e.g. { "line_length": { "length": 120 } }.
beforeYesThe BEFORE sources — the current/old version of the object(s). Up to 32 files, 100k chars each.
presetNoLint preset applied identically to both sides: "style" (default) for isolated snippets, "full" when every referenced object is provided, "syntax-only" for parser errors only.style
abapVersionNoABAP language version both sides are linted against. "v758" (default) is current on-prem; "Cloud" is ABAP Cloud.v758

Output Schema

ParametersJSON Schema
NameRequiredDescription
afterYesLint and readiness numbers for the AFTER side.
beforeYesLint and readiness numbers for the BEFORE side.
resolvedYesFindings present before but gone after — improvements.
matchNoteYesHow findings were matched and what the numbers do and do not mean.
introducedYesFindings present only after — regressions to fix.
outlineChangesYes
unchangedCountYesFindings present on both sides (content-matched).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds context: it uses dual-parse diff, does not connect to SAP, and reports specific metrics. No contradictions; the description reinforces the safe, stateless behavior.

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?

Approximately 150 words, front-loaded with purpose, then details, exclusions, and an example. Every sentence adds value; no redundancy or fluff.

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

Completeness5/5

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

Given the complexity (6 params, nested objects) and existence of output schema, the description sufficiently covers inputs, output expectations, limitations, and usage context. It mentions error handling (parser errors always surface).

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value beyond schema by explaining how the tool works (dual-parse diff, content-matching to avoid noise) and what the output includes, though it does not elaborate on individual parameter syntax beyond schema.

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

Purpose5/5

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

The description clearly states it compares BEFORE and AFTER ABAP source, reporting lint findings, cloud-blocker/score/A-D grade movement, and structural changes. It distinguishes from siblings like check_cloud_readiness and git diff, with a specific verb and resource.

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

Usage Guidelines5/5

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

Explicitly says when to use ('reviewing a refactor, modernization step, AI-generated rewrite') and what not to use it for ('not a textual diff tool', 'cannot judge functional equivalence'). Provides an example call, giving clear guidance.

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

explain_abap_ruleExplain an abaplint ruleA
Read-onlyIdempotent

Explain one abaplint rule in depth: title, description, extended rationale (often citing the Clean ABAP style guide), tags, documentation URL, and good/bad code examples where the rule defines them. Use this when a lint_abap or check_cloud_readiness finding needs justification — to explain to a developer why the finding matters and how to fix it. It does not run analysis and only knows abaplint rules; SAP ATC check documentation is out of scope. Example: explain_abap_rule({ "rule": "exit_or_check" }).

ParametersJSON Schema
NameRequiredDescriptionDefault
ruleYesThe abaplint rule key from a finding, e.g. "exit_or_check" or "obsolete_statement".

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyYesRule key.
tagsYesabaplint tags.
titleYesRule title.
docsUrlYesDocumentation URL.
badExampleNoCode the rule flags, if the rule ships an example.
goodExampleNoThe compliant version, if the rule ships one.
shortDescriptionYesOne-line description.
extendedInformationYesExtended rationale; may cite Clean ABAP.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds that the tool does not perform analysis and is limited to abaplint rules, providing clear behavioral context beyond 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?

Concise and well-structured: purpose first, then usage context, then limitations, then example. Every sentence adds value with no redundancy.

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

Completeness5/5

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

Given the simple single-parameter schema, annotations, and presence of output schema, the description is fully complete. It covers all necessary information for an AI agent to decide when and how to invoke the tool.

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

Parameters4/5

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

Schema coverage is 100% with a clear description of the 'rule' parameter. The description adds an example usage (explain_abap_rule({ "rule": "exit_or_check" })), which adds practical value beyond schema.

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

Purpose5/5

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

The description clearly states it explains an abaplint rule in depth, listing specific elements (title, description, rationale, examples). It distinguishes itself from sibling tools like lint_abap and check_cloud_readiness by focusing on justification, not analysis.

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

Usage Guidelines5/5

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

Explicitly states when to use: 'when a lint_abap or check_cloud_readiness finding needs justification'. Also specifies what is out of scope: 'does not run analysis and only knows abaplint rules; SAP ATC check documentation is out of scope'.

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

fix_abapFix ABAP automatically (deterministic)A
Read-onlyIdempotent

Apply abaplint's own machine-applicable corrections to ABAP sources and return the corrected code: keyword casing, obsolete statements with defined modern replacements (MOVE → =, and every other rule that ships a concrete edit), applied in verified batches — after each batch the result is re-parsed, and a batch that would break the parse is discarded, so the output is parser-guaranteed, never guessed. Findings WITHOUT a machine fix come back in remaining — those need judgment (yours or an agent's, proven afterwards with compare_abap). Use this when someone highlights code and wants it corrected to best practices / modern syntax instantly, as the mechanical first pass before any AI rewriting, or to modernize a file before review. It does not invent rewrites (only fixes abaplint defines), does not resolve cloud blockers that need re-architecture (dynpro, WRITE output — see plan_cloud_migration), and is not a formatter (format_abap pretty-prints without changing statements). Example: fix_abap({ "files": [ { "source": "report zdemo.\ndata lv_x type i.\nmove 5 to lv_x." } ] }).

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesSource files to analyze, up to 32 per call, 100k chars each.
rulesNoabaplint rule overrides merged onto the preset, e.g. { "keyword_case": { "style": "lower" } } — fixes follow your org's pack, same as lint_abap.
presetNoWhich ruleset supplies the fixes: "style" (default) fits isolated snippets; "full" expects all referenced objects provided; "syntax-only" yields no style fixes.style
abapVersionNoABAP language version to parse and fix against ("Cloud" for ABAP Cloud code).v758

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesYes
fixedYesWhat was fixed (capped at 200 entries; fixedCount carries the total).
remainingYesFindings with no machine fix — judgment work; rework them and verify with compare_abap.
fixedCountYesTotal machine fixes applied.
iterationsYesFix batches applied (each batch re-parses before the next).
stoppedEarlyNoPresent when the safety valve discarded a batch or the batch cap was reached.

TDQS

A4.9/5.0
Behavior5/5

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

Even with readOnlyHint/idempotentHint annotations present, the description adds substantial behavioral context: fixes are applied in "verified batches" where each batch is re-parsed and any parse-breaking batch is discarded, so "the output is parser-guaranteed, never guessed". It discloses that unfixed findings surface in `remaining`, and that it "does not invent rewrites (only fixes abaplint defines)". The pure-function framing (source in → corrected code out) is consistent with readOnlyHint=true, so there is no contradiction.

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 long but every sentence earns its place: core action first, then the verification mechanism, the unfixed-findings contract, when to use, what it does not do with named alternatives, and a working example. There is no redundancy or filler; the structure flows logically from what → how → when → when-not → example.

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

Completeness5/5

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

Given an output schema exists, the description need not document return values, yet it still pre-announces the `remaining` field. It covers scope (files, up to 32 per call via schema), the correctness guarantee, exclusions, sibling routing, and an example — complete for a 4-parameter tool with nested objects and two enums. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by giving a concrete invocation example ("fix_abap({ "files": [ { "source": ... } ] })") and by illustrating fix categories (keyword casing, MOVE → =) that help an agent anticipate what the `files`/`rules` parameters will produce. It does not elaborate on preset/abapVersion semantics, but the schema already documents those fully.

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

Purpose5/5

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

The description states a specific verb and resource — "Apply abaplint's own machine-applicable corrections to ABAP sources and return the corrected code" — and names the mechanism (deterministic, batched abaplint fixes). It explicitly distinguishes from siblings: "is not a formatter (format_abap pretty-prints without changing statements)" and points cloud-blocker work to plan_cloud_migration. An agent can tell exactly what this tool does and what it is not.

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

Usage Guidelines5/5

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

Explicit when-to-use guidance: "Use this when someone highlights code and wants it corrected to best practices / modern syntax instantly, as the mechanical first pass before any AI rewriting, or to modernize a file before review." It also gives when-not-to-use with named alternatives — cloud blockers needing re-architecture go to plan_cloud_migration, and formatting goes to format_abap. Nothing is left to inference.

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

format_abapFormat ABAP sourceA
Read-onlyIdempotent

Pretty-print one ABAP source: normalize keyword casing and indentation using abaplint's formatter — the offline equivalent of Pretty Printer in ADT/SE80. Use this when generated or hand-written ABAP has inconsistent casing/indentation and you want it normalized before review or commit. It does not reformat CDS views or behavior definitions, does not change any logic, and fails cleanly on source it cannot parse. Example: format_abap({ "source": "report ztest.\nwrite 'hi'." }).

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesThe complete ABAP source to format.
filenameNoabapGit-style name if known, e.g. "zcl_x.clas.abap"; inferred from the source when omitted.

Output Schema

ParametersJSON Schema
NameRequiredDescription
formattedYesThe pretty-printed source.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate idempotent and read-only (safe transformation). Description adds that it does not change logic and fails cleanly, but could mention return format or error specifics. No contradiction with annotations.

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

Conciseness5/5

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

Three sentences with no wasted words. Front-loaded with purpose, immediately followed by when to use and a concrete example.

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

Completeness5/5

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

Given simple tool with full annotations and output schema, description covers purpose, usage, exclusions, and failure mode fully. No gaps identified.

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

Parameters4/5

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

Schema covers both parameters with descriptions (100% coverage). Description adds context that filename can be inferred when omitted and includes a usage example, slightly augmenting schema.

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

Purpose5/5

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

Clearly states it pretty-prints ABAP source, normalizing keyword casing and indentation using abaplint's formatter. Distinguishes as offline equivalent of ADT/SE80 Pretty Printer, separate from sibling tools like lint_abap or explain_abap_rule.

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

Usage Guidelines5/5

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

Explicitly tells when to use (inconsistent casing/indentation before review or commit), what it does not do (does not reformat CDS or behavior definitions, does not change logic), and failure behavior (fails cleanly on unparseable source).

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

get_abap_outlineGet ABAP source outlineA
Read-onlyIdempotent

Return the structural outline of ABAP sources — classes (with methods, visibility, attributes, interfaces, inheritance), interfaces, and FORM routines — without you having to read the whole file. Use this when navigating a large class or legacy program to decide which part to read or edit next; it is the cheap first call before pulling thousands of lines into context. Set mermaid: true to also get the structure as a Mermaid classDiagram (inheritance, interface realization, method visibility) for documentation visuals. It does not return method bodies or analyze code quality (use lint_abap for that), and CDS/behavior-definition files yield an empty outline. Example: get_abap_outline({ "files": [ { "filename": "zcl_big.clas.abap", "source": "CLASS zcl_big DEFINITION…" } ] }).

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesSource files to analyze, up to 32 per call, 100k chars each.
mermaidNoAlso return the outline as Mermaid classDiagram source — render it anywhere Mermaid renders (GitHub, docs sites) for an instant structure diagram.

Output Schema

ParametersJSON Schema
NameRequiredDescription
mermaidNoMermaid classDiagram source for all files; present only when requested.
outlinesYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint is false. The description adds valuable behavioral context beyond annotations: it is a 'cheap first call,' does not return method bodies or analyze quality, and yields empty outlines for CDS/behavior-definition files. The mermaid option is also explained.

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

Conciseness4/5

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

The description is concise—about 6 sentences—and front-loaded with the main purpose. Every sentence adds value: purpose, usage guidance, limitations, parameter explanation, and an example. It could be slightly shorter, but it is well-structured and clear.

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

Completeness4/5

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

Given the output schema exists and annotations are present, the description is complete enough for this moderately complex tool. It covers what is returned (structural outline of classes, interfaces, FORM), limitations (no method bodies, CDS yields empty), and the optional mermaid output. No critical gaps remain.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds little extra meaning beyond the schema: it repeats the mermaid option purpose and provides an example call, which is helpful but not significant. No deeper parameter semantics are introduced.

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

Purpose5/5

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

The description clearly states the tool returns a structural outline of ABAP sources—listing classes, methods, visibility, interfaces, inheritance, and FORM routines—and explicitly differentiates from siblings by noting it does not return method bodies or analyze code quality. It also specifies that CDS/behavior-definition files yield an empty outline, leaving no ambiguity.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance: 'Use this when navigating a large class or legacy program to decide which part to read or edit next; it is the cheap first call.' It also excludes alternatives: 'use lint_abap for' code quality analysis, and mentions CDS files produce empty outlines, helping the agent decide correctly.

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

get_object_dependenciesGet a dependency graph of ABAP objectsA
Read-onlyIdempotent

Build a dependency graph over the provided ABAP sources for migration sequencing and impact reading: nodes are the provided objects plus every DB table / function module they reference (annotated with released-API state and CDS successor from the bundled SAP snapshot); edges are tiered by how they were derived — parser-level db-access and call-function references, structural inherits/implements from class definitions, and word-boundary references-textual matches between the provided objects. Optional Mermaid flowchart output. Use this when deciding what to migrate first (leaves before roots), what a rework might break, or which objects pull non-released tables into the picture — the sequencing companion to plan_cloud_migration. It is not a system where-used list: it only sees the text you pass, textual edges cannot see dynamic calls, and an absent edge is not proof of independence — a system's where-used and ATC remain authoritative. Example: get_object_dependencies({ "files": [ { "filename": "zcl_a.clas.abap", "source": "…" }, { "filename": "zcl_b.clas.abap", "source": "…" } ], "mermaid": true }).

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesSource files to analyze, up to 32 per call, 100k chars each.
mermaidNoAlso return a Mermaid flowchart (graph LR) of the dependency graph for instant visualization.
abapVersionNoABAP language version used for parsing when extracting object references.v758

Output Schema

ParametersJSON Schema
NameRequiredDescription
edgesYes
nodesYes
mermaidNoMermaid flowchart when requested.
scopeNoteYesExactly what the graph can and cannot claim.
releasedApiSnapshotDateYesDate of the bundled released-API snapshot behind the annotations.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already provide read-only, closed-world, and idempotent hints. The description adds crucial limitations beyond that: it only sees the text passed, textual edges miss dynamic calls, and absence of an edge is not proof of independence. This gives a clear mental model without contradiction.

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

Conciseness4/5

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

The description is dense but well-structured: purpose, node/edge derivation, optional Mermaid output, usage, limitations, and example. Every sentence earns its place, though it is slightly long; still it is front-loaded with the most important intent.

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

Completeness5/5

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

Given the output schema exists and annotations cover safety and idempotency, the description covers all necessary usage context: what it analyzes, how edges are derived, when to use, limitations, and an example. Nothing an agent needs is missing.

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

Parameters4/5

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

Schema covers all parameters with descriptions (100% coverage), and the description adds a concrete example invocation and clarifies filename inference rules (e.g., omitting filename infers type from source). This exceeds baseline but doesn't deeply elaborate each parameter beyond schema.

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

Purpose5/5

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

The description states a specific action ('Build a dependency graph') on a specific resource ('provided ABAP sources') and clearly frames it for migration sequencing and impact reading. It distinguishes itself from siblings by naming plan_cloud_migration as a companion and explicitly contrasting with a where-used list.

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

Usage Guidelines5/5

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

Explicitly lists when to use (deciding migration order, rework impact, pulling non-released tables) and when not (it is not a where-used list, cannot see dynamic calls, absent edge is not proof of independence). Points to authoritative alternatives like system where-used and ATC.

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

lint_abapLint ABAP sourceA
Read-onlyIdempotent

Run abaplint static analysis over ABAP, CDS or behavior-definition sources and return structured findings (rule key, message, severity, file/line/column, the offending line, and a docs URL per finding). Use this when you have written or modified ABAP code and want style and correctness feedback before it goes anywhere near a system — it runs entirely offline on the provided text. It does not connect to any SAP system, does not run ATC, and cannot judge whether referenced objects exist unless you provide them in the same call (preset "style", the default, skips whole-program checks for that reason; preset "full" enables them when you provide every dependency). A focus tag turns a pass into a themed review (performance / security / Clean ABAP style) without hand-picking rules; rule overrides layer a team's own pack on top. For an ABAP-Cloud migration verdict use check_cloud_readiness instead. Example: lint_abap({ "files": [ { "source": "REPORT ztest.\nDATA foo TYPE i.\nIF foo = 1.\nENDIF." } ] }).

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesSource files to analyze, up to 32 per call, 100k chars each.
focusNoCurated rule-pack lens: report only rules carrying this abaplint tag — "Performance" for a tuning pass, "Security" for a security sweep, "Styleguide" for Clean ABAP adherence. Parser errors always surface. Ignored with preset "syntax-only". Combine with rules to re-tune individual rules in the pack.
rulesNoabaplint rule overrides merged onto the preset (and onto a focus filter), e.g. { "line_length": { "length": 120 }, "7bit_ascii": false } — encode an org's best-practice pack here.
presetNo"style" (default): abaplint default rules minus whole-program semantic checks — right for isolated snippets. "full": every default rule, expects all referenced objects provided. "syntax-only": parser errors only.style
abapVersionNoABAP language version to parse against. "v758" (default) is current on-prem; "Cloud" is ABAP Cloud / Steampunk.v758

Output Schema

ParametersJSON Schema
NameRequiredDescription
findingsYes
fileCountYesNumber of files analyzed.
truncatedYesTrue if more than 500 findings existed and the list was cut.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already indicate read-only and idempotent. The description adds critical behavior: runs entirely offline, doesn't connect to SAP systems, doesn't run ATC, and explains how presets affect semantic checks. 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.

Conciseness4/5

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

The description is moderately long but well-organized. It opens with the core function and output, then usage conditions, limitations, parameter details, alternative tool, and an example. Each section is informative without redundancy, justifying its length.

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

Completeness5/5

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

Given the tool's complexity (5 parameters, 3 enums, nested objects, output schema exists), the description covers all essential aspects: offline usage, preset behaviors, focus tags, rule overrides, file limits, and language version. It also mentions output structure. No gaps.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining the 'focus' tag as a themed review, 'preset' options in detail, and 'rules' as overrides. It also includes an example call, enhancing understanding beyond the schema.

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

Purpose5/5

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

The description clearly states the tool's purpose: running abaplint static analysis on ABAP, CDS, or behavior-definition sources and returning structured findings. It specifies output fields and distinguishes from sibling check_cloud_readiness.

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

Usage Guidelines5/5

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

The description explicitly states when to use (after writing/modifying ABAP code for offline feedback) and when not to (for system-level checks like ATC or object existence). It provides guidance on presets and mentions an alternative tool for cloud readiness.

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

list_abap_rulesList abaplint rulesA
Read-onlyIdempotent

List the abaplint rules this server can check, optionally filtered by a free-text query or a tag, returning key, title, one-line description, tags and a documentation URL per rule. Use this when deciding which rules to enable or override in lint_abap, or to discover what a Clean-ABAP-style check exists for. It does not run any analysis and does not change configuration — it is a read-only catalog. Example: list_abap_rules({ "query": "obsolete" }).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoFilter by abaplint tag, e.g. "Styleguide", "Security", "Performance", "Quickfix", "SingleFile".
queryNoCase-insensitive substring matched against rule key, title and description, e.g. "select" or "obsolete".

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of rules returned.
rulesYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations provide readOnlyHint, openWorldHint, and idempotentHint. The description reinforces this by stating 'it is a read-only catalog' and adds context that it does not run analysis or change configuration, which is helpful but not critical given 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?

Two sentences plus an example code block. Every sentence adds value: purpose, usage guidelines, and a concrete example. No unnecessary words.

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

Completeness5/5

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

Given the tool's simplicity, presence of an output schema, and complete annotations, the description covers all necessary aspects: purpose, filtering options, example, and what the tool does not do, making it fully complete.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds an example usage with query parameter and explains the filtering concept, providing practical context beyond the schema descriptions.

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

Purpose5/5

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

The description starts with 'List the abaplint rules this server can check' which clearly states verb and resource. It specifies optional filters and return fields, distinguishing it from siblings like lint_abap (which runs analysis) and explain_abap_rule (which explains a specific rule).

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

Usage Guidelines5/5

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

Explicitly states 'Use this when deciding which rules to enable or override in lint_abap, or to discover what a Clean-ABAP-style check exists for.' and clarifies 'It does not run any analysis and does not change configuration,' providing 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.

plan_cloud_migrationPlan an ABAP Cloud migrationA
Read-onlyIdempotent

Turn ABAP sources into an ordered, phased ABAP Cloud migration backlog: runs the same dual-parse analysis as check_cloud_readiness, then arranges every blocker into per-object work items across consulting-ordered phases — repair-the-baseline first (broken code is not migration work), then mechanical quick wins, core rework of removed statements, UI/output re-architecture, and a separate snapshot-dated released-API remediation phase. Each work item carries an S/M/L effort band, a remediation recipe and sample locations; each phase carries a goal and objective, re-checkable exit criteria. Use this when someone asks 'plan the migration', 'what do we tackle first', or wants a work breakdown / task backlog instead of raw findings — the natural next call after check_cloud_readiness says rework is needed. It is a deterministic re-arrangement of the readiness analysis: it does not estimate person-days, does not modify any code, and inherits every readiness limitation (static, parser-level, snapshot-dated released-API data — a system's ATC stays authoritative). Example: plan_cloud_migration({ "files": [ { "source": "REPORT zold.\nWRITE: / 'hi'.\nCALL SCREEN 100." } ] }).

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesSource files to analyze, up to 32 per call, 100k chars each.
baselineVersionNoClassic ABAP version the code runs on today; used to separate broken-anyway code (phase: repair the baseline) from real migration work.v758

Output Schema

ParametersJSON Schema
NameRequiredDescription
phasesYes
summaryYesRoll-up of the plan and the readiness numbers it rearranges.
scopeNoteYesExactly what the underlying analysis does and does not cover.
suggestedLoopYesHow to execute and prove each item: the fix → compare_abap → re-check loop.
releasedApiSnapshotDateYesDate of the bundled released-API snapshot behind the released-api phase.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint and idempotentHint annotations by disclosing that the tool is a deterministic re-arrangement, does not modify any code, does not estimate effort in person-days, and inherits every readiness limitation such as static parser-level analysis and snapshot-dated released-API data. This gives an agent an accurate model of side effects and reliability without relying on annotations alone.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: it front-loads the primary outcome, enumerates the phase ordering, gives concrete selection guidance, states limitations, and provides an example. For a tool with this much behavioral nuance, the length is justified and well-structured, not padded.

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

Completeness5/5

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

Given the rich annotations, full input schema coverage, and existing output schema, the description still adds essential context: the relationship to check_cloud_readiness, deterministic non-mutating behavior, inherited limitations, phase semantics, and an invocation example. An agent has everything needed to decide when to call it and what to expect.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3: the schema already fully documents files, filename inference, maxItems/minItems, and baselineVersion semantics. The description adds a concrete usage example and some context around phases, but it does not materially improve parameter understanding beyond what the schema already provides.

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

Purpose5/5

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

The description opens with a specific verb and resource — 'Turn ABAP sources into an ordered, phased ABAP Cloud migration backlog' — and clearly distinguishes this tool from check_cloud_readiness by stating it arranges blockers into work items rather than returning raw findings. It names the exact deliverable (per-object work items, phases, exit criteria) so an agent can tell what this tool produces.

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

Usage Guidelines5/5

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

It explicitly states when to use this tool: when someone asks 'plan the migration', 'what do we tackle first', or wants a work breakdown instead of raw findings, and frames it as 'the natural next call after check_cloud_readiness'. It also names the sibling alternative and clarifies what the tool does not do (estimate person-days, modify code), giving clear selection guidance.

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

scaffold_abap_unitScaffold ABAP Unit test classesA
Read-onlyIdempotent

Generate the local ABAP Unit test-class include (.clas.testclasses.abap) for each global class in the provided sources: a FOR TESTING class (RISK LEVEL HARMLESS, DURATION SHORT) with a setup method that instantiates the class under test and one skeleton test method per public method. Every skeleton fails loudly with cl_abap_unit_assert=>fail('TODO …') so generated-but-empty tests can never masquerade as coverage; abstract classes and parameterized constructors get TODO guidance instead of a blind NEW #( ). Generated code is round-tripped through abaplint together with the class under test before being returned. Use this when a class has no tests yet and you want a correct, ready-to-fill test harness — the natural first step of test-driven rework and the 'add tests before we migrate this' consulting task. It does not invent assertions or test data (the given/when/then substance is yours or the agent's to write), does not create test doubles, and cannot run the tests — ADT/CI does that. Example: scaffold_abap_unit({ "files": [ { "filename": "zcl_travel.clas.abap", "source": "CLASS zcl_travel DEFINITION PUBLIC.\n…" } ] }).

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesSource files to analyze, up to 32 per call, 100k chars each.
abapVersionNoABAP language version the generated tests are validated against ("Cloud" for ABAP Cloud classes).v758

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesYes
skippedYesInputs no test class was generated for, with the reason (interfaces, programs, FOR TESTING classes…).
nextStepsYesWhat to do with the generated skeletons, in order.
validationIssuesYesabaplint findings on generated code — empty on a clean round-trip.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly and idempotent, and the description adds valuable behavioral detail beyond that: generated skeletons fail loudly via cl_abap_unit_assert=>fail('TODO …'), edge cases (abstract classes, parameterized constructors) get guidance, and the output is round-tripped through abaplint. This fully informs the agent of the tool's operational traits 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.

Conciseness5/5

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

The description is a single dense paragraph that front-loads the core purpose, then covers key behaviors, exclusions, and an example. Every sentence carries information—no filler or redundancy. For a tool with this complexity, the length is justified and well-structured.

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

Completeness5/5

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

Given the tool's complexity (generating test harnesses with specific constraints) and the presence of an output schema, the description covers all necessary context: what it produces, how it handles edge cases, what it deliberately avoids, and how it validates output. An agent has everything needed to invoke it correctly.

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

Parameters4/5

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

Schema description coverage is 100% (both parameters are described in the schema). The description adds a complete invocation example with the files parameter and clarifies the 100k chars limit (implied via schema's maxItems but reinforced). It doesn't repeat parameter definitions but adds usage context, which is appropriately helpful beyond the schema.

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

Purpose5/5

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

The description states a specific verb and resource: 'Generate the local ABAP Unit test-class include' for each global class. It clearly differentiates from siblings like scaffold_rap_bo (which targets RAP business objects) and lint/fix/format tools, so an agent can select it without ambiguity.

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

Usage Guidelines5/5

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

Explicit guidance: 'Use this when a class has no tests yet' and it positions the tool as the natural first step in TDD. It also states exclusions—does not invent assertions/test data, does not create test doubles, cannot run tests—and gives a concrete example invocation, leaving no doubt about when to use it.

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

scaffold_rap_boScaffold a RAP business objectA
Read-onlyIdempotent

Generate the complete, canonical RAP managed business-object stack for one root entity: root CDS view entity, behavior definition (managed, strict(2), optional draft), behavior implementation class with handler locals, projection view with transactional_query, projection behavior definition, UI metadata extension, and an OData V4 service definition — plus a suggested table DDL, the activation order, and next steps. Use this when starting a new RAP business object in ABAP Cloud or S/4HANA and you want correct boilerplate that follows the SAP /DMO reference shape instead of writing it by hand. Generated classes and CDS views are round-trip validated through abaplint at ABAP-Cloud level before being returned; behavior and service definitions are canonical templates (abaplint does not parse those deeply) and ADT activation is the final check. It does not create the table or the service binding (binding is not a source artifact — create it in ADT), and it generates single-entity BOs: model compositions (parent-child) yourself for now. Example: scaffold_rap_bo({ "entityName": "Travel", "sqlTable": "ztravel", "keyField": "travel_id", "fields": [ { "name": "agency_id", "type": "abap.char(6)" } ], "draft": true }).

ParametersJSON Schema
NameRequiredDescriptionDefault
draftNoGenerate draft handling (draft table reference, draft actions, use draft).
fieldsNoNon-key business fields. Admin fields (created_by/created_at/…) are added automatically.
prefixNoCustomer namespace prefix for all generated names.Z
keyFieldYessnake_case key field of that table, e.g. "travel_id".
sqlTableYesPersistent table the BO is backed by, e.g. "ztravel". Must start with the namespace prefix.
entityNameYesEntity name in UpperCamelCase, e.g. "Travel" — drives ZR_/ZC_/ZBP_/ZUI_ artifact names.
managedUuidKeyNotrue (default): UUID key filled by managed numbering — modern RAP default. false: the caller provides the key on create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesYes
nextStepsYesWhat the generator cannot do for you (table, binding, draft table).
activationOrderYesThe order to create/activate artifacts in ADT.
validationIssuesYesabaplint findings on the generated sources — empty in normal operation.
suggestedTableDdlYesStarting-point DDL for the persistent table; adjust types.

TDQS

A3.9/5.0
Behavior1/5

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

The annotation readOnlyHint=true contradicts the described behavior of generating code artifacts, which is a side effect. While the description adds some behavioral detail (validations, templating), the contradiction undermines trust. Score 1 due to contradiction.

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 concise yet comprehensive, using front-loaded purpose, bullet-like listing of artifacts, and clear limitations. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given 7 parameters and an output schema, the description fully covers usage context: what is generated, when to use, limitations, validation steps, and an example. It leaves no critical gaps for an agent to understand invocation.

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

Parameters3/5

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

Schema coverage is 100% with descriptions for all parameters. The description adds minimal extra meaning beyond the schema, such as the example and clarifying generated artifact names. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool generates a complete RAP managed business-object stack for one root entity, listing specific artifacts (CDS view, behavior definition, handler class, etc.). It distinguishes from sibling tools like lint_abap or format_abap, which are not about code generation.

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

Usage Guidelines5/5

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

Explicitly says 'Use this when starting a new RAP business object' and provides exclusions: does not create table or service binding, single-entity BOs only. Includes an example call and mentions validation steps.

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

Tool Schema Changelog

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

  1. 4 tool updatesv0.10.0
    • Addedfix_abap
    • Addedget_object_dependencies
    • Addedplan_cloud_migration
    • Addedscaffold_abap_unit
  2. 9 tool updatesv0.4.5
    • First observedcheck_cloud_readiness
    • First observedcheck_released_api
    • First observedcompare_abap
    • First observedexplain_abap_rule
    • First observedformat_abap
    • First observedget_abap_outline
    • First observedlint_abap
    • First observedlist_abap_rules
    • First observedscaffold_rap_bo

TDQS

A4.6/5.0
Disambiguation5/5

Each tool has a clearly distinct role: linting, fixing, formatting, readiness checking, migration planning, dependency graphing, scaffolding, rule lookup, and outline extraction are all separated. Related tools explicitly cross-reference each other and state what they do not do, so an agent can reliably pick the right one.

Naming Consistency5/5

All 13 tools follow a consistent snake_case verb_noun pattern: compare_abap, scaffold_rap_bo, get_object_dependencies, check_released_api, list_abap_rules, format_abap, etc. No camelCase or mixed conventions appear, and the verbs clearly signal the action while the nouns identify the artifact or domain.

Tool Count5/5

13 tools is well within the ideal 3-15 range for a domain-specific server covering static analysis, cloud migration, and scaffolding. Each tool earns its place and covers a distinct part of the ABAP workflow without redundancy or bloat.

Completeness5/5

The tool surface covers the full static ABAP work cycle: assess, plan, fix, format, scaffold, validate, and navigate. Documented limitations are scope boundaries rather than missing operations, so there are no obvious dead ends for the server's stated purpose.

Maintenance

ActivityActive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    Not graded
    maintenance
    An MCP server that enables AI assistants to interact with SAP systems via the ABAP Development Tools (ADT) REST API. It allows users to read ABAP source code, inspect DDIC objects, and execute SQL queries directly.
    66
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    A 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
  • A
    license
    B
    quality
    C
    maintenance
    MCP server for SAP ABAP development that enables AI assistants and code editors to interact with SAP systems via ABAP Developer Toolkit (ADT) APIs, supporting read, create, update, and delete of ABAP objects.
    100
    90
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/palimkarakshay/abap-mcp'

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