mcp-use 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -5
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/src/adapters/langchain_adapter.js +1 -1
- package/dist/src/agents/index.d.ts +0 -1
- package/dist/src/agents/index.d.ts.map +1 -1
- package/dist/src/agents/index.js +0 -1
- package/dist/src/agents/mcp_agent.d.ts +1 -1
- package/dist/src/agents/mcp_agent.d.ts.map +1 -1
- package/dist/src/agents/mcp_agent.js +3 -3
- package/dist/src/client.d.ts +1 -1
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +6 -3
- package/dist/src/logging.d.ts +15 -4
- package/dist/src/logging.d.ts.map +1 -1
- package/dist/src/logging.js +71 -38
- package/dist/src/managers/index.d.ts +3 -0
- package/dist/src/managers/index.d.ts.map +1 -0
- package/dist/src/managers/index.js +2 -0
- package/dist/src/managers/server_manager.d.ts +15 -0
- package/dist/src/managers/server_manager.d.ts.map +1 -0
- package/dist/src/managers/server_manager.js +72 -0
- package/dist/src/managers/tools/acquire_active_mcp_server.d.ts +13 -0
- package/dist/src/managers/tools/acquire_active_mcp_server.d.ts.map +1 -0
- package/dist/src/managers/tools/acquire_active_mcp_server.js +17 -0
- package/dist/src/managers/tools/base.d.ts +24 -0
- package/dist/src/managers/tools/base.d.ts.map +1 -0
- package/dist/src/managers/tools/base.js +17 -0
- package/dist/src/managers/tools/connect_mcp_server.d.ts +26 -0
- package/dist/src/managers/tools/connect_mcp_server.d.ts.map +1 -0
- package/dist/src/managers/tools/connect_mcp_server.js +46 -0
- package/dist/src/managers/tools/index.d.ts +5 -0
- package/dist/src/managers/tools/index.d.ts.map +1 -0
- package/dist/src/managers/tools/index.js +4 -0
- package/dist/src/managers/tools/list_mcp_servers.d.ts +13 -0
- package/dist/src/managers/tools/list_mcp_servers.d.ts.map +1 -0
- package/dist/src/managers/tools/list_mcp_servers.js +33 -0
- package/dist/src/managers/tools/release_mcp_server_connection.d.ts +13 -0
- package/dist/src/managers/tools/release_mcp_server_connection.d.ts.map +1 -0
- package/dist/src/managers/tools/release_mcp_server_connection.js +19 -0
- package/dist/src/session.d.ts +1 -9
- package/dist/src/session.d.ts.map +1 -1
- package/dist/src/session.js +1 -30
- package/package.json +36 -21
- package/dist/src/agents/server_manager.d.ts +0 -22
- package/dist/src/agents/server_manager.d.ts.map +0 -1
- package/dist/src/agents/server_manager.js +0 -152
package/README.md
CHANGED
@@ -1,10 +1,31 @@
|
|
1
|
+
<div align="center" style="margin: 0 auto; max-width: 80%;">
|
2
|
+
<picture>
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="./static/logo_white.svg">
|
4
|
+
<source media="(prefers-color-scheme: light)" srcset="./static/logo_black.svg">
|
5
|
+
<img alt="mcp use logo" src="./static/logo_white.svg" width="80%" style="margin: 20px auto;">
|
6
|
+
</picture>
|
7
|
+
</div>
|
8
|
+
|
1
9
|
<h1 align="center">Unified MCP Client Library</h1>
|
2
10
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
11
|
+
<p align="center">
|
12
|
+
<a href="https://www.npmjs.com/package/mcp-use" alt="NPM Downloads">
|
13
|
+
<img src="https://img.shields.io/npm/dw/mcp-use.svg"/></a>
|
14
|
+
<a href="https://www.npmjs.com/package/mcp-use" alt="NPM Version">
|
15
|
+
<img src="https://img.shields.io/npm/v/mcp-use.svg"/></a>
|
16
|
+
<a href="https://docs.mcp-use.io" alt="Documentation">
|
17
|
+
<img src="https://img.shields.io/badge/docs-mcp--use.io-blue" /></a>
|
18
|
+
<a href="https://mcp-use.io" alt="Website">
|
19
|
+
<img src="https://img.shields.io/badge/website-mcp--use.io-blue" /></a>
|
20
|
+
<a href="https://github.com/mcp-use/mcp-use-ts/blob/main/LICENSE" alt="License">
|
21
|
+
<img src="https://img.shields.io/github/license/mcp-use/mcp-use-ts" /></a>
|
22
|
+
<a href="https://eslint.org" alt="Code style: ESLint">
|
23
|
+
<img src="https://img.shields.io/badge/code%20style-eslint-4B32C3.svg" /></a>
|
24
|
+
<a href="https://github.com/mcp-use/mcp-use-ts/stargazers" alt="GitHub stars">
|
25
|
+
<img src="https://img.shields.io/github/stars/mcp-use/mcp-use-ts?style=social" /></a>
|
26
|
+
<a href="https://discord.gg/XkNkSkMz3V" alt="Discord">
|
27
|
+
<img src="https://dcbadge.limes.pink/api/server/XkNkSkMz3V?style=flat" /></a>
|
28
|
+
</p>
|
8
29
|
|
9
30
|
🌐 **MCP Client** is the open-source way to connect **any LLM to any MCP server** in TypeScript/Node.js, letting you build custom agents with tool access without closed-source dependencies.
|
10
31
|
|
@@ -99,6 +120,7 @@ Load it:
|
|
99
120
|
|
100
121
|
```ts
|
101
122
|
import { MCPClient } from 'mcp-use'
|
123
|
+
|
102
124
|
const client = MCPClient.fromConfigFile('./mcp-config.json')
|
103
125
|
```
|
104
126
|
|
@@ -141,6 +163,13 @@ const agent = new MCPAgent({
|
|
141
163
|
<sub style="font-size:14px"><b>Zane</b></sub>
|
142
164
|
</a>
|
143
165
|
</td>
|
166
|
+
<td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0">
|
167
|
+
<a href=https://github.com/pietrozullo>
|
168
|
+
<img src=https://avatars.githubusercontent.com/u/62951181?v=4 width="100;" style="border-radius:50%;align-items:center;justify-content:center;overflow:hidden;padding-top:10px" alt=Pietro Zullo/>
|
169
|
+
<br />
|
170
|
+
<sub style="font-size:14px"><b>Pietro Zullo</b></sub>
|
171
|
+
</a>
|
172
|
+
</td>
|
144
173
|
</tr>
|
145
174
|
</table>
|
146
175
|
|
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
|
package/dist/index.d.ts.map
CHANGED
@@ -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 +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
|
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"}
|
package/dist/src/agents/index.js
CHANGED
@@ -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 '
|
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;
|
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 =
|
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 =
|
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(
|
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);
|
package/dist/src/client.d.ts
CHANGED
@@ -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>;
|
package/dist/src/client.d.ts.map
CHANGED
@@ -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;
|
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"}
|
package/dist/src/client.js
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
81
|
+
return null;
|
79
82
|
}
|
80
83
|
return session;
|
81
84
|
}
|
package/dist/src/logging.d.ts
CHANGED
@@ -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
|
4
|
-
static
|
5
|
-
static
|
6
|
-
static
|
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;
|
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"}
|
package/dist/src/logging.js
CHANGED
@@ -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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
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
|
16
|
-
static
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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.
|
36
|
+
return this.instances[name];
|
25
37
|
}
|
26
|
-
static
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
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 (
|
57
|
+
if (console) {
|
37
58
|
root.add(new transports.Console());
|
38
59
|
}
|
39
|
-
if (
|
40
|
-
const dir = path.dirname(
|
41
|
-
if (
|
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:
|
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(
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
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.
|
92
|
+
export const logger = Logger.get();
|
@@ -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,15 @@
|
|
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
|
+
initialize(): void;
|
12
|
+
prefetchServerTools(): Promise<void>;
|
13
|
+
get tools(): StructuredToolInterface[];
|
14
|
+
}
|
15
|
+
//# 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;AAU7C,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;IAKxD,UAAU,IAAI,IAAI;IAOZ,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD1C,IAAI,KAAK,IAAI,uBAAuB,EAAE,CAOrC;CACF"}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
import { isEqual } from 'lodash-es';
|
2
|
+
import { logger } from '../logging.js';
|
3
|
+
import { AcquireActiveMCPServerTool } from './tools/acquire_active_mcp_server.js';
|
4
|
+
import { ConnectMCPServerTool } from './tools/connect_mcp_server.js';
|
5
|
+
import { ListMCPServersTool } from './tools/list_mcp_servers.js';
|
6
|
+
import { ReleaseMCPServerConnectionTool } from './tools/release_mcp_server_connection.js';
|
7
|
+
export class ServerManager {
|
8
|
+
initializedServers = {};
|
9
|
+
serverTools = {};
|
10
|
+
client;
|
11
|
+
adapter;
|
12
|
+
activeServer = null;
|
13
|
+
constructor(client, adapter) {
|
14
|
+
this.client = client;
|
15
|
+
this.adapter = adapter;
|
16
|
+
}
|
17
|
+
initialize() {
|
18
|
+
const serverNames = this.client.getServerNames?.();
|
19
|
+
if (serverNames.length === 0) {
|
20
|
+
logger.warning('No MCP servers defined in client configuration');
|
21
|
+
}
|
22
|
+
}
|
23
|
+
async prefetchServerTools() {
|
24
|
+
const servers = this.client.getServerNames();
|
25
|
+
for (const serverName of servers) {
|
26
|
+
try {
|
27
|
+
let session = null;
|
28
|
+
session = this.client.getSession(serverName);
|
29
|
+
logger.debug(`Using existing session for server '${serverName}' to prefetch tools.`);
|
30
|
+
if (!session) {
|
31
|
+
session = await this.client.createSession(serverName).catch((createSessionError) => {
|
32
|
+
logger.warn(`Could not create session for '${serverName}' during prefetch: ${createSessionError}`);
|
33
|
+
return null;
|
34
|
+
});
|
35
|
+
logger.debug(`Temporarily created session for '${serverName}' to prefetch tools.`);
|
36
|
+
}
|
37
|
+
if (session) {
|
38
|
+
const connector = session.connector;
|
39
|
+
let tools = [];
|
40
|
+
try {
|
41
|
+
tools = await this.adapter.createToolsFromConnectors([connector]);
|
42
|
+
}
|
43
|
+
catch (toolFetchError) {
|
44
|
+
logger.error(`Failed to create tools from connector for server '${serverName}': ${toolFetchError}`);
|
45
|
+
continue;
|
46
|
+
}
|
47
|
+
const cachedTools = this.serverTools[serverName];
|
48
|
+
const toolsChanged = !cachedTools || !isEqual(cachedTools, tools);
|
49
|
+
if (toolsChanged) {
|
50
|
+
this.serverTools[serverName] = tools;
|
51
|
+
this.initializedServers[serverName] = true;
|
52
|
+
logger.debug(`Prefetched ${tools.length} tools for server '${serverName}'.`);
|
53
|
+
}
|
54
|
+
else {
|
55
|
+
logger.debug(`Tools for server '${serverName}' unchanged, using cached version.`);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
catch (outerError) {
|
60
|
+
logger.error(`Error prefetching tools for server '${serverName}': ${outerError}`);
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
get tools() {
|
65
|
+
return [
|
66
|
+
new ListMCPServersTool(this),
|
67
|
+
new ConnectMCPServerTool(this),
|
68
|
+
new AcquireActiveMCPServerTool(this),
|
69
|
+
new ReleaseMCPServerConnectionTool(this),
|
70
|
+
];
|
71
|
+
}
|
72
|
+
}
|
@@ -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,24 @@
|
|
1
|
+
import type { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';
|
2
|
+
import type { ToolParams, ToolRunnableConfig, ToolSchemaBase } from '@langchain/core/tools';
|
3
|
+
import type { JSONSchema } from '@langchain/core/utils/json_schema';
|
4
|
+
import type z from 'zod';
|
5
|
+
import type { ServerManager } from '../server_manager.js';
|
6
|
+
import { StructuredTool } from '@langchain/core/tools';
|
7
|
+
export type ToolOutputT = any;
|
8
|
+
export type SchemaOutputT<T extends ToolSchemaBase> = T extends z.ZodSchema ? z.output<T> : T extends JSONSchema ? unknown : never;
|
9
|
+
export interface MCPServerToolOptions extends ToolParams {
|
10
|
+
name?: string;
|
11
|
+
description?: string;
|
12
|
+
returnDirect?: boolean;
|
13
|
+
sandboxId?: string;
|
14
|
+
}
|
15
|
+
export declare class MCPServerTool<SchemaT extends ToolSchemaBase> extends StructuredTool<SchemaT, SchemaOutputT<SchemaT>> {
|
16
|
+
name: string;
|
17
|
+
description: string;
|
18
|
+
schema: SchemaT;
|
19
|
+
private readonly _manager;
|
20
|
+
constructor(manager: ServerManager);
|
21
|
+
protected _call(_arg: SchemaOutputT<SchemaT>, _runManager?: CallbackManagerForToolRun, _parentConfig?: ToolRunnableConfig): Promise<ToolOutputT>;
|
22
|
+
get manager(): ServerManager;
|
23
|
+
}
|
24
|
+
//# sourceMappingURL=base.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/managers/tools/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,MAAM,MAAM,WAAW,GAAG,GAAG,CAAA;AAC7B,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,GACvE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GACX,CAAC,SAAS,UAAU,GAClB,OAAO,GACP,KAAK,CAAA;AAEX,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,aAAa,CAAC,OAAO,SAAS,cAAc,CAAE,SAAQ,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACvG,IAAI,EAAE,MAAM,CAAoB;IAChC,WAAW,EAAE,MAAM,CAAyC;IAC5D,MAAM,EAAG,OAAO,CAAA;IAEzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;gBAE5B,OAAO,EAAE,aAAa;cAKlB,KAAK,CACnB,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,EAC5B,WAAW,CAAC,EAAE,yBAAyB,EACvC,aAAa,CAAC,EAAE,kBAAkB,GACjC,OAAO,CAAC,WAAW,CAAC;IAIvB,IAAI,OAAO,IAAI,aAAa,CAE3B;CACF"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { StructuredTool } from '@langchain/core/tools';
|
2
|
+
export class MCPServerTool extends StructuredTool {
|
3
|
+
name = 'mcp_server_tool';
|
4
|
+
description = 'Base tool for MCP server operations.';
|
5
|
+
schema;
|
6
|
+
_manager;
|
7
|
+
constructor(manager) {
|
8
|
+
super();
|
9
|
+
this._manager = manager;
|
10
|
+
}
|
11
|
+
async _call(_arg, _runManager, _parentConfig) {
|
12
|
+
throw new Error('Method not implemented.');
|
13
|
+
}
|
14
|
+
get manager() {
|
15
|
+
return this._manager;
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import type { ServerManager } from '../server_manager.js';
|
2
|
+
import type { SchemaOutputT } from './base.js';
|
3
|
+
import { z } from 'zod';
|
4
|
+
import { MCPServerTool } from './base.js';
|
5
|
+
declare const ConnectMCPServerSchema: z.ZodObject<{
|
6
|
+
serverName: z.ZodString;
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
8
|
+
serverName: string;
|
9
|
+
}, {
|
10
|
+
serverName: string;
|
11
|
+
}>;
|
12
|
+
export declare class ConnectMCPServerTool extends MCPServerTool<typeof ConnectMCPServerSchema> {
|
13
|
+
name: string;
|
14
|
+
description: string;
|
15
|
+
schema: z.ZodObject<{
|
16
|
+
serverName: z.ZodString;
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
18
|
+
serverName: string;
|
19
|
+
}, {
|
20
|
+
serverName: string;
|
21
|
+
}>;
|
22
|
+
constructor(manager: ServerManager);
|
23
|
+
_call({ serverName }: SchemaOutputT<typeof ConnectMCPServerSchema>): Promise<string>;
|
24
|
+
}
|
25
|
+
export {};
|
26
|
+
//# sourceMappingURL=connect_mcp_server.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"connect_mcp_server.d.ts","sourceRoot":"","sources":["../../../../src/managers/tools/connect_mcp_server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,QAAA,MAAM,sBAAsB;;;;;;EAE1B,CAAA;AAEF,qBAAa,oBAAqB,SAAQ,aAAa,CAAC,OAAO,sBAAsB,CAAC;IAC3E,IAAI,SAA0B;IAC9B,WAAW,SAAiJ;IAC5J,MAAM;;;;;;OAAyB;gBAE5B,OAAO,EAAE,aAAa;IAI5B,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,aAAa,CAAC,OAAO,sBAAsB,CAAC;CAmCzE"}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
import { z } from 'zod';
|
2
|
+
import { logger } from '../../logging.js';
|
3
|
+
import { MCPServerTool } from './base.js';
|
4
|
+
const ConnectMCPServerSchema = z.object({
|
5
|
+
serverName: z.string().describe('The name of the MCP server.'),
|
6
|
+
});
|
7
|
+
export class ConnectMCPServerTool extends MCPServerTool {
|
8
|
+
name = 'connect_to_mcp_server';
|
9
|
+
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.';
|
10
|
+
schema = ConnectMCPServerSchema;
|
11
|
+
constructor(manager) {
|
12
|
+
super(manager);
|
13
|
+
}
|
14
|
+
async _call({ serverName }) {
|
15
|
+
const serverNames = this.manager.client.getServerNames();
|
16
|
+
if (!serverNames.includes(serverName)) {
|
17
|
+
const available = serverNames.length > 0 ? serverNames.join(', ') : 'none';
|
18
|
+
return `Server '${serverName}' not found. Available servers: ${available}`;
|
19
|
+
}
|
20
|
+
if (this.manager.activeServer === serverName) {
|
21
|
+
return `Already connected to MCP server '${serverName}'`;
|
22
|
+
}
|
23
|
+
try {
|
24
|
+
let session = this.manager.client.getSession(serverName);
|
25
|
+
logger.debug(`Using existing session for server '${serverName}'`);
|
26
|
+
if (!session) {
|
27
|
+
logger.debug(`Creating new session for server '${serverName}'`);
|
28
|
+
session = await this.manager.client.createSession(serverName);
|
29
|
+
}
|
30
|
+
this.manager.activeServer = serverName;
|
31
|
+
if (this.manager.serverTools[serverName]) {
|
32
|
+
const connector = session.connector;
|
33
|
+
const tools = await this.manager.adapter.createToolsFromConnectors([connector]);
|
34
|
+
this.manager.serverTools[serverName] = tools;
|
35
|
+
this.manager.initializedServers[serverName] = true;
|
36
|
+
}
|
37
|
+
const serverTools = this.manager.serverTools[serverName] || [];
|
38
|
+
const numTools = serverTools.length;
|
39
|
+
return `Connected to MCP server '${serverName}'. ${numTools} tools are now available.`;
|
40
|
+
}
|
41
|
+
catch (error) {
|
42
|
+
logger.error(`Error connecting to server '${serverName}': ${String(error)}`);
|
43
|
+
return `Failed to connect to server '${serverName}': ${String(error)}`;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/managers/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAA;AAC9C,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,oCAAoC,CAAA"}
|
@@ -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 EnumerateServersSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
5
|
+
export declare class ListMCPServersTool extends MCPServerTool<typeof EnumerateServersSchema> {
|
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=list_mcp_servers.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"list_mcp_servers.d.ts","sourceRoot":"","sources":["../../../../src/managers/tools/list_mcp_servers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,QAAA,MAAM,sBAAsB,gDAAe,CAAA;AAE3C,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,OAAO,sBAAsB,CAAC;IACzE,IAAI,SAAqB;IACzB,WAAW,SAAiN;IAC5N,MAAM,iDAAyB;gBAE5B,OAAO,EAAE,aAAa;IAI5B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAwB/B"}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { z } from 'zod';
|
2
|
+
import { logger } from '../../logging.js';
|
3
|
+
import { MCPServerTool } from './base.js';
|
4
|
+
const EnumerateServersSchema = z.object({});
|
5
|
+
export class ListMCPServersTool extends MCPServerTool {
|
6
|
+
name = 'list_mcp_servers';
|
7
|
+
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.`;
|
8
|
+
schema = EnumerateServersSchema;
|
9
|
+
constructor(manager) {
|
10
|
+
super(manager);
|
11
|
+
}
|
12
|
+
async _call() {
|
13
|
+
const serverNames = this.manager.client.getServerNames();
|
14
|
+
if (serverNames.length === 0) {
|
15
|
+
return `No MCP servers are currently defined.`;
|
16
|
+
}
|
17
|
+
const outputLines = ['Available MCP servers:'];
|
18
|
+
for (const serverName of serverNames) {
|
19
|
+
const isActiveServer = serverName === this.manager.activeServer;
|
20
|
+
const activeFlag = isActiveServer ? ' (ACTIVE)' : '';
|
21
|
+
outputLines.push(`- ${serverName}${activeFlag}`);
|
22
|
+
try {
|
23
|
+
const serverTools = this.manager.serverTools?.[serverName] ?? [];
|
24
|
+
const numberOfTools = Array.isArray(serverTools) ? serverTools.length : 0;
|
25
|
+
outputLines.push(`${numberOfTools} tools available for this server\n`);
|
26
|
+
}
|
27
|
+
catch (error) {
|
28
|
+
logger.error(`Unexpected error listing tools for server '${serverName}': ${String(error)}`);
|
29
|
+
}
|
30
|
+
}
|
31
|
+
return outputLines.join('\n');
|
32
|
+
}
|
33
|
+
}
|
@@ -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 ReleaseConnectionSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
5
|
+
export declare class ReleaseMCPServerConnectionTool extends MCPServerTool<typeof ReleaseConnectionSchema> {
|
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=release_mcp_server_connection.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"release_mcp_server_connection.d.ts","sourceRoot":"","sources":["../../../../src/managers/tools/release_mcp_server_connection.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,uBAAuB,gDAAe,CAAA;AAE5C,qBAAa,8BAA+B,SAAQ,aAAa,CAAC,OAAO,uBAAuB,CAAC;IACtF,IAAI,SAA+B;IACnC,WAAW,SAA6E;IACxF,MAAM,iDAA0B;gBAE7B,OAAO,EAAE,aAAa;IAI5B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAQ/B"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { z } from 'zod';
|
2
|
+
import { MCPServerTool } from './base.js';
|
3
|
+
const ReleaseConnectionSchema = z.object({});
|
4
|
+
export class ReleaseMCPServerConnectionTool extends MCPServerTool {
|
5
|
+
name = 'disconnect_from_mcp_server';
|
6
|
+
description = 'Disconnect from the currently active MCP (Model Context Protocol) server';
|
7
|
+
schema = ReleaseConnectionSchema;
|
8
|
+
constructor(manager) {
|
9
|
+
super(manager);
|
10
|
+
}
|
11
|
+
async _call() {
|
12
|
+
if (!this.manager.activeServer) {
|
13
|
+
return `No MCP server is currently active, so there's nothing to disconnect from.`;
|
14
|
+
}
|
15
|
+
const serverName = this.manager.activeServer;
|
16
|
+
this.manager.activeServer = null;
|
17
|
+
return `Successfully disconnected from MCP server '${serverName}'.`;
|
18
|
+
}
|
19
|
+
}
|
package/dist/src/session.d.ts
CHANGED
@@ -2,18 +2,10 @@ import type { BaseConnector } from './connectors/base.js';
|
|
2
2
|
export declare class MCPSession {
|
3
3
|
readonly connector: BaseConnector;
|
4
4
|
private autoConnect;
|
5
|
-
private _sessionInfo;
|
6
|
-
private _tools;
|
7
5
|
constructor(connector: BaseConnector, autoConnect?: boolean);
|
8
|
-
open(): Promise<this>;
|
9
|
-
close(): Promise<void>;
|
10
6
|
connect(): Promise<void>;
|
11
7
|
disconnect(): Promise<void>;
|
12
|
-
initialize(): Promise<
|
8
|
+
initialize(): Promise<void>;
|
13
9
|
get isConnected(): boolean;
|
14
|
-
get sessionInfo(): Record<string, any> | null;
|
15
|
-
get tools(): Record<string, any>[];
|
16
|
-
discoverTools(): Promise<Record<string, any>[]>;
|
17
|
-
callTool(name: string, args: Record<string, any>): Promise<any>;
|
18
10
|
}
|
19
11
|
//# sourceMappingURL=session.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,qBAAa,UAAU;IACrB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;IACjC,OAAO,CAAC,WAAW,CAAS;gBAEhB,SAAS,EAAE,aAAa,EAAE,WAAW,UAAO;IAKlD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC,IAAI,WAAW,IAAI,OAAO,CAEzB;CACF"}
|
package/dist/src/session.js
CHANGED
@@ -1,20 +1,10 @@
|
|
1
|
-
import { logger } from './logging.js';
|
2
1
|
export class MCPSession {
|
3
2
|
connector;
|
4
3
|
autoConnect;
|
5
|
-
_sessionInfo = null;
|
6
|
-
_tools = [];
|
7
4
|
constructor(connector, autoConnect = true) {
|
8
5
|
this.connector = connector;
|
9
6
|
this.autoConnect = autoConnect;
|
10
7
|
}
|
11
|
-
async open() {
|
12
|
-
await this.connect();
|
13
|
-
return this;
|
14
|
-
}
|
15
|
-
async close() {
|
16
|
-
await this.disconnect();
|
17
|
-
}
|
18
8
|
async connect() {
|
19
9
|
await this.connector.connect();
|
20
10
|
}
|
@@ -25,28 +15,9 @@ export class MCPSession {
|
|
25
15
|
if (!this.isConnected && this.autoConnect) {
|
26
16
|
await this.connect();
|
27
17
|
}
|
28
|
-
|
29
|
-
await this.discoverTools();
|
30
|
-
return this._sessionInfo;
|
18
|
+
await this.connector.initialize();
|
31
19
|
}
|
32
20
|
get isConnected() {
|
33
21
|
return this.connector && this.connector.isClientConnected;
|
34
22
|
}
|
35
|
-
get sessionInfo() {
|
36
|
-
return this._sessionInfo;
|
37
|
-
}
|
38
|
-
get tools() {
|
39
|
-
return this._tools;
|
40
|
-
}
|
41
|
-
async discoverTools() {
|
42
|
-
this._tools = this.connector.tools;
|
43
|
-
return this._tools;
|
44
|
-
}
|
45
|
-
async callTool(name, args) {
|
46
|
-
if (!this.isConnected && this.autoConnect) {
|
47
|
-
await this.connect();
|
48
|
-
}
|
49
|
-
logger.debug(`MCPSession calling tool '${name}'`);
|
50
|
-
return await this.connector.callTool(name, args);
|
51
|
-
}
|
52
23
|
}
|
package/package.json
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
{
|
2
2
|
"name": "mcp-use",
|
3
3
|
"type": "module",
|
4
|
-
"version": "0.0.
|
4
|
+
"version": "0.0.8",
|
5
|
+
"packageManager": "pnpm@10.6.1",
|
5
6
|
"description": "A utility library for integrating Model Context Protocol (MCP) with LangChain, Zod, and related tools. Provides helpers for schema conversion, event streaming, and SDK usage.",
|
6
7
|
"author": "Zane",
|
7
8
|
"license": "MIT",
|
8
|
-
"homepage": "https://github.com/
|
9
|
+
"homepage": "https://github.com/mcp-use/mcp-use-ts#readme",
|
9
10
|
"repository": {
|
10
11
|
"type": "git",
|
11
|
-
"url": "git+https://github.com/
|
12
|
+
"url": "git+https://github.com/mcp-use/mcp-use-ts.git"
|
12
13
|
},
|
13
14
|
"bugs": {
|
14
|
-
"url": "https://github.com/
|
15
|
+
"url": "https://github.com/mcp-use/mcp-use-ts/issues"
|
15
16
|
},
|
16
17
|
"keywords": [
|
17
18
|
"MCP",
|
@@ -43,35 +44,49 @@
|
|
43
44
|
"publishConfig": {
|
44
45
|
"registry": "https://registry.npmjs.org"
|
45
46
|
},
|
47
|
+
"scripts": {
|
48
|
+
"build": "rm -rf dist && tsc",
|
49
|
+
"watch": "tsc --watch",
|
50
|
+
"start": "node dist/index.js",
|
51
|
+
"prepublishOnly": "npm run build",
|
52
|
+
"lint": "eslint",
|
53
|
+
"lint:fix": "eslint --fix",
|
54
|
+
"fmt": "eslint --fix",
|
55
|
+
"release": "npm version patch --tag-version-prefix=v && git push --follow-tags",
|
56
|
+
"release:minor": "npm version minor --tag-version-prefix=v && git push --follow-tags",
|
57
|
+
"release:major": "npm version major --tag-version-prefix=v && git push --follow-tags",
|
58
|
+
"prepare": "husky"
|
59
|
+
},
|
46
60
|
"dependencies": {
|
47
61
|
"@dmitryrechkin/json-schema-to-zod": "^1.0.1",
|
48
|
-
"@langchain/community": "0.3.
|
49
|
-
"@langchain/core": "0.3.
|
50
|
-
"@modelcontextprotocol/sdk": "1.
|
62
|
+
"@langchain/community": "0.3.45",
|
63
|
+
"@langchain/core": "0.3.58",
|
64
|
+
"@modelcontextprotocol/sdk": "1.12.1",
|
51
65
|
"eventsource": "^3.0.6",
|
52
|
-
"
|
66
|
+
"fastembed": "^1.14.4",
|
67
|
+
"langchain": "^0.3.27",
|
68
|
+
"lodash-es": "^4.17.21",
|
53
69
|
"uuid": "^11.1.0",
|
54
70
|
"winston": "^3.17.0",
|
55
71
|
"ws": "^8.18.2",
|
56
|
-
"zod": "^3.
|
72
|
+
"zod": "^3.25.48",
|
57
73
|
"zod-to-json-schema": "^3.24.5"
|
58
74
|
},
|
59
75
|
"devDependencies": {
|
60
|
-
"@antfu/eslint-config": "^4.13.
|
76
|
+
"@antfu/eslint-config": "^4.13.2",
|
77
|
+
"@types/lodash-es": "^4.17.12",
|
61
78
|
"@types/ws": "^8.18.1",
|
62
|
-
"eslint": "^9.
|
79
|
+
"eslint": "^9.28.0",
|
63
80
|
"eslint-plugin-format": "^1.0.1",
|
81
|
+
"husky": "^9.1.7",
|
82
|
+
"lint-staged": "^15.2.11",
|
64
83
|
"shx": "^0.4.0",
|
65
84
|
"typescript": "^5.8.3"
|
66
85
|
},
|
67
|
-
"
|
68
|
-
"
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
"lint:fix": "eslint --fix",
|
73
|
-
"release": "npm version patch && git push --follow-tags",
|
74
|
-
"release:minor": "npm version minor && git push --follow-tags",
|
75
|
-
"release:major": "npm version major && git push --follow-tags"
|
86
|
+
"lint-staged": {
|
87
|
+
"*.{js,ts}": [
|
88
|
+
"eslint --fix",
|
89
|
+
"git add"
|
90
|
+
]
|
76
91
|
}
|
77
|
-
}
|
92
|
+
}
|
@@ -1,22 +0,0 @@
|
|
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
|
-
private readonly client;
|
6
|
-
private readonly adapter;
|
7
|
-
private activeServer;
|
8
|
-
private readonly initializedServers;
|
9
|
-
private readonly serverTools;
|
10
|
-
constructor(client: MCPClient, adapter: LangChainAdapter);
|
11
|
-
initialize(): Promise<void>;
|
12
|
-
getServerManagementTools(): Promise<StructuredToolInterface[]>;
|
13
|
-
listServers(): Promise<string>;
|
14
|
-
connectToServer(serverName: string): Promise<string>;
|
15
|
-
getActiveServer(): Promise<string>;
|
16
|
-
disconnectFromServer(): Promise<string>;
|
17
|
-
getActiveServerTools(): Promise<StructuredToolInterface[]>;
|
18
|
-
getAllTools(): Promise<StructuredToolInterface[]>;
|
19
|
-
private ensureSession;
|
20
|
-
private ensureToolsFetched;
|
21
|
-
}
|
22
|
-
//# sourceMappingURL=server_manager.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"server_manager.d.ts","sourceRoot":"","sources":["../../../src/agents/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;AAc7C,qBAAa,aAAa;IAMtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA8B;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;gBAGzD,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,gBAAgB;IAGtC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,wBAAwB,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAsC9D,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IA0B9B,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiCpD,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAMlC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAUvC,oBAAoB,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAI1D,WAAW,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;YAIzC,aAAa;YAWb,kBAAkB;CAuBjC"}
|
@@ -1,152 +0,0 @@
|
|
1
|
-
import { DynamicStructuredTool } from '@langchain/core/tools';
|
2
|
-
import { z } from 'zod';
|
3
|
-
import { logger } from '../logging.js';
|
4
|
-
const ServerActionInputSchema = z.object({
|
5
|
-
serverName: z.string().describe('The name of the MCP server'),
|
6
|
-
});
|
7
|
-
const DisconnectServerInputSchema = z.object({});
|
8
|
-
const ListServersInputSchema = z.object({});
|
9
|
-
const CurrentServerInputSchema = z.object({});
|
10
|
-
export class ServerManager {
|
11
|
-
client;
|
12
|
-
adapter;
|
13
|
-
activeServer = null;
|
14
|
-
initializedServers = {};
|
15
|
-
serverTools = {};
|
16
|
-
constructor(client, adapter) {
|
17
|
-
this.client = client;
|
18
|
-
this.adapter = adapter;
|
19
|
-
}
|
20
|
-
async initialize() {
|
21
|
-
if (!this.client.getServerNames?.().length) {
|
22
|
-
logger.warning('No MCP servers defined in client configuration');
|
23
|
-
}
|
24
|
-
}
|
25
|
-
async getServerManagementTools() {
|
26
|
-
const listServersTool = new DynamicStructuredTool({
|
27
|
-
name: 'list_mcp_servers',
|
28
|
-
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.',
|
29
|
-
schema: ListServersInputSchema,
|
30
|
-
func: async () => this.listServers(),
|
31
|
-
});
|
32
|
-
const connectServerTool = new DynamicStructuredTool({
|
33
|
-
name: 'connect_to_mcp_server',
|
34
|
-
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.',
|
35
|
-
schema: ServerActionInputSchema,
|
36
|
-
func: async ({ serverName }) => this.connectToServer(serverName),
|
37
|
-
});
|
38
|
-
const getActiveServerTool = new DynamicStructuredTool({
|
39
|
-
name: 'get_active_mcp_server',
|
40
|
-
description: 'Get the currently active MCP (Model Context Protocol) server.',
|
41
|
-
schema: CurrentServerInputSchema,
|
42
|
-
func: async () => this.getActiveServer(),
|
43
|
-
});
|
44
|
-
const disconnectServerTool = new DynamicStructuredTool({
|
45
|
-
name: 'disconnect_from_mcp_server',
|
46
|
-
description: 'Disconnect from the currently active MCP (Model Context Protocol) server.',
|
47
|
-
schema: DisconnectServerInputSchema,
|
48
|
-
func: async () => this.disconnectFromServer(),
|
49
|
-
});
|
50
|
-
return [
|
51
|
-
listServersTool,
|
52
|
-
connectServerTool,
|
53
|
-
getActiveServerTool,
|
54
|
-
disconnectServerTool,
|
55
|
-
];
|
56
|
-
}
|
57
|
-
async listServers() {
|
58
|
-
const servers = this.client.getServerNames?.() ?? [];
|
59
|
-
if (!servers.length)
|
60
|
-
return 'No MCP servers are currently defined.';
|
61
|
-
let out = 'Available MCP servers:\n';
|
62
|
-
for (const [idx, serverName] of servers.entries()) {
|
63
|
-
const active = serverName === this.activeServer ? ' (ACTIVE)' : '';
|
64
|
-
out += `${idx + 1}. ${serverName}${active}\n`;
|
65
|
-
try {
|
66
|
-
const tools = await this.ensureToolsFetched(serverName);
|
67
|
-
out += tools.length
|
68
|
-
? ` Tools: ${tools.map(t => t.name).join(', ')}\n`
|
69
|
-
: ' Tools: (Could not retrieve or none available)\n';
|
70
|
-
}
|
71
|
-
catch (err) {
|
72
|
-
logger?.error?.(`Error listing tools for server '${serverName}':`, err);
|
73
|
-
out += ' Tools: (Error retrieving tools)\n';
|
74
|
-
}
|
75
|
-
}
|
76
|
-
return out;
|
77
|
-
}
|
78
|
-
async connectToServer(serverName) {
|
79
|
-
const servers = this.client.getServerNames() ?? [];
|
80
|
-
if (!servers.includes(serverName)) {
|
81
|
-
return `Server '${serverName}' not found. Available servers: ${servers.join(', ') || 'none'}`;
|
82
|
-
}
|
83
|
-
if (this.activeServer === serverName) {
|
84
|
-
return `Already connected to MCP server '${serverName}'`;
|
85
|
-
}
|
86
|
-
try {
|
87
|
-
const session = await this.ensureSession(serverName, /* create */ true);
|
88
|
-
this.activeServer = serverName;
|
89
|
-
// Ensure tools cached
|
90
|
-
await this.ensureToolsFetched(serverName, session?.connector);
|
91
|
-
const tools = this.serverTools[serverName] ?? [];
|
92
|
-
const toolDetails = tools
|
93
|
-
.map((t, i) => `${i + 1}. ${t.name}: ${t.description}`)
|
94
|
-
.join('\n');
|
95
|
-
return (`Connected to MCP server '${serverName}'. ${tools.length} tools are now available.${tools.length ? `\nAvailable tools for this server:\n${toolDetails}` : ''}`);
|
96
|
-
}
|
97
|
-
catch (err) {
|
98
|
-
logger.error(`Error connecting to server '${serverName}':`, err);
|
99
|
-
return `Failed to connect to server '${serverName}': ${String(err)}`;
|
100
|
-
}
|
101
|
-
}
|
102
|
-
async getActiveServer() {
|
103
|
-
return this.activeServer
|
104
|
-
? `Currently active MCP server: ${this.activeServer}`
|
105
|
-
: 'No MCP server is currently active. Use connect_to_mcp_server to connect.';
|
106
|
-
}
|
107
|
-
async disconnectFromServer() {
|
108
|
-
if (!this.activeServer) {
|
109
|
-
return 'No MCP server is currently active, so there\'s nothing to disconnect from.';
|
110
|
-
}
|
111
|
-
const was = this.activeServer;
|
112
|
-
this.activeServer = null;
|
113
|
-
return `Successfully disconnected from MCP server '${was}'.`;
|
114
|
-
}
|
115
|
-
async getActiveServerTools() {
|
116
|
-
return this.activeServer ? this.serverTools[this.activeServer] ?? [] : [];
|
117
|
-
}
|
118
|
-
async getAllTools() {
|
119
|
-
return [...(await this.getServerManagementTools()), ...(await this.getActiveServerTools())];
|
120
|
-
}
|
121
|
-
async ensureSession(serverName, createIfMissing = false) {
|
122
|
-
try {
|
123
|
-
return this.client.getSession(serverName);
|
124
|
-
}
|
125
|
-
catch {
|
126
|
-
if (!createIfMissing)
|
127
|
-
return undefined;
|
128
|
-
return this.client.createSession ? await this.client.createSession(serverName) : undefined;
|
129
|
-
}
|
130
|
-
}
|
131
|
-
async ensureToolsFetched(serverName, connector) {
|
132
|
-
if (this.serverTools[serverName])
|
133
|
-
return this.serverTools[serverName];
|
134
|
-
const session = connector ? { connector } : await this.ensureSession(serverName, true);
|
135
|
-
if (!session) {
|
136
|
-
this.serverTools[serverName] = [];
|
137
|
-
return [];
|
138
|
-
}
|
139
|
-
try {
|
140
|
-
const tools = await this.adapter.createToolsFromConnectors([session.connector]);
|
141
|
-
this.serverTools[serverName] = tools;
|
142
|
-
this.initializedServers[serverName] = true;
|
143
|
-
logger.debug(`Fetched ${tools.length} tools for server '${serverName}'.`);
|
144
|
-
return tools;
|
145
|
-
}
|
146
|
-
catch (err) {
|
147
|
-
logger.warning(`Could not fetch tools for server '${serverName}':`, err);
|
148
|
-
this.serverTools[serverName] = [];
|
149
|
-
return [];
|
150
|
-
}
|
151
|
-
}
|
152
|
-
}
|