Spaces:
Sleeping
Sleeping
#!/usr/bin/env python3 | |
""" | |
OAuth Setup Utility for Gmail MCP Server | |
This script helps users set up OAuth authentication for the Gmail MCP server. | |
""" | |
import sys | |
import os | |
import json | |
from pathlib import Path | |
from oauth_manager import oauth_manager | |
from logger import logger | |
def print_banner(): | |
"""Print setup banner""" | |
print("=" * 60) | |
print("π§ Gmail MCP Server - OAuth Setup") | |
print("=" * 60) | |
print() | |
def print_step(step_num: int, title: str): | |
"""Print step header""" | |
print(f"\nπΉ Step {step_num}: {title}") | |
print("-" * 50) | |
def check_dependencies(): | |
"""Check if required dependencies are installed""" | |
try: | |
import google.auth | |
import google_auth_oauthlib | |
import googleapiclient | |
import cryptography | |
print("β All required dependencies are installed") | |
return True | |
except ImportError as e: | |
print(f"β Missing dependency: {e}") | |
print("\nPlease install the required dependencies:") | |
print("pip install google-auth google-auth-oauthlib google-api-python-client cryptography") | |
return False | |
def setup_google_cloud_project(): | |
"""Guide user through Google Cloud project setup""" | |
print_step(1, "Google Cloud Project Setup") | |
print("You need to create a Google Cloud project and enable the Gmail API.") | |
print("\nπ Follow these steps:") | |
print("1. Go to: https://console.cloud.google.com/") | |
print("2. Create a new project or select an existing one") | |
print("3. Enable the Gmail API:") | |
print(" - Go to 'APIs & Services' > 'Library'") | |
print(" - Search for 'Gmail API'") | |
print(" - Click 'Enable'") | |
input("\nβ Press Enter when you've completed these steps...") | |
def setup_oauth_consent(): | |
"""Guide user through OAuth consent screen setup""" | |
print_step(2, "OAuth Consent Screen Setup") | |
print("Now you need to configure the OAuth consent screen.") | |
print("\nπ Follow these steps:") | |
print("1. Go to: https://console.cloud.google.com/apis/credentials/consent") | |
print("2. Choose 'External' user type (unless using Google Workspace)") | |
print("3. Fill in the app information:") | |
print(" - App name: 'Gmail MCP Server' (or your preferred name)") | |
print(" - User support email: Your email address") | |
print(" - Developer contact: Your email address") | |
print("4. Add these scopes:") | |
print(" - https://www.googleapis.com/auth/gmail.readonly") | |
print(" - https://www.googleapis.com/auth/gmail.modify") | |
print("5. Add your email as a test user") | |
print("6. Complete the setup") | |
input("\nβ Press Enter when you've completed these steps...") | |
def setup_oauth_credentials(): | |
"""Guide user through OAuth credentials setup""" | |
print_step(3, "OAuth Client Credentials Setup") | |
print("Now you need to create OAuth 2.0 client credentials.") | |
print("\nπ Follow these steps:") | |
print("1. Go to: https://console.cloud.google.com/apis/credentials") | |
print("2. Click 'Create Credentials' > 'OAuth client ID'") | |
print("3. Choose 'Web application' as the application type") | |
print("4. Set the name to 'Gmail MCP Server'") | |
print("5. Add this redirect URI:") | |
print(" http://localhost:8080/oauth2callback") | |
print("6. Click 'Create'") | |
print("7. Copy the Client ID and Client Secret") | |
print("\nπ Enter your OAuth credentials:") | |
while True: | |
client_id = input("Client ID: ").strip() | |
if client_id: | |
break | |
print("β Client ID cannot be empty") | |
while True: | |
client_secret = input("Client Secret: ").strip() | |
if client_secret: | |
break | |
print("β Client Secret cannot be empty") | |
try: | |
oauth_manager.setup_client_secrets(client_id, client_secret) | |
print("β OAuth credentials saved successfully") | |
return True | |
except Exception as e: | |
print(f"β Failed to save credentials: {e}") | |
return False | |
def test_authentication(): | |
"""Test the OAuth authentication flow""" | |
print_step(4, "Authentication Test") | |
print("Now let's test the authentication flow.") | |
print("This will open your web browser for authentication.") | |
confirm = input("\nπ Ready to open browser for authentication? (y/n): ").strip().lower() | |
if confirm != 'y': | |
print("Authentication test skipped.") | |
return False | |
try: | |
print("\nπ Starting authentication flow...") | |
success = oauth_manager.authenticate_interactive() | |
if success: | |
print("β Authentication successful!") | |
# Test getting user info | |
user_email = oauth_manager.get_user_email() | |
if user_email: | |
print(f"β Authenticated as: {user_email}") | |
return True | |
else: | |
print("β Authentication failed") | |
return False | |
except Exception as e: | |
print(f"β Authentication error: {e}") | |
return False | |
def show_completion_info(): | |
"""Show completion information and next steps""" | |
print("\n" + "=" * 60) | |
print("π Setup Complete!") | |
print("=" * 60) | |
print("\nβ Your Gmail MCP server is now configured with OAuth authentication!") | |
print("\nπ Next steps:") | |
print("1. Start the MCP server:") | |
print(" python email_mcp_server_oauth.py") | |
print("\n2. Configure Claude Desktop:") | |
print(' Add this to your MCP configuration:') | |
print(' {') | |
print(' "mcpServers": {') | |
print(' "gmail-oauth": {') | |
print(' "command": "npx",') | |
print(' "args": ["mcp-remote", "http://localhost:7860/gradio_api/mcp/sse"]') | |
print(' }') | |
print(' }') | |
print(' }') | |
print("\nπ Security notes:") | |
print("- Your credentials are encrypted and stored locally") | |
print("- Tokens are automatically refreshed when needed") | |
print("- You can revoke access anytime from Google Account settings") | |
credentials_dir = oauth_manager.credentials_dir | |
print(f"\nπ Credentials stored in: {credentials_dir}") | |
def show_help(): | |
"""Show help information""" | |
print("Gmail MCP Server OAuth Setup") | |
print("\nUsage:") | |
print(" python setup_oauth.py # Full interactive setup") | |
print(" python setup_oauth.py --help # Show this help") | |
print(" python setup_oauth.py --auth # Re-authenticate only") | |
print(" python setup_oauth.py --status # Check authentication status") | |
print(" python setup_oauth.py --clear # Clear stored credentials") | |
def check_status(): | |
"""Check authentication status""" | |
print("π Checking authentication status...") | |
if oauth_manager.is_authenticated(): | |
user_email = oauth_manager.get_user_email() | |
print(f"β Authenticated as: {user_email}") | |
return True | |
else: | |
print("β Not authenticated") | |
return False | |
def clear_credentials(): | |
"""Clear stored credentials""" | |
confirm = input("β οΈ This will clear all stored credentials. Continue? (y/n): ").strip().lower() | |
if confirm == 'y': | |
oauth_manager.clear_credentials() | |
print("β Credentials cleared") | |
else: | |
print("Operation cancelled") | |
def main(): | |
"""Main setup function""" | |
if len(sys.argv) > 1: | |
arg = sys.argv[1].lower() | |
if arg in ['--help', '-h', 'help']: | |
show_help() | |
return | |
elif arg == '--status': | |
check_status() | |
return | |
elif arg == '--auth': | |
print("π Starting re-authentication...") | |
if test_authentication(): | |
print("β Re-authentication successful") | |
else: | |
print("β Re-authentication failed") | |
return | |
elif arg == '--clear': | |
clear_credentials() | |
return | |
else: | |
print(f"Unknown argument: {arg}") | |
show_help() | |
return | |
# Full interactive setup | |
print_banner() | |
# Check if already authenticated | |
if oauth_manager.is_authenticated(): | |
user_email = oauth_manager.get_user_email() | |
print(f"β Already authenticated as: {user_email}") | |
choice = input("\nπ Do you want to re-authenticate? (y/n): ").strip().lower() | |
if choice == 'y': | |
if test_authentication(): | |
show_completion_info() | |
else: | |
print("Setup complete - you're already authenticated!") | |
return | |
# Check dependencies | |
if not check_dependencies(): | |
return | |
# Full setup flow | |
try: | |
setup_google_cloud_project() | |
setup_oauth_consent() | |
if not setup_oauth_credentials(): | |
print("β Setup failed at credentials step") | |
return | |
if test_authentication(): | |
show_completion_info() | |
else: | |
print("β Setup completed but authentication test failed") | |
print("You can try authentication later with: python setup_oauth.py --auth") | |
except KeyboardInterrupt: | |
print("\n\nβ οΈ Setup interrupted by user") | |
except Exception as e: | |
print(f"\nβ Setup failed: {e}") | |
if __name__ == "__main__": | |
main() |