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 22+. 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 eighteen by default, lint_abap through check_rap_behavior, plus the opt-in run_abap_unit when ABAP_MCP_ENABLE_RUN=1 is set.

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 --edition btp  # released-API status + successor, per edition (s4hc|btp|pce)
npx abap-mcp explain exit_or_check              # rule rationale
npx abap-mcp release --since 2605 rap           # bundled ABAP Cloud/RAP release-delta knowledge (dated, sourced)
npx abap-mcp knowledge "clean core level C"     # search the bundled SAP knowledge base (Clean Core, ATC, SAP-AI)
npx abap-mcp aisdk --scenario ZDEMO_AI --interaction string --out ./out  # scaffold a Generative AI Hub call
npx abap-mcp agent-rules --target Cloud --paired sap-adt-mcp --run       # print the AGENTS.md rules block
npx abap-mcp rapcheck src/ --release 2508       # check RAP behavior/service definitions (BDEF/SRVD); exit 1 on errors
npx abap-mcp unittest --run src/                # EXECUTE ABAP Unit tests offline (open-abap kernel, no DB/CDS/EML); exit 1 on failure

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.

Agentic loop

The full offline loop an agent can run before anything reaches a system:

  1. Scaffoldscaffold_rap_bo, scaffold_abap_unit, or scaffold_abap_ai_sdk for a validated starting point instead of a blank editor.

  2. Fix, then lintfix_abap (deterministic mechanical pass) followed by lint_abap until findings are zero or consciously waived.

  3. Runrun_abap_unit (opt-in via ABAP_MCP_ENABLE_RUN=1, or always through abap-mcp unittest --run) executes the ABAP Unit tests and feeds real pass/fail results back into the loop — TH Köln's ABAP benchmark (arXiv 2601.15188) measured this alone moving Claude Opus 4.5 from 31.6% to 78.7% task success across feedback rounds.

  4. Readinesscheck_cloud_readiness / plan_cloud_migration to grade the result and size what's left; compare_abap proves the rework didn't regress.

  5. Hand off — pair with SAP's official ADT MCP server or abap-adt-mcp for the in-system half (write, activate, ATC, a real ABAP Unit run) — see Related projects.

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 per-edition Cloudification snapshots (edition: s4hc | btp | pce, default s4hc) → released / deprecated / not-released per object, plus SAP's own successor(s) when published, a curated CDS successor fallback for common classic tables, and a classicAPI/noAPI/internalAPI classification. 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.

explain_abap_release

Bundled, dated (curated 2026-09-10) knowledge base of ABAP Cloud / CDS / RAP / EML / ATC release deltas across the 2502–2608 trains plus ABAP Platform 2025 — each row an original summary with a cited SAP source URL and a confirmed / reported confidence flag; filter by sinceRelease, product, kind.

search_sap_knowledge

Free-text search over the same bundle plus Clean Core governance (Levels A–D, release contracts C0–C3, the real ATC vocabulary) and 7 SAP-AI decision cards (SAP-ABAP-1, Generative AI Hub, ABAP AI SDK, SAP's official ADT MCP server, …) — every hit carries its sources and confidence.

scaffold_abap_ai_sdk

Generates a validated ABAP class calling the Generative AI Hub through the ABAP AI SDK (ISLM): 7 interaction shapes (string, messages, prompt-template, function-calling, structured-output, streaming, orchestration), round-tripped through abaplint against abap-mcp's own bundled IF_AIC_* stubs (validated: "abaplint-syntax"); returns the manual ISLM setup steps it cannot perform itself.

get_abap_agent_rules

Emits the AGENTS.md / CLAUDE.md rules block for an ABAP repo: lint-before-commit, the readiness gate, released-API discipline, scaffold-first, the offline unit-test loop, and division of labour with an online ADT MCP server.

check_rap_behavior

Checks RAP behavior definitions (.bdef.asbdef) and CDS service definitions (.srvd.srvdsrv) with abap-mcp's own BDL/SDL parser and a 48-rule set (40 behavior rules including the structural tiers, 7 service-definition rules, 1 release gate) — abaplint deep-parses neither file type, so this is the only static feedback they get without a system. Covers the draft/etag/lock/authorization/numbering consistency set, strict-mode obligations, action/operation/validation/determination/side-effect coherence, projection use against the base BDEF, and service expose against the CDS entities you pass in the same call; with abapRelease it also gates constructs newer than that release. Two-tier by design: punctuation breakage is an error, a construct the grammar does not know is an info that says so.

run_abap_unit (opt-in — ABAP_MCP_ENABLE_RUN=1)

Executes ABAP Unit tests offline: transpiles to JavaScript via @abaplint/transpiler against the bundled open-abap kernel and runs it in a sandboxed subprocess (server-owned temp dir, hard timeout, no network) — one pass/fail/error/skipped row per method, plus the honest static lint. Evidence about pure logic only — no DB/CDS/EML/AMDP/auth. Always available in the CLI as abap-mcp unittest --run.

Knowledge base & resources

A dated, cited SAP knowledge bundle ships with the package (curated 2026-09-10): 100 ABAP Cloud / RAP release-delta rows (2502–2608 trains + ABAP Platform 2025, plus pre-2502 chronology corrections so an agent can't present an established feature as a 2025-26 novelty), 55 Clean Core entries (Levels A–D, release contracts C0–C3, the real ATC vocabulary), and 7 SAP-AI decision cards (SAP-ABAP-1, Generative AI Hub orchestration, the ABAP AI SDK, Joule for Developers, SAP's official ADT MCP server, …). Every row is abap-mcp's own original summary over a cited source with a confirmed / reported confidence flag — never copied SAP prose (see the licensing boundary in docs/DESIGN.md).

Reach it as tools (explain_abap_release, search_sap_knowledge; CLI release / knowledge) or as MCP resources a host can attach directly to a conversation: abap-mcp://knowledge/manifest (provenance for every bundled file), .../release-deltas, .../clean-core, .../sap-ai (whole files), and .../release/{id}, .../clean-core/{id}, .../sap-ai/{id} (individual cards, each returned as both application/json and text/markdown).

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, offline, and edition-aware: check_released_api and the releasedApiFindings in readiness reflect SAP's published Cloudification lists as of the bundled snapshot date — one per SAP edition (s4hc Public Edition, btp, pce Private Edition / on-prem; edition param, default s4hc) — 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 ATC check ("Usage of Released APIs (Cloudification Repository)" for Public Edition / "Usage of APIs (Cloudification Repository)" for Private Edition & on-prem, via check variants such as ABAP_CLEAN_CORE_DEVELOPMENT / ABAP_CLEAN_CORE_READINESS) remains authoritative; treat an "absent from the list" result as "not released as of the snapshot", not as proof. The readiness report's grade is our own blocker-density banding (gradeMeaning: "blocker-density"), not SAP's Clean Core Level A–D — see cleanCoreVocabulary on the report for the real ATC vocabulary (src/data/atc-vocabulary.json).

  • 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 and service definitions are outside abaplint's checked surface, so they run through abap-mcp's own RAP checker instead and are labeled validated: "rap-checker" when it returns nothing at error or warning severity; the metadata extension has no checker at all and stays "template". Each generated file is labeled validated: "abaplint" | "rap-checker" | "template", and ADT activation is still the final arbiter.

  • The RAP checker is our own grammar, not SAP's parser. check_rap_behavior (and the rap/… findings merged into lint_abap) reads BDEF/SRVD with a tokenizer and grammar this project wrote from SAP's published RAP BDL feature tables, the ABAP keyword documentation, and a 102-file corpus of Apache-2.0 SAP sample sources. Every report carries grammarVersion, rulesVersion and a scopeNote saying what that does and does not prove: it cannot see DDIC tables, behavior-pool classes or CDS field types, and constructs it does not recognise are reported as info, never as errors. Rules derived from anything weaker than SAP documentation are capped at warning and carry their provenance in the message. Every shipped rule is documented in docs/RAP-RULES.md.

  • run_abap_unit is not SAP's kernel. It transpiles to JavaScript and executes on the open-abap kernel (opt-in, ABAP_MCP_ENABLE_RUN=1; always on in the CLI via unittest --run) — no database (any ABAP SQL aborts the method), no CDS, no EML/RAP runtime, no AMDP, no authority checks, no locks, no ATC, no activation. A green run is evidence about pure logic, never proof of system behavior; constructs it cannot execute come back in unsupported, never as a silent pass.

  • scaffold_abap_ai_sdk is checked against abap-mcp's own stubs, not SAP's real API. Generated classes are round-tripped through abaplint against bundled IF_AIC_* / CL_AIC_* declarations this project wrote from SAP's documentation, not SAP source — labeled validated: "abaplint-syntax", meaning the ABAP parses, not that it matches SAP's actual ABAP AI SDK signatures exactly. The manual ISLM setup it depends on (SAP_COM_0A69, INTS/INTM) is listed in setupSteps, never performed.

  • 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.

Online companion: abap-mcp-genai

A separate, opt-in binary — abap-mcp-genai, never imported by the default server — wraps SAP's Generative AI Hub orchestration service using your own SAP AI Core tenant: explain_with_sap_abap_1 (ask SAP's own ABAP-tuned model to explain a class, method or snippet) and list_genai_hub_models. Your ABAP source leaves this machine when you use it — it goes to SAP infrastructure under your organization's own SAP AI Core contract, never to abap-mcp's authors. Read docs/GENAI.md in full before enabling it.

  • 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 previewed what run_abap_unit (v0.11) now ships natively in this server, on the same abaplint transpiler + open-abap-core foundation.

  • SAP's official ADT MCP server (GA, ships inside ADT for Eclipse and VS Code; 20 tools across 8 toolsets, 18 licence-free) — writes, activates and tests ABAP in a real system (abap_creation-create_object, abap_activate_objects, abap_run_unit_tests, abap_run_atc, …), with no offline lint, readiness grade or released-API cross-check of its own.

  • abap-adt-mcp by Willian Saez (MIT) — the community equivalent, 173 online tools over the same ADT REST API, same live-system trust model.

  • Pairing. abap-mcp verifies offline, before and after: lint_abap / check_cloud_readiness / compare_abap on code before it is written to a system, then again on what SAP's official server or abap-adt-mcp just wrote, activated or ran ATC against. Neither online server needs abap-mcp, and abap-mcp never needs credentials — see the recipe in docs/COOKBOOK.md and get_abap_agent_rules for the rule text to paste into a repo's AGENTS.md.

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

18 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. Our A–D grade is blocker density (see gradeMeaning), NOT SAP's own Clean Core Level A–D; a target system's own released-API ATC check ("Usage of Released APIs (Cloudification Repository)" for SAP Cloud ERP Public Edition / "Usage of APIs (Cloudification Repository)" for SAP Cloud ERP Private Edition / on-premise, via variants such as ABAP_CLEAN_CORE_DEVELOPMENT / ABAP_CLEAN_CORE_READINESS) 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.
editionNoSAP edition of the bundled Cloudification snapshot to check against: "s4hc" (default, SAP Cloud ERP Public Edition), "btp" (SAP BTP ABAP environment), or "pce" (SAP Cloud ERP Private Edition / on-premise). Release state and successors can differ by edition — the same object may be released in one and not yet in another.s4hc
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
gradeYesBlocker-density tech-debt grade (see gradeMeaning): 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.
editionYesSAP edition the released-API findings were checked against.
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
gradeMeaningYesWhat `grade` means: a banding of blockers per file. NOT SAP's own Clean Core Level A–D (see cleanCoreVocabulary.cleanCoreLevels for those) — do not conflate the two.
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.
cleanCoreVocabularyYesSAP's real ATC vocabulary for released-API/Clean Core checks — see docs/atc-vocabulary.json (F04).
releasedApiFindingsYesReleased-API observations from the bundled SAP Cloudification snapshot (deprecated-API usage, direct non-released table access with successor hints, and which edition/source answered each one). Informational — NOT counted in cloudBlockerCount or score.
releasedApiSnapshotDateYesDate of the bundled released-API snapshot the releasedApiFindings reflect.

TDQS

A4.8/5.0
Behavior5/5

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

With safety already covered by annotations (readOnlyHint, idempotentHint, openWorldHint=false), the description adds substantial behavior: it is static and parser-level, connects to no SAP system, runs no ATC, and its 'ready' verdict means no detected language-level blockers rather than certification. It also explains the grade is blocker density, not SAP's Clean Core Level A-D.

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?

Purpose is front-loaded, then mechanism, outputs, triggers, limits, grade caveat and example follow in a logical order. It is dense and long with heavy nested clauses, so it is slightly oversized, but nearly every sentence carries actionable information.

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 static analysis tool with an output schema already defining return values, the description covers purpose, scope, limitations, grading semantics and routing to the authoritative check. 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 schema carries most parameter meaning. The description adds the two-pass framing that gives context to baselineVersion (v758 baseline vs Cloud) and to edition-based snapshot selection, reinforcing rather than merely repeating schema text.

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?

It gives a specific verb+resource (assess ABAP source distance from ABAP Cloud Clean Core tier 1) and even explains the mechanism (parse twice at baseline and Cloud, diff). It clearly demarcates itself from the sibling check_released_api by stating its released-API scan is separate from the language-level blocker count and not exhaustive dependency discovery.

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 states explicit triggers ('is this code cloud-ready / Clean Core compliant', before porting classic ABAP, for a graded tech-debt assessment of an abapGit export) and explicit non-uses (static/parser-level, no SAP connection, no ATC, not a certification). It also names the authoritative alternative (a target system's own ATC released-API check with specific variants), so the agent knows when to defer.

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

check_rap_behaviorCheck a RAP behavior/service definitionA
Read-onlyIdempotent

Check RAP behavior definitions (.bdef.asbdef) and CDS service definitions (.srvd.srvdsrv) for syntax and structural-consistency defects, offline, using abap-mcp's own BDL/SDL parser — abaplint does not deep-parse either file type (it stores a BDEF behind a single regex and a SRVD not at all), so this is the only static feedback these files get without a system. Reports the draft/etag/lock/authorization/numbering consistency set, strict-mode obligations, action/operation/validation/determination/side-effect coherence, projection 'use' statements against the base BDEF, and service 'expose' sets against the CDS entities you pass in the same call; with abapRelease set, it also flags constructs newer than that release from a bundled, dated copy of SAP's RAP BDL feature table. Use this when you have written or generated a BDEF/SRVD (by hand, from scaffold_rap_bo, or from a model that may have invented RAP syntax) and want it checked before it reaches ADT — and pass the base BDEF and the .ddls.asddls views alongside it, because the cross-file rules only run on files present in the call. It does NOT connect to SAP, does not activate anything, does not run ATC, cannot see DDIC tables, behavior-pool classes or CDS field types, and cannot certify that ADT would accept the file — the grammar is derived from SAP's published feature tables plus a 102-file corpus of Apache-2.0 SAP sample sources, so constructs it does not recognise are reported as info, never as errors. For ABAP classes use lint_abap; for a new BO use scaffold_rap_bo; for what a release added use explain_abap_release. Example: check_rap_behavior({ "files": [ { "filename": "zr_travel.bdef.asbdef", "source": "managed implementation in class zbp_travel unique;\nstrict ( 2 );\nwith draft;\n\ndefine behavior for ZR_Travel alias Travel\npersistent table ztravel\nlock master\n{ create; }\n" } ], "abapRelease": "2508" }).

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesThe BDEF/SRVD files to check, plus any .ddls.asddls or base .bdef.asbdef you want cross-checked in the same call. Up to 32 files, 100k chars each — passing the base BDEF and the CDS views is what turns on the cross-file half of the rule set.
strictNoRun the strict-mode rules even when the BDEF does not declare strict/strict(2) — use it to see what a BO would have to fix before it can be released under the C0/C1 contract. Default false: strict rules run only on BDEFs that declare strict.
abapReleaseNoTarget ABAP Cloud release, e.g. "2508". When set, constructs whose SAP-documented minimum release is newer are reported as warnings (rule RAP900) from the bundled, dated feature table. Omit to skip release gating.

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesYesOne row per supplied file: what it was taken to be, and whether it parsed.
summaryYesCounts, including the two honesty counters that make coverage gaps measurable.
findingsYesEvery rule finding, sorted by file, line, column, rule id.
scopeNoteYesExactly what this checker proves and does not prove — abaplint did not parse these files, and ADT remains the authority.
validatedYesChecked by abap-mcp's own RAP parser + rule set at the stamped grammar/rules version. It does NOT claim abaplint parsed it, that SAP's parser would accept it, or that the object would activate.
releaseGateNoPresent only when abapRelease was passed.
rulesVersionYesWhich rule set judged them, e.g. "rap-rules/1.0.0".
grammarVersionYesWhich BDL/SDL grammar read the files, e.g. "bdl/2026-09-10".

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld=false/idempotent, and the description adds substantial context beyond them: strictly offline, no SAP connection, no activation, no ATC, cannot see DDIC tables or pool classes, and the important caveat that unknown constructs are reported as info, never errors, because the grammar is corpus-derived.

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?

Front-loads the purpose before usage, limits, siblings and example, and every clause carries information. It is dense and long for a single block of prose, but not padded with 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?

With an output schema present, return values need not be described; the description covers scope, offline limits, cross-file prerequisites, release gating, sibling routing and an example, which is complete for a self-contained static checker.

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 earns more by explaining the semantics of passing base BDEF and .ddls.asddls files (this is what activates the cross-file half of the rules) and what abapRelease gating does, with a worked example call.

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?

States a specific verb (check) and resource (RAP behavior definitions .bdef.asbdef and CDS service definitions .srvd.srvdsrv), plus the defect classes it looks for. It explicitly distinguishes itself from abaplint and from sibling tools, so an agent can route to it without opening the schema.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('when you have written or generated a BDEF/SRVD ... before it reaches ADT') and names the alternatives with their selection condition (lint_abap for classes, scaffold_rap_bo for new BOs, explain_abap_release for release history). It also states the required companion files (base BDEF, .ddls.asddls) that enable cross-file rules.

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 SAP's own successor(s) when the snapshot has any, a curated CDS successor hint otherwise, and a classicAPI/noAPI/internalAPI classification where SAP publishes one. This reflects SAP's official per-edition Cloudification lists as bundled in this package (default edition "s4hc", snapshot 2026-09-10); 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 target system's own released-API ATC check ("Usage of Released APIs (Cloudification Repository)" for SAP Cloud ERP Public Edition / "Usage of APIs (Cloudification Repository)" for SAP Cloud ERP Private Edition / on-premise, via variants such as ABAP_CLEAN_CORE_DEVELOPMENT / ABAP_CLEAN_CORE_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
editionNoSAP edition of the bundled Cloudification snapshot to check against: "s4hc" (default, SAP Cloud ERP Public Edition), "btp" (SAP BTP ABAP environment), or "pce" (SAP Cloud ERP Private Edition / on-premise). Release state and successors can differ by edition — the same object may be released in one and not yet in another.s4hc
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.
editionYesSAP edition these results were checked against.
resultsYes
snapshotDateYesDate of the bundled SAP Cloudification snapshot these results reflect.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, closed-world), yet the description adds substantial behavioral context beyond them: no SAP system connection, no ATC execution, tied to a specific bundled snapshot (edition s4hc, 2026-09-10), and the crucial caveat that 'absent from the list' means 'not-released as of the snapshot' rather than proof. That is exactly the kind of limitation an agent must know before trusting the result.

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?

Front-loaded with purpose, classification states, then caveats and example, so nothing critical is buried. It is dense and long, and the tail listing of ATC variant names (ABAP_CLEAN_CORE_DEVELOPMENT / ABAP_CLEAN_CORE_READINESS) is more detail than an agent strictly needs, but nearly every sentence earns its place.

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?

An output schema exists, so return-value explanation is unnecessary, and the description still supplies the classification vocabulary, successor-hint behavior, snapshot/edition scoping, and a call example. Nothing an agent needs to invoke this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both the edition enum and the objects/name/type structure are already documented in the schema, including the per-edition difference caveat. The description reinforces edition semantics and supplies a worked example, but adds little meaning the schema does not already carry; baseline 3 applies.

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?

Specific verb (look up/report) plus concrete resource (ABAP repository objects in SAP's Cloudification list) with the exact three-state classification spelled out. It explicitly distinguishes itself from the sibling check_cloud_readiness, so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

States the triggering need ('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') and names the complementary alternative check_cloud_readiness plus its limitation. It also names the authoritative fallback (target system ATC check) and the conditions under which this lookup is insufficient.

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.7/5.0
Behavior5/5

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

Annotations declare readOnlyHint and idempotentHint, and the description adds meaningful behavioral context beyond that: it explains matching by content (moved-but-unchanged code is not noise), explicitly notes that it does not connect to any SAP system, and highlights a limitation ('behavior can change while every number improves'). This is valuable disclosure beyond the structured annotations.

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

Conciseness5/5

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

The description is well-structured and front-loaded: it starts with the main functionality, then usage guidance, then exclusions, ending with an illustrative example. Every sentence adds necessary information without repetition or fluff, and the length is justified by the tool's complexity.

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

Completeness5/5

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

The description covers purpose, usage context, limitations, and provides an example. Since the tool has an output schema, the description does not need to detail return values. The mention of reuse of check_cloud_readiness logic and the explicit exclusions round out the context, making the description complete for an agent to select and use the tool.

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 documents all parameters with descriptions. The description adds an example call that illustrates the structure of 'before' and 'after' arrays, but it does not provide any additional parameter semantics that are not already in the schema. Therefore, a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Compare a BEFORE and an AFTER version of ABAP source' and enumerates the exact kinds of results (lint findings, cloud-blocker/score/grade movement, structural changes). It explicitly differentiates itself from a textual diff tool ('use git diff to see the edits'), making it clear what this tool does and does not do.

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 usage contexts: 'Use this when reviewing a refactor, a modernization step or an AI-generated rewrite' and gives exclusions: 'It is not a textual diff tool' and 'cannot judge functional equivalence.' It also mentions that it uses the same diff as check_cloud_readiness, linking to a sibling tool without confusion.

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

explain_abap_releaseExplain ABAP Cloud / RAP release deltasA
Read-onlyIdempotent

Look up what changed in ABAP Cloud, CDS, ABAP SQL, RAP, EML, ABAP Unit, ATC and the development tools across the 2502 to 2608 release trains plus ABAP Platform 2025 (SAP_BASIS 816), from a dated knowledge base bundled with this package. Each row carries an original summary, an optional syntax sketch, the release and ABAP release, the products it was verified for, the cited SAP source URL, and a confidence flag ("confirmed" = fact-checked, "reported" = single-source). Use this when you are about to write or review ABAP and need to know whether a language, CDS or RAP feature exists in the target release — for example before using CDS table entities as draft persistence, BUFFER ON, RAP change documents, global side effects, or a feature-control attribute. Filter by sinceRelease to see only what is new since the customer's current level. Rows flagged pre-2502 exist to stop an agent presenting an established feature (business events, late numbering, prechecks, bgPF) as a 2025-26 novelty. It does not connect to any SAP system, does not read release notes live, and is not a complete changelog — it is a curated snapshot (curated 2026-09-10) and the target system's own release notes stay authoritative. For released-API state of a specific object use check_released_api; for Clean Core levels and ATC vocabulary use search_sap_knowledge. Example: explain_abap_release({ "sinceRelease": "2605", "kind": "rap" }).

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoRestrict to one facet: "language", "cds", "sql", "rap", "testing", "atc", "tooling" or "eml". Use it to answer "what is new in RAP" without wading through tooling rows.
limitNoMaximum rows to return, 1 to 200; defaults to 60. Raise it only when you really want a full release dump.
topicNoFree-text topic matched against row ids, titles, keywords and summaries, e.g. "draft table entity", "side effects", "change documents". Omit it to browse a whole release or facet.
productNoRestrict to one product: "btp" (SAP BTP ABAP environment), "s4hc-public", "s4hc-private" or "onprem". Rows list the products their source actually verified.
sinceReleaseNoReturn only rows at this release or newer, chronologically: pre-2502, 2502, 2505, 2508, platform-2025, 2511, 2602, 2605, 2608. Use the customer's current level, e.g. "2508", to see what upgrading buys them.

Output Schema

ParametersJSON Schema
NameRequiredDescription
deltasYesMatching release-delta rows, newest release first.
scopeNoteYesDated-knowledge caveat to repeat to the user.
truncatedYesTrue when more rows matched than were returned.
matchCountYesHow many rows matched before the limit was applied.
curatedDateYesDate the bundled knowledge base was curated.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/closed-world, and the description goes well beyond them: it discloses that the tool does not connect to any SAP system, does not read release notes live, is a curated snapshot dated 2026-09-10, is not a complete changelog, and that the target system's notes remain authoritative. It also describes per-row fields and the meaning of the 'confirmed'/'reported' confidence flag, which the annotations cannot convey.

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

Conciseness4/5

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

Purpose, when-to-use, caveats, alternatives and an example are all front-loaded in a logical order, and the example call is a useful close. It is delivered as one dense paragraph, which makes the caveats and sibling pointers slightly harder to scan than bulleted structure would be.

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 5-parameter, zero-required lookup with an output schema, the description supplies everything an agent needs: scope, filter semantics, freshness/curation limits, confidence semantics, sibling routing and a concrete invocation. Return values are covered by the output schema yet are still summarized, leaving no material gap.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds genuine intent beyond the schema: it explains that sinceRelease should be set to the customer's current level to see what an upgrade buys, and it explains why pre-2502 rows exist (to prevent mislabeling established features as novelties). The worked example further clarifies parameter interaction.

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 concrete verb ('Look up what changed') and enumerates the exact resource scope (ABAP Cloud, CDS, ABAP SQL, RAP, EML, ABAP Unit, ATC, tooling across named release trains). It explicitly carves out its niche against siblings by pointing to check_released_api and search_sap_knowledge for adjacent questions, so an agent can distinguish it without opening the schema.

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

Usage Guidelines5/5

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

It gives explicit when-to-use ('when you are about to write or review ABAP and need to know whether a feature exists in the target release'), concrete trigger scenarios (draft persistence, BUFFER ON, RAP change documents, side effects, feature-control attributes), and named alternatives with their selecting conditions (check_released_api for released-API state, search_sap_knowledge for Clean Core/ATC vocabulary).

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.5/5.0
Behavior4/5

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

Annotations already declare read-only and idempotent; description adds domain boundary (abaplint only) and states it does not run analysis. Useful context beyond annotations, though not exhaustive.

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, front-loaded with purpose, followed by usage and scope limitation, ending with a concrete example. Every sentence is informative.

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 simple one-parameter read-only tool with output schema, the description covers purpose, usage, and limitations sufficiently. No need to detail return values due to output schema.

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 covers the single parameter with examples; description's example is redundant. No additional semantic meaning beyond schema, so baseline 3.

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?

States it explains one abaplint rule in depth, listing included elements (title, description, rationale, tags, docs URL, examples). Distinguishes from siblings by referencing lint_abap/check_cloud_readiness findings. Clear verb+resource+scope.

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 a lint_abap or check_cloud_readiness finding needs justification' and notes it does not run analysis and excludes SAP ATC documentation. Provides clear when/when-not guidance.

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.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds useful context beyond that: it does not change any logic, fails cleanly on unparseable source, and is an offline equivalent of Pretty Printer in ADT/SE80. This extra behavioral detail goes beyond the annotations.

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

Conciseness5/5

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

The description is three sentences, each earning its place: purpose, usage guidance with exclusions, and a concrete example. It is front-loaded with the core purpose and contains no filler or redundant phrases.

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 moderately simple tool with an output schema and good annotations, the description is complete. It covers what the tool does, when to use it, what it deliberately does not do, failure behavior, and includes an example. The sibling tools are clearly distinguishable.

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 input schema already provides rich descriptions for both parameters (source and filename), including filename inference behavior. The description's example demonstrates the 'source' parameter but does not add new semantics for 'filename' beyond what the schema already states. With 100% schema coverage, 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 clearly states the verb+resource: 'Pretty-print one ABAP source' with specific details about normalizing keyword casing and indentation. It also differentiates from siblings by noting it is the offline equivalent of ADT/SE80 Pretty Printer and explicitly excludes CDS views and behavior definitions.

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 usage guidance is provided: 'Use this when generated or hand-written ABAP has inconsistent casing/indentation and you want it normalized before review or commit.' It also lists exclusions (CDS views, behavior definitions, logic changes) and gives a concrete example, making the intended use very clear.

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

get_abap_agent_rulesGet the AGENTS.md rules block for an ABAP repoA
Read-onlyIdempotent

Generate the ABAP section of a repository's AGENTS.md / CLAUDE.md: the lint-before-commit rule, the ABAP Cloud readiness gate, released-API discipline, scaffold-first, the offline unit-test loop, and the division of labour with an online ADT MCP server. Use this when you set up a new ABAP repo for agentic development or want a team's coding-agent rules to reference the abap-mcp tools consistently. It does not write the file (paste the returned markdown yourself), does not read the workspace, and is not a substitute for the project's own conventions — it encodes the tool contract, nothing project-specific beyond the parameters you pass. Example: { "target": "Cloud", "pairedWith": ["sap-adt-mcp"], "runEnabled": true }.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNo"Cloud" (default) for ABAP Cloud / Steampunk repos, "classic" for on-prem baselines that still migrate.Cloud
editionNoReleased-API edition the readiness gate should quote: "s4hc" (S/4HANA Cloud Public Edition), "btp" (BTP ABAP Environment), "pce" (Private Cloud Edition).s4hc
pairedWithNoOnline ADT MCP servers the agent can also use: "sap-adt-mcp" (SAP official, ships with ADT), "abap-adt-mcp" (community), or "none".
runEnabledNoTrue when run_abap_unit is enabled (ABAP_MCP_ENABLE_RUN=1) so the rules prescribe the offline test loop.
packagePrefixNoCustomer namespace/prefix for new objects, e.g. "Z", "Y" or "/ACME/".Z

Output Schema

ParametersJSON Schema
NameRequiredDescription
markdownYesThe AGENTS.md section, ready to paste.
ruleCountYesNumber of rules emitted.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered by structured data. The description adds real value beyond that by disclosing the non-obvious post-condition that the markdown is only returned and must be pasted by the caller, and that it encodes the tool contract rather than project-specific conventions.

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?

A single dense paragraph, but it is front-loaded with the artifact it produces and every clause afterwards carries distinct information (contents, when to use, exclusions, example). Slightly overlong, but no sentence is pure 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?

With an output schema present the description needn't explain return values, and it still covers what is produced, the usage triggers, the boundaries, and an example invocation. For a zero-required-parameter generator, an agent has everything needed to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the schema documents each parameter's meaning, setting a baseline of 3. The description goes slightly further by giving a concrete example call ({ target: "Cloud", pairedWith: ["sap-adt-mcp"], runEnabled: true }) that shows how the settings combine, though edition and packagePrefix are not illustrated.

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?

States a specific verb (Generate) and a specific artifact (the ABAP section of AGENTS.md / CLAUDE.md), then enumerates its contents. No sibling in the list produces rules documentation, so the agent can distinguish it immediately from list_abap_rules / 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?

Gives explicit trigger conditions ('when you set up a new ABAP repo for agentic development' or want team rules referencing abap-mcp tools) plus clear exclusions: it does not write the file, does not read the workspace, and is not a substitute for project conventions. 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.

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.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and idempotentHint, and the description adds critical behavioral context: it does not return method bodies, does not analyze code quality, and produces empty outlines for CDS/behavior files. It also explains the optional mermaid output. This goes well beyond the annotation bare minimum.

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 longer than a one-liner but each sentence earns its place: purpose, usage scenario, mermaid option, limitations, and an example. It's structured with a clear progression and no fluff, though it could arguably be trimmed slightly.

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?

The description fully covers the tool's scope, constraints (no method bodies, empty CDS), usage context, and provides an example. With an output schema present, no return-value detail is required. This is a complete package for an AI agent to decide when and how to invoke it.

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

Parameters4/5

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

Schema coverage is 100% (both params have descriptions), so baseline is 3. The description adds value by providing a concrete usage example and explaining the mermaid flag's purpose ('for documentation visuals'). The example clarifies the expected input shape, which is 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 uses a specific verb ('Return the structural outline') and enumerates exactly what it covers (classes with methods/visibility/attributes/interfaces/inheritance, interfaces, FORM routines). It distinguishes itself from siblings by contrasting with lint_abap, making it clear this is a structural navigation tool, not an analysis tool.

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 directly states when to use it ('when navigating a large class or legacy program to decide which part to read or edit next') and positions it as a 'cheap first call.' It explicitly names the alternative for code quality (lint_abap) and calls out CDS/behavior-definition files as yielding empty outlines, so the agent knows when not to rely on it.

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.
editionNoSAP edition of the bundled Cloudification snapshot to check against: "s4hc" (default, SAP Cloud ERP Public Edition), "btp" (SAP BTP ABAP environment), or "pce" (SAP Cloud ERP Private Edition / on-premise). Release state and successors can differ by edition — the same object may be released in one and not yet in another.s4hc
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
editionYesSAP edition the nodes' released-API states were checked against.
mermaidNoMermaid flowchart when requested.
scopeNoteYesExactly what the graph can and cannot claim.
releasedApiSnapshotDateYesDate of the bundled released-API snapshot behind the annotations.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses key limits: it only sees the passed text, textual edges cannot see dynamic calls, an absent edge is not proof of independence, and system where-used/ATC remain authoritative. This is exactly the behavioral context an agent needs.

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

Conciseness4/5

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

Front-loaded with purpose, node/edge semantics, then caveats and a worked example. It is dense and long but each clause adds real information; the trailing JSON example is somewhat verbose but illustrative.

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?

With an output schema present, return values need no explanation, and the description covers scope, semantics, limitations, edition sensitivity, and alternatives. Complete for this complexity.

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 schema already documents files, edition, mermaid, and abapVersion thoroughly. The description adds only the conceptual framing (provided objects, optional Mermaid output) and an example, which is a baseline 3 when the schema does the heavy lifting.

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

Purpose5/5

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

Names a specific verb and resource (build a dependency graph over provided ABAP sources) and precisely defines both node and edge semantics, including edge tiers. This clearly distinguishes it from siblings like check_cloud_readiness or plan_cloud_migration.

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?

Gives explicit use cases (deciding what to migrate first, impact of a rework, finding non-released tables), names the companion tool plan_cloud_migration, and states what it is NOT (a system where-used list). 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.

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. When the call contains a .bdef.asbdef or .srvd.srvdsrv file, abap-mcp's own RAP checker also runs over the whole set and its findings are merged in under rap/ rule keys (abaplint does not deep-parse those file types, so without this they would silently produce nothing); set rapCheck:false to opt out, or call check_rap_behavior for the full structured RAP report with hints, confidence and the scope note. 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
rapCheckNoAlso run abap-mcp's own RAP behavior/service-definition checker when the call contains a .bdef.asbdef or .srvd.srvdsrv file, merging its findings under namespaced "rap/RAP026"-style rule keys. Default true — abaplint returns nothing at all for those file types. Set false for abaplint-only output (e.g. a CI that compares finding counts across versions).
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 the list was cut short — more than 500 findings, or the RAP checker hit one of its own caps.
rapCheckedYesTrue when the RAP checker ran (the call held a BDEF/SRVD and rapCheck was on); its findings carry rap/ rule keys.
rapScopeNoteNoPresent only when rapChecked is true: what the RAP checker proves and does not prove.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent/closed-world annotations: it discloses offline execution, no SAP system connection, no ATC, inability to resolve referenced objects, the semantic-check gap of the default preset, and the automatic RAP-check merge for .bdef/.srvd files with an opt-out. These are non-obvious behavioral traits an agent needs.

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

Conciseness4/5

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

Purpose and return shape are front-loaded, and most sentences carry unique information. However, it is a dense single-block wall of text mixing purpose, constraints, presets, focus, overrides, and RAP handling, which could be better partitioned for scanning.

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?

An output schema exists, so return structure needn't be re-explained, yet the description still summarizes findings. For a six-parameter tool with nested file objects it covers triggers, alternatives, preset trade-offs, the RAP merge edge case, and an example call, leaving no material gap.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all six parameters, setting a baseline of 3. The description adds real meaning on top: why preset "style" is the default, that focus is ignored under "syntax-only", how rule overrides layer onto presets and focus, and why rapCheck defaults true.

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?

States a specific verb+resource (run abaplint static analysis over ABAP/CDS/behavior-definition sources) and what it returns (rule key, message, severity, file/line/column, offending line, docs URL). It explicitly distinguishes itself from siblings by naming check_cloud_readiness and check_rap_behavior and clarifying it is not ATC.

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?

Gives an explicit trigger ("when you have written or modified ABAP code and want style and correctness feedback before it goes anywhere near a system") and routes alternatives ("For an ABAP-Cloud migration verdict use check_cloud_readiness instead"; "call check_rap_behavior for the full structured RAP report"). It also explains when each preset applies.

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

A5/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, but the description adds further transparency: it is a 'read-only catalog' that does not run analysis or alter configuration. It also describes the optional filtering behavior (free-text query or tag) and the example call. This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

The description is tightly packed: first the action, then when-to-use, then safety/exclusion, then an example. Every sentence earns its place, with no fluff or repetition of schema field names. It is front-loaded and concise for the level of detail provided.

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 has an output schema (though not shown), the description already mentions return fields. Both parameters are covered, usage guidance is explicit, and safety behavior is disclosed. For a read-only listing tool, this is fully complete—an agent can confidently select and invoke it correctly.

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

Parameters5/5

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

Schema coverage is 100%, but the description enriches param understanding by explaining 'tag' as an abaplint tag with examples and 'query' as a case-insensitive substring matched against specific fields. It also provides a concrete invocation example, which is more than the schema alone. This meaningfully aids correct parameter usage.

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 the specific verb+resource: 'List the abaplint rules this server can check'. It clearly distinguishes from siblings like lint_abap (which runs checks) and explain_abap_rule (which explains a single rule). It also enumerates the return fields (key, title, one-line description, tags, documentation URL), leaving no ambiguity about what the tool does.

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: '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 also says what it does not do: 'It does not run any analysis and does not change configuration', which clarifies when not to use it (e.g., for actually running linting). Sibling tool lint_abap is named as the alternative.

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.
editionNoSAP edition of the bundled Cloudification snapshot to check against: "s4hc" (default, SAP Cloud ERP Public Edition), "btp" (SAP BTP ABAP environment), or "pce" (SAP Cloud ERP Private Edition / on-premise). Release state and successors can differ by edition — the same object may be released in one and not yet in another.s4hc
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.8/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/no-open-world, but the description adds substantial context beyond them: it is a 'deterministic re-arrangement', it 'does not modify any code', 'does not estimate person-days', and it inherits static/parser-level/snapshot-dated limitations with ATC remaining authoritative. This tells the agent exactly what to trust and what not to expect.

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?

A single dense paragraph that is front-loaded with the core purpose and phase ordering before the usage cues and example. It is long, but nearly every clause carries distinct information (phase sequence, effort bands, limitations), with little pure padding.

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

Completeness5/5

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

For a planning tool with an output schema, the description fully frames the return structure (per-object work items with S/M/L bands, recipes, sample locations; phases with goals and exit criteria) and closes the loop on scope and limitations. Nothing needed 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 coverage is 100%, so the schema already documents files, edition, and baselineVersion, making 3 the baseline. The description adds meaning by tying baselineVersion to the 'repair-the-baseline' phase ('broken code is not migration work') and reinforcing the snapshot-dated released-API framing behind edition, so it earns a small lift above baseline.

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

Purpose5/5

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

States a specific verb+resource ('Turn ABAP sources into an ordered, phased ABAP Cloud migration backlog') and immediately distinguishes itself from the sibling it builds on: it 'runs the same dual-parse analysis as check_cloud_readiness, then arranges every blocker into per-object work items.' An agent can tell this apart from the readiness and lint tools without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit triggers ('plan the migration', 'what do we tackle first', wants a work breakdown / task backlog instead of raw findings) and names the alternative ('the natural next call after check_cloud_readiness says rework is needed'). It also states when-not by contrasting with 'raw findings' from the analysis tool.

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

scaffold_abap_ai_sdkScaffold an ABAP AI SDK (ISLM) classA
Read-onlyIdempotent

Generate one validated global ABAP class that calls the SAP Generative AI Hub through the ABAP AI SDK powered by Intelligent Scenario Lifecycle Management (ISLM) — SAP's own client library, not a third-party SDK with a similar name. Seven interaction shapes: "string" (single prompt via EXECUTE_FOR_STRING), "messages" (system/user/assistant turns plus token-count/finish-reason retrieval), "prompt-template" (CL_AIC_ISLM_PROMPT_TPL_FACTORY, never the non-existent CL_AIC_PROMPT_TEMPLATE), "function-calling" (the tool-call DO-loop, with the upstream SAP sample's undeclared-tool_calls bug fixed — the table is declared and populated before ADD_TOOL_RESULTS), "structured-output" (DEFINE_RESPONSE_FORMAT->JSON_SCHEMA->FROM_STRING), "streaming" (IF_AIC_ADT_COMPLETION_API delta loop), and "orchestration" (the separate Orchestration API, which does not yet support structured output, function calling or media input). Every generated class carries an injectable constructor seam (an OPTIONAL api parameter) so it can be unit-tested with cl_abap_testdouble instead of a live ISLM scenario; pass withUnitTest for a FOR TESTING skeleton using that seam. Generated files are round-tripped through abaplint (version Cloud, preset syntax-only) together with abap-mcp's own bundled stub declarations of the referenced IF_AIC_*/CL_AIC_*/CX_AIC_* types, labelled validated:"abaplint-syntax" — this proves the ABAP parses, not that it matches SAP's real API surface exactly. Use this when you are adding a Generative-AI-Hub call to ABAP Cloud code and want correct, cited API shapes instead of guessing class/method names from memory (a common LLM hallucination surface — e.g. inventing CL_AIC_PROMPT_TEMPLATE, or copying SAP's own buggy function-calling sample verbatim). It does NOT call any LLM, does NOT deploy or activate anything, and does NOT create the SAP_COM_0A69 communication arrangement or the Intelligent Scenario (INTS/INTM) itself — those are manual ISLM/BTP-cockpit steps returned in setupSteps that this tool has no way to perform (no SAP system, no credentials, no network). Example: scaffold_abap_ai_sdk({ "scenarioName": "ZDEMO_AI_SCENARIO", "interaction": "string" }).

ParametersJSON Schema
NameRequiredDescriptionDefault
prefixNoCustomer namespace prefix for both scenarioName and className.Z
classNameNoGenerated global class name, e.g. "ZCL_AI_TRAVEL_SUMMARY". Defaults to "<prefix>CL_AI_<INTERACTION>" when omitted; must start with the chosen prefix.
functionsNoTool/function definitions for interaction "function-calling"; ignored for every other interaction. A single illustrative demo function is generated when this is left empty.
interactionYesWhich SAP AI SDK interaction shape to generate: "string", "messages", "prompt-template", "function-calling", "structured-output", "streaming", or "orchestration" — see the tool description for what each one calls.
scenarioNameYesISLM intelligent-scenario name the generated class calls via CREATE_INSTANCE( ), e.g. "ZDEMO_AI_SCENARIO". Must start with the chosen prefix; the scenario itself must already exist, be published, deployed and activated in the target system (see setupSteps) — this tool never creates it.
withUnitTestNoAlso generate a FOR TESTING skeleton class reusing the injectable seam with cl_abap_testdouble; the skeleton asserts a TODO fail( ) until you replace it with real given/when/then logic.

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesYesThe generated class file, plus a testclasses file when withUnitTest is true.
nextStepsYesWhat to fill in or verify next, specific to the chosen interaction.
scopeNoteYesExactly what this tool does and does not do — no LLM calls, no scenario creation, no deployment, no network access.
validatedYesTop-level echo of the file-level label: syntax-checked against bundled stubs only, not SAP's real API surface.
setupStepsYesThe manual AI Core / ISLM configuration this code depends on at runtime (extended service plan, SAP_COM_0A69, INTS/INTM, F4469/F4470 deploy+activate) — this tool performs none of it.
constraintsYesDocumented limits: temperature range, per-instance parameter persistence, catchable error codes via IF_AIC_API_ERROR, ABAP Cross Trace debugging, and — for interaction "orchestration" only — the three completion-API features it does not yet support.
validationIssuesYesabaplint findings on the generated sources — empty on a clean round-trip.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that round-tripping through abaplint only proves the ABAP parses and not exact API-surface fidelity, that the constructor seam enables cl_abap_testdouble, and that manual ISLM/cockpit steps are returned in setupSteps because the tool has no SAP system, credentials, or network. No contradiction with readOnlyHint/idempotentHint/openWorldHint.

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 single dense paragraph front-loads the core action and the SDK disambiguation before the seven-shape enumeration. It is long, but nearly every clause carries substantive, non-redundant information; the length is the main cost against a 5.

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 generator with an output schema, the description covers scope, safety boundary, validation method, testing seam, and manual prerequisites, leaving nothing an agent needs in order to call it correctly unstated.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds real meaning for the interaction enum by explaining what each of the seven shapes actually calls (EXECUTE_FOR_STRING, the tool-call DO-loop, IF_AIC_ADT_COMPLETION_API, etc.) and notes that 'functions' is ignored for other interactions.

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?

States a specific verb+resource: 'Generate one validated global ABAP class that calls the SAP Generative AI Hub through the ABAP AI SDK ... ISLM.' It explicitly disambiguates from a third-party SDK with a similar name and clearly differentiates from sibling scaffolders like scaffold_rap_bo and scaffold_abap_unit.

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?

Gives explicit when-to-use ('adding a Generative-AI-Hub call to ABAP Cloud code ... instead of guessing') and when-not (no LLM call, no deploy/activate, no comm-arrangement or INTS/INTM creation). It does not route to a sibling alternative, so it stops just short of a full 5.

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).
rapFindingsYesabap-mcp's own RAP checker findings on the generated BDEF/SRVD set — empty in normal operation.
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

A4.6/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: round-trip validation of classes and CDS views through abaplint at ABAP-Cloud level, while behavior/service definitions are canonical templates rather than deeply parsed, and ADT activation is the real final check. It also discloses the scoping limit (single-entity only) and the deferral of the service binding, which the readOnlyHint/idempotentHint annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with the artifact list and the trigger condition, and the limitations and example follow in logical order. It is dense and lengthy, but every sentence (validation scope, deferred artifacts, single-entity restriction) earns its place.

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 7-parameter code-generation tool with an output schema already covering return values, the description supplies the trigger, the artifact inventory, validation guarantees, explicit non-goals, and a concrete example. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds a full worked example invocation that shows how entityName, sqlTable, keyField, fields, and draft combine in practice — meaningful semantics beyond the schema's field-by-field text.

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?

States a precise verb (Generate) and resource (complete canonical RAP managed business-object stack for one root entity), then enumerates the exact artifacts produced. An agent can distinguish it from scaffold_abap_ai_sdk, scaffold_abap_unit, or check_rap_behavior without opening any schema.

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

Usage Guidelines4/5

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

Explicitly names the triggering scenario ('starting a new RAP business object in ABAP Cloud or S/4HANA') and sets boundaries — it does not create the table or service binding, and only handles single-entity BOs, with parent-child compositions left to the caller. It does not name a competing sibling tool by name, which is the only gap.

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

search_sap_knowledgeSearch the bundled SAP knowledge baseA
Read-onlyIdempotent

Search one dated, cited knowledge bundle covering three areas: ABAP Cloud / RAP release deltas, Clean Core governance (SAP's extensibility Levels A-D, release contracts C0 to C4, the real ATC check and variant names, and the SAP/abap-atc-cr-cv-s4hc Cloudification Repository file and schema inventory), and decision cards for the SAP AI options an ABAP team can reach (SAP-ABAP-1, the Generative AI Hub orchestration API, the ABAP AI SDK powered by ISLM, Joule for Developers, SAP's official ADT MCP server, the custom code migration agent, and the community MCP ecosystem). Every hit returns its sources, a confidence flag and the full card. Use this when a question is about SAP facts rather than about a piece of source text — which Clean Core level a pattern lands in, what a C1 release contract guarantees, which ATC variant to run, whether SAP-ABAP-1 accepts a system prompt, which classes the ABAP AI SDK exposes, or what SAP's own MCP server can and cannot do. It does not connect to any SAP system, does not run ATC, does not fetch anything live, and is not a substitute for a real ATC run or for SAP's own documentation — it is a curated snapshot (curated 2026-09-10) and the target system and SAP's current documentation stay authoritative. For release-timeline questions prefer explain_abap_release; for the release state of a specific object use check_released_api; to analyze actual source text use lint_abap or check_cloud_readiness. Example: search_sap_knowledge({ "query": "sap-abap-1 system prompt" }).

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoRestrict the search: "release" (release deltas), "clean-core" (levels, contracts, ATC and repository facts), "sap-ai" (the AI decision cards), or "all" (default).
limitNoMaximum ranked cards to return, 1 to 25; defaults to 5. The SAP-AI cards are large, so keep this small.
queryYesThe question or terms to search for, e.g. "clean core level C", "release contract C1", "sap-abap-1 system prompt", "ADT MCP server tools". Names, identifiers and class names work well.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitsYesRanked cards, most relevant first.
scopeNoteYesDated-knowledge caveat to repeat to the user.
truncatedYesTrue when more cards matched than were returned.
matchCountYesHow many cards matched before the limit was applied.
curatedDateYesDate the bundled knowledge base was curated.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, but the description goes well beyond them: it states it does not connect to any SAP system, does not run ATC, fetches nothing live, is a curated snapshot dated 2026-09-10, and that the target system and SAP docs remain authoritative. It also discloses the return shape (sources, confidence flag, full card). This is exactly the extra behavioral context annotations cannot carry.

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?

Front-loaded with purpose, then usage, then exclusions, then an example call — the ordering is good and every sentence does work. The long parenthetical enumerations of card names and ATC artifacts are dense and a little bulky, which costs it a point, but they serve the routing job.

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

Completeness5/5

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

For a multi-area search tool with three params, full schema coverage, an output schema and rich annotations, the description covers scope, freshness, authority limits, exclusions and alternatives. Nothing needed to select or invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so area, limit and query are already fully documented in the schema, including the enum values and the 1-25 bound. The description adds no parameter-specific syntax or defaults beyond that, so the baseline 3 applies.

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?

States a specific verb and resource (search a dated, cited SAP knowledge bundle) and enumerates the three covered areas in enough detail that an agent knows the answer surface without opening the schema. It also explicitly distinguishes itself from factual-authority siblings by framing the tool as a curated snapshot rather than a live system.

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?

Gives an explicit usage trigger ('when a question is about SAP facts rather than about a piece of source text'), concrete example questions, and explicit negative routing to four alternatives: explain_abap_release, check_released_api, lint_abap, and check_cloud_readiness. Both the when and the when-not are stated.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.12.0
    • Changedcheck_cloud_readiness7 fields changed
      • addedInput schema / properties / edition
        Added value: +{
        +  "default": "s4hc",
        +  "description": "SAP edition of the bundled Cloudification snapshot to check against: \"s4hc\" (default, SAP Cloud ERP Public Edition), \"btp\" (SAP BTP ABAP environment), or \"pce\" (SAP Cloud ERP Private Edition / on-premise). Release state and successors can differ by edition — the same object may be released in one and not yet in another.",
        +  "enum": [
        +    "s4hc",
        +    "btp",
        +    "pce"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / cleanCoreVocabulary
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "SAP's real ATC vocabulary for released-API/Clean Core checks — see docs/atc-vocabulary.json (F04).",
        +  "properties": {
        +    "checks": {
        +      "description": "The real ATC checks behind released-API governance (name, edition, note).",
        +      "items": {},
        +      "type": "array"
        +    },
        +    "variants": {
        +      "description": "The real ATC check variants, current and deprecated-with-successor.",
        +      "items": {},
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "checks",
        +    "variants"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / edition
        Added value: +{
        +  "description": "SAP edition the released-API findings were checked against.",
        +  "enum": [
        +    "s4hc",
        +    "btp",
        +    "pce"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / grade / description
        Previous value: -"Clean 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."New value: +"Blocker-density tech-debt grade (see gradeMeaning): 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."
      • addedOutput schema / properties / gradeMeaning
        Added value: +{
        +  "const": "blocker-density",
        +  "description": "What `grade` means: a banding of blockers per file. NOT SAP's own Clean Core Level A–D (see cleanCoreVocabulary.cleanCoreLevels for those) — do not conflate the two.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / releasedApiFindings / description
        Previous value: -"Released-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."New value: +"Released-API observations from the bundled SAP Cloudification snapshot (deprecated-API usage, direct non-released table access with successor hints, and which edition/source answered each one). Informational — NOT counted in cloudBlockerCount or score."
      • changedOutput schema / required
        Previous value: -[
        -  "verdict",
        -  "score",
        -  "grade",
        -  "cloudBlockerCount",
        -  "fileCount",
        -  "categories",
        -  "brokenAtBaseline",
        -  "releasedApiFindings",
        -  "releasedApiSnapshotDate",
        -  "baselineVersion",
        -  "scopeNote"
        -]New value: +[
        +  "verdict",
        +  "score",
        +  "grade",
        +  "gradeMeaning",
        +  "cloudBlockerCount",
        +  "fileCount",
        +  "categories",
        +  "brokenAtBaseline",
        +  "releasedApiFindings",
        +  "releasedApiSnapshotDate",
        +  "edition",
        +  "baselineVersion",
        +  "scopeNote",
        +  "cleanCoreVocabulary"
        +]
    • Addedcheck_rap_behavior
    • Changedcheck_released_api8 fields changed
      • addedInput schema / properties / edition
        Added value: +{
        +  "default": "s4hc",
        +  "description": "SAP edition of the bundled Cloudification snapshot to check against: \"s4hc\" (default, SAP Cloud ERP Public Edition), \"btp\" (SAP BTP ABAP environment), or \"pce\" (SAP Cloud ERP Private Edition / on-premise). Release state and successors can differ by edition — the same object may be released in one and not yet in another.",
        +  "enum": [
        +    "s4hc",
        +    "btp",
        +    "pce"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / edition
        Added value: +{
        +  "description": "SAP edition these results were checked against.",
        +  "enum": [
        +    "s4hc",
        +    "btp",
        +    "pce"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / classification
        Added value: +{
        +  "description": "SAP's classicAPI/noAPI/internalAPI classification for this object, from objectClassifications_SAP.json, when recorded.",
        +  "enum": [
        +    "classicAPI",
        +    "noAPI",
        +    "internalAPI"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / properties / successor / description
        Previous value: -"Curated released CDS view-entity successor for a classic table, when one is known."New value: +"Released successor for a deprecated/classic object, when one is known — SAP's own, or the curated fallback (see successorSource)."
      • addedOutput schema / properties / results / items / properties / successorSource
        Added value: +{
        +  "description": "Where `successor` came from: SAP's own snapshot data, the curated table-successors fallback, or none available.",
        +  "enum": [
        +    "sap",
        +    "curated",
        +    "none"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / successors
        Added value: +{
        +  "description": "Every SAP-published successor object for this record (there can be more than one), when the snapshot carries any.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "name": {
        +        "type": "string"
        +      },
        +      "objectType": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "objectType",
        +      "name"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "name",
        -  "state",
        -  "recorded"
        -]New value: +[
        +  "name",
        +  "state",
        +  "recorded",
        +  "successorSource"
        +]
      • changedOutput schema / required
        Previous value: -[
        -  "snapshotDate",
        -  "source",
        -  "results"
        -]New value: +[
        +  "snapshotDate",
        +  "source",
        +  "edition",
        +  "results"
        +]
    • Addedexplain_abap_release
    • Addedget_abap_agent_rules
    • Changedget_object_dependencies3 fields changed
      • addedInput schema / properties / edition
        Added value: +{
        +  "default": "s4hc",
        +  "description": "SAP edition of the bundled Cloudification snapshot to check against: \"s4hc\" (default, SAP Cloud ERP Public Edition), \"btp\" (SAP BTP ABAP environment), or \"pce\" (SAP Cloud ERP Private Edition / on-premise). Release state and successors can differ by edition — the same object may be released in one and not yet in another.",
        +  "enum": [
        +    "s4hc",
        +    "btp",
        +    "pce"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / edition
        Added value: +{
        +  "description": "SAP edition the nodes' released-API states were checked against.",
        +  "enum": [
        +    "s4hc",
        +    "btp",
        +    "pce"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "nodes",
        -  "edges",
        -  "releasedApiSnapshotDate",
        -  "scopeNote"
        -]New value: +[
        +  "nodes",
        +  "edges",
        +  "releasedApiSnapshotDate",
        +  "edition",
        +  "scopeNote"
        +]
    • Changedlint_abap5 fields changed
      • addedInput schema / properties / rapCheck
        Added value: +{
        +  "default": true,
        +  "description": "Also run abap-mcp's own RAP behavior/service-definition checker when the call contains a .bdef.asbdef or .srvd.srvdsrv file, merging its findings under namespaced \"rap/RAP026\"-style rule keys. Default true — abaplint returns nothing at all for those file types. Set false for abaplint-only output (e.g. a CI that compares finding counts across versions).",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / rapChecked
        Added value: +{
        +  "description": "True when the RAP checker ran (the call held a BDEF/SRVD and rapCheck was on); its findings carry rap/ rule keys.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / rapScopeNote
        Added value: +{
        +  "description": "Present only when rapChecked is true: what the RAP checker proves and does not prove.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True if more than 500 findings existed and the list was cut."New value: +"True if the list was cut short — more than 500 findings, or the RAP checker hit one of its own caps."
      • changedOutput schema / required
        Previous value: -[
        -  "findings",
        -  "truncated",
        -  "fileCount"
        -]New value: +[
        +  "findings",
        +  "truncated",
        +  "fileCount",
        +  "rapChecked"
        +]
    • Changedplan_cloud_migration1 field changed
      • addedInput schema / properties / edition
        Added value: +{
        +  "default": "s4hc",
        +  "description": "SAP edition of the bundled Cloudification snapshot to check against: \"s4hc\" (default, SAP Cloud ERP Public Edition), \"btp\" (SAP BTP ABAP environment), or \"pce\" (SAP Cloud ERP Private Edition / on-premise). Release state and successors can differ by edition — the same object may be released in one and not yet in another.",
        +  "enum": [
        +    "s4hc",
        +    "btp",
        +    "pce"
        +  ],
        +  "type": "string"
        +}
    • Addedscaffold_abap_ai_sdk
    • Changedscaffold_rap_bo4 fields changed
      • changedOutput schema / properties / files / items / properties / validated / description
        Previous value: -"\"abaplint\" = machine-parsed at Cloud level; \"template\" = golden-tested canonical template."New value: +"\"abaplint\" = machine-parsed at Cloud level; \"rap-checker\" = parsed and rule-checked by abap-mcp's own RAP BDL/SDL checker with zero error/warning findings; \"template\" = golden-tested canonical template only (the metadata extension — nothing machine-checks it)."
      • changedOutput schema / properties / files / items / properties / validated / enum
        Previous value: -[
        -  "abaplint",
        -  "template"
        -]New value: +[
        +  "abaplint",
        +  "template",
        +  "rap-checker"
        +]
      • addedOutput schema / properties / rapFindings
        Added value: +{
        +  "description": "abap-mcp's own RAP checker findings on the generated BDEF/SRVD set — empty in normal operation.",
        +  "items": {},
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "files",
        -  "activationOrder",
        -  "nextSteps",
        -  "suggestedTableDdl",
        -  "validationIssues"
        -]New value: +[
        +  "files",
        +  "activationOrder",
        +  "nextSteps",
        +  "suggestedTableDdl",
        +  "validationIssues",
        +  "rapFindings"
        +]
    • Addedsearch_sap_knowledge
  2. 4 tool updatesv0.10.0
    • Addedfix_abap
    • Addedget_object_dependencies
    • Addedplan_cloud_migration
    • Addedscaffold_abap_unit
  3. 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

Scored across 18 tools

Disambiguation5/5

Each tool targets a distinct action+artifact: lint_abap vs check_rap_behavior vs check_cloud_readiness vs check_released_api are explicitly delineated, and the three scaffold_* tools (RAP BO, AI SDK, unit test) cover separate generation targets. The knowledge cluster (explain_abap_rule, list_abap_rules, explain_abap_release, search_sap_knowledge) is related but the descriptions add explicit routing rules ("for release-timeline questions prefer explain_abap_release"). Overlap is minimal and always resolved by the descriptions.

Naming Consistency5/5

All 18 names use consistent snake_case with a verb-led prefix (compare_, fix_, explain_, list_, format_, get_, lint_, check_, plan_, scaffold_, search_). The pattern is predictable throughout — verb_abap_noun or verb_noun — with no camelCase or stylistic mixing.

Tool Count4/5

18 tools is slightly on the heavy side, but each occupies a genuinely distinct slot in an offline ABAP development workflow (lint/format/fix, cloud assessment, migration planning, scaffolding, knowledge lookups). Nothing is redundant enough to remove, though the surface is broader than the typical 3-15 sweet spot.

Completeness4/5

The offline toolchain is unusually complete: static analysis, formatting, fixes, outline, cloud-readiness assessment, migration backlog, dependency graph, released-API lookup, RAP/BDEF checking, and scaffolding for BOs, AI-SDK classes and unit tests. Gaps are mostly intentional (no live SAP connection, no artifact CRUD — system access is deliberately delegated to a paired ADT MCP server), so the surface is cohesive for its stated offline scope.

Maintenance

ActivityActive
ResponsivenessNo issues

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
    D
    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
    72 npm
    MIT