Skip to content

Add --headerFile option for loading headers from a file #80

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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.
Expand Down
27 changes: 25 additions & 2 deletions src/lib/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -314,8 +314,8 @@ export function setupOAuthCallbackServerWithLongPoll(options: OAuthCallbackServe
Authorization successful!
You may close this window and return to the CLI.
<script>
// If this is a non-interactive session (no manual approval step was required) then
// this should automatically close the window. If not, this will have no effect and
// If this is a non-interactive session (no manual approval step was required) then
// this should automatically close the window. If not, this will have no effect and
// the user will see the message above.
window.close();
</script>
Expand Down Expand Up @@ -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 = await fs.readFile(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}`)
}
args.splice(i, 2)
// Do not increment i, as the array has shifted
continue
}
i++
}
Expand Down
Loading