abap-adt-mcp
Allows AI agents to read, check, write, activate, and transport ABAP code directly on SAP ABAP systems via the ABAP ADT REST API, covering the full development lifecycle without requiring SAP GUI.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@abap-adt-mcpsearch for ZCL* objects"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ABAP ADT MCP Server 设计文档
基于 ABAP ADT(ABAP Development Tools)REST API 构建的 Model Context Protocol (MCP) 服务器。 让 AI Agent(Claude Desktop / Cline / VS Code Copilot Agent / 任意 MCP 客户端)无需 SAP GUI 即可 读取、检查、编写、激活、传输 ABAP 代码,覆盖完整开发生命周期。
1. 设计定位与决策
社区已有成熟实现,本项目的定位不是重复造轮子,而是采用"AI 友好"的高层工具设计:
现有项目 | 定位 | 本项目的取舍 |
| 对 | ✅ 复用其底层库 |
| 偏向只读的高层工具(GetProgram/GetClass…) | ✅ 借鉴其"高层工具"思路 |
| AI 友好工作流、安全优先、审计日志 | ✅ 主要设计蓝本:把 lock 编排、错误翻译、只读/白名单封装进工具内部 |
结论:底层通信直接建立在业界验证的 abap-adt-api(v3.1.2)之上,
避免自己重写脆弱的 ADT REST 协议(CSRF、XML 解析、对象元数据)。
在其之上构建一层安全优先、面向 Agent 的高层工具,使 Agent 通过工具名即可理解能力,且不会留下悬空锁、不会误改 SAP 标准对象。
Related MCP server: abap-adt-mcp
2. 架构分层
┌─────────────────────────────────────────────────────────────┐
│ MCP Client (Claude / Cline / VS Code Agent / FLUJO) │
└───────────────────────────┬─────────────────────────────────┘
│ JSON-RPC over stdio
┌───────────────────────────▼─────────────────────────────────┐
│ MCP Server (this project, TypeScript) │
│ │
│ ├─ tools/read.ts 只读/检查工具 (11) │
│ ├─ tools/write.ts 写入编排工具 (4) — 仅非只读模式注册 │
│ ├─ tools/ddic.ts DDIC 创建工具 (2) — 域 / 数据元素 │
│ ├─ tools/table.ts DDIC 创建工具 (1) — 透明表 │
│ ├─ tools/package.ts DDIC 创建工具 (1) — 包 DEVC/K │
│ ├─ tools/textelements.ts 文本元素读写 (1读+1写) │
│ ├─ tools/functions.ts 函数模块读写 (2读+3写, SE37) │
│ ├─ tools/edit.ts surgical edit 工具 (1) — token 优化 │
│ ├─ tools/decisions.ts 统一 包/请求 决策(澄清 vs 直接绑定) │
│ ├─ resources/ 可浏览资源 (system info / package) │
│ ├─ adt/security.ts 安全层:只读、Z*/Y* 白名单、审计日志 │
│ ├─ adt/errors.ts 错误翻译(可行动的错误信息) │
│ └─ adt/client.ts 连接生命周期 + 每个 ADT 操作的薄封装 │
└───────────────────────────┬─────────────────────────────────┘
│ HTTPS + CSRF (abap-adt-api)
┌───────────────────────────▼─────────────────────────────────┐
│ SAP ABAP System (SICF: /sap/bc/adt 已激活, 用户具 S_DEVELOP) │
└─────────────────────────────────────────────────────────────┘关键原则(对应 MCP Builder 准则)
描述性工具名 —
adt_write_source而非tool1;Agent 靠名字选工具。Zod 类型化参数 — 每个输入都校验,可选参数有默认值。
结构化输出 — 数据返回 JSON,源码类内容返回带行号的文本。
优雅失败 — 所有工具经
safe()包裹,错误转为isError文本,服务器永不崩溃。无状态工具 — 每次调用独立;SAP 会话由单例
ADTClient维护。安全优先 — 见第 4 节。
3. 工具清单(24 个:11 只读 + 13 写入)
只读 / 检查(始终注册,含只读模式)
工具 | 说明 | 关键参数 |
| 连通性 + 会话/角色信息诊断 | — |
| 按名称模式搜索对象(支持 |
|
| 列出包(DEVCLASS)内对象 |
|
| 读取源码,支持行范围切片、行号前缀、截断保护; |
|
| 对象结构大纲;类返回每个 include 的 sourceUri + 方法/属性清单(方法级定位) |
|
| 语法检查(不锁、不写) |
|
| 列出用户传输请求 |
|
| 读 DDIC 表 / CDS 视图数据(WHERE + 行数限制) |
|
| 读程序文本元素(文本符号 / 选择文本 / 列表标题三类),支持语言覆盖 |
|
| 读函数模块(SE37):完整源码 + 解析出的参数接口(IMPORTING/EXPORTING/CHANGING/TABLES/EXCEPTIONS)。不传 |
|
| 列函数组的函数模块/包含程序:返回每个模块名、URI、描述,便于调用/读取前先发现组里有什么 |
|
写入(仅非只读模式注册)
工具 | 说明 | 关键参数 |
| AI 安全编辑编排:冲突检查 → 语法检查 → 锁 → 写 → 解锁(finally) → 可选激活 |
|
| 激活对象(含未激活部分) |
|
| 创建对象壳(无源码),返回 URI 供后续写入 |
|
| 传输请求:create / release / list |
|
| 创建开发包(DEVC/K):包必须嵌套在真实父包下并继承其父包的软件组件+传输层,故必传 |
|
| 创建 DDIC 域(DOMA):骨架 → 锁 → PUT 技术属性(类型/长度/小数) → 解锁 → 可选激活。 |
|
| 创建 DDIC 数据元素(DTEL):引用已有域,技术类型(CHAR/长度/小数)自动从域派生;骨架 → 锁 → |
|
| 创建 DDIC 透明表(TABL):ABAP 字典 DDL 源( |
|
| 写程序文本元素:锁 textelements 资源 → PUT 三类(symbols/selections/headings) → 解锁 → 激活文本池。symbols 用 |
|
| surgical edit(token 优化):Agent 只发 |
|
| 创建函数组(FUGR):在包(默认 |
|
| 创建函数模块(FUGR/FF):在已存在函数组中建模块、写源码、可选激活。源码接受经典 |
|
| 编辑已有函数模块源码(lock → write → unlock → 可选激活)。接受经典或归一化源码,自动归一化。只读模式禁用,名需匹配 Z*/Y* 前缀。首次创建请用 |
|
资源(Resources)
adt://system/info— 连接与角色信息adt://packages/{pkg}— 包内容清单(JSON)
4. 安全模型(最重要)
ABAP 系统里误改 SAP 标准对象或留下悬空锁是真实风险。本设计内建四道防线:
只读模式:
ABAP_MCP_READONLY=true时,13 个写入工具根本不注册(Agent 看不到),其余工具拒绝变更。生产系统强制只读:
ABAP_MCP_SYSTEM_ROLE=prod时,无论READONLY如何,一律只读。Z/Y 前缀白名单**:
assertPrefixAllowed()校验对象名,默认仅允许Z,Y前缀,杜绝误改 SAP 交付对象。审计日志:每次写入追加 JSON 行到
ABAP_MCP_AUDIT_LOG,含时间、工具、对象、传输号、状态。
adt_write_source 的锁编排保证 try/finally 释放锁;即使写入失败也不会留下悬空锁。
4.1 统一「包 / 请求」决策流(所有写入工具共用)
每个写入工具在创建对象前,都要先决定目标开发包与传输请求。逻辑统一由 tools/decisions.ts 的 resolvePackageInput() / resolveTransportInput() 实现,规则如下:
包(package)决策
调用方显式给了
package→ 直接绑定到该包(已大写上送)。调用方没给
package→ 工具返回一条结构化澄清(needsClarification:true、topic:"package"),列出两个动作让 Agent 转问用户:create_package— 调用adt_create_package新建一个真实包(需指定superPackage父包);该选项额外携带requiredInputs:[name, superPackage, description],提示 Agent 必须先从用户处确认这三项必填信息再调建包工具。keep_local— 落到本地包$TMP(无需传输)。
传输请求(transport)决策(同样逻辑)
调用方显式给了
transport→ 直接绑定。包是
$TMP→ 本地对象,不需要传输(resolveTransportInput返回空串,后续调用不传corrNr)。包是非
$TMP且没给transport→ 返回结构化澄清(topic:"transport"、action:create_transport),由 Agent 经adt_manage_transport(create) 建请求后回填。
设计要点:工具绝不静默默认到
$TMP或自动建包——缺参数时一律返回needsClarification,把选择权交还给用户,避免 Agent 在用户不知情的情况下把对象塞进本地包或误建包。澄清对象结构为{ needsClarification, topic, message, options:[{action,label,description,requiredInputs?}], missingFields?, tool, object }:
topic:"package"/"transport"的澄清:options列出可行动作,Agent 转述给用户、回收选择后重新调用同一工具并补上package/transport。
topic:"package_creation"的澄清(由adt_create_package自身返回):当name/superPackage/description任一缺失时返回,missingFields列出缺哪些包必填项,Agent 与用户确认后用完整参数重新调用adt_create_package。这一层保证「创建包前必与用户确认必填信息」,缺项时绝不猜测或崩溃。通用
topic:"missing_inputs"澄清(仅「重型创建」类工具保留):adt_create_function_group(需name/description)、adt_create_domain(需name/description/datatype/length)、adt_create_dataelement(需name/domain/description)、adt_create_table(需name/description/fields)——这类工具自身有多个必填项、且参数结构较复杂,缺项时返回missing_inputs澄清(missingFields列出缺什么 + 中文 label + hint),由decisions.ts的inputClarification()工厂统一生成,缺项检查在 handler 顶部、任何 SAP 调用之前完成。其余 8 个写入工具已还原为 Zod 必填校验(不再返回
missing_inputs澄清):adt_write_source、adt_activate_object、adt_create_object、adt_manage_transport、adt_create_function_module、adt_write_function_module_source、adt_write_textelements、adt_edit_source。它们的必填字段(如objectUri/source/edits/name/action等)在 Zod schema 中声明为必填,缺项时由 MCP SDK 返回标准校验错误,而非结构化澄清。其中adt_manage_transport的action=create需objectUri、action=release需transport仍由 handler 内显式throw校验(create/release 的条件性必填)。
真机验证结论(verify_packages.mjs,VERDICT: PASS):
缺包 → 返回
topic=package澄清;缺传输(非$TMP)→ 返回topic=transport澄清;$TMP路径无需传输。adt_create_package在ZRAP_TEST_192637下建包,自动继承softwareComponent=HOME、transportLayer=ZS4C。adt_create_dataelement/adt_create_domain/adt_create_table在显式transport下创建时,对象均正确绑定到该传输请求(域通过 POST/LOCK/PUT 全程带corrNr实现)。⚠️ 已知 SAP 限制:通过 ADT 创建的包(DEVC/K)因携带 SAP 自动生成的子对象,ADT 删除端点会报「仍然包含开发对象或其它包」而拒绝删除——这是 SAP 行为,非本 server 缺陷;验证脚本对包做尽力删除(不计入功能结论),残留测试包可在 SE21/SE80 手动清理。
5. 错误处理哲学
底层错误(ADT 业务异常 / 网络 / TLS / 锁冲突)被 translateError() 翻译成可让 Agent 自我纠正的中文信息,例如:
证书错误 → 提示设置
SAP_SSL_REJECT_UNAUTHORIZED=false401/403 → 提示检查账号/客户端/是否被锁
锁冲突 → 提示去 SM12 释放或重试
语法错误 → 在
adt_write_source中写前拦截并返回行号,不真正写入
6. 安装与配置
前置条件
Node.js ≥ 20(本项目用 22 验证)
一个启用了 ADT 的 SAP ABAP 系统(
SICF中/sap/bc/adt已激活,用户具S_DEVELOP)
步骤
git clone <this-repo> abap-adt-mcp && cd abap-adt-mcp
npm install
cp .env.example .env # 填入 SAP_URL / SAP_USER / SAP_PASSWORD / SAP_CLIENT
npm run build # 产出 dist/配置文件名:服务器按以下优先级加载(后者不覆盖前者已设的值):
MCP 客户端
env块中直接传入的变量(最高优先级)项目根目录的
.env项目根目录的
MCP.env(本项目的约定文件名,便于与客户端配置共存)所以把配置放在项目根的
MCP.env即可被自动加载,无需改名。
.env / MCP.env 关键项:
SAP_URL=https://s4h.example.com:44300
SAP_USER=DEVELOPER
SAP_PASSWORD=*****
SAP_CLIENT=100
SAP_SSL_REJECT_UNAUTHORIZED=true # 自签名证书开发环境设为 false
ABAP_MCP_SYSTEM_ROLE=dev # prod 会强制只读
ABAP_MCP_READONLY=false
ABAP_MCP_ALLOWED_PREFIXES=Z,Y
ABAP_MCP_AUDIT_LOG=./abap-mcp-audit.log接入 MCP 客户端(任选其一)
a) 任意客户端(npx,无需构建)
{
"mcpServers": {
"abap-adt-mcp": {
"command": "npx",
"args": ["-y", "abap-adt-mcp"],
"env": {
"SAP_URL": "https://...:44300",
"SAP_USER": "DEVELOPER",
"SAP_PASSWORD": "*****",
"SAP_CLIENT": "100"
}
}
}
}b) 本地构建后(stdio)
{
"mcpServers": {
"abap-adt-mcp": {
"command": "node",
"args": ["/绝对路径/abap-adt-mcp/dist/index.js"],
"env": { "SAP_URL": "...", "SAP_USER": "...", "SAP_PASSWORD": "...", "SAP_CLIENT": "100" }
}
}
}调试可用:
npm run inspect启动官方 MCP Inspector。
7. 端到端使用示例
你: 读取 ZCL_INVOICE 的源码并加一个方法,然后激活。
Agent 内部流程:
1. adt_search_objects query="ZCL_INVOICE" → 拿到 objectUri
2. adt_read_source objectUri=... → 当前源码
3. adt_syntax_check source=<新源码> → 预校验(写前拦截错误)
4. adt_write_source objectUri=... source=<新> activate=true
内部: 解析传输 → 语法检查 → lock → setObjectSource → unlock(finally) → activate
5. 返回 { written:true, transport:"NPLK900123", activated:true, success:true }8. AI Token 优化
三类策略降低 Agent 与 SAP 交互时的 token 开销(对标 VSP 的方法级手术 + 上下文压缩):
8.1 Surgical edit(写入侧,adt_edit_source)
Agent 只发 {oldString, newString} 改动片段,不发整个对象源码。工具内部读当前源码 → 逐个替换(要求 oldString 唯一匹配,否则报错并提示加上下文消歧)→ 走 lock/write/unlock/activate 编排。对 2000 行类改一个 5 行方法,请求载荷省 90%+。
8.2 方法级读取定位(读取侧,adt_get_object_structure 增强)
对类返回每个 include(definitions/implementations/main/testclasses)的 sourceUri + 方法/属性清单(name + visibility)。Agent 拿到 include sourceUri 后用 adt_read_source 只读单个 include(如只读实现部分),配合行范围切片定位到具体方法,避免读整个类。
8.3 源码压缩 prologue(读取侧,adt_read_source 的 attachContext)
attachContext=true 时,解析源码中 TYPE/LIKE 引用的 DDIC 对象名(排除 ABAP 内置类型),逐个查 domain/data element 端点取一行摘要(NAME DATATYPE(LENGTH)),附加为 prologue。上限 12 个对象,避免过多调用。Agent 一次读源码即可获得所有引用类型的概要,省去逐个查 DDIC 的往返。
9. 扩展点
ATC 质量门禁:调用
abap-adt-api的 ATC 接口,在adt_write_source中加一道run_atc_check。单元测试:
runUnitTest(url)接入adt_activate_object之后的 CI 流。BTP OAuth2 + PKCE:
abap-adt-api支持传入BearerFetcher,可替换账号密码登录(参考@abapify/adt-cli的 service-key 流程)。Streamable HTTP:用 FLUJO 或
mcp-proxy把 stdio 服务暴露为 HTTP,供远程 Agent 调用。Git/abapGit:
abap-adt-api已支持gitRepos / stageRepo / pushRepo,可加adt_git_*工具。
10. 目录结构
abap-adt-mcp/
├─ package.json
├─ tsconfig.json
├─ .env.example
├─ README.md
└─ src/
├─ index.ts # 入口:建 McpServer、注册、连接 stdio
├─ config.ts # 环境变量 + 安全默认值
├─ adt/
│ ├─ client.ts # ADTClient 单例 + 每操作封装
│ ├─ errors.ts # 错误翻译
│ └─ security.ts # 只读/白名单/审计
├─ tools/
│ ├─ index.ts # 聚合注册(按只读模式决定写入工具)
│ ├─ read.ts # 11 个只读工具(含 attachContext prologue + 方法级定位增强)
│ ├─ write.ts # 4 个写入工具(含 lock 编排)
│ ├─ ddic.ts # 2 个 DDIC 创建工具(域 / 数据元素)
│ ├─ table.ts # 1 个 DDIC 创建工具(透明表)
│ ├─ package.ts # 1 个 DDIC 创建工具(包 DEVC/K,含父包属性继承)
│ ├─ textelements.ts # 文本元素读写(adt_read_textelements + adt_write_textelements)
│ ├─ edit.ts # surgical edit 工具(adt_edit_source, token 优化)
│ ├─ decisions.ts # 统一 包/请求 决策(resolvePackageInput / resolveTransportInput + 澄清结构)
│ ├─ util.ts # safe() / textResult / jsonResult 公共工具
│ └─ util.ts # 结果格式化 + safe() 包裹
└─ resources/
└─ index.ts # system info / package 资源10. 验证状态
✅
npm run build通过(TypeScript 严格模式,零错误)✅ stdio 冒烟测试通过:MCP
initialize→tools/list返回 24 个工具(11 只读 + 13 写入);adt_ping在未配置 SAP 时返回isError而非崩溃✅ 真实 S/4HANA 联调:
adt_create_dataelement创建引用YTEST_192637的数据元素成功并激活(datatype=CHAR, length=11);存在性守卫与坏域守卫均优雅报错✅ 真实 S/4HANA 联调(函数模块):
verify_functions.mjs全绿(VERDICT: PASS)——读BAPI_USER_GET_DETAIL(44 参数)、列ZAIRFC_TOOLS(5 模块)、建组ZFMCPV2_192637并激活、建模块ZFMCPV2_FM(经典含"*注释块源码被自动归一化并激活)、读回解析出IV_NAME/EV_GREETING、编辑加CHANGING CV_COUNTER并激活、清理删除成功。关键结论:ADT 拒绝经典FUNCTION z_fm.尾点形式与"*Local Interface 注释块,本 server 的normalizeFmSource()已将其转换/重写为 ADT 接受的function name+ 小写接口块 + 独立.+endfunction.形式✅ 真实 S/4HANA 联调(统一包/请求决策流):
verify_packages.mjs功能全绿(FUNCTIONAL VERDICT: PASS)——24 工具齐全且含adt_create_package;缺包→返回topic=package澄清、缺传输(非$TMP)→返回topic=transport澄清、$TMP路径无需传输;adt_create_package缺必填项时返回topic=package_creation澄清并列出missingFields(name/superPackage/description),创建包前必与用户确认必填信息;adt_create_package在ZRAP_TEST_192637下建包继承HOME/ZS4C;adt_create_dataelement/adt_create_domain/adt_create_table在显式transport下均正确绑定该请求。清理阶段子对象可正常删除,包本身因 SAP「自动子对象」限制无法经 ADT 删除(已知限制,不计入功能结论)
11. 部署到其他电脑(便携分发)
本服务器源码可移植:config.ts 用 fileURLToPath(import.meta.url) 解析项目根绝对路径读取凭证,不依赖启动时的 cwd,因此放到任意目录、任意电脑都能自定位。跨机器只需处理三件事:依赖、路径、凭证。
一键打包脚本 deploy.bat(推荐,零手敲命令)
仓库根目录已提供 deploy.bat,双击或命令行运行即可自动完成「重建 dist → 打包为 abap-adt-mcp-dist.zip」,且自动排除凭证与日志(MCP.env / .env / *.log / *.err / *.mjs),保留 node_modules/ + dist/,对方免装免构建。
deploy.bat :: 在本机项目根目录运行;产物 abap-adt-mcp-dist.zip 自动生成实现要点:用 %~dp0 自定位项目根(不硬编码路径),robocopy /XF 排除敏感文件后 Compress-Archive 压缩,兼容老版本 PowerShell(不依赖 -Exclude 参数)。对方拿到 zip 后从下方「方式 A 第 2 步」继续即可。
方式 A:零安装便携包(推荐给同事,最直接)
打包:在本机把整个项目目录压缩,排除
MCP.env和*.log(含真实密码,切勿外传)。已带的node_modules/(≈54M) 和dist/让对方免安装、免构建。# Git Bash / PowerShell zip -r abap-adt-mcp.zip abap-adt-mcp -x "abap-adt-mcp/MCP.env" -x "*.log"对方解压到任意目录,例如
D:/tools/abap-adt-mcp。填凭证:复制
.env.example为MCP.env,填入对方自己的 SAP 账号:cp .env.example MCP.env # 编辑 MCP.env,填 SAP_URL/SAP_USER/SAP_PASSWORD/SAP_CLIENT加 MCP 配置:在对方机器的
~/.workbuddy/mcp.json(或其他客户端配置)加:{ "mcpServers": { "abap-adt-mcp": { "command": "node", "args": ["D:/tools/abap-adt-mcp/dist/index.js"], "cwd": "D:/tools/abap-adt-mcp", "env": { "ABAP_MCP_READONLY": "false" } } } }command用node(要求对方node在 PATH,Node ≥ 20);若想彻底免装 node,把node.exe也放进包、command指向./node.exe。必须把路径改成对方机器上的实际位置(本项目
mcp.json里硬编码的绝对路径在别的电脑不存在)。凭证不必写进
env——服务器会自动读项目根下的MCP.env。
启用:在 WorkBuddy 连接器管理页右上角「自定义连接器」点新 server 的 Trust。
方式 B:源码分发(目标机自行安装,包体最小)
对方拿到 src/ + package.json + .env.example,然后:
cd abap-adt-mcp
npm install # 拉取依赖
npm run build # 产出 dist/
cp .env.example MCP.env # 填凭证之后同方式 A 第 4–5 步配置并 Trust。
其他 MCP 客户端
配置结构相同,只是文件位置不同:
Claude Desktop:
%APPDATA%/Claude/claude_desktop_config.jsonCursor / VS Code:对应
mcp.jsonnpx 一行版(无需本地构建,但每次拉包):
{ "mcpServers": { "abap-adt-mcp": { "command": "npx", "args": ["-y", "abap-adt-mcp"], "env": { "SAP_URL":"...", "SAP_USER":"...", "SAP_PASSWORD":"...", "SAP_CLIENT":"100" } } } }
安全提醒
永远不要分发
MCP.env:它含明文 SAP 密码。用.env.example作模板,让每台机器填自己的凭证。生产系统把
ABAP_MCP_SYSTEM_ROLE=prod(强制只读)或ABAP_MCP_READONLY=true,写工具会被隐藏且拒绝变更。
Available Tools
24 toolsadt_activate_objectA
Activate an ABAP object (and its inactive parts). Use after adt_write_source with activate=false, or to activate a manually edited object. Blocked in read-only mode.
| Name | Required | Description | Default |
|---|---|---|---|
| objectUri | Yes | Object URI (base) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses the core action (activation including inactive parts) and the read-only restriction. However, it lacks details on side effects or error states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no waste, front-loaded with the action and essential usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers what it does, when to use, and a key restriction. It is adequate but does not explain return values or nuances of 'inactive parts'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description does not add extra meaning to the objectUri parameter beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Activate an ABAP object' and distinguishes it from siblings by specifying usage after adt_write_source or manual editing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('after adt_write_source with activate=false, or to activate a manually edited object') and when not ('Blocked in read-only mode').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_browse_packageA
List the objects contained in an ABAP package (DEVCLASS), e.g. ZMY_PKG. Returns object type, name and URI for each child.
| Name | Required | Description | Default |
|---|---|---|---|
| package | Yes | Package/DEVCLASS name, e.g. ZMY_PKG |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It mentions what is returned but does not specify read-only nature, error conditions, or side effects. This is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence immediately stating the purpose, followed by a brief note on return values. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers the main purpose and returns. It could mention read-only nature or whether subpackages are included, but it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds only a simple example (e.g., ZMY_PKG) which does not significantly enhance the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (list), resource (objects in an ABAP package), and return values (object type, name, URI). It is specific and differentiates from sibling tools like adt_create_package.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (list objects in a package) but does not explicitly state when to use this tool vs alternatives like adt_get_object_structure or adt_search_objects. No when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_create_dataelementA
Create a DDIC data element (DTEL) that references an existing domain. The technical type (CHAR/length/decimals) is derived automatically from the referenced domain. Field-label lengths default to short 10 / medium 20 / long 40 / heading 55; a longer supplied label uses its actual length. Created in the given package (default $TMP, local/no transport) and optionally activated. Name must match Z*/Y* prefix. Returns the object URI, referenced domain, derived type and activation status.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Data element name, e.g. YTESTDE_192637. Must match Z*/Y* prefix. | |
| domain | No | Existing domain to reference, e.g. YTEST_192637. | |
| package | No | Target devclass. Omit to be asked (create new package | use $TMP). | |
| activate | No | Activate after creation. Default true. | |
| longLabel | No | Long field label. Default length 40; a longer supplied text keeps its actual length. Defaults to description. | |
| transport | No | Transport request. Omit + non-$TMP package -> asked to create one. | |
| shortLabel | No | Short field label. Default length 10; a longer supplied text keeps its actual length. Defaults to description. | |
| description | No | Short text / description, e.g. 'AI测试用数据元素'. | |
| mediumLabel | No | Medium field label. Default length 20; a longer supplied text keeps its actual length. Defaults to description. | |
| headingLabel | No | Heading label. Default length 55; text keeps its actual length (SAP cap). Defaults to description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description effectively discloses key behaviors: type derivation, label length handling, package and activation defaults, and return values. It does not cover error scenarios or authentication, but the core behavioral traits are well explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense paragraph that efficiently conveys purpose, behavior, and key parameter nuances. It is front-loaded with the core action and follows with relevant details. While not structured with bullet points, it remains concise and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (10 parameters, no output schema, no annotations), the description covers purpose, behavioral details, label defaults, return values, and naming constraints. Missing are explicit error conditions and prerequisites (e.g., domain existence), but the overall completeness is high.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the baseline is 3. The description adds valuable context beyond schema descriptions, particularly the default label lengths and behavior when longer labels are supplied. This helps an agent understand parameter constraints without relying solely on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'create', the resource 'DDIC data element (DTEL)', and key differentiators like referencing an existing domain and automatic type derivation. It distinguishes well from sibling tools like adt_create_domain by specifying the reliance on a pre-existing domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when needing a data element based on a domain, mentioning the package default ($TMP) and naming convention. It lacks an explicit statement of when not to use or direct comparison to alternatives, but the context is sufficiently clear for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_create_domainA
Create a DDIC domain (DOMA) with a technical type (CHAR/NUMC/DEC/...), length and decimals. The domain is created in the given package (default $TMP, local/no transport) and optionally activated. Name must match the allowed Z*/Y* prefix. Returns the object URI and activation status.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Domain name, e.g. YTEST_192637. Must match Z*/Y* prefix. | |
| length | No | Field length (number of characters/positions). | |
| package | No | Target devclass. Omit to be asked (create new package | use $TMP). | |
| activate | No | Activate after creation. Default true. | |
| datatype | No | ABAP elementary data type. | |
| decimals | No | Decimal places (DEC/CURR/QUAN/FLTP only). Default 0. | |
| transport | No | Transport request. Omit + non-$TMP package -> asked to create one. | |
| description | No | Short text / description, e.g. 'AI测试用'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses key behaviors: creation in a package (default $TMP), optional activation, naming constraints, and return of object URI and activation status. It does not cover auth or rate limits, but for a creation tool this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences front-loading the main action, concise with no filler. Every sentence provides essential information (purpose, parameters, constraints, return values).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters and no output schema, the description covers creation, defaults, naming, activation, and return values. It does not explain error handling or side effects, but is adequate for selecting and using the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context like 'default $TMP' and 'local/no transport' and clarifies activation is optional, but largely rephrases schema descriptions. It adds moderate value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates a DDIC domain with specific technical attributes (type, length, decimals) and mentions the naming constraint (Z*/Y* prefix). This distinguishes it from sibling tools like adt_create_dataelement or adt_create_table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but does not explicitly indicate when to use it versus alternatives or provide exclusion criteria. The context is implied through the object name (domain), but no direct guidance on selecting this tool over siblings like adt_create_dataelement or adt_create_table.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_create_function_groupA
Create a function group (FUGR) in a package (default $TMP, local/no transport) and optionally activate it. Function modules must live inside a function group, so create this first. Name must match the Z*/Y* prefix. Returns the group URI and activation status.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Function group name, e.g. ZMY_GROUP. Must match Z*/Y* prefix. | |
| package | No | Target devclass. Omit to be asked (create new package | use $TMP). | |
| activate | No | Activate after creation. Default true. | |
| transport | No | Transport request. Omit + non-$TMP package -> asked to create one. | |
| description | No | Short text / description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states that the tool creates a function group, optionally activates it, and returns the group URI and activation status. However, it does not disclose side effects (e.g., overwriting existing groups), permissions needed, or what happens if the name already exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each providing essential information: main action, prerequisite, naming constraint, and output. No unnecessary words. It is front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, no output schema, and no annotations, the description covers most key aspects: action, naming, default package, activation, output. It could be more explicit about the transport behavior (e.g., 'if omitted and package is $TMP, no transport; otherwise you'll be asked'), but the schema already provides this detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by clarifying the default behavior for package ($TMP, local/no transport) and indicating output (URI and activation status). It reinforces the naming constraint already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a function group (FUGR) in a package' and mentions activation. It distinguishes from sibling tools by specifying that function modules must live inside a function group, establishing this as a prerequisite for other operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage context by noting the naming convention (Z*/Y* prefix) and the default package ($TMP, local/no transport). It advises that this tool should be used before creating function modules. However, it does not explicitly state when not to use this tool or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_create_function_moduleA
Create a function module (FUGR/FF) inside an existing function group, write its source and optionally activate it. The function group must already exist (create it first with adt_create_function_group). Provide the full FM source in either the classic FUNCTION z_fm. ... ENDFUNCTION. form (with or without the "* Local Interface comment block) or the normalized form — it is auto-normalized to what ADT accepts. Name must match the Z*/Y* prefix. Returns the FM URI, activation status and the normalized source that was written.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Function module name, e.g. ZMY_FM. Must match Z*/Y* prefix. | |
| source | Yes | Full function module ABAP source (FUNCTION ... ENDFUNCTION). | |
| activate | No | Activate after writing. Default true. | |
| transport | No | Transport request. Omit + non-$TMP group package -> asked to create one. | |
| description | Yes | Short text / description. | |
| functionGroup | Yes | Existing function group, e.g. ZMY_GROUP. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that the tool writes source, optionally activates, auto-normalizes source, and returns URI, activation status, and normalized source. It mentions transport handling. Lacks details on error handling or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and precondition. Every sentence adds essential information without fluff. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description covers purpose, precondition, source format, return info (URI, activation status, normalized source), and transport handling. It lacks detailed error scenarios but is mostly complete for a create tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds value by clarifying the auto-normalization of source and the two accepted forms (classic with/without local interface), and that activation defaults to true. This enhances understanding beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool creates a function module inside an existing function group, writes its source, and optionally activates it. It distinguishes from sibling tools like adt_create_function_group by explicitly requiring the function group to already exist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says the function group must exist and should be created with adt_create_function_group. It also specifies that the name must match a Z*/Y* prefix. It does not explicitly state when not to use this tool, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_create_objectA
Create a new ABAP object shell (no source yet) in a package (default $TMP). Returns the new object's URI so you can follow up with adt_write_source. Name must match the Z*/Y* prefix whitelist.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New object name, e.g. ZCL_MY_CLASS | |
| package | No | Target package / DEVCLASS. Omit to be asked (create new package | use $TMP). | |
| transport | No | Transport request for the creation. Omit + non-$TMP package -> asked to create one. | |
| objectType | Yes | Creatable type id, e.g. CLAS, PROG, INTF, FUGR, TABL, DTEL | |
| description | No | Created via ABAP ADT MCP |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, but description discloses that the object is created without source, returns URI, and names must match prefix. It does not mention authorization needs, rate limits, or side effects like transport request creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with verb and resource. Every sentence adds essential information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers creation intent, follow-up step, naming rules, and default package. Lacks details on transport handling or error scenarios, but sufficient for a shell creation tool with a clear output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds value beyond schema by stating default package ($TMP), required name prefix (Z*/Y*), and return URI. Schema coverage is 80%, but the description enriches the meaning of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (create an ABAP object shell), the resource (object in a package), the outcome (returns URI), and adds a constraint (name prefix whitelist). It distinguishes from siblings like adt_write_source and other create tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to follow up with adt_write_source, indicating a two-step workflow. Lacks explicit when-not-to-use or alternative tools, but the purpose is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_create_packageA
Create a development package (DEVC/K). A package must nest under an existing parent package and inherit that parent's software component + transport layer, so pass superPackage (a real customer package, e.g. ZRAP_TEST_192637 — NOT $TMP). softwareComponent/transportLayer are derived from the parent automatically; pass them explicitly only to override. Name must match the Z*/Y* prefix. Returns the package URI and the resolved attributes. NOTE: this is the 'create package' branch of the package/transport decision flow — use it when a write tool returns a package clarification.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Package (devclass) name, e.g. ZMY_PKG. Must match Z*/Y* prefix. REQUIRED — if omitted, the tool returns a clarification listing what to collect from the user. | |
| transport | No | Transport request for the creation (parent is non-$TMP, so usually required). | |
| description | No | Short text / description. REQUIRED. | |
| packageType | No | Package type. Default 'development'. | |
| superPackage | No | Parent package to nest under, e.g. ZRAP_TEST_192637. Must be a real package (not $TMP); its softwareComponent/transportLayer are inherited. REQUIRED. | |
| transportLayer | No | Override transport layer (e.g. ZS4C). Default: inherited from superPackage. | |
| softwareComponent | No | Override software component (e.g. HOME). Default: inherited from superPackage. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses nesting inheritance, automatic derivation of software component/transport layer, option to override, and return value (URI + resolved attributes). No mention of destructive behavior or auth, but appropriate for a create tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Approximately 5 sentences, well-structured with main action first, then constraints, then parameter clarifications. Slightly dense but not overly verbose; a minor simplification could improve conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description explains return value. All 7 parameters are covered with context. Sibling tools are diverse (ABAP development), and this description clearly differentiates the package creation step. Complete for agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3). Description adds meaning beyond schema: clarifies superPackage must be real, softwareComponent/transportLayer inheritance, and naming prefix requirement. This adds value for agent understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a development package (DEVC/K) with specific verb 'Create' and resource 'development package'. It distinguishes from siblings by referencing the 'package/transport decision flow' and specifying it's the 'create package' branch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance on when to use: when a write tool returns a package clarification. Provides constraints: parent must be real (not $TMP), naming prefix Z*/Y*, and clarifies inheritance and override conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_create_tableA
Create a DDIC transparent table (TABL) using ABAP Dictionary DDL. Each field references a data element (e.g. MANDT, YTSTDE2_192637) or a built-in type (CHAR/NUMC/DEC/CURR/QUAN/INT4/DATS/TIMS/... with optional length/decimals). Technical attributes use SAP-recommended defaults (enhancement category, delivery class, data maintenance). By default a key MANDT field (data element MANDT, foreign key to check table T000) is auto-prepended as the first key; disable via autoClient=false or supply your own MANDT. Fields may carry a foreignKey. Created in the given package (default $TMP, local/no transport) and optionally activated. Name must match Z*/Y* prefix. Returns the object URI, field count, the generated DDL source and activation status.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Table name, e.g. YTSTTBL_192637. Must match Z*/Y* prefix. ADT create limit is 16 chars. | |
| fields | No | Table fields (at least one; transparent tables need >=1 key field). Each field may carry a 'foreignKey' (checkTable, optional keyType/cardinality/label/screenCheck) to emit a `with foreign key` clause. | |
| package | No | Target devclass. Omit to be asked (create new package | use $TMP). | |
| activate | No | Activate after creation. Default true. | |
| transport | No | Transport request. Omit + non-$TMP package -> asked to create one. | |
| autoClient | No | Auto-prepend the client field MANDT (data element MANDT, foreign key to check table T000) as the first key. Default true. Set false to omit it or to supply your own MANDT. | |
| description | No | Table description, e.g. 'AI测试用透明表'. | |
| deliveryClass | No | Delivery class. A=application table (default), C=customizing, G=customizing+custom, L=transaction data, S=system table, E=control table, W=system copy, X=handover. | |
| dataMaintenance | No | Data maintenance allowed in SM30/SE16. Default ALLOWED. | |
| enhancementCategory | No | Enhancement category. Default NOT_EXTENSIBLE for data-element-only tables; auto-upgraded to EXTENSIBLE_ANY when the table uses built-in types. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full disclosure burden. It transparently discloses auto-prepend of MANDT, default technical attributes (delivery class, enhancement category), field foreign key support, and naming constraints. Minor omissions around error handling and side effects are acceptable for a creation tool of this complexity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single coherent paragraph that front-loads the primary action and progressively adds details. Every sentence adds value, covering core functionality, defaults, exceptions (autoClient), constraints, and return values. No redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 parameters, no output schema), the description is remarkably complete. It explains the creation process, field types, foreign keys, default behaviors, naming rules, optional activation, and return information (URI, field count, DDL source, activation status). Only minor details like error scenarios are omitted, which is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds significant value beyond the schema by explaining autoClient behavior ('Auto-prepend... disable via autoClient=false'), naming convention, and default technical attributes. This extra context compensates well for the schema's already complete descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Create a DDIC transparent table (TABL) using ABAP Dictionary DDL' – a specific verb and resource, distinguishing it from siblings like adt_create_domain and adt_create_dataelement. It also clarifies key behaviors such as auto-prepending MANDT and naming constraints, leaving no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool (creating transparent tables) and covers default behaviors (auto-client, package, activation), naming requirements (Z*/Y* prefix), and optional features. While it does not explicitly list when not to use or compare with siblings, the detail is sufficient for appropriate selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_edit_sourceA
AI-token-optimised precise edit of an ABAP object. Send only the fragments to change as {oldString, newString} pairs; the tool reads the current source, applies each replacement (oldString must match exactly once), then runs lock -> write -> unlock -> optional activate. Use this instead of adt_write_source when you only need to change a few spots — it can cut the request payload by ~90%+ for large objects. Each oldString must be unique; if not, include more surrounding context to disambiguate. Blocked in read-only mode; object name must match the Z*/Y* prefix whitelist.
| Name | Required | Description | Default |
|---|---|---|---|
| edits | Yes | One or more {oldString, newString} replacements, applied in order | |
| activate | No | Activate after writing | |
| objectUri | Yes | Object URI (base, not .../source/main) | |
| transport | No | Existing transport request; if omitted, one is auto-created | |
| description | No | Transport description when auto-creating | Edited via ABAP ADT MCP |
| syntaxCheck | No | Run syntax check before writing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the process: reads source, applies replacements, lock->write->unlock->optional activate. Mentions blocked in read-only mode and whitelist. Lacks error handling details but is quite transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Efficient description: one sentence for purpose, one for key benefit, two for constraints and process. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations or output schema, the description covers purpose, usage, behavior, and parameters well. Missing error scenarios or return value, but overall adequate for an edit tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description adds context: explains oldString uniqueness requirement, deletion via empty newString, and sequential application. Provides meaningful usage guidance beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'precise edit of an ABAP object'. Distinguishes from sibling adt_write_source by noting it is more efficient for few changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (instead of adt_write_source for few changes) and constraints (oldString must be unique, blocked in read-only mode, Z*/Y* prefix whitelist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_get_object_structureA
Get the structure/outline of an ABAP object (methods, attributes, includes, metadata). For classes, returns each include's sourceUri (definitions/implementations/main/testclasses) and the method/attribute outline (name + visibility). Use the include sourceUri with adt_read_source to read a single include, and the method names to request method-level edits. This is the token-optimised entry point for navigating large objects without reading their full source.
| Name | Required | Description | Default |
|---|---|---|---|
| objectUri | Yes | Object URI from adt_search_objects |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Describes what it returns (includes sourceUri, method/attribute outline with name+visibility) and that it's token-optimized, but does not explicitly state it is read-only or disclose any side effects, permissions, or rate limits. Adequate but not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four well-structured sentences: purpose, return content, usage guidance, strategic positioning. No redundant words, each sentence adds value. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description compensates by detailing the return structure (includes sourceUri, method/attribute outline with name+visibility). Connects to sibling tools for next steps. Could specify more about the outline format, but overall complete for navigating large objects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (objectUri) with schema description 'Object URI from adt_search_objects'. Schema coverage is 100%, but description adds context by specifying the source of the URI, which helps the agent understand how to obtain it. Baseline 3 with added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it gets the structure/outline of an ABAP object, listing specific components (methods, attributes, includes, metadata). It distinguishes from sibling tools like adt_read_source (full source) and adt_search_objects, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using the include sourceUri with adt_read_source for reading includes and method names for edits. Positions itself as a token-optimized entry point for navigating large objects, implicitly telling when to use it (to avoid full source reads). Lacks explicit when-not-to-use conditions but provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_get_table_dataA
Read rows from a DDIC table or CDS view (read-only). Supports an optional WHERE clause and a row limit. Values are decoded to human-readable form.
| Name | Required | Description | Default |
|---|---|---|---|
| where | No | Optional SQL WHERE clause, e.g. SPRSL = 'E' AND ARBGB = '00' | |
| entity | Yes | DDIC table or CDS view name, e.g. T100 or ZI_SALES | |
| maxRows | No | Row limit (1-1000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It states the tool is read-only and that values are decoded to human-readable form, which are key behavioral traits. It does not mention performance, timeouts, or error handling, but these are less critical for a simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero wasted words. The first sentence front-loads the primary purpose and read-only nature. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity and full schema coverage, the description adequately covers behavior (read-only, decoding) and options (WHERE, limit). No output schema needed. Could mention that the entity is required, but that is in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters with descriptions. The description adds no new semantic information beyond summarizing the where clause and row limit, which are already clear from the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Read rows from a DDIC table or CDS view (read-only)', specifying the verb (Read), resource (DDIC table or CDS view), and the read-only nature. This distinguishes it from sibling tools that handle activation, creation, or transport management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for reading table data without side effects, but lacks explicit when-to-use or when-not-to-use guidance. It does not mention alternatives among siblings, though the read-only hint provides context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_list_function_groupA
List the function modules (and includes) contained in a function group (SE37). Returns each module's name, URI and description. Useful for discovering what a group offers before calling/reading a module.
| Name | Required | Description | Default |
|---|---|---|---|
| functionGroup | Yes | Function group name, e.g. ZAIRFC_TOOLS |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes the operation as listing and returning data, implicitly safe, but does not explicitly state it is read-only or mention any constraints like authorization or rate limits. Adequate but could be more explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first sentence states action and output, second provides usage context. No unnecessary words, front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with one parameter, the description adequately explains what the tool does, what it returns, and when to use it. No output schema, but return values are described. Slightly more detail on potential limitations (e.g., if large groups) could be added.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (functionGroup) with 100% schema coverage already describing it as a function group name. The description reinforces that the parameter is the group to list, but adds minimal new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool lists function modules and includes in a function group, with specific verb 'list' and resource 'function modules'. It also mentions returning name, URI, and description, distinguishing it from siblings like adt_read_function_module.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states it is useful for discovering what a group offers before calling/reading a module, giving clear when-to-use context. However, it does not list alternatives or exclusions, which would improve guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_list_transportsA
List open transport requests owned by a user, split into workbench and customizing targets (modifiable / released).
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | SAP user to list transports for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral traits. It only states the action without mentioning side effects, permissions, or read-only nature. Minimal behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that efficiently conveys the core purpose and output categorization. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema and annotations, the description provides reasonable context (split into categories) but lacks details on output format or what 'open transport requests' entails. Adequate for a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter 'user' has a description. The tool description adds that it lists transports 'owned by a user', which aligns with the schema but does not add significant new meaning. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists open transport requests owned by a user, with a specific split into workbench/customizing targets and modifiable/released status. This distinguishes it from siblings like adt_manage_transport which likely manages transports.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (to list transports for a user) but does not explicitly state when not to use or provide alternatives among sibling tools. No comparative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_manage_transportB
Transport request operations: create a new request, release one, or list a user's requests. Blocked in read-only mode.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | User for 'list' | |
| action | Yes | Operation to perform | |
| objectUri | No | Object URI (required for 'create' to resolve the package) | |
| transport | No | Transport number for 'release' | |
| description | No | Text for 'create' | Created via ABAP ADT MCP |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses read-only mode blocking, but no annotations exist, so description carries burden. Does not explain side effects (e.g., release implications), but the actions are straightforward.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with no wasted words. Efficiently covers purpose and a key constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no description of return values. Lacks information on what each action returns (e.g., list returns transport numbers, create returns new request ID).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3 applies. Description adds no extra meaning beyond schema descriptions for each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Transport request operations' and lists three specific actions (create, release, list), distinguishing it from sibling tools like adt_list_transports which only lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. Only mentions 'Blocked in read-only mode' as a constraint, but no comparison with sibling tools or prerequisite context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_pingA
Test connectivity to the SAP ABAP system and report session/role info. Call this first to verify the MCP server can reach SAP via ADT.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must disclose behavior. It accurately describes the tool as a connectivity test that reports session/role info, implying no destructive side effects. However, it could mention potential errors or timeout behavior, but for a simple ping, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise, front-loaded sentences with no unnecessary words. Every sentence adds value: the first defines the action, the second provides usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, the description is sufficiently complete. It explains the tool's purpose and when to use it. Minor gap: it doesn't specify the format of the session/role info, but that's acceptable for a connectivity test.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so schema coverage is 100%. The description doesn't need to add parameter details. The baseline for zero parameters is 4, and the description meets that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Test connectivity' and 'report session/role info'. This is a specific verb+resource combination that distinguishes it from sibling tools like adt_search_objects or adt_read_source, which are about SAP object operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Call this first to verify the MCP server can reach SAP via ADT.' This tells the agent when to use it (as an initial check) and implies it's a prerequisite for other ADT operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_read_function_moduleA
Read a function module (SE37): its full source and its parsed parameter interface (IMPORTING / EXPORTING / CHANGING / TABLES / EXCEPTIONS). Optionally pass functionGroup to skip the lookup; otherwise the group is resolved from a repository search. Returns the normalized source (which you can edit and feed back to adt_write_function_module_source) plus a structured 'parameters' array for reasoning about the signature.
| Name | Required | Description | Default |
|---|---|---|---|
| functionGroup | No | Owning function group, e.g. ZAIRFC_TOOLS. Omit to auto-resolve via search. | |
| functionModule | Yes | Function module name, e.g. ZRFC_CREATE_CLASS |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions read operation and return of source and parameters, but does not disclose error handling, prerequisites, permissions, or side effects. Basic transparency but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the core purpose, and contains no unnecessary words. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's relative simplicity (2 params, no output schema), the description covers the key outputs (source, parameters) and notes the write tool for editing. However, it does not detail the structure of the parameters array or error handling, which may be needed for agent reasoning.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3). The description adds meaning for functionGroup by explaining it can be omitted for auto-resolution, which goes beyond the schema description. For functionModule, no extra semantic value is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it reads a function module, including full source and parsed parameter interface. It specifies SE37 context and distinguishes from generic read tools like adt_read_source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on the optional functionGroup parameter to skip lookup, but does not explicitly state when to use this tool versus alternatives like adt_read_source or adt_create_function_module. Usage context is implied but not formally framed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_read_sourceA
Read the ABAP source of an object. Accept either the object URI (e.g. /sap/bc/adt/oo/classes/zcl_x) or its /source/main URI. Supports line-range slicing and line-number prefixes. Large sources are truncated with a warning unless a range is given. Set attachContext=true to prepend a compressed prologue of the DDIC objects (domains/data elements) referenced by TYPE/LIKE clauses — saves the agent from issuing one lookup per referenced type (token optimisation).
| Name | Required | Description | Default |
|---|---|---|---|
| endLine | No | 1-based end line | |
| objectUri | Yes | Object URI or .../source/main URI from adt_search_objects | |
| startLine | No | 1-based start line | |
| attachContext | No | Prepend a compressed prologue of referenced DDIC objects (token optimisation) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. It discloses truncation with a warning for large sources, the effect of attachContext (prepends compressed prologue of referenced DDIC objects), and that URIs can be two forms. No contradictions. Minor gaps: doesn't explicitly state whether it modifies anything or if authentication is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: starts with core purpose, then details. Each sentence adds value. Could trim 'token optimisation' redundancy, but otherwise efficient. Slightly verbose in the attachContext explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description implies return value (source code with optional prologue and truncation warning). Covers essential usage aspects. Could mention error handling or format of warning, but sufficient for a read-only tool with good parameter documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. Description adds meaning: objectUri can be object URI or source/main URI; startLine and endLine are 1-based; attachContext saves agent from one lookup per referenced type (token optimisation). These go beyond schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it reads ABAP source of an object, accepts specific URI forms (object URI or /source/main URI), and lists features like line-range slicing and line-number prefixes. It distinguishes from siblings like adt_search_objects (which returns URIs) and adt_write_source (which writes).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: URI must come from adt_search_objects; recommends using line-range for large sources to avoid truncation; suggests setting attachContext=true for token optimization. Lacks explicit when-not-to-use but implies alternatives for different tasks (e.g., adt_read_function_module for function modules).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_read_textelementsA
Read the text elements (text pool) of an ABAP program: text symbols, selection texts and heading texts. Supports a language override to read translations. Useful for i18n audits and before editing texts.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Optional SAP language key (e.g. EN, ZH). Defaults to the session language. | |
| programName | Yes | Program name, e.g. ZMMR001_192637 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It states 'Read' (non-destructive) and language override, but does not detail side effects, behavior on missing language, or whether it reads active or all texts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff: first sentence states what it reads, second sentence adds features and use cases. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description hints at return content (text symbols, etc.) but not structure. It covers input well but lacks output format details. Still fairly complete for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters already have descriptions. The description adds value by explaining the language parameter as enabling 'language override to read translations', which supplements the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it reads 'text elements (text pool)' and lists the types: text symbols, selection texts, heading texts. This clearly distinguishes it from siblings like adt_read_source (source code) or adt_write_textelements (writing).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions usefulness for i18n audits and before editing texts, providing clear context. However, it does not explicitly state when to avoid this tool or name alternatives beyond implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_search_objectsA
Search ABAP repository objects by name pattern (wildcards * and + are supported by ADT). Returns name, type, package and URI for each match. Use the URI with adt_read_source / adt_get_object_structure.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search pattern, e.g. ZCL_*_INVOICE or ZIF_MY_IF | |
| maxResults | No | Max results (1-200) | |
| objectType | No | Optional object type filter, e.g. CLAS, PROG, TABL, DTEL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses wildcard support and return fields, but does not mention pagination behavior, error handling, or authorization requirements. This is adequate for a search tool but could be more comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loading the action and supported wildcards, then specifying return values and usage guidance. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters, no output schema, and no annotations, the description covers the primary function, return information, and ties to sibling tools. It lacks details on pagination or result ordering, but the maxResults parameter addresses the limit. Overall, it is sufficient for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for all three parameters (query with example, maxResults with range, objectType as optional filter). The description adds only the context of wildcard support and URI usage, which is already implied by the schema examples. Thus the description adds minimal extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches ABAP repository objects by name pattern with wildcard support, and specifies the returned fields (name, type, package, URI). This distinguishes it from sibling tools like adt_browse_package or adt_read_source by focusing on search rather than browsing or reading.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (searching by name pattern) and provides guidance on next steps by mentioning to use the URI with adt_read_source or adt_get_object_structure. It does not explicitly exclude other use cases or mention alternatives, but the context is sufficient for an AI agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_syntax_checkA
Run an ABAP syntax check on provided source without locking or writing. Returns a list of errors/warnings with line numbers. Use before adt_write_source to pre-validate.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ABAP source to check | |
| objectUri | Yes | Object URI (base, not /source/main) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and discloses key behaviors: it does not lock or write (non-destructive), and returns errors/warnings with line numbers. It lacks details on authorization requirements or rate limits but covers the most important aspects for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each adding essential information: the core action, the non-destructive nature, the return format, and usage guidance. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (two parameters, clear output), the description is fairly complete, covering purpose, behavior, and usage. It does not address edge cases like empty results or invalid URIs, but these are minor for a syntax check tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description adds a minor clarification on objectUri format ('base, not /source/main'), but does not significantly enhance understanding beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs an ABAP syntax check, specifies the resource as 'provided source', and distinguishes itself by noting it does so 'without locking or writing'. It also explicitly contrasts with adt_write_source, providing clear differentiation among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises to use the tool before adt_write_source for pre-validation, which is a clear usage guideline. It does not cover when not to use, but the context of many siblings makes this selective suggestion helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_write_function_module_sourceA
Edit an existing function module's source (lock -> write -> unlock -> optional activate). Accepts the classic FUNCTION z_fm. ... ENDFUNCTION. form or the normalized form; it is auto-normalized to what ADT accepts. Blocked in read-only mode; name must match the Z*/Y* prefix. For a first-time create use adt_create_function_module instead.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | New full function module ABAP source (FUNCTION ... ENDFUNCTION). | |
| activate | No | Activate after writing. Default true. | |
| transport | No | Transport request. Omit + non-$TMP object -> asked to create one. | |
| functionGroup | No | Owning function group. Omit to auto-resolve via search. | |
| functionModule | Yes | Function module name, e.g. ZMY_FM |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries full burden. Discloses the lock-write-unlock-activate process, auto-normalization, and read-only blocking. Does not detail transport handling or error states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise paragraph covering purpose, process, constraints, and sibling reference. No redundant sentences. Efficiently communicates key points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers core behavior but lacks mention of return values or output (no output schema). Adequate for an edit tool, but could be more complete for an AI agent expecting result confirmation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and description adds practical context: source format normalization, transport auto-creation, function group auto-resolve. Enhances understanding beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the purpose: edit an existing function module's source. Distinguishes from create tool (adt_create_function_module). Describes the process and constraints.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using adt_create_function_module for first-time create. Mentions read-only blocking. Lacks comparison to sibling adt_write_source but provides clear context for when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_write_sourceA
AI-safe edit of an ABAP object. Orchestrates: optional conflict check → optional syntax check → lock → write (with transport) → unlock (always) → optional activate. Never leaves a dangling lock. Blocked in read-only mode; object name must match the allowed Z*/Y* prefix whitelist.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Complete, new ABAP source for the object | |
| activate | No | Activate after writing | |
| objectUri | Yes | Object URI (base, not .../source/main) | |
| transport | No | Existing transport request; if omitted, one is auto-created | |
| description | No | Transport description when auto-creating | Changed via ABAP ADT MCP |
| syntaxCheck | No | Run syntax check before writing | |
| expectedCurrentSource | No | If provided, write only if the current source still equals this (concurrency guard) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses the orchestration steps: optional conflict check, optional syntax check, lock, write with transport, mandatory unlock, and optional activate. It explicitly states that locks are never left dangling. This is comprehensive behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: four sentences that front-load the core purpose, then enumerate the workflow, emphasize safety, and list restrictions. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters and no output schema, the description covers the essential flow, safety guarantees, and constraints. It does not describe return values (e.g., success message or errors), but for a write tool with no output schema, this is acceptable. Slight omission of parameter formats or error handling prevents a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining that 'expectedCurrentSource' serves as a concurrency guard and that 'description' is used only when auto-creating a transport. This clarifies parameter usage beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this tool is for editing an ABAP object with a safe orchestration workflow. It distinguishes itself from siblings by outlining the multi-step process (conflict check, syntax check, lock, write, unlock, activate) and emphasizes 'AI-safe' behavior, which is unique among the listed sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly notes that the tool is blocked in read-only mode and requires object names to match a Z*/Y* whitelist, providing clear conditions for use. However, it does not explicitly compare to alternative tools like 'adt_edit_source' or 'adt_create_object', leaving some ambiguity about when to choose this over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adt_write_textelementsA
Write/replace the text elements (text pool) of an ABAP program. Orchestrates: transport resolution -> lock -> PUT text pool -> unlock (always) -> activate the text-pool sub-object (textelements URI, NOT the program URI — the latter does NOT reach the text pool). The provided entries fully replace the text pool for the (program, language). Blocked in read-only mode; program name must match the Z*/Y* prefix whitelist.
| Name | Required | Description | Default |
|---|---|---|---|
| entries | Yes | Text elements to write (replaces the pool) | |
| activate | No | Activate the text pool after writing (required for the runtime to see the texts). Default true. | |
| language | No | Target SAP language. Defaults to the session language. | |
| transport | No | Existing transport. Omit + non-$TMP program -> asked to create one. | |
| description | No | Transport description when creating one | Text elements changed via ABAP ADT MCP |
| programName | Yes | Program name, e.g. ZMMR001_192637 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries full burden. Discloses replacement behavior, orchestration steps (lock, unlock always, activate), blocking in read-only mode, and prefix whitelist. Rich behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is packed with information but efficiently structured. Could be slightly more concise, but every sentence serves a purpose and it is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers behavioral aspects, constraints, and process well. Lacks mention of error handling or return values, but given no output schema, completeness is good.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter descriptions. The description does not add meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes writing/replacing the text pool of an ABAP program with specific verb and resource. Clearly distinguishes from sibling tools like adt_read_textelements (read) and adt_write_source (source code).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context on the orchestration process and constraints (read-only mode, prefix whitelist) but does not explicitly state when to use this tool versus alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
24 tool updates
v1.0.0- First observed
adt_activate_object - First observed
adt_browse_package - First observed
adt_create_dataelement - First observed
adt_create_domain - First observed
adt_create_function_group - First observed
adt_create_function_module - First observed
adt_create_object - First observed
adt_create_package - First observed
adt_create_table - First observed
adt_edit_source - First observed
adt_get_object_structure - First observed
adt_get_table_data - First observed
adt_list_function_group - First observed
adt_list_transports - First observed
adt_manage_transport - First observed
adt_ping - First observed
adt_read_function_module - First observed
adt_read_source - First observed
adt_read_textelements - First observed
adt_search_objects - First observed
adt_syntax_check - First observed
adt_write_function_module_source - First observed
adt_write_source - First observed
adt_write_textelements
TDQS
Most tools have distinct purposes, but there is potential confusion between the generic adt_create_object and the specific create tools (e.g., adt_create_domain, adt_create_table). The descriptions help clarify, but the overlap slightly reduces disambiguation.
All tools follow a consistent adt_verb_noun pattern in snake_case. Verbs are imperative and nouns are descriptive, making the naming predictable and intuitive.
With 24 tools, the set covers the main ABAP development workflows without being overwhelming. The count is well-scoped for the complexity of the domain.
The tool set covers creation, reading, editing, activation, syntax check, transport, and browsing for ABAP objects, DDIC, and function modules. Minor gaps like delete or rename operations are absent but reasonable for an ADT-focused server.
Maintenance
Related MCP Connectors
Give AI agents 30,000+ safe, token-optimized actions across Workday, SAP, Oracle + hundreds more.
Read-only AI coding tools for change verification, release readiness, capacity, and guidance.
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to access SAP ADT APIs for reading, writing, debugging, deploying, and testing ABAP code through natural language or DSL automation.456MIT
- AlicenseAqualityDmaintenanceEnables AI assistants like Claude Code to directly connect to SAP ABAP systems via the ADT REST API with read/write capabilities, featuring AI-friendly high-level tools and built-in safety measures such as read-only mode, prefix whitelisting, and automatic locking.9MIT
- AlicenseCqualityCmaintenanceEnables interaction with SAP ABAP systems through ADT APIs, allowing management of ABAP objects, transport requests, and code analysis via natural language.100124MIT
- FlicenseNot gradedqualityCmaintenanceConnects to SAP ABAP Development Tools (ADT) via MCP, enabling AI assistants to manage SAP systems through natural language.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/abap0917/abap-adt-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server