@1mcp/agent 0.10.3 → 0.12.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 (147) hide show
  1. package/README.md +41 -17
  2. package/build/auth/authManager.d.ts +109 -0
  3. package/build/auth/authManager.d.ts.map +1 -0
  4. package/build/auth/authManager.js +173 -0
  5. package/build/auth/authManager.js.map +1 -0
  6. package/build/auth/authMiddleware.d.ts +16 -0
  7. package/build/auth/authMiddleware.d.ts.map +1 -0
  8. package/build/auth/authMiddleware.js +45 -0
  9. package/build/auth/authMiddleware.js.map +1 -0
  10. package/build/auth/sessionManager.d.ts +197 -0
  11. package/build/auth/sessionManager.d.ts.map +1 -0
  12. package/build/auth/sessionManager.js +408 -0
  13. package/build/auth/sessionManager.js.map +1 -0
  14. package/build/capabilities/capabilityManager.d.ts +1 -1
  15. package/build/capabilities/capabilityManager.d.ts.map +1 -1
  16. package/build/capabilities/capabilityManager.js +39 -6
  17. package/build/capabilities/capabilityManager.js.map +1 -1
  18. package/build/config/configManager.d.ts +7 -1
  19. package/build/config/configManager.d.ts.map +1 -1
  20. package/build/config/configManager.js +24 -2
  21. package/build/config/configManager.js.map +1 -1
  22. package/build/constants.d.ts +25 -1
  23. package/build/constants.d.ts.map +1 -1
  24. package/build/constants.js +31 -2
  25. package/build/constants.js.map +1 -1
  26. package/build/{client.d.ts → core/client/clientFactory.d.ts} +1 -1
  27. package/build/core/client/clientFactory.d.ts.map +1 -0
  28. package/build/{client.js → core/client/clientFactory.js} +2 -2
  29. package/build/core/client/clientFactory.js.map +1 -0
  30. package/build/{clients → core/client}/clientManager.d.ts +3 -2
  31. package/build/core/client/clientManager.d.ts.map +1 -0
  32. package/build/{clients → core/client}/clientManager.js +10 -6
  33. package/build/core/client/clientManager.js.map +1 -0
  34. package/build/core/server/serverConfig.d.ts +100 -0
  35. package/build/core/server/serverConfig.d.ts.map +1 -0
  36. package/build/core/server/serverConfig.js +117 -0
  37. package/build/core/server/serverConfig.js.map +1 -0
  38. package/build/{serverManager.d.ts → core/server/serverManager.d.ts} +7 -2
  39. package/build/core/server/serverManager.d.ts.map +1 -0
  40. package/build/core/server/serverManager.js +159 -0
  41. package/build/core/server/serverManager.js.map +1 -0
  42. package/build/core/types/client.d.ts +38 -0
  43. package/build/core/types/client.d.ts.map +1 -0
  44. package/build/core/types/client.js +13 -0
  45. package/build/core/types/client.js.map +1 -0
  46. package/build/core/types/index.d.ts +4 -0
  47. package/build/core/types/index.d.ts.map +1 -0
  48. package/build/core/types/index.js +5 -0
  49. package/build/core/types/index.js.map +1 -0
  50. package/build/core/types/server.d.ts +14 -0
  51. package/build/core/types/server.d.ts.map +1 -0
  52. package/build/core/types/server.js +2 -0
  53. package/build/core/types/server.js.map +1 -0
  54. package/build/{types.d.ts → core/types/transport.d.ts} +1 -48
  55. package/build/core/types/transport.d.ts.map +1 -0
  56. package/build/{types.js → core/types/transport.js} +1 -13
  57. package/build/core/types/transport.js.map +1 -0
  58. package/build/handlers/notificationHandlers.d.ts +1 -1
  59. package/build/handlers/notificationHandlers.d.ts.map +1 -1
  60. package/build/handlers/notificationHandlers.js +41 -15
  61. package/build/handlers/notificationHandlers.js.map +1 -1
  62. package/build/handlers/requestHandlers.d.ts +1 -1
  63. package/build/handlers/requestHandlers.d.ts.map +1 -1
  64. package/build/handlers/requestHandlers.js +65 -2
  65. package/build/handlers/requestHandlers.js.map +1 -1
  66. package/build/index.d.ts +1 -1
  67. package/build/index.d.ts.map +1 -1
  68. package/build/index.js +44 -5
  69. package/build/index.js.map +1 -1
  70. package/build/logger/logger.js +1 -1
  71. package/build/logger/logger.js.map +1 -1
  72. package/build/server.d.ts +1 -1
  73. package/build/server.d.ts.map +1 -1
  74. package/build/server.js +6 -3
  75. package/build/server.js.map +1 -1
  76. package/build/services/configReloadService.d.ts +15 -5
  77. package/build/services/configReloadService.d.ts.map +1 -1
  78. package/build/services/configReloadService.js +28 -11
  79. package/build/services/configReloadService.js.map +1 -1
  80. package/build/{config/transportConfig.d.ts → transport/config.d.ts} +2 -2
  81. package/build/transport/config.d.ts.map +1 -0
  82. package/build/{config/transportConfig.js → transport/config.js} +2 -2
  83. package/build/transport/config.js.map +1 -0
  84. package/build/transport/http/errorHandler.d.ts.map +1 -0
  85. package/build/{server → transport/http}/errorHandler.js +1 -1
  86. package/build/transport/http/errorHandler.js.map +1 -0
  87. package/build/transport/http/middleware/loggingMiddleware.d.ts.map +1 -0
  88. package/build/{middleware → transport/http/middleware}/loggingMiddleware.js +11 -7
  89. package/build/transport/http/middleware/loggingMiddleware.js.map +1 -0
  90. package/build/transport/http/routes/oauthRoutes.d.ts +14 -0
  91. package/build/transport/http/routes/oauthRoutes.d.ts.map +1 -0
  92. package/build/transport/http/routes/oauthRoutes.js +132 -0
  93. package/build/transport/http/routes/oauthRoutes.js.map +1 -0
  94. package/build/transport/http/routes/sseRoutes.d.ts +4 -0
  95. package/build/transport/http/routes/sseRoutes.d.ts.map +1 -0
  96. package/build/transport/http/routes/sseRoutes.js +64 -0
  97. package/build/transport/http/routes/sseRoutes.js.map +1 -0
  98. package/build/transport/http/routes/streamableHttpRoutes.d.ts +4 -0
  99. package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -0
  100. package/build/transport/http/routes/streamableHttpRoutes.js +121 -0
  101. package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -0
  102. package/build/transport/http/server.d.ts +69 -0
  103. package/build/transport/http/server.d.ts.map +1 -0
  104. package/build/transport/http/server.js +115 -0
  105. package/build/transport/http/server.js.map +1 -0
  106. package/build/utils/clientFiltering.d.ts +1 -1
  107. package/build/utils/clientFiltering.d.ts.map +1 -1
  108. package/build/utils/errorHandling.d.ts +1 -0
  109. package/build/utils/errorHandling.d.ts.map +1 -1
  110. package/build/utils/errorHandling.js +29 -5
  111. package/build/utils/errorHandling.js.map +1 -1
  112. package/build/utils/errorTypes.d.ts +4 -1
  113. package/build/utils/errorTypes.d.ts.map +1 -1
  114. package/build/utils/errorTypes.js +12 -4
  115. package/build/utils/errorTypes.js.map +1 -1
  116. package/build/utils/pagination.d.ts +1 -1
  117. package/build/utils/pagination.d.ts.map +1 -1
  118. package/build/utils/pagination.js +84 -5
  119. package/build/utils/pagination.js.map +1 -1
  120. package/build/utils/tagsExtractor.d.ts.map +1 -0
  121. package/build/utils/tagsExtractor.js.map +1 -0
  122. package/package.json +14 -5
  123. package/build/client.d.ts.map +0 -1
  124. package/build/client.js.map +0 -1
  125. package/build/clients/clientManager.d.ts.map +0 -1
  126. package/build/clients/clientManager.js.map +0 -1
  127. package/build/config/transportConfig.d.ts.map +0 -1
  128. package/build/config/transportConfig.js.map +0 -1
  129. package/build/middleware/loggingMiddleware.d.ts.map +0 -1
  130. package/build/middleware/loggingMiddleware.js.map +0 -1
  131. package/build/server/errorHandler.d.ts.map +0 -1
  132. package/build/server/errorHandler.js.map +0 -1
  133. package/build/server/expressServer.d.ts +0 -11
  134. package/build/server/expressServer.d.ts.map +0 -1
  135. package/build/server/expressServer.js +0 -177
  136. package/build/server/expressServer.js.map +0 -1
  137. package/build/server/tagsExtractor.d.ts.map +0 -1
  138. package/build/server/tagsExtractor.js.map +0 -1
  139. package/build/serverManager.d.ts.map +0 -1
  140. package/build/serverManager.js +0 -87
  141. package/build/serverManager.js.map +0 -1
  142. package/build/types.d.ts.map +0 -1
  143. package/build/types.js.map +0 -1
  144. /package/build/{server → transport/http}/errorHandler.d.ts +0 -0
  145. /package/build/{middleware → transport/http/middleware}/loggingMiddleware.d.ts +0 -0
  146. /package/build/{server → utils}/tagsExtractor.d.ts +0 -0
  147. /package/build/{server → utils}/tagsExtractor.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverManager.d.ts","sourceRoot":"","sources":["../../../src/core/server/serverManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAK1E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,kBAAkB,CAA4C;IAEtE,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,mBAAmB,CAAyC;IACpE,OAAO,CAAC,gBAAgB,CAA0B;IAElD,OAAO;WAYO,mBAAmB,CAC/B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EACzC,YAAY,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EACvD,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACpC,aAAa;IAOhB,WAAkB,OAAO,IAAI,aAAa,CAEzC;WAGa,aAAa,IAAI,IAAI;IAatB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YA2B9F,iBAAiB;YAoBjB,SAAS;IA4BhB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,GAAG,IAAI;IA8BzE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAItD,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;IAUvC,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;IAIhD,wBAAwB,IAAI,MAAM;IAIlC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIpD,0BAA0B,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI;CAIvG"}
@@ -0,0 +1,159 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import logger from '../../logger/logger.js';
3
+ import configReloadService from '../../services/configReloadService.js';
4
+ import { setupCapabilities } from '../../capabilities/capabilityManager.js';
5
+ import { enhanceServerWithLogging } from '../../transport/http/middleware/loggingMiddleware.js';
6
+ export class ServerManager {
7
+ static instance;
8
+ servers = new Map();
9
+ serverConfig;
10
+ serverCapabilities;
11
+ clients = {};
12
+ transports = {};
13
+ connectionSemaphore = new Map();
14
+ disconnectingIds = new Set();
15
+ constructor(config, capabilities, clients, transports) {
16
+ this.serverConfig = config;
17
+ this.serverCapabilities = capabilities;
18
+ this.clients = clients;
19
+ this.transports = transports;
20
+ }
21
+ static getOrCreateInstance(config, capabilities, clients, transports) {
22
+ if (!ServerManager.instance) {
23
+ ServerManager.instance = new ServerManager(config, capabilities, clients, transports);
24
+ }
25
+ return ServerManager.instance;
26
+ }
27
+ static get current() {
28
+ return ServerManager.instance;
29
+ }
30
+ // Test utility method to reset singleton state
31
+ static resetInstance() {
32
+ if (ServerManager.instance) {
33
+ // Clean up existing connections with forced close
34
+ for (const [sessionId] of ServerManager.instance.servers) {
35
+ ServerManager.instance.disconnectTransport(sessionId, true);
36
+ }
37
+ ServerManager.instance.servers.clear();
38
+ ServerManager.instance.connectionSemaphore.clear();
39
+ ServerManager.instance.disconnectingIds.clear();
40
+ }
41
+ ServerManager.instance = undefined;
42
+ }
43
+ async connectTransport(transport, sessionId, opts) {
44
+ // Check if a connection is already in progress for this session
45
+ const existingConnection = this.connectionSemaphore.get(sessionId);
46
+ if (existingConnection) {
47
+ logger.warn(`Connection already in progress for session ${sessionId}, waiting...`);
48
+ await existingConnection;
49
+ return;
50
+ }
51
+ // Check if transport is already connected
52
+ if (this.servers.has(sessionId)) {
53
+ logger.warn(`Transport already connected for session ${sessionId}`);
54
+ return;
55
+ }
56
+ // Create connection promise to prevent race conditions
57
+ const connectionPromise = this.performConnection(transport, sessionId, opts);
58
+ this.connectionSemaphore.set(sessionId, connectionPromise);
59
+ try {
60
+ await connectionPromise;
61
+ }
62
+ finally {
63
+ // Clean up the semaphore entry
64
+ this.connectionSemaphore.delete(sessionId);
65
+ }
66
+ }
67
+ async performConnection(transport, sessionId, opts) {
68
+ // Set connection timeout
69
+ const connectionTimeoutMs = 30000; // 30 seconds
70
+ const timeoutPromise = new Promise((_, reject) => {
71
+ setTimeout(() => reject(new Error(`Connection timeout for session ${sessionId}`)), connectionTimeoutMs);
72
+ });
73
+ try {
74
+ await Promise.race([this.doConnect(transport, sessionId, opts), timeoutPromise]);
75
+ }
76
+ catch (error) {
77
+ // Clean up partial connection on failure
78
+ if (this.servers.has(sessionId)) {
79
+ this.servers.delete(sessionId);
80
+ }
81
+ logger.error(`Failed to connect transport for session ${sessionId}:`, error);
82
+ throw error;
83
+ }
84
+ }
85
+ async doConnect(transport, sessionId, opts) {
86
+ // Create a new server instance for this transport
87
+ const server = new Server(this.serverConfig, this.serverCapabilities);
88
+ // Create server info object first
89
+ const serverInfo = {
90
+ server,
91
+ ...opts,
92
+ };
93
+ // Enhance server with logging middleware
94
+ enhanceServerWithLogging(server);
95
+ // Set up capabilities for this server instance
96
+ await setupCapabilities(this.clients, serverInfo);
97
+ // Update the configuration reload service with server info
98
+ configReloadService.updateServerInfo(sessionId, serverInfo);
99
+ // Store the server instance
100
+ this.servers.set(sessionId, serverInfo);
101
+ // Connect the transport to the new server instance
102
+ await server.connect(transport);
103
+ logger.info(`Connected transport for session ${sessionId}`);
104
+ }
105
+ disconnectTransport(sessionId, forceClose = false) {
106
+ // Prevent recursive disconnection calls
107
+ if (this.disconnectingIds.has(sessionId)) {
108
+ return;
109
+ }
110
+ const server = this.servers.get(sessionId);
111
+ if (server) {
112
+ this.disconnectingIds.add(sessionId);
113
+ try {
114
+ // Only close the transport if explicitly requested (e.g., during shutdown)
115
+ // Don't close if this is called from an onclose handler to avoid recursion
116
+ if (forceClose && server.server.transport) {
117
+ try {
118
+ server.server.transport.close();
119
+ }
120
+ catch (error) {
121
+ logger.error(`Error closing transport for session ${sessionId}:`, error);
122
+ }
123
+ }
124
+ this.servers.delete(sessionId);
125
+ configReloadService.removeServerInfo(sessionId);
126
+ logger.info(`Disconnected transport for session ${sessionId}`);
127
+ }
128
+ finally {
129
+ this.disconnectingIds.delete(sessionId);
130
+ }
131
+ }
132
+ }
133
+ getTransport(sessionId) {
134
+ return this.servers.get(sessionId)?.server.transport;
135
+ }
136
+ getTransports() {
137
+ const transports = new Map();
138
+ for (const [id, server] of this.servers.entries()) {
139
+ if (server.server.transport) {
140
+ transports.set(id, server.server.transport);
141
+ }
142
+ }
143
+ return transports;
144
+ }
145
+ getClientTransports() {
146
+ return this.transports;
147
+ }
148
+ getActiveTransportsCount() {
149
+ return this.servers.size;
150
+ }
151
+ getServer(sessionId) {
152
+ return this.servers.get(sessionId);
153
+ }
154
+ updateClientsAndTransports(newClients, newTransports) {
155
+ this.clients = newClients;
156
+ this.transports = newTransports;
157
+ }
158
+ }
159
+ //# sourceMappingURL=serverManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverManager.js","sourceRoot":"","sources":["../../../src/core/server/serverManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
3
+ import { EnhancedTransport } from './transport.js';
4
+ /**
5
+ * Enum representing possible client connection states
6
+ */
7
+ export declare enum ClientStatus {
8
+ /** Client is successfully connected */
9
+ Connected = "connected",
10
+ /** Client is disconnected */
11
+ Disconnected = "disconnected",
12
+ /** Client encountered an error */
13
+ Error = "error"
14
+ }
15
+ /**
16
+ * Complete client information including transport, status and history
17
+ */
18
+ export interface ClientInfo {
19
+ readonly name: string;
20
+ readonly transport: EnhancedTransport;
21
+ readonly client: Client;
22
+ readonly lastError?: Error;
23
+ readonly lastConnected?: Date;
24
+ status: ClientStatus;
25
+ capabilities?: ServerCapabilities;
26
+ }
27
+ /**
28
+ * Map of client information indexed by client name
29
+ */
30
+ export type Clients = Record<string, ClientInfo>;
31
+ /**
32
+ * Options for client operations
33
+ */
34
+ export interface OperationOptions {
35
+ readonly retryCount?: number;
36
+ readonly retryDelay?: number;
37
+ }
38
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/types/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;GAEG;AACH,oBAAY,YAAY;IACtB,uCAAuC;IACvC,SAAS,cAAc;IACvB,6BAA6B;IAC7B,YAAY,iBAAiB;IAC7B,kCAAkC;IAClC,KAAK,UAAU;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Enum representing possible client connection states
3
+ */
4
+ export var ClientStatus;
5
+ (function (ClientStatus) {
6
+ /** Client is successfully connected */
7
+ ClientStatus["Connected"] = "connected";
8
+ /** Client is disconnected */
9
+ ClientStatus["Disconnected"] = "disconnected";
10
+ /** Client encountered an error */
11
+ ClientStatus["Error"] = "error";
12
+ })(ClientStatus || (ClientStatus = {}));
13
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/types/client.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,CAAN,IAAY,YAOX;AAPD,WAAY,YAAY;IACtB,uCAAuC;IACvC,uCAAuB,CAAA;IACvB,6BAA6B;IAC7B,6CAA6B,CAAA;IAC7B,kCAAkC;IAClC,+BAAe,CAAA;AACjB,CAAC,EAPW,YAAY,KAAZ,YAAY,QAOvB"}
@@ -0,0 +1,4 @@
1
+ export * from './transport.js';
2
+ export * from './server.js';
3
+ export * from './client.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/types/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ // Re-export all types from focused modules
2
+ export * from './transport.js';
3
+ export * from './server.js';
4
+ export * from './client.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/types/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
3
+ export interface ServerInfoExtra {
4
+ readonly tags?: string[];
5
+ readonly enablePagination?: boolean;
6
+ }
7
+ /**
8
+ * Server information including tags
9
+ */
10
+ export interface ServerInfo extends ServerInfoExtra {
11
+ readonly server: Server;
12
+ }
13
+ export type ServerCapability = keyof ServerCapabilities;
14
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/core/types/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,eAAe;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/core/types/server.ts"],"names":[],"mappings":""}
@@ -1,8 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
- import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
2
  import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
5
- import { ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
6
3
  /**
7
4
  * Enhanced transport interface that includes MCP-specific properties
8
5
  */
@@ -85,48 +82,4 @@ export type TransportConfig = HTTPBasedTransportConfig | StdioTransportConfig;
85
82
  * Type for MCP server parameters derived from transport config schema
86
83
  */
87
84
  export type MCPServerParams = z.infer<typeof transportConfigSchema>;
88
- export interface ServerInfoExtra {
89
- readonly tags?: string[];
90
- readonly enablePagination?: boolean;
91
- }
92
- /**
93
- * Server information including tags
94
- */
95
- export interface ServerInfo extends ServerInfoExtra {
96
- readonly server: Server;
97
- }
98
- /**
99
- * Enum representing possible client connection states
100
- */
101
- export declare enum ClientStatus {
102
- /** Client is successfully connected */
103
- Connected = "connected",
104
- /** Client is disconnected */
105
- Disconnected = "disconnected",
106
- /** Client encountered an error */
107
- Error = "error"
108
- }
109
- /**
110
- * Complete client information including transport, status and history
111
- */
112
- export interface ClientInfo {
113
- readonly name: string;
114
- readonly transport: EnhancedTransport;
115
- readonly client: Client;
116
- readonly lastError?: Error;
117
- readonly lastConnected?: Date;
118
- status: ClientStatus;
119
- capabilities?: ServerCapabilities;
120
- }
121
- /**
122
- * Map of client information indexed by client name
123
- */
124
- export type Clients = Record<string, ClientInfo>;
125
- /**
126
- * Options for client operations
127
- */
128
- export interface OperationOptions {
129
- readonly retryCount?: number;
130
- readonly retryDelay?: number;
131
- }
132
- //# sourceMappingURL=types.d.ts.map
85
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/core/types/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBhC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,wBAAwB,GAAG,oBAAoB,CAAC;AAE9E;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -17,16 +17,4 @@ export const transportConfigSchema = z.object({
17
17
  cwd: z.string().optional(),
18
18
  env: z.record(z.string()).optional(),
19
19
  });
20
- /**
21
- * Enum representing possible client connection states
22
- */
23
- export var ClientStatus;
24
- (function (ClientStatus) {
25
- /** Client is successfully connected */
26
- ClientStatus["Connected"] = "connected";
27
- /** Client is disconnected */
28
- ClientStatus["Disconnected"] = "disconnected";
29
- /** Client encountered an error */
30
- ClientStatus["Error"] = "error";
31
- })(ClientStatus || (ClientStatus = {}));
32
- //# sourceMappingURL=types.js.map
20
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/core/types/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyCxB;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAEpC,sBAAsB;IACtB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAExC,+BAA+B;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { Clients, ServerInfo } from '../types.js';
1
+ import { Clients, ServerInfo } from '../core/types/index.js';
2
2
  /**
3
3
  * Sets up client-to-server notification handlers
4
4
  * @param clients Record of client instances
@@ -1 +1 @@
1
- {"version":3,"file":"notificationHandlers.d.ts","sourceRoot":"","sources":["../../src/handlers/notificationHandlers.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAgB,MAAM,aAAa,CAAC;AAChE;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CA4B/F;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CA8B/F"}
1
+ {"version":3,"file":"notificationHandlers.d.ts","sourceRoot":"","sources":["../../src/handlers/notificationHandlers.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAgB,MAAM,wBAAwB,CAAC;AAC3E;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAwC/F;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAyC/F"}
@@ -1,7 +1,7 @@
1
1
  import { CancelledNotificationSchema, ProgressNotificationSchema, LoggingMessageNotificationSchema, ResourceUpdatedNotificationSchema, ResourceListChangedNotificationSchema, ToolListChangedNotificationSchema, PromptListChangedNotificationSchema, InitializedNotificationSchema, RootsListChangedNotificationSchema, } from '@modelcontextprotocol/sdk/types.js';
2
2
  import logger from '../logger/logger.js';
3
3
  import { withErrorHandling } from '../utils/errorHandling.js';
4
- import { ClientStatus } from '../types.js';
4
+ import { ClientStatus } from '../core/types/index.js';
5
5
  /**
6
6
  * Sets up client-to-server notification handlers
7
7
  * @param clients Record of client instances
@@ -21,13 +21,26 @@ export function setupClientToServerNotifications(clients, serverInfo) {
21
21
  clientNotificationSchemas.forEach((schema) => {
22
22
  clientInfo.client.setNotificationHandler(schema, withErrorHandling(async (notification) => {
23
23
  logger.info(`Received notification in client: ${name} ${JSON.stringify(notification)}`);
24
- serverInfo.server.notification({
25
- ...notification,
26
- params: {
27
- ...notification.params,
28
- server: name,
29
- },
30
- });
24
+ // Try to send notification, catch connection errors gracefully
25
+ try {
26
+ // Preserve original message structure and only modify params
27
+ const forwardedNotification = {
28
+ method: notification.method,
29
+ params: {
30
+ ...notification.params,
31
+ server: name,
32
+ },
33
+ };
34
+ serverInfo.server.notification(forwardedNotification);
35
+ }
36
+ catch (error) {
37
+ if (error instanceof Error && error.message.includes('Not connected')) {
38
+ logger.warn(`Server transport not connected. Dropping notification from ${name}`);
39
+ }
40
+ else {
41
+ logger.error(`Failed to send notification from ${name}: ${error}`);
42
+ }
43
+ }
31
44
  }, `Error handling client notification from ${name}`));
32
45
  });
33
46
  }
@@ -52,13 +65,26 @@ export function setupServerToClientNotifications(clients, serverInfo) {
52
65
  logger.warn(`Client ${name} is not connected. Notification not sent.`);
53
66
  return;
54
67
  }
55
- clientInfo.client.notification({
56
- ...notification,
57
- params: {
58
- ...notification.params,
59
- client: name,
60
- },
61
- });
68
+ // Try to send notification, catch connection errors gracefully
69
+ try {
70
+ // Preserve original message structure and only modify params
71
+ const forwardedNotification = {
72
+ method: notification.method,
73
+ params: {
74
+ ...notification.params,
75
+ client: name,
76
+ },
77
+ };
78
+ clientInfo.client.notification(forwardedNotification);
79
+ }
80
+ catch (error) {
81
+ if (error instanceof Error && error.message.includes('Not connected')) {
82
+ logger.warn(`Client ${name} transport not connected. Dropping notification.`);
83
+ }
84
+ else {
85
+ logger.error(`Failed to send notification to ${name}: ${error}`);
86
+ }
87
+ }
62
88
  }, `Error handling server notification to ${name}`));
63
89
  });
64
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"notificationHandlers.js","sourceRoot":"","sources":["../../src/handlers/notificationHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,EAChC,iCAAiC,EACjC,qCAAqC,EACrC,iCAAiC,EACjC,mCAAmC,EACnC,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAuB,YAAY,EAAE,MAAM,aAAa,CAAC;AAChE;;;;GAIG;AACH,MAAM,UAAU,gCAAgC,CAAC,OAAgB,EAAE,UAAsB;IACvF,MAAM,yBAAyB,GAAG;QAChC,2BAA2B;QAC3B,0BAA0B;QAC1B,gCAAgC;QAChC,iCAAiC;QACjC,qCAAqC;QACrC,iCAAiC;QACjC,mCAAmC;KACpC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,yBAAyB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC3C,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,MAAM,EACN,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;gBACvC,MAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACxF,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC7B,GAAG,YAAY;oBACf,MAAM,EAAE;wBACN,GAAG,YAAY,CAAC,MAAM;wBACtB,MAAM,EAAE,IAAI;qBACb;iBACF,CAAC,CAAC;YACL,CAAC,EAAE,2CAA2C,IAAI,EAAE,CAAC,CACtD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gCAAgC,CAAC,OAAgB,EAAE,UAAsB;IACvF,MAAM,yBAAyB,GAAG;QAChC,2BAA2B;QAC3B,0BAA0B;QAC1B,6BAA6B;QAC7B,kCAAkC;KACnC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,yBAAyB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC3C,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,MAAM,EACN,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;gBACvC,MAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACxF,IAAI,UAAU,CAAC,MAAM,KAAK,YAAY,CAAC,SAAS,EAAE,CAAC;oBACjD,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,2CAA2C,CAAC,CAAC;oBACvE,OAAO;gBACT,CAAC;gBAED,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC7B,GAAG,YAAY;oBACf,MAAM,EAAE;wBACN,GAAG,YAAY,CAAC,MAAM;wBACtB,MAAM,EAAE,IAAI;qBACb;iBACF,CAAC,CAAC;YACL,CAAC,EAAE,yCAAyC,IAAI,EAAE,CAAC,CACpD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"notificationHandlers.js","sourceRoot":"","sources":["../../src/handlers/notificationHandlers.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Clients, ServerInfo } from '../types.js';
1
+ import { Clients, ServerInfo } from '../core/types/index.js';
2
2
  /**
3
3
  * Registers all request handlers based on available capabilities
4
4
  * @param clients Record of client instances
@@ -1 +1 @@
1
- {"version":3,"file":"requestHandlers.d.ts","sourceRoot":"","sources":["../../src/handlers/requestHandlers.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkClD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAkBtF"}
1
+ {"version":3,"file":"requestHandlers.d.ts","sourceRoot":"","sources":["../../src/handlers/requestHandlers.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAgB,MAAM,wBAAwB,CAAC;AAqD3E;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CA6CtF"}
@@ -1,10 +1,12 @@
1
- import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, ListResourceTemplatesRequestSchema, SubscribeRequestSchema, UnsubscribeRequestSchema, SetLevelRequestSchema, CallToolResultSchema, CreateMessageRequestSchema, ListRootsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
1
+ import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, ListResourceTemplatesRequestSchema, SubscribeRequestSchema, UnsubscribeRequestSchema, SetLevelRequestSchema, CallToolResultSchema, CreateMessageRequestSchema, ListRootsRequestSchema, ElicitRequestSchema, PingRequestSchema, CompleteRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
2
2
  import { setLogLevel } from '../logger/logger.js';
3
3
  import { MCP_URI_SEPARATOR } from '../constants.js';
4
- import { executeClientOperation, executeServerOperation } from '../clients/clientManager.js';
4
+ import { executeClientOperation, executeServerOperation } from '../core/client/clientManager.js';
5
5
  import { parseUri, withErrorHandling } from '../utils/errorHandling.js';
6
6
  import { filterClients, byCapabilities, byTags } from '../utils/clientFiltering.js';
7
+ import { ClientStatus } from '../core/types/index.js';
7
8
  import { handlePagination } from '../utils/pagination.js';
9
+ import logger from '../logger/logger.js';
8
10
  /**
9
11
  * Registers server-specific request handlers
10
12
  * @param clients Record of client instances
@@ -12,11 +14,19 @@ import { handlePagination } from '../utils/pagination.js';
12
14
  */
13
15
  function registerServerRequestHandlers(clients, serverInfo) {
14
16
  Object.entries(clients).forEach(([_, clientInfo]) => {
17
+ clientInfo.client.setRequestHandler(PingRequestSchema, withErrorHandling(async () => {
18
+ return executeServerOperation(serverInfo, (_server) => _server.server.ping());
19
+ }, 'Error pinging'));
15
20
  clientInfo.client.setRequestHandler(CreateMessageRequestSchema, withErrorHandling(async (request) => {
16
21
  return executeServerOperation(serverInfo, (_server) => _server.server.createMessage(request.params, {
17
22
  timeout: clientInfo.transport.timeout,
18
23
  }));
19
24
  }, 'Error creating message'));
25
+ clientInfo.client.setRequestHandler(ElicitRequestSchema, withErrorHandling(async (request) => {
26
+ return executeServerOperation(serverInfo, (_server) => _server.server.elicitInput(request.params, {
27
+ timeout: clientInfo.transport.timeout,
28
+ }));
29
+ }, 'Error eliciting input'));
20
30
  clientInfo.client.setRequestHandler(ListRootsRequestSchema, withErrorHandling(async (request) => {
21
31
  return executeServerOperation(serverInfo, (_server) => _server.server.listRoots(request.params, {
22
32
  timeout: clientInfo.transport.timeout,
@@ -37,12 +47,33 @@ export function registerRequestHandlers(clients, serverInfo) {
37
47
  setLogLevel(request.params.level);
38
48
  return {};
39
49
  });
50
+ // Register ping handler
51
+ serverInfo.server.setRequestHandler(PingRequestSchema, withErrorHandling(async () => {
52
+ // Health check all connected upstream clients
53
+ const healthCheckPromises = Object.entries(clients).map(async ([clientName, clientInfo]) => {
54
+ if (clientInfo.status === ClientStatus.Connected) {
55
+ try {
56
+ await clientInfo.client.ping();
57
+ logger.info(`Health check successful for client: ${clientName}`);
58
+ }
59
+ catch (error) {
60
+ logger.warn(`Health check failed for client ${clientName}: ${error}`);
61
+ }
62
+ }
63
+ });
64
+ // Wait for all health checks to complete (but don't fail if some fail)
65
+ await Promise.allSettled(healthCheckPromises);
66
+ // Always return successful pong response
67
+ return {};
68
+ }, 'Error handling ping'));
40
69
  // Register resource-related handlers
41
70
  registerResourceHandlers(clients, serverInfo);
42
71
  // Register tool-related handlers
43
72
  registerToolHandlers(clients, serverInfo);
44
73
  // Register prompt-related handlers
45
74
  registerPromptHandlers(clients, serverInfo);
75
+ // Register completion-related handlers
76
+ registerCompletionHandlers(clients, serverInfo);
46
77
  // Register server-specific request handlers
47
78
  registerServerRequestHandlers(clients, serverInfo);
48
79
  }
@@ -115,6 +146,8 @@ function registerToolHandlers(clients, serverInfo) {
115
146
  name: `${clientInfo.name}${MCP_URI_SEPARATOR}${tool.name}`,
116
147
  description: tool.description,
117
148
  inputSchema: tool.inputSchema,
149
+ outputSchema: tool.outputSchema,
150
+ annotations: tool.annotations,
118
151
  })) ?? [], serverInfo.enablePagination ?? false);
119
152
  return {
120
153
  tools: result.items,
@@ -154,4 +187,34 @@ function registerPromptHandlers(clients, serverInfo) {
154
187
  return executeClientOperation(clients, clientName, (clientInfo) => clientInfo.client.getPrompt({ ...request.params, name: promptName }));
155
188
  }, 'Error getting prompt'));
156
189
  }
190
+ /**
191
+ * Registers completion-related request handlers
192
+ * @param clients Record of client instances
193
+ * @param serverInfo The MCP server instance
194
+ */
195
+ function registerCompletionHandlers(clients, serverInfo) {
196
+ serverInfo.server.setRequestHandler(CompleteRequestSchema, withErrorHandling(async (request) => {
197
+ const { ref } = request.params;
198
+ let clientName;
199
+ let updatedRef;
200
+ if (ref.type === 'ref/prompt') {
201
+ const { clientName: cn, resourceName } = parseUri(ref.name, MCP_URI_SEPARATOR);
202
+ clientName = cn;
203
+ updatedRef = { ...ref, name: resourceName };
204
+ }
205
+ else if (ref.type === 'ref/resource') {
206
+ const { clientName: cn, resourceName } = parseUri(ref.uri, MCP_URI_SEPARATOR);
207
+ clientName = cn;
208
+ updatedRef = { ...ref, uri: resourceName };
209
+ }
210
+ else {
211
+ // This should be caught by the schema validation, but as a safeguard:
212
+ throw new Error(`Unsupported completion reference type: ${ref.type}`);
213
+ }
214
+ const params = { ...request.params, ref: updatedRef };
215
+ return executeClientOperation(clients, clientName, (clientInfo) => clientInfo.client.complete(params, {
216
+ timeout: clientInfo.transport.timeout,
217
+ }), {}, 'completions');
218
+ }, 'Error handling completion'));
219
+ }
157
220
  //# sourceMappingURL=requestHandlers.js.map