---
title: OAuth SSO Configuration
description: Configure OAuth 2.0 / OIDC Single Sign-On for MCPHub
---

# OAuth SSO Configuration

MCPHub supports OAuth 2.0 / OIDC Single Sign-On (SSO) for enterprise authentication, allowing users to log in using their existing identity provider accounts (Google, Microsoft, GitHub, or custom OIDC providers).

## Overview

SSO support allows:
- Login via major providers (Google, Microsoft, GitHub)
- Custom OIDC provider integration
- Auto-provisioning of new users from OAuth profiles
- Role mapping from provider claims/groups
- Hybrid auth (both SSO and local username/password)

## Configuration

Add the `oauthSSO` section to your `mcp_settings.json` under `systemConfig`:

```json
{
  "systemConfig": {
    "oauthSSO": {
      "enabled": true,
      "allowLocalAuth": true,
      "callbackBaseUrl": "https://your-mcphub-domain.com",
      "providers": [
        {
          "id": "google",
          "name": "Google",
          "type": "google",
          "clientId": "your-google-client-id",
          "clientSecret": "your-google-client-secret"
        },
        {
          "id": "github",
          "name": "GitHub",
          "type": "github",
          "clientId": "your-github-client-id",
          "clientSecret": "your-github-client-secret"
        },
        {
          "id": "microsoft",
          "name": "Microsoft",
          "type": "microsoft",
          "clientId": "your-microsoft-client-id",
          "clientSecret": "your-microsoft-client-secret"
        }
      ]
    }
  }
}
```

## Provider Configuration

### Google

1. Go to [Google Cloud Console](https://console.cloud.google.com/)
2. Create a new project or select existing one
3. Navigate to "APIs & Services" → "Credentials"
4. Create OAuth 2.0 Client ID (Web application)
5. Add authorized redirect URI: `https://your-domain/api/auth/sso/google/callback`
6. Copy Client ID and Client Secret

```json
{
  "id": "google",
  "name": "Google",
  "type": "google",
  "clientId": "YOUR_GOOGLE_CLIENT_ID.apps.googleusercontent.com",
  "clientSecret": "YOUR_GOOGLE_CLIENT_SECRET"
}
```

### GitHub

1. Go to [GitHub Developer Settings](https://github.com/settings/developers)
2. Click "New OAuth App"
3. Set Authorization callback URL: `https://your-domain/api/auth/sso/github/callback`
4. Copy Client ID and generate Client Secret

```json
{
  "id": "github",
  "name": "GitHub",
  "type": "github",
  "clientId": "YOUR_GITHUB_CLIENT_ID",
  "clientSecret": "YOUR_GITHUB_CLIENT_SECRET"
}
```

### Microsoft (Azure AD)

1. Go to [Azure Portal](https://portal.azure.com/) → Azure Active Directory
2. Navigate to "App registrations" → "New registration"
3. Add redirect URI: `https://your-domain/api/auth/sso/microsoft/callback`
4. Under "Certificates & secrets", create a new client secret
5. Copy Application (client) ID and client secret value

```json
{
  "id": "microsoft",
  "name": "Microsoft",
  "type": "microsoft",
  "clientId": "YOUR_AZURE_CLIENT_ID",
  "clientSecret": "YOUR_AZURE_CLIENT_SECRET"
}
```

### Custom OIDC Provider

For other OIDC-compatible identity providers:

```json
{
  "id": "custom-idp",
  "name": "Corporate SSO",
  "type": "oidc",
  "issuerUrl": "https://idp.example.com",
  "authorizationUrl": "https://idp.example.com/oauth2/authorize",
  "tokenUrl": "https://idp.example.com/oauth2/token",
  "userInfoUrl": "https://idp.example.com/oauth2/userinfo",
  "clientId": "YOUR_CLIENT_ID",
  "clientSecret": "YOUR_CLIENT_SECRET",
  "scopes": ["openid", "email", "profile"],
  "attributeMapping": {
    "username": "preferred_username",
    "email": "email",
    "name": "name"
  }
}
```

## Role Mapping

Configure automatic admin role assignment based on provider claims:

```json
{
  "id": "google",
  "name": "Google",
  "type": "google",
  "clientId": "...",
  "clientSecret": "...",
  "roleMapping": {
    "adminClaim": "groups",
    "adminValues": ["mcphub-admins", "engineering-leads"],
    "defaultIsAdmin": false
  }
}
```

This configuration:
- Checks the `groups` claim in the user's profile
- Grants admin access if any value matches `mcphub-admins` or `engineering-leads`
- Non-matching users get regular (non-admin) access

## Configuration Options

### Global Options

| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `enabled` | boolean | `false` | Enable/disable SSO globally |
| `allowLocalAuth` | boolean | `true` | Allow local username/password auth alongside SSO |
| `callbackBaseUrl` | string | auto-detected | Base URL for OAuth callbacks |

### Provider Options

| Option | Type | Required | Description |
|--------|------|----------|-------------|
| `id` | string | Yes | Unique identifier for the provider |
| `name` | string | Yes | Display name shown on login page |
| `type` | string | Yes | Provider type: `google`, `github`, `microsoft`, or `oidc` |
| `clientId` | string | Yes | OAuth client ID from the provider |
| `clientSecret` | string | Yes | OAuth client secret from the provider |
| `enabled` | boolean | No | Enable/disable this specific provider (default: true) |
| `scopes` | string[] | No | OAuth scopes to request |
| `autoProvision` | boolean | No | Auto-create users on first SSO login (default: true) |
| `allowLinking` | boolean | No | Allow existing users to link their accounts (default: true) |

### Custom OIDC Options (type: "oidc")

| Option | Type | Required | Description |
|--------|------|----------|-------------|
| `issuerUrl` | string | No | OIDC issuer URL for discovery |
| `authorizationUrl` | string | Yes | OAuth authorization endpoint |
| `tokenUrl` | string | Yes | OAuth token endpoint |
| `userInfoUrl` | string | Yes | OIDC userinfo endpoint |
| `attributeMapping` | object | No | Map provider claims to user attributes |

## Security Notes

1. **PKCE Support**: MCPHub uses PKCE (Proof Key for Code Exchange) for all providers except GitHub (which doesn't support it)
2. **State Parameter**: A cryptographically random state is generated for each login to prevent CSRF attacks
3. **Token Storage**: OAuth tokens from providers are not stored; only MCPHub's JWT is issued after successful authentication
4. **Rate Limiting**: Consider implementing rate limiting at infrastructure level (reverse proxy) for SSO endpoints

## Troubleshooting

### Common Issues

1. **"OAuth provider not found"**: Check that the provider is enabled and configured correctly
2. **"Invalid or expired OAuth state"**: The login attempt took too long (>10 minutes) or was a replay attack
3. **"Could not determine username"**: The provider didn't return expected user attributes; check `attributeMapping`
4. **"User account not found and auto-provisioning is disabled"**: Set `autoProvision: true` or pre-create the user

### Debug Mode

Enable debug logging by setting the `DEBUG` environment variable:

```bash
DEBUG=oauth* node dist/index.js
```
