@mcp-abap-adt/adt-clients-legacy

中文文档
0.4.0发布于 2026/11/02LGPL-3.0-onlyTypeScriptCommonJS

旧SAP ABAP系统(7.40)的客户端,基于@mcp-abap-adt/adt-clients

中文使用文档
文档目录24 节
  1. 安装施工
  2. 如何读表
  3. 这是消费者必须知道的
  4. 标头是调用者的
  5. 空 200 不是成功
  6. 其余的
  7. 每个处理程序的成员
  8. 类- getClass()
  9. 类别包括: getLocalTestClass() , getLocalTypes() , getLocalDefin…
  10. 程序- getProgram()
  11. 界面, getInterface()
  12. 功能组- getFunctionGroup()
  13. 功能模块- getFunctionModule()
  14. 功能包括: getFunctionInclude()
  15. 包括, getInclude()
  16. DDL源- getDdl()
  17. 消息类- getMessageClass() ,还有一条信息—— getMessageClassMessage()
  18. 包- getPackage()
  19. 运输请求- getRequest()
  20. 公用事业- - - - - - getUtils()
  21. 执行人, AdtExecutorLegacy
  22. 7.40类型没有
  23. 开发
  24. 许可证

@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 现代系统的答案
功能包括 createapplication/vnd.sap.adt.functions.fincludes+xml 两种方法;v2的答案 400
消息类 createapplication/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

版本与发布记录

@mcp-abap-adt/adt-clients-legacy 共发布 5 个版本,首次发布于 2026/10/27;过去 12 个月发布了 5 个版本。

版本发布日期距今
0.4.0latest2026/11/021 天前
0.3.02026/10/313 天前
0.2.02026/10/304 天前
0.1.02026/10/277 天前
0.0.0-stage2026/10/277 天前

关于 @mcp-abap-adt/adt-clients-legacy 的常见问题

@mcp-abap-adt/adt-clients-legacy 是什么?

旧SAP ABAP系统(7.40)的客户端,基于@mcp-abap-adt/adt-clients

如何安装 @mcp-abap-adt/adt-clients-legacy?

在项目目录运行 npm install @mcp-abap-adt/adt-clients-legacy,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@mcp-abap-adt/adt-clients(^40.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@mcp-abap-adt/adt-clients-legacy 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@mcp-abap-adt/adt-clients-legacy 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@mcp-abap-adt/adt-clients-legacy 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@mcp-abap-adt/adt-clients-legacy 可以商用吗?

@mcp-abap-adt/adt-clients-legacy 使用 LGPL-3.0-only 许可。弱 Copyleft:作为库被调用时通常不要求开源你自己的代码,但修改库本身需以 LGPL 开源;前端打包合并后的适用边界存在不同理解。以上为概括,不构成法律意见,请以许可原文为准。

@mcp-abap-adt/adt-clients-legacy 还在维护吗?

最新版本 0.4.0 发布于 2026/11/02(1 天前);至今共发布 5 个版本,其中过去 12 个月发布了 5 个;首次发布于 2026/10/27。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。