@mcp-abap-adt/core 6.11.2 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +6 -5
- package/dist/handlers/include/readonly/handleGetInclude.d.ts +1 -1
- package/dist/handlers/include/readonly/handleGetInclude.js +1 -1
- package/dist/handlers/include/readonly/handleGetInclude.js.map +1 -1
- package/dist/handlers/program/readonly/handleReadProgram.d.ts +1 -1
- package/dist/handlers/program/readonly/handleReadProgram.js +1 -1
- package/dist/handlers/program/readonly/handleReadProgram.js.map +1 -1
- package/dist/lib/handlers/groups/ReadOnlyHandlersGroup.d.ts.map +1 -1
- package/dist/lib/handlers/groups/ReadOnlyHandlersGroup.js +0 -5
- package/dist/lib/handlers/groups/ReadOnlyHandlersGroup.js.map +1 -1
- package/dist/server/EmbeddableMcpServer.d.ts +7 -6
- package/dist/server/EmbeddableMcpServer.d.ts.map +1 -1
- package/dist/server/EmbeddableMcpServer.js +3 -2
- package/dist/server/EmbeddableMcpServer.js.map +1 -1
- package/docs/architecture/TOOLS_ARCHITECTURE.md +1 -2
- package/docs/development/roadmaps/HANDLER_BUILD_ERRORS_ROADMAP.md +2 -3
- package/docs/development/roadmaps/TEST_REFACTORING_ROADMAP.md +1 -4
- package/docs/user-guide/AVAILABLE_TOOLS.md +5 -18
- package/docs/user-guide/AVAILABLE_TOOLS_COMPACT.md +1 -1
- package/docs/user-guide/AVAILABLE_TOOLS_HIGH.md +1 -1
- package/docs/user-guide/AVAILABLE_TOOLS_LEGACY.md +5 -20
- package/docs/user-guide/AVAILABLE_TOOLS_LOW.md +1 -1
- package/docs/user-guide/AVAILABLE_TOOLS_READONLY.md +4 -17
- package/docs/user-guide/HANDLERS_MANAGEMENT.md +7 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [7.0.0] - 2026-05-30
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- **BREAKING: `EmbeddableMcpServer` now applies `ReadVsGetDedupStrategy` by default.** Previously the embeddable server defaulted to `NoDedupStrategy`, so exposing `readonly` + `high` together surfaced both `Read<X>` and `Get<X>` for the same operation (e.g. `ReadProgram` + `GetProgram`), leaving tool selection up to the client. Embedders (e.g. cloud-llm-hub) now get the same single-tool-per-operation view as the standalone launcher. Consumers that relied on both variants being exposed must opt out by passing `readOnlyDedupStrategy: new NoDedupStrategy()`. No code-level API change — the difference is the set of tools exposed to clients.
|
|
9
|
+
|
|
10
|
+
## [6.11.3] - 2026-05-30
|
|
11
|
+
|
|
12
|
+
### Removed
|
|
13
|
+
- **`GetProgFullCode` removed as a redundant read path.** A program or function group with includes can already be read through one canonical path — `ReadProgram` / `ReadFunctionGroup` (main) → `GetIncludesList` → `GetInclude` per include — and an explicit `GetInclude` is required anyway (includes can live outside any single object's tree). Two overlapping strategies made LLM and RAG-based tool selection non-deterministic. The piecemeal path covers function groups as well (`GetIncludesList` accepts `FUGR`), so no capability is lost. (#100)
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- **Sharpened source-read tool descriptions for clearer LLM / semantic tool selection.** `ReadProgram` now reads as "Read a MAIN ABAP program … NOT for includes — use `GetInclude`" (dropping the misleading "Create, Update" lead-in on a read-only tool), and `GetInclude` now reads as "Read ANY single ABAP include source by name, from anywhere in the repository … the correct tool for include names (PROG/I)". `GetIncludesList` is unchanged. (#100)
|
|
17
|
+
|
|
5
18
|
## [6.11.2] - 2026-05-29
|
|
6
19
|
|
|
7
20
|
### Fixed
|
package/README.md
CHANGED
|
@@ -88,20 +88,21 @@ Embed MCP server into existing applications (e.g., SAP CAP/CDS, Express):
|
|
|
88
88
|
```typescript
|
|
89
89
|
import {
|
|
90
90
|
EmbeddableMcpServer,
|
|
91
|
-
|
|
91
|
+
NoDedupStrategy, // optional: expose both Read<X> and Get<X>
|
|
92
92
|
} from '@mcp-abap-adt/core/server';
|
|
93
93
|
|
|
94
94
|
const server = new EmbeddableMcpServer({
|
|
95
95
|
connection, // Your AbapConnection instance
|
|
96
96
|
logger, // Optional logger
|
|
97
97
|
exposition: ['readonly', 'high'], // Handler groups to expose
|
|
98
|
-
//
|
|
99
|
-
|
|
98
|
+
// Default hides Read<X> when Get<X> is exposed (ReadVsGetDedupStrategy).
|
|
99
|
+
// Pass NoDedupStrategy to expose both variants instead.
|
|
100
|
+
// readOnlyDedupStrategy: new NoDedupStrategy(),
|
|
100
101
|
});
|
|
101
102
|
await server.connect(transport);
|
|
102
103
|
```
|
|
103
104
|
|
|
104
|
-
See [Handlers Management → EmbeddableMcpServer dedup strategies](docs/user-guide/HANDLERS_MANAGEMENT.md#embeddablemcpserver-dedup-strategies) for
|
|
105
|
+
See [Handlers Management → EmbeddableMcpServer dedup strategies](docs/user-guide/HANDLERS_MANAGEMENT.md#embeddablemcpserver-dedup-strategies) for how readonly tools are deduped against high/low/compact, how to opt out with `NoDedupStrategy`, and how to plug a custom `IReadOnlyDedupStrategy` for role-based rules.
|
|
105
106
|
|
|
106
107
|
## Quick Start
|
|
107
108
|
|
|
@@ -134,7 +135,7 @@ See [Handlers Management → EmbeddableMcpServer dedup strategies](docs/user-gui
|
|
|
134
135
|
Key examples of high-value workflows and tools:
|
|
135
136
|
|
|
136
137
|
- **Repository and impact analysis**: `GetWhereUsed`, `DescribeByList`, `GetObjectStructure`, `GetObjectInfo`, `SearchObject`, `GetPackageTree`, `GetPackageContents`
|
|
137
|
-
- **Code and semantic introspection**: `GetAbapAST`, `GetAbapSemanticAnalysis`, `GetIncludesList
|
|
138
|
+
- **Code and semantic introspection**: `GetAbapAST`, `GetAbapSemanticAnalysis`, `GetIncludesList`
|
|
138
139
|
- **RAP development**: `CreateBehaviorDefinition`, `UpdateBehaviorDefinition`, `CreateBehaviorImplementation`, `UpdateBehaviorImplementation`, `CreateServiceDefinition`, `UpdateServiceDefinition`, `CreateMetadataExtension`, `UpdateMetadataExtension`
|
|
139
140
|
- **CDS/View development**: `CreateView`, `UpdateView`, `GetView`, `DeleteView`
|
|
140
141
|
- **ABAP OO CRUD**: `CreateClass`, `UpdateClass`, `GetClass`, `DeleteClass`, `CreateInterface`, `UpdateInterface`, `GetInterface`, `DeleteInterface`
|
|
@@ -3,7 +3,7 @@ import type { HandlerContext } from '../../../lib/handlers/interfaces';
|
|
|
3
3
|
export declare const TOOL_DEFINITION: {
|
|
4
4
|
readonly name: "GetInclude";
|
|
5
5
|
readonly available_in: readonly ["onprem", "cloud", "legacy"];
|
|
6
|
-
readonly description: "[read-only]
|
|
6
|
+
readonly description: "[read-only] Read ANY single ABAP include source by name, from anywhere in the repository (an include may live outside any single program tree). This is the correct tool for include names (PROG/I) — ReadProgram does not read includes.";
|
|
7
7
|
readonly inputSchema: {
|
|
8
8
|
readonly include_name: z.ZodString;
|
|
9
9
|
};
|
|
@@ -44,7 +44,7 @@ const utils_1 = require("../../../lib/utils");
|
|
|
44
44
|
exports.TOOL_DEFINITION = {
|
|
45
45
|
name: 'GetInclude',
|
|
46
46
|
available_in: ['onprem', 'cloud', 'legacy'],
|
|
47
|
-
description: '[read-only]
|
|
47
|
+
description: '[read-only] Read ANY single ABAP include source by name, from anywhere in the repository (an include may live outside any single program tree). This is the correct tool for include names (PROG/I) — ReadProgram does not read includes.',
|
|
48
48
|
inputSchema: {
|
|
49
49
|
include_name: z.string().describe('Name of the ABAP Include'),
|
|
50
50
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleGetInclude.js","sourceRoot":"","sources":["../../../../src/handlers/include/readonly/handleGetInclude.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,4CAuCC;AA/DD,uCAAyB;AAEzB,8CAK4B;AAE5B,yCAAyC;AACzC,0FAA0F;AAC1F,8CAA8C;AAC9C,6DAA6D;AAEhD,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,YAAY;IAClB,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAU;IACpD,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"handleGetInclude.js","sourceRoot":"","sources":["../../../../src/handlers/include/readonly/handleGetInclude.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,4CAuCC;AA/DD,uCAAyB;AAEzB,8CAK4B;AAE5B,yCAAyC;AACzC,0FAA0F;AAC1F,8CAA8C;AAC9C,6DAA6D;AAEhD,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,YAAY;IAClB,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAU;IACpD,WAAW,EACT,2OAA2O;IAC7O,WAAW,EAAE;QACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KAC9D;CACO,CAAC;AAEJ,KAAK,UAAU,gBAAgB,CAAC,OAAuB,EAAE,IAAS;IACvE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACvC,IAAI,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;YACxB,MAAM,IAAI,gBAAQ,CAAC,iBAAS,CAAC,aAAa,EAAE,0BAA0B,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,GAAG,GAAG,iCAAiC,IAAA,2BAAmB,EAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;QAClG,MAAM,EAAE,IAAI,CAAC,qBAAqB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,IAAA,iCAAyB,EAC9C,UAAU,EACV,GAAG,EACH,KAAK,EACL,SAAS,CACV,CAAC;QACF,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC;QAChC,MAAM,EAAE,IAAI,CAAC,2BAA2B,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS;iBAChB;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,CACX,yBAAyB,IAAI,EAAE,YAAY,IAAI,EAAE,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC/G,CAAC;QACF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC7D;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -2,7 +2,7 @@ import type { HandlerContext } from '../../../lib/handlers/interfaces';
|
|
|
2
2
|
export declare const TOOL_DEFINITION: {
|
|
3
3
|
readonly name: "ReadProgram";
|
|
4
4
|
readonly available_in: readonly ["onprem", "legacy"];
|
|
5
|
-
readonly description: "
|
|
5
|
+
readonly description: "[read-only] Read a MAIN ABAP program (report) source code and metadata by name. Works ONLY for main programs (adtcore type PROG/P); NOT for includes — use GetInclude for include source. Include names (PROG/I) and other object types are rejected with error \"invalid_object_type\". Answers: \"show program code\", \"display report source\", \"view program X\", \"get program source\". Returns source code, package, responsible, description.";
|
|
6
6
|
readonly inputSchema: {
|
|
7
7
|
readonly type: "object";
|
|
8
8
|
readonly properties: {
|
|
@@ -7,7 +7,7 @@ const utils_1 = require("../../../lib/utils");
|
|
|
7
7
|
exports.TOOL_DEFINITION = {
|
|
8
8
|
name: 'ReadProgram',
|
|
9
9
|
available_in: ['onprem', 'legacy'],
|
|
10
|
-
description: '
|
|
10
|
+
description: '[read-only] Read a MAIN ABAP program (report) source code and metadata by name. Works ONLY for main programs (adtcore type PROG/P); NOT for includes — use GetInclude for include source. Include names (PROG/I) and other object types are rejected with error "invalid_object_type". Answers: "show program code", "display report source", "view program X", "get program source". Returns source code, package, responsible, description.',
|
|
11
11
|
inputSchema: {
|
|
12
12
|
type: 'object',
|
|
13
13
|
properties: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleReadProgram.js","sourceRoot":"","sources":["../../../../src/handlers/program/readonly/handleReadProgram.ts"],"names":[],"mappings":";;;AA+BA,8CA4FC;AA3HD,kDAAuD;AAEvD,8CAI4B;AAEf,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,aAAa;IACnB,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAU;IAC3C,WAAW,EACT
|
|
1
|
+
{"version":3,"file":"handleReadProgram.js","sourceRoot":"","sources":["../../../../src/handlers/program/readonly/handleReadProgram.ts"],"names":[],"mappings":";;;AA+BA,8CA4FC;AA3HD,kDAAuD;AAEvD,8CAI4B;AAEf,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,aAAa;IACnB,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAU;IAC3C,WAAW,EACT,+aAA+a;IACjb,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC5B,WAAW,EAAE,oDAAoD;gBACjE,OAAO,EAAE,QAAQ;aAClB;SACF;QACD,QAAQ,EAAE,CAAC,cAAc,CAAC;KAC3B;CACO,CAAC;AAEJ,KAAK,UAAU,iBAAiB,CACrC,OAAuB,EACvB,IAA+D;IAE/D,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;QAClD,IAAI,CAAC,YAAY;YACf,OAAO,IAAA,oBAAY,EAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,IAAA,yBAAe,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAEhC,IAAI,WAAW,GAAkB,IAAI,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,CAC/B,EAAE,WAAW,EAAE,EACf,OAAgC,CACjC,CAAC;YACF,IAAI,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;gBACjC,WAAW;oBACT,OAAO,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ;wBAC5C,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI;wBAC5B,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,EAAE,IAAI,CAAC,6BAA6B,WAAW,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;YAC3D,IAAI,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;gBACrC,QAAQ;oBACN,OAAO,UAAU,CAAC,cAAc,CAAC,IAAI,KAAK,QAAQ;wBAChD,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI;wBAChC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,EAAE,IAAI,CAAC,+BAA+B,WAAW,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,0EAA0E;QAC1E,4EAA4E;QAC5E,wEAAwE;QACxE,kEAAkE;QAClE,sEAAsE;QACtE,qEAAqE;QACrE,0DAA0D;QAC1D,MAAM,UAAU,GAAG,QAAQ;YACzB,CAAC,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACxD,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,aAAa,GAAG,UAAU,KAAK,QAAQ,CAAC;QAC9C,wEAAwE;QACxE,wEAAwE;QACxE,gDAAgD;QAChD,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC;YAClE,OAAO,IAAA,uBAAe,EAAC;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,qBAAqB;oBAC5B,YAAY,EAAE,WAAW;oBACzB,WAAW,EAAE,UAAU;oBACvB,OAAO,EAAE,UAAU;wBACjB,CAAC,CAAC,IAAI,WAAW,qBAAqB,UAAU,+EAA+E;wBAC/H,CAAC,CAAC,0DAA0D,WAAW,mDAAmD;iBAC7H,EACD,IAAI,EACJ,CAAC,CACF;aACe,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAAA,uBAAe,EAAC;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gBACE,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,WAAW;gBACzB,OAAO;gBACP,WAAW;gBACX,QAAQ;aACT,EACD,IAAI,EACJ,CAAC,CACF;SACe,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAa;IAClC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReadOnlyHandlersGroup.d.ts","sourceRoot":"","sources":["../../../../src/lib/handlers/groups/ReadOnlyHandlersGroup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ReadOnlyHandlersGroup.d.ts","sourceRoot":"","sources":["../../../../src/lib/handlers/groups/ReadOnlyHandlersGroup.ts"],"names":[],"mappings":"AAoGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EACL,KAAK,sBAAsB,EAE5B,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,SAAQ,gBAAgB;IACzD,SAAS,CAAC,SAAS,SAAsB;IACzC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;gBAGrD,OAAO,EAAE,cAAc,EACvB,mBAAmB,GAAE,WAAW,CAAC,MAAM,CAAa,EACpD,aAAa,GAAE,sBAA8C;IAO/D;;OAEG;IACH,WAAW,IAAI,YAAY,EAAE;IAM7B,OAAO,CAAC,aAAa;CA4GtB"}
|
|
@@ -17,7 +17,6 @@ const handleReadInterface_1 = require("../../../handlers/interface/readonly/hand
|
|
|
17
17
|
const handleReadMetadataExtension_1 = require("../../../handlers/metadata_extension/readonly/handleReadMetadataExtension");
|
|
18
18
|
const handleGetPackageContents_1 = require("../../../handlers/package/readonly/handleGetPackageContents");
|
|
19
19
|
const handleReadPackage_1 = require("../../../handlers/package/readonly/handleReadPackage");
|
|
20
|
-
const handleGetProgFullCode_1 = require("../../../handlers/program/readonly/handleGetProgFullCode");
|
|
21
20
|
const handleReadProgram_1 = require("../../../handlers/program/readonly/handleReadProgram");
|
|
22
21
|
const handleReadServiceBinding_1 = require("../../../handlers/service_binding/readonly/handleReadServiceBinding");
|
|
23
22
|
const handleReadServiceDefinition_1 = require("../../../handlers/service_definition/readonly/handleReadServiceDefinition");
|
|
@@ -93,10 +92,6 @@ class ReadOnlyHandlersGroup extends BaseHandlerGroup_js_1.BaseHandlerGroup {
|
|
|
93
92
|
toolDefinition: handleListTransports_1.TOOL_DEFINITION,
|
|
94
93
|
handler: (args) => (0, handleListTransports_1.handleListTransports)(this.context, args),
|
|
95
94
|
},
|
|
96
|
-
{
|
|
97
|
-
toolDefinition: handleGetProgFullCode_1.TOOL_DEFINITION,
|
|
98
|
-
handler: (args) => (0, handleGetProgFullCode_1.handleGetProgFullCode)(this.context, args),
|
|
99
|
-
},
|
|
100
95
|
// Read object source + metadata handlers
|
|
101
96
|
{
|
|
102
97
|
toolDefinition: handleReadClass_1.TOOL_DEFINITION,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReadOnlyHandlersGroup.js","sourceRoot":"","sources":["../../../../src/lib/handlers/groups/ReadOnlyHandlersGroup.ts"],"names":[],"mappings":";;;AAAA,8HAGqF;AACrF,0IAG6F;AAC7F,sFAG0D;AAC1D,yGAGuE;AACvE,yFAG4D;AAC5D,8GAGyE;AACzE,8GAGyE;AACzE,wGAGsE;AACtE,+GAG2E;AAC3E,kHAG6E;AAC7E,0FAG6D;AAC7D,oGAGkE;AAClE,kGAGkE;AAClE,2HAGmF;AACnF,0GAGqE;AACrE,4FAG8D;AAC9D,
|
|
1
|
+
{"version":3,"file":"ReadOnlyHandlersGroup.js","sourceRoot":"","sources":["../../../../src/lib/handlers/groups/ReadOnlyHandlersGroup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AbapConnection } from '@mcp-abap-adt/connection';
|
|
2
2
|
import type { Logger } from '@mcp-abap-adt/logger';
|
|
3
|
-
import type
|
|
3
|
+
import { type IReadOnlyDedupStrategy } from '../lib/handlers/groups/strategies/index.js';
|
|
4
4
|
import type { IHandlersRegistry, SapEnvironment } from '../lib/handlers/interfaces.js';
|
|
5
5
|
import type { IAdtSystemContext } from '../lib/systemContext.js';
|
|
6
6
|
import { BaseMcpServer } from './BaseMcpServer.js';
|
|
@@ -54,11 +54,12 @@ export interface EmbeddableMcpServerOptions {
|
|
|
54
54
|
* Optional strategy that decides which readonly handlers to dedup (hide)
|
|
55
55
|
* when overriding groups (high / low / compact) are also exposed.
|
|
56
56
|
*
|
|
57
|
-
* Default:
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
57
|
+
* Default: `ReadVsGetDedupStrategy` — hides a readonly `Read<X>` handler
|
|
58
|
+
* when a corresponding `Get<X>` is contributed by another group, so a single
|
|
59
|
+
* deterministic tool is exposed per operation (matching the standalone
|
|
60
|
+
* launcher). Pass `new NoDedupStrategy()` (exported from this package) to
|
|
61
|
+
* expose readonly handlers verbatim, or supply a custom implementation for
|
|
62
|
+
* bespoke role-based rules.
|
|
62
63
|
*/
|
|
63
64
|
readOnlyDedupStrategy?: IReadOnlyDedupStrategy;
|
|
64
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmbeddableMcpServer.d.ts","sourceRoot":"","sources":["../../src/server/EmbeddableMcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AASnD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"EmbeddableMcpServer.d.ts","sourceRoot":"","sources":["../../src/server/EmbeddableMcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AASnD,OAAO,EACL,KAAK,sBAAsB,EAE5B,MAAM,4CAA4C,CAAC;AACpD,OAAO,KAAK,EAEV,iBAAiB,EACjB,cAAc,EACf,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,UAAU,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IAErC;;;OAGG;IACH,UAAU,CAAC,EAAE,CACT,UAAU,GACV,MAAM,GACN,KAAK,GACL,SAAS,GACT,QAAQ,GACR,QAAQ,CACX,EAAE,CAAC;IAEJ;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE3C;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;IAE5B;;;;;;;;;;OAUG;IACH,qBAAqB,CAAC,EAAE,sBAAsB,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiB;gBAExC,OAAO,EAAE,0BAA0B;IA0B/C;;;OAGG;cACa,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC;IAIxD;;OAEG;IACH,OAAO,CAAC,qBAAqB;CA6D9B"}
|
|
@@ -8,6 +8,7 @@ const LowLevelHandlersGroup_js_1 = require("../lib/handlers/groups/LowLevelHandl
|
|
|
8
8
|
const ReadOnlyHandlersGroup_js_1 = require("../lib/handlers/groups/ReadOnlyHandlersGroup.js");
|
|
9
9
|
const SearchHandlersGroup_js_1 = require("../lib/handlers/groups/SearchHandlersGroup.js");
|
|
10
10
|
const SystemHandlersGroup_js_1 = require("../lib/handlers/groups/SystemHandlersGroup.js");
|
|
11
|
+
const index_js_1 = require("../lib/handlers/groups/strategies/index.js");
|
|
11
12
|
const CompositeHandlersRegistry_js_1 = require("../lib/handlers/registry/CompositeHandlersRegistry.js");
|
|
12
13
|
const systemContext_js_1 = require("../lib/systemContext.js");
|
|
13
14
|
const BaseMcpServer_js_1 = require("./BaseMcpServer.js");
|
|
@@ -64,7 +65,7 @@ class EmbeddableMcpServer extends BaseMcpServer_js_1.BaseMcpServer {
|
|
|
64
65
|
/**
|
|
65
66
|
* Creates default handlers registry based on exposition levels
|
|
66
67
|
*/
|
|
67
|
-
createDefaultRegistry(exposition, logger, readOnlyDedupStrategy) {
|
|
68
|
+
createDefaultRegistry(exposition, logger, readOnlyDedupStrategy = new index_js_1.ReadVsGetDedupStrategy()) {
|
|
68
69
|
// Dummy context - not actually used because BaseMcpServer.registerHandlers()
|
|
69
70
|
// creates wrapper lambdas that call getConnection() for fresh context
|
|
70
71
|
const dummyContext = {
|
|
@@ -72,7 +73,7 @@ class EmbeddableMcpServer extends BaseMcpServer_js_1.BaseMcpServer {
|
|
|
72
73
|
logger: logger ?? handlerLogger_js_1.noopLogger,
|
|
73
74
|
};
|
|
74
75
|
// Build non-readonly groups first so their tool names can feed the
|
|
75
|
-
// readonly dedup strategy (
|
|
76
|
+
// readonly dedup strategy (defaults to ReadVsGetDedupStrategy).
|
|
76
77
|
const overridingGroups = [];
|
|
77
78
|
if (exposition.includes('high')) {
|
|
78
79
|
overridingGroups.push(new HighLevelHandlersGroup_js_1.HighLevelHandlersGroup(dummyContext));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmbeddableMcpServer.js","sourceRoot":"","sources":["../../src/server/EmbeddableMcpServer.ts"],"names":[],"mappings":";;;AAGA,8DAAqD;AACrD,4FAAsF;AACtF,gGAA0F;AAC1F,8FAAwF;AACxF,8FAAwF;AACxF,0FAAoF;AACpF,0FAAoF;
|
|
1
|
+
{"version":3,"file":"EmbeddableMcpServer.js","sourceRoot":"","sources":["../../src/server/EmbeddableMcpServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -145,7 +145,6 @@ import { TOOL_DEFINITION as GetClass_Tool } from '../handlers/class/handleGetCla
|
|
|
145
145
|
const DYNAMIC_IMPORT_TOOLS: ToolDefinition[] = [
|
|
146
146
|
GetObjectsByType_Tool,
|
|
147
147
|
GetObjectsList_Tool,
|
|
148
|
-
GetProgFullCode_Tool,
|
|
149
148
|
GetObjectNodeFromCache_Tool,
|
|
150
149
|
DescribeByList_Tool
|
|
151
150
|
];
|
|
@@ -206,7 +205,7 @@ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
206
205
|
```
|
|
207
206
|
|
|
208
207
|
**Note:** Most handlers are statically imported, but some use dynamic imports to avoid circular dependencies or improve startup performance:
|
|
209
|
-
- `GetObjectsList`, `GetObjectsByType`, `
|
|
208
|
+
- `GetObjectsList`, `GetObjectsByType`, `GetObjectNodeFromCache`, `DescribeByList` (marked in `DYNAMIC_IMPORT_TOOLS`)
|
|
210
209
|
- `GetAdtTypes`, `GetObjectStructure` (also use dynamic import but are in main `ALL_TOOLS` array)
|
|
211
210
|
|
|
212
211
|
## Benefits
|
|
@@ -86,7 +86,7 @@ In `mcp_handlers.ts` lines 784-802, dynamic imports call handlers with only 1 ar
|
|
|
86
86
|
return await handleXxx(args); // Missing connection argument
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
-
## Affected Files (
|
|
89
|
+
## Affected Files (72 total)
|
|
90
90
|
|
|
91
91
|
### behavior_definition/low/ (3 files)
|
|
92
92
|
- `handleLockBehaviorDefinition.ts`
|
|
@@ -147,14 +147,13 @@ return await handleXxx(args); // Missing connection argument
|
|
|
147
147
|
- `handleUnlockPackage.ts`
|
|
148
148
|
- `handleValidatePackage.ts`
|
|
149
149
|
|
|
150
|
-
### program/ (
|
|
150
|
+
### program/ (6 files)
|
|
151
151
|
- `low/handleActivateProgram.ts`
|
|
152
152
|
- `low/handleCreateProgram.ts`
|
|
153
153
|
- `low/handleDeleteProgram.ts`
|
|
154
154
|
- `low/handleUnlockProgram.ts`
|
|
155
155
|
- `low/handleUpdateProgram.ts`
|
|
156
156
|
- `low/handleValidateProgram.ts`
|
|
157
|
-
- `readonly/handleGetProgFullCode.ts`
|
|
158
157
|
|
|
159
158
|
### structure/ (8 files)
|
|
160
159
|
- `high/handleCreateStructure.ts`
|
|
@@ -233,7 +233,6 @@ interface HandlerContext {
|
|
|
233
233
|
- [x] `handleGetFunction`
|
|
234
234
|
- [x] `handleGetFunctionGroup`
|
|
235
235
|
- [x] `handleGetObjectInfo`
|
|
236
|
-
- [x] `handleGetProgFullCode`
|
|
237
236
|
- [x] `handleGetServiceDefinition`
|
|
238
237
|
- [x] `handleGetTransport`
|
|
239
238
|
- [x] `handleGetAbapSystemSymbols`
|
|
@@ -415,7 +414,6 @@ describe('Class High-Level Handlers Integration', () => {
|
|
|
415
414
|
- Search: `handleSearchObject`, `handleGetObjectsList`, `handleGetObjectsByType`
|
|
416
415
|
- Transport: `handleGetTransport`
|
|
417
416
|
- Include: `handleGetIncludesList`, `handleGetInclude`
|
|
418
|
-
- Program: `handleGetProgFullCode`
|
|
419
417
|
- ServiceDefinition: `handleGetServiceDefinition`
|
|
420
418
|
- **BehaviorDefinition Handlers (7/7)** ✅:
|
|
421
419
|
- High-level: `handleCreateBehaviorDefinition`
|
|
@@ -432,10 +430,9 @@ describe('Class High-Level Handlers Integration', () => {
|
|
|
432
430
|
- **Interface Handlers (10/10)** ✅:
|
|
433
431
|
- High-level: `handleCreateInterface`, `handleUpdateInterface`
|
|
434
432
|
- Low-level: `handleCreateInterface`, `handleUpdateInterface`, `handleDeleteInterface`, `handleLockInterface`, `handleUnlockInterface`, `handleActivateInterface`, `handleCheckInterface`, `handleValidateInterface`
|
|
435
|
-
- **Program Handlers (
|
|
433
|
+
- **Program Handlers (10/10)** ✅:
|
|
436
434
|
- High-level: `handleCreateProgram`, `handleUpdateProgram`
|
|
437
435
|
- Low-level: `handleCreateProgram`, `handleUpdateProgram`, `handleDeleteProgram`, `handleLockProgram`, `handleUnlockProgram`, `handleActivateProgram`, `handleCheckProgram`, `handleValidateProgram`
|
|
438
|
-
- Read-only: `handleGetProgFullCode`
|
|
439
436
|
- **Structure Handlers (10/10)** ✅:
|
|
440
437
|
- High-level: `handleCreateStructure`, `handleUpdateStructure`
|
|
441
438
|
- Low-level: `handleCreateStructure`, `handleUpdateStructure`, `handleDeleteStructure`, `handleLockStructure`, `handleUnlockStructure`, `handleActivateStructure`, `handleCheckStructure`, `handleValidateStructure`
|
|
@@ -4,8 +4,8 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
4
4
|
|
|
5
5
|
## Summary
|
|
6
6
|
|
|
7
|
-
- Total tools:
|
|
8
|
-
- Read-only tools:
|
|
7
|
+
- Total tools: 306
|
|
8
|
+
- Read-only tools: 55
|
|
9
9
|
- High-level tools: 127
|
|
10
10
|
- Low-level tools: 124
|
|
11
11
|
|
|
@@ -51,7 +51,6 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
51
51
|
- [GetPackageContents](#getpackagecontents-read-only-package)
|
|
52
52
|
- [ReadPackage](#readpackage-read-only-package)
|
|
53
53
|
- [Program](#read-only-program)
|
|
54
|
-
- [GetProgFullCode](#getprogfullcode-read-only-program)
|
|
55
54
|
- [ReadProgram](#readprogram-read-only-program)
|
|
56
55
|
- [Search](#read-only-search)
|
|
57
56
|
- [GetObjectsByType](#getobjectsbytype-read-only-search)
|
|
@@ -548,7 +547,7 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
548
547
|
|
|
549
548
|
<a id="getinclude-read-only-include"></a>
|
|
550
549
|
#### GetInclude (Read-Only / Include)
|
|
551
|
-
**Description:** [read-only]
|
|
550
|
+
**Description:** [read-only] Read ANY single ABAP include source by name, from anywhere in the repository (an include may live outside any single program tree). This is the correct tool for include names (PROG/I) — ReadProgram does not read includes.
|
|
552
551
|
|
|
553
552
|
**Source:** `src/handlers/include/readonly/handleGetInclude.ts`
|
|
554
553
|
|
|
@@ -630,21 +629,9 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
630
629
|
<a id="read-only-program"></a>
|
|
631
630
|
### Read-Only / Program
|
|
632
631
|
|
|
633
|
-
<a id="getprogfullcode-read-only-program"></a>
|
|
634
|
-
#### GetProgFullCode (Read-Only / Program)
|
|
635
|
-
**Description:** [read-only] Returns the full code for a program or function group, including all includes, in tree traversal order.
|
|
636
|
-
|
|
637
|
-
**Source:** `src/handlers/program/readonly/handleGetProgFullCode.ts`
|
|
638
|
-
|
|
639
|
-
**Parameters:**
|
|
640
|
-
- `name` (string, required) - [read-only] Technical name of the program or function group (e.g., '/CBY/MM_INVENTORY')
|
|
641
|
-
- `type` (string, required) - [read-only] 'PROG/P' for program or 'FUGR' for function group
|
|
642
|
-
|
|
643
|
-
---
|
|
644
|
-
|
|
645
632
|
<a id="readprogram-read-only-program"></a>
|
|
646
633
|
#### ReadProgram (Read-Only / Program)
|
|
647
|
-
**Description:**
|
|
634
|
+
**Description:** [read-only] Read a MAIN ABAP program (report) source code and metadata by name. Works ONLY for main programs (adtcore type PROG/P); NOT for includes — use GetInclude for include source. Include names (PROG/I) and other object types are rejected with error "invalid_object_type". Answers: "show program code", "display report source", "view program X", "get program source". Returns source code, package, responsible, description.
|
|
648
635
|
|
|
649
636
|
**Source:** `src/handlers/program/readonly/handleReadProgram.ts`
|
|
650
637
|
|
|
@@ -4948,4 +4935,4 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
4948
4935
|
|
|
4949
4936
|
---
|
|
4950
4937
|
|
|
4951
|
-
*Last updated: 2026-05-
|
|
4938
|
+
*Last updated: 2026-05-30*
|
|
@@ -5,8 +5,8 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
5
5
|
Tools available on legacy SAP systems (BASIS < 7.50).
|
|
6
6
|
Legacy systems support a subset of tools — primarily Class, Interface, View, Program, Function Group/Module, Package (read/update/delete), Include, Unit Test, and common utilities.
|
|
7
7
|
|
|
8
|
-
- Total tools:
|
|
9
|
-
- Read-Only:
|
|
8
|
+
- Total tools: 134
|
|
9
|
+
- Read-Only: 11
|
|
10
10
|
- High-Level: 62
|
|
11
11
|
- Low-Level: 61
|
|
12
12
|
|
|
@@ -28,7 +28,6 @@ Legacy systems support a subset of tools — primarily Class, Interface, View, P
|
|
|
28
28
|
- [GetPackageContents](#getpackagecontents-read-only-package)
|
|
29
29
|
- [ReadPackage](#readpackage-read-only-package)
|
|
30
30
|
- [Program](#read-only-program)
|
|
31
|
-
- [GetProgFullCode](#getprogfullcode-read-only-program)
|
|
32
31
|
- [ReadProgram](#readprogram-read-only-program)
|
|
33
32
|
- [System](#read-only-system)
|
|
34
33
|
- [SearchSource](#searchsource-read-only-system)
|
|
@@ -240,7 +239,7 @@ Legacy systems support a subset of tools — primarily Class, Interface, View, P
|
|
|
240
239
|
|
|
241
240
|
<a id="getinclude-read-only-include"></a>
|
|
242
241
|
#### GetInclude (Read-Only / Include)
|
|
243
|
-
**Description:** [read-only]
|
|
242
|
+
**Description:** [read-only] Read ANY single ABAP include source by name, from anywhere in the repository (an include may live outside any single program tree). This is the correct tool for include names (PROG/I) — ReadProgram does not read includes.
|
|
244
243
|
|
|
245
244
|
**Source:** `src/handlers/include/readonly/handleGetInclude.ts`
|
|
246
245
|
|
|
@@ -317,23 +316,9 @@ Legacy systems support a subset of tools — primarily Class, Interface, View, P
|
|
|
317
316
|
<a id="read-only-program"></a>
|
|
318
317
|
### Read-Only / Program
|
|
319
318
|
|
|
320
|
-
<a id="getprogfullcode-read-only-program"></a>
|
|
321
|
-
#### GetProgFullCode (Read-Only / Program)
|
|
322
|
-
**Description:** [read-only] Returns the full code for a program or function group, including all includes, in tree traversal order.
|
|
323
|
-
|
|
324
|
-
**Source:** `src/handlers/program/readonly/handleGetProgFullCode.ts`
|
|
325
|
-
|
|
326
|
-
**Available in:** `onprem`, `legacy`
|
|
327
|
-
|
|
328
|
-
**Parameters:**
|
|
329
|
-
- `name` (string, required) - [read-only] Technical name of the program or function group (e.g., '/CBY/MM_INVENTORY')
|
|
330
|
-
- `type` (string, required) - [read-only] 'PROG/P' for program or 'FUGR' for function group
|
|
331
|
-
|
|
332
|
-
---
|
|
333
|
-
|
|
334
319
|
<a id="readprogram-read-only-program"></a>
|
|
335
320
|
#### ReadProgram (Read-Only / Program)
|
|
336
|
-
**Description:**
|
|
321
|
+
**Description:** [read-only] Read a MAIN ABAP program (report) source code and metadata by name. Works ONLY for main programs (adtcore type PROG/P); NOT for includes — use GetInclude for include source. Include names (PROG/I) and other object types are rejected with error "invalid_object_type". Answers: "show program code", "display report source", "view program X", "get program source". Returns source code, package, responsible, description.
|
|
337
322
|
|
|
338
323
|
**Source:** `src/handlers/program/readonly/handleReadProgram.ts`
|
|
339
324
|
|
|
@@ -2410,4 +2395,4 @@ Legacy systems support a subset of tools — primarily Class, Interface, View, P
|
|
|
2410
2395
|
|
|
2411
2396
|
---
|
|
2412
2397
|
|
|
2413
|
-
*Last updated: 2026-05-
|
|
2398
|
+
*Last updated: 2026-05-30*
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Generated from code in `src/handlers/**` (not from docs).
|
|
4
4
|
|
|
5
5
|
- Level: Read-Only
|
|
6
|
-
- Total tools:
|
|
6
|
+
- Total tools: 55
|
|
7
7
|
|
|
8
8
|
## Navigation
|
|
9
9
|
|
|
@@ -37,7 +37,6 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
37
37
|
- [GetPackageContents](#getpackagecontents-read-only-package)
|
|
38
38
|
- [ReadPackage](#readpackage-read-only-package)
|
|
39
39
|
- [Program](#read-only-program)
|
|
40
|
-
- [GetProgFullCode](#getprogfullcode-read-only-program)
|
|
41
40
|
- [ReadProgram](#readprogram-read-only-program)
|
|
42
41
|
- [Search](#read-only-search)
|
|
43
42
|
- [GetObjectsByType](#getobjectsbytype-read-only-search)
|
|
@@ -240,7 +239,7 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
240
239
|
|
|
241
240
|
<a id="getinclude-read-only-include"></a>
|
|
242
241
|
#### GetInclude (Read-Only / Include)
|
|
243
|
-
**Description:** [read-only]
|
|
242
|
+
**Description:** [read-only] Read ANY single ABAP include source by name, from anywhere in the repository (an include may live outside any single program tree). This is the correct tool for include names (PROG/I) — ReadProgram does not read includes.
|
|
244
243
|
|
|
245
244
|
**Source:** `src/handlers/include/readonly/handleGetInclude.ts`
|
|
246
245
|
|
|
@@ -322,21 +321,9 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
322
321
|
<a id="read-only-program"></a>
|
|
323
322
|
### Read-Only / Program
|
|
324
323
|
|
|
325
|
-
<a id="getprogfullcode-read-only-program"></a>
|
|
326
|
-
#### GetProgFullCode (Read-Only / Program)
|
|
327
|
-
**Description:** [read-only] Returns the full code for a program or function group, including all includes, in tree traversal order.
|
|
328
|
-
|
|
329
|
-
**Source:** `src/handlers/program/readonly/handleGetProgFullCode.ts`
|
|
330
|
-
|
|
331
|
-
**Parameters:**
|
|
332
|
-
- `name` (string, required) - [read-only] Technical name of the program or function group (e.g., '/CBY/MM_INVENTORY')
|
|
333
|
-
- `type` (string, required) - [read-only] 'PROG/P' for program or 'FUGR' for function group
|
|
334
|
-
|
|
335
|
-
---
|
|
336
|
-
|
|
337
324
|
<a id="readprogram-read-only-program"></a>
|
|
338
325
|
#### ReadProgram (Read-Only / Program)
|
|
339
|
-
**Description:**
|
|
326
|
+
**Description:** [read-only] Read a MAIN ABAP program (report) source code and metadata by name. Works ONLY for main programs (adtcore type PROG/P); NOT for includes — use GetInclude for include source. Include names (PROG/I) and other object types are rejected with error "invalid_object_type". Answers: "show program code", "display report source", "view program X", "get program source". Returns source code, package, responsible, description.
|
|
340
327
|
|
|
341
328
|
**Source:** `src/handlers/program/readonly/handleReadProgram.ts`
|
|
342
329
|
|
|
@@ -913,4 +900,4 @@ Generated from code in `src/handlers/**` (not from docs).
|
|
|
913
900
|
|
|
914
901
|
---
|
|
915
902
|
|
|
916
|
-
*Last updated: 2026-05-
|
|
903
|
+
*Last updated: 2026-05-30*
|
|
@@ -109,7 +109,7 @@ Valid combinations: `[readonly]`, `[readonly, high]`, `[readonly, low]`, `[high]
|
|
|
109
109
|
|
|
110
110
|
When both `readonly` and `high` are exposed, `Read<X>` readonly handlers duplicate the corresponding `Get<X>` from the high-level group (e.g. `ReadFunctionModule` vs `GetFunctionModule`). The launcher hides the readonly `Read<X>` variants in this case so that only one tool per operation is visible to the client.
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
`EmbeddableMcpServer` applies the same dedup by default, so embedders see one tool per operation just like the launcher. Consumers that need both variants can opt out by passing `new NoDedupStrategy()` as `readOnlyDedupStrategy`. See [EmbeddableMcpServer dedup strategies](#embeddablemcpserver-dedup-strategies) below.
|
|
113
113
|
|
|
114
114
|
### Config File
|
|
115
115
|
|
|
@@ -280,7 +280,9 @@ import {
|
|
|
280
280
|
const server = new EmbeddableMcpServer({
|
|
281
281
|
connection,
|
|
282
282
|
exposition: ['readonly', 'high'],
|
|
283
|
-
//
|
|
283
|
+
// Default already applies ReadVsGetDedupStrategy — hides ReadFunctionModule
|
|
284
|
+
// when GetFunctionModule is exposed, etc. Pass it explicitly to be explicit,
|
|
285
|
+
// or pass `new NoDedupStrategy()` to expose both variants.
|
|
284
286
|
readOnlyDedupStrategy: new ReadVsGetDedupStrategy(),
|
|
285
287
|
});
|
|
286
288
|
```
|
|
@@ -289,8 +291,8 @@ const server = new EmbeddableMcpServer({
|
|
|
289
291
|
|
|
290
292
|
| Strategy | Behavior |
|
|
291
293
|
|---|---|
|
|
292
|
-
| `NoDedupStrategy`
|
|
293
|
-
| `ReadVsGetDedupStrategy` | Hides a `Read<X>` entry when a corresponding `Get<X>` is contributed by another group. |
|
|
294
|
+
| `NoDedupStrategy` | Never excludes anything — readonly group is exposed as-is (opt-out). |
|
|
295
|
+
| `ReadVsGetDedupStrategy` (default) | Hides a `Read<X>` entry when a corresponding `Get<X>` is contributed by another group. |
|
|
294
296
|
|
|
295
297
|
**Custom strategies**: implement `IReadOnlyDedupStrategy` for role-based or domain-specific rules:
|
|
296
298
|
|
|
@@ -311,4 +313,4 @@ class RoleAwareDedup implements IReadOnlyDedupStrategy {
|
|
|
311
313
|
}
|
|
312
314
|
```
|
|
313
315
|
|
|
314
|
-
The default (
|
|
316
|
+
The default (`ReadVsGetDedupStrategy`) gives embedders the same single-tool-per-operation view as the launcher. Consumers that relied on both `Read<X>` and `Get<X>` being exposed must pass `new NoDedupStrategy()` to keep that behavior.
|