* Creates a new MCP client and connects it via the configured transport. * @param injectHeaders - Additional HTTP headers merged over static `serverParams.headers` for this connection. Used to pass per-invocation headers (e.g. from getToolCallHeaders) into SSE/HTTP transports.
(injectHeaders: Record<string, string> = {})
| 92 | * @param injectHeaders - Additional HTTP headers merged over static `serverParams.headers` for this connection. Used to pass per-invocation headers (e.g. from {@link getToolCallHeaders}) into SSE/HTTP transports. |
| 93 | */ |
| 94 | async createClient(injectHeaders: Record<string, string> = {}): Promise<Client> { |
| 95 | const client = new Client( |
| 96 | { |
| 97 | name: 'flowise-client', |
| 98 | version: '1.0.0' |
| 99 | }, |
| 100 | { |
| 101 | capabilities: {} |
| 102 | } |
| 103 | ) |
| 104 | |
| 105 | let transport: StdioClientTransport | SSEClientTransport | StreamableHTTPClientTransport |
| 106 | |
| 107 | if (this.transportType === 'stdio') { |
| 108 | // Compatible with overridden PATH configuration |
| 109 | const params = { |
| 110 | ...this.serverParams, |
| 111 | env: { |
| 112 | ...(this.serverParams.env || {}), |
| 113 | PATH: process.env.PATH |
| 114 | } |
| 115 | } |
| 116 | |
| 117 | transport = new StdioClientTransport(params as StdioServerParameters) |
| 118 | await client.connect(transport) |
| 119 | } else { |
| 120 | if (this.serverParams.url === undefined) { |
| 121 | throw new Error('URL is required for SSE transport') |
| 122 | } |
| 123 | |
| 124 | const baseUrl = new URL(this.serverParams.url) |
| 125 | await checkDenyList(this.serverParams.url) |
| 126 | const mergedHeaders = { ...this.serverParams?.headers, ...injectHeaders } |
| 127 | const headers = Object.keys(mergedHeaders).length > 0 ? mergedHeaders : undefined |
| 128 | try { |
| 129 | if (headers) { |
| 130 | transport = new StreamableHTTPClientTransport(baseUrl, { |
| 131 | requestInit: { |
| 132 | headers |
| 133 | } |
| 134 | }) |
| 135 | } else { |
| 136 | transport = new StreamableHTTPClientTransport(baseUrl) |
| 137 | } |
| 138 | await client.connect(transport) |
| 139 | } catch (error) { |
| 140 | console.error('Error connecting to MCP server', error) |
| 141 | if (headers) { |
| 142 | transport = new SSEClientTransport(baseUrl, { |
| 143 | requestInit: { |
| 144 | headers |
| 145 | }, |
| 146 | eventSourceInit: { |
| 147 | fetch: async (url, init) => { |
| 148 | return secureFetch(url.toString(), { |
| 149 | ...(init as any), |
| 150 | headers |
| 151 | }) as any |
no test coverage detected