Skip to main content
Glama
zekozhang

mcp-remote-static

by zekozhang
README.md
# `mcp-remote-static`

> **This is a fork of [mcp-remote](https://github.com/geelen/mcp-remote)** with 
added support for static OAuth client configuration. This package is designed 
for marketplace scenarios and OAuth servers that require pre-registered clients 
with static `client_id` and `client_secret`, using standard OAuth 2.0 
authorization code flow.

Connect MCP clients (Claude Desktop, Cursor, Windsurf) to remote MCP servers with static OAuth client authentication.

**⚠️ Marketplace Setup Required:** Configure callback URL `http://localhost:17091/oauth/callback` in your marketplace before use.

## Marketplace Configuration

**Required:** Register callback URL in your marketplace OAuth client settings:

```
http://localhost:17091/oauth/callback
```

**Configuration:**
1. Log in to marketplace admin panel
2. Navigate to OAuth client settings
3. Add `http://localhost:17091/oauth/callback` to allowed redirect URIs
4. Save configuration

**Custom host/port:** Update callback URL accordingly (e.g., `http://127.0.0.1:17091/oauth/callback` for `--host 127.0.0.1`)

## Configuration

### Method 1: JSON String (Recommended)

```json
{
  "mcpServers": {
    "my-server": {
      "command": "npx",
      "args": [
        "mcp-remote-static",
        "https://remote.mcp.server/sse",
        "--static-oauth-client-info",
        "{\"client_id\":\"your-client-id\",\"client_secret\":\"your-client-secret\"}"
      ]
    }
  }
}
```

**With Environment Variables:**

```json
{
  "mcpServers": {
    "my-server": {
      "command": "npx",
      "args": [
        "mcp-remote-static",
        "https://remote.mcp.server/sse",
        "--static-oauth-client-info",
        "{\"client_id\":\"${MCP_CLIENT_ID}\",\"client_secret\":\"${MCP_CLIENT_SECRET}\"}"
      ],
      "env": {
        "MCP_CLIENT_ID": "your-client-id",
        "MCP_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}
```

### Method 2: JSON File

Create `oauth_client_info.json`:

```json
{
  "client_id": "your-client-id",
  "client_secret": "your-client-secret"
}
```

Reference in config:

```json
{
  "mcpServers": {
    "my-server": {
      "command": "npx",
      "args": [
        "mcp-remote-static",
        "https://remote.mcp.server/sse",
        "--static-oauth-client-info",
        "@/path/to/oauth_client_info.json"
      ]
    }
  }
}
```

## Client Setup

**Configuration Files:**
- Claude Desktop: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows)
- Cursor: `~/.cursor/mcp.json`
- Windsurf: `~/.codeium/windsurf/mcp_config.json`

Restart the client after configuration changes.

## Configuration Options

### Required Arguments

**`serverUrl`** (args[0], required)
- MCP server URL
- Example: `https://remote.mcp.server/sse`

**`--static-oauth-client-info <value>`** (required)
- Static OAuth client information
- Format: JSON string or `@file-path`
- Examples:
  - JSON string: `"{\"client_id\":\"xxx\",\"client_secret\":\"yyy\"}"`
  - File path: `@/path/to/oauth_client_info.json`

### Optional Arguments

**`callbackPort`** (args[1], optional)
- Callback server port number
- Default: `17091` (fixed for static OAuth)
- Example: `17091` or `9696`

**`--debug`**
- Enable debug logging
- Logs written to: `~/.mcp-auth/{server_hash}_debug.log`

**`--transport <strategy>`**
- Transport strategy
- Values: `sse-only` | `http-only` | `sse-first` | `http-first`
- Default: `http-first`

**`--ignore-tool <tool-name>`** (can be used multiple times)
- Ignore specified tools
- Example: `--ignore-tool tool1 --ignore-tool tool2`

**`--auth-timeout <seconds>`**
- OAuth callback timeout in seconds
- Default: `30`
- Example: `--auth-timeout 60`

**`--header <header-value>`** (can be used multiple times)
- Custom HTTP request headers
- Format: `"HeaderName: value"`
- Example: `--header "Authorization: Bearer token"`

**`--host <hostname>`**
- Callback server hostname
- Default: `localhost`
- Example: `--host 127.0.0.1`

### Complete Example

```json
{
  "mcpServers": {
    "my-server": {
      "command": "npx",
      "args": [
        "mcp-remote-static",
        "https://remote.mcp.server/sse",
        "17091",
        "--static-oauth-client-info",
        "{\"client_id\":\"your-client-id\",\"client_secret\":\"your-client-secret\"}",
        "--transport",
        "sse-only",
        "--ignore-tool",
        "tool1",
        "--ignore-tool",
        "tool2",
        "--auth-timeout",
        "60",
        "--header",
        "X-Custom-Header: value",
        "--debug"
      ]
    }
  }
}
```

## Troubleshooting

**Clear credentials:**
```sh
rm -rf ~/.mcp-auth
```

**Authentication errors:**
- Verify `client_id` and `client_secret` are correct
- Verify callback URL matches marketplace: `http://localhost:17091/oauth/callback`
- Clear credentials and retry

**Check logs:**
- Claude Desktop: `tail -F ~/Library/Logs/Claude/mcp*.log` (macOS/Linux)
- Use `--debug` flag for detailed logs: `~/.mcp-auth/{server_hash}_debug.log`

**Test connection:**
```sh
npx mcp-remote-client-static https://server/sse --static-oauth-client-info "{\"client_id\":\"xxx\",\"client_secret\":\"yyy\"}"
```

**Node version:** Requires Node 18+