Spend-Analyzer-MCP / init /setup_modal.py
Balamurugan Thayalan
spend-analyzer-mcp-mbt v1.0.0
ed1f7cd
#!/usr/bin/env python3
"""
Quick setup script for Modal deployment of Spend Analyzer MCP
"""
import os
import subprocess
import sys
from pathlib import Path
def run_command(cmd, description):
"""Run a command and handle errors"""
print(f"\n🔄 {description}...")
try:
result = subprocess.run(cmd, shell=True, check=True, capture_output=True, text=True)
print(f"✅ {description} completed successfully")
if result.stdout:
print(f"Output: {result.stdout.strip()}")
return True
except subprocess.CalledProcessError as e:
print(f"❌ {description} failed")
print(f"Error: {e.stderr.strip()}")
return False
def check_modal_installed():
"""Check if Modal CLI is installed"""
try:
subprocess.run(["modal", "--version"], check=True, capture_output=True)
return True
except (subprocess.CalledProcessError, FileNotFoundError):
return False
def get_user_input(prompt, required=True):
"""Get user input with validation"""
while True:
value = input(f"{prompt}: ").strip()
if value or not required:
return value
print("This field is required. Please enter a value.")
def main():
print("🚀 Spend Analyzer MCP - Modal Setup Script")
print("=" * 50)
# Check if Modal is installed
if not check_modal_installed():
print("\n📦 Installing Modal CLI...")
if not run_command("pip install modal", "Installing Modal"):
print("❌ Failed to install Modal. Please install manually: pip install modal")
sys.exit(1)
else:
print("✅ Modal CLI is already installed")
# Check if user is authenticated
print("\n🔐 Checking Modal authentication...")
try:
result = subprocess.run(["modal", "token", "current"], check=True, capture_output=True, text=True)
print("✅ Already authenticated with Modal")
except subprocess.CalledProcessError:
print("🔑 Need to authenticate with Modal...")
if not run_command("modal token new", "Authenticating with Modal"):
print("❌ Authentication failed. Please run 'modal token new' manually")
sys.exit(1)
# Collect API keys and credentials
print("\n📝 Please provide your API keys and credentials:")
print("(You can get these from the respective provider websites)")
anthropic_key = get_user_input("Anthropic API Key (for Claude)")
sambanova_key = get_user_input("SambaNova API Key (optional)", required=False)
email_user = get_user_input("Email address")
email_pass = get_user_input("Email app password")
imap_server = get_user_input("IMAP server (default: imap.gmail.com)", required=False) or "imap.gmail.com"
# Create Modal secrets
print("\n🔒 Creating Modal secrets...")
secrets_to_create = [
(f"modal secret create anthropic-api-key ANTHROPIC_API_KEY={anthropic_key}",
"Creating Anthropic API key secret"),
(f"modal secret create email-credentials EMAIL_USER={email_user} EMAIL_PASS={email_pass} IMAP_SERVER={imap_server}",
"Creating email credentials secret")
]
if sambanova_key:
secrets_to_create.append(
(f"modal secret create sambanova-api-key SAMBANOVA_API_KEY={sambanova_key}",
"Creating SambaNova API key secret")
)
for cmd, description in secrets_to_create:
if not run_command(cmd, description):
print(f"⚠️ Failed to create secret. You may need to create it manually.")
# Deploy to Modal
print("\n🚀 Deploying to Modal...")
if run_command("modal deploy modal_deployment.py", "Deploying application"):
print("\n🎉 Deployment completed successfully!")
print("\n📋 Next steps:")
print("1. Check your Modal dashboard for the deployed app")
print("2. Test the deployment with: modal run modal_deployment.py")
print("3. View logs with: modal logs spend-analyzer-mcp-bmt")
print("4. Monitor usage with: modal stats spend-analyzer-mcp-bmt")
# Create local .env file
env_content = f"""# Spend Analyzer MCP Environment Variables
ANTHROPIC_API_KEY={anthropic_key}
EMAIL_USER={email_user}
EMAIL_PASS={email_pass}
IMAP_SERVER={imap_server}
"""
if sambanova_key:
env_content += f"SAMBANOVA_API_KEY={sambanova_key}\n"
with open(".env", "w") as f:
f.write(env_content)
print("5. Created .env file for local development")
else:
print("\n❌ Deployment failed. Please check the errors above and try again.")
print("You can also deploy manually with: modal deploy modal_deployment.py")
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\n\n⏹️ Setup cancelled by user")
sys.exit(1)
except Exception as e:
print(f"\n❌ Unexpected error: {e}")
sys.exit(1)