Skip to content

Commit c93d6c0

Browse files
Add dynamic headers option to MCP core for tool call-time (#6044)
* add dynamic headers option to MCP core
1 parent f7d8691 commit c93d6c0

1 file changed

Lines changed: 16 additions & 8 deletions

File tree

  • packages/components/nodes/tools/MCP

packages/components/nodes/tools/MCP/core.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,19 @@ export class MCPToolkit extends BaseToolkit {
1515
client: Client | null = null
1616
serverParams: StdioServerParameters | any
1717
transportType: 'stdio' | 'sse'
18+
/** Per-invocation HTTP headers injected at tools/call time; overrides static toolkit headers for the same names. */
19+
getToolCallHeaders?: () => Promise<Record<string, string>>
1820
constructor(serverParams: StdioServerParameters | any, transportType: 'stdio' | 'sse') {
1921
super()
2022
this.serverParams = serverParams
2123
this.transportType = transportType
2224
}
2325

24-
// Method to create a new client with transport
25-
async createClient(): Promise<Client> {
26+
/**
27+
* Creates a new MCP client and connects it via the configured transport.
28+
* @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.
29+
*/
30+
async createClient(injectHeaders: Record<string, string> = {}): Promise<Client> {
2631
const client = new Client(
2732
{
2833
name: 'flowise-client',
@@ -54,28 +59,30 @@ export class MCPToolkit extends BaseToolkit {
5459

5560
const baseUrl = new URL(this.serverParams.url)
5661
await checkDenyList(this.serverParams.url)
62+
const mergedHeaders = { ...this.serverParams?.headers, ...injectHeaders }
63+
const headers = Object.keys(mergedHeaders).length > 0 ? mergedHeaders : undefined
5764
try {
58-
if (this.serverParams.headers) {
65+
if (headers) {
5966
transport = new StreamableHTTPClientTransport(baseUrl, {
6067
requestInit: {
61-
headers: this.serverParams.headers
68+
headers
6269
}
6370
})
6471
} else {
6572
transport = new StreamableHTTPClientTransport(baseUrl)
6673
}
6774
await client.connect(transport)
6875
} catch (error) {
69-
if (this.serverParams.headers) {
76+
if (headers) {
7077
transport = new SSEClientTransport(baseUrl, {
7178
requestInit: {
72-
headers: this.serverParams.headers
79+
headers
7380
},
7481
eventSourceInit: {
7582
fetch: async (url, init) => {
7683
return secureFetch(url.toString(), {
7784
...(init as any),
78-
headers: this.serverParams.headers
85+
headers
7986
}) as any
8087
}
8188
}
@@ -148,7 +155,8 @@ export async function MCPTool({
148155
return tool(
149156
async (input): Promise<string> => {
150157
// Create a new client for this request
151-
const client = await toolkit.createClient()
158+
const toolCallHeaders = await toolkit.getToolCallHeaders?.()
159+
const client = await toolkit.createClient(toolCallHeaders)
152160

153161
try {
154162
const req: CallToolRequest = { method: 'tools/call', params: { name: name, arguments: input as any } }

0 commit comments

Comments
 (0)