Back to Mcpproxy Go

Server Multi-User Authentication (Spec 024)

docs/development/server-edition-multiuser-auth.md

0.45.03.3 KB
Original Source

Server Multi-User Authentication (Spec 024)

Server edition supports OAuth-based multi-user authentication with Google, GitHub, or Microsoft identity providers. All server code is behind //go:build server; the personal edition is unaffected.

Server Configuration

json
{
  "server_edition": {
    "enabled": true,
    "admin_emails": ["[email protected]"],
    "oauth": {
      "provider": "google",
      "client_id": "xxx.apps.googleusercontent.com",
      "client_secret": "GOCSPX-xxx",
      "tenant_id": "",
      "allowed_domains": ["company.com"]
    },
    "session_ttl": "24h",
    "bearer_token_ttl": "24h",
    "workspace_idle_timeout": "30m",
    "max_user_servers": 20
  }
}

Server API Endpoints

EndpointAuthDescription
GET /api/v1/auth/loginPublicInitiate OAuth login flow
GET /api/v1/auth/callbackPublicOAuth callback (creates session)
GET /api/v1/auth/meSession/JWTGet current user profile
POST /api/v1/auth/tokenSessionGenerate JWT bearer token for MCP
POST /api/v1/auth/logoutSessionInvalidate session
GET /api/v1/user/serversSession/JWTList user's servers (personal + shared)
POST /api/v1/user/serversSession/JWTAdd personal upstream server
GET /api/v1/user/activitySession/JWTUser's activity log
GET /api/v1/user/diagnosticsSession/JWTServer health for user's servers
GET /api/v1/admin/usersAdminList all users
POST /api/v1/admin/users/{id}/disableAdminDisable a user
GET /api/v1/admin/activityAdminAll users' activity logs
GET /api/v1/admin/sessionsAdminList active sessions

Server Architecture

  • Auth flow: OAuth 2.0 + PKCE → Session cookie (Web UI) + JWT bearer (MCP/API)
  • Server types: Shared (config file, single connection) + Personal (DB, per-user connections)
  • Isolation: Users see only shared + own personal servers. Activity logs user-scoped.
  • Admin: Identified by admin_emails config. Sees all activity, manages users.
  • Build tag: All server code behind //go:build server. Personal edition unaffected.

Key Directories

DirectoryPurpose
cmd/mcpproxy/edition.goDefault edition = "personal"
cmd/mcpproxy/edition_teams.goBuild-tagged override for server edition
cmd/mcpproxy/serveredition_register.goServer feature registration entry point
internal/serveredition/auth/OAuth, sessions, JWT tokens, middleware
internal/serveredition/users/User/session models, BBolt store
internal/serveredition/workspace/Per-user workspace for personal upstreams
internal/serveredition/multiuser/Multi-user router, tool filtering, activity isolation
internal/serveredition/api/Server REST API endpoints (user, admin, auth)

Server Testing

bash
go test -tags server ./internal/serveredition/... -v -race  # All server unit + integration tests
go build -tags server ./cmd/mcpproxy                        # Build server edition
go build ./cmd/mcpproxy                                     # Verify personal edition unaffected

Note: server-edition //go:build server routes are invisible to swag / verify-oas-coverage.sh / CI lint (which don't pass --build-tags server). Lint locally with the tag and document endpoints here.