run.sh•4.76 kB
#!/bin/bash
# Author: Mihai Criveti
# Exit on any error
set -e
# Default settings
HOST=${HOST:-0.0.0.0}
PORT=${PORT:-4444}
ENV_FILE=${ENV_FILE:-.env}
LOG_LEVEL=${LOG_LEVEL:-info}
LOG_FORMAT=${LOG_FORMAT:-json}
RELOAD=${RELOAD:-false}
WORKERS=${WORKERS:-1}
ACCESS_LOG=${ACCESS_LOG:-true}
APP_MODULE=${APP_MODULE:-mcpgateway.main:app}
# Help message
show_help() {
echo "MCP Gateway Runner"
echo "==================="
echo ""
echo "Usage: $0 [options]"
echo ""
echo "Options:"
echo " -h, --help Show this help message"
echo " -e, --env FILE Use specific env file (default: .env)"
echo " -H, --host HOST Bind to HOST address (default: 0.0.0.0)"
echo " -p, --port PORT Use PORT (default: 4444)"
echo " -l, --log LEVEL Set log level: debug, info, warning, error, critical (default: info)"
echo " -f, --format FORMAT Set log format: json or text (default: json)"
echo " -r, --reload Enable auto-reload for development"
echo " -w, --workers N Number of worker processes (default: 1)"
echo " -n, --no-access-log Disable access log"
echo " -m, --module MODULE Use specified app module (default: mcpgateway.main:app)"
echo ""
}
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-e|--env)
ENV_FILE="$2"
shift 2
;;
-H|--host)
HOST="$2"
shift 2
;;
-p|--port)
PORT="$2"
shift 2
;;
-l|--log)
LOG_LEVEL="$2"
shift 2
;;
-r|--reload)
RELOAD=true
shift
;;
-w|--workers)
WORKERS="$2"
shift 2
;;
-n|--no-access-log)
ACCESS_LOG=false
shift
;;
-m|--module)
APP_MODULE="$2"
shift 2
;;
*)
echo "Unknown option: $1"
show_help
exit 1
;;
esac
done
# Create default .env if it doesn't exist
if [ ! -f "$ENV_FILE" ]; then
echo "Creating default $ENV_FILE..."
cat > "$ENV_FILE" << EOL
# Basic Settings
APP_NAME=MCP_Gateway
HOST=${HOST}
PORT=${PORT}
DATABASE_URL=sqlite:///./mcp.db
LOG_LEVEL=${LOG_LEVEL^^}
LOG_FORMAT=${LOG_FORMAT}
# Authentication
BASIC_AUTH_USER=admin
BASIC_AUTH_PASSWORD=changeme
AUTH_REQUIRED=true
AUTH_ENCRYPTION_SECRET=my-test-salt
# Security
SKIP_SSL_VERIFY=false
ALLOWED_ORIGINS='["http://localhost", "http://localhost:${PORT}"]'
CORS_ENABLED=true
# Transport
TRANSPORT_TYPE=all
WEBSOCKET_PING_INTERVAL=30
SSE_RETRY_TIMEOUT=5000
# Federation
FEDERATION_ENABLED=true
FEDERATION_DISCOVERY=false
FEDERATION_TIMEOUT=30
FEDERATION_SYNC_INTERVAL=300
# Resources
RESOURCE_CACHE_SIZE=1000
RESOURCE_CACHE_TTL=3600
MAX_RESOURCE_SIZE=10485760
# Tools
TOOL_TIMEOUT=60
MAX_TOOL_RETRIES=3
TOOL_RATE_LIMIT=100
TOOL_CONCURRENT_LIMIT=10
# Database
DB_POOL_SIZE=200
DB_MAX_OVERFLOW=10
DB_POOL_TIMEOUT=30
DB_POOL_RECYCLE=3600
# Development
DEV_MODE=$([ "$RELOAD" = "true" ] && echo "true" || echo "false")
EOL
fi
# Load environment variables
if [ -f "$ENV_FILE" ]; then
echo "Loading environment from $ENV_FILE..."
set -a
source "$ENV_FILE"
set +a
fi
# Validate log level
if ! [[ "$LOG_LEVEL" =~ ^(debug|info|warning|error|critical)$ ]]; then
echo "Invalid log level: $LOG_LEVEL"
echo "Must be one of: debug, info, warning, error, critical"
exit 1
fi
# Validate log format
if ! [[ "$LOG_FORMAT" =~ ^(json|text)$ ]]; then
echo "Invalid log format: $LOG_FORMAT"
echo "Must be one of: json, text"
exit 1
fi
# Create database directory if needed
if [[ "$DATABASE_URL" == sqlite:* ]]; then
DB_PATH=$(echo "$DATABASE_URL" | sed -e 's/^sqlite:\/\///')
DB_DIR=$(dirname "$DB_PATH")
echo "Ensuring database directory exists: $DB_DIR"
mkdir -p "$DB_DIR"
fi
# Build log configuration
if [ "$ACCESS_LOG" = "false" ]; then
LOG_CONFIG="$LOG_CONFIG --no-access-log"
fi
# Check if running in development mode
if [ "$RELOAD" = "true" ]; then
echo "Starting MCP Gateway in development mode..."
echo "Running: uvicorn $APP_MODULE --host $HOST --port $PORT --reload $LOG_CONFIG"
exec uvicorn $APP_MODULE \
--host "$HOST" \
--port "$PORT" \
--reload \
$LOG_CONFIG
else
echo "Starting MCP Gateway in production mode..."
echo "Running: uvicorn $APP_MODULE --host $HOST --port $PORT --workers $WORKERS $LOG_CONFIG"
exec uvicorn $APP_MODULE \
--host "$HOST" \
--port "$PORT" \
--workers "$WORKERS" \
$LOG_CONFIG
fi