mcp-use 0.0.6 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +66 -5
  2. package/dist/examples/add_server_tool.d.ts +8 -0
  3. package/dist/examples/add_server_tool.d.ts.map +1 -0
  4. package/dist/examples/add_server_tool.js +65 -0
  5. package/dist/examples/airbnb_use.d.ts +10 -0
  6. package/dist/examples/airbnb_use.d.ts.map +1 -0
  7. package/dist/examples/airbnb_use.js +43 -0
  8. package/dist/examples/blender_use.d.ts +15 -0
  9. package/dist/examples/blender_use.d.ts.map +1 -0
  10. package/dist/examples/blender_use.js +39 -0
  11. package/dist/examples/browser_use.d.ts +10 -0
  12. package/dist/examples/browser_use.d.ts.map +1 -0
  13. package/dist/examples/browser_use.js +46 -0
  14. package/dist/examples/chat_example.d.ts +10 -0
  15. package/dist/examples/chat_example.d.ts.map +1 -0
  16. package/dist/examples/chat_example.js +86 -0
  17. package/dist/examples/filesystem_use.d.ts +11 -0
  18. package/dist/examples/filesystem_use.d.ts.map +1 -0
  19. package/dist/examples/filesystem_use.js +43 -0
  20. package/dist/examples/http_example.d.ts +18 -0
  21. package/dist/examples/http_example.d.ts.map +1 -0
  22. package/dist/examples/http_example.js +36 -0
  23. package/dist/examples/mcp_everything.d.ts +6 -0
  24. package/dist/examples/mcp_everything.d.ts.map +1 -0
  25. package/dist/examples/mcp_everything.js +25 -0
  26. package/dist/examples/multi_server_example.d.ts +10 -0
  27. package/dist/examples/multi_server_example.d.ts.map +1 -0
  28. package/dist/examples/multi_server_example.js +51 -0
  29. package/dist/index.d.ts +2 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +2 -0
  32. package/dist/src/adapters/langchain_adapter.js +1 -1
  33. package/dist/src/agents/index.d.ts +0 -1
  34. package/dist/src/agents/index.d.ts.map +1 -1
  35. package/dist/src/agents/index.js +0 -1
  36. package/dist/src/agents/mcp_agent.d.ts +1 -1
  37. package/dist/src/agents/mcp_agent.d.ts.map +1 -1
  38. package/dist/src/agents/mcp_agent.js +3 -3
  39. package/dist/src/client.d.ts +1 -1
  40. package/dist/src/client.d.ts.map +1 -1
  41. package/dist/src/client.js +6 -3
  42. package/dist/src/connectors/stdio.d.ts.map +1 -1
  43. package/dist/src/connectors/stdio.js +14 -1
  44. package/dist/src/logging.d.ts +15 -4
  45. package/dist/src/logging.d.ts.map +1 -1
  46. package/dist/src/logging.js +71 -38
  47. package/dist/src/managers/index.d.ts +3 -0
  48. package/dist/src/managers/index.d.ts.map +1 -0
  49. package/dist/src/managers/index.js +2 -0
  50. package/dist/src/managers/server_manager.d.ts +16 -0
  51. package/dist/src/managers/server_manager.d.ts.map +1 -0
  52. package/dist/src/managers/server_manager.js +100 -0
  53. package/dist/src/managers/tools/acquire_active_mcp_server.d.ts +13 -0
  54. package/dist/src/managers/tools/acquire_active_mcp_server.d.ts.map +1 -0
  55. package/dist/src/managers/tools/acquire_active_mcp_server.js +17 -0
  56. package/dist/src/managers/tools/add_server.d.ts +21 -0
  57. package/dist/src/managers/tools/add_server.d.ts.map +1 -0
  58. package/dist/src/managers/tools/add_server.js +40 -0
  59. package/dist/src/managers/tools/base.d.ts +24 -0
  60. package/dist/src/managers/tools/base.d.ts.map +1 -0
  61. package/dist/src/managers/tools/base.js +17 -0
  62. package/dist/src/managers/tools/connect_mcp_server.d.ts +26 -0
  63. package/dist/src/managers/tools/connect_mcp_server.d.ts.map +1 -0
  64. package/dist/src/managers/tools/connect_mcp_server.js +46 -0
  65. package/dist/src/managers/tools/index.d.ts +5 -0
  66. package/dist/src/managers/tools/index.d.ts.map +1 -0
  67. package/dist/src/managers/tools/index.js +4 -0
  68. package/dist/src/managers/tools/list_mcp_servers.d.ts +13 -0
  69. package/dist/src/managers/tools/list_mcp_servers.d.ts.map +1 -0
  70. package/dist/src/managers/tools/list_mcp_servers.js +33 -0
  71. package/dist/src/managers/tools/release_mcp_server_connection.d.ts +13 -0
  72. package/dist/src/managers/tools/release_mcp_server_connection.d.ts.map +1 -0
  73. package/dist/src/managers/tools/release_mcp_server_connection.js +19 -0
  74. package/dist/src/session.d.ts +1 -9
  75. package/dist/src/session.d.ts.map +1 -1
  76. package/dist/src/session.js +1 -30
  77. package/package.json +52 -21
  78. package/dist/src/agents/server_manager.d.ts +0 -22
  79. package/dist/src/agents/server_manager.d.ts.map +0 -1
  80. package/dist/src/agents/server_manager.js +0 -152
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Example demonstrating how to use MCPClient with multiple servers.
3
+ *
4
+ * This example shows how to:
5
+ * 1. Configure multiple MCP servers
6
+ * 2. Create and manage sessions for each server
7
+ * 3. Use tools from different servers in a single agent
8
+ */
9
+ import { ChatAnthropic } from '@langchain/anthropic';
10
+ import { config } from 'dotenv';
11
+ import { MCPAgent, MCPClient } from '../index.js';
12
+ // Load environment variables from .env file
13
+ config();
14
+ async function runMultiServerExample() {
15
+ // Create a configuration with multiple servers
16
+ const config = {
17
+ mcpServers: {
18
+ airbnb: {
19
+ command: 'npx',
20
+ args: ['-y', '@openbnb/mcp-server-airbnb', '--ignore-robots-txt'],
21
+ },
22
+ playwright: {
23
+ command: 'npx',
24
+ args: ['@playwright/mcp@latest'],
25
+ env: { DISPLAY: ':1' },
26
+ },
27
+ filesystem: {
28
+ command: 'npx',
29
+ args: [
30
+ '-y',
31
+ '@modelcontextprotocol/server-filesystem',
32
+ 'YOUR_DIRECTORY_HERE',
33
+ ],
34
+ },
35
+ },
36
+ };
37
+ // Create MCPClient with the multi-server configuration
38
+ const client = MCPClient.fromDict(config);
39
+ // Create LLM
40
+ const llm = new ChatAnthropic({ model: 'claude-3-5-sonnet-20240620' });
41
+ // Create agent with the client
42
+ const agent = new MCPAgent({ llm, client, maxSteps: 30 });
43
+ // Example 1: Using tools from different servers in a single query
44
+ const result = await agent.run('Search for a nice place to stay in Barcelona on Airbnb, '
45
+ + 'then use Google to find nearby restaurants and attractions.'
46
+ + 'Write the result in the current directory in restarant.txt', 30);
47
+ console.log(result);
48
+ }
49
+ if (import.meta.url === `file://${process.argv[1]}`) {
50
+ runMultiServerExample().catch(console.error);
51
+ }
package/dist/index.d.ts CHANGED
@@ -7,5 +7,7 @@ import { StdioConnector } from './src/connectors/stdio.js';
7
7
  import { WebSocketConnector } from './src/connectors/websocket.js';
8
8
  import { Logger, logger } from './src/logging.js';
9
9
  import { MCPSession } from './src/session.js';
10
+ export { BaseAdapter, LangChainAdapter } from './src/adapters/index.js';
11
+ export { ServerManager } from './src/managers/server_manager.js';
10
12
  export { BaseConnector, HttpConnector, loadConfigFile, Logger, logger, MCPAgent, MCPClient, MCPSession, StdioConnector, WebSocketConnector };
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAEhE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAA"}
package/dist/index.js CHANGED
@@ -7,4 +7,6 @@ import { StdioConnector } from './src/connectors/stdio.js';
7
7
  import { WebSocketConnector } from './src/connectors/websocket.js';
8
8
  import { Logger, logger } from './src/logging.js';
9
9
  import { MCPSession } from './src/session.js';
10
+ export { BaseAdapter, LangChainAdapter } from './src/adapters/index.js';
11
+ export { ServerManager } from './src/managers/server_manager.js';
10
12
  export { BaseConnector, HttpConnector, loadConfigFile, Logger, logger, MCPAgent, MCPClient, MCPSession, StdioConnector, WebSocketConnector };
@@ -80,7 +80,7 @@ export class LangChainAdapter extends BaseAdapter {
80
80
  return parseMcpToolResult(result);
81
81
  }
82
82
  catch (err) {
83
- logger.error(`Error executing MCP tool: ${err}`);
83
+ logger.error(`Error executing MCP tool: ${err.message}`);
84
84
  return `Error executing MCP tool: ${String(err)}`;
85
85
  }
86
86
  },
@@ -1,4 +1,3 @@
1
1
  export { BaseAgent } from './base.js';
2
2
  export { MCPAgent } from './mcp_agent.js';
3
- export { ServerManager } from './server_manager.js';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
@@ -1,3 +1,2 @@
1
1
  export { BaseAgent } from './base.js';
2
2
  export { MCPAgent } from './mcp_agent.js';
3
- export { ServerManager } from './server_manager.js';
@@ -2,7 +2,7 @@ import type { BaseLanguageModelInterface } from '@langchain/core/language_models
2
2
  import type { BaseMessage } from '@langchain/core/messages';
3
3
  import type { MCPClient } from '../client.js';
4
4
  import type { BaseConnector } from '../connectors/base.js';
5
- import type { ServerManager } from './server_manager.js';
5
+ import type { ServerManager } from '../managers/server_manager.js';
6
6
  import { SystemMessage } from '@langchain/core/messages';
7
7
  import { LangChainAdapter } from '../adapters/langchain_adapter.js';
8
8
  export declare class MCPAgent {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp_agent.d.ts","sourceRoot":"","sources":["../../../src/agents/mcp_agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAqB,MAAM,sCAAsC,CAAA;AACzG,OAAO,KAAK,EACV,WAAW,EACZ,MAAM,0BAA0B,CAAA;AAGjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAGL,aAAa,EACd,MAAM,0BAA0B,CAAA;AAUjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAKnE,qBAAa,QAAQ;IACnB,OAAO,CAAC,GAAG,CAA4B;IACvC,OAAO,CAAC,MAAM,CAAC,CAAW;IAC1B,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,4BAA4B,CAAC,CAAe;IACpD,OAAO,CAAC,sBAAsB,CAAC,CAAe;IAE9C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,aAAa,CAA6B;gBAEtC,OAAO,EAAE;QACnB,GAAG,EAAE,0BAA0B,CAAA;QAC/B,MAAM,CAAC,EAAE,SAAS,CAAA;QAClB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,aAAa,CAAC,EAAE,OAAO,CAAA;QACvB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC5B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACpC,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACtC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;QAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,OAAO,CAAC,EAAE,gBAAgB,CAAA;QAC1B,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,aAAa,CAAA;KAC5D;IAkCY,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YA8D1B,4BAA4B;IAuB1C,OAAO,CAAC,WAAW;IAyBZ,sBAAsB,IAAI,WAAW,EAAE;IAIvC,wBAAwB,IAAI,IAAI;IAIvC,OAAO,CAAC,YAAY;IAKb,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAIxC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAavC,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI;IAQnD,kBAAkB,IAAI,MAAM,EAAE;IAIxB,GAAG,CACd,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,eAAe,UAAO,EACtB,eAAe,CAAC,EAAE,WAAW,EAAE,GAC9B,OAAO,CAAC,MAAM,CAAC;IAyJL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAyBpC"}
1
+ {"version":3,"file":"mcp_agent.d.ts","sourceRoot":"","sources":["../../../src/agents/mcp_agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAqB,MAAM,sCAAsC,CAAA;AACzG,OAAO,KAAK,EACV,WAAW,EACZ,MAAM,0BAA0B,CAAA;AAGjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAElE,OAAO,EAGL,aAAa,EACd,MAAM,0BAA0B,CAAA;AAUjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAKnE,qBAAa,QAAQ;IACnB,OAAO,CAAC,GAAG,CAA4B;IACvC,OAAO,CAAC,MAAM,CAAC,CAAW;IAC1B,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,4BAA4B,CAAC,CAAe;IACpD,OAAO,CAAC,sBAAsB,CAAC,CAAe;IAE9C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,aAAa,CAA6B;gBAEtC,OAAO,EAAE;QACnB,GAAG,EAAE,0BAA0B,CAAA;QAC/B,MAAM,CAAC,EAAE,SAAS,CAAA;QAClB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,aAAa,CAAC,EAAE,OAAO,CAAA;QACvB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC5B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACpC,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACtC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;QAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,OAAO,CAAC,EAAE,gBAAgB,CAAA;QAC1B,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,aAAa,CAAA;KAC5D;IAkCY,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YA8D1B,4BAA4B;IAuB1C,OAAO,CAAC,WAAW;IAyBZ,sBAAsB,IAAI,WAAW,EAAE;IAIvC,wBAAwB,IAAI,IAAI;IAIvC,OAAO,CAAC,YAAY;IAKb,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAIxC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAavC,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI;IAQnD,kBAAkB,IAAI,MAAM,EAAE;IAIxB,GAAG,CACd,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,eAAe,UAAO,EACtB,eAAe,CAAC,EAAE,WAAW,EAAE,GAC9B,OAAO,CAAC,MAAM,CAAC;IAyJL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAyBpC"}
@@ -63,7 +63,7 @@ export class MCPAgent {
63
63
  if (this.useServerManager && this.serverManager) {
64
64
  await this.serverManager.initialize();
65
65
  // Get server management tools
66
- const managementTools = await this.serverManager.getServerManagementTools();
66
+ const managementTools = this.serverManager.tools;
67
67
  this.tools = managementTools;
68
68
  logger.info(`🔧 Server manager mode active with ${managementTools.length} management tools`);
69
69
  // Create the system message based on available tools
@@ -209,7 +209,7 @@ export class MCPAgent {
209
209
  logger.info(`🏁 Starting agent execution with max_steps=${steps}`);
210
210
  for (let stepNum = 0; stepNum < steps; stepNum++) {
211
211
  if (this.useServerManager && this.serverManager) {
212
- const currentTools = await this.serverManager.getAllTools();
212
+ const currentTools = this.serverManager.tools;
213
213
  const currentToolNames = new Set(currentTools.map(t => t.name));
214
214
  const existingToolNames = new Set(this.tools.map(t => t.name));
215
215
  const changed = currentTools.length !== this.tools.length
@@ -223,7 +223,7 @@ export class MCPAgent {
223
223
  nameToToolMap = Object.fromEntries(this.tools.map(t => [t.name, t]));
224
224
  }
225
225
  }
226
- logger.info(`🔍 Step ${stepNum + 1}/${steps}`);
226
+ logger.info(`👣 Step ${stepNum + 1}/${steps}`);
227
227
  try {
228
228
  logger.debug('Starting agent step execution');
229
229
  const nextStepOutput = await this.agentExecutor._takeNextStep(nameToToolMap, inputs, intermediateSteps);
@@ -12,7 +12,7 @@ export declare class MCPClient {
12
12
  saveConfig(filepath: string): void;
13
13
  createSession(serverName: string, autoInitialize?: boolean): Promise<MCPSession>;
14
14
  createAllSessions(autoInitialize?: boolean): Promise<Record<string, MCPSession>>;
15
- getSession(serverName: string): MCPSession;
15
+ getSession(serverName: string): MCPSession | null;
16
16
  getAllActiveSessions(): Record<string, MCPSession>;
17
17
  closeSession(serverName: string): Promise<void>;
18
18
  closeAllSessions(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAiC;IAC1C,cAAc,EAAE,MAAM,EAAE,CAAK;gBAExB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;WAWnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS;WAI7C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAI9C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAKhE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOhC,cAAc,IAAI,MAAM,EAAE;IAI1B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ5B,aAAa,CACxB,UAAU,EAAE,MAAM,EAClB,cAAc,UAAO,GACpB,OAAO,CAAC,UAAU,CAAC;IAwBT,iBAAiB,CAC5B,cAAc,UAAO,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAc/B,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;IAQ1C,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;IAM5C,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB/C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB/C"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAiC;IAC1C,cAAc,EAAE,MAAM,EAAE,CAAK;gBAExB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;WAWnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS;WAI7C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAI9C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAKhE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOhC,cAAc,IAAI,MAAM,EAAE;IAI1B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ5B,aAAa,CACxB,UAAU,EAAE,MAAM,EAClB,cAAc,UAAO,GACpB,OAAO,CAAC,UAAU,CAAC;IAwBT,iBAAiB,CAC5B,cAAc,UAAO,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAc/B,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAWjD,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;IAM5C,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB/C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB/C"}
@@ -46,7 +46,7 @@ export class MCPClient {
46
46
  async createSession(serverName, autoInitialize = true) {
47
47
  const servers = this.config.mcpServers ?? {};
48
48
  if (Object.keys(servers).length === 0) {
49
- throw new Error('No MCP servers defined in config');
49
+ logger.warn('No MCP servers defined in config');
50
50
  }
51
51
  if (!servers[serverName]) {
52
52
  throw new Error(`Server '${serverName}' not found in config`);
@@ -65,7 +65,7 @@ export class MCPClient {
65
65
  async createAllSessions(autoInitialize = true) {
66
66
  const servers = this.config.mcpServers ?? {};
67
67
  if (Object.keys(servers).length === 0) {
68
- throw new Error('No MCP servers defined in config');
68
+ logger.warn('No MCP servers defined in config');
69
69
  }
70
70
  for (const name of Object.keys(servers)) {
71
71
  await this.createSession(name, autoInitialize);
@@ -74,8 +74,11 @@ export class MCPClient {
74
74
  }
75
75
  getSession(serverName) {
76
76
  const session = this.sessions[serverName];
77
+ // if (!session) {
78
+ // throw new Error(`No session exists for server '${serverName}'`)
79
+ // }
77
80
  if (!session) {
78
- throw new Error(`No session exists for server '${serverName}'`);
81
+ return null;
79
82
  }
80
83
  return session;
81
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/connectors/stdio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAMrD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IACjE,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/C;AAED,qBAAa,cAAe,SAAQ,aAAa;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmC;gBAG5D,EACE,OAAe,EACf,IAAS,EACT,GAAG,EACH,MAAuB,EACvB,GAAG,IAAI,EACR,GAAE;QACD,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC5B,MAAM,CAAC,EAAE,QAAQ,CAAA;KAClB,GAAG,qBAA0B;IAWhC,sDAAsD;IAChD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAiC/B"}
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/connectors/stdio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAMrD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IACjE,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/C;AAED,qBAAa,cAAe,SAAQ,aAAa;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmC;gBAG5D,EACE,OAAe,EACf,IAAS,EACT,GAAG,EACH,MAAuB,EACvB,GAAG,IAAI,EACR,GAAE;QACD,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC5B,MAAM,CAAC,EAAE,QAAQ,CAAA;KAClB,GAAG,qBAA0B;IAWhC,sDAAsD;IAChD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA+C/B"}
@@ -26,10 +26,23 @@ export class StdioConnector extends BaseConnector {
26
26
  logger.debug(`Connecting to MCP implementation via stdio: ${this.command}`);
27
27
  try {
28
28
  // 1. Build server parameters for the transport
29
+ // Merge env with process.env, filtering out undefined values
30
+ let mergedEnv;
31
+ if (this.env) {
32
+ mergedEnv = {};
33
+ // First add process.env values (excluding undefined)
34
+ for (const [key, value] of Object.entries(process.env)) {
35
+ if (value !== undefined) {
36
+ mergedEnv[key] = value;
37
+ }
38
+ }
39
+ // Then override with provided env
40
+ Object.assign(mergedEnv, this.env);
41
+ }
29
42
  const serverParams = {
30
43
  command: this.command,
31
44
  args: this.args,
32
- env: this.env,
45
+ env: mergedEnv,
33
46
  };
34
47
  // 2. Start the connection manager -> returns a live transport
35
48
  this.connectionManager = new StdioConnectionManager(serverParams, this.errlog);
@@ -1,9 +1,20 @@
1
1
  import type { Logger as WinstonLogger } from 'winston';
2
+ export type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug' | 'silly';
3
+ interface LoggerOptions {
4
+ level?: LogLevel;
5
+ console?: boolean;
6
+ file?: string;
7
+ format?: 'minimal' | 'detailed' | 'emoji';
8
+ }
2
9
  export declare class Logger {
3
- private static loggers;
4
- static getLogger(name?: string): WinstonLogger;
5
- static configure(level?: string, toConsole?: boolean, toFile?: string): void;
6
- static setDebug(debugLevel?: number): void;
10
+ private static instances;
11
+ private static currentFormat;
12
+ static get(name?: string): WinstonLogger;
13
+ private static getFormatter;
14
+ static configure(options?: LoggerOptions): void;
15
+ static setDebug(enabled: boolean | 0 | 1 | 2): void;
16
+ static setFormat(format: 'minimal' | 'detailed' | 'emoji'): void;
7
17
  }
8
18
  export declare const logger: WinstonLogger;
19
+ export {};
9
20
  //# sourceMappingURL=logging.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/logging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AAqBtD,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAoC;WAE5C,SAAS,CAAC,IAAI,GAAE,MAAkB,GAAG,aAAa;WAelD,SAAS,CACrB,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,GAAE,OAAc,EACzB,MAAM,CAAC,EAAE,MAAM,GACd,IAAI;WA0BO,QAAQ,CAAC,UAAU,GAAE,MAAU,GAAG,IAAI;CAarD;AAID,eAAO,MAAM,MAAM,eAAqB,CAAA"}
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/logging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AAOtD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAA;AAEzF,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;CAC1C;AA2BD,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAoC;IAC5D,OAAO,CAAC,MAAM,CAAC,aAAa,CAA8C;WAE5D,GAAG,CAAC,IAAI,GAAE,MAA4B,GAAG,aAAa;IAkBpE,OAAO,CAAC,MAAM,CAAC,YAAY;WAab,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,IAAI;WAoC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI;WAc5C,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,IAAI;CAIxE;AAGD,eAAO,MAAM,MAAM,eAAe,CAAA"}
@@ -1,59 +1,92 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { createLogger, format, transports } from 'winston';
4
- const { combine, timestamp, label, printf } = format;
5
- let MCP_USE_DEBUG = 0;
6
- const debugEnv = process.env.DEBUG?.toLowerCase();
7
- if (debugEnv === '2') {
8
- MCP_USE_DEBUG = 2;
9
- }
10
- else if (debugEnv === '1') {
11
- MCP_USE_DEBUG = 1;
4
+ const { combine, timestamp, label, printf, colorize, splat } = format;
5
+ const DEFAULT_LOGGER_NAME = 'mcp-use';
6
+ function resolveLevel(env) {
7
+ switch (env?.trim()) {
8
+ case '2':
9
+ return 'debug';
10
+ case '1':
11
+ return 'info';
12
+ default:
13
+ return 'warn';
14
+ }
12
15
  }
13
- const defaultFormat = printf(({ level, message, label, timestamp }) => `${timestamp} [${label}] ${level.toUpperCase()}: ${message}`);
16
+ const minimalFormatter = printf(({ level, message, label, timestamp }) => {
17
+ return `${timestamp} [${label}] ${level}: ${message}`;
18
+ });
19
+ const detailedFormatter = printf(({ level, message, label, timestamp }) => {
20
+ return `${timestamp} [${label}] ${level.toUpperCase()}: ${message}`;
21
+ });
22
+ const emojiFormatter = printf(({ level, message, label, timestamp }) => {
23
+ return `${timestamp} [${label}] ${level.toUpperCase()}: ${message}`;
24
+ });
14
25
  export class Logger {
15
- static loggers = {};
16
- static getLogger(name = 'mcp_use') {
17
- if (!this.loggers[name]) {
18
- this.loggers[name] = createLogger({
19
- level: 'warn',
20
- format: combine(label({ label: name }), timestamp(), defaultFormat),
26
+ static instances = {};
27
+ static currentFormat = 'minimal';
28
+ static get(name = DEFAULT_LOGGER_NAME) {
29
+ if (!this.instances[name]) {
30
+ this.instances[name] = createLogger({
31
+ level: resolveLevel(process.env.DEBUG),
32
+ format: combine(colorize(), splat(), label({ label: name }), timestamp({ format: 'HH:mm:ss' }), this.getFormatter()),
21
33
  transports: [],
22
34
  });
23
35
  }
24
- return this.loggers[name];
36
+ return this.instances[name];
25
37
  }
26
- static configure(level, toConsole = true, toFile) {
27
- const root = this.getLogger();
28
- if (!level) {
29
- level
30
- = MCP_USE_DEBUG === 2
31
- ? 'debug'
32
- : MCP_USE_DEBUG === 1 ? 'info' : 'warn';
38
+ static getFormatter() {
39
+ switch (this.currentFormat) {
40
+ case 'minimal':
41
+ return minimalFormatter;
42
+ case 'detailed':
43
+ return detailedFormatter;
44
+ case 'emoji':
45
+ return emojiFormatter;
46
+ default:
47
+ return minimalFormatter;
33
48
  }
34
- root.level = level;
49
+ }
50
+ static configure(options = {}) {
51
+ const { level, console = true, file, format = 'minimal' } = options;
52
+ const resolvedLevel = level ?? resolveLevel(process.env.DEBUG);
53
+ this.currentFormat = format;
54
+ const root = this.get();
55
+ root.level = resolvedLevel;
35
56
  root.clear();
36
- if (toConsole) {
57
+ if (console) {
37
58
  root.add(new transports.Console());
38
59
  }
39
- if (toFile) {
40
- const dir = path.dirname(toFile);
41
- if (dir && !fs.existsSync(dir)) {
60
+ if (file) {
61
+ const dir = path.dirname(path.resolve(file));
62
+ if (!fs.existsSync(dir)) {
42
63
  fs.mkdirSync(dir, { recursive: true });
43
64
  }
44
- root.add(new transports.File({ filename: toFile }));
65
+ root.add(new transports.File({ filename: file }));
45
66
  }
67
+ // Update all existing loggers with new format
68
+ Object.values(this.instances).forEach((logger) => {
69
+ logger.level = resolvedLevel;
70
+ logger.format = combine(colorize(), splat(), label({ label: DEFAULT_LOGGER_NAME }), timestamp({ format: 'HH:mm:ss' }), this.getFormatter());
71
+ });
46
72
  }
47
- static setDebug(debugLevel = 2) {
48
- MCP_USE_DEBUG = debugLevel;
49
- process.env.LANGCHAIN_VERBOSE = debugLevel >= 1 ? 'true' : 'false';
50
- const newLevel = debugLevel === 2
51
- ? 'debug'
52
- : debugLevel === 1 ? 'info' : 'warn';
53
- Object.values(this.loggers).forEach((log) => {
54
- log.level = newLevel;
73
+ static setDebug(enabled) {
74
+ let level;
75
+ if (enabled === 2 || enabled === true)
76
+ level = 'debug';
77
+ else if (enabled === 1)
78
+ level = 'info';
79
+ else
80
+ level = 'warn';
81
+ Object.values(this.instances).forEach((logger) => {
82
+ logger.level = level;
55
83
  });
84
+ process.env.DEBUG = enabled ? (enabled === true ? '2' : String(enabled)) : '0';
85
+ }
86
+ static setFormat(format) {
87
+ this.currentFormat = format;
88
+ this.configure({ format });
56
89
  }
57
90
  }
58
91
  Logger.configure();
59
- export const logger = Logger.getLogger();
92
+ export const logger = Logger.get();
@@ -0,0 +1,3 @@
1
+ export * from './server_manager.js';
2
+ export * from './tools/index.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/managers/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './server_manager.js';
2
+ export * from './tools/index.js';
@@ -0,0 +1,16 @@
1
+ import type { StructuredToolInterface } from '@langchain/core/tools';
2
+ import type { LangChainAdapter } from '../adapters/langchain_adapter.js';
3
+ import type { MCPClient } from '../client.js';
4
+ export declare class ServerManager {
5
+ readonly initializedServers: Record<string, boolean>;
6
+ readonly serverTools: Record<string, StructuredToolInterface[]>;
7
+ readonly client: MCPClient;
8
+ readonly adapter: LangChainAdapter;
9
+ activeServer: string | null;
10
+ constructor(client: MCPClient, adapter: LangChainAdapter);
11
+ logState(context: string): void;
12
+ initialize(): void;
13
+ prefetchServerTools(): Promise<void>;
14
+ get tools(): StructuredToolInterface[];
15
+ }
16
+ //# sourceMappingURL=server_manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server_manager.d.ts","sourceRoot":"","sources":["../../../src/managers/server_manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAW7C,qBAAa,aAAa;IACxB,SAAgB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAK;IAChE,SAAgB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAK;IAE3E,SAAgB,MAAM,EAAE,SAAS,CAAA;IACjC,SAAgB,OAAO,EAAE,gBAAgB,CAAA;IAClC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAO;gBAE7B,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB;IAKjD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAqBtC,UAAU,IAAI,IAAI;IAOZ,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD1C,IAAI,KAAK,IAAI,uBAAuB,EAAE,CAsBrC;CACF"}
@@ -0,0 +1,100 @@
1
+ import { isEqual } from 'lodash-es';
2
+ import { logger } from '../logging.js';
3
+ import { AcquireActiveMCPServerTool } from './tools/acquire_active_mcp_server.js';
4
+ import { AddMCPServerTool } from './tools/add_server.js';
5
+ import { ConnectMCPServerTool } from './tools/connect_mcp_server.js';
6
+ import { ListMCPServersTool } from './tools/list_mcp_servers.js';
7
+ import { ReleaseMCPServerConnectionTool } from './tools/release_mcp_server_connection.js';
8
+ export class ServerManager {
9
+ initializedServers = {};
10
+ serverTools = {};
11
+ client;
12
+ adapter;
13
+ activeServer = null;
14
+ constructor(client, adapter) {
15
+ this.client = client;
16
+ this.adapter = adapter;
17
+ }
18
+ logState(context) {
19
+ const allServerNames = this.client.getServerNames();
20
+ const activeSessionNames = Object.keys(this.client.getAllActiveSessions());
21
+ if (allServerNames.length === 0) {
22
+ logger.info('Server Manager State: No servers configured.');
23
+ return;
24
+ }
25
+ const tableData = allServerNames.map(name => ({
26
+ 'Server Name': name,
27
+ 'Connected': activeSessionNames.includes(name) ? '✅' : '❌',
28
+ 'Initialized': this.initializedServers[name] ? '✅' : '❌',
29
+ 'Tool Count': this.serverTools[name]?.length ?? 0,
30
+ 'Active': this.activeServer === name ? '✅' : '❌',
31
+ }));
32
+ logger.info(`Server Manager State: [${context}]`);
33
+ console.table(tableData); // eslint-disable-line no-console
34
+ }
35
+ initialize() {
36
+ const serverNames = this.client.getServerNames?.();
37
+ if (serverNames.length === 0) {
38
+ logger.warn('No MCP servers defined in client configuration');
39
+ }
40
+ }
41
+ async prefetchServerTools() {
42
+ const servers = this.client.getServerNames();
43
+ for (const serverName of servers) {
44
+ try {
45
+ let session = null;
46
+ session = this.client.getSession(serverName);
47
+ logger.debug(`Using existing session for server '${serverName}' to prefetch tools.`);
48
+ if (!session) {
49
+ session = await this.client.createSession(serverName).catch((createSessionError) => {
50
+ logger.warn(`Could not create session for '${serverName}' during prefetch: ${createSessionError}`);
51
+ return null;
52
+ });
53
+ logger.debug(`Temporarily created session for '${serverName}' to prefetch tools.`);
54
+ }
55
+ if (session) {
56
+ const connector = session.connector;
57
+ let tools = [];
58
+ try {
59
+ tools = await this.adapter.createToolsFromConnectors([connector]);
60
+ }
61
+ catch (toolFetchError) {
62
+ logger.error(`Failed to create tools from connector for server '${serverName}': ${toolFetchError}`);
63
+ continue;
64
+ }
65
+ const cachedTools = this.serverTools[serverName];
66
+ const toolsChanged = !cachedTools || !isEqual(cachedTools, tools);
67
+ if (toolsChanged) {
68
+ this.serverTools[serverName] = tools;
69
+ this.initializedServers[serverName] = true;
70
+ logger.debug(`Prefetched ${tools.length} tools for server '${serverName}'.`);
71
+ }
72
+ else {
73
+ logger.debug(`Tools for server '${serverName}' unchanged, using cached version.`);
74
+ }
75
+ }
76
+ }
77
+ catch (outerError) {
78
+ logger.error(`Error prefetching tools for server '${serverName}': ${outerError}`);
79
+ }
80
+ }
81
+ }
82
+ get tools() {
83
+ if (logger.level === 'debug') {
84
+ this.logState('Providing tools to agent');
85
+ }
86
+ const managementTools = [
87
+ new AddMCPServerTool(this),
88
+ new ListMCPServersTool(this),
89
+ new ConnectMCPServerTool(this),
90
+ new AcquireActiveMCPServerTool(this),
91
+ new ReleaseMCPServerConnectionTool(this),
92
+ ];
93
+ if (this.activeServer && this.serverTools[this.activeServer]) {
94
+ const activeTools = this.serverTools[this.activeServer];
95
+ logger.debug(`Adding ${activeTools.length} tools from active server '${this.activeServer}'`);
96
+ return [...managementTools, ...activeTools];
97
+ }
98
+ return managementTools;
99
+ }
100
+ }
@@ -0,0 +1,13 @@
1
+ import type { ServerManager } from '../server_manager.js';
2
+ import { z } from 'zod';
3
+ import { MCPServerTool } from './base.js';
4
+ declare const PresentActiveServerSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
5
+ export declare class AcquireActiveMCPServerTool extends MCPServerTool<typeof PresentActiveServerSchema> {
6
+ name: string;
7
+ description: string;
8
+ schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
9
+ constructor(manager: ServerManager);
10
+ _call(): Promise<string>;
11
+ }
12
+ export {};
13
+ //# sourceMappingURL=acquire_active_mcp_server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acquire_active_mcp_server.d.ts","sourceRoot":"","sources":["../../../../src/managers/tools/acquire_active_mcp_server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,QAAA,MAAM,yBAAyB,gDAAe,CAAA;AAE9C,qBAAa,0BAA2B,SAAQ,aAAa,CAAC,OAAO,yBAAyB,CAAC;IACpF,IAAI,SAA0B;IAC9B,WAAW,SAAiE;IAC5E,MAAM,iDAA4B;gBAE/B,OAAO,EAAE,aAAa;IAI5B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAO/B"}
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ import { MCPServerTool } from './base.js';
3
+ const PresentActiveServerSchema = z.object({});
4
+ export class AcquireActiveMCPServerTool extends MCPServerTool {
5
+ name = 'get_active_mcp_server';
6
+ description = 'Get the currently active MCP (Model Context Protocol) server';
7
+ schema = PresentActiveServerSchema;
8
+ constructor(manager) {
9
+ super(manager);
10
+ }
11
+ async _call() {
12
+ if (!this.manager.activeServer) {
13
+ return `No MCP server is currently active. Use connect_to_mcp_server to connect to a server.`;
14
+ }
15
+ return `Currently active MCP server: ${this.manager.activeServer}`;
16
+ }
17
+ }
@@ -0,0 +1,21 @@
1
+ import type { ServerManager } from '../server_manager.js';
2
+ import { StructuredTool } from 'langchain/tools';
3
+ import { z } from 'zod';
4
+ export declare class AddMCPServerTool extends StructuredTool {
5
+ name: string;
6
+ description: string;
7
+ schema: z.ZodObject<{
8
+ serverName: z.ZodString;
9
+ serverConfig: z.ZodAny;
10
+ }, "strip", z.ZodTypeAny, {
11
+ serverName: string;
12
+ serverConfig?: any;
13
+ }, {
14
+ serverName: string;
15
+ serverConfig?: any;
16
+ }>;
17
+ private manager;
18
+ constructor(manager: ServerManager);
19
+ protected _call({ serverName, serverConfig, }: z.infer<typeof this.schema>): Promise<string>;
20
+ }
21
+ //# sourceMappingURL=add_server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add_server.d.ts","sourceRoot":"","sources":["../../../../src/managers/tools/add_server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,qBAAa,gBAAiB,SAAQ,cAAc;IAClD,IAAI,SAAmB;IACvB,WAAW,SAC8E;IAEzF,MAAM;;;;;;;;;OAOJ;IAEF,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,EAAE,aAAa;cAKlB,KAAK,CAAC,EACpB,UAAU,EACV,YAAY,GACb,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CA6BjD"}