apply ruff formatting
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
FastMCP Cloud entrypoint for the Google Workspace MCP server.
|
||||
Enforces OAuth 2.1 + stateless defaults required by FastMCP-hosted deployments.
|
||||
"""
|
||||
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
@@ -12,9 +13,14 @@ from auth.oauth_config import reload_oauth_config, is_stateless_mode
|
||||
from core.log_formatter import EnhancedLogFormatter, configure_file_logging
|
||||
from core.utils import check_credentials_directory_permissions
|
||||
from core.server import server, set_transport_mode, configure_server_for_http
|
||||
from core.tool_registry import set_enabled_tools as set_enabled_tool_names, wrap_server_tool_method, filter_server_tools
|
||||
from core.tool_registry import (
|
||||
set_enabled_tools as set_enabled_tool_names,
|
||||
wrap_server_tool_method,
|
||||
filter_server_tools,
|
||||
)
|
||||
from auth.scopes import set_enabled_tools
|
||||
|
||||
|
||||
def enforce_fastmcp_cloud_defaults():
|
||||
"""Force FastMCP Cloud-compatible OAuth settings before initializing the server."""
|
||||
enforced = []
|
||||
@@ -42,22 +48,22 @@ def enforce_fastmcp_cloud_defaults():
|
||||
|
||||
return enforced
|
||||
|
||||
|
||||
# Load environment variables
|
||||
dotenv_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '.env')
|
||||
dotenv_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".env")
|
||||
load_dotenv(dotenv_path=dotenv_path)
|
||||
|
||||
_fastmcp_cloud_overrides = enforce_fastmcp_cloud_defaults()
|
||||
|
||||
# Suppress googleapiclient discovery cache warning
|
||||
logging.getLogger('googleapiclient.discovery_cache').setLevel(logging.ERROR)
|
||||
logging.getLogger("googleapiclient.discovery_cache").setLevel(logging.ERROR)
|
||||
|
||||
# Reload OAuth configuration after env vars loaded
|
||||
reload_oauth_config()
|
||||
|
||||
# Configure basic logging
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
||||
level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -66,33 +72,46 @@ if _fastmcp_cloud_overrides:
|
||||
if previous is None:
|
||||
logger.info("FastMCP Cloud: set %s=%s", key, new_value)
|
||||
else:
|
||||
logger.warning("FastMCP Cloud: overriding %s from %s to %s", key, previous, new_value)
|
||||
logger.warning(
|
||||
"FastMCP Cloud: overriding %s from %s to %s", key, previous, new_value
|
||||
)
|
||||
else:
|
||||
logger.info("FastMCP Cloud: OAuth 2.1 stateless defaults already satisfied")
|
||||
|
||||
# Configure file logging based on stateless mode
|
||||
configure_file_logging()
|
||||
|
||||
|
||||
def configure_safe_logging():
|
||||
"""Configure safe Unicode handling for logging."""
|
||||
|
||||
class SafeEnhancedFormatter(EnhancedLogFormatter):
|
||||
"""Enhanced ASCII formatter with additional Windows safety."""
|
||||
|
||||
def format(self, record):
|
||||
try:
|
||||
return super().format(record)
|
||||
except UnicodeEncodeError:
|
||||
# Fallback to ASCII-safe formatting
|
||||
service_prefix = self._get_ascii_prefix(record.name, record.levelname)
|
||||
safe_msg = str(record.getMessage()).encode('ascii', errors='replace').decode('ascii')
|
||||
safe_msg = (
|
||||
str(record.getMessage())
|
||||
.encode("ascii", errors="replace")
|
||||
.decode("ascii")
|
||||
)
|
||||
return f"{service_prefix} {safe_msg}"
|
||||
|
||||
# Replace all console handlers' formatters with safe enhanced ones
|
||||
for handler in logging.root.handlers:
|
||||
# Only apply to console/stream handlers, keep file handlers as-is
|
||||
if isinstance(handler, logging.StreamHandler) and handler.stream.name in ['<stderr>', '<stdout>']:
|
||||
if isinstance(handler, logging.StreamHandler) and handler.stream.name in [
|
||||
"<stderr>",
|
||||
"<stdout>",
|
||||
]:
|
||||
safe_formatter = SafeEnhancedFormatter(use_colors=True)
|
||||
handler.setFormatter(safe_formatter)
|
||||
|
||||
|
||||
# Configure safe logging
|
||||
configure_safe_logging()
|
||||
|
||||
@@ -104,13 +123,15 @@ if not is_stateless_mode():
|
||||
logger.info("Credentials directory permissions verified")
|
||||
except (PermissionError, OSError) as e:
|
||||
logger.error(f"Credentials directory permission check failed: {e}")
|
||||
logger.error(" Please ensure the service has write permissions to create/access the credentials directory")
|
||||
logger.error(
|
||||
" Please ensure the service has write permissions to create/access the credentials directory"
|
||||
)
|
||||
sys.exit(1)
|
||||
else:
|
||||
logger.info("🔍 Skipping credentials directory check (stateless mode)")
|
||||
|
||||
# Set transport mode for HTTP (FastMCP CLI defaults to streamable-http)
|
||||
set_transport_mode('streamable-http')
|
||||
set_transport_mode("streamable-http")
|
||||
|
||||
# Import all tool modules to register their @server.tool() decorators
|
||||
import gmail.gmail_tools
|
||||
@@ -128,7 +149,18 @@ import gsearch.search_tools
|
||||
wrap_server_tool_method(server)
|
||||
|
||||
# Enable all tools and services by default
|
||||
all_services = ['gmail', 'drive', 'calendar', 'docs', 'sheets', 'chat', 'forms', 'slides', 'tasks', 'search']
|
||||
all_services = [
|
||||
"gmail",
|
||||
"drive",
|
||||
"calendar",
|
||||
"docs",
|
||||
"sheets",
|
||||
"chat",
|
||||
"forms",
|
||||
"slides",
|
||||
"tasks",
|
||||
"search",
|
||||
]
|
||||
set_enabled_tools(all_services) # Set enabled services for scopes
|
||||
set_enabled_tool_names(None) # Don't filter individual tools - enable all
|
||||
|
||||
|
||||
Reference in New Issue
Block a user