@mcp-abap-adt / adt-clients-legacy
为遗留SAP ABAP系统(SAP_BASIS 7.40,在7.40 SP04上测量)构建的客户端
@mcp-abap-adt/adt-clients. AdtClientLegacy 和
AdtExecutorLegacy extend 这个包的 AdtClient 和 AdtExecutor ,只
Override:由每个成员发送请求 按SAP_BASIS 7.40标准测量
SP04,或将未经衡量的要求放在一个集合中,或
回答拒绝 不发送请求.
此包中每个索赔的基础是SAP_BASIS 7.40 SP04 over RFC,即7.40 测试系统。这里没有其他版本的推断。探针记录 每一种主张的背后,都是无法衡量的 文档/ LEGACY.md.
安装施工
npm install @mcp-abap-adt/adt-clients-legacy @mcp-abap-adt/adt-clients
@mcp-abap-adt/adt-clients 是一个对等依赖(^38.0.0):消费者安装它,而
遗留类扩展了那个副本,所以 AdtClientLegacy 是一个 AdtClient 消费者自己的
的版本。当安装的版本超出范围时,NPM会发出警告。
import { AdtClientLegacy, AdtExecutorLegacy } from '@mcp-abap-adt/adt-clients-legacy';
const client = new AdtClientLegacy(connection, logger); // connection: an RFC connection
const executor = new AdtExecutorLegacy(connection, logger);
const program = client.getProgram(); // the getters 7.40's table serves
- 使用者声明系统类型。 这里没有检测遗留系统
没有工厂选择遗留类:
createAdtClient(connection, { variant })的@mcp-abap-adt/adt-clients现代客户的回答是('onprem'或者'cloud'只)。 - 由7.40的ADT类型表输入 (因为0.2.0)。
AdtClientLegacy是AdtClient<'basis740'>广告客户中有38个,由ADT_TYPES_BASIS_740的@mcp-abap-adt/interfaces-adt:该表没有列出的getter或成员 不编译(client.getTable(),getClass().checkDeletion()), 每个超驰系统都保留着基地的大门。它不能分配给一个现代人AdtClient. 对于类型系统之外的调用者,下面的拒绝保留。AdtExecutorLegacy是AdtExecutor<'basis740'>同样的道理。每个代码a 成员takes是该表的代码('CLAS/OC','FUGR/FF'):不 友好的名称,裸R3TR类型或小写拼写。 - RFC。 遗留客户端通过RFC得到支持和度量;HTTP
7.40系统不受支持(没有解决方案就不能登录,不能写入)
在一个锁下回答
423,一些阅读不同意RFC;记录在 LEGACY.md)。包不检测电线,也没有它的分支。 - 这个方案取决于
@mcp-abap-adt/adt-clients^38.0.0. 它也输出AdtRequestLegacy. - 每个getter回答一个类 (从0.2.0开始):它的遗留类
(
getProgram(): AdtProgramLegacy<…>,getInclude(): AdtIncludeLegacy<…>,……) 或者,对于7.40没有的类型,基类回答拒绝。每个都是 可转让给AdtClient它覆盖了Getter。的消费者 它接受的客户端类型组成该合同@mcp-abap-adt/interfaces-adt单独(原子),结果集收缩和 配置类型),如AdtClient;编译器在那里检查AdtClientLegacy满足它。结果集契约(IClassResults,……) 是从@mcp-abap-adt/interfaces-adt.
这个包装并不是围绕着一个忽略了它之后的东西的消费者设计的 说明7.40 SP04做什么并通过它传递请求。
如何读表
| 词 | 意味着 |
|---|---|
| 发送 | 成员发送如下请求;在SP04年7月40日测量合格(记录在LEGACY.md中命名)。 |
| 拒绝 | 会员回应图书馆的拒绝(ok: false, origin: 'refusal', code: UNSUPPORTED_OPERATION) 没有请求;它是被回答的,而不是被抛出的。消费者在代码上进行分支;这个信息是给人的。 |
| 保留,不测量 | 要求是现代的,在一个集合7.40广告;没有人测量过它。如果7.40不能解决问题,那么答案是SAP自己的 404在严格的默认情况下,这将被视为失败,而不是成功。 |
其中一行表示“发送”,它的记录是对a 系统 对象(系统)
程序、类、函数模块或包含)而不是一个对象
创建、遗产。医生是这么说的;自行车套房
(src/__tests__/integration/legacy/cycles/)测量已创建对象的读取
和 T6-20261027 在7.40 SP04(2026-10-27)上运行它们:读取创建的对象,以及free-name validate 对一个功能群和模块进行了测量;DDL源的 readTransport 404 在同一记录中进行一次原始读取(t6-ddl-readTransport)。
这是消费者必须知道的
标头是调用者的
库传递一个请求 Accept / Content-Type 通过改变
(options.headers, options.accept),而7.40美元的时候,一个也不选。测量对:
| 成员 | 对7.40 SP04接受 |
|---|---|
包括 create | 只有 application/vnd.sap.adt.programs.includes+xml两种方式。v2对回答 400 ExceptionContentHandlerNotFound |
类 readMetadata (getClass() 和 getUtils().readObjectMetadata('CLAS/OC', …)) | 只有 Accept: application/vnd.sap.adt.oo.classes+xml. 每个版本类型,一个列表命名一个(v4, unversioned), application/xml 回答 400 ExceptionContentHandlerNotFound -不是 406 现代系统的答案 |
功能包括 create | application/vnd.sap.adt.functions.fincludes+xml 两种方法;v2的答案 400 |
消息类 create | application/xml 两种方式(201) |
函数组 update (它的来源, source/main) | Content-Type: text/plain; charset=utf-8, Accept: text/plain (200);它的 read 发送 Accept: text/plain (200 text/plain) |
| 其他类型 | 标准库的默认对工作(类创建: application/vnd.sap.adt.oo.classes+xml;程序、功能组和模块创建:未版本类型;接口创建:v5对;DDL创建: application/vnd.sap.adt.ddlSource+xml;一位消息人士写道: text/plain) |
被测量的对通过测试,就像消费者通过测试一样
(integrationHeadersOf)。
空 200 不是成功
- 读取不存在的消息类
200与一个 空的身体,而不是404——之后仍然如此delete. 检查身体。 - 通过HTTP,家庭7.40没有回答一个空
200太(超过RFC)了 回答404). 遗产阶级拒绝这些家庭,所以他们都不读书 空200为成功。消费者的呼唤getUtils().readObjectMetadata必须 检查身体。
其余的
-
本地类包括
check和validate需要source在配置中 (getLocalTestClass(),getLocalTypes(),getLocalDefinitions(),getLocalMacros()). 如果没有它,库将在发送之前抛出。用它 两者都是检查运行(POST /checkruns,200)。 -
7.40上一个函数模块的源代码: 参数注释块被拒绝 (
500 ExceptionResourceSaveFailure参数注释块不是 允许”);一个普通FUNCTION … ENDFUNCTION身体被接受。 -
validate现有名称的答案400(InvalidClifName,InvalidProgramName,InvalidMcName(“已经存在”)对于一个类,接口, 程序、包括和消息类。这是对现有物体的回答, 不是请求失败;一个自由回答的名字200. 对于一个函数 组和一个功能模块,validate答案200(衡量一个现存的 名字)。 -
delete是你来锁的。 7.40没有/sap/bc/adt/deletion/*,所以有 否checkDeletion(每个人都被拒绝了)delete是一个请求:DELETE <object URI>?lockHandle=<handle>(加上&corrNr=当配置transportRequest是给定的),无状态。把手是你自己的lock(); 该成员不能锁定、解锁或重试。如果没有句柄,请求仍然存在 和SAP的400到达你。const include = client.getInclude(); const config = { includeName: 'ZINCL' }; const locked = await include.lock(config); // stateful if (!locked.ok) throw new Error(locked.getError().message); const lockHandle = locked.getResult().value; try { const deleted = await include.delete(config, { headers, lockHandle }); if (!deleted.ok) throw new Error(deleted.getError().message); } finally { await include.unlock(config, lockHandle); }的删除
corrNr在可运输的包装中测量(2026-10-26) 生活,LegacyTransportable):锁,DELETE ?lockHandle=&corrNr=解锁, 然后404在阅读。 -
ADT在7.40上没有服务的是用户的,比它高一级。 使用的 在RIS之外,DDIC来源、运输变化等都不是ADT存在的 需要它们的消费者通过传统的MCP服务器,其LLM编写 ABAP(类,报告)可以做到这一点。这个一揽子计划拒绝那些没有的成员 一个请求,所以没有工具只能失败。
每个处理程序的成员
记录 B2, B3 (早期运行)和 B4 (2026-10-26周期)列于
LEGACY.md。每个处理程序都是getter AdtClient 已为之,定为
'basis740'. 标记为 拒绝 的操作 ADT_TYPES_BASIS_740
不列也不编译;拒绝接听电话外的来电
类型系统。
类- getClass()
| 成员 | 04年7月40日 |
|---|---|
create | 发送 POST /oo/classes即未受版本控制的一对 |
lock, unlock | 发送(?_action=LOCK / UNLOCK有状态) |
update | 发送无状态 PUT …/source/main?lockHandle=, text/plain |
activate, check | 发送 |
validate | 发送 POST /oo/validation/objectname:免费 200,现有的 400 |
read, readMetadata | 发送(读取系统类); readMetadata 只有未版本的 Accept (上图) |
getVersions, getVersionSource | 发送 GET …/includes/<main|…>/versions,然后 GET <contentUri> |
delete | 发送一个 DELETE ?lockHandle= 在你的锁下 |
readTransport | 拒绝 - - - - - - GET …/transport 回答 404 |
checkDeletion | 拒绝 -无删除API |
updateMetadata | 拒绝 7.40没有测量(7.40的表中没有) |
activateTestClasses, readEnhancementElements, readEnhancementOptions | 保留,不测量 |
类别包括: getLocalTestClass(), getLocalTypes(), getLocalDefinitions(), getLocalMacros()
| 成员 | 04年7月40日 |
|---|---|
read | 发送(GET …/includes/<name>(系统类) |
update | 发送包含 PUT 在班级的锁下 |
check, validate | 发送检查运行 需要 source 在配置中 |
getVersions, getVersionSource | 发送 includes/<name>/versions, GET <contentUri> |
delete | 保存: update 用空源;写就是包含 PUT |
lock, unlock, activate, readMetadata | 发送, 容器类的,因为 getClass()的 |
readTransport | 拒绝 -容器类的 GET …/transport 回答 404 (B4-cycles-20261026-2019 c6-readTransport) |
程序- getProgram()
| 成员 | 04年7月40日 |
|---|---|
create | 发送 POST /programs/programs即未受版本控制的一对 |
lock, unlock, update, activate, check | 发送 |
validate | 发送 /programs/validation:免费 200,现有的 400 |
read, readMetadata | 发送(一个系统程序) |
getVersions, getVersionSource | 发送 |
delete | 发送一个 DELETE ?lockHandle= 在你的锁下 |
readTransport | 拒绝 - - - - - - 404 |
checkDeletion | 拒绝 |
updateMetadata | 拒绝 7.40没有测量(7.40的表中没有) |
readEnhancementElements, readEnhancementOptions | 保留,不测量 |
界面, getInterface()
| 成员 | 04年7月40日 |
|---|---|
create | 发送 POST /oo/interfaces, v5对(201) |
lock, unlock, update, activate, check | 发送 |
validate | 发送:免费 200,现有的 400 |
read, readMetadata, getVersions, getVersionSource | 发送(getVersions: source/main/versions) |
delete | 发送一个 DELETE ?lockHandle= 在你的锁下 |
readTransport | 拒绝 - - - - - - 404 |
checkDeletion | 拒绝 |
updateMetadata | 拒绝 7.40没有测量(7.40的表中没有) |
功能组- getFunctionGroup()
| 成员 | 04年7月40日 |
|---|---|
create, lock, unlock, check | 发送 |
activate | 单独发送组,一个参考-现代客户端(adt-clients 38)添加其主程序 SAPL<group> (FUGR/I),仅在S/4HANA 2025和ABAP云上测量 |
validate | 发送 /functions/validation (200) |
readMetadata | 发送(一个系统组) |
read, update (该组织的来源, source/main -主程序 SAPL<group>) | 发送,继承自adt-clients: read 一个 GET …/source/main (Accept: text/plain(按要求的版本), update 一个 PUT …/source/main?lockHandle= 你锁下的文字;读→写→激活→回读 $TMP |
delete | 发送一个 DELETE ?lockHandle= 在你的锁下 |
readTransport | 拒绝 - - - - - - 404 |
checkDeletion | 拒绝 |
updateMetadata, readEnhancementElements, readEnhancementOptions | 保留,不测量 |
函数组没有版本成员。
功能模块- getFunctionModule()
| 成员 | 04年7月40日 |
|---|---|
create | 发送 POST …/fmodules (201) |
lock, unlock, update, activate, check | 发送-源是一个plain FUNCTION … ENDFUNCTION 正文(参数注释块被拒绝,如上所示) |
read, getVersions, getVersionSource | 发送 |
readMetadata | 发送(一个系统模块) |
validate | 发送(200) |
delete | 发送一个 DELETE ?lockHandle= 在你的锁下 |
readTransport | 拒绝 - - - - - - 404 |
checkDeletion | 拒绝 |
updateMetadata | 拒绝 7.40没有测量(7.40的表中没有) |
它的成员把集团(functionGroupName),按类型要求。
功能包括: getFunctionInclude()
| 成员 | 04年7月40日 |
|---|---|
create | 发送-传递v1对 application/vnd.sap.adt.functions.fincludes+xml |
lock, unlock, update, activate | 发送 |
read | 发送(系统包含) |
readMetadata, updateMetadata, check, getVersions, getVersionSource | 保留,不测量 |
validate | 保留的,不衡量的 GET 它的官能团 |
delete, checkDeletion | 拒绝 -直接 DELETE 它不是被测量的,也不是被奉献的;通过功能组删除包含 |
包括, getInclude()
| 成员 | 04年7月40日 |
|---|---|
create | 发送 POST /programs/includes - - - - - - 只有未版本的对 |
lock, unlock, update, activate, read, readMetadata | 发送 |
validate | 发送:免费 200,现有的 400 InvalidProgramName |
delete | 发送一个 DELETE /programs/includes/<name>?lockHandle= 在你的锁下(200;之后的阅读 404) |
checkDeletion | 拒绝 |
updateMetadata | 拒绝 7.40没有测量(7.40的表中没有) |
readEnhancementElements, readEnhancementOptions | 保留,不测量 |
DDL源- getDdl()
| 成员 | 04年7月40日 |
|---|---|
create, lock, unlock, update, activate, check, read, readMetadata | 发送(一个 define view 在 T000 以其 sqlViewName 激活) |
validate | 发送:一个自由名称 200 |
delete | 发送一个 DELETE ?lockHandle= 在你的锁下 |
getVersions, getVersionSource | 拒绝 - - - - - - GET …/ddic/ddl/sources/<name>/versions 回答 404 |
readTransport | 拒绝 - - - - - - GET …/transport 回答 404 对于类、程序、接口、功能组、功能模块和(T6-20261027) DDL源 |
checkDeletion, checkCdsTestDoubles | 拒绝 |
updateMetadata | 拒绝 7.40没有测量(7.40的表中没有) |
消息类- getMessageClass(),还有一条信息—— getMessageClassMessage()
| 成员 | 04年7月40日 |
|---|---|
create | 发送 POST /messageclass, application/xml 两种方式(201) |
lock, unlock, readMetadata | 发送, readMetadata 缺席的班级是 200, 空 |
validate | 发送:免费 200,现有的 400 InvalidMcName |
updateMetadata | 拒绝 - - - PUT 类的文件回答 400 ExceptionInvalidData (7.40需要另一个根元素);文件测量好后才发送 |
delete | 发送一个 DELETE /messageclass/<name>?lockHandle= 在你的锁下(200;之后的阅读 200空) |
checkDeletion | 拒绝 |
消息 create, read, update, delete | 发送-消息是其类文档中的一行:类的一次读取,两个锁,一个 PUT,两个解锁 |
消息 readMetadata | 保留,不测量 |
包- getPackage()
每一个成员 拒绝:项目资源 /packages/<name> 答案 404 (
收集广告,该项目不提供)和 POST /packages 405.
包装内容送达 getUtils().fetchNodeStructure('DEVC/K', name),每个请求一个级别:根节点用其响应子包和每个对象类型的一个节点 NODE_ID,这些物品也随之而来 NODE_ID 作为 nodeId (T6-20261027)。
运输请求- getRequest()
| 成员 | 04年7月40日 |
|---|---|
list, readMetadata | 发送 GET /sap/bc/cts/transportrequests (用户列表 configUri 当给出时被拒绝) |
create | 拒绝 (400) |
| 每个其他成员 | 拒绝 - - - - - - /sap/bc/adt/cts/* 未发布,并且对请求的更改被拒绝 |
一个填充列表被测量(2026-10-26实时运行, LegacyTransportable):
一写后下锁用 corrNr、名单及 readMetadata 的名字
请求。
公用事业- - - - - - getUtils()
服务: search, fetchNodeStructure, getObjectStructure, discovery,
getInactiveObjects (年龄大的回答是7.40 adtcore:objectReferences
文档), readObjectMetadata / readObjectSource 对于服务类型,
getTypeStructure. readObjectMetadata, readObjectSource,
fetchNodeStructure, getObjectStructure 和 activateObjectsGroup 采取
7.40的守则(ADT_TYPES_BASIS_740, DEVC/K 对于结构为;
VIEW/DV 群组激活也是如此, ADT_UTILITY_CODES_BASIS_740),
未经请求而拒绝他人 BDEF/BDO, SRVD/SRV, DDLX/EX,
DCLS/DL 和 ENHO/XHH 在他们中间。 search 过滤7.40的搜索名称
(ADT_SEARCH_TYPES_BASIS_740: DEVC, CLAS, INTF, PROG, FUGR, FUNC,
DDLS, MSAG, TABL, ENHO, ENHS),因为0.3.0:7.40没有对象类型
列表,读取代码作为其主类型,并响应别名(STRU, DTAB,
REPO, INCL, BADI)或没有点击的未知名称-所以任何其他过滤器
不编译,并且在没有请求的情况下被拒绝。
拒绝:where-used(7.40只通过RIS提供),虚拟文件夹,对象
类型、激活运行、组删除、数据预览以及DDIC和包
类型的读取。逐个成员:LEGACY.md。
执行人, AdtExecutorLegacy
| 成员 | 04年7月40日 |
|---|---|
类、程序、功能组 run / runSync;功能模块 runSync | 发送一个 POST /abapunit/testruns 与 <options>,完成的结果 |
功能模块 run | 拒绝 -它没有命名组;使用 runSync({ functionGroupName, functionModuleName }) |
通用流道(getAbapUnitTestRunner()) runSync(uris, { headers }) | 发送一个 POST /abapunit/testruns 与 <options> 和调用者的头,完成的结果-继承 |
通用的跑步者 run (对象或包目标) | 拒绝 ——不 /abapunit/runs, /testruns 通过URI命名对象,没有包集;使用 runSync 使用对象的uri |
每一个 getStatus, getResult | 拒绝 -遗留运行答案完成;没有运行id |
类 run, runWithProfiler | 拒绝 ——不 /oo/classrun (404) |
程序 run跟踪类型列表 | 不测量就拒绝 -没有广告 |
跟踪 listRequests, getRequestsByUri, scheduleTrace | 保留,不测量 |
7.40类型没有
getDomain(), getDataElement(), getStructure(), getTable(),
getTableType(), getAppendStructure(), getTransformation(),
getScalarFunction(), getScalarFunctionImplementation(), getEnhancement(),
getAccessControl(), getServiceDefinition(), getServiceBinding(),
getBehaviorDefinition(), getBehaviorImplementation(),
getMetadataExtension(), getAuthorizationField(), getFeatureToggle():
ADT_TYPES_BASIS_740 没有这样的API,所以getter不能编译
AdtClientLegacy (因为0.2.0)。从类型系统外部调用时,它会出错
出一个处理程序,它的每个成员都是 拒绝.
开发
单元测试不需要SAP系统: npm test (在这里,或者在存储库根目录)。
实时检查需要7.40系统和它自己的覆盖:见
文档/ LIVE_TESTING.md.
npm run check:config检查覆盖是否有效 两个 根包的 键和遗留键(environment.is_legacy,legacy_env.*,legacy_740.*). 根包的check:config知道现代的叠加 仅使用密钥并拒绝具有遗留密钥的覆盖。npm run header:discovery使用遗留版本运行根包的错误语料库 客户在现代的旁边探索;它需要先构建根包 (npm run build在存储库根目录下)。
许可证
lgpl - 3.0