@@ -19,44 +19,61 @@ export class MCPToolkit extends BaseToolkit {
19
19
this . serverParams = serverParams
20
20
this . transportType = transportType
21
21
}
22
- async initialize ( ) {
23
- if ( this . _tools === null ) {
24
- this . client = new Client (
25
- {
26
- name : 'flowise-client' ,
27
- version : '1.0.0'
28
- } ,
29
- {
30
- capabilities : { }
31
- }
32
- )
33
- if ( this . transportType === 'stdio' ) {
34
- // Compatible with overridden PATH configuration
35
- this . serverParams . env = {
22
+
23
+ // Method to create a new client with transport
24
+ async createClient ( ) : Promise < Client > {
25
+ const client = new Client (
26
+ {
27
+ name : 'flowise-client' ,
28
+ version : '1.0.0'
29
+ } ,
30
+ {
31
+ capabilities : { }
32
+ }
33
+ )
34
+
35
+ let transport : StdioClientTransport | SSEClientTransport | StreamableHTTPClientTransport
36
+
37
+ if ( this . transportType === 'stdio' ) {
38
+ // Compatible with overridden PATH configuration
39
+ const params = {
40
+ ...this . serverParams ,
41
+ env : {
36
42
...( this . serverParams . env || { } ) ,
37
43
PATH : process . env . PATH
38
44
}
45
+ }
39
46
40
- this . transport = new StdioClientTransport ( this . serverParams as StdioServerParameters )
41
- await this . client . connect ( this . transport )
42
- } else {
43
- if ( this . serverParams . url === undefined ) {
44
- throw new Error ( 'URL is required for SSE transport' )
45
- }
47
+ transport = new StdioClientTransport ( params as StdioServerParameters )
48
+ await client . connect ( transport )
49
+ } else {
50
+ if ( this . serverParams . url === undefined ) {
51
+ throw new Error ( 'URL is required for SSE transport' )
52
+ }
46
53
47
- const baseUrl = new URL ( this . serverParams . url )
48
- try {
49
- this . transport = new StreamableHTTPClientTransport ( baseUrl )
50
- await this . client . connect ( this . transport )
51
- } catch ( error ) {
52
- this . transport = new SSEClientTransport ( baseUrl )
53
- await this . client . connect ( this . transport )
54
- }
54
+ const baseUrl = new URL ( this . serverParams . url )
55
+ try {
56
+ transport = new StreamableHTTPClientTransport ( baseUrl )
57
+ await client . connect ( transport )
58
+ } catch ( error ) {
59
+ transport = new SSEClientTransport ( baseUrl )
60
+ await client . connect ( transport )
55
61
}
62
+ }
63
+
64
+ return client
65
+ }
66
+
67
+ async initialize ( ) {
68
+ if ( this . _tools === null ) {
69
+ this . client = await this . createClient ( )
56
70
57
71
this . _tools = await this . client . request ( { method : 'tools/list' } , ListToolsResultSchema )
58
72
59
73
this . tools = await this . get_tools ( )
74
+
75
+ // Close the initial client after initialization
76
+ await this . client . close ( )
60
77
}
61
78
}
62
79
@@ -69,7 +86,7 @@ export class MCPToolkit extends BaseToolkit {
69
86
throw new Error ( 'Client is not initialized' )
70
87
}
71
88
return await MCPTool ( {
72
- client : this . client ,
89
+ toolkit : this ,
73
90
name : tool . name ,
74
91
description : tool . description || '' ,
75
92
argsSchema : createSchemaModel ( tool . inputSchema )
@@ -80,23 +97,31 @@ export class MCPToolkit extends BaseToolkit {
80
97
}
81
98
82
99
export async function MCPTool ( {
83
- client ,
100
+ toolkit ,
84
101
name,
85
102
description,
86
103
argsSchema
87
104
} : {
88
- client : Client
105
+ toolkit : MCPToolkit
89
106
name : string
90
107
description : string
91
108
argsSchema : any
92
109
} ) : Promise < Tool > {
93
110
return tool (
94
111
async ( input ) : Promise < string > => {
95
- const req : CallToolRequest = { method : 'tools/call' , params : { name : name , arguments : input } }
96
- const res = await client . request ( req , CallToolResultSchema )
97
- const content = res . content
98
- const contentString = JSON . stringify ( content )
99
- return contentString
112
+ // Create a new client for this request
113
+ const client = await toolkit . createClient ( )
114
+
115
+ try {
116
+ const req : CallToolRequest = { method : 'tools/call' , params : { name : name , arguments : input } }
117
+ const res = await client . request ( req , CallToolResultSchema )
118
+ const content = res . content
119
+ const contentString = JSON . stringify ( content )
120
+ return contentString
121
+ } finally {
122
+ // Always close the client after the request completes
123
+ await client . close ( )
124
+ }
100
125
} ,
101
126
{
102
127
name : name ,
0 commit comments