@mcp-abap-adt/llm-agent-mcp 19.2.0 → 20.4.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.
Files changed (45) hide show
  1. package/README.md +21 -0
  2. package/dist/adapter.d.ts.map +1 -1
  3. package/dist/adapter.js +17 -9
  4. package/dist/adapter.js.map +1 -1
  5. package/dist/client.d.ts +51 -3
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +79 -19
  8. package/dist/client.js.map +1 -1
  9. package/dist/default-mcp-failure-classifier.d.ts +7 -0
  10. package/dist/default-mcp-failure-classifier.d.ts.map +1 -0
  11. package/dist/default-mcp-failure-classifier.js +9 -0
  12. package/dist/default-mcp-failure-classifier.js.map +1 -0
  13. package/dist/error-mapping.d.ts +14 -0
  14. package/dist/error-mapping.d.ts.map +1 -0
  15. package/dist/error-mapping.js +86 -0
  16. package/dist/error-mapping.js.map +1 -0
  17. package/dist/factory.d.ts +4 -0
  18. package/dist/factory.d.ts.map +1 -1
  19. package/dist/factory.js +22 -8
  20. package/dist/factory.js.map +1 -1
  21. package/dist/index.d.ts +3 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +3 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/no-op-request-headers-strategy.d.ts +7 -0
  26. package/dist/no-op-request-headers-strategy.d.ts.map +1 -0
  27. package/dist/no-op-request-headers-strategy.js +8 -0
  28. package/dist/no-op-request-headers-strategy.js.map +1 -0
  29. package/dist/strategies/index.d.ts +1 -0
  30. package/dist/strategies/index.d.ts.map +1 -1
  31. package/dist/strategies/index.js +1 -0
  32. package/dist/strategies/index.js.map +1 -1
  33. package/dist/strategies/lazy-connection-strategy.d.ts +7 -2
  34. package/dist/strategies/lazy-connection-strategy.d.ts.map +1 -1
  35. package/dist/strategies/lazy-connection-strategy.js +35 -2
  36. package/dist/strategies/lazy-connection-strategy.js.map +1 -1
  37. package/dist/strategies/make-connection-strategy.d.ts +15 -0
  38. package/dist/strategies/make-connection-strategy.d.ts.map +1 -0
  39. package/dist/strategies/make-connection-strategy.js +13 -0
  40. package/dist/strategies/make-connection-strategy.js.map +1 -0
  41. package/dist/strategies/periodic-connection-strategy.d.ts +9 -2
  42. package/dist/strategies/periodic-connection-strategy.d.ts.map +1 -1
  43. package/dist/strategies/periodic-connection-strategy.js +13 -2
  44. package/dist/strategies/periodic-connection-strategy.js.map +1 -1
  45. package/package.json +2 -2
package/README.md CHANGED
@@ -26,6 +26,27 @@ await client.connect();
26
26
  const adapter = new McpClientAdapter(client);
27
27
  ```
28
28
 
29
+ ## Request Timeouts
30
+
31
+ The SmartAgent runtime applies a generous default per-call MCP request timeout of **120000 ms (2 minutes)** as a safety net against stuck or hung tool calls. This is configurable:
32
+
33
+ - `MCPClientConfig.timeout` (default: 120000 ms) — default per-call timeout for this MCP client.
34
+ - `MCPClientConfig.toolTimeouts` — per-tool timeout overrides (ms). Some tools legitimately take 5–15 minutes (e.g., `{ GetWhereUsed: 600000, GetPackageContents: 900000 }`); resolution is per-tool override → client default → 120000 ms.
35
+ The client always sets `resetTimeoutOnProgress` on MCP requests (not a config field): the deadline resets while a tool actively reports progress, so a genuinely-working long-running tool is not cut off.
36
+
37
+ To convey server-side intent (e.g., "willing to wait longer"), pass a custom `IMcpRequestHeadersStrategy` to `MCPClientWrapper` to inject headers the server recognizes.
38
+
39
+ ## Observability — tool-call durations
40
+
41
+ Every MCP tool call emits timing through two existing structured channels (no console output, no env flag):
42
+
43
+ - **`tool_call` structured event** — `ILogger.log({ type: 'tool_call', traceId, toolName, isError, durationMs })`. Consumed by the server's structured logger; verbosity is the logger implementation's concern (run-mode gate applies automatically).
44
+ - **`mcp_tool_call` session-debug step** — `sessionLogger.logStep('mcp_tool_call', { toolName, durationMs, isError })`. Lands in per-session artifacts alongside other `coordinator_step_*` entries; visible at debug/verbose run levels.
45
+
46
+ `isError` is `true` when the client returned `ok: false` or when the tool result carried `isError: true`.
47
+
48
+ **Tuning hint:** if `durationMs` on a `tool_call` event approaches a tool's resolved timeout (client default or `toolTimeouts` override), the tool is at risk of being cut off — raise the limit for that tool via `MCPClientConfig.toolTimeouts`.
49
+
29
50
  ## Dependencies
30
51
 
31
52
  - `@mcp-abap-adt/llm-agent` — interfaces and DTOs.
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,KAAK,WAAW,EAChB,QAAQ,EACR,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,MAAM,EAEZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA2BpD,qBAAa,gBAAiB,YAAW,UAAU;IAIrC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,WAAW,CAAQ;gBAEE,MAAM,EAAE,gBAAgB;IAE/C,SAAS,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IAyBtE,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAqBtE,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;CA8B5C"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,KAAK,WAAW,EAChB,QAAQ,EACR,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,MAAM,EAEZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA4BpD,qBAAa,gBAAiB,YAAW,UAAU;IAIrC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,WAAW,CAAQ;gBAEE,MAAM,EAAE,gBAAgB;IAE/C,SAAS,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IAwBtE,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAoBtE,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;CA6C5C"}
package/dist/adapter.js CHANGED
@@ -2,6 +2,7 @@
2
2
  * McpClientAdapter — wraps MCPClientWrapper as IMcpClient.
3
3
  */
4
4
  import { McpError, } from '@mcp-abap-adt/llm-agent';
5
+ import { toMcpError } from './error-mapping.js';
5
6
  // ---------------------------------------------------------------------------
6
7
  // Module-private helper
7
8
  // ---------------------------------------------------------------------------
@@ -44,9 +45,7 @@ export class McpClientAdapter {
44
45
  return { ok: true, value: tools };
45
46
  }
46
47
  catch (err) {
47
- if (err instanceof McpError)
48
- return { ok: false, error: err };
49
- return { ok: false, error: new McpError(String(err)) };
48
+ return { ok: false, error: toMcpError(err) };
50
49
  }
51
50
  }
52
51
  async healthCheck(options) {
@@ -62,9 +61,7 @@ export class McpClientAdapter {
62
61
  }
63
62
  catch (err) {
64
63
  this.lastHealthy = false;
65
- if (err instanceof McpError)
66
- return { ok: false, error: err };
67
- return { ok: false, error: new McpError(String(err)) };
64
+ return { ok: false, error: toMcpError(err) };
68
65
  }
69
66
  }
70
67
  async callTool(name, args, options) {
@@ -74,6 +71,19 @@ export class McpClientAdapter {
74
71
  name,
75
72
  arguments: args,
76
73
  }), options?.signal, () => new McpError('Aborted', 'ABORTED'));
74
+ // A RETURNED { error } is normally TOOL-level feedback (the tool ran and
75
+ // failed) → ok:true/isError below. The ONE exception is a connection-loss
76
+ // signature the wrapper may still return instead of throw (legacy/embedded
77
+ // paths): escalate ONLY those to ok:false. We deliberately do NOT escalate
78
+ // timeout/HTTP/ambiguous returned errors here — a tool's own "request timed
79
+ // out" / "forbidden" message is domain feedback, not an MCP outage; only the
80
+ // THROWN transport path (catch below) treats those as unavailable.
81
+ if (result.error !== undefined && result.error !== null) {
82
+ const mapped = toMcpError(result.error);
83
+ if (mapped.code === 'MCP_NOT_CONNECTED' ||
84
+ mapped.code === 'MCP_NO_RESPONSE')
85
+ return { ok: false, error: mapped };
86
+ }
77
87
  return {
78
88
  ok: true,
79
89
  value: {
@@ -86,9 +96,7 @@ export class McpClientAdapter {
86
96
  };
87
97
  }
88
98
  catch (err) {
89
- if (err instanceof McpError)
90
- return { ok: false, error: err };
91
- return { ok: false, error: new McpError(String(err)) };
99
+ return { ok: false, error: toMcpError(err) };
92
100
  }
93
101
  }
94
102
  }
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAEL,QAAQ,GAKT,MAAM,yBAAyB,CAAC;AAGjC,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,SAAS,SAAS,CAChB,OAAmB,EACnB,MAA+B,EAC/B,SAAgC;IAEhC,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,OAAO;QACP,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE;gBAC1D,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;QACL,CAAC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,OAAO,gBAAgB;IAIE;IAHrB,UAAU,CAAwB;IAClC,WAAW,GAAG,IAAI,CAAC;IAE3B,YAA6B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IAEzD,KAAK,CAAC,SAAS,CAAC,OAAqB;QACnC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,SAAS,CACzB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EACvB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CACzC,CAAC;YAEF,MAAM,KAAK,GAAc,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;gBAChC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;aACjC,CAAC,CAAC,CAAC;YAEJ,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC9D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAqB;QACrC,IAAI,CAAC;YACH,MAAM,SAAS,CACb,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAClB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CACzC,CAAC;YACF,sEAAsE;YACtE,2CAA2C;YAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC9B,CAAC;YACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,GAAG,YAAY,QAAQ;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC9D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,IAAY,EACZ,IAA6B,EAC7B,OAAqB;QAErB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACnB,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;gBACvB,IAAI;gBACJ,SAAS,EAAE,IAAI;aAChB,CAAC,EACF,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CACzC,CAAC;YAEF,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE;oBACL,OAAO,EACL,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,QAAQ;wBACnD,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,QAAQ;wBACjD,CAAC,CAAE,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAEH;wBAC9B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC;oBAC3C,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;iBACxB;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC9D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -3,7 +3,22 @@
3
3
  *
4
4
  * Wraps the MCP SDK client to provide a simpler interface for the agent
5
5
  */
6
- import type { ToolCall, ToolResult } from '@mcp-abap-adt/llm-agent';
6
+ import type { IMcpRequestHeadersStrategy, ToolCall, ToolResult } from '@mcp-abap-adt/llm-agent';
7
+ /** Default per-call MCP request timeout in ms (2 minutes).
8
+ * Consumer can override globally via MCPClientConfig.timeout or per-tool via MCPClientConfig.toolTimeouts. */
9
+ export declare const DEFAULT_MCP_REQUEST_TIMEOUT_MS = 120000;
10
+ /**
11
+ * Resolve the MCP request timeout for a specific tool call.
12
+ *
13
+ * Resolution order (first defined wins):
14
+ * 1. config.toolTimeouts[name] — per-tool override
15
+ * 2. config.timeout — global per-call default
16
+ * 3. DEFAULT_MCP_REQUEST_TIMEOUT_MS (120 000 ms = 2 min)
17
+ *
18
+ * resetTimeoutOnProgress is always set to true by callTool so a slow but
19
+ * actively-reporting tool never hits the ceiling.
20
+ */
21
+ export declare function resolveToolTimeout(name: string, config: Pick<MCPClientConfig, 'timeout' | 'toolTimeouts'>): number;
7
22
  type McpToolDef = {
8
23
  name: string;
9
24
  description?: string;
@@ -79,11 +94,38 @@ export interface MCPClientConfig {
79
94
  * HTTP headers for authentication and configuration
80
95
  */
81
96
  headers?: Record<string, string>;
97
+ /** Consumer-owned strategy contributing additional HTTP headers to MCP requests.
98
+ * Independent of the client-side request timeout (see `timeout`/`toolTimeouts`):
99
+ * a consumer may use this to convey a "willing to wait longer" hint to the server
100
+ * or other per-request metadata. Default = no-op. */
101
+ requestHeadersStrategy?: IMcpRequestHeadersStrategy;
102
+ /** Default per-call MCP request timeout in ms (default 120000 = 2 min). Per-tool overrides via toolTimeouts. resetTimeoutOnProgress extends it while a tool reports progress. */
103
+ timeout?: number;
82
104
  /**
83
- * Timeout in milliseconds (default: 30000)
105
+ * Per-tool MCP request-timeout overrides in ms, keyed by tool name.
106
+ * Takes precedence over `timeout`. Useful for known slow tools (e.g. long-running ABAP reports).
107
+ * Example: `{ SlowReport: 900_000 }` — allow 15 min for SlowReport while keeping the 2 min default for everything else.
84
108
  */
85
- timeout?: number;
109
+ toolTimeouts?: Record<string, number>;
86
110
  }
111
+ /**
112
+ * Build StreamableHTTPClientTransport options from an already-resolved sessionId.
113
+ * The caller MUST resolve the session id (via `_sessionForConnect()`) before calling
114
+ * this helper — the helper intentionally does NOT read `config.sessionId` so that live
115
+ * server-assigned ids always survive reconnect.
116
+ *
117
+ * No `signal` is set: MCP self-governs its request timeouts via the SDK's own mechanism.
118
+ */
119
+ export declare function buildHttpTransportOptions(opts: {
120
+ headers?: Record<string, string>;
121
+ sessionId?: string;
122
+ requestHeadersStrategy?: IMcpRequestHeadersStrategy;
123
+ }): {
124
+ sessionId?: string;
125
+ requestInit: {
126
+ headers: Record<string, string>;
127
+ };
128
+ };
87
129
  export declare class MCPClientWrapper {
88
130
  private client;
89
131
  private config;
@@ -107,6 +149,12 @@ export declare class MCPClientWrapper {
107
149
  * Get current session ID (for HTTP transports)
108
150
  */
109
151
  getSessionId(): string | undefined;
152
+ /**
153
+ * Session id to (re)connect with: prefer the live server-assigned id so a
154
+ * reconnect RESUMES the same session (no lost session state / tool result);
155
+ * fall back to the configured id on a first connect.
156
+ */
157
+ private _sessionForConnect;
110
158
  /**
111
159
  * Get list of available tools
112
160
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAKpE,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,KAAK,GACL,aAAa,GACb,MAAM,GACN,UAAU,CAAC;AAEf,MAAM,WAAW,eAAe;IAC9B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;IAExC;;;OAGG;IACH,aAAa,CAAC,EAAE;QACd,WAAW,EAAE,MAAM,UAAU,EAAE,CAAC;KACjC,CAAC;IAEF;;;OAGG;IACH,eAAe,CAAC,EAAE,CAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAE/C;;;OAGG;IACH,eAAe,CAAC,EAAE,CAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,MAAM,EAAE,eAAe;IAKnC;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgH9B;;OAEG;IACH,YAAY,IAAI,aAAa;IAI7B;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAoCxC;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IA4FvD;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAO7D;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAWlC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -6,6 +6,46 @@
6
6
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
7
7
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
8
8
  import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
9
+ import { toMcpError } from './error-mapping.js';
10
+ /** Default per-call MCP request timeout in ms (2 minutes).
11
+ * Consumer can override globally via MCPClientConfig.timeout or per-tool via MCPClientConfig.toolTimeouts. */
12
+ export const DEFAULT_MCP_REQUEST_TIMEOUT_MS = 120_000;
13
+ /**
14
+ * Resolve the MCP request timeout for a specific tool call.
15
+ *
16
+ * Resolution order (first defined wins):
17
+ * 1. config.toolTimeouts[name] — per-tool override
18
+ * 2. config.timeout — global per-call default
19
+ * 3. DEFAULT_MCP_REQUEST_TIMEOUT_MS (120 000 ms = 2 min)
20
+ *
21
+ * resetTimeoutOnProgress is always set to true by callTool so a slow but
22
+ * actively-reporting tool never hits the ceiling.
23
+ */
24
+ export function resolveToolTimeout(name, config) {
25
+ return (config.toolTimeouts?.[name] ??
26
+ config.timeout ??
27
+ DEFAULT_MCP_REQUEST_TIMEOUT_MS);
28
+ }
29
+ /**
30
+ * Build StreamableHTTPClientTransport options from an already-resolved sessionId.
31
+ * The caller MUST resolve the session id (via `_sessionForConnect()`) before calling
32
+ * this helper — the helper intentionally does NOT read `config.sessionId` so that live
33
+ * server-assigned ids always survive reconnect.
34
+ *
35
+ * No `signal` is set: MCP self-governs its request timeouts via the SDK's own mechanism.
36
+ */
37
+ export function buildHttpTransportOptions(opts) {
38
+ return {
39
+ ...(opts.sessionId !== undefined ? { sessionId: opts.sessionId } : {}),
40
+ requestInit: {
41
+ headers: {
42
+ Accept: 'application/json, text/event-stream',
43
+ ...opts.headers,
44
+ ...(opts.requestHeadersStrategy?.headers() ?? {}),
45
+ },
46
+ },
47
+ };
48
+ }
9
49
  export class MCPClientWrapper {
10
50
  client = null;
11
51
  config;
@@ -117,16 +157,11 @@ export class MCPClientWrapper {
117
157
  }
118
158
  // Use StreamableHTTPClientTransport for both SSE and stream-http
119
159
  // The SDK handles the protocol differences internally
120
- const httpTransport = new StreamableHTTPClientTransport(new URL(this.config.url), {
121
- sessionId: this.config.sessionId,
122
- requestInit: {
123
- headers: {
124
- Accept: 'application/json, text/event-stream',
125
- ...this.config.headers,
126
- },
127
- signal: AbortSignal.timeout(this.config.timeout || 30000),
128
- },
129
- });
160
+ const httpTransport = new StreamableHTTPClientTransport(new URL(this.config.url), buildHttpTransportOptions({
161
+ headers: this.config.headers,
162
+ sessionId: this._sessionForConnect(),
163
+ requestHeadersStrategy: this.config.requestHeadersStrategy,
164
+ }));
130
165
  this.client = new Client({
131
166
  name: 'llm-agent',
132
167
  version: '0.1.0',
@@ -158,6 +193,14 @@ export class MCPClientWrapper {
158
193
  getSessionId() {
159
194
  return this.sessionId || this.config.sessionId;
160
195
  }
196
+ /**
197
+ * Session id to (re)connect with: prefer the live server-assigned id so a
198
+ * reconnect RESUMES the same session (no lost session state / tool result);
199
+ * fall back to the configured id on a first connect.
200
+ */
201
+ _sessionForConnect() {
202
+ return this.sessionId ?? this.config.sessionId;
203
+ }
161
204
  /**
162
205
  * Get list of available tools
163
206
  */
@@ -234,9 +277,9 @@ export class MCPClientWrapper {
234
277
  if (!this.client) {
235
278
  await this.connect();
236
279
  }
237
- const response = await this.client?.callTool({
238
- name: toolCall.name,
239
- arguments: toolCall.arguments,
280
+ const response = await this.client?.callTool({ name: toolCall.name, arguments: toolCall.arguments }, undefined, {
281
+ timeout: resolveToolTimeout(toolCall.name, this.config),
282
+ resetTimeoutOnProgress: true,
240
283
  });
241
284
  if (!response) {
242
285
  throw new Error('MCP callTool returned no response');
@@ -266,13 +309,30 @@ export class MCPClientWrapper {
266
309
  };
267
310
  }
268
311
  catch (retryError) {
312
+ // Resume-with-session failed — the server may have dropped the session.
313
+ // Clear it and try ONE fresh connect so a truly-gone session does not
314
+ // wedge the client.
315
+ if (this.sessionId) {
316
+ this.sessionId = undefined;
317
+ try {
318
+ await this.disconnect();
319
+ await this.connect();
320
+ const response = await performCall();
321
+ return {
322
+ toolCallId: toolCall.id,
323
+ name: toolCall.name,
324
+ result: response.content,
325
+ };
326
+ }
327
+ catch {
328
+ /* fall through to throw */
329
+ }
330
+ }
269
331
  const retryErrorMessage = retryError instanceof Error ? retryError.message : String(retryError);
270
- return {
271
- toolCallId: toolCall.id,
272
- name: toolCall.name,
273
- result: null,
274
- error: retryErrorMessage || 'Tool execution failed after reconnect',
275
- };
332
+ // THROW (not return) so McpClientAdapter.callTool's catch maps it to an
333
+ // ok:false availability McpError. Returning { error } would be wrapped
334
+ // ok:true/isError and never escalate to fail-loud / NOT_READY.
335
+ throw toMcpError(`${retryErrorMessage || 'Tool execution failed'} (no response after reconnect)`);
276
336
  }
277
337
  }
278
338
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type IMcpFailureClassifier, type McpError, type McpFailureKind } from '@mcp-abap-adt/llm-agent';
2
+ /** Default classifier: error-based (isMcpUnavailable). Does NOT probe health —
3
+ * a consumer can implement a ping-confirming classifier via the probeHealth seam. */
4
+ export declare class DefaultMcpFailureClassifier implements IMcpFailureClassifier {
5
+ classify(error: McpError): Promise<McpFailureKind>;
6
+ }
7
+ //# sourceMappingURL=default-mcp-failure-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-mcp-failure-classifier.d.ts","sourceRoot":"","sources":["../src/default-mcp-failure-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,QAAQ,EACb,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAEjC;sFACsF;AACtF,qBAAa,2BAA4B,YAAW,qBAAqB;IACjE,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC;CAGzD"}
@@ -0,0 +1,9 @@
1
+ import { isMcpUnavailable, } from '@mcp-abap-adt/llm-agent';
2
+ /** Default classifier: error-based (isMcpUnavailable). Does NOT probe health —
3
+ * a consumer can implement a ping-confirming classifier via the probeHealth seam. */
4
+ export class DefaultMcpFailureClassifier {
5
+ async classify(error) {
6
+ return isMcpUnavailable(error) ? 'unavailable' : 'tool-error';
7
+ }
8
+ }
9
+ //# sourceMappingURL=default-mcp-failure-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-mcp-failure-classifier.js","sourceRoot":"","sources":["../src/default-mcp-failure-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,GAGjB,MAAM,yBAAyB,CAAC;AAEjC;sFACsF;AACtF,MAAM,OAAO,2BAA2B;IACtC,KAAK,CAAC,QAAQ,CAAC,KAAe;QAC5B,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;IAChE,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { McpError } from '@mcp-abap-adt/llm-agent';
2
+ /**
3
+ * Map a thrown/returned transport error to an McpError with an availability
4
+ * code. Shared by McpClientAdapter (catch + returned-error path) and
5
+ * MCPClientWrapper (throw on retry exhaustion) so both classify identically.
6
+ *
7
+ * The default for an UNRECOGNIZED message is the non-availability `MCP_ERROR`,
8
+ * so a plain tool error never escalates to fail-loud / NOT_READY. Connection /
9
+ * network / timeout / HTTP-5xx-or-403 signatures DO escalate — including the
10
+ * Node `fetch failed` shape whose real cause (ECONNREFUSED / ENOTFOUND / …)
11
+ * lives on `err.cause`.
12
+ */
13
+ export declare function toMcpError(err: unknown): McpError;
14
+ //# sourceMappingURL=error-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-mapping.d.ts","sourceRoot":"","sources":["../src/error-mapping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAwBnD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAsDjD"}
@@ -0,0 +1,86 @@
1
+ import { McpError } from '@mcp-abap-adt/llm-agent';
2
+ /** Flatten an error's message + code across its `cause` chain (Node `fetch`
3
+ * wraps the real transport error in `.cause`; AggregateError nests in
4
+ * `.errors`) into one lowercase string for signature matching. Depth-limited. */
5
+ function collectErrorText(err, depth = 0) {
6
+ if (err == null || depth > 4)
7
+ return '';
8
+ if (typeof err === 'string')
9
+ return err.toLowerCase();
10
+ const e = err;
11
+ const parts = [];
12
+ if (typeof e.message === 'string')
13
+ parts.push(e.message);
14
+ if (typeof e.code === 'string')
15
+ parts.push(e.code);
16
+ if (e.cause !== undefined)
17
+ parts.push(collectErrorText(e.cause, depth + 1));
18
+ if (Array.isArray(e.errors)) {
19
+ for (const sub of e.errors)
20
+ parts.push(collectErrorText(sub, depth + 1));
21
+ }
22
+ return parts.join(' ').toLowerCase();
23
+ }
24
+ /**
25
+ * Map a thrown/returned transport error to an McpError with an availability
26
+ * code. Shared by McpClientAdapter (catch + returned-error path) and
27
+ * MCPClientWrapper (throw on retry exhaustion) so both classify identically.
28
+ *
29
+ * The default for an UNRECOGNIZED message is the non-availability `MCP_ERROR`,
30
+ * so a plain tool error never escalates to fail-loud / NOT_READY. Connection /
31
+ * network / timeout / HTTP-5xx-or-403 signatures DO escalate — including the
32
+ * Node `fetch failed` shape whose real cause (ECONNREFUSED / ENOTFOUND / …)
33
+ * lives on `err.cause`.
34
+ */
35
+ export function toMcpError(err) {
36
+ if (err instanceof McpError)
37
+ return err;
38
+ const top = err instanceof Error ? err.message : String(err);
39
+ const m = collectErrorText(err) || String(err).toLowerCase();
40
+ // NOTE: NO bare `transport` / `network` substring matches — "transport request"
41
+ // and "business network" are common SAP/ABAP DOMAIN terms; matching them would
42
+ // flip a normal tool error into a false MCP outage. Match only distinctive
43
+ // transport-exception shapes: OS/network error codes, the Node `fetch failed`
44
+ // wrapper, MCP timeout (-32001), and HTTP status by NAME (not bare number).
45
+ let code = 'MCP_ERROR';
46
+ if (m.includes('-32001') ||
47
+ m.includes('etimedout') ||
48
+ m.includes('request timed out') ||
49
+ m.includes('timed out'))
50
+ code = 'MCP_TIMEOUT';
51
+ else if (m.includes('after reconnect') || m.includes('no response'))
52
+ code = 'MCP_NO_RESPONSE';
53
+ else if (m.includes('http 403') || m.includes('forbidden'))
54
+ code = 'MCP_HTTP_403';
55
+ else if (m.includes('error posting to endpoint') ||
56
+ m.includes('streamable http error')) {
57
+ // Streamable HTTP transport-error wrapper; detect specific status codes.
58
+ if (m.includes('404') || m.includes('not found'))
59
+ code = 'MCP_HTTP_404';
60
+ else if (m.includes('502') || m.includes('bad gateway'))
61
+ code = 'MCP_HTTP_502';
62
+ else if (m.includes('503') || m.includes('service unavailable'))
63
+ code = 'MCP_HTTP_503';
64
+ else
65
+ code = 'MCP_TRANSPORT'; // Generic HTTP transport error
66
+ }
67
+ else if (m.includes('http 502') || m.includes('bad gateway'))
68
+ code = 'MCP_HTTP_502';
69
+ else if (m.includes('http 503') || m.includes('service unavailable'))
70
+ code = 'MCP_HTTP_503';
71
+ else if (m.includes('not connected') ||
72
+ m.includes('fetch failed') ||
73
+ m.includes('econnrefused') ||
74
+ m.includes('connection refused') ||
75
+ m.includes('econnreset') ||
76
+ m.includes('ehostunreach') ||
77
+ m.includes('enetunreach') ||
78
+ m.includes('enotfound') ||
79
+ m.includes('eai_again') ||
80
+ m.includes('epipe') ||
81
+ m.includes('socket hang up') ||
82
+ m.includes('bad port'))
83
+ code = 'MCP_NOT_CONNECTED';
84
+ return new McpError(top || 'MCP transport error', code);
85
+ }
86
+ //# sourceMappingURL=error-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-mapping.js","sourceRoot":"","sources":["../src/error-mapping.ts"],"names":[],"mappings":"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"}
package/dist/factory.d.ts CHANGED
@@ -1,3 +1,7 @@
1
1
  import type { McpClientFactoryResult, McpConnectionConfig } from '@mcp-abap-adt/llm-agent';
2
+ import type { MCPClientConfig } from './client.js';
3
+ /** Pure mapping helper: converts a McpConnectionConfig to MCPClientWrapper constructor
4
+ * options. Exported for direct testing without network or ctor spying. */
5
+ export declare function toMcpClientWrapperConfig(config: McpConnectionConfig): MCPClientConfig;
2
6
  export declare function createDefaultMcpClient(config: McpConnectionConfig): Promise<McpClientFactoryResult>;
3
7
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAIjC,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,sBAAsB,CAAC,CAoBjC"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;2EAC2E;AAC3E,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,GAC1B,eAAe,CAoBjB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,sBAAsB,CAAC,CAUjC"}
package/dist/factory.js CHANGED
@@ -1,16 +1,30 @@
1
1
  import { McpClientAdapter } from './adapter.js';
2
2
  import { MCPClientWrapper } from './client.js';
3
- export async function createDefaultMcpClient(config) {
4
- const wrapper = config.type === 'stdio'
5
- ? new MCPClientWrapper({
3
+ /** Pure mapping helper: converts a McpConnectionConfig to MCPClientWrapper constructor
4
+ * options. Exported for direct testing without network or ctor spying. */
5
+ export function toMcpClientWrapperConfig(config) {
6
+ if (config.type === 'stdio') {
7
+ return {
6
8
  transport: 'stdio',
7
9
  command: config.command,
8
10
  args: config.args ?? [],
9
- })
10
- : new MCPClientWrapper({
11
- transport: 'auto',
12
- url: config.url,
13
- });
11
+ ...(config.timeout !== undefined ? { timeout: config.timeout } : {}),
12
+ ...(config.toolTimeouts ? { toolTimeouts: config.toolTimeouts } : {}),
13
+ };
14
+ }
15
+ return {
16
+ transport: 'auto',
17
+ url: config.url,
18
+ ...(config.headers ? { headers: config.headers } : {}),
19
+ ...(config.requestHeadersStrategy
20
+ ? { requestHeadersStrategy: config.requestHeadersStrategy }
21
+ : {}),
22
+ ...(config.timeout !== undefined ? { timeout: config.timeout } : {}),
23
+ ...(config.toolTimeouts ? { toolTimeouts: config.toolTimeouts } : {}),
24
+ };
25
+ }
26
+ export async function createDefaultMcpClient(config) {
27
+ const wrapper = new MCPClientWrapper(toMcpClientWrapperConfig(config));
14
28
  await wrapper.connect();
15
29
  const client = new McpClientAdapter(wrapper);
16
30
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAA2B;IAE3B,MAAM,OAAO,GACX,MAAM,CAAC,IAAI,KAAK,OAAO;QACrB,CAAC,CAAC,IAAI,gBAAgB,CAAC;YACnB,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;SACxB,CAAC;QACJ,CAAC,CAAC,IAAI,gBAAgB,CAAC;YACnB,SAAS,EAAE,MAAM;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;SAChB,CAAC,CAAC;IAET,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C,OAAO;QACL,MAAM;QACN,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE;KACzD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;2EAC2E;AAC3E,MAAM,UAAU,wBAAwB,CACtC,MAA2B;IAE3B,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO;YACL,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;YACvB,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC;IACJ,CAAC;IACD,OAAO;QACL,SAAS,EAAE,MAAM;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,MAAM,CAAC,sBAAsB;YAC/B,CAAC,CAAC,EAAE,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,EAAE;YAC3D,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAA2B;IAE3B,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C,OAAO;QACL,MAAM;QACN,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE;KACzD,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export { McpClientAdapter } from './adapter.js';
2
2
  export { type MCPClientConfig, MCPClientWrapper, type TransportType, } from './client.js';
3
+ export { DefaultMcpFailureClassifier } from './default-mcp-failure-classifier.js';
3
4
  export { createDefaultMcpClient } from './factory.js';
4
- export { LazyConnectionStrategy, NoopConnectionStrategy, PeriodicConnectionStrategy, } from './strategies/index.js';
5
+ export { NoopMcpRequestHeadersStrategy } from './no-op-request-headers-strategy.js';
6
+ export { LazyConnectionStrategy, type MakeConnectionStrategyOptions, makeConnectionStrategy, NoopConnectionStrategy, PeriodicConnectionStrategy, } from './strategies/index.js';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,KAAK,eAAe,EACpB,gBAAgB,EAChB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,KAAK,eAAe,EACpB,gBAAgB,EAChB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAC;AACpF,OAAO,EACL,sBAAsB,EACtB,KAAK,6BAA6B,EAClC,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export { McpClientAdapter } from './adapter.js';
2
2
  export { MCPClientWrapper, } from './client.js';
3
+ export { DefaultMcpFailureClassifier } from './default-mcp-failure-classifier.js';
3
4
  export { createDefaultMcpClient } from './factory.js';
4
- export { LazyConnectionStrategy, NoopConnectionStrategy, PeriodicConnectionStrategy, } from './strategies/index.js';
5
+ export { NoopMcpRequestHeadersStrategy } from './no-op-request-headers-strategy.js';
6
+ export { LazyConnectionStrategy, makeConnectionStrategy, NoopConnectionStrategy, PeriodicConnectionStrategy, } from './strategies/index.js';
5
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAEL,gBAAgB,GAEjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAEL,gBAAgB,GAEjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAC;AACpF,OAAO,EACL,sBAAsB,EAEtB,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { IMcpRequestHeadersStrategy } from '@mcp-abap-adt/llm-agent';
2
+ /** Default: contribute no extra headers. The request timeout is governed by
3
+ * `MCPClientConfig.timeout`/`toolTimeouts` (client-side), independent of this. */
4
+ export declare class NoopMcpRequestHeadersStrategy implements IMcpRequestHeadersStrategy {
5
+ headers(): Record<string, string>;
6
+ }
7
+ //# sourceMappingURL=no-op-request-headers-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-op-request-headers-strategy.d.ts","sourceRoot":"","sources":["../src/no-op-request-headers-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAE1E;mFACmF;AACnF,qBAAa,6BACX,YAAW,0BAA0B;IAErC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGlC"}
@@ -0,0 +1,8 @@
1
+ /** Default: contribute no extra headers. The request timeout is governed by
2
+ * `MCPClientConfig.timeout`/`toolTimeouts` (client-side), independent of this. */
3
+ export class NoopMcpRequestHeadersStrategy {
4
+ headers() {
5
+ return {};
6
+ }
7
+ }
8
+ //# sourceMappingURL=no-op-request-headers-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-op-request-headers-strategy.js","sourceRoot":"","sources":["../src/no-op-request-headers-strategy.ts"],"names":[],"mappings":"AAEA;mFACmF;AACnF,MAAM,OAAO,6BAA6B;IAGxC,OAAO;QACL,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -1,4 +1,5 @@
1
1
  export { LazyConnectionStrategy } from './lazy-connection-strategy.js';
2
+ export { type MakeConnectionStrategyOptions, makeConnectionStrategy, } from './make-connection-strategy.js';
2
3
  export { NoopConnectionStrategy } from './noop-connection-strategy.js';
3
4
  export { PeriodicConnectionStrategy } from './periodic-connection-strategy.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EACL,KAAK,6BAA6B,EAClC,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { LazyConnectionStrategy } from './lazy-connection-strategy.js';
2
+ export { makeConnectionStrategy, } from './make-connection-strategy.js';
2
3
  export { NoopConnectionStrategy } from './noop-connection-strategy.js';
3
4
  export { PeriodicConnectionStrategy } from './periodic-connection-strategy.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAEL,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC"}
@@ -1,12 +1,17 @@
1
- import type { ConnectionStrategyOptions, IMcpClient, IMcpConnectionStrategy, McpClientFactory, McpConnectionConfig, McpConnectionResult } from '@mcp-abap-adt/llm-agent';
2
- export declare class LazyConnectionStrategy implements IMcpConnectionStrategy {
1
+ import type { ConnectionStrategyOptions, IMcpClient, IMcpConnectionStrategy, IReadinessReporter, McpClientFactory, McpConnectionConfig, McpConnectionResult } from '@mcp-abap-adt/llm-agent';
2
+ export declare class LazyConnectionStrategy implements IMcpConnectionStrategy, IReadinessReporter {
3
3
  private readonly _slots;
4
4
  private readonly _skipRevectorize;
5
5
  private readonly _cooldownMs;
6
6
  private readonly _factory;
7
+ private readonly _logger?;
7
8
  private _resolving;
8
9
  constructor(configs: McpConnectionConfig[], options?: ConnectionStrategyOptions, factory?: McpClientFactory);
9
10
  resolve(_currentClients?: IMcpClient[]): Promise<McpConnectionResult>;
11
+ /** Readiness = every configured target currently has a healthy connection.
12
+ * Reflects the health computed by the last `resolve()` pass. No slots (no MCP
13
+ * configured) ⇒ ready. */
14
+ isReady(): boolean;
10
15
  private _doResolve;
11
16
  private _checkHealth;
12
17
  dispose(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"lazy-connection-strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/lazy-connection-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,UAAU,EACV,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAWjC,qBAAa,sBAAuB,YAAW,sBAAsB;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,UAAU,CAA6C;gBAG7D,OAAO,EAAE,mBAAmB,EAAE,EAC9B,OAAO,CAAC,EAAE,yBAAyB,EACnC,OAAO,CAAC,EAAE,gBAAgB;IAY5B,OAAO,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAYvD,UAAU;YAyCV,YAAY;IAapB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAO/B"}
1
+ {"version":3,"file":"lazy-connection-strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/lazy-connection-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EAEzB,UAAU,EACV,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAWjC,qBAAa,sBACX,YAAW,sBAAsB,EAAE,kBAAkB;IAErD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAU;IACnC,OAAO,CAAC,UAAU,CAA6C;gBAG7D,OAAO,EAAE,mBAAmB,EAAE,EAC9B,OAAO,CAAC,EAAE,yBAAyB,EACnC,OAAO,CAAC,EAAE,gBAAgB;IAa5B,OAAO,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAYrE;;+BAE2B;IAC3B,OAAO,IAAI,OAAO;YAIJ,UAAU;YAkEV,YAAY;IAapB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAO/B"}
@@ -4,11 +4,13 @@ export class LazyConnectionStrategy {
4
4
  _skipRevectorize;
5
5
  _cooldownMs;
6
6
  _factory;
7
+ _logger;
7
8
  _resolving = null;
8
9
  constructor(configs, options, factory) {
9
10
  this._skipRevectorize = options?.skipRevectorize ?? false;
10
11
  this._cooldownMs = options?.cooldownMs ?? 30000;
11
12
  this._factory = factory ?? createDefaultMcpClient;
13
+ this._logger = options?.logger;
12
14
  this._slots = configs.map((config) => ({
13
15
  config,
14
16
  lastAttempt: 0,
@@ -24,6 +26,12 @@ export class LazyConnectionStrategy {
24
26
  });
25
27
  return this._resolving;
26
28
  }
29
+ /** Readiness = every configured target currently has a healthy connection.
30
+ * Reflects the health computed by the last `resolve()` pass. No slots (no MCP
31
+ * configured) ⇒ ready. */
32
+ isReady() {
33
+ return this._slots.every((s) => s.healthy);
34
+ }
27
35
  async _doResolve() {
28
36
  let anyNewlyHealthy = false;
29
37
  for (const slot of this._slots) {
@@ -33,10 +41,23 @@ export class LazyConnectionStrategy {
33
41
  slot.healthy = true;
34
42
  continue;
35
43
  }
36
- // Client is unhealthy — clear it and attempt reconnect
44
+ // Client is unhealthy — CLOSE the old transport before clearing it, then
45
+ // attempt reconnect. Skipping the close leaks the previous HTTP/stdio
46
+ // connection on every health-failure reconnect (this strategy is now the
47
+ // default YAML `mcp:` lifecycle path). Best-effort: a failing close must
48
+ // not abort the resolve pass.
49
+ const staleClose = slot.closeHandle;
37
50
  slot.client = undefined;
38
51
  slot.closeHandle = undefined;
39
52
  slot.healthy = false;
53
+ if (staleClose) {
54
+ try {
55
+ await staleClose();
56
+ }
57
+ catch {
58
+ /* best-effort — the transport is already considered dead */
59
+ }
60
+ }
40
61
  }
41
62
  // No client or just cleared — try reconnect if cooldown expired
42
63
  const now = Date.now();
@@ -49,8 +70,20 @@ export class LazyConnectionStrategy {
49
70
  slot.healthy = true;
50
71
  anyNewlyHealthy = true;
51
72
  }
52
- catch {
73
+ catch (err) {
53
74
  slot.healthy = false;
75
+ // Surface WHY a target is down — otherwise operators chase "agent has no
76
+ // tools" with no log line pointing at the cause (unreachable host, bad
77
+ // auth, container-network mismatch, …). Logged through the injected
78
+ // logger, once per (cooled-down) attempt.
79
+ const target = slot.config.type === 'stdio'
80
+ ? slot.config.command
81
+ : slot.config.url;
82
+ this._logger?.log({
83
+ type: 'warning',
84
+ traceId: 'mcp-connection-strategy',
85
+ message: `MCP connection failed for ${target}: ${err instanceof Error ? err.message : String(err)}`,
86
+ });
54
87
  }
55
88
  }
56
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lazy-connection-strategy.js","sourceRoot":"","sources":["../../src/strategies/lazy-connection-strategy.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAUvD,MAAM,OAAO,sBAAsB;IAChB,MAAM,CAAS;IACf,gBAAgB,CAAU;IAC1B,WAAW,CAAS;IACpB,QAAQ,CAAmB;IACpC,UAAU,GAAwC,IAAI,CAAC;IAE/D,YACE,OAA8B,EAC9B,OAAmC,EACnC,OAA0B;QAE1B,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,eAAe,IAAI,KAAK,CAAC;QAC1D,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,OAAO,IAAI,sBAAsB,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACrC,MAAM;YACN,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,KAAK;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO,CAAC,eAA8B;QACpC,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrD,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,SAAS;gBACX,CAAC;gBACD,uDAAuD;gBACvD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC7B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACvB,CAAC;YAED,gEAAgE;YAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC/C,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;gBACvB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;oBAC5B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;oBAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,eAAe,GAAG,IAAI,CAAC;gBACzB,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;aAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAoB,CAAC,CAAC;QAEtC,MAAM,YAAY,GAAG,eAAe,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAE/D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAkB;QAC3C,IAAI,CAAC;YACH,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC1C,OAAO,MAAM,CAAC,EAAE,CAAC;YACnB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC,EAAE,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,MAAM;aACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC;aAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAClD,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"lazy-connection-strategy.js","sourceRoot":"","sources":["../../src/strategies/lazy-connection-strategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ConnectionStrategyOptions, McpClientFactory, McpConnectionConfig } from '@mcp-abap-adt/llm-agent';
2
+ import { PeriodicConnectionStrategy } from './periodic-connection-strategy.js';
3
+ export interface MakeConnectionStrategyOptions extends ConnectionStrategyOptions {
4
+ /** Background probe / reconnect interval (ms). Default 10000. */
5
+ intervalMs?: number;
6
+ }
7
+ /**
8
+ * Build the default resilient MCP connection strategy: a
9
+ * {@link PeriodicConnectionStrategy} that connects each configured target, probes
10
+ * health on an interval, lazily reconnects a dropped one, and reports
11
+ * `isReady()` (it implements `IReadinessReporter`). One small factory so consumers
12
+ * (the builder, a server) don't hand-roll the strategy or duplicate readiness.
13
+ */
14
+ export declare function makeConnectionStrategy(configs: McpConnectionConfig[], options?: MakeConnectionStrategyOptions, factory?: McpClientFactory): PeriodicConnectionStrategy;
15
+ //# sourceMappingURL=make-connection-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-connection-strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/make-connection-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAE/E,MAAM,WAAW,6BACf,SAAQ,yBAAyB;IACjC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAAE,EAC9B,OAAO,CAAC,EAAE,6BAA6B,EACvC,OAAO,CAAC,EAAE,gBAAgB,GACzB,0BAA0B,CAG5B"}
@@ -0,0 +1,13 @@
1
+ import { PeriodicConnectionStrategy } from './periodic-connection-strategy.js';
2
+ /**
3
+ * Build the default resilient MCP connection strategy: a
4
+ * {@link PeriodicConnectionStrategy} that connects each configured target, probes
5
+ * health on an interval, lazily reconnects a dropped one, and reports
6
+ * `isReady()` (it implements `IReadinessReporter`). One small factory so consumers
7
+ * (the builder, a server) don't hand-roll the strategy or duplicate readiness.
8
+ */
9
+ export function makeConnectionStrategy(configs, options, factory) {
10
+ const intervalMs = options?.intervalMs ?? 10000;
11
+ return new PeriodicConnectionStrategy(configs, intervalMs, options, factory);
12
+ }
13
+ //# sourceMappingURL=make-connection-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-connection-strategy.js","sourceRoot":"","sources":["../../src/strategies/make-connection-strategy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAQ/E;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA8B,EAC9B,OAAuC,EACvC,OAA0B;IAE1B,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC;IAChD,OAAO,IAAI,0BAA0B,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/E,CAAC"}
@@ -1,11 +1,18 @@
1
- import type { ConnectionStrategyOptions, IMcpClient, IMcpConnectionStrategy, McpClientFactory, McpConnectionConfig, McpConnectionResult } from '@mcp-abap-adt/llm-agent';
2
- export declare class PeriodicConnectionStrategy implements IMcpConnectionStrategy {
1
+ import type { ConnectionStrategyOptions, IMcpClient, IMcpConnectionStrategy, IReadinessReporter, McpClientFactory, McpConnectionConfig, McpConnectionResult } from '@mcp-abap-adt/llm-agent';
2
+ export declare class PeriodicConnectionStrategy implements IMcpConnectionStrategy, IReadinessReporter {
3
3
  private readonly _lazy;
4
4
  private _cachedResult;
5
5
  private _changed;
6
6
  private readonly _interval;
7
+ /** The initial probe — `resolve()` awaits it so the FIRST call (e.g. a builder's
8
+ * build-time tool vectorization) sees the connected clients, not the empty
9
+ * pre-probe cache. Subsequent resolves return the cache without blocking. */
10
+ private readonly _firstProbe;
7
11
  constructor(configs: McpConnectionConfig[], intervalMs: number, options?: ConnectionStrategyOptions, factory?: McpClientFactory);
8
12
  private _probe;
13
+ /** Readiness delegates to the wrapped lazy strategy (its slot health is updated
14
+ * by the periodic probe). */
15
+ isReady(): boolean;
9
16
  resolve(_currentClients?: IMcpClient[]): Promise<McpConnectionResult>;
10
17
  dispose(): Promise<void>;
11
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"periodic-connection-strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/periodic-connection-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,UAAU,EACV,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAGjC,qBAAa,0BAA2B,YAAW,sBAAsB;IACvE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;gBAGzD,OAAO,EAAE,mBAAmB,EAAE,EAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,yBAAyB,EACnC,OAAO,CAAC,EAAE,gBAAgB;YAmBd,MAAM;IAQd,OAAO,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAWrE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B"}
1
+ {"version":3,"file":"periodic-connection-strategy.d.ts","sourceRoot":"","sources":["../../src/strategies/periodic-connection-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,UAAU,EACV,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAGjC,qBAAa,0BACX,YAAW,sBAAsB,EAAE,kBAAkB;IAErD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D;;kFAE8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;gBAG1C,OAAO,EAAE,mBAAmB,EAAE,EAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,yBAAyB,EACnC,OAAO,CAAC,EAAE,gBAAgB;YAmBd,MAAM;IAQpB;kCAC8B;IAC9B,OAAO,IAAI,OAAO;IAIZ,OAAO,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAarE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B"}
@@ -4,6 +4,10 @@ export class PeriodicConnectionStrategy {
4
4
  _cachedResult;
5
5
  _changed;
6
6
  _interval;
7
+ /** The initial probe — `resolve()` awaits it so the FIRST call (e.g. a builder's
8
+ * build-time tool vectorization) sees the connected clients, not the empty
9
+ * pre-probe cache. Subsequent resolves return the cache without blocking. */
10
+ _firstProbe;
7
11
  constructor(configs, intervalMs, options, factory) {
8
12
  // cooldownMs = 0 because the interval itself is the rate limiter
9
13
  this._lazy = new LazyConnectionStrategy(configs, { ...options, cooldownMs: 0 }, factory);
@@ -12,8 +16,8 @@ export class PeriodicConnectionStrategy {
12
16
  this._interval = setInterval(() => {
13
17
  void this._probe();
14
18
  }, intervalMs);
15
- // Run first probe immediately
16
- void this._probe();
19
+ // Run the first probe immediately; capture it so resolve() can await it once.
20
+ this._firstProbe = this._probe();
17
21
  }
18
22
  async _probe() {
19
23
  const result = await this._lazy.resolve(this._cachedResult.clients);
@@ -22,7 +26,14 @@ export class PeriodicConnectionStrategy {
22
26
  this._changed = true;
23
27
  }
24
28
  }
29
+ /** Readiness delegates to the wrapped lazy strategy (its slot health is updated
30
+ * by the periodic probe). */
31
+ isReady() {
32
+ return this._lazy.isReady();
33
+ }
25
34
  async resolve(_currentClients) {
35
+ // Ensure the initial connect has completed before the first resolve returns.
36
+ await this._firstProbe;
26
37
  if (this._changed) {
27
38
  this._changed = false;
28
39
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"periodic-connection-strategy.js","sourceRoot":"","sources":["../../src/strategies/periodic-connection-strategy.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,OAAO,0BAA0B;IACpB,KAAK,CAAyB;IACvC,aAAa,CAAsB;IACnC,QAAQ,CAAU;IACT,SAAS,CAAiC;IAE3D,YACE,OAA8B,EAC9B,UAAkB,EAClB,OAAmC,EACnC,OAA0B;QAE1B,iEAAiE;QACjE,IAAI,CAAC,KAAK,GAAG,IAAI,sBAAsB,CACrC,OAAO,EACP,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,EAC7B,OAAO,CACR,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC1D,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,8BAA8B;QAC9B,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAClD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,eAA8B;QAC1C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO;gBACnC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY;aAC9C,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,OAAO;QACX,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACF"}
1
+ {"version":3,"file":"periodic-connection-strategy.js","sourceRoot":"","sources":["../../src/strategies/periodic-connection-strategy.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,OAAO,0BAA0B;IAGpB,KAAK,CAAyB;IACvC,aAAa,CAAsB;IACnC,QAAQ,CAAU;IACT,SAAS,CAAiC;IAC3D;;kFAE8E;IAC7D,WAAW,CAAgB;IAE5C,YACE,OAA8B,EAC9B,UAAkB,EAClB,OAAmC,EACnC,OAA0B;QAE1B,iEAAiE;QACjE,IAAI,CAAC,KAAK,GAAG,IAAI,sBAAsB,CACrC,OAAO,EACP,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,EAC7B,OAAO,CACR,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC1D,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,8EAA8E;QAC9E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAClD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED;kCAC8B;IAC9B,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,eAA8B;QAC1C,6EAA6E;QAC7E,MAAM,IAAI,CAAC,WAAW,CAAC;QACvB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO;gBACnC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY;aAC9C,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,OAAO;QACX,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/llm-agent-mcp",
3
- "version": "19.2.0",
3
+ "version": "20.4.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -21,7 +21,7 @@
21
21
  "test": "node --import tsx/esm --test --test-reporter=spec 'src/**/*.test.ts'"
22
22
  },
23
23
  "dependencies": {
24
- "@mcp-abap-adt/llm-agent": "^19.2.0",
24
+ "@mcp-abap-adt/llm-agent": "^20.4.0",
25
25
  "@modelcontextprotocol/sdk": "^1.28.0"
26
26
  },
27
27
  "publishConfig": {