@mcp-abap-adt/core 1.4.3 → 2.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 +36 -0
- package/dist/lib/handlers/HandlerExporter.d.ts +16 -23
- package/dist/lib/handlers/HandlerExporter.d.ts.map +1 -1
- package/dist/lib/handlers/HandlerExporter.js +17 -71
- package/dist/lib/handlers/HandlerExporter.js.map +1 -1
- package/dist/server/EmbeddableMcpServer.d.ts +72 -0
- package/dist/server/EmbeddableMcpServer.d.ts.map +1 -0
- package/dist/server/EmbeddableMcpServer.js +88 -0
- package/dist/server/EmbeddableMcpServer.js.map +1 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,42 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [2.0.0] - 2025-12-30
|
|
6
|
+
### Added
|
|
7
|
+
- **EmbeddableMcpServer**: New server class for external integration (e.g., cloud-llm-hub)
|
|
8
|
+
- Accepts injected `AbapConnection` from consumer
|
|
9
|
+
- Extends `BaseMcpServer` with proper handler registration
|
|
10
|
+
- Configurable exposition levels: `readonly`, `high`, `low`, `system`, `search`
|
|
11
|
+
- Export via `@mcp-abap-adt/core/server`
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- **HandlerExporter**: Now serves only as registry factory
|
|
15
|
+
- Use `createRegistry()` to get `IHandlersRegistry` for custom scenarios
|
|
16
|
+
- `getHandlerEntries()` and `getToolNames()` still available for inspection
|
|
17
|
+
|
|
18
|
+
### Removed
|
|
19
|
+
- **BREAKING**: `HandlerExporter.registerOnServer()` method removed
|
|
20
|
+
- Had bug with handler signature (passed context twice)
|
|
21
|
+
- Replace with `EmbeddableMcpServer` for cleaner architecture
|
|
22
|
+
|
|
23
|
+
### Migration Guide
|
|
24
|
+
```typescript
|
|
25
|
+
// Before (v1.x - broken)
|
|
26
|
+
import { HandlerExporter } from '@mcp-abap-adt/core/handlers';
|
|
27
|
+
const exporter = new HandlerExporter({ includeReadOnly: true, includeHighLevel: true });
|
|
28
|
+
const mcpServer = new McpServer({ name: 'mcp-abap-adt', version: '1.0.0' });
|
|
29
|
+
exporter.registerOnServer(mcpServer, () => connection, logger);
|
|
30
|
+
|
|
31
|
+
// After (v2.x)
|
|
32
|
+
import { EmbeddableMcpServer } from '@mcp-abap-adt/core/server';
|
|
33
|
+
const server = new EmbeddableMcpServer({
|
|
34
|
+
connection,
|
|
35
|
+
logger,
|
|
36
|
+
exposition: ['readonly', 'high'],
|
|
37
|
+
});
|
|
38
|
+
await server.connect(transport);
|
|
39
|
+
```
|
|
40
|
+
|
|
5
41
|
## [1.4.3] - 2025-12-29
|
|
6
42
|
### Documentation
|
|
7
43
|
- **CLI Help**: Extended `--help` output with comprehensive environment variables documentation
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import type { AbapConnection } from '@mcp-abap-adt/connection';
|
|
2
1
|
import type { Logger } from '@mcp-abap-adt/logger';
|
|
3
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
2
|
import type { HandlerEntry, IHandlersRegistry } from './interfaces.js';
|
|
5
3
|
/**
|
|
6
4
|
* Options for creating handler exporter
|
|
@@ -38,21 +36,27 @@ export interface HandlerExporterOptions {
|
|
|
38
36
|
includeSearch?: boolean;
|
|
39
37
|
}
|
|
40
38
|
/**
|
|
41
|
-
* Handler Exporter -
|
|
39
|
+
* Handler Exporter - factory for creating handlers registry
|
|
42
40
|
*
|
|
43
|
-
* This class provides a
|
|
44
|
-
*
|
|
45
|
-
* their own connection lifecycle.
|
|
41
|
+
* This class provides a way to create handlers registry with configurable
|
|
42
|
+
* exposition levels. Use with EmbeddableMcpServer for external integration.
|
|
46
43
|
*
|
|
47
44
|
* Usage:
|
|
48
45
|
* ```typescript
|
|
49
|
-
* import { HandlerExporter } from '@
|
|
46
|
+
* import { HandlerExporter, EmbeddableMcpServer } from '@mcp-abap-adt/core';
|
|
50
47
|
*
|
|
51
|
-
* // Create exporter
|
|
52
|
-
* const exporter = new HandlerExporter(
|
|
48
|
+
* // Create exporter with specific handlers
|
|
49
|
+
* const exporter = new HandlerExporter({
|
|
50
|
+
* includeReadOnly: true,
|
|
51
|
+
* includeHighLevel: true,
|
|
52
|
+
* includeLowLevel: false,
|
|
53
|
+
* });
|
|
53
54
|
*
|
|
54
|
-
* //
|
|
55
|
-
*
|
|
55
|
+
* // Use with EmbeddableMcpServer
|
|
56
|
+
* const server = new EmbeddableMcpServer({
|
|
57
|
+
* connection: myConnection,
|
|
58
|
+
* handlersRegistry: exporter.createRegistry(),
|
|
59
|
+
* });
|
|
56
60
|
* ```
|
|
57
61
|
*/
|
|
58
62
|
export declare class HandlerExporter {
|
|
@@ -69,20 +73,9 @@ export declare class HandlerExporter {
|
|
|
69
73
|
*/
|
|
70
74
|
getToolNames(): string[];
|
|
71
75
|
/**
|
|
72
|
-
* Create handlers registry for use with
|
|
76
|
+
* Create handlers registry for use with EmbeddableMcpServer or BaseMcpServer
|
|
73
77
|
*/
|
|
74
78
|
createRegistry(): IHandlersRegistry;
|
|
75
|
-
/**
|
|
76
|
-
* Register all handlers on an McpServer instance
|
|
77
|
-
*
|
|
78
|
-
* @param server - McpServer instance to register handlers on
|
|
79
|
-
* @param connectionProvider - Function that returns AbapConnection for each request
|
|
80
|
-
* @param logger - Optional logger (defaults to constructor logger)
|
|
81
|
-
*
|
|
82
|
-
* The connectionProvider is called for each handler invocation, allowing
|
|
83
|
-
* per-request connection management (e.g., different JWT tokens per request)
|
|
84
|
-
*/
|
|
85
|
-
registerOnServer(server: McpServer, connectionProvider: () => AbapConnection | Promise<AbapConnection>, logger?: Logger): void;
|
|
86
79
|
}
|
|
87
80
|
/**
|
|
88
81
|
* Create default handler exporter with all handler groups
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandlerExporter.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/HandlerExporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"HandlerExporter.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/HandlerExporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAQnD,OAAO,KAAK,EACV,YAAY,EAEZ,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAGzB;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;gBAEpC,OAAO,CAAC,EAAE,sBAAsB;IA8B5C;;;OAGG;IACH,iBAAiB,IAAI,YAAY,EAAE;IAQnC;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAIxB;;OAEG;IACH,cAAc,IAAI,iBAAiB;CAGpC;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAE7E"}
|
|
@@ -10,21 +10,27 @@ const SearchHandlersGroup_js_1 = require("./groups/SearchHandlersGroup.js");
|
|
|
10
10
|
const SystemHandlersGroup_js_1 = require("./groups/SystemHandlersGroup.js");
|
|
11
11
|
const CompositeHandlersRegistry_js_1 = require("./registry/CompositeHandlersRegistry.js");
|
|
12
12
|
/**
|
|
13
|
-
* Handler Exporter -
|
|
13
|
+
* Handler Exporter - factory for creating handlers registry
|
|
14
14
|
*
|
|
15
|
-
* This class provides a
|
|
16
|
-
*
|
|
17
|
-
* their own connection lifecycle.
|
|
15
|
+
* This class provides a way to create handlers registry with configurable
|
|
16
|
+
* exposition levels. Use with EmbeddableMcpServer for external integration.
|
|
18
17
|
*
|
|
19
18
|
* Usage:
|
|
20
19
|
* ```typescript
|
|
21
|
-
* import { HandlerExporter } from '@
|
|
20
|
+
* import { HandlerExporter, EmbeddableMcpServer } from '@mcp-abap-adt/core';
|
|
22
21
|
*
|
|
23
|
-
* // Create exporter
|
|
24
|
-
* const exporter = new HandlerExporter(
|
|
22
|
+
* // Create exporter with specific handlers
|
|
23
|
+
* const exporter = new HandlerExporter({
|
|
24
|
+
* includeReadOnly: true,
|
|
25
|
+
* includeHighLevel: true,
|
|
26
|
+
* includeLowLevel: false,
|
|
27
|
+
* });
|
|
25
28
|
*
|
|
26
|
-
* //
|
|
27
|
-
*
|
|
29
|
+
* // Use with EmbeddableMcpServer
|
|
30
|
+
* const server = new EmbeddableMcpServer({
|
|
31
|
+
* connection: myConnection,
|
|
32
|
+
* handlersRegistry: exporter.createRegistry(),
|
|
33
|
+
* });
|
|
28
34
|
* ```
|
|
29
35
|
*/
|
|
30
36
|
class HandlerExporter {
|
|
@@ -33,7 +39,7 @@ class HandlerExporter {
|
|
|
33
39
|
constructor(options) {
|
|
34
40
|
this.logger = options?.logger ?? logger_1.defaultLogger;
|
|
35
41
|
// Create dummy context for group instantiation
|
|
36
|
-
// Real context
|
|
42
|
+
// Real context is provided by BaseMcpServer.registerHandlers() via getConnection()
|
|
37
43
|
const dummyContext = {
|
|
38
44
|
connection: null,
|
|
39
45
|
logger: this.logger,
|
|
@@ -74,71 +80,11 @@ class HandlerExporter {
|
|
|
74
80
|
return this.getHandlerEntries().map((e) => e.toolDefinition.name);
|
|
75
81
|
}
|
|
76
82
|
/**
|
|
77
|
-
* Create handlers registry for use with
|
|
83
|
+
* Create handlers registry for use with EmbeddableMcpServer or BaseMcpServer
|
|
78
84
|
*/
|
|
79
85
|
createRegistry() {
|
|
80
86
|
return new CompositeHandlersRegistry_js_1.CompositeHandlersRegistry(this.handlerGroups);
|
|
81
87
|
}
|
|
82
|
-
/**
|
|
83
|
-
* Register all handlers on an McpServer instance
|
|
84
|
-
*
|
|
85
|
-
* @param server - McpServer instance to register handlers on
|
|
86
|
-
* @param connectionProvider - Function that returns AbapConnection for each request
|
|
87
|
-
* @param logger - Optional logger (defaults to constructor logger)
|
|
88
|
-
*
|
|
89
|
-
* The connectionProvider is called for each handler invocation, allowing
|
|
90
|
-
* per-request connection management (e.g., different JWT tokens per request)
|
|
91
|
-
*/
|
|
92
|
-
registerOnServer(server, connectionProvider, logger) {
|
|
93
|
-
const log = logger ?? this.logger;
|
|
94
|
-
for (const group of this.handlerGroups) {
|
|
95
|
-
const handlers = group.getHandlers();
|
|
96
|
-
for (const entry of handlers) {
|
|
97
|
-
// Wrap handler to inject connection from provider
|
|
98
|
-
const wrappedHandler = async (args) => {
|
|
99
|
-
const connection = await connectionProvider();
|
|
100
|
-
const context = {
|
|
101
|
-
connection,
|
|
102
|
-
logger: log,
|
|
103
|
-
};
|
|
104
|
-
const result = await entry.handler(context, args);
|
|
105
|
-
// Handle errors: if handler returns isError, throw McpError
|
|
106
|
-
if (result?.isError) {
|
|
107
|
-
const { ErrorCode, McpError } = await import('@modelcontextprotocol/sdk/types.js');
|
|
108
|
-
const errorText = (result.content || [])
|
|
109
|
-
.map((item) => {
|
|
110
|
-
if (item?.type === 'json' && item.json !== undefined) {
|
|
111
|
-
return JSON.stringify(item.json);
|
|
112
|
-
}
|
|
113
|
-
return item?.text || String(item);
|
|
114
|
-
})
|
|
115
|
-
.join('\n') || 'Unknown error';
|
|
116
|
-
throw new McpError(ErrorCode.InternalError, errorText);
|
|
117
|
-
}
|
|
118
|
-
// Normalize content: SDK expects text/image/audio/resource, convert custom json to text
|
|
119
|
-
const content = (result?.content || []).map((item) => {
|
|
120
|
-
if (item?.type === 'json' && item.json !== undefined) {
|
|
121
|
-
return {
|
|
122
|
-
type: 'text',
|
|
123
|
-
text: JSON.stringify(item.json),
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
return {
|
|
127
|
-
type: 'text',
|
|
128
|
-
text: item?.text || String(item || ''),
|
|
129
|
-
};
|
|
130
|
-
});
|
|
131
|
-
return { content };
|
|
132
|
-
};
|
|
133
|
-
// Register tool on server
|
|
134
|
-
server.registerTool(entry.toolDefinition.name, {
|
|
135
|
-
description: entry.toolDefinition.description,
|
|
136
|
-
inputSchema: entry.toolDefinition.inputSchema,
|
|
137
|
-
}, wrappedHandler);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
log.info?.(`[HandlerExporter] Registered ${this.getToolNames().length} tools on server`);
|
|
141
|
-
}
|
|
142
88
|
}
|
|
143
89
|
exports.HandlerExporter = HandlerExporter;
|
|
144
90
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandlerExporter.js","sourceRoot":"","sources":["../../../src/lib/handlers/HandlerExporter.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"HandlerExporter.js","sourceRoot":"","sources":["../../../src/lib/handlers/HandlerExporter.ts"],"names":[],"mappings":";;;AAgJA,oEAEC;AAjJD,iDAAqD;AAErD,kFAA4E;AAC5E,gFAA0E;AAC1E,gFAA0E;AAC1E,4EAAsE;AACtE,4EAAsE;AAMtE,0FAAoF;AA2CpF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAa,eAAe;IACT,MAAM,CAAS;IACf,aAAa,CAAkB;IAEhD,YAAY,OAAgC;QAC1C,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,sBAAa,CAAC;QAE/C,+CAA+C;QAC/C,mFAAmF;QACnF,MAAM,YAAY,GAAmB;YACnC,UAAU,EAAE,IAAW;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;QAEF,wCAAwC;QACxC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAExB,IAAI,OAAO,EAAE,eAAe,KAAK,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,gDAAqB,CAAC,YAAY,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,EAAE,gBAAgB,KAAK,KAAK,EAAE,CAAC;YACxC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,kDAAsB,CAAC,YAAY,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,OAAO,EAAE,eAAe,KAAK,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,gDAAqB,CAAC,YAAY,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,EAAE,aAAa,KAAK,KAAK,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,4CAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,OAAO,EAAE,aAAa,KAAK,KAAK,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,4CAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,iBAAiB;QACf,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,wDAAyB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC;CACF;AA3DD,0CA2DC;AAED;;GAEG;AACH,SAAgB,4BAA4B,CAAC,MAAe;IAC1D,OAAO,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { AbapConnection } from '@mcp-abap-adt/connection';
|
|
2
|
+
import { type Logger } from '@mcp-abap-adt/logger';
|
|
3
|
+
import type { IHandlersRegistry } from '../lib/handlers/interfaces.js';
|
|
4
|
+
import { BaseMcpServer } from './BaseMcpServer.js';
|
|
5
|
+
/**
|
|
6
|
+
* Options for EmbeddableMcpServer
|
|
7
|
+
*/
|
|
8
|
+
export interface EmbeddableMcpServerOptions {
|
|
9
|
+
/**
|
|
10
|
+
* ABAP connection to use for all handler calls
|
|
11
|
+
* Injected from consumer (e.g., CloudSdkAbapConnection in cloud-llm-hub)
|
|
12
|
+
*/
|
|
13
|
+
connection: AbapConnection;
|
|
14
|
+
/**
|
|
15
|
+
* Logger instance
|
|
16
|
+
* @default defaultLogger
|
|
17
|
+
*/
|
|
18
|
+
logger?: Logger;
|
|
19
|
+
/**
|
|
20
|
+
* Handlers registry to use
|
|
21
|
+
* If not provided, default registry is created based on exposition option
|
|
22
|
+
*/
|
|
23
|
+
handlersRegistry?: IHandlersRegistry;
|
|
24
|
+
/**
|
|
25
|
+
* Exposition levels to include when creating default registry
|
|
26
|
+
* @default ['readonly', 'high']
|
|
27
|
+
*/
|
|
28
|
+
exposition?: ('readonly' | 'high' | 'low' | 'system' | 'search')[];
|
|
29
|
+
/**
|
|
30
|
+
* Server version
|
|
31
|
+
* @default from package.json or '1.0.0'
|
|
32
|
+
*/
|
|
33
|
+
version?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Embeddable MCP Server for integration with external applications
|
|
37
|
+
*
|
|
38
|
+
* This server is designed for consumers like cloud-llm-hub that:
|
|
39
|
+
* - Have their own connection management (e.g., BTP destinations, Cloud SDK)
|
|
40
|
+
* - Create new server instance per request (SSE/HTTP mode)
|
|
41
|
+
* - Need to inject connection from outside
|
|
42
|
+
*
|
|
43
|
+
* Usage:
|
|
44
|
+
* ```typescript
|
|
45
|
+
* // Create connection (consumer's own implementation)
|
|
46
|
+
* const connection = new CloudSdkAbapConnection(config);
|
|
47
|
+
*
|
|
48
|
+
* // Create embeddable server with injected connection
|
|
49
|
+
* const server = new EmbeddableMcpServer({
|
|
50
|
+
* connection,
|
|
51
|
+
* logger: myLogger,
|
|
52
|
+
* exposition: ['readonly', 'high'],
|
|
53
|
+
* });
|
|
54
|
+
*
|
|
55
|
+
* // Connect transport and handle request
|
|
56
|
+
* await server.connect(transport);
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare class EmbeddableMcpServer extends BaseMcpServer {
|
|
60
|
+
private readonly injectedConnection;
|
|
61
|
+
constructor(options: EmbeddableMcpServerOptions);
|
|
62
|
+
/**
|
|
63
|
+
* Returns the injected connection
|
|
64
|
+
* Called by BaseMcpServer.registerHandlers() wrapper lambdas
|
|
65
|
+
*/
|
|
66
|
+
protected getConnection(): Promise<AbapConnection>;
|
|
67
|
+
/**
|
|
68
|
+
* Creates default handlers registry based on exposition levels
|
|
69
|
+
*/
|
|
70
|
+
private createDefaultRegistry;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=EmbeddableMcpServer.d.ts.map
|
|
@@ -0,0 +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,EAAiB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAOlE,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AAEvC,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,CAAC,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC;IAEnE;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiB;gBAExC,OAAO,EAAE,0BAA0B;IAoB/C;;;OAGG;cACa,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC;IAIxD;;OAEG;IACH,OAAO,CAAC,qBAAqB;CA+B9B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EmbeddableMcpServer = void 0;
|
|
4
|
+
const logger_1 = require("@mcp-abap-adt/logger");
|
|
5
|
+
const HighLevelHandlersGroup_js_1 = require("../lib/handlers/groups/HighLevelHandlersGroup.js");
|
|
6
|
+
const LowLevelHandlersGroup_js_1 = require("../lib/handlers/groups/LowLevelHandlersGroup.js");
|
|
7
|
+
const ReadOnlyHandlersGroup_js_1 = require("../lib/handlers/groups/ReadOnlyHandlersGroup.js");
|
|
8
|
+
const SearchHandlersGroup_js_1 = require("../lib/handlers/groups/SearchHandlersGroup.js");
|
|
9
|
+
const SystemHandlersGroup_js_1 = require("../lib/handlers/groups/SystemHandlersGroup.js");
|
|
10
|
+
const CompositeHandlersRegistry_js_1 = require("../lib/handlers/registry/CompositeHandlersRegistry.js");
|
|
11
|
+
const BaseMcpServer_js_1 = require("./BaseMcpServer.js");
|
|
12
|
+
const DEFAULT_VERSION = process.env.npm_package_version ?? '1.0.0';
|
|
13
|
+
/**
|
|
14
|
+
* Embeddable MCP Server for integration with external applications
|
|
15
|
+
*
|
|
16
|
+
* This server is designed for consumers like cloud-llm-hub that:
|
|
17
|
+
* - Have their own connection management (e.g., BTP destinations, Cloud SDK)
|
|
18
|
+
* - Create new server instance per request (SSE/HTTP mode)
|
|
19
|
+
* - Need to inject connection from outside
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // Create connection (consumer's own implementation)
|
|
24
|
+
* const connection = new CloudSdkAbapConnection(config);
|
|
25
|
+
*
|
|
26
|
+
* // Create embeddable server with injected connection
|
|
27
|
+
* const server = new EmbeddableMcpServer({
|
|
28
|
+
* connection,
|
|
29
|
+
* logger: myLogger,
|
|
30
|
+
* exposition: ['readonly', 'high'],
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* // Connect transport and handle request
|
|
34
|
+
* await server.connect(transport);
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
class EmbeddableMcpServer extends BaseMcpServer_js_1.BaseMcpServer {
|
|
38
|
+
injectedConnection;
|
|
39
|
+
constructor(options) {
|
|
40
|
+
super({
|
|
41
|
+
name: 'mcp-abap-adt',
|
|
42
|
+
version: options.version ?? DEFAULT_VERSION,
|
|
43
|
+
logger: options.logger ?? logger_1.defaultLogger,
|
|
44
|
+
});
|
|
45
|
+
this.injectedConnection = options.connection;
|
|
46
|
+
// Use provided registry or create default based on exposition
|
|
47
|
+
const registry = options.handlersRegistry ??
|
|
48
|
+
this.createDefaultRegistry(options.exposition ?? ['readonly', 'high'], options.logger);
|
|
49
|
+
this.registerHandlers(registry);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Returns the injected connection
|
|
53
|
+
* Called by BaseMcpServer.registerHandlers() wrapper lambdas
|
|
54
|
+
*/
|
|
55
|
+
async getConnection() {
|
|
56
|
+
return this.injectedConnection;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Creates default handlers registry based on exposition levels
|
|
60
|
+
*/
|
|
61
|
+
createDefaultRegistry(exposition, logger) {
|
|
62
|
+
// Dummy context - not actually used because BaseMcpServer.registerHandlers()
|
|
63
|
+
// creates wrapper lambdas that call getConnection() for fresh context
|
|
64
|
+
const dummyContext = {
|
|
65
|
+
connection: null,
|
|
66
|
+
logger: logger ?? logger_1.defaultLogger,
|
|
67
|
+
};
|
|
68
|
+
const groups = [];
|
|
69
|
+
if (exposition.includes('readonly')) {
|
|
70
|
+
groups.push(new ReadOnlyHandlersGroup_js_1.ReadOnlyHandlersGroup(dummyContext));
|
|
71
|
+
}
|
|
72
|
+
if (exposition.includes('high')) {
|
|
73
|
+
groups.push(new HighLevelHandlersGroup_js_1.HighLevelHandlersGroup(dummyContext));
|
|
74
|
+
}
|
|
75
|
+
if (exposition.includes('low')) {
|
|
76
|
+
groups.push(new LowLevelHandlersGroup_js_1.LowLevelHandlersGroup(dummyContext));
|
|
77
|
+
}
|
|
78
|
+
if (exposition.includes('system')) {
|
|
79
|
+
groups.push(new SystemHandlersGroup_js_1.SystemHandlersGroup(dummyContext));
|
|
80
|
+
}
|
|
81
|
+
if (exposition.includes('search')) {
|
|
82
|
+
groups.push(new SearchHandlersGroup_js_1.SearchHandlersGroup(dummyContext));
|
|
83
|
+
}
|
|
84
|
+
return new CompositeHandlersRegistry_js_1.CompositeHandlersRegistry(groups);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.EmbeddableMcpServer = EmbeddableMcpServer;
|
|
88
|
+
//# sourceMappingURL=EmbeddableMcpServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbeddableMcpServer.js","sourceRoot":"","sources":["../../src/server/EmbeddableMcpServer.ts"],"names":[],"mappings":";;;AACA,iDAAkE;AAElE,gGAA0F;AAC1F,8FAAwF;AACxF,8FAAwF;AACxF,0FAAoF;AACpF,0FAAoF;AAKpF,wGAAkG;AAClG,yDAAmD;AAEnD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC;AAqCnE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAa,mBAAoB,SAAQ,gCAAa;IACnC,kBAAkB,CAAiB;IAEpD,YAAY,OAAmC;QAC7C,KAAK,CAAC;YACJ,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,eAAe;YAC3C,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,sBAAa;SACxC,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;QAE7C,8DAA8D;QAC9D,MAAM,QAAQ,GACZ,OAAO,CAAC,gBAAgB;YACxB,IAAI,CAAC,qBAAqB,CACxB,OAAO,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAC1C,OAAO,CAAC,MAAM,CACf,CAAC;QAEJ,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,aAAa;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;OAEG;IACK,qBAAqB,CAC3B,UAAiE,EACjE,MAAe;QAEf,6EAA6E;QAC7E,sEAAsE;QACtE,MAAM,YAAY,GAAmB;YACnC,UAAU,EAAE,IAAW;YACvB,MAAM,EAAE,MAAM,IAAI,sBAAa;SAChC,CAAC;QAEF,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,IAAI,gDAAqB,CAAC,YAAY,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAI,kDAAsB,CAAC,YAAY,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,gDAAqB,CAAC,YAAY,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,IAAI,4CAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,IAAI,4CAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAI,wDAAyB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;CACF;AAjED,kDAiEC"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC"}
|
package/dist/server/index.js
CHANGED
|
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./BaseMcpServer.js"), exports);
|
|
18
|
+
__exportStar(require("./EmbeddableMcpServer.js"), exports);
|
|
18
19
|
__exportStar(require("./IHttpApplication.js"), exports);
|
|
19
20
|
__exportStar(require("./SseServer.js"), exports);
|
|
20
21
|
__exportStar(require("./StdioServer.js"), exports);
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,wDAAsC;AACtC,iDAA+B;AAC/B,mDAAiC;AACjC,4DAA0C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,2DAAyC;AACzC,wDAAsC;AACtC,iDAA+B;AAC/B,mDAAiC;AACjC,4DAA0C"}
|