Configuration Guide
Complete reference for oauth-mcp-proxy configuration options.
Config Struct
type Config struct {
// Required
Provider string // "hmac", "okta", "google", "azure"
// Provider-specific
Issuer string // OIDC issuer URL (Okta/Google/Azure) - validated for HTTPS
JWTSecret []byte // Secret key (HMAC only)
Audience string // Your API audience
// Optional - OAuth Mode
Mode string // "native" or "proxy" - auto-detected from ClientID presence
// Optional - Proxy Mode (server-side OAuth flow)
ClientID string // OAuth client ID (triggers proxy mode)
ClientSecret string // OAuth client secret
ServerURL string // Your server's public URL
RedirectURIs string // Allowed redirect URIs (comma-separated allowlist)
// Optional - Fixed Redirect Mode (for mcp-remote)
FixedRedirectURI string // Single fixed redirect URI for proxying callbacks
AllowedClientRedirectDomains string // Comma-separated domain suffixes allowed for client redirects
// Optional - Token Validation
Scopes []string // OAuth scopes
SkipAudienceCheck bool // Skip audience validation (not recommended)
// Optional - Logging
Logger Logger // Custom logger implementation
}Key Configuration Notes
Issuer URL Validation (OIDC providers):
Must use HTTPS for non-localhost URLs (enforced for security)
Must be a valid URL format
Cannot be empty
Prevents MITM attacks on OAuth communication
⚠️ Breaking Changes (v1.1.0):
Issuer URL Validation: OIDC providers now enforce HTTPS. Non-HTTPS issuer URLs will cause configuration validation to fail.
State Signing Key:
NewServer()now panics if state signing key cannot be generated (crypto/rand failure). This ensures security but means server startup will fail on systems with broken CSPRNG.Nonce Generation:
generateSecureNonce()now panics instead of falling back to weak timestamp-based nonces.
See SECURITY.md for detailed migration guide.
Redirect URI Configuration (Proxy Mode):
Option 1:
RedirectURIs- Comma-separated allowlist of exact URIsOption 2:
FixedRedirectURI- Single fixed URI for proxying callbacksAdditional:
AllowedClientRedirectDomains- Domain suffixes allowed for client redirects (in addition to localhost)
Mode Detection:
Mode = "native"- Token validation only (ClientID not set)Mode = "proxy"- Full OAuth flow (ClientID is set)Auto-detected from
ClientIDpresence if not specified
Configuration Methods
Direct Config
Create Config struct directly:
ConfigBuilder (v0.2.0+)
Use fluent API with auto-generated ServerURL:
Benefits:
Auto-generates ServerURL from host/port/TLS
Validates config during Build()
Cleaner, more readable code
FromEnv() (v0.2.0+)
Read configuration from environment variables:
Environment variables:
OAUTH_PROVIDER- Provider nameOAUTH_MODE- OAuth mode (optional)OIDC_ISSUER- Issuer URLOIDC_AUDIENCE- AudienceOIDC_CLIENT_ID- Client ID (proxy mode)OIDC_CLIENT_SECRET- Client secret (proxy mode)OAUTH_REDIRECT_URIS- Redirect URIs (proxy mode)JWT_SECRET- HMAC secretMCP_URL- Full server URL (or auto-generated from below)MCP_HOST- Server host (default: localhost)MCP_PORT- Server port (default: 8080)HTTPS_CERT_FILE- TLS cert file (enables HTTPS)HTTPS_KEY_FILE- TLS key file (enables HTTPS)
Benefits:
12-factor app compliant
Easy Kubernetes/Docker deployment
No code changes for config updates
Required Fields
Provider
Type: string Required: Yes Values: "hmac", "okta", "google", "azure"
Specifies which OAuth provider to use for token validation.
See: Provider Guides for setup instructions
Audience
Type: string Required: Yes Purpose: Validates the aud claim in JWT tokens
The audience must match exactly. This prevents token reuse across services.
Examples:
Provider-Specific Fields
Issuer
Type: string Required: For OIDC providers (okta, google, azure) Not used: HMAC provider
The OAuth provider's issuer URL. Must match token's iss claim exactly.
Examples:
Important:
No trailing slash
Must serve
/.well-known/openid-configurationHTTPS required
JWTSecret
Type: []byte Required: For HMAC provider only Not used: OIDC providers
Shared secret for HMAC-SHA256 token validation.
Examples:
Security: Never hardcode! Use environment variables. See SECURITY.md.
OAuth Mode
Mode
Type: string Optional: Auto-detected if not specified Values: "native", "proxy"
Determines whether client or server handles OAuth flow.
Auto-detection:
Explicit:
Native Mode
When: OAuth-capable clients (Claude Desktop, browser apps)
Client: Authenticates directly with provider → Gets token → Calls MCP server Server: Only validates tokens (no OAuth endpoints used)
Config:
OAuth endpoints: Return 404 with helpful message (not needed by client)
Proxy Mode
When: Simple clients that can't do OAuth (CLI tools, legacy clients)
Client: Calls MCP server → Server proxies to provider → Returns token to client Server: Full OAuth authorization server functionality
Config:
OAuth endpoints: Fully functional (/oauth/authorize, /oauth/callback, /oauth/token)
Mode Comparison:
Client capability
Can do OAuth
Cannot do OAuth
OAuth flow
Client ↔ Provider
Client ↔ Server ↔ Provider
Config required
Minimal
Full (ClientID, ServerURL, etc.)
Endpoints active
Metadata only
All endpoints
Use case
Production apps
Simple clients
Proxy Mode Fields
ClientID
Type: string Required: For proxy mode Purpose: OAuth client identifier from provider
Obtained from your OAuth provider:
Okta: Application → General → Client ID
Google: Cloud Console → Credentials → OAuth 2.0 Client ID
Azure: App registrations → Application (client) ID
ClientSecret
Type: string Required: For proxy mode (confidential clients) Purpose: OAuth client secret for token exchange
Security:
See: SECURITY.md for secret management best practices.
ServerURL
Type: string Required: For proxy mode Purpose: Your MCP server's public URL
Used for:
OAuth metadata endpoints (issuer URL)
Redirect URI construction
Endpoint URL generation
Requirements:
HTTPS in production
No trailing slash
Publicly accessible (for OAuth provider callbacks)
RedirectURIs
Type: string Required: For proxy mode Purpose: OAuth redirect URI validation
Single URI (Fixed Redirect):
Server uses this URI with provider. For security, client redirects must be localhost only.
Multiple URIs (Allowlist):
Comma-separated list. Client's redirect_uri must exactly match one of these.
Security:
HTTPS required for non-localhost
No wildcards allowed
Exact string match
See SECURITY.md for redirect URI security
Optional Fields
Logger
Type: Logger interface Default: Uses log.Printf with level prefixes Purpose: Custom logging integration
Implement Logger interface to integrate with your logging system:
Examples:
Zap:
Logrus:
Default behavior:
What gets logged: See examples/README.md
Validation
Configuration is validated when calling WithOAuth() or NewServer():
Validation Rules
All modes:
Provider must be one of: hmac, okta, google, azure
Audience is required
Provider-specific fields validated (JWTSecret for HMAC, Issuer for OIDC)
Proxy mode:
ClientID required
ServerURL required
RedirectURIs required
Native mode:
ClientID, ServerURL, RedirectURIs optional (ignored if provided)
Complete Examples
HMAC (Testing)
Okta (Native - Recommended)
Okta (Proxy - For Simple Clients)
Azure AD
Environment Variables Pattern
Recommended .env structure:
Load in code:
See Also
Provider Guides - Provider-specific setup
SECURITY.md - Security best practices
TROUBLESHOOTING.md - Common configuration issues
Last updated
Was this helpful?