Skip to main content
Glama
http_config.py15.7 kB
""" HTTP MCP Server Configuration Configuration for multi-tenant, cloud-deployed MCP server with external identity provider integration (Google, Auth0, GitHub, etc.). """ import os from typing import Optional, Dict, Any, List from pydantic import BaseModel, Field, validator import logging logger = logging.getLogger(__name__) class ExternalProviderConfig(BaseModel): """External identity provider configuration""" enabled: bool = Field(default=False, description="Enable this provider") client_id: Optional[str] = Field(default=None, description="OAuth client ID") client_secret: Optional[str] = Field(default=None, description="OAuth client secret") domain: Optional[str] = Field(default=None, description="Provider domain (Auth0)") audience: Optional[str] = Field(default=None, description="API audience (Auth0)") class AuthConfig(BaseModel): """Authentication configuration for HTTP MCP server""" enabled: bool = Field(default=True, description="Enable authentication") # External provider configurations google: ExternalProviderConfig = Field(default_factory=ExternalProviderConfig) auth0: ExternalProviderConfig = Field(default_factory=ExternalProviderConfig) github: ExternalProviderConfig = Field(default_factory=ExternalProviderConfig) # API key fallback api_keys_enabled: bool = Field(default=True, description="Enable API key authentication") api_keys: Dict[str, Dict[str, Any]] = Field(default_factory=dict, description="API key configurations") # Permissions and tenancy default_permissions: List[str] = Field(default=["read", "write"], description="Default user permissions") tenant_mapping: Dict[str, str] = Field(default_factory=dict, description="Domain to tenant mapping") # Token validation token_cache_ttl: int = Field(default=300, description="Token cache TTL in seconds") max_token_age: int = Field(default=3600, description="Maximum token age in seconds") class DatabaseConfig(BaseModel): """Database configuration""" type: str = Field(default="postgresql", description="Database type") connection_string: Optional[str] = Field(default=None, description="Database connection string") pool_size: int = Field(default=10, description="Connection pool size") pool_timeout: int = Field(default=30, description="Pool timeout in seconds") encryption_key: Optional[str] = Field(default=None, description="Database encryption key") class VectorSearchConfig(BaseModel): """Vector search configuration""" enabled: bool = Field(default=True, description="Enable vector search") provider: str = Field(default="local", description="Vector provider (local/openai)") model: str = Field(default="all-MiniLM-L6-v2", description="Embedding model") dimension: int = Field(default=384, description="Vector dimension") similarity_threshold: float = Field(default=0.7, description="Similarity threshold") class ServerConfig(BaseModel): """HTTP server configuration""" host: str = Field(default="0.0.0.0", description="Server host") port: int = Field(default=8000, description="Server port") workers: int = Field(default=1, description="Number of worker processes") # TLS configuration tls_enabled: bool = Field(default=True, description="Enable TLS/HTTPS") tls_cert_path: Optional[str] = Field(default=None, description="TLS certificate path") tls_key_path: Optional[str] = Field(default=None, description="TLS private key path") # Security settings cors_origins: List[str] = Field(default=["*"], description="CORS allowed origins") max_request_size: int = Field(default=16*1024*1024, description="Max request size in bytes") request_timeout: int = Field(default=30, description="Request timeout in seconds") class SecurityConfig(BaseModel): """Security configuration""" # Rate limiting rate_limiting_enabled: bool = Field(default=True, description="Enable rate limiting") default_rate_limit: int = Field(default=100, description="Default requests per minute") oauth_rate_limit: int = Field(default=20, description="OAuth endpoint rate limit") mcp_rate_limit: int = Field(default=200, description="MCP endpoint rate limit") # HTTPS enforcement https_required: bool = Field(default=True, description="Require HTTPS") hsts_max_age: int = Field(default=31536000, description="HSTS max age") # Security headers and protection csrf_protection: bool = Field(default=True, description="Enable CSRF protection") blocked_user_agents: List[str] = Field(default_factory=list, description="Blocked user agents") class LoggingConfig(BaseModel): """Logging configuration""" level: str = Field(default="INFO", description="Log level") format: str = Field(default="json", description="Log format (json/text)") # Audit logging audit_logging_enabled: bool = Field(default=True, description="Enable security audit logging") audit_log_file: Optional[str] = Field(default=None, description="Audit log file path") # Performance logging access_logging: bool = Field(default=True, description="Enable access logging") slow_query_threshold: float = Field(default=1.0, description="Slow query threshold in seconds") class HTTPConfig(BaseModel): """ Complete HTTP MCP server configuration This configuration is used for multi-tenant, cloud-deployed MCP servers with external identity provider authentication. """ # Server mode mode: str = Field(default="http", description="Server mode") environment: str = Field(default="production", description="Environment (development/production)") # Component configurations auth: AuthConfig = Field(default_factory=AuthConfig) database: DatabaseConfig = Field(default_factory=DatabaseConfig) vector_search: VectorSearchConfig = Field(default_factory=VectorSearchConfig) server: ServerConfig = Field(default_factory=ServerConfig) security: SecurityConfig = Field(default_factory=SecurityConfig) logging: LoggingConfig = Field(default_factory=LoggingConfig) # Feature flags multi_tenancy: bool = Field(default=True, description="Enable multi-tenancy") intelligent_retrieval: bool = Field(default=True, description="Enable intelligent retrieval") client_registration: bool = Field(default=False, description="Enable dynamic client registration") class Config: env_prefix = "MCP_HTTP_" case_sensitive = False def get_http_config() -> HTTPConfig: """ Load HTTP MCP server configuration from environment variables Environment Variables: MCP_HTTP_ENVIRONMENT: Environment (development/production) MCP_HTTP_DATABASE_CONNECTION_STRING: PostgreSQL connection string MCP_HTTP_GOOGLE_CLIENT_ID: Google OAuth client ID MCP_HTTP_AUTH0_DOMAIN: Auth0 domain MCP_HTTP_TLS_CERT_PATH: TLS certificate path MCP_HTTP_TLS_KEY_PATH: TLS private key path Returns: HTTPConfig instance with loaded configuration """ environment = os.getenv("MCP_HTTP_ENVIRONMENT", "production") # Database configuration db_connection = os.getenv( "MCP_HTTP_DATABASE_CONNECTION_STRING", os.getenv("DATABASE_URL") # Common env var name ) # Google OAuth configuration google_client_id = os.getenv("MCP_HTTP_GOOGLE_CLIENT_ID") or os.getenv("GOOGLE_CLIENT_ID") google_client_secret = os.getenv("MCP_HTTP_GOOGLE_CLIENT_SECRET") or os.getenv("GOOGLE_CLIENT_SECRET") # Auth0 configuration auth0_domain = os.getenv("MCP_HTTP_AUTH0_DOMAIN") or os.getenv("AUTH0_DOMAIN") auth0_audience = os.getenv("MCP_HTTP_AUTH0_AUDIENCE") or os.getenv("AUTH0_AUDIENCE") # API keys configuration (from JSON string or individual keys) api_keys = {} api_keys_json = os.getenv("MCP_HTTP_API_KEYS") if api_keys_json: import json try: api_keys = json.loads(api_keys_json) except json.JSONDecodeError: logger.warning("Invalid API_KEYS JSON format") # Individual API key (for simple setups) single_api_key = os.getenv("MCP_HTTP_API_KEY") if single_api_key: api_keys[single_api_key] = { "user_id": "default_user", "email": "user@example.com", "name": "Default User", "tenant_id": "default", "permissions": ["read", "write"] } # TLS configuration tls_cert_path = os.getenv("MCP_HTTP_TLS_CERT_PATH") tls_key_path = os.getenv("MCP_HTTP_TLS_KEY_PATH") tls_enabled = bool(tls_cert_path and tls_key_path) if environment == "production" else False # Create configuration config = HTTPConfig( environment=environment, auth=AuthConfig( enabled=True, google=ExternalProviderConfig( enabled=bool(google_client_id), client_id=google_client_id, client_secret=google_client_secret ), auth0=ExternalProviderConfig( enabled=bool(auth0_domain and auth0_audience), domain=auth0_domain, audience=auth0_audience ), github=ExternalProviderConfig( enabled=os.getenv("MCP_HTTP_GITHUB_ENABLED", "false").lower() == "true" ), api_keys=api_keys, api_keys_enabled=bool(api_keys), default_permissions=["read", "write"], tenant_mapping={ "gmail.com": "personal", "outlook.com": "personal", "yahoo.com": "personal" } ), database=DatabaseConfig( type="postgresql", connection_string=db_connection, pool_size=int(os.getenv("MCP_HTTP_DB_POOL_SIZE", "10")), encryption_key=os.getenv("MCP_HTTP_DB_ENCRYPTION_KEY") ), server=ServerConfig( host=os.getenv("MCP_HTTP_HOST", "0.0.0.0"), port=int(os.getenv("MCP_HTTP_PORT", "8000")), tls_enabled=tls_enabled, tls_cert_path=tls_cert_path, tls_key_path=tls_key_path, cors_origins=os.getenv("MCP_HTTP_CORS_ORIGINS", "*").split(",") ), security=SecurityConfig( https_required=(environment == "production"), rate_limiting_enabled=True, csrf_protection=(environment == "production") ), logging=LoggingConfig( level=os.getenv("MCP_HTTP_LOG_LEVEL", "INFO"), audit_logging_enabled=True, access_logging=True ) ) logger.info(f"HTTP MCP configuration loaded: env={environment}, auth_providers={_get_enabled_providers(config)}") return config def get_development_config() -> HTTPConfig: """Get development-friendly HTTP configuration""" return HTTPConfig( environment="development", auth=AuthConfig( enabled=False, # Disable auth for development api_keys={ "dev-key-123": { "user_id": "dev_user", "email": "dev@example.com", "name": "Developer", "tenant_id": "development", "permissions": ["read", "write", "admin"] } } ), database=DatabaseConfig( connection_string="postgresql://localhost/mcp_dev" ), server=ServerConfig( port=8000, tls_enabled=False # HTTP for development ), security=SecurityConfig( https_required=False, rate_limiting_enabled=False, csrf_protection=False ), logging=LoggingConfig( level="DEBUG", audit_logging_enabled=False ) ) def get_production_config() -> HTTPConfig: """Get production-ready HTTP configuration template""" return HTTPConfig( environment="production", auth=AuthConfig( enabled=True, google=ExternalProviderConfig(enabled=True), auth0=ExternalProviderConfig(enabled=True), github=ExternalProviderConfig(enabled=True), api_keys_enabled=True ), server=ServerConfig( tls_enabled=True ), security=SecurityConfig( https_required=True, rate_limiting_enabled=True, csrf_protection=True ), logging=LoggingConfig( level="INFO", audit_logging_enabled=True, access_logging=True ) ) def _get_enabled_providers(config: HTTPConfig) -> List[str]: """Get list of enabled authentication providers""" providers = [] if config.auth.google.enabled: providers.append("google") if config.auth.auth0.enabled: providers.append("auth0") if config.auth.github.enabled: providers.append("github") if config.auth.api_keys_enabled: providers.append("api_keys") return providers def get_sample_http_config() -> Dict[str, Any]: """ Get sample HTTP configuration for documentation Returns: Dictionary with sample configuration """ return { "description": "HTTP MCP Server Configuration with External Identity Providers", "environment_variables": { "MCP_HTTP_ENVIRONMENT": "production", "MCP_HTTP_DATABASE_CONNECTION_STRING": "postgresql://user:pass@host:5432/mcp_db", "MCP_HTTP_GOOGLE_CLIENT_ID": "your-app.googleusercontent.com", "MCP_HTTP_GOOGLE_CLIENT_SECRET": "your-google-client-secret", "MCP_HTTP_AUTH0_DOMAIN": "your-app.auth0.com", "MCP_HTTP_AUTH0_AUDIENCE": "https://your-mcp-api.com", "MCP_HTTP_TLS_CERT_PATH": "/path/to/cert.pem", "MCP_HTTP_TLS_KEY_PATH": "/path/to/key.pem", "MCP_HTTP_API_KEY": "your-api-key-for-services" }, "deployment_options": { "railway": { "description": "Deploy to Railway with PostgreSQL addon", "command": "railway up", "database": "Railway PostgreSQL addon" }, "render": { "description": "Deploy to Render with managed PostgreSQL", "database": "Render PostgreSQL" }, "fly_io": { "description": "Deploy to Fly.io with Postgres app", "database": "Fly Postgres app" }, "docker": { "description": "Docker deployment with docker-compose", "files": ["Dockerfile", "docker-compose.yml"] } }, "authentication_flow": { "1": "User authenticates with Google/Auth0/GitHub", "2": "Client receives access token from provider", "3": "Client sends token to MCP server", "4": "MCP server validates token with provider", "5": "MCP server creates user session with tenant isolation" }, "features": { "authentication": "External providers (Google, Auth0, GitHub)", "multi_tenancy": "Automatic tenant isolation by email domain", "vector_search": "PostgreSQL pgvector integration", "audit_logging": "Comprehensive security audit trails", "rate_limiting": "Per-tenant rate limiting", "https_enforcement": "Mandatory TLS in production" } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/swapnilsurdi/mcp-pa'

If you have feedback or need assistance with the MCP directory API, please join our Discord server