# @mcp-abap-adt/adt-clients-legacy 中文文档

规范地址：https://npmcn.com/package/%40mcp-abap-adt/adt-clients-legacy/

版本：0\.4\.0
npm 元数据更新时间：2026-11-01T18:54:56.963Z
中文译文更新时间：2026-11-01T22:23:22.477Z
软件包许可：LGPL-3\.0-only

本文由上游 README 机器翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40mcp-abap-adt/adt-clients-legacy
原文对照：https://npmcn.com/package/%40mcp-abap-adt/adt-clients-legacy/?lang=original
项目主页：https://github.com/fr0ster/mcp-abap-adt-clients/blob/main/packages/adt-clients-legacy/README.md
源码仓库：https://github.com/fr0ster/mcp-abap-adt-clients

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：414 kB，100 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=18\.0\.0
- 运行依赖：3 个
- peer 依赖：@mcp-abap-adt/adt-clients ^40\.0\.0
- 首次发布：2026-10-27T11:36:35.516Z
- 最新版本发布：2026-11-01T18:54:56.412Z
- 已发布版本数：5（近 12 个月 5 个）

## 中文简介

旧SAP ABAP系统（7.40）的客户端，基于@mcp-abap-adt/adt-clients

## 安装

```sh
npm install @mcp-abap-adt/adt-clients-legacy
```

也可以使用：`pnpm add @mcp-abap-adt/adt-clients-legacy`、`yarn add @mcp-abap-adt/adt-clients-legacy`、`bun add @mcp-abap-adt/adt-clients-legacy`

## README

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

为遗留SAP ABAP系统（SAP\_BASIS 7.40，在7.40 SP04上测量）构建的客户端 [`@mcp-abap-adt/adt-clients`](https://github.com/fr0ster/mcp-abap-adt-clients/blob/main/packages/adt-clients/README.md). `AdtClientLegacy` 和 `AdtExecutorLegacy` `extend` 这个包的 `AdtClient` 和 `AdtExecutor` ,只 Override：由每个成员发送请求 **按SAP\_BASIS 7.40标准测量 SP04**，或将未经衡量的要求放在一个集合中，或 回答拒绝 **不发送请求**.

此包中每个索赔的基础是SAP\_BASIS 7.40 SP04 over RFC，即7.40 测试系统。这里没有其他版本的推断。探针记录 每一种主张的背后，都是无法衡量的 [文档/ LEGACY.md](https://npmcn.com/package/%40mcp-abap-adt/adt-clients-legacy/docs/LEGACY.md).

## 安装施工

```bash
npm install @mcp-abap-adt/adt-clients-legacy @mcp-abap-adt/adt-clients
```

`@mcp-abap-adt/adt-clients` 是一个对等依赖(`^38.0.0`)：消费者安装它，而 遗留类扩展了那个副本，所以 `AdtClientLegacy` 是一个 `AdtClient` 消费者自己的 的版本。当安装的版本超出范围时，NPM会发出警告。

```typescript
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` 到达你。
    
    ```typescript
    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](https://npmcn.com/package/%40mcp-abap-adt/adt-clients-legacy/docs/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 是什么？

旧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 和提交记录判断。

