mcp-use 1.9.1-canary.1 → 1.10.0-canary.11

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 (145) hide show
  1. package/README.md +9 -6
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/{chunk-QREDNTLS.js → chunk-5S5DWSKI.js} +1 -1
  4. package/dist/{chunk-MUZ5WYE3.js → chunk-5UB2K5L6.js} +72 -14
  5. package/dist/{chunk-33U4IA4N.js → chunk-B5N3LQQU.js} +99 -5
  6. package/dist/{chunk-3R5PDYIN.js → chunk-J75I2C26.js} +39 -11
  7. package/dist/{chunk-U5BX3ISQ.js → chunk-KMTBWOVS.js} +22 -408
  8. package/dist/{chunk-D22NUQTL.js → chunk-LXYUQEEE.js} +235 -12
  9. package/dist/{chunk-ZQUCGISK.js → chunk-NNQUSDFU.js} +21 -5
  10. package/dist/chunk-PESKSVLQ.js +1129 -0
  11. package/dist/index.cjs +1190 -200
  12. package/dist/index.d.ts +6 -4
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +63 -23
  15. package/dist/src/adapters/langchain_adapter.d.ts +1 -1
  16. package/dist/src/adapters/langchain_adapter.d.ts.map +1 -1
  17. package/dist/src/agents/index.cjs +2263 -1626
  18. package/dist/src/agents/index.js +4 -4
  19. package/dist/src/agents/mcp_agent.d.ts +5 -0
  20. package/dist/src/agents/mcp_agent.d.ts.map +1 -1
  21. package/dist/src/auth/browser-provider.d.ts +2 -2
  22. package/dist/src/auth/browser-provider.d.ts.map +1 -1
  23. package/dist/src/auth/callback.d.ts.map +1 -1
  24. package/dist/src/auth/index.cjs +39 -11
  25. package/dist/src/auth/index.js +1 -1
  26. package/dist/src/auth/types.d.ts +1 -1
  27. package/dist/src/auth/types.d.ts.map +1 -1
  28. package/dist/src/browser.cjs +2672 -1754
  29. package/dist/src/browser.d.ts +5 -1
  30. package/dist/src/browser.d.ts.map +1 -1
  31. package/dist/src/browser.js +18 -5
  32. package/dist/src/client/base.d.ts.map +1 -1
  33. package/dist/src/client/browser.d.ts +6 -0
  34. package/dist/src/client/browser.d.ts.map +1 -1
  35. package/dist/src/client/connectors/codeMode.d.ts +1 -1
  36. package/dist/src/client/connectors/codeMode.d.ts.map +1 -1
  37. package/dist/src/client/executors/base.d.ts +1 -1
  38. package/dist/src/client/executors/base.d.ts.map +1 -1
  39. package/dist/src/client/prompts.cjs +4 -1
  40. package/dist/src/client/prompts.js +3 -2
  41. package/dist/src/client.d.ts +7 -1
  42. package/dist/src/client.d.ts.map +1 -1
  43. package/dist/src/connectors/base.d.ts +56 -6
  44. package/dist/src/connectors/base.d.ts.map +1 -1
  45. package/dist/src/connectors/http.d.ts.map +1 -1
  46. package/dist/src/connectors/stdio.d.ts.map +1 -1
  47. package/dist/src/connectors/websocket.d.ts +1 -1
  48. package/dist/src/connectors/websocket.d.ts.map +1 -1
  49. package/dist/src/oauth-helper.d.ts.map +1 -1
  50. package/dist/src/react/WidgetControls.d.ts.map +1 -1
  51. package/dist/src/react/index.cjs +1357 -43
  52. package/dist/src/react/index.d.ts +4 -1
  53. package/dist/src/react/index.d.ts.map +1 -1
  54. package/dist/src/react/index.js +14 -5
  55. package/dist/src/react/types.d.ts +1 -1
  56. package/dist/src/react/types.d.ts.map +1 -1
  57. package/dist/src/react/useMcp.d.ts.map +1 -1
  58. package/dist/src/server/endpoints/mount-mcp.d.ts +4 -1
  59. package/dist/src/server/endpoints/mount-mcp.d.ts.map +1 -1
  60. package/dist/src/server/index.cjs +1923 -287
  61. package/dist/src/server/index.d.ts +3 -2
  62. package/dist/src/server/index.d.ts.map +1 -1
  63. package/dist/src/server/index.js +488 -245
  64. package/dist/src/server/mcp-server.d.ts +77 -27
  65. package/dist/src/server/mcp-server.d.ts.map +1 -1
  66. package/dist/src/server/oauth/middleware.d.ts.map +1 -1
  67. package/dist/src/server/oauth/providers/auth0.d.ts +1 -1
  68. package/dist/src/server/oauth/providers/auth0.d.ts.map +1 -1
  69. package/dist/src/server/oauth/providers/custom.d.ts +4 -2
  70. package/dist/src/server/oauth/providers/custom.d.ts.map +1 -1
  71. package/dist/src/server/oauth/providers/keycloak.d.ts +1 -1
  72. package/dist/src/server/oauth/providers/keycloak.d.ts.map +1 -1
  73. package/dist/src/server/oauth/providers/supabase.d.ts +1 -1
  74. package/dist/src/server/oauth/providers/supabase.d.ts.map +1 -1
  75. package/dist/src/server/oauth/providers/types.d.ts +9 -5
  76. package/dist/src/server/oauth/providers/types.d.ts.map +1 -1
  77. package/dist/src/server/oauth/providers.d.ts +27 -9
  78. package/dist/src/server/oauth/providers.d.ts.map +1 -1
  79. package/dist/src/server/oauth/setup.d.ts +5 -4
  80. package/dist/src/server/oauth/setup.d.ts.map +1 -1
  81. package/dist/src/server/oauth/utils.d.ts +3 -2
  82. package/dist/src/server/oauth/utils.d.ts.map +1 -1
  83. package/dist/src/server/prompts/conversion.d.ts +1 -1
  84. package/dist/src/server/prompts/conversion.d.ts.map +1 -1
  85. package/dist/src/server/prompts/index.d.ts +6 -5
  86. package/dist/src/server/prompts/index.d.ts.map +1 -1
  87. package/dist/src/server/resources/conversion.d.ts +1 -1
  88. package/dist/src/server/resources/conversion.d.ts.map +1 -1
  89. package/dist/src/server/resources/index.d.ts +44 -25
  90. package/dist/src/server/resources/index.d.ts.map +1 -1
  91. package/dist/src/server/resources/subscriptions.d.ts +1 -1
  92. package/dist/src/server/resources/subscriptions.d.ts.map +1 -1
  93. package/dist/src/server/sessions/session-manager.d.ts +11 -5
  94. package/dist/src/server/sessions/session-manager.d.ts.map +1 -1
  95. package/dist/src/server/tools/tool-execution-helpers.d.ts +31 -8
  96. package/dist/src/server/tools/tool-execution-helpers.d.ts.map +1 -1
  97. package/dist/src/server/tools/tool-registration.d.ts +21 -7
  98. package/dist/src/server/tools/tool-registration.d.ts.map +1 -1
  99. package/dist/src/server/types/common.d.ts +25 -9
  100. package/dist/src/server/types/common.d.ts.map +1 -1
  101. package/dist/src/server/types/index.d.ts +3 -3
  102. package/dist/src/server/types/index.d.ts.map +1 -1
  103. package/dist/src/server/types/prompt.d.ts +3 -2
  104. package/dist/src/server/types/prompt.d.ts.map +1 -1
  105. package/dist/src/server/types/resource.d.ts +60 -10
  106. package/dist/src/server/types/resource.d.ts.map +1 -1
  107. package/dist/src/server/types/tool-context.d.ts +116 -1
  108. package/dist/src/server/types/tool-context.d.ts.map +1 -1
  109. package/dist/src/server/types/tool.d.ts +43 -2
  110. package/dist/src/server/types/tool.d.ts.map +1 -1
  111. package/dist/src/server/types/widget.d.ts +11 -1
  112. package/dist/src/server/types/widget.d.ts.map +1 -1
  113. package/dist/src/server/utils/response-helpers.d.ts +17 -29
  114. package/dist/src/server/utils/response-helpers.d.ts.map +1 -1
  115. package/dist/src/server/widgets/index.d.ts +3 -3
  116. package/dist/src/server/widgets/index.d.ts.map +1 -1
  117. package/dist/src/server/widgets/mount-widgets-dev.d.ts.map +1 -1
  118. package/dist/src/server/widgets/ui-resource-registration.d.ts +13 -25
  119. package/dist/src/server/widgets/ui-resource-registration.d.ts.map +1 -1
  120. package/dist/src/server/widgets/widget-helpers.d.ts +11 -6
  121. package/dist/src/server/widgets/widget-helpers.d.ts.map +1 -1
  122. package/dist/src/server/widgets/widget-types.d.ts +3 -3
  123. package/dist/src/server/widgets/widget-types.d.ts.map +1 -1
  124. package/dist/src/session.d.ts +372 -2
  125. package/dist/src/session.d.ts.map +1 -1
  126. package/dist/src/task_managers/sse.d.ts +2 -2
  127. package/dist/src/task_managers/sse.d.ts.map +1 -1
  128. package/dist/src/task_managers/stdio.d.ts +2 -2
  129. package/dist/src/task_managers/stdio.d.ts.map +1 -1
  130. package/dist/src/task_managers/streamable_http.d.ts +2 -2
  131. package/dist/src/task_managers/streamable_http.d.ts.map +1 -1
  132. package/dist/src/telemetry/events.d.ts +247 -0
  133. package/dist/src/telemetry/events.d.ts.map +1 -1
  134. package/dist/src/telemetry/index.d.ts +4 -4
  135. package/dist/src/telemetry/index.d.ts.map +1 -1
  136. package/dist/src/telemetry/telemetry.d.ts +122 -4
  137. package/dist/src/telemetry/telemetry.d.ts.map +1 -1
  138. package/dist/src/telemetry/utils.d.ts +1 -1
  139. package/dist/src/telemetry/utils.d.ts.map +1 -1
  140. package/dist/src/version.d.ts +8 -0
  141. package/dist/src/version.d.ts.map +1 -0
  142. package/dist/{tool-execution-helpers-BQJTPWPN.js → tool-execution-helpers-OOVLOJYH.js} +3 -2
  143. package/dist/tsup.config.d.ts.map +1 -1
  144. package/package.json +7 -5
  145. package/dist/chunk-MTHLLDCX.js +0 -97
@@ -35,9 +35,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
35
35
  async function getNodeModules() {
36
36
  if (typeof process !== "undefined" && process.platform) {
37
37
  try {
38
- const fs3 = await import("fs");
39
- const path3 = await import("path");
40
- return { fs: fs3.default, path: path3.default };
38
+ const fs = await import("fs");
39
+ const path = await import("path");
40
+ return { fs: fs.default, path: path.default };
41
41
  } catch {
42
42
  return { fs: null, path: null };
43
43
  }
@@ -1050,6 +1050,7 @@ __export(browser_exports, {
1050
1050
  BaseAdapter: () => BaseAdapter,
1051
1051
  BaseConnector: () => BaseConnector,
1052
1052
  BrowserOAuthClientProvider: () => BrowserOAuthClientProvider,
1053
+ BrowserTelemetry: () => Tel,
1053
1054
  HttpConnector: () => HttpConnector,
1054
1055
  LangChainAdapter: () => LangChainAdapter,
1055
1056
  Logger: () => Logger,
@@ -1058,22 +1059,28 @@ __export(browser_exports, {
1058
1059
  MCPSession: () => MCPSession,
1059
1060
  ObservabilityManager: () => ObservabilityManager,
1060
1061
  RemoteAgent: () => RemoteAgent,
1062
+ Tel: () => Tel,
1063
+ Telemetry: () => Telemetry,
1064
+ VERSION: () => VERSION,
1061
1065
  WebSocketConnector: () => WebSocketConnector,
1062
1066
  createReadableStreamFromGenerator: () => createReadableStreamFromGenerator,
1067
+ getPackageVersion: () => getPackageVersion,
1063
1068
  logger: () => logger,
1064
1069
  onMcpAuthorization: () => onMcpAuthorization,
1070
+ setBrowserTelemetrySource: () => setTelemetrySource,
1071
+ setTelemetrySource: () => setTelemetrySource,
1065
1072
  streamEventsToAISDK: () => streamEventsToAISDK,
1066
1073
  streamEventsToAISDKWithTools: () => streamEventsToAISDKWithTools
1067
1074
  });
1068
1075
  module.exports = __toCommonJS(browser_exports);
1069
1076
 
1070
1077
  // src/connectors/http.ts
1071
- var import_client = require("@modelcontextprotocol/sdk/client/index.js");
1072
- var import_streamableHttp = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
1078
+ var import_client = require("@mcp-use/modelcontextprotocol-sdk/client/index.js");
1079
+ var import_streamableHttp = require("@mcp-use/modelcontextprotocol-sdk/client/streamableHttp.js");
1073
1080
  init_logging();
1074
1081
 
1075
1082
  // src/task_managers/sse.ts
1076
- var import_sse = require("@modelcontextprotocol/sdk/client/sse.js");
1083
+ var import_sse = require("@mcp-use/modelcontextprotocol-sdk/client/sse.js");
1077
1084
  init_logging();
1078
1085
 
1079
1086
  // src/task_managers/base.ts
@@ -1238,8 +1245,1042 @@ var SseConnectionManager = class extends ConnectionManager {
1238
1245
  };
1239
1246
 
1240
1247
  // src/connectors/base.ts
1241
- var import_types = require("@modelcontextprotocol/sdk/types.js");
1248
+ var import_types = require("@mcp-use/modelcontextprotocol-sdk/types.js");
1242
1249
  init_logging();
1250
+
1251
+ // src/telemetry/events.ts
1252
+ var BaseTelemetryEvent = class {
1253
+ static {
1254
+ __name(this, "BaseTelemetryEvent");
1255
+ }
1256
+ };
1257
+ var MCPAgentExecutionEvent = class extends BaseTelemetryEvent {
1258
+ constructor(data) {
1259
+ super();
1260
+ this.data = data;
1261
+ }
1262
+ static {
1263
+ __name(this, "MCPAgentExecutionEvent");
1264
+ }
1265
+ get name() {
1266
+ return "mcp_agent_execution";
1267
+ }
1268
+ get properties() {
1269
+ return {
1270
+ // Core execution info
1271
+ execution_method: this.data.executionMethod,
1272
+ query: this.data.query,
1273
+ query_length: this.data.query.length,
1274
+ success: this.data.success,
1275
+ // Agent configuration
1276
+ model_provider: this.data.modelProvider,
1277
+ model_name: this.data.modelName,
1278
+ server_count: this.data.serverCount,
1279
+ server_identifiers: this.data.serverIdentifiers,
1280
+ total_tools_available: this.data.totalToolsAvailable,
1281
+ tools_available_names: this.data.toolsAvailableNames,
1282
+ max_steps_configured: this.data.maxStepsConfigured,
1283
+ memory_enabled: this.data.memoryEnabled,
1284
+ use_server_manager: this.data.useServerManager,
1285
+ // Execution parameters (always include, even if null)
1286
+ max_steps_used: this.data.maxStepsUsed,
1287
+ manage_connector: this.data.manageConnector,
1288
+ external_history_used: this.data.externalHistoryUsed,
1289
+ // Execution results (always include, even if null)
1290
+ steps_taken: this.data.stepsTaken ?? null,
1291
+ tools_used_count: this.data.toolsUsedCount ?? null,
1292
+ tools_used_names: this.data.toolsUsedNames ?? null,
1293
+ response: this.data.response ?? null,
1294
+ response_length: this.data.response ? this.data.response.length : null,
1295
+ execution_time_ms: this.data.executionTimeMs ?? null,
1296
+ error_type: this.data.errorType ?? null,
1297
+ conversation_history_length: this.data.conversationHistoryLength ?? null
1298
+ };
1299
+ }
1300
+ };
1301
+ function createServerRunEventData(server, transport) {
1302
+ const toolRegistrations = Array.from(server.registrations.tools.values());
1303
+ const promptRegistrations = Array.from(server.registrations.prompts.values());
1304
+ const resourceRegistrations = Array.from(
1305
+ server.registrations.resources.values()
1306
+ );
1307
+ const templateRegistrations = Array.from(
1308
+ server.registrations.resourceTemplates.values()
1309
+ );
1310
+ const allResources = resourceRegistrations.map((r) => ({
1311
+ name: r.config.name,
1312
+ title: r.config.title ?? null,
1313
+ description: r.config.description ?? null,
1314
+ uri: r.config.uri ?? null,
1315
+ mime_type: r.config.mimeType ?? null
1316
+ }));
1317
+ const appsSdkResources = allResources.filter(
1318
+ (r) => r.mime_type === "text/html+skybridge"
1319
+ );
1320
+ const mcpUiResources = allResources.filter(
1321
+ (r) => r.mime_type === "text/uri-list" || r.mime_type === "text/html"
1322
+ );
1323
+ const mcpAppsResources = allResources.filter(
1324
+ (r) => r.mime_type === "text/html+mcp"
1325
+ );
1326
+ return {
1327
+ transport,
1328
+ toolsNumber: server.registeredTools.length,
1329
+ resourcesNumber: server.registeredResources.length,
1330
+ promptsNumber: server.registeredPrompts.length,
1331
+ auth: !!server.oauthProvider,
1332
+ name: server.config.name,
1333
+ description: server.config.description ?? null,
1334
+ baseUrl: server.serverBaseUrl ?? null,
1335
+ toolNames: server.registeredTools.length > 0 ? server.registeredTools : null,
1336
+ resourceNames: server.registeredResources.length > 0 ? server.registeredResources : null,
1337
+ promptNames: server.registeredPrompts.length > 0 ? server.registeredPrompts : null,
1338
+ tools: toolRegistrations.length > 0 ? toolRegistrations.map((r) => ({
1339
+ name: r.config.name,
1340
+ title: r.config.title ?? null,
1341
+ description: r.config.description ?? null,
1342
+ input_schema: r.config.schema ? JSON.stringify(r.config.schema) : null,
1343
+ output_schema: r.config.outputSchema ? JSON.stringify(r.config.outputSchema) : null
1344
+ })) : null,
1345
+ resources: allResources.length > 0 ? allResources : null,
1346
+ prompts: promptRegistrations.length > 0 ? promptRegistrations.map((r) => ({
1347
+ name: r.config.name,
1348
+ title: r.config.title ?? null,
1349
+ description: r.config.description ?? null,
1350
+ args: r.config.args ? JSON.stringify(r.config.args) : null
1351
+ })) : null,
1352
+ templates: templateRegistrations.length > 0 ? templateRegistrations.map((r) => ({
1353
+ name: r.config.name,
1354
+ title: r.config.title ?? null,
1355
+ description: r.config.description ?? null
1356
+ })) : null,
1357
+ capabilities: {
1358
+ logging: true,
1359
+ resources: { subscribe: true, listChanged: true }
1360
+ },
1361
+ appsSdkResources: appsSdkResources.length > 0 ? appsSdkResources : null,
1362
+ appsSdkResourcesNumber: appsSdkResources.length,
1363
+ mcpUiResources: mcpUiResources.length > 0 ? mcpUiResources : null,
1364
+ mcpUiResourcesNumber: mcpUiResources.length,
1365
+ mcpAppsResources: mcpAppsResources.length > 0 ? mcpAppsResources : null,
1366
+ mcpAppsResourcesNumber: mcpAppsResources.length
1367
+ };
1368
+ }
1369
+ __name(createServerRunEventData, "createServerRunEventData");
1370
+ var ServerRunEvent = class extends BaseTelemetryEvent {
1371
+ constructor(data) {
1372
+ super();
1373
+ this.data = data;
1374
+ }
1375
+ static {
1376
+ __name(this, "ServerRunEvent");
1377
+ }
1378
+ get name() {
1379
+ return "server_run";
1380
+ }
1381
+ get properties() {
1382
+ return {
1383
+ transport: this.data.transport,
1384
+ tools_number: this.data.toolsNumber,
1385
+ resources_number: this.data.resourcesNumber,
1386
+ prompts_number: this.data.promptsNumber,
1387
+ auth: this.data.auth,
1388
+ name: this.data.name,
1389
+ description: this.data.description ?? null,
1390
+ base_url: this.data.baseUrl ?? null,
1391
+ tool_names: this.data.toolNames ?? null,
1392
+ resource_names: this.data.resourceNames ?? null,
1393
+ prompt_names: this.data.promptNames ?? null,
1394
+ tools: this.data.tools ?? null,
1395
+ resources: this.data.resources ?? null,
1396
+ prompts: this.data.prompts ?? null,
1397
+ templates: this.data.templates ?? null,
1398
+ capabilities: this.data.capabilities ? JSON.stringify(this.data.capabilities) : null,
1399
+ apps_sdk_resources: this.data.appsSdkResources ? JSON.stringify(this.data.appsSdkResources) : null,
1400
+ apps_sdk_resources_number: this.data.appsSdkResourcesNumber ?? 0,
1401
+ mcp_ui_resources: this.data.mcpUiResources ? JSON.stringify(this.data.mcpUiResources) : null,
1402
+ mcp_ui_resources_number: this.data.mcpUiResourcesNumber ?? 0,
1403
+ mcp_apps_resources: this.data.mcpAppsResources ? JSON.stringify(this.data.mcpAppsResources) : null,
1404
+ mcp_apps_resources_number: this.data.mcpAppsResourcesNumber ?? 0
1405
+ };
1406
+ }
1407
+ };
1408
+ var ServerInitializeEvent = class extends BaseTelemetryEvent {
1409
+ constructor(data) {
1410
+ super();
1411
+ this.data = data;
1412
+ }
1413
+ static {
1414
+ __name(this, "ServerInitializeEvent");
1415
+ }
1416
+ get name() {
1417
+ return "server_initialize_call";
1418
+ }
1419
+ get properties() {
1420
+ return {
1421
+ protocol_version: this.data.protocolVersion,
1422
+ client_info: JSON.stringify(this.data.clientInfo),
1423
+ client_capabilities: JSON.stringify(this.data.clientCapabilities),
1424
+ session_id: this.data.sessionId ?? null
1425
+ };
1426
+ }
1427
+ };
1428
+ var ServerToolCallEvent = class extends BaseTelemetryEvent {
1429
+ constructor(data) {
1430
+ super();
1431
+ this.data = data;
1432
+ }
1433
+ static {
1434
+ __name(this, "ServerToolCallEvent");
1435
+ }
1436
+ get name() {
1437
+ return "server_tool_call";
1438
+ }
1439
+ get properties() {
1440
+ return {
1441
+ tool_name: this.data.toolName,
1442
+ length_input_argument: this.data.lengthInputArgument,
1443
+ success: this.data.success,
1444
+ error_type: this.data.errorType ?? null,
1445
+ execution_time_ms: this.data.executionTimeMs ?? null
1446
+ };
1447
+ }
1448
+ };
1449
+ var ServerResourceCallEvent = class extends BaseTelemetryEvent {
1450
+ constructor(data) {
1451
+ super();
1452
+ this.data = data;
1453
+ }
1454
+ static {
1455
+ __name(this, "ServerResourceCallEvent");
1456
+ }
1457
+ get name() {
1458
+ return "server_resource_call";
1459
+ }
1460
+ get properties() {
1461
+ return {
1462
+ name: this.data.name,
1463
+ description: this.data.description,
1464
+ contents: this.data.contents,
1465
+ success: this.data.success,
1466
+ error_type: this.data.errorType ?? null
1467
+ };
1468
+ }
1469
+ };
1470
+ var ServerPromptCallEvent = class extends BaseTelemetryEvent {
1471
+ constructor(data) {
1472
+ super();
1473
+ this.data = data;
1474
+ }
1475
+ static {
1476
+ __name(this, "ServerPromptCallEvent");
1477
+ }
1478
+ get name() {
1479
+ return "server_prompt_call";
1480
+ }
1481
+ get properties() {
1482
+ return {
1483
+ name: this.data.name,
1484
+ description: this.data.description,
1485
+ success: this.data.success,
1486
+ error_type: this.data.errorType ?? null
1487
+ };
1488
+ }
1489
+ };
1490
+ var ServerContextEvent = class extends BaseTelemetryEvent {
1491
+ constructor(data) {
1492
+ super();
1493
+ this.data = data;
1494
+ }
1495
+ static {
1496
+ __name(this, "ServerContextEvent");
1497
+ }
1498
+ get name() {
1499
+ return `server_context_${this.data.contextType}`;
1500
+ }
1501
+ get properties() {
1502
+ return {
1503
+ context_type: this.data.contextType,
1504
+ notification_type: this.data.notificationType ?? null
1505
+ };
1506
+ }
1507
+ };
1508
+ var MCPClientInitEvent = class extends BaseTelemetryEvent {
1509
+ constructor(data) {
1510
+ super();
1511
+ this.data = data;
1512
+ }
1513
+ static {
1514
+ __name(this, "MCPClientInitEvent");
1515
+ }
1516
+ get name() {
1517
+ return "mcpclient_init";
1518
+ }
1519
+ get properties() {
1520
+ return {
1521
+ code_mode: this.data.codeMode,
1522
+ sandbox: this.data.sandbox,
1523
+ all_callbacks: this.data.allCallbacks,
1524
+ verify: this.data.verify,
1525
+ servers: this.data.servers,
1526
+ num_servers: this.data.numServers,
1527
+ is_browser: this.data.isBrowser
1528
+ };
1529
+ }
1530
+ };
1531
+ var ConnectorInitEvent = class extends BaseTelemetryEvent {
1532
+ constructor(data) {
1533
+ super();
1534
+ this.data = data;
1535
+ }
1536
+ static {
1537
+ __name(this, "ConnectorInitEvent");
1538
+ }
1539
+ get name() {
1540
+ return "connector_init";
1541
+ }
1542
+ get properties() {
1543
+ return {
1544
+ connector_type: this.data.connectorType,
1545
+ server_command: this.data.serverCommand ?? null,
1546
+ server_args: this.data.serverArgs ?? null,
1547
+ server_url: this.data.serverUrl ?? null,
1548
+ public_identifier: this.data.publicIdentifier ?? null
1549
+ };
1550
+ }
1551
+ };
1552
+ var ClientAddServerEvent = class extends BaseTelemetryEvent {
1553
+ constructor(data) {
1554
+ super();
1555
+ this.data = data;
1556
+ }
1557
+ static {
1558
+ __name(this, "ClientAddServerEvent");
1559
+ }
1560
+ get name() {
1561
+ return "client_add_server";
1562
+ }
1563
+ get properties() {
1564
+ const { serverName, serverConfig } = this.data;
1565
+ const url = serverConfig.url;
1566
+ return {
1567
+ server_name: serverName,
1568
+ server_url_domain: url ? this._extractHostname(url) : null,
1569
+ transport: serverConfig.transport ?? null,
1570
+ has_auth: !!(serverConfig.authToken || serverConfig.authProvider)
1571
+ };
1572
+ }
1573
+ _extractHostname(url) {
1574
+ try {
1575
+ return new URL(url).hostname;
1576
+ } catch {
1577
+ return null;
1578
+ }
1579
+ }
1580
+ };
1581
+ var ClientRemoveServerEvent = class extends BaseTelemetryEvent {
1582
+ constructor(data) {
1583
+ super();
1584
+ this.data = data;
1585
+ }
1586
+ static {
1587
+ __name(this, "ClientRemoveServerEvent");
1588
+ }
1589
+ get name() {
1590
+ return "client_remove_server";
1591
+ }
1592
+ get properties() {
1593
+ return {
1594
+ server_name: this.data.serverName
1595
+ };
1596
+ }
1597
+ };
1598
+
1599
+ // src/server/utils/runtime.ts
1600
+ var isDeno = typeof globalThis.Deno !== "undefined";
1601
+ function generateUUID() {
1602
+ return globalThis.crypto.randomUUID();
1603
+ }
1604
+ __name(generateUUID, "generateUUID");
1605
+
1606
+ // src/telemetry/telemetry.ts
1607
+ init_logging();
1608
+
1609
+ // src/version.ts
1610
+ var VERSION = "1.10.0-canary.11";
1611
+ function getPackageVersion() {
1612
+ return VERSION;
1613
+ }
1614
+ __name(getPackageVersion, "getPackageVersion");
1615
+
1616
+ // src/telemetry/utils.ts
1617
+ function getModelProvider(llm) {
1618
+ return llm._llm_type || llm.constructor.name.toLowerCase();
1619
+ }
1620
+ __name(getModelProvider, "getModelProvider");
1621
+ function getModelName(llm) {
1622
+ if ("_identifyingParams" in llm) {
1623
+ const identifyingParams = llm._identifyingParams;
1624
+ if (typeof identifyingParams === "object" && identifyingParams !== null) {
1625
+ for (const key of [
1626
+ "model",
1627
+ "modelName",
1628
+ "model_name",
1629
+ "modelId",
1630
+ "model_id",
1631
+ "deploymentName",
1632
+ "deployment_name"
1633
+ ]) {
1634
+ if (key in identifyingParams) {
1635
+ return String(identifyingParams[key]);
1636
+ }
1637
+ }
1638
+ }
1639
+ }
1640
+ return llm.model || llm.modelName || llm.constructor.name;
1641
+ }
1642
+ __name(getModelName, "getModelName");
1643
+ function extractModelInfo(llm) {
1644
+ return [getModelProvider(llm), getModelName(llm)];
1645
+ }
1646
+ __name(extractModelInfo, "extractModelInfo");
1647
+
1648
+ // src/telemetry/telemetry.ts
1649
+ var USER_ID_STORAGE_KEY = "mcp_use_user_id";
1650
+ function detectRuntimeEnvironment() {
1651
+ try {
1652
+ if (typeof globalThis.Bun !== "undefined") {
1653
+ return "bun";
1654
+ }
1655
+ if (typeof globalThis.Deno !== "undefined") {
1656
+ return "deno";
1657
+ }
1658
+ if (typeof navigator !== "undefined" && navigator.userAgent?.includes("Cloudflare-Workers")) {
1659
+ return "cloudflare-workers";
1660
+ }
1661
+ if (typeof globalThis.EdgeRuntime !== "undefined") {
1662
+ return "edge";
1663
+ }
1664
+ if (typeof window !== "undefined" && typeof document !== "undefined") {
1665
+ return "browser";
1666
+ }
1667
+ if (typeof process !== "undefined" && typeof process.versions?.node !== "undefined") {
1668
+ return "node";
1669
+ }
1670
+ return "unknown";
1671
+ } catch {
1672
+ return "unknown";
1673
+ }
1674
+ }
1675
+ __name(detectRuntimeEnvironment, "detectRuntimeEnvironment");
1676
+ function getStorageCapability(env) {
1677
+ switch (env) {
1678
+ case "node":
1679
+ case "bun":
1680
+ return "filesystem";
1681
+ case "browser":
1682
+ try {
1683
+ if (typeof localStorage !== "undefined") {
1684
+ localStorage.setItem("__mcp_use_test__", "1");
1685
+ localStorage.removeItem("__mcp_use_test__");
1686
+ return "localStorage";
1687
+ }
1688
+ } catch {
1689
+ }
1690
+ return "session-only";
1691
+ case "deno":
1692
+ return "session-only";
1693
+ default:
1694
+ return "session-only";
1695
+ }
1696
+ }
1697
+ __name(getStorageCapability, "getStorageCapability");
1698
+ var cachedEnvironment = null;
1699
+ function getRuntimeEnvironment() {
1700
+ if (cachedEnvironment === null) {
1701
+ cachedEnvironment = detectRuntimeEnvironment();
1702
+ }
1703
+ return cachedEnvironment;
1704
+ }
1705
+ __name(getRuntimeEnvironment, "getRuntimeEnvironment");
1706
+ var ScarfEventLogger = class {
1707
+ static {
1708
+ __name(this, "ScarfEventLogger");
1709
+ }
1710
+ endpoint;
1711
+ timeout;
1712
+ constructor(endpoint, timeout = 3e3) {
1713
+ this.endpoint = endpoint;
1714
+ this.timeout = timeout;
1715
+ }
1716
+ async logEvent(properties) {
1717
+ try {
1718
+ const controller = new AbortController();
1719
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
1720
+ const response = await fetch(this.endpoint, {
1721
+ method: "POST",
1722
+ headers: {
1723
+ "Content-Type": "application/json"
1724
+ },
1725
+ body: JSON.stringify(properties),
1726
+ signal: controller.signal
1727
+ });
1728
+ clearTimeout(timeoutId);
1729
+ if (!response.ok) {
1730
+ throw new Error(`HTTP error! status: ${response.status}`);
1731
+ }
1732
+ } catch (error) {
1733
+ logger.debug(`Failed to send Scarf event: ${error}`);
1734
+ }
1735
+ }
1736
+ };
1737
+ var Telemetry = class _Telemetry {
1738
+ static {
1739
+ __name(this, "Telemetry");
1740
+ }
1741
+ static instance = null;
1742
+ PROJECT_API_KEY = "phc_lyTtbYwvkdSbrcMQNPiKiiRWrrM1seyKIMjycSvItEI";
1743
+ HOST = "https://eu.i.posthog.com";
1744
+ SCARF_GATEWAY_URL = "https://mcpuse.gateway.scarf.sh/events-ts";
1745
+ UNKNOWN_USER_ID = "UNKNOWN_USER_ID";
1746
+ _currUserId = null;
1747
+ _posthogNodeClient = null;
1748
+ _posthogBrowserClient = null;
1749
+ _posthogLoading = null;
1750
+ _scarfClient = null;
1751
+ _runtimeEnvironment;
1752
+ _storageCapability;
1753
+ _source;
1754
+ // Node.js specific paths (lazily computed)
1755
+ _userIdPath = null;
1756
+ _versionDownloadPath = null;
1757
+ constructor() {
1758
+ this._runtimeEnvironment = getRuntimeEnvironment();
1759
+ this._storageCapability = getStorageCapability(this._runtimeEnvironment);
1760
+ this._source = typeof process !== "undefined" && process.env?.MCP_USE_TELEMETRY_SOURCE || this._runtimeEnvironment;
1761
+ const telemetryDisabled = this._checkTelemetryDisabled();
1762
+ const canSupportTelemetry = this._runtimeEnvironment !== "unknown";
1763
+ if (telemetryDisabled) {
1764
+ this._posthogNodeClient = null;
1765
+ this._posthogBrowserClient = null;
1766
+ this._scarfClient = null;
1767
+ logger.debug("Telemetry disabled via environment/localStorage");
1768
+ } else if (!canSupportTelemetry) {
1769
+ this._posthogNodeClient = null;
1770
+ this._posthogBrowserClient = null;
1771
+ this._scarfClient = null;
1772
+ logger.debug(
1773
+ `Telemetry disabled - unknown environment: ${this._runtimeEnvironment}`
1774
+ );
1775
+ } else {
1776
+ logger.info(
1777
+ "Anonymized telemetry enabled. Set MCP_USE_ANONYMIZED_TELEMETRY=false to disable."
1778
+ );
1779
+ this._posthogLoading = this._initPostHog();
1780
+ try {
1781
+ this._scarfClient = new ScarfEventLogger(this.SCARF_GATEWAY_URL, 3e3);
1782
+ } catch (e) {
1783
+ logger.warn(`Failed to initialize Scarf telemetry: ${e}`);
1784
+ this._scarfClient = null;
1785
+ }
1786
+ }
1787
+ }
1788
+ _checkTelemetryDisabled() {
1789
+ if (typeof process !== "undefined" && process.env?.MCP_USE_ANONYMIZED_TELEMETRY?.toLowerCase() === "false") {
1790
+ return true;
1791
+ }
1792
+ if (typeof localStorage !== "undefined" && localStorage.getItem("MCP_USE_ANONYMIZED_TELEMETRY") === "false") {
1793
+ return true;
1794
+ }
1795
+ return false;
1796
+ }
1797
+ async _initPostHog() {
1798
+ const isBrowser = this._runtimeEnvironment === "browser";
1799
+ if (isBrowser) {
1800
+ await this._initPostHogBrowser();
1801
+ } else {
1802
+ await this._initPostHogNode();
1803
+ }
1804
+ }
1805
+ async _initPostHogBrowser() {
1806
+ try {
1807
+ const posthogModule = await import("posthog-js");
1808
+ const posthog = posthogModule.default || posthogModule.posthog;
1809
+ if (!posthog || typeof posthog.init !== "function") {
1810
+ throw new Error("posthog-js module did not export expected interface");
1811
+ }
1812
+ posthog.init(this.PROJECT_API_KEY, {
1813
+ api_host: this.HOST,
1814
+ persistence: "localStorage",
1815
+ autocapture: false,
1816
+ // We only want explicit captures
1817
+ capture_pageview: false,
1818
+ // We don't want automatic pageview tracking
1819
+ disable_session_recording: true,
1820
+ // No session recording
1821
+ loaded: /* @__PURE__ */ __name(() => {
1822
+ logger.debug("PostHog browser client initialized");
1823
+ }, "loaded")
1824
+ });
1825
+ this._posthogBrowserClient = posthog;
1826
+ } catch (e) {
1827
+ logger.warn(`Failed to initialize PostHog browser telemetry: ${e}`);
1828
+ this._posthogBrowserClient = null;
1829
+ }
1830
+ }
1831
+ async _initPostHogNode() {
1832
+ try {
1833
+ const { PostHog } = await import("posthog-node");
1834
+ const isServerlessEnvironment = [
1835
+ "cloudflare-workers",
1836
+ "edge",
1837
+ "deno"
1838
+ ].includes(this._runtimeEnvironment);
1839
+ const posthogOptions = {
1840
+ host: this.HOST,
1841
+ disableGeoip: false
1842
+ };
1843
+ if (isServerlessEnvironment) {
1844
+ posthogOptions.flushAt = 1;
1845
+ posthogOptions.flushInterval = 0;
1846
+ }
1847
+ this._posthogNodeClient = new PostHog(
1848
+ this.PROJECT_API_KEY,
1849
+ posthogOptions
1850
+ );
1851
+ logger.debug("PostHog Node.js client initialized");
1852
+ } catch (e) {
1853
+ logger.warn(`Failed to initialize PostHog Node.js telemetry: ${e}`);
1854
+ this._posthogNodeClient = null;
1855
+ }
1856
+ }
1857
+ /**
1858
+ * Get the detected runtime environment
1859
+ */
1860
+ get runtimeEnvironment() {
1861
+ return this._runtimeEnvironment;
1862
+ }
1863
+ /**
1864
+ * Get the storage capability for this environment
1865
+ */
1866
+ get storageCapability() {
1867
+ return this._storageCapability;
1868
+ }
1869
+ static getInstance() {
1870
+ if (!_Telemetry.instance) {
1871
+ _Telemetry.instance = new _Telemetry();
1872
+ }
1873
+ return _Telemetry.instance;
1874
+ }
1875
+ /**
1876
+ * Set the source identifier for telemetry events.
1877
+ * This allows tracking usage from different applications.
1878
+ * @param source - The source identifier (e.g., "my-app", "cli", "vs-code-extension")
1879
+ */
1880
+ setSource(source) {
1881
+ this._source = source;
1882
+ logger.debug(`Telemetry source set to: ${source}`);
1883
+ }
1884
+ /**
1885
+ * Get the current source identifier.
1886
+ */
1887
+ getSource() {
1888
+ return this._source;
1889
+ }
1890
+ /**
1891
+ * Check if telemetry is enabled.
1892
+ */
1893
+ get isEnabled() {
1894
+ return this._posthogNodeClient !== null || this._posthogBrowserClient !== null || this._scarfClient !== null;
1895
+ }
1896
+ get userId() {
1897
+ if (this._currUserId) {
1898
+ return this._currUserId;
1899
+ }
1900
+ try {
1901
+ switch (this._storageCapability) {
1902
+ case "filesystem":
1903
+ this._currUserId = this._getUserIdFromFilesystem();
1904
+ break;
1905
+ case "localStorage":
1906
+ this._currUserId = this._getUserIdFromLocalStorage();
1907
+ break;
1908
+ case "session-only":
1909
+ default:
1910
+ this._currUserId = `session-${generateUUID()}`;
1911
+ logger.debug(
1912
+ `Using session-based user ID (${this._runtimeEnvironment} environment)`
1913
+ );
1914
+ break;
1915
+ }
1916
+ if (this._storageCapability === "filesystem" && this._currUserId) {
1917
+ this._trackPackageDownloadInternal(this._currUserId, {
1918
+ triggered_by: "user_id_property"
1919
+ }).catch((e) => logger.debug(`Failed to track package download: ${e}`));
1920
+ }
1921
+ } catch (e) {
1922
+ logger.debug(`Failed to get/create user ID: ${e}`);
1923
+ this._currUserId = this.UNKNOWN_USER_ID;
1924
+ }
1925
+ return this._currUserId;
1926
+ }
1927
+ /**
1928
+ * Get or create user ID from filesystem (Node.js/Bun)
1929
+ */
1930
+ _getUserIdFromFilesystem() {
1931
+ const fs = require("fs");
1932
+ const os = require("os");
1933
+ const path = require("path");
1934
+ if (!this._userIdPath) {
1935
+ this._userIdPath = path.join(
1936
+ this._getCacheHome(os, path),
1937
+ "mcp_use_3",
1938
+ "telemetry_user_id"
1939
+ );
1940
+ }
1941
+ const isFirstTime = !fs.existsSync(this._userIdPath);
1942
+ if (isFirstTime) {
1943
+ logger.debug(`Creating user ID path: ${this._userIdPath}`);
1944
+ fs.mkdirSync(path.dirname(this._userIdPath), { recursive: true });
1945
+ const newUserId = generateUUID();
1946
+ fs.writeFileSync(this._userIdPath, newUserId);
1947
+ logger.debug(`User ID path created: ${this._userIdPath}`);
1948
+ return newUserId;
1949
+ }
1950
+ return fs.readFileSync(this._userIdPath, "utf-8").trim();
1951
+ }
1952
+ /**
1953
+ * Get or create user ID from localStorage (Browser)
1954
+ */
1955
+ _getUserIdFromLocalStorage() {
1956
+ try {
1957
+ let userId = localStorage.getItem(USER_ID_STORAGE_KEY);
1958
+ if (!userId) {
1959
+ userId = generateUUID();
1960
+ localStorage.setItem(USER_ID_STORAGE_KEY, userId);
1961
+ logger.debug(`Created new browser user ID`);
1962
+ }
1963
+ return userId;
1964
+ } catch (e) {
1965
+ logger.debug(`localStorage access failed: ${e}`);
1966
+ return `session-${generateUUID()}`;
1967
+ }
1968
+ }
1969
+ _getCacheHome(os, path) {
1970
+ const envVar = process.env.XDG_CACHE_HOME;
1971
+ if (envVar && path.isAbsolute(envVar)) {
1972
+ return envVar;
1973
+ }
1974
+ const platform = process.platform;
1975
+ const homeDir = os.homedir();
1976
+ if (platform === "win32") {
1977
+ const appdata = process.env.LOCALAPPDATA || process.env.APPDATA;
1978
+ if (appdata) {
1979
+ return appdata;
1980
+ }
1981
+ return path.join(homeDir, "AppData", "Local");
1982
+ } else if (platform === "darwin") {
1983
+ return path.join(homeDir, "Library", "Caches");
1984
+ } else {
1985
+ return path.join(homeDir, ".cache");
1986
+ }
1987
+ }
1988
+ async capture(event) {
1989
+ if (this._posthogLoading) {
1990
+ await this._posthogLoading;
1991
+ }
1992
+ if (!this._posthogNodeClient && !this._posthogBrowserClient && !this._scarfClient) {
1993
+ return;
1994
+ }
1995
+ const properties = { ...event.properties };
1996
+ properties.mcp_use_version = getPackageVersion();
1997
+ properties.language = "typescript";
1998
+ properties.source = this._source;
1999
+ properties.runtime = this._runtimeEnvironment;
2000
+ if (this._posthogNodeClient) {
2001
+ try {
2002
+ logger.debug(`CAPTURE: PostHog Node Event ${event.name}`);
2003
+ this._posthogNodeClient.capture({
2004
+ distinctId: this.userId,
2005
+ event: event.name,
2006
+ properties
2007
+ });
2008
+ } catch (e) {
2009
+ logger.debug(`Failed to track PostHog Node event ${event.name}: ${e}`);
2010
+ }
2011
+ }
2012
+ if (this._posthogBrowserClient) {
2013
+ try {
2014
+ logger.debug(`CAPTURE: PostHog Browser Event ${event.name}`);
2015
+ this._posthogBrowserClient.capture(event.name, {
2016
+ ...properties,
2017
+ distinct_id: this.userId
2018
+ });
2019
+ } catch (e) {
2020
+ logger.debug(
2021
+ `Failed to track PostHog Browser event ${event.name}: ${e}`
2022
+ );
2023
+ }
2024
+ }
2025
+ if (this._scarfClient) {
2026
+ try {
2027
+ const scarfProperties = {
2028
+ ...properties,
2029
+ user_id: this.userId,
2030
+ event: event.name
2031
+ };
2032
+ await this._scarfClient.logEvent(scarfProperties);
2033
+ } catch (e) {
2034
+ logger.debug(`Failed to track Scarf event ${event.name}: ${e}`);
2035
+ }
2036
+ }
2037
+ }
2038
+ // ============================================================================
2039
+ // Package Download Tracking (Node.js only)
2040
+ // ============================================================================
2041
+ /**
2042
+ * Track package download event.
2043
+ * This is a public wrapper that safely accesses userId.
2044
+ */
2045
+ async trackPackageDownload(properties) {
2046
+ return this._trackPackageDownloadInternal(this.userId, properties);
2047
+ }
2048
+ /**
2049
+ * Internal method to track package download with explicit userId.
2050
+ */
2051
+ async _trackPackageDownloadInternal(userId, properties) {
2052
+ if (!this._scarfClient) {
2053
+ return;
2054
+ }
2055
+ if (this._storageCapability !== "filesystem") {
2056
+ return;
2057
+ }
2058
+ try {
2059
+ const fs = require("fs");
2060
+ const path = require("path");
2061
+ const os = require("os");
2062
+ if (!this._versionDownloadPath) {
2063
+ this._versionDownloadPath = path.join(
2064
+ this._getCacheHome(os, path),
2065
+ "mcp_use",
2066
+ "download_version"
2067
+ );
2068
+ }
2069
+ const currentVersion = getPackageVersion();
2070
+ let shouldTrack = false;
2071
+ let firstDownload = false;
2072
+ if (!fs.existsSync(this._versionDownloadPath)) {
2073
+ shouldTrack = true;
2074
+ firstDownload = true;
2075
+ fs.mkdirSync(path.dirname(this._versionDownloadPath), {
2076
+ recursive: true
2077
+ });
2078
+ fs.writeFileSync(this._versionDownloadPath, currentVersion);
2079
+ } else {
2080
+ const savedVersion = fs.readFileSync(this._versionDownloadPath, "utf-8").trim();
2081
+ if (currentVersion > savedVersion) {
2082
+ shouldTrack = true;
2083
+ firstDownload = false;
2084
+ fs.writeFileSync(this._versionDownloadPath, currentVersion);
2085
+ }
2086
+ }
2087
+ if (shouldTrack) {
2088
+ logger.debug(
2089
+ `Tracking package download event with properties: ${JSON.stringify(properties)}`
2090
+ );
2091
+ const eventProperties = { ...properties || {} };
2092
+ eventProperties.mcp_use_version = currentVersion;
2093
+ eventProperties.user_id = userId;
2094
+ eventProperties.event = "package_download";
2095
+ eventProperties.first_download = firstDownload;
2096
+ eventProperties.language = "typescript";
2097
+ eventProperties.source = this._source;
2098
+ eventProperties.runtime = this._runtimeEnvironment;
2099
+ await this._scarfClient.logEvent(eventProperties);
2100
+ }
2101
+ } catch (e) {
2102
+ logger.debug(`Failed to track Scarf package_download event: ${e}`);
2103
+ }
2104
+ }
2105
+ // ============================================================================
2106
+ // Agent Events
2107
+ // ============================================================================
2108
+ async trackAgentExecution(data) {
2109
+ if (!this.isEnabled) return;
2110
+ const event = new MCPAgentExecutionEvent(data);
2111
+ await this.capture(event);
2112
+ }
2113
+ // ============================================================================
2114
+ // Server Events
2115
+ // ============================================================================
2116
+ /**
2117
+ * Track server run event directly from an MCPServer instance.
2118
+ */
2119
+ async trackServerRunFromServer(server, transport) {
2120
+ if (!this.isEnabled) return;
2121
+ const data = createServerRunEventData(server, transport);
2122
+ const event = new ServerRunEvent(data);
2123
+ await this.capture(event);
2124
+ }
2125
+ async trackServerInitialize(data) {
2126
+ if (!this.isEnabled) return;
2127
+ const event = new ServerInitializeEvent(data);
2128
+ await this.capture(event);
2129
+ }
2130
+ async trackServerToolCall(data) {
2131
+ if (!this.isEnabled) return;
2132
+ const event = new ServerToolCallEvent(data);
2133
+ await this.capture(event);
2134
+ }
2135
+ async trackServerResourceCall(data) {
2136
+ if (!this.isEnabled) return;
2137
+ const event = new ServerResourceCallEvent(data);
2138
+ await this.capture(event);
2139
+ }
2140
+ async trackServerPromptCall(data) {
2141
+ if (!this.isEnabled) return;
2142
+ const event = new ServerPromptCallEvent(data);
2143
+ await this.capture(event);
2144
+ }
2145
+ async trackServerContext(data) {
2146
+ if (!this.isEnabled) return;
2147
+ const event = new ServerContextEvent(data);
2148
+ await this.capture(event);
2149
+ }
2150
+ // ============================================================================
2151
+ // Client Events
2152
+ // ============================================================================
2153
+ async trackMCPClientInit(data) {
2154
+ if (!this.isEnabled) return;
2155
+ const event = new MCPClientInitEvent(data);
2156
+ await this.capture(event);
2157
+ }
2158
+ async trackConnectorInit(data) {
2159
+ if (!this.isEnabled) return;
2160
+ const event = new ConnectorInitEvent(data);
2161
+ await this.capture(event);
2162
+ }
2163
+ async trackClientAddServer(serverName, serverConfig) {
2164
+ if (!this.isEnabled) return;
2165
+ const event = new ClientAddServerEvent({ serverName, serverConfig });
2166
+ await this.capture(event);
2167
+ }
2168
+ async trackClientRemoveServer(serverName) {
2169
+ if (!this.isEnabled) return;
2170
+ const event = new ClientRemoveServerEvent({ serverName });
2171
+ await this.capture(event);
2172
+ }
2173
+ // ============================================================================
2174
+ // React Hook / Browser specific events
2175
+ // ============================================================================
2176
+ async trackUseMcpConnection(data) {
2177
+ if (!this.isEnabled) return;
2178
+ await this.capture({
2179
+ name: "usemcp_connection",
2180
+ properties: {
2181
+ url_domain: new URL(data.url).hostname,
2182
+ // Only domain for privacy
2183
+ transport_type: data.transportType,
2184
+ success: data.success,
2185
+ error_type: data.errorType ?? null,
2186
+ connection_time_ms: data.connectionTimeMs ?? null,
2187
+ has_oauth: data.hasOAuth,
2188
+ has_sampling: data.hasSampling,
2189
+ has_elicitation: data.hasElicitation
2190
+ }
2191
+ });
2192
+ }
2193
+ async trackUseMcpToolCall(data) {
2194
+ if (!this.isEnabled) return;
2195
+ await this.capture({
2196
+ name: "usemcp_tool_call",
2197
+ properties: {
2198
+ tool_name: data.toolName,
2199
+ success: data.success,
2200
+ error_type: data.errorType ?? null,
2201
+ execution_time_ms: data.executionTimeMs ?? null
2202
+ }
2203
+ });
2204
+ }
2205
+ async trackUseMcpResourceRead(data) {
2206
+ if (!this.isEnabled) return;
2207
+ await this.capture({
2208
+ name: "usemcp_resource_read",
2209
+ properties: {
2210
+ resource_uri_scheme: data.resourceUri.split(":")[0],
2211
+ // Only scheme for privacy
2212
+ success: data.success,
2213
+ error_type: data.errorType ?? null
2214
+ }
2215
+ });
2216
+ }
2217
+ // ============================================================================
2218
+ // Browser-specific Methods
2219
+ // ============================================================================
2220
+ /**
2221
+ * Identify the current user (useful for linking sessions)
2222
+ * Browser only - no-op in Node.js
2223
+ */
2224
+ identify(userId, properties) {
2225
+ if (this._posthogBrowserClient) {
2226
+ try {
2227
+ this._posthogBrowserClient.identify(userId, properties);
2228
+ } catch (e) {
2229
+ logger.debug(`Failed to identify user: ${e}`);
2230
+ }
2231
+ }
2232
+ }
2233
+ /**
2234
+ * Reset the user identity (useful for logout)
2235
+ * Browser only - no-op in Node.js
2236
+ */
2237
+ reset() {
2238
+ if (this._posthogBrowserClient) {
2239
+ try {
2240
+ this._posthogBrowserClient.reset();
2241
+ } catch (e) {
2242
+ logger.debug(`Failed to reset user: ${e}`);
2243
+ }
2244
+ }
2245
+ this._currUserId = null;
2246
+ }
2247
+ // ============================================================================
2248
+ // Node.js-specific Methods
2249
+ // ============================================================================
2250
+ /**
2251
+ * Flush the telemetry queue (Node.js only)
2252
+ */
2253
+ flush() {
2254
+ if (this._posthogNodeClient) {
2255
+ try {
2256
+ this._posthogNodeClient.flush();
2257
+ logger.debug("PostHog client telemetry queue flushed");
2258
+ } catch (e) {
2259
+ logger.debug(`Failed to flush PostHog client: ${e}`);
2260
+ }
2261
+ }
2262
+ }
2263
+ /**
2264
+ * Shutdown the telemetry client (Node.js only)
2265
+ */
2266
+ shutdown() {
2267
+ if (this._posthogNodeClient) {
2268
+ try {
2269
+ this._posthogNodeClient.shutdown();
2270
+ logger.debug("PostHog client shutdown successfully");
2271
+ } catch (e) {
2272
+ logger.debug(`Error shutting down PostHog client: ${e}`);
2273
+ }
2274
+ }
2275
+ }
2276
+ };
2277
+ var Tel = Telemetry;
2278
+ function setTelemetrySource(source) {
2279
+ Tel.getInstance().setSource(source);
2280
+ }
2281
+ __name(setTelemetrySource, "setTelemetrySource");
2282
+
2283
+ // src/connectors/base.ts
1243
2284
  var BaseConnector = class {
1244
2285
  static {
1245
2286
  __name(this, "BaseConnector");
@@ -1259,6 +2300,17 @@ var BaseConnector = class {
1259
2300
  this.rootsCache = [...opts.roots];
1260
2301
  }
1261
2302
  }
2303
+ /**
2304
+ * Track connector initialization event
2305
+ * Should be called by subclasses after successful connection
2306
+ */
2307
+ trackConnectorInit(data) {
2308
+ const connectorType = this.constructor.name;
2309
+ Telemetry.getInstance().trackConnectorInit({
2310
+ connectorType,
2311
+ ...data
2312
+ }).catch((e) => logger.debug(`Failed to track connector init: ${e}`));
2313
+ }
1262
2314
  /**
1263
2315
  * Register a handler for server notifications
1264
2316
  *
@@ -1467,7 +2519,7 @@ var BaseConnector = class {
1467
2519
  }
1468
2520
  logger.debug("Caching server capabilities & tools");
1469
2521
  const capabilities = this.client.getServerCapabilities();
1470
- this.capabilitiesCache = capabilities;
2522
+ this.capabilitiesCache = capabilities || null;
1471
2523
  const serverInfo = this.client.getServerVersion();
1472
2524
  this.serverInfoCache = serverInfo || null;
1473
2525
  const listToolsRes = await this.client.listTools(
@@ -1489,7 +2541,7 @@ var BaseConnector = class {
1489
2541
  }
1490
2542
  /** Expose cached server capabilities. */
1491
2543
  get serverCapabilities() {
1492
- return this.capabilitiesCache;
2544
+ return this.capabilitiesCache || {};
1493
2545
  }
1494
2546
  /** Expose cached server info. */
1495
2547
  get serverInfo() {
@@ -1556,7 +2608,8 @@ var BaseConnector = class {
1556
2608
  } while (cursor);
1557
2609
  return { resources: allResources };
1558
2610
  } catch (err) {
1559
- if (err.code === -32601) {
2611
+ const error = err;
2612
+ if (error.code === -32601) {
1560
2613
  logger.debug("Server advertised resources but method not found");
1561
2614
  return { resources: [] };
1562
2615
  }
@@ -1623,7 +2676,8 @@ var BaseConnector = class {
1623
2676
  logger.debug("Listing prompts");
1624
2677
  return await this.client.listPrompts();
1625
2678
  } catch (err) {
1626
- if (err.code === -32601) {
2679
+ const error = err;
2680
+ if (error.code === -32601) {
1627
2681
  logger.debug("Server advertised prompts but method not found");
1628
2682
  return { prompts: [] };
1629
2683
  }
@@ -1734,15 +2788,16 @@ var HttpConnector = class extends BaseConnector {
1734
2788
  let fallbackReason = "Unknown error";
1735
2789
  let is401Error = false;
1736
2790
  if (err instanceof import_streamableHttp.StreamableHTTPError) {
1737
- is401Error = err.code === 401;
1738
- if (err.code === 400 && err.message.includes("Missing session ID")) {
2791
+ const streamableErr = err;
2792
+ is401Error = streamableErr.code === 401;
2793
+ if (streamableErr.code === 400 && streamableErr.message.includes("Missing session ID")) {
1739
2794
  fallbackReason = "Server requires session ID (FastMCP compatibility) - using SSE transport";
1740
2795
  logger.warn(`\u26A0\uFE0F ${fallbackReason}`);
1741
- } else if (err.code === 404 || err.code === 405) {
1742
- fallbackReason = `Server returned ${err.code} - server likely doesn't support streamable HTTP`;
2796
+ } else if (streamableErr.code === 404 || streamableErr.code === 405) {
2797
+ fallbackReason = `Server returned ${streamableErr.code} - server likely doesn't support streamable HTTP`;
1743
2798
  logger.debug(fallbackReason);
1744
2799
  } else {
1745
- fallbackReason = `Server returned ${err.code}: ${err.message}`;
2800
+ fallbackReason = `Server returned ${streamableErr.code}: ${streamableErr.message}`;
1746
2801
  logger.debug(fallbackReason);
1747
2802
  }
1748
2803
  } else if (err instanceof Error) {
@@ -1882,6 +2937,10 @@ var HttpConnector = class extends BaseConnector {
1882
2937
  logger.debug(
1883
2938
  `Successfully connected to MCP implementation via streamable HTTP: ${baseUrl}`
1884
2939
  );
2940
+ this.trackConnectorInit({
2941
+ serverUrl: this.baseUrl,
2942
+ publicIdentifier: `${this.baseUrl} (streamable-http)`
2943
+ });
1885
2944
  } catch (err) {
1886
2945
  await this.cleanupResources();
1887
2946
  throw err;
@@ -1929,6 +2988,10 @@ var HttpConnector = class extends BaseConnector {
1929
2988
  logger.debug(
1930
2989
  `Successfully connected to MCP implementation via HTTP/SSE: ${baseUrl}`
1931
2990
  );
2991
+ this.trackConnectorInit({
2992
+ serverUrl: this.baseUrl,
2993
+ publicIdentifier: `${this.baseUrl} (sse)`
2994
+ });
1932
2995
  } catch (err) {
1933
2996
  await this.cleanupResources();
1934
2997
  throw err;
@@ -1942,19 +3005,12 @@ var HttpConnector = class extends BaseConnector {
1942
3005
  };
1943
3006
  }
1944
3007
  /**
1945
- * Get the transport type being used (streamable-http or sse)
1946
- */
1947
- getTransportType() {
1948
- return this.transportType;
1949
- }
1950
- };
1951
-
1952
- // src/server/utils/runtime.ts
1953
- var isDeno = typeof globalThis.Deno !== "undefined";
1954
- function generateUUID() {
1955
- return globalThis.crypto.randomUUID();
1956
- }
1957
- __name(generateUUID, "generateUUID");
3008
+ * Get the transport type being used (streamable-http or sse)
3009
+ */
3010
+ getTransportType() {
3011
+ return this.transportType;
3012
+ }
3013
+ };
1958
3014
 
1959
3015
  // src/connectors/websocket.ts
1960
3016
  init_logging();
@@ -2233,6 +3289,9 @@ var WebSocketConnector = class extends BaseConnector {
2233
3289
  }
2234
3290
  };
2235
3291
 
3292
+ // src/client/browser.ts
3293
+ init_logging();
3294
+
2236
3295
  // src/client/base.ts
2237
3296
  init_logging();
2238
3297
 
@@ -2296,2003 +3355,1823 @@ var MCPSession = class {
2296
3355
  * { uri: "file:///home/user/project", name: "My Project" },
2297
3356
  * { uri: "file:///home/user/data" }
2298
3357
  * ]);
2299
- * ```
2300
- */
2301
- async setRoots(roots) {
2302
- return this.connector.setRoots(roots);
2303
- }
2304
- /**
2305
- * Get the current roots.
2306
- */
2307
- getRoots() {
2308
- return this.connector.getRoots();
2309
- }
2310
- };
2311
-
2312
- // src/client/base.ts
2313
- var BaseMCPClient = class {
2314
- static {
2315
- __name(this, "BaseMCPClient");
2316
- }
2317
- config = {};
2318
- sessions = {};
2319
- activeSessions = [];
2320
- constructor(config) {
2321
- if (config) {
2322
- this.config = config;
2323
- }
2324
- }
2325
- static fromDict(_cfg) {
2326
- throw new Error("fromDict must be implemented by concrete class");
2327
- }
2328
- addServer(name, serverConfig) {
2329
- this.config.mcpServers = this.config.mcpServers || {};
2330
- this.config.mcpServers[name] = serverConfig;
2331
- }
2332
- removeServer(name) {
2333
- if (this.config.mcpServers?.[name]) {
2334
- delete this.config.mcpServers[name];
2335
- this.activeSessions = this.activeSessions.filter((n) => n !== name);
2336
- }
2337
- }
2338
- getServerNames() {
2339
- return Object.keys(this.config.mcpServers ?? {});
2340
- }
2341
- getServerConfig(name) {
2342
- return this.config.mcpServers?.[name];
2343
- }
2344
- getConfig() {
2345
- return this.config ?? {};
2346
- }
2347
- async createSession(serverName, autoInitialize = true) {
2348
- const servers = this.config.mcpServers ?? {};
2349
- if (Object.keys(servers).length === 0) {
2350
- logger.warn("No MCP servers defined in config");
2351
- }
2352
- if (!servers[serverName]) {
2353
- throw new Error(`Server '${serverName}' not found in config`);
2354
- }
2355
- const connector = this.createConnectorFromConfig(servers[serverName]);
2356
- const session = new MCPSession(connector);
2357
- if (autoInitialize) {
2358
- await session.initialize();
2359
- }
2360
- this.sessions[serverName] = session;
2361
- if (!this.activeSessions.includes(serverName)) {
2362
- this.activeSessions.push(serverName);
2363
- }
2364
- return session;
2365
- }
2366
- async createAllSessions(autoInitialize = true) {
2367
- const servers = this.config.mcpServers ?? {};
2368
- if (Object.keys(servers).length === 0) {
2369
- logger.warn("No MCP servers defined in config");
2370
- }
2371
- for (const name of Object.keys(servers)) {
2372
- await this.createSession(name, autoInitialize);
2373
- }
2374
- return this.sessions;
2375
- }
2376
- getSession(serverName) {
2377
- const session = this.sessions[serverName];
2378
- if (!session) {
2379
- return null;
2380
- }
2381
- return session;
2382
- }
2383
- getAllActiveSessions() {
2384
- return Object.fromEntries(
2385
- this.activeSessions.map((n) => [n, this.sessions[n]])
2386
- );
2387
- }
2388
- async closeSession(serverName) {
2389
- const session = this.sessions[serverName];
2390
- if (!session) {
2391
- logger.warn(
2392
- `No session exists for server ${serverName}, nothing to close`
2393
- );
2394
- return;
2395
- }
2396
- try {
2397
- logger.debug(`Closing session for server ${serverName}`);
2398
- await session.disconnect();
2399
- } catch (e) {
2400
- logger.error(`Error closing session for server '${serverName}': ${e}`);
2401
- } finally {
2402
- delete this.sessions[serverName];
2403
- this.activeSessions = this.activeSessions.filter((n) => n !== serverName);
2404
- }
2405
- }
2406
- async closeAllSessions() {
2407
- const serverNames = Object.keys(this.sessions);
2408
- const errors = [];
2409
- for (const serverName of serverNames) {
2410
- try {
2411
- logger.debug(`Closing session for server ${serverName}`);
2412
- await this.closeSession(serverName);
2413
- } catch (e) {
2414
- const errorMsg = `Failed to close session for server '${serverName}': ${e}`;
2415
- logger.error(errorMsg);
2416
- errors.push(errorMsg);
2417
- }
2418
- }
2419
- if (errors.length) {
2420
- logger.error(
2421
- `Encountered ${errors.length} errors while closing sessions`
2422
- );
2423
- } else {
2424
- logger.debug("All sessions closed successfully");
2425
- }
2426
- }
2427
- };
2428
-
2429
- // src/client/browser.ts
2430
- var BrowserMCPClient = class _BrowserMCPClient extends BaseMCPClient {
2431
- static {
2432
- __name(this, "BrowserMCPClient");
2433
- }
2434
- constructor(config) {
2435
- super(config);
2436
- }
2437
- static fromDict(cfg) {
2438
- return new _BrowserMCPClient(cfg);
2439
- }
2440
- /**
2441
- * Create a connector from server configuration (Browser version)
2442
- * Supports HTTP and WebSocket connectors only
2443
- */
2444
- createConnectorFromConfig(serverConfig) {
2445
- const {
2446
- url,
2447
- transport,
2448
- headers,
2449
- authToken,
2450
- authProvider,
2451
- wrapTransport,
2452
- clientOptions,
2453
- samplingCallback,
2454
- elicitationCallback
2455
- } = serverConfig;
2456
- if (!url) {
2457
- throw new Error("Server URL is required");
2458
- }
2459
- const connectorOptions = {
2460
- headers,
2461
- authToken,
2462
- authProvider,
2463
- // ← Pass OAuth provider to connector
2464
- wrapTransport,
2465
- // ← Pass transport wrapper if provided
2466
- clientOptions,
2467
- // ← Pass client options (capabilities, etc.) to connector
2468
- samplingCallback,
2469
- // ← Pass sampling callback to connector
2470
- elicitationCallback
2471
- // ← Pass elicitation callback to connector
2472
- };
2473
- if (clientOptions) {
2474
- console.log(
2475
- "[BrowserMCPClient] Passing clientOptions to connector:",
2476
- JSON.stringify(clientOptions, null, 2)
2477
- );
2478
- } else {
2479
- console.warn(
2480
- "[BrowserMCPClient] No clientOptions provided to connector!"
2481
- );
2482
- }
2483
- if (transport === "websocket" || url.startsWith("ws://") || url.startsWith("wss://")) {
2484
- return new WebSocketConnector(url, connectorOptions);
2485
- } else if (transport === "http" || url.startsWith("http://") || url.startsWith("https://")) {
2486
- return new HttpConnector(url, connectorOptions);
2487
- } else {
2488
- return new HttpConnector(url, connectorOptions);
2489
- }
2490
- }
2491
- };
2492
-
2493
- // src/agents/mcp_agent.ts
2494
- var import_langchain2 = require("langchain");
2495
- var import_zod9 = require("zod");
2496
-
2497
- // src/utils/json-schema-to-zod/JSONSchemaToZod.ts
2498
- var import_zod = require("zod");
2499
- var JSONSchemaToZod = class {
2500
- static {
2501
- __name(this, "JSONSchemaToZod");
2502
- }
2503
- /**
2504
- * Converts a JSON schema to a Zod schema.
2505
- *
2506
- * @param {JSONSchema} schema - The JSON schema.
2507
- * @returns {ZodSchema} - The Zod schema.
2508
- */
2509
- static convert(schema) {
2510
- return this.parseSchema(schema);
2511
- }
2512
- /**
2513
- * Checks if data matches a condition schema.
2514
- *
2515
- * @param {JSONValue} data - The data to check.
2516
- * @param {JSONSchema} condition - The condition schema.
2517
- * @returns {boolean} - Whether the data matches the condition.
2518
- */
2519
- static matchesCondition(data, condition) {
2520
- if (!condition.properties) {
2521
- return true;
2522
- }
2523
- if (typeof data !== "object" || data === null || Array.isArray(data)) {
2524
- return false;
2525
- }
2526
- const objectData = data;
2527
- for (const [key, propCondition] of Object.entries(condition.properties)) {
2528
- if (!(key in objectData)) {
2529
- if ("const" in propCondition) {
2530
- return false;
2531
- }
2532
- continue;
2533
- }
2534
- const value = objectData[key];
2535
- if ("const" in propCondition && value !== propCondition["const"]) {
2536
- return false;
2537
- }
2538
- if ("minimum" in propCondition && typeof value === "number" && value < propCondition["minimum"]) {
2539
- return false;
2540
- }
2541
- if ("maximum" in propCondition && typeof value === "number" && value > propCondition["maximum"]) {
2542
- return false;
2543
- }
2544
- }
2545
- return true;
3358
+ * ```
3359
+ */
3360
+ async setRoots(roots) {
3361
+ return this.connector.setRoots(roots);
2546
3362
  }
2547
3363
  /**
2548
- * Validates data against a conditional schema and adds issues to context if validation fails.
3364
+ * Get the current roots.
3365
+ */
3366
+ getRoots() {
3367
+ return this.connector.getRoots();
3368
+ }
3369
+ /**
3370
+ * Get the cached list of tools from the server.
2549
3371
  *
2550
- * @param {JSONValue} data - The data to validate.
2551
- * @param {JSONSchema} schema - The conditional schema.
2552
- * @param {z.RefinementCtx} ctx - The Zod refinement context.
3372
+ * @returns Array of available tools
3373
+ *
3374
+ * @example
3375
+ * ```typescript
3376
+ * const tools = session.tools;
3377
+ * console.log(`Available tools: ${tools.map(t => t.name).join(", ")}`);
3378
+ * ```
2553
3379
  */
2554
- static validateConditionalSchema(data, schema, ctx) {
2555
- this.validateRequiredProperties(data, schema, ctx);
2556
- this.validatePropertyPatterns(data, schema, ctx);
2557
- this.validateNestedConditions(data, schema, ctx);
3380
+ get tools() {
3381
+ return this.connector.tools;
2558
3382
  }
2559
3383
  /**
2560
- * Validates that all required properties are present in the data.
3384
+ * Get the server capabilities advertised during initialization.
2561
3385
  *
2562
- * @param {JSONValue} data - The data to validate.
2563
- * @param {JSONSchema} schema - The schema containing required properties.
2564
- * @param {z.RefinementCtx} ctx - The Zod refinement context.
3386
+ * @returns Server capabilities object
2565
3387
  */
2566
- static validateRequiredProperties(data, schema, ctx) {
2567
- if (!schema.required) {
2568
- return;
2569
- }
2570
- if (typeof data !== "object" || data === null) {
2571
- for (const requiredProp of schema.required) {
2572
- ctx.addIssue({
2573
- code: import_zod.z.ZodIssueCode.custom,
2574
- message: `Required property '${requiredProp}' is missing`,
2575
- path: [requiredProp]
2576
- });
2577
- }
2578
- return;
2579
- }
2580
- for (const requiredProp of schema.required) {
2581
- if (!(requiredProp in data)) {
2582
- ctx.addIssue({
2583
- code: import_zod.z.ZodIssueCode.custom,
2584
- message: `Required property '${requiredProp}' is missing`,
2585
- path: [requiredProp]
2586
- });
2587
- }
2588
- }
3388
+ get serverCapabilities() {
3389
+ return this.connector.serverCapabilities;
2589
3390
  }
2590
3391
  /**
2591
- * Validates property patterns for string properties.
3392
+ * Get the server information (name and version).
2592
3393
  *
2593
- * @param {JSONValue} data - The data to validate.
2594
- * @param {JSONSchema} schema - The schema containing property patterns.
2595
- * @param {z.RefinementCtx} ctx - The Zod refinement context.
3394
+ * @returns Server info object or null if not available
2596
3395
  */
2597
- static validatePropertyPatterns(data, schema, ctx) {
2598
- if (!schema.properties) {
2599
- return;
2600
- }
2601
- if (typeof data !== "object" || data === null) {
2602
- return;
2603
- }
2604
- if (Array.isArray(data)) {
2605
- return;
2606
- }
2607
- const objectData = data;
2608
- for (const [key, propSchema] of Object.entries(schema.properties)) {
2609
- if (!(key in objectData)) {
2610
- continue;
2611
- }
2612
- const value = objectData[key];
2613
- if (propSchema["pattern"] && typeof value === "string") {
2614
- const regex = new RegExp(propSchema["pattern"]);
2615
- if (!regex.test(value)) {
2616
- ctx.addIssue({
2617
- code: import_zod.z.ZodIssueCode.custom,
2618
- message: `String '${value}' does not match pattern '${propSchema["pattern"]}'`,
2619
- path: [key]
2620
- });
2621
- }
2622
- }
2623
- }
3396
+ get serverInfo() {
3397
+ return this.connector.serverInfo;
2624
3398
  }
2625
3399
  /**
2626
- * Validates nested if-then-else conditions.
3400
+ * Call a tool on the server.
2627
3401
  *
2628
- * @param {JSONValue} data - The data to validate.
2629
- * @param {JSONSchema} schema - The schema containing if-then-else conditions.
2630
- * @param {z.RefinementCtx} ctx - The Zod refinement context.
3402
+ * @param name - Name of the tool to call
3403
+ * @param args - Arguments to pass to the tool
3404
+ * @param options - Optional request options (timeout, progress handlers, etc.)
3405
+ * @returns Result from the tool execution
3406
+ *
3407
+ * @example
3408
+ * ```typescript
3409
+ * const result = await session.callTool("add", { a: 5, b: 3 });
3410
+ * console.log(`Result: ${result.content[0].text}`);
3411
+ * ```
2631
3412
  */
2632
- static validateNestedConditions(data, schema, ctx) {
2633
- if (!schema["if"] || !schema["then"]) {
2634
- return;
2635
- }
2636
- const matchesIf = this.matchesCondition(data, schema["if"]);
2637
- if (matchesIf) {
2638
- this.validateConditionalSchema(data, schema["then"], ctx);
2639
- } else if (schema["else"]) {
2640
- this.validateConditionalSchema(data, schema["else"], ctx);
2641
- }
3413
+ async callTool(name, args, options) {
3414
+ return this.connector.callTool(name, args, options);
2642
3415
  }
2643
3416
  /**
2644
- * Parses a JSON schema and returns the corresponding Zod schema.
2645
- * This is the main entry point for schema conversion.
3417
+ * List resources from the server with optional pagination.
2646
3418
  *
2647
- * @param {JSONSchema} schema - The JSON schema.
2648
- * @returns {ZodTypeAny} - The ZodTypeAny schema.
3419
+ * @param cursor - Optional cursor for pagination
3420
+ * @param options - Request options
3421
+ * @returns Resource list with optional nextCursor for pagination
3422
+ *
3423
+ * @example
3424
+ * ```typescript
3425
+ * const result = await session.listResources();
3426
+ * console.log(`Found ${result.resources.length} resources`);
3427
+ * ```
2649
3428
  */
2650
- static parseSchema(schema) {
2651
- if (Array.isArray(schema.type)) {
2652
- return this.handleTypeArray(schema);
2653
- }
2654
- if (schema.oneOf || schema.anyOf || schema.allOf) {
2655
- return this.parseCombinator(schema);
2656
- }
2657
- if (schema["if"] && schema["then"]) {
2658
- return this.parseObject(schema);
2659
- }
2660
- if (schema.properties && (!schema.type || schema.type === "object")) {
2661
- return this.parseObject(schema);
2662
- }
2663
- return this.handleSingleType(schema);
3429
+ async listResources(cursor, options) {
3430
+ return this.connector.listResources(cursor, options);
2664
3431
  }
2665
3432
  /**
2666
- * Handles schemas with an array of types.
3433
+ * List all resources from the server, automatically handling pagination.
2667
3434
  *
2668
- * @param {JSONSchema} schema - The JSON schema with type array.
2669
- * @returns {ZodTypeAny} - The ZodTypeAny schema.
3435
+ * @param options - Request options
3436
+ * @returns Complete list of all resources
3437
+ *
3438
+ * @example
3439
+ * ```typescript
3440
+ * const result = await session.listAllResources();
3441
+ * console.log(`Total resources: ${result.resources.length}`);
3442
+ * ```
2670
3443
  */
2671
- static handleTypeArray(schema) {
2672
- if (!Array.isArray(schema.type)) {
2673
- throw new Error("Expected schema.type to be an array");
2674
- }
2675
- if (schema.type.includes("null")) {
2676
- return this.handleNullableType(schema);
2677
- }
2678
- return this.createUnionFromTypes(schema.type, schema);
3444
+ async listAllResources(options) {
3445
+ return this.connector.listAllResources(options);
2679
3446
  }
2680
3447
  /**
2681
- * Handles nullable types by creating a nullable schema.
3448
+ * List resource templates from the server.
2682
3449
  *
2683
- * @param {JSONSchema} schema - The JSON schema with nullable type.
2684
- * @returns {ZodTypeAny} - The nullable Zod schema.
3450
+ * @param options - Request options
3451
+ * @returns List of available resource templates
3452
+ *
3453
+ * @example
3454
+ * ```typescript
3455
+ * const result = await session.listResourceTemplates();
3456
+ * console.log(`Available templates: ${result.resourceTemplates.length}`);
3457
+ * ```
2685
3458
  */
2686
- static handleNullableType(schema) {
2687
- if (!Array.isArray(schema.type)) {
2688
- throw new Error("Expected schema.type to be an array");
2689
- }
2690
- const nonNullSchema = { ...schema };
2691
- nonNullSchema.type = schema.type.filter((t) => t !== "null");
2692
- if (nonNullSchema.type.length === 1) {
2693
- const singleTypeSchema = this.handleSingleType({
2694
- ...schema,
2695
- type: nonNullSchema.type[0]
2696
- });
2697
- return singleTypeSchema.nullable();
2698
- }
2699
- const unionSchema = this.parseSchema(nonNullSchema);
2700
- return unionSchema.nullable();
3459
+ async listResourceTemplates(options) {
3460
+ return this.connector.listResourceTemplates(options);
2701
3461
  }
2702
3462
  /**
2703
- * Creates a union type from an array of types.
3463
+ * Read a resource by URI.
2704
3464
  *
2705
- * @param {string[]} types - Array of type strings.
2706
- * @param {JSONSchema} baseSchema - The base schema to apply to each type.
2707
- * @returns {ZodTypeAny} - The union Zod schema.
3465
+ * @param uri - URI of the resource to read
3466
+ * @param options - Request options
3467
+ * @returns Resource content
3468
+ *
3469
+ * @example
3470
+ * ```typescript
3471
+ * const resource = await session.readResource("file:///path/to/file.txt");
3472
+ * console.log(resource.contents);
3473
+ * ```
2708
3474
  */
2709
- static createUnionFromTypes(types, baseSchema) {
2710
- const schemas = types.map((type) => {
2711
- const singleTypeSchema = { ...baseSchema, type };
2712
- return this.parseSchema(singleTypeSchema);
2713
- });
2714
- return import_zod.z.union(schemas);
3475
+ async readResource(uri, options) {
3476
+ return this.connector.readResource(uri, options);
2715
3477
  }
2716
3478
  /**
2717
- * Handles schemas with a single type.
3479
+ * Subscribe to resource updates.
2718
3480
  *
2719
- * @param {JSONSchema} schema - The JSON schema with single type.
2720
- * @returns {ZodTypeAny} - The ZodTypeAny schema.
3481
+ * @param uri - URI of the resource to subscribe to
3482
+ * @param options - Request options
3483
+ *
3484
+ * @example
3485
+ * ```typescript
3486
+ * await session.subscribeToResource("file:///path/to/file.txt");
3487
+ * // Now you'll receive notifications when this resource changes
3488
+ * ```
2721
3489
  */
2722
- static handleSingleType(schema) {
2723
- if (schema.type === void 0) {
2724
- if (schema.oneOf || schema.anyOf || schema.allOf) {
2725
- return this.parseCombinator(schema);
2726
- }
2727
- if (schema.properties) {
2728
- return this.parseObject(schema);
2729
- }
2730
- return import_zod.z.any();
2731
- }
2732
- switch (schema.type) {
2733
- case "string":
2734
- return this.parseString(schema);
2735
- case "number":
2736
- case "integer":
2737
- return this.parseNumberSchema(schema);
2738
- case "boolean":
2739
- return import_zod.z.boolean();
2740
- case "array":
2741
- return this.parseArray(schema);
2742
- case "object":
2743
- return this.parseObject(schema);
2744
- default:
2745
- throw new Error("Unsupported schema type");
2746
- }
3490
+ async subscribeToResource(uri, options) {
3491
+ return this.connector.subscribeToResource(uri, options);
2747
3492
  }
2748
3493
  /**
2749
- * Parses a number schema.
3494
+ * Unsubscribe from resource updates.
2750
3495
  *
2751
- * @param {JSONSchema} schema - The JSON schema for a number.
2752
- * @returns {ZodTypeAny} - The ZodTypeAny schema.
3496
+ * @param uri - URI of the resource to unsubscribe from
3497
+ * @param options - Request options
3498
+ *
3499
+ * @example
3500
+ * ```typescript
3501
+ * await session.unsubscribeFromResource("file:///path/to/file.txt");
3502
+ * ```
2753
3503
  */
2754
- static parseNumberSchema(schema) {
2755
- const numberSchema = import_zod.z.number();
2756
- let result = numberSchema;
2757
- result = this.applyNumberBounds(numberSchema, schema);
2758
- result = this.applyNumberMultipleOf(numberSchema, schema);
2759
- result = this.applyNumberEnum(numberSchema, schema);
2760
- result = this.applyIntegerConstraint(numberSchema, schema);
2761
- return result;
3504
+ async unsubscribeFromResource(uri, options) {
3505
+ return this.connector.unsubscribeFromResource(uri, options);
3506
+ }
3507
+ /**
3508
+ * List available prompts from the server.
3509
+ *
3510
+ * @returns List of available prompts
3511
+ *
3512
+ * @example
3513
+ * ```typescript
3514
+ * const result = await session.listPrompts();
3515
+ * console.log(`Available prompts: ${result.prompts.length}`);
3516
+ * ```
3517
+ */
3518
+ async listPrompts() {
3519
+ return this.connector.listPrompts();
3520
+ }
3521
+ /**
3522
+ * Get a specific prompt with arguments.
3523
+ *
3524
+ * @param name - Name of the prompt to get
3525
+ * @param args - Arguments for the prompt
3526
+ * @returns Prompt result
3527
+ *
3528
+ * @example
3529
+ * ```typescript
3530
+ * const prompt = await session.getPrompt("greeting", { name: "Alice" });
3531
+ * console.log(prompt.messages);
3532
+ * ```
3533
+ */
3534
+ async getPrompt(name, args) {
3535
+ return this.connector.getPrompt(name, args);
2762
3536
  }
2763
3537
  /**
2764
- * Applies bounds validation to a number schema.
3538
+ * Send a raw request through the client.
2765
3539
  *
2766
- * @param {z.ZodNumber} numberSchema - The base number schema.
2767
- * @param {JSONSchema} schema - The JSON schema with bounds.
2768
- * @returns {z.ZodNumber} - The updated schema with bounds validation.
3540
+ * @param method - MCP method name
3541
+ * @param params - Request parameters
3542
+ * @param options - Request options
3543
+ * @returns Response from the server
3544
+ *
3545
+ * @example
3546
+ * ```typescript
3547
+ * const result = await session.request("custom/method", { key: "value" });
3548
+ * ```
2769
3549
  */
2770
- static applyNumberBounds(numberSchema, schema) {
2771
- let result = numberSchema;
2772
- if (schema["minimum"] !== void 0) {
2773
- result = schema["exclusiveMinimum"] ? result.gt(schema["minimum"]) : result.gte(schema["minimum"]);
3550
+ async request(method, params = null, options) {
3551
+ return this.connector.request(method, params, options);
3552
+ }
3553
+ };
3554
+
3555
+ // src/client/base.ts
3556
+ var BaseMCPClient = class {
3557
+ static {
3558
+ __name(this, "BaseMCPClient");
3559
+ }
3560
+ config = {};
3561
+ sessions = {};
3562
+ activeSessions = [];
3563
+ constructor(config) {
3564
+ if (config) {
3565
+ this.config = config;
2774
3566
  }
2775
- if (schema["maximum"] !== void 0) {
2776
- result = schema["exclusiveMaximum"] ? result.lt(schema["maximum"]) : result.lte(schema["maximum"]);
3567
+ }
3568
+ static fromDict(_cfg) {
3569
+ throw new Error("fromDict must be implemented by concrete class");
3570
+ }
3571
+ addServer(name, serverConfig) {
3572
+ this.config.mcpServers = this.config.mcpServers || {};
3573
+ this.config.mcpServers[name] = serverConfig;
3574
+ Tel.getInstance().trackClientAddServer(name, serverConfig);
3575
+ }
3576
+ removeServer(name) {
3577
+ if (this.config.mcpServers?.[name]) {
3578
+ delete this.config.mcpServers[name];
3579
+ this.activeSessions = this.activeSessions.filter((n) => n !== name);
3580
+ Tel.getInstance().trackClientRemoveServer(name);
2777
3581
  }
2778
- return result;
2779
3582
  }
2780
- /**
2781
- * Applies multipleOf validation to a number schema.
2782
- *
2783
- * @param {z.ZodNumber} numberSchema - The base number schema.
2784
- * @param {JSONSchema} schema - The JSON schema with multipleOf.
2785
- * @returns {z.ZodNumber} - The updated schema with multipleOf validation.
2786
- */
2787
- static applyNumberMultipleOf(numberSchema, schema) {
2788
- if (schema["multipleOf"] === void 0) {
2789
- return numberSchema;
3583
+ getServerNames() {
3584
+ return Object.keys(this.config.mcpServers ?? {});
3585
+ }
3586
+ getServerConfig(name) {
3587
+ return this.config.mcpServers?.[name];
3588
+ }
3589
+ getConfig() {
3590
+ return this.config ?? {};
3591
+ }
3592
+ async createSession(serverName, autoInitialize = true) {
3593
+ const servers = this.config.mcpServers ?? {};
3594
+ if (Object.keys(servers).length === 0) {
3595
+ logger.warn("No MCP servers defined in config");
2790
3596
  }
2791
- return numberSchema.refine((val) => val % schema["multipleOf"] === 0, {
2792
- message: `Number must be a multiple of ${schema["multipleOf"]}`
2793
- });
3597
+ if (!servers[serverName]) {
3598
+ throw new Error(`Server '${serverName}' not found in config`);
3599
+ }
3600
+ const connector = this.createConnectorFromConfig(servers[serverName]);
3601
+ const session = new MCPSession(connector);
3602
+ if (autoInitialize) {
3603
+ await session.initialize();
3604
+ }
3605
+ this.sessions[serverName] = session;
3606
+ if (!this.activeSessions.includes(serverName)) {
3607
+ this.activeSessions.push(serverName);
3608
+ }
3609
+ return session;
2794
3610
  }
2795
- /**
2796
- * Applies enum validation to a number schema.
2797
- *
2798
- * @param {z.ZodNumber} numberSchema - The base number schema.
2799
- * @param {JSONSchema} schema - The JSON schema with enum.
2800
- * @returns {z.ZodNumber} - The updated schema with enum validation.
2801
- */
2802
- static applyNumberEnum(numberSchema, schema) {
2803
- if (!schema.enum) {
2804
- return numberSchema;
3611
+ async createAllSessions(autoInitialize = true) {
3612
+ const servers = this.config.mcpServers ?? {};
3613
+ if (Object.keys(servers).length === 0) {
3614
+ logger.warn("No MCP servers defined in config");
2805
3615
  }
2806
- const numberEnums = schema.enum.filter(
2807
- (val) => typeof val === "number"
3616
+ for (const name of Object.keys(servers)) {
3617
+ await this.createSession(name, autoInitialize);
3618
+ }
3619
+ return this.sessions;
3620
+ }
3621
+ getSession(serverName) {
3622
+ const session = this.sessions[serverName];
3623
+ if (!session) {
3624
+ return null;
3625
+ }
3626
+ return session;
3627
+ }
3628
+ getAllActiveSessions() {
3629
+ return Object.fromEntries(
3630
+ this.activeSessions.map((n) => [n, this.sessions[n]])
2808
3631
  );
2809
- if (numberEnums.length === 0) {
2810
- return numberSchema;
3632
+ }
3633
+ async closeSession(serverName) {
3634
+ const session = this.sessions[serverName];
3635
+ if (!session) {
3636
+ logger.warn(
3637
+ `No session exists for server ${serverName}, nothing to close`
3638
+ );
3639
+ return;
3640
+ }
3641
+ try {
3642
+ logger.debug(`Closing session for server ${serverName}`);
3643
+ await session.disconnect();
3644
+ } catch (e) {
3645
+ logger.error(`Error closing session for server '${serverName}': ${e}`);
3646
+ } finally {
3647
+ delete this.sessions[serverName];
3648
+ this.activeSessions = this.activeSessions.filter((n) => n !== serverName);
2811
3649
  }
2812
- return numberSchema.refine((val) => numberEnums.includes(val), {
2813
- message: `Number must be one of: ${numberEnums.join(", ")}`
2814
- });
2815
3650
  }
2816
- /**
2817
- * Applies integer constraint to a number schema if needed.
2818
- *
2819
- * @param {z.ZodNumber} numberSchema - The base number schema.
2820
- * @param {JSONSchema} schema - The JSON schema.
2821
- * @returns {z.ZodNumber} - The updated schema with integer validation if needed.
2822
- */
2823
- static applyIntegerConstraint(numberSchema, schema) {
2824
- if (schema.type !== "integer") {
2825
- return numberSchema;
3651
+ async closeAllSessions() {
3652
+ const serverNames = Object.keys(this.sessions);
3653
+ const errors = [];
3654
+ for (const serverName of serverNames) {
3655
+ try {
3656
+ logger.debug(`Closing session for server ${serverName}`);
3657
+ await this.closeSession(serverName);
3658
+ } catch (e) {
3659
+ const errorMsg = `Failed to close session for server '${serverName}': ${e}`;
3660
+ logger.error(errorMsg);
3661
+ errors.push(errorMsg);
3662
+ }
2826
3663
  }
2827
- return numberSchema.refine((val) => Number.isInteger(val), {
2828
- message: "Number must be an integer"
2829
- });
3664
+ if (errors.length) {
3665
+ logger.error(
3666
+ `Encountered ${errors.length} errors while closing sessions`
3667
+ );
3668
+ } else {
3669
+ logger.debug("All sessions closed successfully");
3670
+ }
3671
+ }
3672
+ };
3673
+
3674
+ // src/client/browser.ts
3675
+ var BrowserMCPClient = class _BrowserMCPClient extends BaseMCPClient {
3676
+ static {
3677
+ __name(this, "BrowserMCPClient");
2830
3678
  }
2831
3679
  /**
2832
- * Parses a string schema.
2833
- *
2834
- * @param {JSONSchema} schema - The JSON schema for a string.
2835
- * @returns {ZodTypeAny} - The ZodTypeAny schema.
3680
+ * Get the mcp-use package version.
3681
+ * Works in all environments (Node.js, browser, Cloudflare Workers, Deno, etc.)
2836
3682
  */
2837
- static parseString(schema) {
2838
- const stringSchema = import_zod.z.string();
2839
- let result = stringSchema;
2840
- if (schema.format) {
2841
- return this.applyStringFormat(stringSchema, schema);
2842
- } else {
2843
- result = this.applyStringPattern(stringSchema, schema);
2844
- result = this.applyStringLength(stringSchema, schema);
2845
- result = this.applyStringEnum(stringSchema, schema);
2846
- }
2847
- return result;
3683
+ static getPackageVersion() {
3684
+ return getPackageVersion();
3685
+ }
3686
+ constructor(config) {
3687
+ super(config);
3688
+ this._trackClientInit();
3689
+ }
3690
+ _trackClientInit() {
3691
+ const servers = Object.keys(this.config.mcpServers ?? {});
3692
+ Tel.getInstance().trackMCPClientInit({
3693
+ codeMode: false,
3694
+ // Browser client doesn't support code mode
3695
+ sandbox: false,
3696
+ // Sandbox not supported in browser
3697
+ allCallbacks: false,
3698
+ // Will be set per-server
3699
+ verify: false,
3700
+ servers,
3701
+ numServers: servers.length,
3702
+ isBrowser: true
3703
+ // Browser MCPClient
3704
+ }).catch(
3705
+ (e) => logger.debug(`Failed to track BrowserMCPClient init: ${e}`)
3706
+ );
3707
+ }
3708
+ static fromDict(cfg) {
3709
+ return new _BrowserMCPClient(cfg);
2848
3710
  }
2849
3711
  /**
2850
- * Applies format validation to a string schema.
2851
- *
2852
- * @param {z.ZodString} stringSchema - The base string schema.
2853
- * @param {JSONSchema} schema - The JSON schema with format.
2854
- * @returns {ZodTypeAny} - The updated schema with format validation.
3712
+ * Create a connector from server configuration (Browser version)
3713
+ * Supports HTTP and WebSocket connectors only
2855
3714
  */
2856
- static applyStringFormat(stringSchema, schema) {
2857
- if (!schema.format) {
2858
- return stringSchema;
3715
+ createConnectorFromConfig(serverConfig) {
3716
+ const {
3717
+ url,
3718
+ transport,
3719
+ headers,
3720
+ authToken,
3721
+ authProvider,
3722
+ wrapTransport,
3723
+ clientOptions,
3724
+ samplingCallback,
3725
+ elicitationCallback
3726
+ } = serverConfig;
3727
+ if (!url) {
3728
+ throw new Error("Server URL is required");
2859
3729
  }
2860
- switch (schema.format) {
2861
- case "email":
2862
- return stringSchema.email();
2863
- case "date-time":
2864
- return stringSchema.datetime();
2865
- case "uri":
2866
- return stringSchema.url();
2867
- case "uuid":
2868
- return stringSchema.uuid();
2869
- case "date":
2870
- return stringSchema.date();
2871
- default:
2872
- return stringSchema;
3730
+ const connectorOptions = {
3731
+ headers,
3732
+ authToken,
3733
+ authProvider,
3734
+ // ← Pass OAuth provider to connector
3735
+ wrapTransport,
3736
+ // ← Pass transport wrapper if provided
3737
+ clientOptions,
3738
+ // ← Pass client options (capabilities, etc.) to connector
3739
+ samplingCallback,
3740
+ // ← Pass sampling callback to connector
3741
+ elicitationCallback
3742
+ // ← Pass elicitation callback to connector
3743
+ };
3744
+ if (clientOptions) {
3745
+ console.log(
3746
+ "[BrowserMCPClient] Passing clientOptions to connector:",
3747
+ JSON.stringify(clientOptions, null, 2)
3748
+ );
3749
+ } else {
3750
+ console.warn(
3751
+ "[BrowserMCPClient] No clientOptions provided to connector!"
3752
+ );
3753
+ }
3754
+ if (transport === "websocket" || url.startsWith("ws://") || url.startsWith("wss://")) {
3755
+ return new WebSocketConnector(url, connectorOptions);
3756
+ } else if (transport === "http" || url.startsWith("http://") || url.startsWith("https://")) {
3757
+ return new HttpConnector(url, connectorOptions);
3758
+ } else {
3759
+ return new HttpConnector(url, connectorOptions);
2873
3760
  }
2874
3761
  }
3762
+ };
3763
+
3764
+ // src/agents/mcp_agent.ts
3765
+ var import_langchain2 = require("langchain");
3766
+ var import_zod9 = require("zod");
3767
+
3768
+ // src/utils/json-schema-to-zod/JSONSchemaToZod.ts
3769
+ var import_zod = require("zod");
3770
+ var JSONSchemaToZod = class {
3771
+ static {
3772
+ __name(this, "JSONSchemaToZod");
3773
+ }
2875
3774
  /**
2876
- * Applies pattern validation to a string schema.
3775
+ * Converts a JSON schema to a Zod schema.
2877
3776
  *
2878
- * @param {z.ZodString} stringSchema - The base string schema.
2879
- * @param {JSONSchema} schema - The JSON schema with pattern.
2880
- * @returns {z.ZodString} - The updated schema with pattern validation.
3777
+ * @param {JSONSchema} schema - The JSON schema.
3778
+ * @returns {ZodSchema} - The Zod schema.
2881
3779
  */
2882
- static applyStringPattern(stringSchema, schema) {
2883
- if (!schema["pattern"]) {
2884
- return stringSchema;
2885
- }
2886
- const regex = new RegExp(schema["pattern"]);
2887
- return stringSchema.regex(regex, {
2888
- message: `String must match pattern: ${schema["pattern"]}`
2889
- });
3780
+ static convert(schema) {
3781
+ return this.parseSchema(schema);
2890
3782
  }
2891
3783
  /**
2892
- * Applies length constraints to a string schema.
3784
+ * Checks if data matches a condition schema.
2893
3785
  *
2894
- * @param {z.ZodString} stringSchema - The base string schema.
2895
- * @param {JSONSchema} schema - The JSON schema with length constraints.
2896
- * @returns {z.ZodString} - The updated schema with length validation.
3786
+ * @param {JSONValue} data - The data to check.
3787
+ * @param {JSONSchema} condition - The condition schema.
3788
+ * @returns {boolean} - Whether the data matches the condition.
2897
3789
  */
2898
- static applyStringLength(stringSchema, schema) {
2899
- const result = stringSchema;
2900
- if (schema["minLength"] !== void 0) {
2901
- stringSchema = stringSchema.min(schema["minLength"]);
3790
+ static matchesCondition(data, condition) {
3791
+ if (!condition.properties) {
3792
+ return true;
2902
3793
  }
2903
- if (schema["maxLength"] !== void 0) {
2904
- stringSchema = stringSchema.max(schema["maxLength"]);
3794
+ if (typeof data !== "object" || data === null || Array.isArray(data)) {
3795
+ return false;
2905
3796
  }
2906
- return result;
2907
- }
2908
- /**
2909
- * Applies enum validation to a string schema.
2910
- *
2911
- * @param {z.ZodString} stringSchema - The base string schema.
2912
- * @param {JSONSchema} schema - The JSON schema with enum.
2913
- * @returns {ZodTypeAny} - The updated schema with enum validation.
2914
- */
2915
- static applyStringEnum(stringSchema, schema) {
2916
- if (!schema.enum) {
2917
- return stringSchema;
3797
+ const objectData = data;
3798
+ for (const [key, propCondition] of Object.entries(condition.properties)) {
3799
+ if (!(key in objectData)) {
3800
+ if ("const" in propCondition) {
3801
+ return false;
3802
+ }
3803
+ continue;
3804
+ }
3805
+ const value = objectData[key];
3806
+ if ("const" in propCondition && value !== propCondition["const"]) {
3807
+ return false;
3808
+ }
3809
+ if ("minimum" in propCondition && typeof value === "number" && value < propCondition["minimum"]) {
3810
+ return false;
3811
+ }
3812
+ if ("maximum" in propCondition && typeof value === "number" && value > propCondition["maximum"]) {
3813
+ return false;
3814
+ }
2918
3815
  }
2919
- return stringSchema.refine((val) => schema.enum?.includes(val), {
2920
- message: `Value must be one of: ${schema.enum?.join(", ")}`
2921
- });
3816
+ return true;
2922
3817
  }
2923
3818
  /**
2924
- * Parses a JSON schema of type array and returns the corresponding Zod schema.
3819
+ * Validates data against a conditional schema and adds issues to context if validation fails.
2925
3820
  *
2926
- * @param {JSONSchema} schema - The JSON schema.
2927
- * @returns {ZodTypeAny} - The ZodTypeAny schema.
3821
+ * @param {JSONValue} data - The data to validate.
3822
+ * @param {JSONSchema} schema - The conditional schema.
3823
+ * @param {z.RefinementCtx} ctx - The Zod refinement context.
2928
3824
  */
2929
- static parseArray(schema) {
2930
- if (Array.isArray(schema.items)) {
2931
- const tupleSchemas = schema.items.map((item) => this.parseSchema(item));
2932
- return import_zod.z.union(tupleSchemas);
2933
- }
2934
- const itemSchema = schema.items ? this.parseSchema(schema.items) : import_zod.z.any();
2935
- const arraySchema = import_zod.z.array(itemSchema);
2936
- let result = arraySchema;
2937
- result = this.applyArrayConstraints(arraySchema, schema);
2938
- return result;
3825
+ static validateConditionalSchema(data, schema, ctx) {
3826
+ this.validateRequiredProperties(data, schema, ctx);
3827
+ this.validatePropertyPatterns(data, schema, ctx);
3828
+ this.validateNestedConditions(data, schema, ctx);
2939
3829
  }
2940
3830
  /**
2941
- * Applies constraints to an array schema.
3831
+ * Validates that all required properties are present in the data.
2942
3832
  *
2943
- * @param {z.ZodArray<any>} arraySchema - The base array schema.
2944
- * @param {JSONSchema} schema - The JSON schema with array constraints.
2945
- * @returns {z.ZodTypeAny} - The updated array schema with constraints.
3833
+ * @param {JSONValue} data - The data to validate.
3834
+ * @param {JSONSchema} schema - The schema containing required properties.
3835
+ * @param {z.RefinementCtx} ctx - The Zod refinement context.
2946
3836
  */
2947
- static applyArrayConstraints(arraySchema, schema) {
2948
- if (schema["minItems"] !== void 0) {
2949
- arraySchema = arraySchema.min(schema["minItems"]);
2950
- }
2951
- if (schema["maxItems"] !== void 0) {
2952
- arraySchema = arraySchema.max(schema["maxItems"]);
3837
+ static validateRequiredProperties(data, schema, ctx) {
3838
+ if (!schema.required) {
3839
+ return;
2953
3840
  }
2954
- if (schema["uniqueItems"]) {
2955
- return arraySchema.refine(
2956
- (items) => new Set(items).size === items.length,
2957
- { message: "Array items must be unique" }
2958
- );
3841
+ if (typeof data !== "object" || data === null) {
3842
+ for (const requiredProp of schema.required) {
3843
+ ctx.addIssue({
3844
+ code: import_zod.z.ZodIssueCode.custom,
3845
+ message: `Required property '${requiredProp}' is missing`,
3846
+ path: [requiredProp]
3847
+ });
3848
+ }
3849
+ return;
2959
3850
  }
2960
- return arraySchema;
2961
- }
2962
- /**
2963
- * Parses an object schema.
2964
- *
2965
- * @param {JSONSchema} schema - The JSON schema for an object.
2966
- * @returns {ZodTypeAny} - The ZodTypeAny schema.
2967
- */
2968
- static parseObject(schema) {
2969
- if (schema["if"] && schema["then"]) {
2970
- return this.parseConditional(schema);
3851
+ for (const requiredProp of schema.required) {
3852
+ if (!(requiredProp in data)) {
3853
+ ctx.addIssue({
3854
+ code: import_zod.z.ZodIssueCode.custom,
3855
+ message: `Required property '${requiredProp}' is missing`,
3856
+ path: [requiredProp]
3857
+ });
3858
+ }
2971
3859
  }
2972
- const shape = {};
2973
- this.processObjectProperties(schema, shape);
2974
- return this.processAdditionalProperties(schema, import_zod.z.object(shape));
2975
3860
  }
2976
3861
  /**
2977
- * Processes object properties and builds the shape object.
3862
+ * Validates property patterns for string properties.
2978
3863
  *
2979
- * @param {JSONSchema} schema - The JSON schema for an object.
2980
- * @param {Record<string, ZodTypeAny>} shape - The shape object to populate.
3864
+ * @param {JSONValue} data - The data to validate.
3865
+ * @param {JSONSchema} schema - The schema containing property patterns.
3866
+ * @param {z.RefinementCtx} ctx - The Zod refinement context.
2981
3867
  */
2982
- static processObjectProperties(schema, shape) {
2983
- const required = new Set(schema.required || []);
3868
+ static validatePropertyPatterns(data, schema, ctx) {
2984
3869
  if (!schema.properties) {
2985
3870
  return;
2986
3871
  }
2987
- for (const [key, propSchema] of Object.entries(schema.properties)) {
2988
- const zodSchema = this.parseSchema(propSchema);
2989
- shape[key] = required.has(key) ? zodSchema : zodSchema.optional();
3872
+ if (typeof data !== "object" || data === null) {
3873
+ return;
2990
3874
  }
2991
- }
2992
- /**
2993
- * Processes additionalProperties configuration.
2994
- *
2995
- * @param {JSONSchema} schema - The JSON schema for an object.
2996
- * @param {z.ZodObject<any, any>} objectSchema - The Zod object schema.
2997
- * @returns {z.ZodObject<any, any>} - The updated Zod object schema.
2998
- */
2999
- static processAdditionalProperties(schema, objectSchema) {
3000
- if (schema.additionalProperties === true) {
3001
- return objectSchema.passthrough();
3002
- } else if (schema.additionalProperties && typeof schema.additionalProperties === "object") {
3003
- const additionalPropSchema = this.parseSchema(
3004
- schema.additionalProperties
3005
- );
3006
- return objectSchema.catchall(additionalPropSchema);
3007
- } else {
3008
- return objectSchema.strict();
3875
+ if (Array.isArray(data)) {
3876
+ return;
3009
3877
  }
3010
- }
3011
- /**
3012
- * Parses a conditional schema with if-then-else.
3013
- *
3014
- * @param {JSONSchema} schema - The JSON schema with conditional validation.
3015
- * @returns {ZodTypeAny} - The conditional Zod schema.
3016
- */
3017
- static parseConditional(schema) {
3018
- const zodObject = this.createBaseObjectSchema(schema);
3019
- const ifCondition = schema["if"];
3020
- const thenSchema = schema["then"];
3021
- const elseSchema = schema["else"];
3022
- return zodObject.superRefine((data, ctx) => {
3023
- const dataWithDefaults = this.applyDefaultValues(
3024
- data,
3025
- schema
3026
- );
3027
- if (this.matchesCondition(dataWithDefaults, ifCondition)) {
3028
- this.validateConditionalSchema(dataWithDefaults, thenSchema, ctx);
3029
- } else if (elseSchema) {
3030
- this.validateConditionalSchema(dataWithDefaults, elseSchema, ctx);
3878
+ const objectData = data;
3879
+ for (const [key, propSchema] of Object.entries(schema.properties)) {
3880
+ if (!(key in objectData)) {
3881
+ continue;
3031
3882
  }
3032
- });
3883
+ const value = objectData[key];
3884
+ if (propSchema["pattern"] && typeof value === "string") {
3885
+ const regex = new RegExp(propSchema["pattern"]);
3886
+ if (!regex.test(value)) {
3887
+ ctx.addIssue({
3888
+ code: import_zod.z.ZodIssueCode.custom,
3889
+ message: `String '${value}' does not match pattern '${propSchema["pattern"]}'`,
3890
+ path: [key]
3891
+ });
3892
+ }
3893
+ }
3894
+ }
3033
3895
  }
3034
3896
  /**
3035
- * Creates a base object schema from the given JSON schema.
3897
+ * Validates nested if-then-else conditions.
3036
3898
  *
3037
- * @param {JSONSchema} schema - The JSON schema.
3038
- * @returns {z.ZodObject<any, any>} - The base Zod object schema.
3899
+ * @param {JSONValue} data - The data to validate.
3900
+ * @param {JSONSchema} schema - The schema containing if-then-else conditions.
3901
+ * @param {z.RefinementCtx} ctx - The Zod refinement context.
3039
3902
  */
3040
- static createBaseObjectSchema(schema) {
3041
- const shape = {};
3042
- const required = new Set(schema.required || []);
3043
- for (const [key, value] of Object.entries(schema.properties || {})) {
3044
- const zodSchema = this.parseSchema(value);
3045
- shape[key] = required.has(key) ? zodSchema : zodSchema.optional();
3903
+ static validateNestedConditions(data, schema, ctx) {
3904
+ if (!schema["if"] || !schema["then"]) {
3905
+ return;
3906
+ }
3907
+ const matchesIf = this.matchesCondition(data, schema["if"]);
3908
+ if (matchesIf) {
3909
+ this.validateConditionalSchema(data, schema["then"], ctx);
3910
+ } else if (schema["else"]) {
3911
+ this.validateConditionalSchema(data, schema["else"], ctx);
3046
3912
  }
3047
- const zodObject = import_zod.z.object(shape);
3048
- return this.processAdditionalProperties(schema, zodObject);
3049
3913
  }
3050
3914
  /**
3051
- * Applies default values from schema properties to data object.
3915
+ * Parses a JSON schema and returns the corresponding Zod schema.
3916
+ * This is the main entry point for schema conversion.
3052
3917
  *
3053
- * @param {JSONValue} data - The original data object.
3054
- * @param {JSONSchema} schema - The schema with default values.
3055
- * @returns {JSONValue} - The data object with defaults applied.
3918
+ * @param {JSONSchema} schema - The JSON schema.
3919
+ * @returns {ZodTypeAny} - The ZodTypeAny schema.
3056
3920
  */
3057
- static applyDefaultValues(data, schema) {
3058
- if (typeof data !== "object" || data === null) {
3059
- return data;
3921
+ static parseSchema(schema) {
3922
+ if (Array.isArray(schema.type)) {
3923
+ return this.handleTypeArray(schema);
3060
3924
  }
3061
- if (Array.isArray(data)) {
3062
- return data;
3925
+ if (schema.oneOf || schema.anyOf || schema.allOf) {
3926
+ return this.parseCombinator(schema);
3063
3927
  }
3064
- const objectData = data;
3065
- const dataWithDefaults = { ...objectData };
3066
- if (!schema.properties) {
3067
- return dataWithDefaults;
3928
+ if (schema["if"] && schema["then"]) {
3929
+ return this.parseObject(schema);
3068
3930
  }
3069
- for (const [key, propSchema] of Object.entries(schema.properties)) {
3070
- if (!(key in dataWithDefaults) && "default" in propSchema) {
3071
- dataWithDefaults[key] = propSchema["default"];
3072
- }
3931
+ if (schema.properties && (!schema.type || schema.type === "object")) {
3932
+ return this.parseObject(schema);
3073
3933
  }
3074
- return dataWithDefaults;
3934
+ return this.handleSingleType(schema);
3075
3935
  }
3076
3936
  /**
3077
- * Parses a schema with combinators (oneOf, anyOf, allOf).
3078
- * Delegates to the appropriate combinator parser based on which combinator is present.
3937
+ * Handles schemas with an array of types.
3079
3938
  *
3080
- * @param {JSONSchema} schema - The JSON schema with combinators.
3939
+ * @param {JSONSchema} schema - The JSON schema with type array.
3081
3940
  * @returns {ZodTypeAny} - The ZodTypeAny schema.
3082
3941
  */
3083
- static parseCombinator(schema) {
3084
- if (schema.oneOf) {
3085
- return this.parseOneOf(schema.oneOf);
3086
- }
3087
- if (schema.anyOf) {
3088
- return this.parseAnyOf(schema.anyOf);
3942
+ static handleTypeArray(schema) {
3943
+ if (!Array.isArray(schema.type)) {
3944
+ throw new Error("Expected schema.type to be an array");
3089
3945
  }
3090
- if (schema.allOf) {
3091
- return this.parseAllOf(schema.allOf);
3946
+ if (schema.type.includes("null")) {
3947
+ return this.handleNullableType(schema);
3092
3948
  }
3093
- throw new Error("Unsupported schema type");
3949
+ return this.createUnionFromTypes(schema.type, schema);
3094
3950
  }
3095
3951
  /**
3096
- * Parses a oneOf combinator schema.
3952
+ * Handles nullable types by creating a nullable schema.
3097
3953
  *
3098
- * @param {JSONSchema[]} schemas - Array of JSON schemas in the oneOf.
3099
- * @returns {ZodTypeAny} - The ZodTypeAny schema.
3954
+ * @param {JSONSchema} schema - The JSON schema with nullable type.
3955
+ * @returns {ZodTypeAny} - The nullable Zod schema.
3100
3956
  */
3101
- static parseOneOf(schemas) {
3102
- return this.createUnionFromSchemas(schemas);
3957
+ static handleNullableType(schema) {
3958
+ if (!Array.isArray(schema.type)) {
3959
+ throw new Error("Expected schema.type to be an array");
3960
+ }
3961
+ const nonNullSchema = { ...schema };
3962
+ nonNullSchema.type = schema.type.filter((t) => t !== "null");
3963
+ if (nonNullSchema.type.length === 1) {
3964
+ const singleTypeSchema = this.handleSingleType({
3965
+ ...schema,
3966
+ type: nonNullSchema.type[0]
3967
+ });
3968
+ return singleTypeSchema.nullable();
3969
+ }
3970
+ const unionSchema = this.parseSchema(nonNullSchema);
3971
+ return unionSchema.nullable();
3103
3972
  }
3104
3973
  /**
3105
- * Parses an anyOf combinator schema.
3974
+ * Creates a union type from an array of types.
3106
3975
  *
3107
- * @param {JSONSchema[]} schemas - Array of JSON schemas in the anyOf.
3108
- * @returns {ZodTypeAny} - The ZodTypeAny schema.
3976
+ * @param {string[]} types - Array of type strings.
3977
+ * @param {JSONSchema} baseSchema - The base schema to apply to each type.
3978
+ * @returns {ZodTypeAny} - The union Zod schema.
3109
3979
  */
3110
- static parseAnyOf(schemas) {
3111
- return this.createUnionFromSchemas(schemas);
3980
+ static createUnionFromTypes(types, baseSchema) {
3981
+ const schemas = types.map((type) => {
3982
+ const singleTypeSchema = { ...baseSchema, type };
3983
+ return this.parseSchema(singleTypeSchema);
3984
+ });
3985
+ return import_zod.z.union(schemas);
3112
3986
  }
3113
3987
  /**
3114
- * Creates a union from an array of schemas, handling special cases.
3988
+ * Handles schemas with a single type.
3115
3989
  *
3116
- * @param {JSONSchema[]} schemas - Array of JSON schemas to create a union from.
3117
- * @returns {ZodTypeAny} - The union Zod schema.
3990
+ * @param {JSONSchema} schema - The JSON schema with single type.
3991
+ * @returns {ZodTypeAny} - The ZodTypeAny schema.
3118
3992
  */
3119
- static createUnionFromSchemas(schemas) {
3120
- if (schemas.length === 0) {
3121
- return import_zod.z.any();
3122
- }
3123
- if (schemas.length === 1) {
3124
- return this.parseSchema(schemas[0]);
3125
- }
3126
- const zodSchemas = [];
3127
- for (const subSchema of schemas) {
3128
- if (subSchema.type === "null") {
3129
- zodSchemas.push(import_zod.z.null());
3130
- } else {
3131
- zodSchemas.push(this.parseSchema(subSchema));
3993
+ static handleSingleType(schema) {
3994
+ if (schema.type === void 0) {
3995
+ if (schema.oneOf || schema.anyOf || schema.allOf) {
3996
+ return this.parseCombinator(schema);
3997
+ }
3998
+ if (schema.properties) {
3999
+ return this.parseObject(schema);
3132
4000
  }
4001
+ return import_zod.z.any();
3133
4002
  }
3134
- if (zodSchemas.length >= 2) {
3135
- return import_zod.z.union(zodSchemas);
3136
- } else if (zodSchemas.length === 1) {
3137
- return zodSchemas[0];
4003
+ switch (schema.type) {
4004
+ case "string":
4005
+ return this.parseString(schema);
4006
+ case "number":
4007
+ case "integer":
4008
+ return this.parseNumberSchema(schema);
4009
+ case "boolean":
4010
+ return import_zod.z.boolean();
4011
+ case "array":
4012
+ return this.parseArray(schema);
4013
+ case "object":
4014
+ return this.parseObject(schema);
4015
+ default:
4016
+ throw new Error("Unsupported schema type");
3138
4017
  }
3139
- return import_zod.z.any();
3140
4018
  }
3141
4019
  /**
3142
- * Parses an allOf combinator schema by merging all schemas.
4020
+ * Parses a number schema.
3143
4021
  *
3144
- * @param {JSONSchema[]} schemas - Array of JSON schemas in the allOf.
4022
+ * @param {JSONSchema} schema - The JSON schema for a number.
3145
4023
  * @returns {ZodTypeAny} - The ZodTypeAny schema.
3146
4024
  */
3147
- static parseAllOf(schemas) {
3148
- if (schemas.length === 0) {
3149
- return import_zod.z.any();
3150
- }
3151
- if (schemas.length === 1) {
3152
- return this.parseSchema(schemas[0]);
3153
- }
3154
- const mergedSchema = schemas.reduce(
3155
- (acc, currentSchema) => this.mergeSchemas(acc, currentSchema)
3156
- );
3157
- return this.parseSchema(mergedSchema);
4025
+ static parseNumberSchema(schema) {
4026
+ const numberSchema = import_zod.z.number();
4027
+ let result = numberSchema;
4028
+ result = this.applyNumberBounds(numberSchema, schema);
4029
+ result = this.applyNumberMultipleOf(numberSchema, schema);
4030
+ result = this.applyNumberEnum(numberSchema, schema);
4031
+ result = this.applyIntegerConstraint(numberSchema, schema);
4032
+ return result;
3158
4033
  }
3159
4034
  /**
3160
- * Merges two JSON schemas together.
4035
+ * Applies bounds validation to a number schema.
3161
4036
  *
3162
- * @param {JSONSchema} baseSchema - The base JSON schema.
3163
- * @param {JSONSchema} addSchema - The JSON schema to add.
3164
- * @returns {JSONSchema} - The merged JSON schema
4037
+ * @param {z.ZodNumber} numberSchema - The base number schema.
4038
+ * @param {JSONSchema} schema - The JSON schema with bounds.
4039
+ * @returns {z.ZodNumber} - The updated schema with bounds validation.
3165
4040
  */
3166
- static mergeSchemas(baseSchema, addSchema) {
3167
- const merged = { ...baseSchema, ...addSchema };
3168
- if (baseSchema.properties && addSchema.properties) {
3169
- const mergedProperties = {
3170
- ...baseSchema.properties,
3171
- ...addSchema.properties
3172
- };
3173
- merged.properties = mergedProperties;
4041
+ static applyNumberBounds(numberSchema, schema) {
4042
+ let result = numberSchema;
4043
+ if (schema["minimum"] !== void 0) {
4044
+ result = schema["exclusiveMinimum"] ? result.gt(schema["minimum"]) : result.gte(schema["minimum"]);
3174
4045
  }
3175
- if (baseSchema.required && addSchema.required) {
3176
- const mergedRequired = [
3177
- .../* @__PURE__ */ new Set([...baseSchema.required, ...addSchema.required])
3178
- ];
3179
- merged.required = mergedRequired;
4046
+ if (schema["maximum"] !== void 0) {
4047
+ result = schema["exclusiveMaximum"] ? result.lt(schema["maximum"]) : result.lte(schema["maximum"]);
3180
4048
  }
3181
- return merged;
4049
+ return result;
3182
4050
  }
3183
- };
3184
-
3185
- // src/adapters/langchain_adapter.ts
3186
- var import_tools = require("@langchain/core/tools");
3187
- var import_zod2 = require("zod");
3188
- init_logging();
3189
-
3190
- // src/adapters/base.ts
3191
- init_logging();
3192
- var BaseAdapter = class {
3193
- static {
3194
- __name(this, "BaseAdapter");
4051
+ /**
4052
+ * Applies multipleOf validation to a number schema.
4053
+ *
4054
+ * @param {z.ZodNumber} numberSchema - The base number schema.
4055
+ * @param {JSONSchema} schema - The JSON schema with multipleOf.
4056
+ * @returns {z.ZodNumber} - The updated schema with multipleOf validation.
4057
+ */
4058
+ static applyNumberMultipleOf(numberSchema, schema) {
4059
+ if (schema["multipleOf"] === void 0) {
4060
+ return numberSchema;
4061
+ }
4062
+ return numberSchema.refine((val) => val % schema["multipleOf"] === 0, {
4063
+ message: `Number must be a multiple of ${schema["multipleOf"]}`
4064
+ });
3195
4065
  }
3196
4066
  /**
3197
- * List of tool names that should not be available.
4067
+ * Applies enum validation to a number schema.
4068
+ *
4069
+ * @param {z.ZodNumber} numberSchema - The base number schema.
4070
+ * @param {JSONSchema} schema - The JSON schema with enum.
4071
+ * @returns {z.ZodNumber} - The updated schema with enum validation.
3198
4072
  */
3199
- disallowedTools;
4073
+ static applyNumberEnum(numberSchema, schema) {
4074
+ if (!schema.enum) {
4075
+ return numberSchema;
4076
+ }
4077
+ const numberEnums = schema.enum.filter(
4078
+ (val) => typeof val === "number"
4079
+ );
4080
+ if (numberEnums.length === 0) {
4081
+ return numberSchema;
4082
+ }
4083
+ return numberSchema.refine((val) => numberEnums.includes(val), {
4084
+ message: `Number must be one of: ${numberEnums.join(", ")}`
4085
+ });
4086
+ }
3200
4087
  /**
3201
- * Internal cache that maps a connector instance to the list of tools
3202
- * generated for it.
4088
+ * Applies integer constraint to a number schema if needed.
4089
+ *
4090
+ * @param {z.ZodNumber} numberSchema - The base number schema.
4091
+ * @param {JSONSchema} schema - The JSON schema.
4092
+ * @returns {z.ZodNumber} - The updated schema with integer validation if needed.
3203
4093
  */
3204
- connectorToolMap = /* @__PURE__ */ new Map();
3205
- constructor(disallowedTools) {
3206
- this.disallowedTools = disallowedTools ?? [];
4094
+ static applyIntegerConstraint(numberSchema, schema) {
4095
+ if (schema.type !== "integer") {
4096
+ return numberSchema;
4097
+ }
4098
+ return numberSchema.refine((val) => Number.isInteger(val), {
4099
+ message: "Number must be an integer"
4100
+ });
3207
4101
  }
3208
4102
  /**
3209
- * Create tools from an MCPClient instance.
3210
- *
3211
- * This is the recommended way to create tools from an MCPClient, as it handles
3212
- * session creation and connector extraction automatically.
4103
+ * Parses a string schema.
3213
4104
  *
3214
- * @param client The MCPClient to extract tools from.
3215
- * @param disallowedTools Optional list of tool names to exclude.
3216
- * @returns A promise that resolves with a list of converted tools.
4105
+ * @param {JSONSchema} schema - The JSON schema for a string.
4106
+ * @returns {ZodTypeAny} - The ZodTypeAny schema.
3217
4107
  */
3218
- static async createTools(client, disallowedTools) {
3219
- const adapter = new this(disallowedTools);
3220
- if (!client.activeSessions || Object.keys(client.activeSessions).length === 0) {
3221
- logger.info("No active sessions found, creating new ones...");
3222
- await client.createAllSessions();
4108
+ static parseString(schema) {
4109
+ const stringSchema = import_zod.z.string();
4110
+ let result = stringSchema;
4111
+ if (schema.format) {
4112
+ return this.applyStringFormat(stringSchema, schema);
4113
+ } else {
4114
+ result = this.applyStringPattern(stringSchema, schema);
4115
+ result = this.applyStringLength(stringSchema, schema);
4116
+ result = this.applyStringEnum(stringSchema, schema);
3223
4117
  }
3224
- const sessions = client.getAllActiveSessions();
3225
- const connectors = Object.values(sessions).map(
3226
- (session) => session.connector
3227
- );
3228
- return adapter.createToolsFromConnectors(connectors);
4118
+ return result;
3229
4119
  }
3230
4120
  /**
3231
- * Dynamically load tools for a specific connector.
4121
+ * Applies format validation to a string schema.
3232
4122
  *
3233
- * @param connector The connector to load tools for.
3234
- * @returns The list of tools that were loaded in the target framework's format.
4123
+ * @param {z.ZodString} stringSchema - The base string schema.
4124
+ * @param {JSONSchema} schema - The JSON schema with format.
4125
+ * @returns {ZodTypeAny} - The updated schema with format validation.
3235
4126
  */
3236
- async loadToolsForConnector(connector) {
3237
- if (this.connectorToolMap.has(connector)) {
3238
- const cached = this.connectorToolMap.get(connector);
3239
- logger.debug(`Returning ${cached.length} existing tools for connector`);
3240
- return cached;
3241
- }
3242
- const connectorTools = [];
3243
- const success = await this.ensureConnectorInitialized(connector);
3244
- if (!success) {
3245
- return [];
4127
+ static applyStringFormat(stringSchema, schema) {
4128
+ if (!schema.format) {
4129
+ return stringSchema;
3246
4130
  }
3247
- for (const tool of connector.tools) {
3248
- const converted = this.convertTool(tool, connector);
3249
- if (converted) {
3250
- connectorTools.push(converted);
3251
- }
4131
+ switch (schema.format) {
4132
+ case "email":
4133
+ return stringSchema.email();
4134
+ case "date-time":
4135
+ return stringSchema.datetime();
4136
+ case "uri":
4137
+ return stringSchema.url();
4138
+ case "uuid":
4139
+ return stringSchema.uuid();
4140
+ case "date":
4141
+ return stringSchema.date();
4142
+ default:
4143
+ return stringSchema;
3252
4144
  }
3253
- this.connectorToolMap.set(connector, connectorTools);
3254
- logger.debug(
3255
- `Loaded ${connectorTools.length} new tools for connector: ${connectorTools.map((t) => t?.name ?? String(t)).join(", ")}`
3256
- );
3257
- return connectorTools;
3258
4145
  }
3259
4146
  /**
3260
- * Create tools from MCP tools in all provided connectors.
4147
+ * Applies pattern validation to a string schema.
3261
4148
  *
3262
- * @param connectors List of MCP connectors to create tools from.
3263
- * @returns A promise that resolves with all converted tools.
4149
+ * @param {z.ZodString} stringSchema - The base string schema.
4150
+ * @param {JSONSchema} schema - The JSON schema with pattern.
4151
+ * @returns {z.ZodString} - The updated schema with pattern validation.
3264
4152
  */
3265
- async createToolsFromConnectors(connectors) {
3266
- const tools = [];
3267
- for (const connector of connectors) {
3268
- const connectorTools = await this.loadToolsForConnector(connector);
3269
- tools.push(...connectorTools);
4153
+ static applyStringPattern(stringSchema, schema) {
4154
+ if (!schema["pattern"]) {
4155
+ return stringSchema;
3270
4156
  }
3271
- logger.debug(`Available tools: ${tools.length}`);
3272
- return tools;
4157
+ const regex = new RegExp(schema["pattern"]);
4158
+ return stringSchema.regex(regex, {
4159
+ message: `String must match pattern: ${schema["pattern"]}`
4160
+ });
3273
4161
  }
3274
4162
  /**
3275
- * Check if a connector is initialized and has tools.
4163
+ * Applies length constraints to a string schema.
3276
4164
  *
3277
- * @param connector The connector to check.
3278
- * @returns True if the connector is initialized and has tools, false otherwise.
4165
+ * @param {z.ZodString} stringSchema - The base string schema.
4166
+ * @param {JSONSchema} schema - The JSON schema with length constraints.
4167
+ * @returns {z.ZodString} - The updated schema with length validation.
3279
4168
  */
3280
- checkConnectorInitialized(connector) {
3281
- return Boolean(connector.tools && connector.tools.length);
4169
+ static applyStringLength(stringSchema, schema) {
4170
+ const result = stringSchema;
4171
+ if (schema["minLength"] !== void 0) {
4172
+ stringSchema = stringSchema.min(schema["minLength"]);
4173
+ }
4174
+ if (schema["maxLength"] !== void 0) {
4175
+ stringSchema = stringSchema.max(schema["maxLength"]);
4176
+ }
4177
+ return result;
3282
4178
  }
3283
4179
  /**
3284
- * Ensure a connector is initialized.
4180
+ * Applies enum validation to a string schema.
3285
4181
  *
3286
- * @param connector The connector to initialize.
3287
- * @returns True if initialization succeeded, false otherwise.
4182
+ * @param {z.ZodString} stringSchema - The base string schema.
4183
+ * @param {JSONSchema} schema - The JSON schema with enum.
4184
+ * @returns {ZodTypeAny} - The updated schema with enum validation.
3288
4185
  */
3289
- async ensureConnectorInitialized(connector) {
3290
- if (!this.checkConnectorInitialized(connector)) {
3291
- logger.debug("Connector doesn't have tools, initializing it");
3292
- try {
3293
- await connector.initialize();
3294
- return true;
3295
- } catch (err) {
3296
- logger.error(`Error initializing connector: ${err}`);
3297
- return false;
3298
- }
4186
+ static applyStringEnum(stringSchema, schema) {
4187
+ if (!schema.enum) {
4188
+ return stringSchema;
3299
4189
  }
3300
- return true;
3301
- }
3302
- };
3303
-
3304
- // src/adapters/langchain_adapter.ts
3305
- function schemaToZod(schema) {
3306
- try {
3307
- return JSONSchemaToZod.convert(schema);
3308
- } catch (err) {
3309
- logger.warn(`Failed to convert JSON schema to Zod: ${err}`);
3310
- return import_zod2.z.any();
3311
- }
3312
- }
3313
- __name(schemaToZod, "schemaToZod");
3314
- var LangChainAdapter = class extends BaseAdapter {
3315
- static {
3316
- __name(this, "LangChainAdapter");
3317
- }
3318
- constructor(disallowedTools = []) {
3319
- super(disallowedTools);
4190
+ return stringSchema.refine((val) => schema.enum?.includes(val), {
4191
+ message: `Value must be one of: ${schema.enum?.join(", ")}`
4192
+ });
3320
4193
  }
3321
4194
  /**
3322
- * Convert a single MCP tool specification into a LangChainJS structured tool.
4195
+ * Parses a JSON schema of type array and returns the corresponding Zod schema.
4196
+ *
4197
+ * @param {JSONSchema} schema - The JSON schema.
4198
+ * @returns {ZodTypeAny} - The ZodTypeAny schema.
3323
4199
  */
3324
- convertTool(mcpTool, connector) {
3325
- if (this.disallowedTools.includes(mcpTool.name)) {
3326
- return null;
4200
+ static parseArray(schema) {
4201
+ if (Array.isArray(schema.items)) {
4202
+ const tupleSchemas = schema.items.map((item) => this.parseSchema(item));
4203
+ return import_zod.z.union(tupleSchemas);
3327
4204
  }
3328
- const argsSchema = mcpTool.inputSchema ? schemaToZod(mcpTool.inputSchema) : import_zod2.z.object({}).optional();
3329
- const tool = new import_tools.DynamicStructuredTool({
3330
- name: mcpTool.name ?? "NO NAME",
3331
- description: mcpTool.description ?? "",
3332
- // Blank is acceptable but discouraged.
3333
- schema: argsSchema,
3334
- func: /* @__PURE__ */ __name(async (input) => {
3335
- logger.debug(
3336
- `MCP tool "${mcpTool.name}" received input: ${JSON.stringify(input)}`
3337
- );
3338
- try {
3339
- const result = await connector.callTool(
3340
- mcpTool.name,
3341
- input
3342
- );
3343
- return JSON.stringify(result);
3344
- } catch (err) {
3345
- logger.error(`Error executing MCP tool: ${err.message}`);
3346
- return `Error executing MCP tool: ${String(err)}`;
3347
- }
3348
- }, "func")
3349
- });
3350
- return tool;
3351
- }
3352
- };
3353
-
3354
- // src/agents/mcp_agent.ts
3355
- init_logging();
3356
-
3357
- // src/managers/server_manager.ts
3358
- init_logging();
3359
-
3360
- // src/managers/tools/acquire_active_mcp_server.ts
3361
- var import_zod3 = require("zod");
3362
-
3363
- // src/managers/tools/base.ts
3364
- var import_tools2 = require("@langchain/core/tools");
3365
- var MCPServerTool = class extends import_tools2.StructuredTool {
3366
- static {
3367
- __name(this, "MCPServerTool");
3368
- }
3369
- name = "mcp_server_tool";
3370
- description = "Base tool for MCP server operations.";
3371
- schema;
3372
- _manager;
3373
- constructor(manager) {
3374
- super();
3375
- this._manager = manager;
3376
- }
3377
- async _call(_arg, _runManager, _parentConfig) {
3378
- throw new Error("Method not implemented.");
3379
- }
3380
- get manager() {
3381
- return this._manager;
3382
- }
3383
- };
3384
-
3385
- // src/managers/tools/acquire_active_mcp_server.ts
3386
- var PresentActiveServerSchema = import_zod3.z.object({});
3387
- var AcquireActiveMCPServerTool = class extends MCPServerTool {
3388
- static {
3389
- __name(this, "AcquireActiveMCPServerTool");
3390
- }
3391
- name = "get_active_mcp_server";
3392
- description = "Get the currently active MCP (Model Context Protocol) server";
3393
- schema = PresentActiveServerSchema;
3394
- constructor(manager) {
3395
- super(manager);
4205
+ const itemSchema = schema.items ? this.parseSchema(schema.items) : import_zod.z.any();
4206
+ const arraySchema = import_zod.z.array(itemSchema);
4207
+ let result = arraySchema;
4208
+ result = this.applyArrayConstraints(arraySchema, schema);
4209
+ return result;
3396
4210
  }
3397
- async _call() {
3398
- if (!this.manager.activeServer) {
3399
- return `No MCP server is currently active. Use connect_to_mcp_server to connect to a server.`;
4211
+ /**
4212
+ * Applies constraints to an array schema.
4213
+ *
4214
+ * @param {z.ZodArray<any>} arraySchema - The base array schema.
4215
+ * @param {JSONSchema} schema - The JSON schema with array constraints.
4216
+ * @returns {z.ZodTypeAny} - The updated array schema with constraints.
4217
+ */
4218
+ static applyArrayConstraints(arraySchema, schema) {
4219
+ if (schema["minItems"] !== void 0) {
4220
+ arraySchema = arraySchema.min(schema["minItems"]);
4221
+ }
4222
+ if (schema["maxItems"] !== void 0) {
4223
+ arraySchema = arraySchema.max(schema["maxItems"]);
3400
4224
  }
3401
- return `Currently active MCP server: ${this.manager.activeServer}`;
4225
+ if (schema["uniqueItems"]) {
4226
+ return arraySchema.refine(
4227
+ (items) => new Set(items).size === items.length,
4228
+ { message: "Array items must be unique" }
4229
+ );
4230
+ }
4231
+ return arraySchema;
3402
4232
  }
3403
- };
3404
-
3405
- // src/managers/tools/add_server_from_config.ts
3406
- var import_tools3 = require("@langchain/core/tools");
3407
- var import_zod4 = require("zod");
3408
- init_logging();
3409
- var AddMCPServerFromConfigTool = class extends import_tools3.StructuredTool {
3410
- static {
3411
- __name(this, "AddMCPServerFromConfigTool");
4233
+ /**
4234
+ * Parses an object schema.
4235
+ *
4236
+ * @param {JSONSchema} schema - The JSON schema for an object.
4237
+ * @returns {ZodTypeAny} - The ZodTypeAny schema.
4238
+ */
4239
+ static parseObject(schema) {
4240
+ if (schema["if"] && schema["then"]) {
4241
+ return this.parseConditional(schema);
4242
+ }
4243
+ const shape = {};
4244
+ this.processObjectProperties(schema, shape);
4245
+ return this.processAdditionalProperties(schema, import_zod.z.object(shape));
3412
4246
  }
3413
- name = "add_mcp_server_from_config";
3414
- description = "Adds a new MCP server to the client from a configuration object and connects to it, making its tools available.";
3415
- schema = import_zod4.z.object({
3416
- serverName: import_zod4.z.string().describe("The name for the new MCP server."),
3417
- serverConfig: import_zod4.z.any().describe(
3418
- 'The configuration object for the server. This should not include the top-level "mcpServers" key.'
3419
- )
3420
- });
3421
- manager;
3422
- constructor(manager) {
3423
- super();
3424
- this.manager = manager;
4247
+ /**
4248
+ * Processes object properties and builds the shape object.
4249
+ *
4250
+ * @param {JSONSchema} schema - The JSON schema for an object.
4251
+ * @param {Record<string, ZodTypeAny>} shape - The shape object to populate.
4252
+ */
4253
+ static processObjectProperties(schema, shape) {
4254
+ const required = new Set(schema.required || []);
4255
+ if (!schema.properties) {
4256
+ return;
4257
+ }
4258
+ for (const [key, propSchema] of Object.entries(schema.properties)) {
4259
+ const zodSchema = this.parseSchema(propSchema);
4260
+ shape[key] = required.has(key) ? zodSchema : zodSchema.optional();
4261
+ }
3425
4262
  }
3426
- async _call({
3427
- serverName,
3428
- serverConfig
3429
- }) {
3430
- try {
3431
- this.manager.client.addServer(serverName, serverConfig);
3432
- let result = `Server '${serverName}' added to the client.`;
3433
- logger.debug(
3434
- `Connecting to new server '${serverName}' and discovering tools.`
3435
- );
3436
- const session = await this.manager.client.createSession(serverName);
3437
- const connector = session.connector;
3438
- const tools = await this.manager.adapter.createToolsFromConnectors([connector]);
3439
- this.manager.serverTools[serverName] = tools;
3440
- this.manager.initializedServers[serverName] = true;
3441
- this.manager.activeServer = serverName;
3442
- const numTools = tools.length;
3443
- result += ` Session created and connected. '${serverName}' is now the active server with ${numTools} tools available.`;
3444
- result += `
3445
-
3446
- ${tools.map((t) => t.name).join("\n")}`;
3447
- logger.info(result);
3448
- return result;
3449
- } catch (e) {
3450
- logger.error(
3451
- `Failed to add or connect to server '${serverName}': ${e.message}`
4263
+ /**
4264
+ * Processes additionalProperties configuration.
4265
+ *
4266
+ * @param {JSONSchema} schema - The JSON schema for an object.
4267
+ * @param {z.ZodObject<any, any>} objectSchema - The Zod object schema.
4268
+ * @returns {z.ZodObject<any, any>} - The updated Zod object schema.
4269
+ */
4270
+ static processAdditionalProperties(schema, objectSchema) {
4271
+ if (schema.additionalProperties === true) {
4272
+ return objectSchema.passthrough();
4273
+ } else if (schema.additionalProperties && typeof schema.additionalProperties === "object") {
4274
+ const additionalPropSchema = this.parseSchema(
4275
+ schema.additionalProperties
3452
4276
  );
3453
- return `Failed to add or connect to server '${serverName}': ${e.message}`;
4277
+ return objectSchema.catchall(additionalPropSchema);
4278
+ } else {
4279
+ return objectSchema.strict();
3454
4280
  }
3455
4281
  }
3456
- };
3457
-
3458
- // src/managers/tools/connect_mcp_server.ts
3459
- var import_zod5 = require("zod");
3460
- init_logging();
3461
- var ConnectMCPServerSchema = import_zod5.z.object({
3462
- serverName: import_zod5.z.string().describe("The name of the MCP server.")
3463
- });
3464
- var ConnectMCPServerTool = class extends MCPServerTool {
3465
- static {
3466
- __name(this, "ConnectMCPServerTool");
4282
+ /**
4283
+ * Parses a conditional schema with if-then-else.
4284
+ *
4285
+ * @param {JSONSchema} schema - The JSON schema with conditional validation.
4286
+ * @returns {ZodTypeAny} - The conditional Zod schema.
4287
+ */
4288
+ static parseConditional(schema) {
4289
+ const zodObject = this.createBaseObjectSchema(schema);
4290
+ const ifCondition = schema["if"];
4291
+ const thenSchema = schema["then"];
4292
+ const elseSchema = schema["else"];
4293
+ return zodObject.superRefine((data, ctx) => {
4294
+ const dataWithDefaults = this.applyDefaultValues(
4295
+ data,
4296
+ schema
4297
+ );
4298
+ if (this.matchesCondition(dataWithDefaults, ifCondition)) {
4299
+ this.validateConditionalSchema(dataWithDefaults, thenSchema, ctx);
4300
+ } else if (elseSchema) {
4301
+ this.validateConditionalSchema(dataWithDefaults, elseSchema, ctx);
4302
+ }
4303
+ });
3467
4304
  }
3468
- name = "connect_to_mcp_server";
3469
- description = "Connect to a specific MCP (Model Context Protocol) server to use its tools. Use this tool to connect to a specific server and use its tools.";
3470
- schema = ConnectMCPServerSchema;
3471
- constructor(manager) {
3472
- super(manager);
4305
+ /**
4306
+ * Creates a base object schema from the given JSON schema.
4307
+ *
4308
+ * @param {JSONSchema} schema - The JSON schema.
4309
+ * @returns {z.ZodObject<any, any>} - The base Zod object schema.
4310
+ */
4311
+ static createBaseObjectSchema(schema) {
4312
+ const shape = {};
4313
+ const required = new Set(schema.required || []);
4314
+ for (const [key, value] of Object.entries(schema.properties || {})) {
4315
+ const zodSchema = this.parseSchema(value);
4316
+ shape[key] = required.has(key) ? zodSchema : zodSchema.optional();
4317
+ }
4318
+ const zodObject = import_zod.z.object(shape);
4319
+ return this.processAdditionalProperties(schema, zodObject);
3473
4320
  }
3474
- async _call({ serverName }) {
3475
- const serverNames = this.manager.client.getServerNames();
3476
- if (!serverNames.includes(serverName)) {
3477
- const available = serverNames.length > 0 ? serverNames.join(", ") : "none";
3478
- return `Server '${serverName}' not found. Available servers: ${available}`;
4321
+ /**
4322
+ * Applies default values from schema properties to data object.
4323
+ *
4324
+ * @param {JSONValue} data - The original data object.
4325
+ * @param {JSONSchema} schema - The schema with default values.
4326
+ * @returns {JSONValue} - The data object with defaults applied.
4327
+ */
4328
+ static applyDefaultValues(data, schema) {
4329
+ if (typeof data !== "object" || data === null) {
4330
+ return data;
3479
4331
  }
3480
- if (this.manager.activeServer === serverName) {
3481
- return `Already connected to MCP server '${serverName}'`;
4332
+ if (Array.isArray(data)) {
4333
+ return data;
3482
4334
  }
3483
- try {
3484
- let session = this.manager.client.getSession(serverName);
3485
- logger.debug(`Using existing session for server '${serverName}'`);
3486
- if (!session) {
3487
- logger.debug(`Creating new session for server '${serverName}'`);
3488
- session = await this.manager.client.createSession(serverName);
3489
- }
3490
- this.manager.activeServer = serverName;
3491
- if (this.manager.serverTools[serverName]) {
3492
- const connector = session.connector;
3493
- const tools = await this.manager.adapter.createToolsFromConnectors([connector]);
3494
- this.manager.serverTools[serverName] = tools;
3495
- this.manager.initializedServers[serverName] = true;
4335
+ const objectData = data;
4336
+ const dataWithDefaults = { ...objectData };
4337
+ if (!schema.properties) {
4338
+ return dataWithDefaults;
4339
+ }
4340
+ for (const [key, propSchema] of Object.entries(schema.properties)) {
4341
+ if (!(key in dataWithDefaults) && "default" in propSchema) {
4342
+ dataWithDefaults[key] = propSchema["default"];
3496
4343
  }
3497
- const serverTools = this.manager.serverTools[serverName] || [];
3498
- const numTools = serverTools.length;
3499
- return `Connected to MCP server '${serverName}'. ${numTools} tools are now available.`;
3500
- } catch (error) {
3501
- logger.error(
3502
- `Error connecting to server '${serverName}': ${String(error)}`
3503
- );
3504
- return `Failed to connect to server '${serverName}': ${String(error)}`;
3505
4344
  }
4345
+ return dataWithDefaults;
3506
4346
  }
3507
- };
3508
-
3509
- // src/managers/tools/list_mcp_servers.ts
3510
- var import_zod6 = require("zod");
3511
- init_logging();
3512
- var EnumerateServersSchema = import_zod6.z.object({});
3513
- var ListMCPServersTool = class extends MCPServerTool {
3514
- static {
3515
- __name(this, "ListMCPServersTool");
4347
+ /**
4348
+ * Parses a schema with combinators (oneOf, anyOf, allOf).
4349
+ * Delegates to the appropriate combinator parser based on which combinator is present.
4350
+ *
4351
+ * @param {JSONSchema} schema - The JSON schema with combinators.
4352
+ * @returns {ZodTypeAny} - The ZodTypeAny schema.
4353
+ */
4354
+ static parseCombinator(schema) {
4355
+ if (schema.oneOf) {
4356
+ return this.parseOneOf(schema.oneOf);
4357
+ }
4358
+ if (schema.anyOf) {
4359
+ return this.parseAnyOf(schema.anyOf);
4360
+ }
4361
+ if (schema.allOf) {
4362
+ return this.parseAllOf(schema.allOf);
4363
+ }
4364
+ throw new Error("Unsupported schema type");
3516
4365
  }
3517
- name = "list_mcp_servers";
3518
- description = `Lists all available MCP (Model Context Protocol) servers that can be connected to, along with the tools available on each server. Use this tool to discover servers and see what functionalities they offer.`;
3519
- schema = EnumerateServersSchema;
3520
- constructor(manager) {
3521
- super(manager);
4366
+ /**
4367
+ * Parses a oneOf combinator schema.
4368
+ *
4369
+ * @param {JSONSchema[]} schemas - Array of JSON schemas in the oneOf.
4370
+ * @returns {ZodTypeAny} - The ZodTypeAny schema.
4371
+ */
4372
+ static parseOneOf(schemas) {
4373
+ return this.createUnionFromSchemas(schemas);
3522
4374
  }
3523
- async _call() {
3524
- const serverNames = this.manager.client.getServerNames();
3525
- if (serverNames.length === 0) {
3526
- return `No MCP servers are currently defined.`;
4375
+ /**
4376
+ * Parses an anyOf combinator schema.
4377
+ *
4378
+ * @param {JSONSchema[]} schemas - Array of JSON schemas in the anyOf.
4379
+ * @returns {ZodTypeAny} - The ZodTypeAny schema.
4380
+ */
4381
+ static parseAnyOf(schemas) {
4382
+ return this.createUnionFromSchemas(schemas);
4383
+ }
4384
+ /**
4385
+ * Creates a union from an array of schemas, handling special cases.
4386
+ *
4387
+ * @param {JSONSchema[]} schemas - Array of JSON schemas to create a union from.
4388
+ * @returns {ZodTypeAny} - The union Zod schema.
4389
+ */
4390
+ static createUnionFromSchemas(schemas) {
4391
+ if (schemas.length === 0) {
4392
+ return import_zod.z.any();
3527
4393
  }
3528
- const outputLines = ["Available MCP servers:"];
3529
- for (const serverName of serverNames) {
3530
- const isActiveServer = serverName === this.manager.activeServer;
3531
- const activeFlag = isActiveServer ? " (ACTIVE)" : "";
3532
- outputLines.push(`- ${serverName}${activeFlag}`);
3533
- try {
3534
- const serverTools = this.manager.serverTools?.[serverName] ?? [];
3535
- const numberOfTools = Array.isArray(serverTools) ? serverTools.length : 0;
3536
- outputLines.push(`${numberOfTools} tools available for this server
3537
- `);
3538
- } catch (error) {
3539
- logger.error(
3540
- `Unexpected error listing tools for server '${serverName}': ${String(error)}`
3541
- );
4394
+ if (schemas.length === 1) {
4395
+ return this.parseSchema(schemas[0]);
4396
+ }
4397
+ const zodSchemas = [];
4398
+ for (const subSchema of schemas) {
4399
+ if (subSchema.type === "null") {
4400
+ zodSchemas.push(import_zod.z.null());
4401
+ } else {
4402
+ zodSchemas.push(this.parseSchema(subSchema));
3542
4403
  }
3543
4404
  }
3544
- return outputLines.join("\n");
3545
- }
3546
- };
3547
-
3548
- // src/managers/tools/release_mcp_server_connection.ts
3549
- var import_zod7 = require("zod");
3550
- var ReleaseConnectionSchema = import_zod7.z.object({});
3551
- var ReleaseMCPServerConnectionTool = class extends MCPServerTool {
3552
- static {
3553
- __name(this, "ReleaseMCPServerConnectionTool");
4405
+ if (zodSchemas.length >= 2) {
4406
+ return import_zod.z.union(zodSchemas);
4407
+ } else if (zodSchemas.length === 1) {
4408
+ return zodSchemas[0];
4409
+ }
4410
+ return import_zod.z.any();
3554
4411
  }
3555
- name = "disconnect_from_mcp_server";
3556
- description = "Disconnect from the currently active MCP (Model Context Protocol) server";
3557
- schema = ReleaseConnectionSchema;
3558
- constructor(manager) {
3559
- super(manager);
4412
+ /**
4413
+ * Parses an allOf combinator schema by merging all schemas.
4414
+ *
4415
+ * @param {JSONSchema[]} schemas - Array of JSON schemas in the allOf.
4416
+ * @returns {ZodTypeAny} - The ZodTypeAny schema.
4417
+ */
4418
+ static parseAllOf(schemas) {
4419
+ if (schemas.length === 0) {
4420
+ return import_zod.z.any();
4421
+ }
4422
+ if (schemas.length === 1) {
4423
+ return this.parseSchema(schemas[0]);
4424
+ }
4425
+ const mergedSchema = schemas.reduce(
4426
+ (acc, currentSchema) => this.mergeSchemas(acc, currentSchema)
4427
+ );
4428
+ return this.parseSchema(mergedSchema);
3560
4429
  }
3561
- async _call() {
3562
- if (!this.manager.activeServer) {
3563
- return `No MCP server is currently active, so there's nothing to disconnect from.`;
4430
+ /**
4431
+ * Merges two JSON schemas together.
4432
+ *
4433
+ * @param {JSONSchema} baseSchema - The base JSON schema.
4434
+ * @param {JSONSchema} addSchema - The JSON schema to add.
4435
+ * @returns {JSONSchema} - The merged JSON schema
4436
+ */
4437
+ static mergeSchemas(baseSchema, addSchema) {
4438
+ const merged = { ...baseSchema, ...addSchema };
4439
+ if (baseSchema.properties && addSchema.properties) {
4440
+ const mergedProperties = {
4441
+ ...baseSchema.properties,
4442
+ ...addSchema.properties
4443
+ };
4444
+ merged.properties = mergedProperties;
3564
4445
  }
3565
- const serverName = this.manager.activeServer;
3566
- this.manager.activeServer = null;
3567
- return `Successfully disconnected from MCP server '${serverName}'.`;
4446
+ if (baseSchema.required && addSchema.required) {
4447
+ const mergedRequired = [
4448
+ .../* @__PURE__ */ new Set([...baseSchema.required, ...addSchema.required])
4449
+ ];
4450
+ merged.required = mergedRequired;
4451
+ }
4452
+ return merged;
3568
4453
  }
3569
4454
  };
3570
4455
 
3571
- // src/managers/server_manager.ts
3572
- function isEqual(a, b) {
3573
- if (a === b) return true;
3574
- if (a == null || b == null) return false;
3575
- if (typeof a !== typeof b) return false;
3576
- if (a instanceof Date && b instanceof Date) {
3577
- return a.getTime() === b.getTime();
3578
- }
3579
- if (Array.isArray(a) && Array.isArray(b)) {
3580
- if (a.length !== b.length) return false;
3581
- return a.every((item, index) => isEqual(item, b[index]));
3582
- }
3583
- if (typeof a === "object" && typeof b === "object") {
3584
- const keysA = Object.keys(a);
3585
- const keysB = Object.keys(b);
3586
- if (keysA.length !== keysB.length) return false;
3587
- return keysA.every((key) => {
3588
- return Object.prototype.hasOwnProperty.call(b, key) && isEqual(a[key], b[key]);
3589
- });
3590
- }
3591
- return false;
3592
- }
3593
- __name(isEqual, "isEqual");
3594
- var ServerManager = class {
4456
+ // src/adapters/langchain_adapter.ts
4457
+ var import_tools = require("@langchain/core/tools");
4458
+ var import_zod2 = require("zod");
4459
+ init_logging();
4460
+
4461
+ // src/adapters/base.ts
4462
+ init_logging();
4463
+ var BaseAdapter = class {
3595
4464
  static {
3596
- __name(this, "ServerManager");
3597
- }
3598
- initializedServers = {};
3599
- serverTools = {};
3600
- client;
3601
- adapter;
3602
- activeServer = null;
3603
- overrideManagementTools;
3604
- constructor(client, adapter, managementTools) {
3605
- this.client = client;
3606
- this.adapter = adapter;
3607
- this.overrideManagementTools = managementTools;
3608
- }
3609
- setManagementTools(tools) {
3610
- this.overrideManagementTools = tools;
3611
- logger.info(
3612
- `Overriding default management tools with a new set of ${tools.length} tools.`
3613
- );
4465
+ __name(this, "BaseAdapter");
3614
4466
  }
3615
- logState(context) {
3616
- const allServerNames = this.client.getServerNames();
3617
- const activeSessionNames = Object.keys(this.client.getAllActiveSessions());
3618
- if (allServerNames.length === 0) {
3619
- logger.info("Server Manager State: No servers configured.");
3620
- return;
3621
- }
3622
- const tableData = allServerNames.map((name) => ({
3623
- "Server Name": name,
3624
- Connected: activeSessionNames.includes(name) ? "\u2705" : "\u274C",
3625
- Initialized: this.initializedServers[name] ? "\u2705" : "\u274C",
3626
- "Tool Count": this.serverTools[name]?.length ?? 0,
3627
- Active: this.activeServer === name ? "\u2705" : "\u274C"
3628
- }));
3629
- logger.info(`Server Manager State: [${context}]`);
3630
- console.table(tableData);
4467
+ /**
4468
+ * List of tool names that should not be available.
4469
+ */
4470
+ disallowedTools;
4471
+ /**
4472
+ * Internal cache that maps a connector instance to the list of tools
4473
+ * generated for it.
4474
+ */
4475
+ connectorToolMap = /* @__PURE__ */ new Map();
4476
+ constructor(disallowedTools) {
4477
+ this.disallowedTools = disallowedTools ?? [];
3631
4478
  }
3632
- initialize() {
3633
- const serverNames = this.client.getServerNames?.();
3634
- if (serverNames.length === 0) {
3635
- logger.warn("No MCP servers defined in client configuration");
4479
+ /**
4480
+ * Create tools from an MCPClient instance.
4481
+ *
4482
+ * This is the recommended way to create tools from an MCPClient, as it handles
4483
+ * session creation and connector extraction automatically.
4484
+ *
4485
+ * @param client The MCPClient to extract tools from.
4486
+ * @param disallowedTools Optional list of tool names to exclude.
4487
+ * @returns A promise that resolves with a list of converted tools.
4488
+ */
4489
+ static async createTools(client, disallowedTools) {
4490
+ const adapter = new this(disallowedTools);
4491
+ if (!client.activeSessions || Object.keys(client.activeSessions).length === 0) {
4492
+ logger.info("No active sessions found, creating new ones...");
4493
+ await client.createAllSessions();
3636
4494
  }
4495
+ const sessions = client.getAllActiveSessions();
4496
+ const connectors = Object.values(sessions).map(
4497
+ (session) => session.connector
4498
+ );
4499
+ return adapter.createToolsFromConnectors(connectors);
3637
4500
  }
3638
- async prefetchServerTools() {
3639
- const servers = this.client.getServerNames();
3640
- for (const serverName of servers) {
3641
- try {
3642
- let session = null;
3643
- session = this.client.getSession(serverName);
3644
- logger.debug(
3645
- `Using existing session for server '${serverName}' to prefetch tools.`
3646
- );
3647
- if (!session) {
3648
- session = await this.client.createSession(serverName).catch((createSessionError) => {
3649
- logger.warn(
3650
- `Could not create session for '${serverName}' during prefetch: ${createSessionError}`
3651
- );
3652
- return null;
3653
- });
3654
- logger.debug(
3655
- `Temporarily created session for '${serverName}' to prefetch tools.`
3656
- );
3657
- }
3658
- if (session) {
3659
- const connector = session.connector;
3660
- let tools = [];
3661
- try {
3662
- tools = await this.adapter.createToolsFromConnectors([connector]);
3663
- } catch (toolFetchError) {
3664
- logger.error(
3665
- `Failed to create tools from connector for server '${serverName}': ${toolFetchError}`
3666
- );
3667
- continue;
3668
- }
3669
- const cachedTools = this.serverTools[serverName];
3670
- const toolsChanged = !cachedTools || !isEqual(cachedTools, tools);
3671
- if (toolsChanged) {
3672
- this.serverTools[serverName] = tools;
3673
- this.initializedServers[serverName] = true;
3674
- logger.debug(
3675
- `Prefetched ${tools.length} tools for server '${serverName}'.`
3676
- );
3677
- } else {
3678
- logger.debug(
3679
- `Tools for server '${serverName}' unchanged, using cached version.`
3680
- );
3681
- }
3682
- }
3683
- } catch (outerError) {
3684
- logger.error(
3685
- `Error prefetching tools for server '${serverName}': ${outerError}`
3686
- );
4501
+ /**
4502
+ * Dynamically load tools for a specific connector.
4503
+ *
4504
+ * @param connector The connector to load tools for.
4505
+ * @returns The list of tools that were loaded in the target framework's format.
4506
+ */
4507
+ async loadToolsForConnector(connector) {
4508
+ if (this.connectorToolMap.has(connector)) {
4509
+ const cached = this.connectorToolMap.get(connector);
4510
+ logger.debug(`Returning ${cached.length} existing tools for connector`);
4511
+ return cached;
4512
+ }
4513
+ const connectorTools = [];
4514
+ const success = await this.ensureConnectorInitialized(connector);
4515
+ if (!success) {
4516
+ return [];
4517
+ }
4518
+ for (const tool of connector.tools) {
4519
+ const converted = this.convertTool(tool, connector);
4520
+ if (converted) {
4521
+ connectorTools.push(converted);
3687
4522
  }
3688
4523
  }
4524
+ this.connectorToolMap.set(connector, connectorTools);
4525
+ logger.debug(
4526
+ `Loaded ${connectorTools.length} new tools for connector: ${connectorTools.map((t) => t?.name ?? String(t)).join(", ")}`
4527
+ );
4528
+ return connectorTools;
3689
4529
  }
3690
- get tools() {
3691
- if (logger.level === "debug") {
3692
- this.logState("Providing tools to agent");
4530
+ /**
4531
+ * Create tools from MCP tools in all provided connectors.
4532
+ *
4533
+ * @param connectors List of MCP connectors to create tools from.
4534
+ * @returns A promise that resolves with all converted tools.
4535
+ */
4536
+ async createToolsFromConnectors(connectors) {
4537
+ const tools = [];
4538
+ for (const connector of connectors) {
4539
+ const connectorTools = await this.loadToolsForConnector(connector);
4540
+ tools.push(...connectorTools);
3693
4541
  }
3694
- const managementTools = this.overrideManagementTools ?? [
3695
- new AddMCPServerFromConfigTool(this),
3696
- new ListMCPServersTool(this),
3697
- new ConnectMCPServerTool(this),
3698
- new AcquireActiveMCPServerTool(this),
3699
- new ReleaseMCPServerConnectionTool(this)
3700
- ];
3701
- if (this.activeServer && this.serverTools[this.activeServer]) {
3702
- const activeTools = this.serverTools[this.activeServer];
3703
- logger.debug(
3704
- `Adding ${activeTools.length} tools from active server '${this.activeServer}'`
3705
- );
3706
- return [...managementTools, ...activeTools];
4542
+ logger.debug(`Available tools: ${tools.length}`);
4543
+ return tools;
4544
+ }
4545
+ /**
4546
+ * Check if a connector is initialized and has tools.
4547
+ *
4548
+ * @param connector The connector to check.
4549
+ * @returns True if the connector is initialized and has tools, false otherwise.
4550
+ */
4551
+ checkConnectorInitialized(connector) {
4552
+ return Boolean(connector.tools && connector.tools.length);
4553
+ }
4554
+ /**
4555
+ * Ensure a connector is initialized.
4556
+ *
4557
+ * @param connector The connector to initialize.
4558
+ * @returns True if initialization succeeded, false otherwise.
4559
+ */
4560
+ async ensureConnectorInitialized(connector) {
4561
+ if (!this.checkConnectorInitialized(connector)) {
4562
+ logger.debug("Connector doesn't have tools, initializing it");
4563
+ try {
4564
+ await connector.initialize();
4565
+ return true;
4566
+ } catch (err) {
4567
+ logger.error(`Error initializing connector: ${err}`);
4568
+ return false;
4569
+ }
3707
4570
  }
3708
- return managementTools;
4571
+ return true;
3709
4572
  }
3710
4573
  };
3711
4574
 
3712
- // src/observability/index.ts
3713
- init_langfuse();
3714
- init_langfuse();
3715
-
3716
- // src/observability/manager.ts
3717
- init_logging();
3718
- var ObservabilityManager = class {
4575
+ // src/adapters/langchain_adapter.ts
4576
+ function schemaToZod(schema) {
4577
+ try {
4578
+ return JSONSchemaToZod.convert(schema);
4579
+ } catch (err) {
4580
+ logger.warn(`Failed to convert JSON schema to Zod: ${err}`);
4581
+ return import_zod2.z.any();
4582
+ }
4583
+ }
4584
+ __name(schemaToZod, "schemaToZod");
4585
+ var LangChainAdapter = class extends BaseAdapter {
3719
4586
  static {
3720
- __name(this, "ObservabilityManager");
4587
+ __name(this, "LangChainAdapter");
3721
4588
  }
3722
- customCallbacks;
3723
- availableHandlers = [];
3724
- handlerNames = [];
3725
- initialized = false;
3726
- verbose;
3727
- observe;
3728
- agentId;
3729
- metadata;
3730
- metadataProvider;
3731
- tagsProvider;
3732
- constructor(config = {}) {
3733
- this.customCallbacks = config.customCallbacks;
3734
- this.verbose = config.verbose ?? false;
3735
- this.observe = config.observe ?? true;
3736
- this.agentId = config.agentId;
3737
- this.metadata = config.metadata;
3738
- this.metadataProvider = config.metadataProvider;
3739
- this.tagsProvider = config.tagsProvider;
4589
+ constructor(disallowedTools = []) {
4590
+ super(disallowedTools);
3740
4591
  }
3741
4592
  /**
3742
- * Collect all available observability handlers from configured platforms.
4593
+ * Convert a single MCP tool specification into a LangChainJS structured tool.
3743
4594
  */
3744
- async collectAvailableHandlers() {
3745
- if (this.initialized) {
3746
- return;
4595
+ convertTool(mcpTool, connector) {
4596
+ if (this.disallowedTools.includes(mcpTool.name)) {
4597
+ return null;
3747
4598
  }
3748
- try {
3749
- const { langfuseHandler: langfuseHandler2, langfuseInitPromise: langfuseInitPromise2 } = await Promise.resolve().then(() => (init_langfuse(), langfuse_exports));
3750
- if (this.agentId || this.metadata || this.metadataProvider || this.tagsProvider) {
3751
- const { initializeLangfuse: initializeLangfuse2 } = await Promise.resolve().then(() => (init_langfuse(), langfuse_exports));
3752
- await initializeLangfuse2(
3753
- this.agentId,
3754
- this.metadata,
3755
- this.metadataProvider,
3756
- this.tagsProvider
3757
- );
4599
+ const argsSchema = mcpTool.inputSchema ? schemaToZod(mcpTool.inputSchema) : import_zod2.z.object({}).optional();
4600
+ const tool = new import_tools.DynamicStructuredTool({
4601
+ name: mcpTool.name ?? "NO NAME",
4602
+ description: mcpTool.description ?? "",
4603
+ // Blank is acceptable but discouraged.
4604
+ schema: argsSchema,
4605
+ func: /* @__PURE__ */ __name(async (input) => {
3758
4606
  logger.debug(
3759
- `ObservabilityManager: Reinitialized Langfuse with agent ID: ${this.agentId}, metadata: ${JSON.stringify(this.metadata)}`
4607
+ `MCP tool "${mcpTool.name}" received input: ${JSON.stringify(input)}`
3760
4608
  );
3761
- } else {
3762
- const initPromise = langfuseInitPromise2();
3763
- if (initPromise) {
3764
- await initPromise;
4609
+ try {
4610
+ const result = await connector.callTool(
4611
+ mcpTool.name,
4612
+ input
4613
+ );
4614
+ return JSON.stringify(result);
4615
+ } catch (err) {
4616
+ logger.error(`Error executing MCP tool: ${err.message}`);
4617
+ return `Error executing MCP tool: ${String(err)}`;
3765
4618
  }
3766
- }
3767
- const handler = langfuseHandler2();
3768
- if (handler) {
3769
- this.availableHandlers.push(handler);
3770
- this.handlerNames.push("Langfuse");
3771
- logger.debug("ObservabilityManager: Langfuse handler available");
3772
- }
3773
- } catch {
3774
- logger.debug("ObservabilityManager: Langfuse module not available");
3775
- }
3776
- this.initialized = true;
4619
+ }, "func")
4620
+ });
4621
+ return tool;
3777
4622
  }
3778
- /**
3779
- * Get the list of callbacks to use.
3780
- * @returns List of callbacks - either custom callbacks if provided, or all available observability handlers.
3781
- */
3782
- async getCallbacks() {
3783
- if (!this.observe) {
3784
- logger.debug(
3785
- "ObservabilityManager: Observability disabled via observe=false"
3786
- );
3787
- return [];
4623
+ };
4624
+
4625
+ // src/agents/mcp_agent.ts
4626
+ init_logging();
4627
+
4628
+ // src/managers/server_manager.ts
4629
+ init_logging();
4630
+
4631
+ // src/managers/tools/acquire_active_mcp_server.ts
4632
+ var import_zod3 = require("zod");
4633
+
4634
+ // src/managers/tools/base.ts
4635
+ var import_tools2 = require("@langchain/core/tools");
4636
+ var MCPServerTool = class extends import_tools2.StructuredTool {
4637
+ static {
4638
+ __name(this, "MCPServerTool");
4639
+ }
4640
+ name = "mcp_server_tool";
4641
+ description = "Base tool for MCP server operations.";
4642
+ schema;
4643
+ _manager;
4644
+ constructor(manager) {
4645
+ super();
4646
+ this._manager = manager;
4647
+ }
4648
+ async _call(_arg, _runManager, _parentConfig) {
4649
+ throw new Error("Method not implemented.");
4650
+ }
4651
+ get manager() {
4652
+ return this._manager;
4653
+ }
4654
+ };
4655
+
4656
+ // src/managers/tools/acquire_active_mcp_server.ts
4657
+ var PresentActiveServerSchema = import_zod3.z.object({});
4658
+ var AcquireActiveMCPServerTool = class extends MCPServerTool {
4659
+ static {
4660
+ __name(this, "AcquireActiveMCPServerTool");
4661
+ }
4662
+ name = "get_active_mcp_server";
4663
+ description = "Get the currently active MCP (Model Context Protocol) server";
4664
+ schema = PresentActiveServerSchema;
4665
+ constructor(manager) {
4666
+ super(manager);
4667
+ }
4668
+ async _call() {
4669
+ if (!this.manager.activeServer) {
4670
+ return `No MCP server is currently active. Use connect_to_mcp_server to connect to a server.`;
3788
4671
  }
3789
- if (this.customCallbacks) {
4672
+ return `Currently active MCP server: ${this.manager.activeServer}`;
4673
+ }
4674
+ };
4675
+
4676
+ // src/managers/tools/add_server_from_config.ts
4677
+ var import_tools3 = require("@langchain/core/tools");
4678
+ var import_zod4 = require("zod");
4679
+ init_logging();
4680
+ var AddMCPServerFromConfigTool = class extends import_tools3.StructuredTool {
4681
+ static {
4682
+ __name(this, "AddMCPServerFromConfigTool");
4683
+ }
4684
+ name = "add_mcp_server_from_config";
4685
+ description = "Adds a new MCP server to the client from a configuration object and connects to it, making its tools available.";
4686
+ schema = import_zod4.z.object({
4687
+ serverName: import_zod4.z.string().describe("The name for the new MCP server."),
4688
+ serverConfig: import_zod4.z.any().describe(
4689
+ 'The configuration object for the server. This should not include the top-level "mcpServers" key.'
4690
+ )
4691
+ });
4692
+ manager;
4693
+ constructor(manager) {
4694
+ super();
4695
+ this.manager = manager;
4696
+ }
4697
+ async _call({
4698
+ serverName,
4699
+ serverConfig
4700
+ }) {
4701
+ try {
4702
+ this.manager.client.addServer(serverName, serverConfig);
4703
+ let result = `Server '${serverName}' added to the client.`;
3790
4704
  logger.debug(
3791
- `ObservabilityManager: Using ${this.customCallbacks.length} custom callbacks`
4705
+ `Connecting to new server '${serverName}' and discovering tools.`
3792
4706
  );
3793
- return this.customCallbacks;
3794
- }
3795
- await this.collectAvailableHandlers();
3796
- if (this.availableHandlers.length > 0) {
3797
- logger.debug(
3798
- `ObservabilityManager: Using ${this.availableHandlers.length} handlers`
4707
+ const session = await this.manager.client.createSession(serverName);
4708
+ const connector = session.connector;
4709
+ const tools = await this.manager.adapter.createToolsFromConnectors([connector]);
4710
+ this.manager.serverTools[serverName] = tools;
4711
+ this.manager.initializedServers[serverName] = true;
4712
+ this.manager.activeServer = serverName;
4713
+ const numTools = tools.length;
4714
+ result += ` Session created and connected. '${serverName}' is now the active server with ${numTools} tools available.`;
4715
+ result += `
4716
+
4717
+ ${tools.map((t) => t.name).join("\n")}`;
4718
+ logger.info(result);
4719
+ return result;
4720
+ } catch (e) {
4721
+ logger.error(
4722
+ `Failed to add or connect to server '${serverName}': ${e.message}`
3799
4723
  );
3800
- } else {
3801
- logger.debug("ObservabilityManager: No callbacks configured");
4724
+ return `Failed to add or connect to server '${serverName}': ${e.message}`;
3802
4725
  }
3803
- return this.availableHandlers;
3804
4726
  }
3805
- /**
3806
- * Get the names of available handlers.
3807
- * @returns List of handler names (e.g., ["Langfuse", "Laminar"])
3808
- */
3809
- async getHandlerNames() {
3810
- if (!this.observe) {
3811
- return [];
4727
+ };
4728
+
4729
+ // src/managers/tools/connect_mcp_server.ts
4730
+ var import_zod5 = require("zod");
4731
+ init_logging();
4732
+ var ConnectMCPServerSchema = import_zod5.z.object({
4733
+ serverName: import_zod5.z.string().describe("The name of the MCP server.")
4734
+ });
4735
+ var ConnectMCPServerTool = class extends MCPServerTool {
4736
+ static {
4737
+ __name(this, "ConnectMCPServerTool");
4738
+ }
4739
+ name = "connect_to_mcp_server";
4740
+ description = "Connect to a specific MCP (Model Context Protocol) server to use its tools. Use this tool to connect to a specific server and use its tools.";
4741
+ schema = ConnectMCPServerSchema;
4742
+ constructor(manager) {
4743
+ super(manager);
4744
+ }
4745
+ async _call({ serverName }) {
4746
+ const serverNames = this.manager.client.getServerNames();
4747
+ if (!serverNames.includes(serverName)) {
4748
+ const available = serverNames.length > 0 ? serverNames.join(", ") : "none";
4749
+ return `Server '${serverName}' not found. Available servers: ${available}`;
3812
4750
  }
3813
- if (this.customCallbacks) {
3814
- return this.customCallbacks.map((cb) => cb.constructor.name);
4751
+ if (this.manager.activeServer === serverName) {
4752
+ return `Already connected to MCP server '${serverName}'`;
3815
4753
  }
3816
- await this.collectAvailableHandlers();
3817
- return this.handlerNames;
3818
- }
3819
- /**
3820
- * Check if any callbacks are available.
3821
- * @returns True if callbacks are available, False otherwise.
3822
- */
3823
- async hasCallbacks() {
3824
- if (!this.observe) {
3825
- return false;
4754
+ try {
4755
+ let session = this.manager.client.getSession(serverName);
4756
+ logger.debug(`Using existing session for server '${serverName}'`);
4757
+ if (!session) {
4758
+ logger.debug(`Creating new session for server '${serverName}'`);
4759
+ session = await this.manager.client.createSession(serverName);
4760
+ }
4761
+ this.manager.activeServer = serverName;
4762
+ if (this.manager.serverTools[serverName]) {
4763
+ const connector = session.connector;
4764
+ const tools = await this.manager.adapter.createToolsFromConnectors([connector]);
4765
+ this.manager.serverTools[serverName] = tools;
4766
+ this.manager.initializedServers[serverName] = true;
4767
+ }
4768
+ const serverTools = this.manager.serverTools[serverName] || [];
4769
+ const numTools = serverTools.length;
4770
+ return `Connected to MCP server '${serverName}'. ${numTools} tools are now available.`;
4771
+ } catch (error) {
4772
+ logger.error(
4773
+ `Error connecting to server '${serverName}': ${String(error)}`
4774
+ );
4775
+ return `Failed to connect to server '${serverName}': ${String(error)}`;
3826
4776
  }
3827
- const callbacks = await this.getCallbacks();
3828
- return callbacks.length > 0;
3829
- }
3830
- /**
3831
- * Get the current observability status including metadata and tags.
3832
- * @returns Object containing enabled status, callback count, handler names, metadata, and tags.
3833
- */
3834
- async getStatus() {
3835
- const callbacks = await this.getCallbacks();
3836
- const handlerNames = await this.getHandlerNames();
3837
- const currentMetadata = this.metadataProvider ? this.metadataProvider() : this.metadata || {};
3838
- const currentTags = this.tagsProvider ? this.tagsProvider() : [];
3839
- return {
3840
- enabled: this.observe && callbacks.length > 0,
3841
- callbackCount: callbacks.length,
3842
- handlerNames,
3843
- metadata: currentMetadata,
3844
- tags: currentTags
3845
- };
3846
4777
  }
3847
- /**
3848
- * Add a callback to the custom callbacks list.
3849
- * @param callback The callback to add.
3850
- */
3851
- addCallback(callback) {
3852
- if (!this.customCallbacks) {
3853
- this.customCallbacks = [];
3854
- }
3855
- this.customCallbacks.push(callback);
3856
- logger.debug(
3857
- `ObservabilityManager: Added custom callback: ${callback.constructor.name}`
3858
- );
4778
+ };
4779
+
4780
+ // src/managers/tools/list_mcp_servers.ts
4781
+ var import_zod6 = require("zod");
4782
+ init_logging();
4783
+ var EnumerateServersSchema = import_zod6.z.object({});
4784
+ var ListMCPServersTool = class extends MCPServerTool {
4785
+ static {
4786
+ __name(this, "ListMCPServersTool");
3859
4787
  }
3860
- /**
3861
- * Clear all custom callbacks.
3862
- */
3863
- clearCallbacks() {
3864
- this.customCallbacks = [];
3865
- logger.debug("ObservabilityManager: Cleared all custom callbacks");
4788
+ name = "list_mcp_servers";
4789
+ description = `Lists all available MCP (Model Context Protocol) servers that can be connected to, along with the tools available on each server. Use this tool to discover servers and see what functionalities they offer.`;
4790
+ schema = EnumerateServersSchema;
4791
+ constructor(manager) {
4792
+ super(manager);
3866
4793
  }
3867
- /**
3868
- * Flush all pending traces to observability platforms.
3869
- * Important for serverless environments and short-lived processes.
3870
- */
3871
- async flush() {
3872
- const callbacks = await this.getCallbacks();
3873
- for (const callback of callbacks) {
3874
- if ("flushAsync" in callback && typeof callback.flushAsync === "function") {
3875
- await callback.flushAsync();
3876
- }
4794
+ async _call() {
4795
+ const serverNames = this.manager.client.getServerNames();
4796
+ if (serverNames.length === 0) {
4797
+ return `No MCP servers are currently defined.`;
3877
4798
  }
3878
- logger.debug("ObservabilityManager: All traces flushed");
3879
- }
3880
- /**
3881
- * Shutdown all handlers gracefully (for serverless environments).
3882
- */
3883
- async shutdown() {
3884
- await this.flush();
3885
- const callbacks = await this.getCallbacks();
3886
- for (const callback of callbacks) {
3887
- if ("shutdownAsync" in callback && typeof callback.shutdownAsync === "function") {
3888
- await callback.shutdownAsync();
3889
- } else if ("shutdown" in callback && typeof callback.shutdown === "function") {
3890
- await callback.shutdown();
4799
+ const outputLines = ["Available MCP servers:"];
4800
+ for (const serverName of serverNames) {
4801
+ const isActiveServer = serverName === this.manager.activeServer;
4802
+ const activeFlag = isActiveServer ? " (ACTIVE)" : "";
4803
+ outputLines.push(`- ${serverName}${activeFlag}`);
4804
+ try {
4805
+ const serverTools = this.manager.serverTools?.[serverName] ?? [];
4806
+ const numberOfTools = Array.isArray(serverTools) ? serverTools.length : 0;
4807
+ outputLines.push(`${numberOfTools} tools available for this server
4808
+ `);
4809
+ } catch (error) {
4810
+ logger.error(
4811
+ `Unexpected error listing tools for server '${serverName}': ${String(error)}`
4812
+ );
3891
4813
  }
3892
4814
  }
3893
- logger.debug("ObservabilityManager: All handlers shutdown");
3894
- }
3895
- /**
3896
- * String representation of the ObservabilityManager.
3897
- */
3898
- toString() {
3899
- const names = this.handlerNames;
3900
- if (names.length > 0) {
3901
- return `ObservabilityManager(handlers=${names.join(", ")})`;
3902
- }
3903
- return "ObservabilityManager(no handlers)";
4815
+ return outputLines.join("\n");
3904
4816
  }
3905
4817
  };
3906
4818
 
3907
- // src/telemetry/telemetry.ts
3908
- var fs2 = __toESM(require("fs"), 1);
3909
- var os = __toESM(require("os"), 1);
3910
- var path2 = __toESM(require("path"), 1);
3911
- var import_posthog_node = require("posthog-node");
3912
- init_logging();
3913
-
3914
- // src/telemetry/events.ts
3915
- var BaseTelemetryEvent = class {
4819
+ // src/managers/tools/release_mcp_server_connection.ts
4820
+ var import_zod7 = require("zod");
4821
+ var ReleaseConnectionSchema = import_zod7.z.object({});
4822
+ var ReleaseMCPServerConnectionTool = class extends MCPServerTool {
3916
4823
  static {
3917
- __name(this, "BaseTelemetryEvent");
4824
+ __name(this, "ReleaseMCPServerConnectionTool");
4825
+ }
4826
+ name = "disconnect_from_mcp_server";
4827
+ description = "Disconnect from the currently active MCP (Model Context Protocol) server";
4828
+ schema = ReleaseConnectionSchema;
4829
+ constructor(manager) {
4830
+ super(manager);
4831
+ }
4832
+ async _call() {
4833
+ if (!this.manager.activeServer) {
4834
+ return `No MCP server is currently active, so there's nothing to disconnect from.`;
4835
+ }
4836
+ const serverName = this.manager.activeServer;
4837
+ this.manager.activeServer = null;
4838
+ return `Successfully disconnected from MCP server '${serverName}'.`;
3918
4839
  }
3919
4840
  };
3920
- var MCPAgentExecutionEvent = class extends BaseTelemetryEvent {
3921
- constructor(data) {
3922
- super();
3923
- this.data = data;
4841
+
4842
+ // src/managers/server_manager.ts
4843
+ function isEqual(a, b) {
4844
+ if (a === b) return true;
4845
+ if (a == null || b == null) return false;
4846
+ if (typeof a !== typeof b) return false;
4847
+ if (a instanceof Date && b instanceof Date) {
4848
+ return a.getTime() === b.getTime();
4849
+ }
4850
+ if (Array.isArray(a) && Array.isArray(b)) {
4851
+ if (a.length !== b.length) return false;
4852
+ return a.every((item, index) => isEqual(item, b[index]));
4853
+ }
4854
+ if (typeof a === "object" && typeof b === "object") {
4855
+ const keysA = Object.keys(a);
4856
+ const keysB = Object.keys(b);
4857
+ if (keysA.length !== keysB.length) return false;
4858
+ return keysA.every((key) => {
4859
+ return Object.prototype.hasOwnProperty.call(b, key) && isEqual(a[key], b[key]);
4860
+ });
3924
4861
  }
4862
+ return false;
4863
+ }
4864
+ __name(isEqual, "isEqual");
4865
+ var ServerManager = class {
3925
4866
  static {
3926
- __name(this, "MCPAgentExecutionEvent");
4867
+ __name(this, "ServerManager");
3927
4868
  }
3928
- get name() {
3929
- return "mcp_agent_execution";
4869
+ initializedServers = {};
4870
+ serverTools = {};
4871
+ client;
4872
+ adapter;
4873
+ activeServer = null;
4874
+ overrideManagementTools;
4875
+ constructor(client, adapter, managementTools) {
4876
+ this.client = client;
4877
+ this.adapter = adapter;
4878
+ this.overrideManagementTools = managementTools;
3930
4879
  }
3931
- get properties() {
3932
- return {
3933
- // Core execution info
3934
- execution_method: this.data.executionMethod,
3935
- query: this.data.query,
3936
- query_length: this.data.query.length,
3937
- success: this.data.success,
3938
- // Agent configuration
3939
- model_provider: this.data.modelProvider,
3940
- model_name: this.data.modelName,
3941
- server_count: this.data.serverCount,
3942
- server_identifiers: this.data.serverIdentifiers,
3943
- total_tools_available: this.data.totalToolsAvailable,
3944
- tools_available_names: this.data.toolsAvailableNames,
3945
- max_steps_configured: this.data.maxStepsConfigured,
3946
- memory_enabled: this.data.memoryEnabled,
3947
- use_server_manager: this.data.useServerManager,
3948
- // Execution parameters (always include, even if null)
3949
- max_steps_used: this.data.maxStepsUsed,
3950
- manage_connector: this.data.manageConnector,
3951
- external_history_used: this.data.externalHistoryUsed,
3952
- // Execution results (always include, even if null)
3953
- steps_taken: this.data.stepsTaken ?? null,
3954
- tools_used_count: this.data.toolsUsedCount ?? null,
3955
- tools_used_names: this.data.toolsUsedNames ?? null,
3956
- response: this.data.response ?? null,
3957
- response_length: this.data.response ? this.data.response.length : null,
3958
- execution_time_ms: this.data.executionTimeMs ?? null,
3959
- error_type: this.data.errorType ?? null,
3960
- conversation_history_length: this.data.conversationHistoryLength ?? null
3961
- };
4880
+ setManagementTools(tools) {
4881
+ this.overrideManagementTools = tools;
4882
+ logger.info(
4883
+ `Overriding default management tools with a new set of ${tools.length} tools.`
4884
+ );
3962
4885
  }
3963
- };
3964
-
3965
- // src/telemetry/utils.ts
3966
- var fs = __toESM(require("fs"), 1);
3967
- var path = __toESM(require("path"), 1);
3968
- function getPackageVersion() {
3969
- try {
3970
- if (typeof __dirname === "undefined" || typeof fs === "undefined") {
3971
- return "unknown";
4886
+ logState(context) {
4887
+ const allServerNames = this.client.getServerNames();
4888
+ const activeSessionNames = Object.keys(this.client.getAllActiveSessions());
4889
+ if (allServerNames.length === 0) {
4890
+ logger.info("Server Manager State: No servers configured.");
4891
+ return;
3972
4892
  }
3973
- const packagePath = path.join(__dirname, "../../package.json");
3974
- const packageJson = JSON.parse(fs.readFileSync(packagePath, "utf-8"));
3975
- return packageJson.version || "unknown";
3976
- } catch {
3977
- return "unknown";
4893
+ const tableData = allServerNames.map((name) => ({
4894
+ "Server Name": name,
4895
+ Connected: activeSessionNames.includes(name) ? "\u2705" : "\u274C",
4896
+ Initialized: this.initializedServers[name] ? "\u2705" : "\u274C",
4897
+ "Tool Count": this.serverTools[name]?.length ?? 0,
4898
+ Active: this.activeServer === name ? "\u2705" : "\u274C"
4899
+ }));
4900
+ logger.info(`Server Manager State: [${context}]`);
4901
+ console.table(tableData);
3978
4902
  }
3979
- }
3980
- __name(getPackageVersion, "getPackageVersion");
3981
- function getModelProvider(llm) {
3982
- return llm._llm_type || llm.constructor.name.toLowerCase();
3983
- }
3984
- __name(getModelProvider, "getModelProvider");
3985
- function getModelName(llm) {
3986
- if ("_identifyingParams" in llm) {
3987
- const identifyingParams = llm._identifyingParams;
3988
- if (typeof identifyingParams === "object" && identifyingParams !== null) {
3989
- for (const key of [
3990
- "model",
3991
- "modelName",
3992
- "model_name",
3993
- "modelId",
3994
- "model_id",
3995
- "deploymentName",
3996
- "deployment_name"
3997
- ]) {
3998
- if (key in identifyingParams) {
3999
- return String(identifyingParams[key]);
4903
+ initialize() {
4904
+ const serverNames = this.client.getServerNames?.();
4905
+ if (serverNames.length === 0) {
4906
+ logger.warn("No MCP servers defined in client configuration");
4907
+ }
4908
+ }
4909
+ async prefetchServerTools() {
4910
+ const servers = this.client.getServerNames();
4911
+ for (const serverName of servers) {
4912
+ try {
4913
+ let session = null;
4914
+ session = this.client.getSession(serverName);
4915
+ logger.debug(
4916
+ `Using existing session for server '${serverName}' to prefetch tools.`
4917
+ );
4918
+ if (!session) {
4919
+ session = await this.client.createSession(serverName).catch((createSessionError) => {
4920
+ logger.warn(
4921
+ `Could not create session for '${serverName}' during prefetch: ${createSessionError}`
4922
+ );
4923
+ return null;
4924
+ });
4925
+ logger.debug(
4926
+ `Temporarily created session for '${serverName}' to prefetch tools.`
4927
+ );
4928
+ }
4929
+ if (session) {
4930
+ const connector = session.connector;
4931
+ let tools = [];
4932
+ try {
4933
+ tools = await this.adapter.createToolsFromConnectors([connector]);
4934
+ } catch (toolFetchError) {
4935
+ logger.error(
4936
+ `Failed to create tools from connector for server '${serverName}': ${toolFetchError}`
4937
+ );
4938
+ continue;
4939
+ }
4940
+ const cachedTools = this.serverTools[serverName];
4941
+ const toolsChanged = !cachedTools || !isEqual(cachedTools, tools);
4942
+ if (toolsChanged) {
4943
+ this.serverTools[serverName] = tools;
4944
+ this.initializedServers[serverName] = true;
4945
+ logger.debug(
4946
+ `Prefetched ${tools.length} tools for server '${serverName}'.`
4947
+ );
4948
+ } else {
4949
+ logger.debug(
4950
+ `Tools for server '${serverName}' unchanged, using cached version.`
4951
+ );
4952
+ }
4000
4953
  }
4954
+ } catch (outerError) {
4955
+ logger.error(
4956
+ `Error prefetching tools for server '${serverName}': ${outerError}`
4957
+ );
4001
4958
  }
4002
4959
  }
4003
4960
  }
4004
- return llm.model || llm.modelName || llm.constructor.name;
4005
- }
4006
- __name(getModelName, "getModelName");
4007
- function extractModelInfo(llm) {
4008
- return [getModelProvider(llm), getModelName(llm)];
4009
- }
4010
- __name(extractModelInfo, "extractModelInfo");
4011
-
4012
- // src/telemetry/telemetry.ts
4013
- function isNodeJSEnvironment2() {
4014
- try {
4015
- if (typeof navigator !== "undefined" && navigator.userAgent?.includes("Cloudflare-Workers")) {
4016
- return false;
4961
+ get tools() {
4962
+ if (logger.level === "debug") {
4963
+ this.logState("Providing tools to agent");
4017
4964
  }
4018
- if (typeof globalThis.EdgeRuntime !== "undefined" || typeof globalThis.Deno !== "undefined") {
4019
- return false;
4965
+ const managementTools = this.overrideManagementTools ?? [
4966
+ new AddMCPServerFromConfigTool(this),
4967
+ new ListMCPServersTool(this),
4968
+ new ConnectMCPServerTool(this),
4969
+ new AcquireActiveMCPServerTool(this),
4970
+ new ReleaseMCPServerConnectionTool(this)
4971
+ ];
4972
+ if (this.activeServer && this.serverTools[this.activeServer]) {
4973
+ const activeTools = this.serverTools[this.activeServer];
4974
+ logger.debug(
4975
+ `Adding ${activeTools.length} tools from active server '${this.activeServer}'`
4976
+ );
4977
+ return [...managementTools, ...activeTools];
4020
4978
  }
4021
- const hasNodeGlobals = typeof process !== "undefined" && typeof process.platform !== "undefined" && typeof __dirname !== "undefined";
4022
- const hasNodeModules = typeof fs2 !== "undefined" && typeof os !== "undefined" && typeof fs2.existsSync === "function";
4023
- return hasNodeGlobals && hasNodeModules;
4024
- } catch {
4025
- return false;
4979
+ return managementTools;
4026
4980
  }
4027
- }
4028
- __name(isNodeJSEnvironment2, "isNodeJSEnvironment");
4029
- var ScarfEventLogger = class {
4981
+ };
4982
+
4983
+ // src/observability/index.ts
4984
+ init_langfuse();
4985
+ init_langfuse();
4986
+
4987
+ // src/observability/manager.ts
4988
+ init_logging();
4989
+ var ObservabilityManager = class {
4030
4990
  static {
4031
- __name(this, "ScarfEventLogger");
4991
+ __name(this, "ObservabilityManager");
4032
4992
  }
4033
- endpoint;
4034
- timeout;
4035
- constructor(endpoint, timeout = 3e3) {
4036
- this.endpoint = endpoint;
4037
- this.timeout = timeout;
4993
+ customCallbacks;
4994
+ availableHandlers = [];
4995
+ handlerNames = [];
4996
+ initialized = false;
4997
+ verbose;
4998
+ observe;
4999
+ agentId;
5000
+ metadata;
5001
+ metadataProvider;
5002
+ tagsProvider;
5003
+ constructor(config = {}) {
5004
+ this.customCallbacks = config.customCallbacks;
5005
+ this.verbose = config.verbose ?? false;
5006
+ this.observe = config.observe ?? true;
5007
+ this.agentId = config.agentId;
5008
+ this.metadata = config.metadata;
5009
+ this.metadataProvider = config.metadataProvider;
5010
+ this.tagsProvider = config.tagsProvider;
4038
5011
  }
4039
- async logEvent(properties) {
5012
+ /**
5013
+ * Collect all available observability handlers from configured platforms.
5014
+ */
5015
+ async collectAvailableHandlers() {
5016
+ if (this.initialized) {
5017
+ return;
5018
+ }
4040
5019
  try {
4041
- const controller = new AbortController();
4042
- const timeoutId = setTimeout(() => controller.abort(), this.timeout);
4043
- const response = await fetch(this.endpoint, {
4044
- method: "POST",
4045
- headers: {
4046
- "Content-Type": "application/json"
4047
- },
4048
- body: JSON.stringify(properties),
4049
- signal: controller.signal
4050
- });
4051
- clearTimeout(timeoutId);
4052
- if (!response.ok) {
4053
- throw new Error(`HTTP error! status: ${response.status}`);
5020
+ const { langfuseHandler: langfuseHandler2, langfuseInitPromise: langfuseInitPromise2 } = await Promise.resolve().then(() => (init_langfuse(), langfuse_exports));
5021
+ if (this.agentId || this.metadata || this.metadataProvider || this.tagsProvider) {
5022
+ const { initializeLangfuse: initializeLangfuse2 } = await Promise.resolve().then(() => (init_langfuse(), langfuse_exports));
5023
+ await initializeLangfuse2(
5024
+ this.agentId,
5025
+ this.metadata,
5026
+ this.metadataProvider,
5027
+ this.tagsProvider
5028
+ );
5029
+ logger.debug(
5030
+ `ObservabilityManager: Reinitialized Langfuse with agent ID: ${this.agentId}, metadata: ${JSON.stringify(this.metadata)}`
5031
+ );
5032
+ } else {
5033
+ const initPromise = langfuseInitPromise2();
5034
+ if (initPromise) {
5035
+ await initPromise;
5036
+ }
4054
5037
  }
4055
- } catch (error) {
4056
- logger.debug(`Failed to send Scarf event: ${error}`);
5038
+ const handler = langfuseHandler2();
5039
+ if (handler) {
5040
+ this.availableHandlers.push(handler);
5041
+ this.handlerNames.push("Langfuse");
5042
+ logger.debug("ObservabilityManager: Langfuse handler available");
5043
+ }
5044
+ } catch {
5045
+ logger.debug("ObservabilityManager: Langfuse module not available");
4057
5046
  }
5047
+ this.initialized = true;
4058
5048
  }
4059
- };
4060
- function getCacheHome() {
4061
- if (!isNodeJSEnvironment2()) {
4062
- return "/tmp/mcp_use_cache";
4063
- }
4064
- const envVar = process.env.XDG_CACHE_HOME;
4065
- if (envVar && path2.isAbsolute(envVar)) {
4066
- return envVar;
4067
- }
4068
- const platform = process.platform;
4069
- const homeDir = os.homedir();
4070
- if (platform === "win32") {
4071
- const appdata = process.env.LOCALAPPDATA || process.env.APPDATA;
4072
- if (appdata) {
4073
- return appdata;
4074
- }
4075
- return path2.join(homeDir, "AppData", "Local");
4076
- } else if (platform === "darwin") {
4077
- return path2.join(homeDir, "Library", "Caches");
4078
- } else {
4079
- return path2.join(homeDir, ".cache");
4080
- }
4081
- }
4082
- __name(getCacheHome, "getCacheHome");
4083
- var Telemetry = class _Telemetry {
4084
- static {
4085
- __name(this, "Telemetry");
4086
- }
4087
- static instance = null;
4088
- USER_ID_PATH = path2.join(
4089
- getCacheHome(),
4090
- "mcp_use_3",
4091
- "telemetry_user_id"
4092
- );
4093
- VERSION_DOWNLOAD_PATH = path2.join(
4094
- getCacheHome(),
4095
- "mcp_use",
4096
- "download_version"
4097
- );
4098
- PROJECT_API_KEY = "phc_lyTtbYwvkdSbrcMQNPiKiiRWrrM1seyKIMjycSvItEI";
4099
- HOST = "https://eu.i.posthog.com";
4100
- SCARF_GATEWAY_URL = "https://mcpuse.gateway.scarf.sh/events-ts";
4101
- UNKNOWN_USER_ID = "UNKNOWN_USER_ID";
4102
- _currUserId = null;
4103
- _posthogClient = null;
4104
- _scarfClient = null;
4105
- _source = "typescript";
4106
- constructor() {
4107
- const isNodeJS = isNodeJSEnvironment2();
4108
- const telemetryDisabled = typeof process !== "undefined" && process.env?.MCP_USE_ANONYMIZED_TELEMETRY?.toLowerCase() === "false" || false;
4109
- this._source = typeof process !== "undefined" && process.env?.MCP_USE_TELEMETRY_SOURCE || "typescript";
4110
- if (telemetryDisabled) {
4111
- this._posthogClient = null;
4112
- this._scarfClient = null;
4113
- logger.debug("Telemetry disabled via environment variable");
4114
- } else if (!isNodeJS) {
4115
- this._posthogClient = null;
4116
- this._scarfClient = null;
5049
+ /**
5050
+ * Get the list of callbacks to use.
5051
+ * @returns List of callbacks - either custom callbacks if provided, or all available observability handlers.
5052
+ */
5053
+ async getCallbacks() {
5054
+ if (!this.observe) {
4117
5055
  logger.debug(
4118
- "Telemetry disabled - non-Node.js environment detected (e.g., Cloudflare Workers)"
5056
+ "ObservabilityManager: Observability disabled via observe=false"
4119
5057
  );
4120
- } else {
4121
- logger.info(
4122
- "Anonymized telemetry enabled. Set MCP_USE_ANONYMIZED_TELEMETRY=false to disable."
5058
+ return [];
5059
+ }
5060
+ if (this.customCallbacks) {
5061
+ logger.debug(
5062
+ `ObservabilityManager: Using ${this.customCallbacks.length} custom callbacks`
4123
5063
  );
4124
- try {
4125
- this._posthogClient = new import_posthog_node.PostHog(this.PROJECT_API_KEY, {
4126
- host: this.HOST,
4127
- disableGeoip: false
4128
- });
4129
- } catch (e) {
4130
- logger.warn(`Failed to initialize PostHog telemetry: ${e}`);
4131
- this._posthogClient = null;
4132
- }
4133
- try {
4134
- this._scarfClient = new ScarfEventLogger(this.SCARF_GATEWAY_URL, 3e3);
4135
- } catch (e) {
4136
- logger.warn(`Failed to initialize Scarf telemetry: ${e}`);
4137
- this._scarfClient = null;
4138
- }
5064
+ return this.customCallbacks;
4139
5065
  }
4140
- }
4141
- static getInstance() {
4142
- if (!_Telemetry.instance) {
4143
- _Telemetry.instance = new _Telemetry();
5066
+ await this.collectAvailableHandlers();
5067
+ if (this.availableHandlers.length > 0) {
5068
+ logger.debug(
5069
+ `ObservabilityManager: Using ${this.availableHandlers.length} handlers`
5070
+ );
5071
+ } else {
5072
+ logger.debug("ObservabilityManager: No callbacks configured");
4144
5073
  }
4145
- return _Telemetry.instance;
5074
+ return this.availableHandlers;
4146
5075
  }
4147
5076
  /**
4148
- * Set the source identifier for telemetry events.
4149
- * This allows tracking usage from different applications.
4150
- * @param source - The source identifier (e.g., "my-app", "cli", "vs-code-extension")
5077
+ * Get the names of available handlers.
5078
+ * @returns List of handler names (e.g., ["Langfuse", "Laminar"])
4151
5079
  */
4152
- setSource(source) {
4153
- this._source = source;
4154
- logger.debug(`Telemetry source set to: ${source}`);
5080
+ async getHandlerNames() {
5081
+ if (!this.observe) {
5082
+ return [];
5083
+ }
5084
+ if (this.customCallbacks) {
5085
+ return this.customCallbacks.map((cb) => cb.constructor.name);
5086
+ }
5087
+ await this.collectAvailableHandlers();
5088
+ return this.handlerNames;
4155
5089
  }
4156
5090
  /**
4157
- * Get the current source identifier.
5091
+ * Check if any callbacks are available.
5092
+ * @returns True if callbacks are available, False otherwise.
4158
5093
  */
4159
- getSource() {
4160
- return this._source;
4161
- }
4162
- get userId() {
4163
- if (this._currUserId) {
4164
- return this._currUserId;
4165
- }
4166
- if (!isNodeJSEnvironment2()) {
4167
- this._currUserId = this.UNKNOWN_USER_ID;
4168
- return this._currUserId;
4169
- }
4170
- try {
4171
- const isFirstTime = !fs2.existsSync(this.USER_ID_PATH);
4172
- if (isFirstTime) {
4173
- logger.debug(`Creating user ID path: ${this.USER_ID_PATH}`);
4174
- fs2.mkdirSync(path2.dirname(this.USER_ID_PATH), { recursive: true });
4175
- const newUserId = generateUUID();
4176
- fs2.writeFileSync(this.USER_ID_PATH, newUserId);
4177
- this._currUserId = newUserId;
4178
- logger.debug(`User ID path created: ${this.USER_ID_PATH}`);
4179
- } else {
4180
- this._currUserId = fs2.readFileSync(this.USER_ID_PATH, "utf-8").trim();
4181
- }
4182
- this.trackPackageDownload({
4183
- triggered_by: "user_id_property"
4184
- }).catch((e) => logger.debug(`Failed to track package download: ${e}`));
4185
- } catch (e) {
4186
- logger.debug(`Failed to get/create user ID: ${e}`);
4187
- this._currUserId = this.UNKNOWN_USER_ID;
5094
+ async hasCallbacks() {
5095
+ if (!this.observe) {
5096
+ return false;
4188
5097
  }
4189
- return this._currUserId;
5098
+ const callbacks = await this.getCallbacks();
5099
+ return callbacks.length > 0;
4190
5100
  }
4191
- async capture(event) {
4192
- if (!this._posthogClient && !this._scarfClient) {
4193
- return;
4194
- }
4195
- if (this._posthogClient) {
4196
- try {
4197
- const properties = { ...event.properties };
4198
- properties.mcp_use_version = getPackageVersion();
4199
- properties.language = "typescript";
4200
- properties.source = this._source;
4201
- this._posthogClient.capture({
4202
- distinctId: this.userId,
4203
- event: event.name,
4204
- properties
4205
- });
4206
- } catch (e) {
4207
- logger.debug(`Failed to track PostHog event ${event.name}: ${e}`);
4208
- }
4209
- }
4210
- if (this._scarfClient) {
4211
- try {
4212
- const properties = {};
4213
- properties.mcp_use_version = getPackageVersion();
4214
- properties.user_id = this.userId;
4215
- properties.event = event.name;
4216
- properties.language = "typescript";
4217
- properties.source = this._source;
4218
- await this._scarfClient.logEvent(properties);
4219
- } catch (e) {
4220
- logger.debug(`Failed to track Scarf event ${event.name}: ${e}`);
4221
- }
4222
- }
5101
+ /**
5102
+ * Get the current observability status including metadata and tags.
5103
+ * @returns Object containing enabled status, callback count, handler names, metadata, and tags.
5104
+ */
5105
+ async getStatus() {
5106
+ const callbacks = await this.getCallbacks();
5107
+ const handlerNames = await this.getHandlerNames();
5108
+ const currentMetadata = this.metadataProvider ? this.metadataProvider() : this.metadata || {};
5109
+ const currentTags = this.tagsProvider ? this.tagsProvider() : [];
5110
+ return {
5111
+ enabled: this.observe && callbacks.length > 0,
5112
+ callbackCount: callbacks.length,
5113
+ handlerNames,
5114
+ metadata: currentMetadata,
5115
+ tags: currentTags
5116
+ };
4223
5117
  }
4224
- async trackPackageDownload(properties) {
4225
- if (!this._scarfClient) {
4226
- return;
4227
- }
4228
- if (!isNodeJSEnvironment2()) {
4229
- return;
4230
- }
4231
- try {
4232
- const currentVersion = getPackageVersion();
4233
- let shouldTrack = false;
4234
- let firstDownload = false;
4235
- if (!fs2.existsSync(this.VERSION_DOWNLOAD_PATH)) {
4236
- shouldTrack = true;
4237
- firstDownload = true;
4238
- fs2.mkdirSync(path2.dirname(this.VERSION_DOWNLOAD_PATH), {
4239
- recursive: true
4240
- });
4241
- fs2.writeFileSync(this.VERSION_DOWNLOAD_PATH, currentVersion);
4242
- } else {
4243
- const savedVersion = fs2.readFileSync(this.VERSION_DOWNLOAD_PATH, "utf-8").trim();
4244
- if (currentVersion > savedVersion) {
4245
- shouldTrack = true;
4246
- firstDownload = false;
4247
- fs2.writeFileSync(this.VERSION_DOWNLOAD_PATH, currentVersion);
4248
- }
4249
- }
4250
- if (shouldTrack) {
4251
- logger.debug(
4252
- `Tracking package download event with properties: ${JSON.stringify(properties)}`
4253
- );
4254
- const eventProperties = { ...properties || {} };
4255
- eventProperties.mcp_use_version = currentVersion;
4256
- eventProperties.user_id = this.userId;
4257
- eventProperties.event = "package_download";
4258
- eventProperties.first_download = firstDownload;
4259
- eventProperties.language = "typescript";
4260
- eventProperties.source = this._source;
4261
- await this._scarfClient.logEvent(eventProperties);
4262
- }
4263
- } catch (e) {
4264
- logger.debug(`Failed to track Scarf package_download event: ${e}`);
5118
+ /**
5119
+ * Add a callback to the custom callbacks list.
5120
+ * @param callback The callback to add.
5121
+ */
5122
+ addCallback(callback) {
5123
+ if (!this.customCallbacks) {
5124
+ this.customCallbacks = [];
4265
5125
  }
5126
+ this.customCallbacks.push(callback);
5127
+ logger.debug(
5128
+ `ObservabilityManager: Added custom callback: ${callback.constructor.name}`
5129
+ );
4266
5130
  }
4267
- async trackAgentExecution(data) {
4268
- const event = new MCPAgentExecutionEvent(data);
4269
- await this.capture(event);
5131
+ /**
5132
+ * Clear all custom callbacks.
5133
+ */
5134
+ clearCallbacks() {
5135
+ this.customCallbacks = [];
5136
+ logger.debug("ObservabilityManager: Cleared all custom callbacks");
4270
5137
  }
4271
- flush() {
4272
- if (this._posthogClient) {
4273
- try {
4274
- this._posthogClient.flush();
4275
- logger.debug("PostHog client telemetry queue flushed");
4276
- } catch (e) {
4277
- logger.debug(`Failed to flush PostHog client: ${e}`);
5138
+ /**
5139
+ * Flush all pending traces to observability platforms.
5140
+ * Important for serverless environments and short-lived processes.
5141
+ */
5142
+ async flush() {
5143
+ const callbacks = await this.getCallbacks();
5144
+ for (const callback of callbacks) {
5145
+ if ("flushAsync" in callback && typeof callback.flushAsync === "function") {
5146
+ await callback.flushAsync();
4278
5147
  }
4279
5148
  }
4280
- if (this._scarfClient) {
4281
- logger.debug("Scarf telemetry events sent immediately (no flush needed)");
4282
- }
5149
+ logger.debug("ObservabilityManager: All traces flushed");
4283
5150
  }
4284
- shutdown() {
4285
- if (this._posthogClient) {
4286
- try {
4287
- this._posthogClient.shutdown();
4288
- logger.debug("PostHog client shutdown successfully");
4289
- } catch (e) {
4290
- logger.debug(`Error shutting down PostHog client: ${e}`);
5151
+ /**
5152
+ * Shutdown all handlers gracefully (for serverless environments).
5153
+ */
5154
+ async shutdown() {
5155
+ await this.flush();
5156
+ const callbacks = await this.getCallbacks();
5157
+ for (const callback of callbacks) {
5158
+ if ("shutdownAsync" in callback && typeof callback.shutdownAsync === "function") {
5159
+ await callback.shutdownAsync();
5160
+ } else if ("shutdown" in callback && typeof callback.shutdown === "function") {
5161
+ await callback.shutdown();
4291
5162
  }
4292
5163
  }
4293
- if (this._scarfClient) {
4294
- logger.debug("Scarf telemetry client shutdown (no action needed)");
5164
+ logger.debug("ObservabilityManager: All handlers shutdown");
5165
+ }
5166
+ /**
5167
+ * String representation of the ObservabilityManager.
5168
+ */
5169
+ toString() {
5170
+ const names = this.handlerNames;
5171
+ if (names.length > 0) {
5172
+ return `ObservabilityManager(handlers=${names.join(", ")})`;
4295
5173
  }
5174
+ return "ObservabilityManager(no handlers)";
4296
5175
  }
4297
5176
  };
4298
5177
 
@@ -4623,6 +5502,13 @@ var MCPAgent = class {
4623
5502
  static {
4624
5503
  __name(this, "MCPAgent");
4625
5504
  }
5505
+ /**
5506
+ * Get the mcp-use package version.
5507
+ * Works in all environments (Node.js, browser, Cloudflare Workers, Deno, etc.)
5508
+ */
5509
+ static getPackageVersion() {
5510
+ return getPackageVersion();
5511
+ }
4626
5512
  llm;
4627
5513
  client;
4628
5514
  connectors;
@@ -5346,7 +6232,7 @@ var MCPAgent = class {
5346
6232
  const historyToUse = externalHistory ?? this.conversationHistory;
5347
6233
  const langchainHistory = [];
5348
6234
  for (const msg of historyToUse) {
5349
- if (this._isHumanMessageLike(msg) || this._isAIMessageLike(msg)) {
6235
+ if (this._isHumanMessageLike(msg) || this._isAIMessageLike(msg) || this._isToolMessageLike(msg)) {
5350
6236
  langchainHistory.push(msg);
5351
6237
  }
5352
6238
  }
@@ -5479,9 +6365,9 @@ var MCPAgent = class {
5479
6365
  }
5480
6366
  }
5481
6367
  if (this.memoryEnabled) {
5482
- this.addToHistory(new import_langchain2.HumanMessage(query));
5483
- if (finalOutput) {
5484
- this.addToHistory(new import_langchain2.AIMessage(finalOutput));
6368
+ const newMessages = accumulatedMessages.slice(langchainHistory.length);
6369
+ for (const msg of newMessages) {
6370
+ this.addToHistory(msg);
5485
6371
  }
5486
6372
  }
5487
6373
  if (outputSchema && finalOutput) {
@@ -5916,7 +6802,9 @@ ${formatPrompt}`
5916
6802
  let chunkCount = 0;
5917
6803
  for await (const chunk of stream) {
5918
6804
  chunkCount++;
5919
- logger.info(`Chunk ${chunkCount}: ${JSON.stringify(chunk, null, 2)}`);
6805
+ logger.debug(
6806
+ `Chunk ${chunkCount}: ${JSON.stringify(chunk, null, 2)}`
6807
+ );
5920
6808
  if (typeof chunk === "string") {
5921
6809
  try {
5922
6810
  structuredResult = JSON.parse(chunk);
@@ -5933,7 +6821,9 @@ ${formatPrompt}`
5933
6821
  }
5934
6822
  }
5935
6823
  if (chunkCount % 10 === 0) {
5936
- logger.info(`\u{1F504} Structured output streaming: ${chunkCount} chunks`);
6824
+ logger.debug(
6825
+ `\u{1F504} Structured output streaming: ${chunkCount} chunks`
6826
+ );
5937
6827
  }
5938
6828
  }
5939
6829
  logger.info(
@@ -6281,7 +7171,7 @@ var BrowserOAuthClientProvider = class {
6281
7171
  };
6282
7172
 
6283
7173
  // src/auth/callback.ts
6284
- var import_auth = require("@modelcontextprotocol/sdk/client/auth.js");
7174
+ var import_auth = require("@mcp-use/modelcontextprotocol-sdk/client/auth.js");
6285
7175
  async function onMcpAuthorization() {
6286
7176
  const queryParams = new URLSearchParams(window.location.search);
6287
7177
  const code = queryParams.get("code");
@@ -6389,16 +7279,44 @@ async function onMcpAuthorization() {
6389
7279
  );
6390
7280
  }
6391
7281
  try {
6392
- document.body.innerHTML = `
6393
- <div style="font-family: sans-serif; padding: 20px;">
6394
- <h1>Authentication Error</h1>
6395
- <p style="color: red; background-color: #ffebeb; border: 1px solid red; padding: 10px; border-radius: 4px;">
6396
- ${errorMessage}
6397
- </p>
6398
- <p>You can close this window or <a href="#" onclick="window.close(); return false;">click here to close</a>.</p>
6399
- <pre style="font-size: 0.8em; color: #555; margin-top: 20px; white-space: pre-wrap;">${err instanceof Error ? err.stack : ""}</pre>
6400
- </div>
6401
- `;
7282
+ document.body.innerHTML = "";
7283
+ const container = document.createElement("div");
7284
+ container.style.fontFamily = "sans-serif";
7285
+ container.style.padding = "20px";
7286
+ const heading = document.createElement("h1");
7287
+ heading.textContent = "Authentication Error";
7288
+ container.appendChild(heading);
7289
+ const errorPara = document.createElement("p");
7290
+ errorPara.style.color = "red";
7291
+ errorPara.style.backgroundColor = "#ffebeb";
7292
+ errorPara.style.border = "1px solid red";
7293
+ errorPara.style.padding = "10px";
7294
+ errorPara.style.borderRadius = "4px";
7295
+ errorPara.textContent = errorMessage;
7296
+ container.appendChild(errorPara);
7297
+ const closePara = document.createElement("p");
7298
+ closePara.textContent = "You can close this window or ";
7299
+ const closeLink = document.createElement("a");
7300
+ closeLink.href = "#";
7301
+ closeLink.textContent = "click here to close";
7302
+ closeLink.onclick = (e) => {
7303
+ e.preventDefault();
7304
+ window.close();
7305
+ return false;
7306
+ };
7307
+ closePara.appendChild(closeLink);
7308
+ closePara.appendChild(document.createTextNode("."));
7309
+ container.appendChild(closePara);
7310
+ if (err instanceof Error && err.stack) {
7311
+ const stackPre = document.createElement("pre");
7312
+ stackPre.style.fontSize = "0.8em";
7313
+ stackPre.style.color = "#555";
7314
+ stackPre.style.marginTop = "20px";
7315
+ stackPre.style.whiteSpace = "pre-wrap";
7316
+ stackPre.textContent = err.stack;
7317
+ container.appendChild(stackPre);
7318
+ }
7319
+ document.body.appendChild(container);
6402
7320
  } catch (displayError) {
6403
7321
  console.error(
6404
7322
  `${logPrefix} Could not display error in callback window:`,