Skip to main content
Glama

API Registry MCP Server

deploy.sh•15.3 kB
#!/bin/bash # Deploy the Databricks App Template to Databricks. # For configuration options see README.md and .env.local. # Usage: ./deploy.sh [--verbose] [--create] [--app-name <name>] set -e # Parse command line arguments VERBOSE=false CREATE_APP=false CUSTOM_APP_NAME="" while [[ $# -gt 0 ]]; do case $1 in --verbose) VERBOSE=true echo "šŸ” Verbose mode enabled" shift ;; --create) CREATE_APP=true echo "šŸ”§ App creation mode enabled" shift ;; --app-name) CUSTOM_APP_NAME="$2" shift 2 ;; *) echo "Unknown argument: $1" echo "Usage: ./deploy.sh [--verbose] [--create] [--app-name <name>]" echo "" echo "Options:" echo " --verbose Enable verbose output" echo " --create Create the app if it doesn't exist" echo " --app-name Custom app name (must start with 'mcp-')" echo "" echo "Example:" echo " ./deploy.sh --app-name mcp-my-custom-registry" exit 1 ;; esac done # Function to print timing info print_timing() { if [ "$VERBOSE" = true ]; then echo "ā±ļø $(date '+%H:%M:%S') - $1" fi } # Load environment variables from .env.local if it exists. print_timing "Loading environment variables" if [ -f .env.local ] then set -a source .env.local set +a fi # Handle custom app name if provided if [ -n "$CUSTOM_APP_NAME" ]; then echo "šŸ·ļø Using custom app name: $CUSTOM_APP_NAME" # Validate app name starts with "mcp-" if [[ ! "$CUSTOM_APP_NAME" =~ ^mcp- ]]; then echo "āŒ Error: App name must start with 'mcp-'" echo " Provided: $CUSTOM_APP_NAME" echo " Example: mcp-my-custom-registry" exit 1 fi # Override DATABRICKS_APP_NAME with custom name export DATABRICKS_APP_NAME="$CUSTOM_APP_NAME" echo "āœ… App name validated: $DATABRICKS_APP_NAME" # Update DBA_SOURCE_CODE_PATH to match the custom app name # Extract the directory part and replace just the app folder name if [ -n "$DBA_SOURCE_CODE_PATH" ]; then # Get the parent directory PARENT_DIR=$(dirname "$DBA_SOURCE_CODE_PATH") # Use custom app name for the folder export DBA_SOURCE_CODE_PATH="$PARENT_DIR/$CUSTOM_APP_NAME" echo "šŸ“ Updated workspace path: $DBA_SOURCE_CODE_PATH" fi fi # Validate required configuration if [ -z "$DBA_SOURCE_CODE_PATH" ] then echo "āŒ DBA_SOURCE_CODE_PATH is not set. Please run ./setup.sh first." exit 1 fi if [ -z "$DATABRICKS_APP_NAME" ] then echo "āŒ DATABRICKS_APP_NAME is not set. Please run ./setup.sh first or provide --app-name." exit 1 fi if [ -z "$DATABRICKS_AUTH_TYPE" ] then echo "āŒ DATABRICKS_AUTH_TYPE is not set. Please run ./setup.sh first." exit 1 fi # Handle authentication based on type print_timing "Starting authentication" echo "šŸ” Authenticating with Databricks..." if [ "$DATABRICKS_AUTH_TYPE" = "pat" ]; then # PAT Authentication if [ -z "$DATABRICKS_HOST" ] || [ -z "$DATABRICKS_TOKEN" ]; then echo "āŒ PAT authentication requires DATABRICKS_HOST and DATABRICKS_TOKEN. Please run ./setup.sh first." exit 1 fi echo "Using Personal Access Token authentication" export DATABRICKS_HOST="$DATABRICKS_HOST" export DATABRICKS_TOKEN="$DATABRICKS_TOKEN" # Test connection if ! databricks current-user me >/dev/null 2>&1; then echo "āŒ PAT authentication failed. Please check your credentials." echo "šŸ’” Try running: databricks auth login --host $DATABRICKS_HOST" echo "šŸ’” Or run ./setup.sh to reconfigure authentication" exit 1 fi elif [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then # Profile Authentication if [ -z "$DATABRICKS_CONFIG_PROFILE" ]; then echo "āŒ Profile authentication requires DATABRICKS_CONFIG_PROFILE. Please run ./setup.sh first." exit 1 fi echo "Using profile authentication: $DATABRICKS_CONFIG_PROFILE" # Test connection if ! databricks current-user me --profile "$DATABRICKS_CONFIG_PROFILE" >/dev/null 2>&1; then echo "āŒ Profile authentication failed. Please check your profile configuration." echo "šŸ’” Try running: databricks auth login --host <your-host> --profile $DATABRICKS_CONFIG_PROFILE" echo "šŸ’” Or run ./setup.sh to reconfigure authentication" exit 1 fi else echo "āŒ Invalid DATABRICKS_AUTH_TYPE: $DATABRICKS_AUTH_TYPE. Must be 'pat' or 'profile'." exit 1 fi echo "āœ… Databricks authentication successful" print_timing "Authentication completed" # Display configuration summary echo "" echo "šŸ“‹ Deployment Configuration" echo "============================" echo "App Name: $DATABRICKS_APP_NAME" echo "Workspace Path: $DBA_SOURCE_CODE_PATH" echo "Authentication: $DATABRICKS_AUTH_TYPE" if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then echo "Profile: $DATABRICKS_CONFIG_PROFILE" else echo "Databricks Host: $DATABRICKS_HOST" fi echo "============================" echo "" # Function to display app info display_app_info() { echo "" echo "šŸ“± App Name: $DATABRICKS_APP_NAME" # Get app URL if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then APP_URL=$(databricks apps get "$DATABRICKS_APP_NAME" --profile "$DATABRICKS_CONFIG_PROFILE" --output json 2>/dev/null | python3 -c " import json, sys try: data = json.load(sys.stdin) print(data.get('url', 'URL not available')) except: print('URL not available') " 2>/dev/null) else APP_URL=$(databricks apps get "$DATABRICKS_APP_NAME" --output json 2>/dev/null | python3 -c " import json, sys try: data = json.load(sys.stdin) print(data.get('url', 'URL not available')) except: print('URL not available') " 2>/dev/null) fi echo "🌐 App URL: $APP_URL" echo "" } # Display initial app info display_app_info # Check if app needs to be created if [ "$CREATE_APP" = true ]; then print_timing "Starting app creation check" echo "šŸ” Checking if app '$DATABRICKS_APP_NAME' exists..." # Check if app exists if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then APP_EXISTS=$(databricks apps list --profile "$DATABRICKS_CONFIG_PROFILE" 2>/dev/null | grep -c "^$DATABRICKS_APP_NAME " 2>/dev/null || echo "0") else APP_EXISTS=$(databricks apps list 2>/dev/null | grep -c "^$DATABRICKS_APP_NAME " 2>/dev/null || echo "0") fi # Clean up the variable (remove any whitespace/newlines) APP_EXISTS=$(echo "$APP_EXISTS" | head -1 | tr -d '\n') if [ "$APP_EXISTS" -eq 0 ]; then echo "āŒ App '$DATABRICKS_APP_NAME' does not exist. Creating it..." echo "ā³ This may take several minutes..." if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then if [ "$VERBOSE" = true ]; then databricks apps create "$DATABRICKS_APP_NAME" --profile "$DATABRICKS_CONFIG_PROFILE" else databricks apps create "$DATABRICKS_APP_NAME" --profile "$DATABRICKS_CONFIG_PROFILE" > /dev/null 2>&1 fi else if [ "$VERBOSE" = true ]; then databricks apps create "$DATABRICKS_APP_NAME" else databricks apps create "$DATABRICKS_APP_NAME" > /dev/null 2>&1 fi fi echo "āœ… App '$DATABRICKS_APP_NAME' created successfully" # Verify creation if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then APP_EXISTS=$(databricks apps list --profile "$DATABRICKS_CONFIG_PROFILE" | grep -c "^$DATABRICKS_APP_NAME " || echo "0") else APP_EXISTS=$(databricks apps list | grep -c "^$DATABRICKS_APP_NAME " || echo "0") fi if [ "$APP_EXISTS" -eq 0 ]; then echo "āŒ Failed to create app '$DATABRICKS_APP_NAME'" exit 1 fi else echo "āœ… App '$DATABRICKS_APP_NAME' already exists" fi print_timing "App creation check completed" fi mkdir -p build # Generate requirements.txt from pyproject.toml without editable installs print_timing "Starting requirements generation" echo "šŸ“¦ Generating requirements.txt..." if [ "$VERBOSE" = true ]; then echo "Using custom script to avoid editable installs..." fi if ! uv run python scripts/generate_semver_requirements.py; then echo "āŒ Failed to generate requirements.txt" echo "šŸ’” Check if pyproject.toml exists and is valid" echo "šŸ’” Try running: uv run python scripts/generate_semver_requirements.py" exit 1 fi echo "āœ… Requirements generated successfully" print_timing "Requirements generation completed" # Build frontend print_timing "Starting frontend build" echo "šŸ—ļø Building frontend..." # Check if node_modules exists if [ ! -d "client/node_modules" ]; then echo "āš ļø node_modules not found. Installing dependencies first..." cd client if [ "$VERBOSE" = true ]; then npm install else npm install > /dev/null 2>&1 fi if [ $? -ne 0 ]; then echo "āŒ npm install failed" echo "šŸ’” Try running: cd client && npm install" exit 1 fi cd .. echo "āœ… Dependencies installed" fi # Build the frontend cd client if [ "$VERBOSE" = true ]; then npm run build BUILD_EXIT_CODE=$? else BUILD_OUTPUT=$(npm run build 2>&1) BUILD_EXIT_CODE=$? fi if [ $BUILD_EXIT_CODE -ne 0 ]; then cd .. echo "āŒ Frontend build failed" echo "" echo "Error details:" if [ "$VERBOSE" != true ]; then echo "$BUILD_OUTPUT" fi echo "" echo "šŸ’” Troubleshooting steps:" echo " 1. Check if client/package.json exists" echo " 2. Try: cd client && npm install && npm run build" echo " 3. Run with --verbose flag to see full output: ./deploy.sh --verbose" exit 1 fi cd .. echo "āœ… Frontend build complete" print_timing "Frontend build completed" # Create workspace directory and upload source print_timing "Starting workspace setup" echo "šŸ“‚ Creating workspace directory: $DBA_SOURCE_CODE_PATH" MKDIR_OUTPUT="" MKDIR_SUCCESS=false if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then if MKDIR_OUTPUT=$(databricks workspace mkdirs "$DBA_SOURCE_CODE_PATH" --profile "$DATABRICKS_CONFIG_PROFILE" 2>&1); then MKDIR_SUCCESS=true fi else if MKDIR_OUTPUT=$(databricks workspace mkdirs "$DBA_SOURCE_CODE_PATH" 2>&1); then MKDIR_SUCCESS=true fi fi if [ "$MKDIR_SUCCESS" = false ]; then echo "āŒ Failed to create workspace directory" echo "" echo "Error details:" echo "$MKDIR_OUTPUT" echo "" echo "šŸ’” Path: $DBA_SOURCE_CODE_PATH" echo "šŸ’” Possible causes:" echo " 1. You don't have permissions to create directories in /Workspace/Users/" echo " 2. The parent directory doesn't exist" echo " 3. Invalid characters in the path" echo "" echo "šŸ’” Try manually creating the directory:" if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then echo " databricks workspace mkdirs \"$DBA_SOURCE_CODE_PATH\" --profile $DATABRICKS_CONFIG_PROFILE" else echo " databricks workspace mkdirs \"$DBA_SOURCE_CODE_PATH\"" fi exit 1 fi echo "āœ… Workspace directory created" echo "šŸ“¤ Syncing source code to workspace..." # Use databricks sync to properly update all files including requirements.txt if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then if ! databricks sync . "$DBA_SOURCE_CODE_PATH" --profile "$DATABRICKS_CONFIG_PROFILE"; then echo "āŒ Failed to sync source code to workspace" echo "šŸ’” Check network connectivity and workspace permissions" exit 1 fi else if ! databricks sync . "$DBA_SOURCE_CODE_PATH"; then echo "āŒ Failed to sync source code to workspace" echo "šŸ’” Check network connectivity and workspace permissions" exit 1 fi fi echo "āœ… Source code synced successfully" print_timing "Workspace setup completed" # Deploy to Databricks print_timing "Starting Databricks deployment" echo "šŸš€ Deploying app '$DATABRICKS_APP_NAME' to Databricks..." echo " This may take several minutes..." DEPLOY_SUCCESS=false if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then if [ "$VERBOSE" = true ]; then if databricks apps deploy "$DATABRICKS_APP_NAME" --source-code-path "$DBA_SOURCE_CODE_PATH" --debug --profile "$DATABRICKS_CONFIG_PROFILE"; then DEPLOY_SUCCESS=true fi else if databricks apps deploy "$DATABRICKS_APP_NAME" --source-code-path "$DBA_SOURCE_CODE_PATH" --profile "$DATABRICKS_CONFIG_PROFILE"; then DEPLOY_SUCCESS=true fi fi else if [ "$VERBOSE" = true ]; then if databricks apps deploy "$DATABRICKS_APP_NAME" --source-code-path "$DBA_SOURCE_CODE_PATH" --debug; then DEPLOY_SUCCESS=true fi else if databricks apps deploy "$DATABRICKS_APP_NAME" --source-code-path "$DBA_SOURCE_CODE_PATH"; then DEPLOY_SUCCESS=true fi fi fi if [ "$DEPLOY_SUCCESS" = false ]; then echo "" echo "āŒ Deployment failed" echo "" echo "šŸ’” Troubleshooting steps:" echo " 1. Check if Databricks Apps is enabled in your workspace" echo " 2. Verify app.yaml exists and is valid" echo " 3. Check app logs: databricks apps logs $DATABRICKS_APP_NAME" echo " 4. Run with --verbose for detailed output: ./deploy.sh --verbose" echo " 5. See WORKSPACE_REQUIREMENTS.md for prerequisites" exit 1 fi print_timing "Databricks deployment completed" echo "" echo "āœ… Deployment complete!" echo "" # Get the actual app URL from the apps list echo "šŸ” Getting app URL..." if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then APP_URL=$(databricks apps list --profile "$DATABRICKS_CONFIG_PROFILE" --output json 2>/dev/null | python3 -c " import json, sys try: data = json.load(sys.stdin) if isinstance(data, list): apps = data else: apps = data.get('apps', []) for app in apps: if app.get('name') == '"'"'$DATABRICKS_APP_NAME'"'"': print(app.get('url', '')) break except: pass " 2>/dev/null) else APP_URL=$(databricks apps list --output json 2>/dev/null | python3 -c " import json, sys try: data = json.load(sys.stdin) if isinstance(data, list): apps = data else: apps = data.get('apps', []) for app in apps: if app.get('name') == '"'"'$DATABRICKS_APP_NAME'"'"': print(app.get('url', '')) break except: pass " 2>/dev/null) fi if [ -n "$APP_URL" ]; then echo "Your app is available at:" echo "$APP_URL" echo "" echo "šŸ“Š Monitor deployment logs at (visit in browser):" echo "$APP_URL/logz" else # Fallback to workspace URL if we can't get the app URL if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then WORKSPACE_URL=$(databricks workspace current --profile "$DATABRICKS_CONFIG_PROFILE" 2>/dev/null | grep -o 'https://[^/]*' || echo "https://<your-databricks-workspace>") else WORKSPACE_URL="$DATABRICKS_HOST" fi echo "Your app should be available at:" echo "$WORKSPACE_URL/apps/$DATABRICKS_APP_NAME" echo "" echo "šŸ“Š Monitor deployment logs at (visit in browser):" echo "Check 'databricks apps list' for the actual app URL, then add /logz" fi echo "" if [ "$DATABRICKS_AUTH_TYPE" = "profile" ]; then echo "To check the status:" echo "databricks apps list --profile $DATABRICKS_CONFIG_PROFILE" else echo "To check the status:" echo "databricks apps list" fi echo "" echo "šŸ’” If the app fails to start, visit the /logz endpoint in your browser for installation issues." echo "šŸ’” The /logz endpoint requires browser authentication (OAuth) and cannot be accessed via curl."

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/lucamilletti99/dataverse_mcp_server'

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