arc-1 0.1.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/LICENSE +21 -0
- package/README.md +222 -0
- package/bin/arc1.js +12 -0
- package/dist/adt/btp.d.ts +122 -0
- package/dist/adt/btp.d.ts.map +1 -0
- package/dist/adt/btp.js +392 -0
- package/dist/adt/btp.js.map +1 -0
- package/dist/adt/client.d.ts +89 -0
- package/dist/adt/client.d.ts.map +1 -0
- package/dist/adt/client.js +208 -0
- package/dist/adt/client.js.map +1 -0
- package/dist/adt/codeintel.d.ts +38 -0
- package/dist/adt/codeintel.d.ts.map +1 -0
- package/dist/adt/codeintel.js +61 -0
- package/dist/adt/codeintel.js.map +1 -0
- package/dist/adt/config.d.ts +65 -0
- package/dist/adt/config.d.ts.map +1 -0
- package/dist/adt/config.js +35 -0
- package/dist/adt/config.js.map +1 -0
- package/dist/adt/cookies.d.ts +27 -0
- package/dist/adt/cookies.d.ts.map +1 -0
- package/dist/adt/cookies.js +67 -0
- package/dist/adt/cookies.js.map +1 -0
- package/dist/adt/crud.d.ts +35 -0
- package/dist/adt/crud.d.ts.map +1 -0
- package/dist/adt/crud.js +87 -0
- package/dist/adt/crud.js.map +1 -0
- package/dist/adt/devtools.d.ts +32 -0
- package/dist/adt/devtools.d.ts.map +1 -0
- package/dist/adt/devtools.js +154 -0
- package/dist/adt/devtools.js.map +1 -0
- package/dist/adt/errors.d.ts +49 -0
- package/dist/adt/errors.d.ts.map +1 -0
- package/dist/adt/errors.js +80 -0
- package/dist/adt/errors.js.map +1 -0
- package/dist/adt/features.d.ts +44 -0
- package/dist/adt/features.d.ts.map +1 -0
- package/dist/adt/features.js +173 -0
- package/dist/adt/features.js.map +1 -0
- package/dist/adt/http.d.ts +116 -0
- package/dist/adt/http.d.ts.map +1 -0
- package/dist/adt/http.js +374 -0
- package/dist/adt/http.js.map +1 -0
- package/dist/adt/safety.d.ts +70 -0
- package/dist/adt/safety.d.ts.map +1 -0
- package/dist/adt/safety.js +222 -0
- package/dist/adt/safety.js.map +1 -0
- package/dist/adt/transport.d.ts +18 -0
- package/dist/adt/transport.d.ts.map +1 -0
- package/dist/adt/transport.js +66 -0
- package/dist/adt/transport.js.map +1 -0
- package/dist/adt/types.d.ts +91 -0
- package/dist/adt/types.d.ts.map +1 -0
- package/dist/adt/types.js +9 -0
- package/dist/adt/types.js.map +1 -0
- package/dist/adt/xml-parser.d.ts +109 -0
- package/dist/adt/xml-parser.d.ts.map +1 -0
- package/dist/adt/xml-parser.js +283 -0
- package/dist/adt/xml-parser.js.map +1 -0
- package/dist/cache/cache.d.ts +61 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +14 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/memory.d.ts +25 -0
- package/dist/cache/memory.d.ts.map +1 -0
- package/dist/cache/memory.js +69 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/sqlite.d.ts +26 -0
- package/dist/cache/sqlite.d.ts.map +1 -0
- package/dist/cache/sqlite.js +130 -0
- package/dist/cache/sqlite.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +101 -0
- package/dist/cli.js.map +1 -0
- package/dist/context/compressor.d.ts +33 -0
- package/dist/context/compressor.d.ts.map +1 -0
- package/dist/context/compressor.js +208 -0
- package/dist/context/compressor.js.map +1 -0
- package/dist/context/contract.d.ts +14 -0
- package/dist/context/contract.d.ts.map +1 -0
- package/dist/context/contract.js +202 -0
- package/dist/context/contract.js.map +1 -0
- package/dist/context/deps.d.ts +32 -0
- package/dist/context/deps.d.ts.map +1 -0
- package/dist/context/deps.js +240 -0
- package/dist/context/deps.js.map +1 -0
- package/dist/context/types.d.ts +56 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +10 -0
- package/dist/context/types.js.map +1 -0
- package/dist/handlers/intent.d.ts +46 -0
- package/dist/handlers/intent.d.ts.map +1 -0
- package/dist/handlers/intent.js +539 -0
- package/dist/handlers/intent.js.map +1 -0
- package/dist/handlers/tools.d.ts +21 -0
- package/dist/handlers/tools.d.ts.map +1 -0
- package/dist/handlers/tools.js +260 -0
- package/dist/handlers/tools.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/lint.d.ts +35 -0
- package/dist/lint/lint.d.ts.map +1 -0
- package/dist/lint/lint.js +67 -0
- package/dist/lint/lint.js.map +1 -0
- package/dist/server/audit.d.ts +96 -0
- package/dist/server/audit.d.ts.map +1 -0
- package/dist/server/audit.js +27 -0
- package/dist/server/audit.js.map +1 -0
- package/dist/server/config.d.ts +19 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +101 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/context.d.ts +20 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +20 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/elicit.d.ts +43 -0
- package/dist/server/elicit.d.ts.map +1 -0
- package/dist/server/elicit.js +183 -0
- package/dist/server/elicit.js.map +1 -0
- package/dist/server/http.d.ts +34 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +328 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/logger.d.ts +57 -0
- package/dist/server/logger.d.ts.map +1 -0
- package/dist/server/logger.js +129 -0
- package/dist/server/logger.js.map +1 -0
- package/dist/server/server.d.ts +25 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +307 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/sinks/btp-auditlog.d.ts +48 -0
- package/dist/server/sinks/btp-auditlog.d.ts.map +1 -0
- package/dist/server/sinks/btp-auditlog.js +232 -0
- package/dist/server/sinks/btp-auditlog.js.map +1 -0
- package/dist/server/sinks/file.d.ts +22 -0
- package/dist/server/sinks/file.d.ts.map +1 -0
- package/dist/server/sinks/file.js +59 -0
- package/dist/server/sinks/file.js.map +1 -0
- package/dist/server/sinks/stderr.d.ts +19 -0
- package/dist/server/sinks/stderr.d.ts.map +1 -0
- package/dist/server/sinks/stderr.js +63 -0
- package/dist/server/sinks/stderr.js.map +1 -0
- package/dist/server/sinks/types.d.ts +14 -0
- package/dist/server/sinks/types.d.ts.map +1 -0
- package/dist/server/sinks/types.js +8 -0
- package/dist/server/sinks/types.js.map +1 -0
- package/dist/server/types.d.ts +54 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +42 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/xsuaa.d.ts +77 -0
- package/dist/server/xsuaa.d.ts.map +1 -0
- package/dist/server/xsuaa.js +364 -0
- package/dist/server/xsuaa.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration parser for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Resolves configuration from CLI flags, environment variables, and defaults.
|
|
5
|
+
* Priority: CLI > env > .env > defaults
|
|
6
|
+
*
|
|
7
|
+
* Environment variable names match the Go version exactly (SAP_URL, SAP_USER, etc.)
|
|
8
|
+
* for drop-in compatibility with existing deployments and documentation.
|
|
9
|
+
*/
|
|
10
|
+
import { DEFAULT_CONFIG } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Parse CLI arguments and environment variables into a ServerConfig.
|
|
13
|
+
*
|
|
14
|
+
* We use a simple hand-rolled parser here (not commander) because
|
|
15
|
+
* the MCP server entry point needs to be fast and lightweight.
|
|
16
|
+
* Commander is used for the full CLI (cli.ts), not the server startup.
|
|
17
|
+
*/
|
|
18
|
+
export function parseArgs(args) {
|
|
19
|
+
const config = { ...DEFAULT_CONFIG };
|
|
20
|
+
// Helper: get a CLI flag value (--flag value or --flag=value)
|
|
21
|
+
const getFlag = (name) => {
|
|
22
|
+
const prefix = `--${name}=`;
|
|
23
|
+
for (let i = 0; i < args.length; i++) {
|
|
24
|
+
if (args[i] === `--${name}` && i + 1 < args.length) {
|
|
25
|
+
return args[i + 1];
|
|
26
|
+
}
|
|
27
|
+
if (args[i]?.startsWith(prefix)) {
|
|
28
|
+
return args[i].slice(prefix.length);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
};
|
|
33
|
+
// Helper: resolve value from CLI > env > default
|
|
34
|
+
const resolve = (flag, envVar, defaultVal) => {
|
|
35
|
+
return getFlag(flag) ?? process.env[envVar] ?? defaultVal;
|
|
36
|
+
};
|
|
37
|
+
const resolveBool = (flag, envVar, defaultVal) => {
|
|
38
|
+
const val = getFlag(flag) ?? process.env[envVar];
|
|
39
|
+
if (val === undefined)
|
|
40
|
+
return defaultVal;
|
|
41
|
+
return val === 'true' || val === '1';
|
|
42
|
+
};
|
|
43
|
+
const resolveFeature = (flag, envVar) => {
|
|
44
|
+
const val = getFlag(flag) ?? process.env[envVar] ?? 'auto';
|
|
45
|
+
if (val === 'on' || val === 'off')
|
|
46
|
+
return val;
|
|
47
|
+
return 'auto';
|
|
48
|
+
};
|
|
49
|
+
// --- SAP Connection ---
|
|
50
|
+
config.url = resolve('url', 'SAP_URL', '');
|
|
51
|
+
config.username = resolve('user', 'SAP_USER', '');
|
|
52
|
+
config.password = resolve('password', 'SAP_PASSWORD', '');
|
|
53
|
+
config.client = resolve('client', 'SAP_CLIENT', '001');
|
|
54
|
+
config.language = resolve('language', 'SAP_LANGUAGE', 'EN');
|
|
55
|
+
config.insecure = resolveBool('insecure', 'SAP_INSECURE', false);
|
|
56
|
+
// --- Cookie Auth ---
|
|
57
|
+
config.cookieFile = getFlag('cookie-file') ?? process.env.SAP_COOKIE_FILE;
|
|
58
|
+
config.cookieString = getFlag('cookie-string') ?? process.env.SAP_COOKIE_STRING;
|
|
59
|
+
// --- Transport ---
|
|
60
|
+
const transport = resolve('transport', 'SAP_TRANSPORT', 'stdio');
|
|
61
|
+
config.transport = (transport === 'http-streamable' ? 'http-streamable' : 'stdio');
|
|
62
|
+
config.httpAddr = resolve('http-addr', 'SAP_HTTP_ADDR', '0.0.0.0:8080');
|
|
63
|
+
// --- Safety ---
|
|
64
|
+
config.readOnly = resolveBool('read-only', 'SAP_READ_ONLY', false);
|
|
65
|
+
config.blockFreeSQL = resolveBool('block-free-sql', 'SAP_BLOCK_FREE_SQL', false);
|
|
66
|
+
config.allowedOps = resolve('allowed-ops', 'SAP_ALLOWED_OPS', '');
|
|
67
|
+
config.disallowedOps = resolve('disallowed-ops', 'SAP_DISALLOWED_OPS', '');
|
|
68
|
+
const pkgs = resolve('allowed-packages', 'SAP_ALLOWED_PACKAGES', '');
|
|
69
|
+
config.allowedPackages = pkgs ? pkgs.split(',').map((p) => p.trim()) : [];
|
|
70
|
+
config.allowTransportableEdits = resolveBool('allow-transportable-edits', 'SAP_ALLOW_TRANSPORTABLE_EDITS', false);
|
|
71
|
+
config.enableTransports = resolveBool('enable-transports', 'SAP_ENABLE_TRANSPORTS', false);
|
|
72
|
+
// --- Features ---
|
|
73
|
+
config.featureAbapGit = resolveFeature('feature-abapgit', 'SAP_FEATURE_ABAPGIT');
|
|
74
|
+
config.featureRap = resolveFeature('feature-rap', 'SAP_FEATURE_RAP');
|
|
75
|
+
config.featureAmdp = resolveFeature('feature-amdp', 'SAP_FEATURE_AMDP');
|
|
76
|
+
config.featureUi5 = resolveFeature('feature-ui5', 'SAP_FEATURE_UI5');
|
|
77
|
+
config.featureTransport = resolveFeature('feature-transport', 'SAP_FEATURE_TRANSPORT');
|
|
78
|
+
config.featureHana = resolveFeature('feature-hana', 'SAP_FEATURE_HANA');
|
|
79
|
+
// --- Authentication (MCP client → ARC-1) ---
|
|
80
|
+
config.apiKey = getFlag('api-key') ?? process.env.ARC1_API_KEY;
|
|
81
|
+
config.oidcIssuer = getFlag('oidc-issuer') ?? process.env.SAP_OIDC_ISSUER;
|
|
82
|
+
config.oidcAudience = getFlag('oidc-audience') ?? process.env.SAP_OIDC_AUDIENCE;
|
|
83
|
+
config.xsuaaAuth = resolveBool('xsuaa-auth', 'SAP_XSUAA_AUTH', false);
|
|
84
|
+
// --- Principal Propagation ---
|
|
85
|
+
config.ppEnabled = resolveBool('pp-enabled', 'SAP_PP_ENABLED', false);
|
|
86
|
+
config.ppStrict = resolveBool('pp-strict', 'SAP_PP_STRICT', false);
|
|
87
|
+
// --- Logging ---
|
|
88
|
+
config.logFile = getFlag('log-file') ?? process.env.ARC1_LOG_FILE;
|
|
89
|
+
const logLevel = resolve('log-level', 'ARC1_LOG_LEVEL', 'info');
|
|
90
|
+
config.logLevel = (['debug', 'info', 'warn', 'error'].includes(logLevel) ? logLevel : 'info');
|
|
91
|
+
const logFormat = resolve('log-format', 'ARC1_LOG_FORMAT', 'text');
|
|
92
|
+
config.logFormat = (logFormat === 'json' ? 'json' : 'text');
|
|
93
|
+
// --- Misc ---
|
|
94
|
+
config.verbose = resolveBool('verbose', 'SAP_VERBOSE', false);
|
|
95
|
+
// --verbose is sugar for --log-level debug
|
|
96
|
+
if (config.verbose) {
|
|
97
|
+
config.logLevel = 'debug';
|
|
98
|
+
}
|
|
99
|
+
return config;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../ts-src/server/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request context for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Uses AsyncLocalStorage to thread a requestId through the entire
|
|
5
|
+
* call stack (intent handler → ADT client → HTTP client) without
|
|
6
|
+
* changing function signatures. The logger reads from the store
|
|
7
|
+
* automatically to attach requestId to every log entry.
|
|
8
|
+
*/
|
|
9
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
10
|
+
export interface RequestContext {
|
|
11
|
+
requestId: string;
|
|
12
|
+
user?: string;
|
|
13
|
+
tool?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare const requestContext: AsyncLocalStorage<RequestContext>;
|
|
16
|
+
/** Generate a monotonically increasing request ID */
|
|
17
|
+
export declare function generateRequestId(): string;
|
|
18
|
+
/** Get the current request context (if any) */
|
|
19
|
+
export declare function getCurrentContext(): RequestContext | undefined;
|
|
20
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../ts-src/server/context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,cAAc,mCAA0C,CAAC;AAItE,qDAAqD;AACrD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,+CAA+C;AAC/C,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request context for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Uses AsyncLocalStorage to thread a requestId through the entire
|
|
5
|
+
* call stack (intent handler → ADT client → HTTP client) without
|
|
6
|
+
* changing function signatures. The logger reads from the store
|
|
7
|
+
* automatically to attach requestId to every log entry.
|
|
8
|
+
*/
|
|
9
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
10
|
+
export const requestContext = new AsyncLocalStorage();
|
|
11
|
+
let requestCounter = 0;
|
|
12
|
+
/** Generate a monotonically increasing request ID */
|
|
13
|
+
export function generateRequestId() {
|
|
14
|
+
return `REQ-${++requestCounter}`;
|
|
15
|
+
}
|
|
16
|
+
/** Get the current request context (if any) */
|
|
17
|
+
export function getCurrentContext() {
|
|
18
|
+
return requestContext.getStore();
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../ts-src/server/context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAQrD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAEtE,IAAI,cAAc,GAAG,CAAC,CAAC;AAEvB,qDAAqD;AACrD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,EAAE,cAAc,EAAE,CAAC;AACnC,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC,QAAQ,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Elicitation helpers for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the MCP SDK's server.elicitInput() with:
|
|
5
|
+
* - Client capability detection (graceful fallback when unsupported)
|
|
6
|
+
* - Typed convenience methods for common patterns
|
|
7
|
+
* - Audit logging of all elicitation events
|
|
8
|
+
*
|
|
9
|
+
* Based on MCP spec 2025-06-18 / 2025-11-25 elicitation protocol.
|
|
10
|
+
* Dassian ADT uses similar patterns for confirmations and parameter prompts.
|
|
11
|
+
*/
|
|
12
|
+
import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
13
|
+
/**
|
|
14
|
+
* Confirm a destructive or irreversible operation with the user.
|
|
15
|
+
*
|
|
16
|
+
* Returns true if:
|
|
17
|
+
* - User confirms (action: 'accept')
|
|
18
|
+
* - Elicitation is not supported (graceful fallback — proceed without asking)
|
|
19
|
+
*
|
|
20
|
+
* Returns false if:
|
|
21
|
+
* - User declines or cancels
|
|
22
|
+
*/
|
|
23
|
+
export declare function confirmDestructive(server: Server | undefined, toolName: string, message: string): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Ask user to select from a list of options.
|
|
26
|
+
*
|
|
27
|
+
* Returns the selected value, or undefined if:
|
|
28
|
+
* - User cancels/declines
|
|
29
|
+
* - Elicitation is not supported
|
|
30
|
+
*/
|
|
31
|
+
export declare function selectOption(server: Server | undefined, toolName: string, message: string, options: Array<{
|
|
32
|
+
value: string;
|
|
33
|
+
title: string;
|
|
34
|
+
}>): Promise<string | undefined>;
|
|
35
|
+
/**
|
|
36
|
+
* Prompt user for a string value.
|
|
37
|
+
*
|
|
38
|
+
* Returns the entered value, or undefined if:
|
|
39
|
+
* - User cancels/declines
|
|
40
|
+
* - Elicitation is not supported
|
|
41
|
+
*/
|
|
42
|
+
export declare function promptString(server: Server | undefined, toolName: string, message: string, fieldName: string, description?: string): Promise<string | undefined>;
|
|
43
|
+
//# sourceMappingURL=elicit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicit.d.ts","sourceRoot":"","sources":["../../ts-src/server/elicit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAiBxE;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CA8ClB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/C,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA+C7B;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA6C7B"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Elicitation helpers for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the MCP SDK's server.elicitInput() with:
|
|
5
|
+
* - Client capability detection (graceful fallback when unsupported)
|
|
6
|
+
* - Typed convenience methods for common patterns
|
|
7
|
+
* - Audit logging of all elicitation events
|
|
8
|
+
*
|
|
9
|
+
* Based on MCP spec 2025-06-18 / 2025-11-25 elicitation protocol.
|
|
10
|
+
* Dassian ADT uses similar patterns for confirmations and parameter prompts.
|
|
11
|
+
*/
|
|
12
|
+
import { logger } from './logger.js';
|
|
13
|
+
/**
|
|
14
|
+
* Check if the connected MCP client supports form elicitation.
|
|
15
|
+
* Returns false if server is undefined or client doesn't declare the capability.
|
|
16
|
+
*/
|
|
17
|
+
function supportsElicitation(server) {
|
|
18
|
+
if (!server)
|
|
19
|
+
return false;
|
|
20
|
+
try {
|
|
21
|
+
const caps = server.getClientCapabilities();
|
|
22
|
+
return !!caps?.elicitation?.form;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Confirm a destructive or irreversible operation with the user.
|
|
30
|
+
*
|
|
31
|
+
* Returns true if:
|
|
32
|
+
* - User confirms (action: 'accept')
|
|
33
|
+
* - Elicitation is not supported (graceful fallback — proceed without asking)
|
|
34
|
+
*
|
|
35
|
+
* Returns false if:
|
|
36
|
+
* - User declines or cancels
|
|
37
|
+
*/
|
|
38
|
+
export async function confirmDestructive(server, toolName, message) {
|
|
39
|
+
if (!supportsElicitation(server)) {
|
|
40
|
+
return true; // Fallback: proceed without asking
|
|
41
|
+
}
|
|
42
|
+
logger.emitAudit({
|
|
43
|
+
timestamp: new Date().toISOString(),
|
|
44
|
+
level: 'info',
|
|
45
|
+
event: 'elicitation_sent',
|
|
46
|
+
tool: toolName,
|
|
47
|
+
message,
|
|
48
|
+
fields: ['confirm'],
|
|
49
|
+
});
|
|
50
|
+
try {
|
|
51
|
+
const result = await server.elicitInput({
|
|
52
|
+
message,
|
|
53
|
+
requestedSchema: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
confirm: {
|
|
57
|
+
type: 'boolean',
|
|
58
|
+
title: 'Confirm',
|
|
59
|
+
description: message,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
required: ['confirm'],
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
const accepted = result.action === 'accept' && result.content?.confirm === true;
|
|
66
|
+
logger.emitAudit({
|
|
67
|
+
timestamp: new Date().toISOString(),
|
|
68
|
+
level: 'info',
|
|
69
|
+
event: 'elicitation_response',
|
|
70
|
+
tool: toolName,
|
|
71
|
+
action: result.action,
|
|
72
|
+
});
|
|
73
|
+
return accepted;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Elicitation failed (client doesn't support it, connection issue, etc.)
|
|
77
|
+
// Graceful fallback: proceed
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Ask user to select from a list of options.
|
|
83
|
+
*
|
|
84
|
+
* Returns the selected value, or undefined if:
|
|
85
|
+
* - User cancels/declines
|
|
86
|
+
* - Elicitation is not supported
|
|
87
|
+
*/
|
|
88
|
+
export async function selectOption(server, toolName, message, options) {
|
|
89
|
+
if (!supportsElicitation(server)) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
logger.emitAudit({
|
|
93
|
+
timestamp: new Date().toISOString(),
|
|
94
|
+
level: 'info',
|
|
95
|
+
event: 'elicitation_sent',
|
|
96
|
+
tool: toolName,
|
|
97
|
+
message,
|
|
98
|
+
fields: ['selection'],
|
|
99
|
+
});
|
|
100
|
+
try {
|
|
101
|
+
const result = await server.elicitInput({
|
|
102
|
+
message,
|
|
103
|
+
requestedSchema: {
|
|
104
|
+
type: 'object',
|
|
105
|
+
properties: {
|
|
106
|
+
selection: {
|
|
107
|
+
type: 'string',
|
|
108
|
+
title: 'Selection',
|
|
109
|
+
description: message,
|
|
110
|
+
enum: options.map((o) => o.value),
|
|
111
|
+
enumNames: options.map((o) => o.title),
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
required: ['selection'],
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
logger.emitAudit({
|
|
118
|
+
timestamp: new Date().toISOString(),
|
|
119
|
+
level: 'info',
|
|
120
|
+
event: 'elicitation_response',
|
|
121
|
+
tool: toolName,
|
|
122
|
+
action: result.action,
|
|
123
|
+
});
|
|
124
|
+
if (result.action === 'accept' && typeof result.content?.selection === 'string') {
|
|
125
|
+
return result.content.selection;
|
|
126
|
+
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Prompt user for a string value.
|
|
135
|
+
*
|
|
136
|
+
* Returns the entered value, or undefined if:
|
|
137
|
+
* - User cancels/declines
|
|
138
|
+
* - Elicitation is not supported
|
|
139
|
+
*/
|
|
140
|
+
export async function promptString(server, toolName, message, fieldName, description) {
|
|
141
|
+
if (!supportsElicitation(server)) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
logger.emitAudit({
|
|
145
|
+
timestamp: new Date().toISOString(),
|
|
146
|
+
level: 'info',
|
|
147
|
+
event: 'elicitation_sent',
|
|
148
|
+
tool: toolName,
|
|
149
|
+
message,
|
|
150
|
+
fields: [fieldName],
|
|
151
|
+
});
|
|
152
|
+
try {
|
|
153
|
+
const result = await server.elicitInput({
|
|
154
|
+
message,
|
|
155
|
+
requestedSchema: {
|
|
156
|
+
type: 'object',
|
|
157
|
+
properties: {
|
|
158
|
+
[fieldName]: {
|
|
159
|
+
type: 'string',
|
|
160
|
+
title: fieldName,
|
|
161
|
+
description: description ?? message,
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
required: [fieldName],
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
logger.emitAudit({
|
|
168
|
+
timestamp: new Date().toISOString(),
|
|
169
|
+
level: 'info',
|
|
170
|
+
event: 'elicitation_response',
|
|
171
|
+
tool: toolName,
|
|
172
|
+
action: result.action,
|
|
173
|
+
});
|
|
174
|
+
if (result.action === 'accept' && typeof result.content?.[fieldName] === 'string') {
|
|
175
|
+
return result.content[fieldName];
|
|
176
|
+
}
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=elicit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicit.js","sourceRoot":"","sources":["../../ts-src/server/elicit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Streamable transport for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Provides an Express HTTP server that:
|
|
5
|
+
* - Serves MCP Streamable HTTP protocol on /mcp
|
|
6
|
+
* - Health check endpoint on /health
|
|
7
|
+
* - API key authentication via Bearer token
|
|
8
|
+
* - OIDC/JWT validation via JWKS discovery (Entra ID, etc.)
|
|
9
|
+
* - XSUAA OAuth proxy for MCP-native clients (Claude Desktop, Cursor)
|
|
10
|
+
*
|
|
11
|
+
* When XSUAA auth is enabled, the MCP SDK's mcpAuthRouter installs standard
|
|
12
|
+
* OAuth endpoints (authorize, token, register, revoke, discovery metadata).
|
|
13
|
+
*
|
|
14
|
+
* Design decisions:
|
|
15
|
+
*
|
|
16
|
+
* 1. Express is used because the MCP SDK's auth infrastructure (mcpAuthRouter,
|
|
17
|
+
* requireBearerAuth) requires Express. Express 5.x is already a transitive
|
|
18
|
+
* dependency of the MCP SDK.
|
|
19
|
+
*
|
|
20
|
+
* 2. Per-request server pattern: each MCP request gets a fresh Server + Transport.
|
|
21
|
+
* This avoids "already connected" errors from concurrent clients.
|
|
22
|
+
*
|
|
23
|
+
* 3. Auth is checked BEFORE creating the MCP transport to avoid wasting resources.
|
|
24
|
+
*
|
|
25
|
+
* 4. Health endpoint is always unauthenticated — needed for CF health checks.
|
|
26
|
+
*/
|
|
27
|
+
import type { Server as McpServer } from '@modelcontextprotocol/sdk/server/index.js';
|
|
28
|
+
import type { ServerConfig } from './types.js';
|
|
29
|
+
import type { XsuaaCredentials } from './xsuaa.js';
|
|
30
|
+
/**
|
|
31
|
+
* Start the HTTP Streamable server.
|
|
32
|
+
*/
|
|
33
|
+
export declare function startHttpServer(serverFactory: () => McpServer, config: ServerConfig, xsuaaCredentials?: XsuaaCredentials): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../ts-src/server/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAMrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA4CnD;;GAEG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,SAAS,EAC9B,MAAM,EAAE,YAAY,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,IAAI,CAAC,CA8Jf"}
|