From 40a9f3075577b10854bd47289050e34db768564e Mon Sep 17 00:00:00 2001 From: Ryan Kophs Date: Thu, 15 May 2025 11:39:06 -0400 Subject: [PATCH] support reading headers from a file instead of cli args --- README.md | 31 ++++++++++++++++++++++++++++++- src/lib/utils.ts | 23 +++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bc0a4a7..4de091b 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,9 @@ All the most popular MCP clients (Claude Desktop, Cursor & Windsurf) use the fol ### Custom Headers -To bypass authentication, or to emit custom headers on all requests to your remote server, pass `--header` CLI arguments: +To bypass authentication, or to emit custom headers on all requests to your remote server, there are two options: + +#### Option 1: Using `--header` CLI arguments ```json { @@ -72,6 +74,33 @@ To bypass authentication, or to emit custom headers on all requests to your remo }, ``` +#### Option 2: Using `--headerFile` to read headers from a file + +You can also provide headers from a file using the `--headerFile` argument. The file should contain one header per line in the format `Name:Value`. Lines starting with `#` are treated as comments and ignored. + +```json +{ + "mcpServers": { + "remote-example": { + "command": "npx", + "args": [ + "mcp-remote", + "https://remote.mcp.server/sse", + "--headerFile", + "/path/to/headers.txt" + ] + }, + } +} +``` + +Example headers file: +``` +# Headers for MCP Remote +Authorization:Bearer my-token +X-Custom-Header:custom-value +``` + ### Flags * If `npx` is producing errors, consider adding `-y` as the first argument to auto-accept the installation of the `mcp-remote` package. diff --git a/src/lib/utils.ts b/src/lib/utils.ts index a0a60dc..a0a2e34 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -428,6 +428,29 @@ export async function parseCommandLineArgs(args: string[], usage: string) { args.splice(i, 2) // Do not increment i, as the array has shifted continue + } else if (args[i] === '--headerFile' && i < args.length - 1) { + const filePath = args[i + 1] + try { + const fileContent = fs.readFileSync(filePath, 'utf8') + const lines = fileContent.split('\n') + for (const line of lines) { + const trimmedLine = line.trim() + if (trimmedLine && !trimmedLine.startsWith('#')) { + const match = trimmedLine.match(/^([A-Za-z0-9_-]+):(.*)$/) + if (match) { + headers[match[1]] = match[2] + } else { + log(`Warning: ignoring invalid header in file: ${trimmedLine}`) + } + } + } + log(`Loaded headers from file: ${filePath}`) + } catch (error) { + log(`Error reading header file ${filePath}: ${error.message}`) + } + args.splice(i, 2) + // Do not increment i, as the array has shifted + continue } i++ }