Skip to main content
Glama

Timezone MCP Server

by sam-artuso
deploy.shβ€’7.62 kB
#!/usr/bin/env bash # # Deploy MCP Timezone Server to Google Cloud Run # # This script automates the deployment process: # 1. Loads environment variables from .env # 2. Sets the GCloud project # 3. Submits build to Cloud Build # 4. Retrieves and displays the service URL # # Usage: # ./scripts/deploy.sh set -euo pipefail # Color output for better readability GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # Get script directory and project root # Save these before sourcing load-env.sh (which unsets temporary variables) DEPLOY_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)" DEPLOY_PROJECT_ROOT="$(cd "$DEPLOY_SCRIPT_DIR/.." && pwd)" echo -e "${BLUE}πŸš€ MCP Timezone Server Deployment${NC}" echo "==================================" echo "" # Step 1: Load environment variables echo -e "${YELLOW}πŸ“¦ Loading environment variables...${NC}" if [ ! -f "$DEPLOY_PROJECT_ROOT/.env" ]; then echo -e "${RED}Error: .env file not found!${NC}" echo "Please create .env from example.env:" echo " cp example.env .env" exit 1 fi # Source the load-env.sh script (it will unset its own temp variables) source "$DEPLOY_SCRIPT_DIR/load-env.sh" # Verify required variables are set if [ -z "${GCLOUD_PROJECT_ID:-}" ] || [ -z "${GCLOUD_REGION:-}" ]; then echo -e "${RED}Error: Required environment variables not set${NC}" echo "Please ensure .env contains:" echo " GCLOUD_PROJECT_ID=your-project-id" echo " GCLOUD_REGION=your-region" exit 1 fi echo " GCLOUD_PROJECT_ID=$GCLOUD_PROJECT_ID" echo " GCLOUD_REGION=$GCLOUD_REGION" echo "" # Step 2: Set GCloud project echo -e "${YELLOW}βš™οΈ Setting GCloud project...${NC}" gcloud config set project "$GCLOUD_PROJECT_ID" echo -e "${GREEN}βœ“ Project set${NC}" echo "" # Step 3: Build and deploy echo -e "${YELLOW}πŸ”¨ Building and deploying to Cloud Run...${NC}" echo "This may take a few minutes..." echo "" cd "$DEPLOY_PROJECT_ROOT" gcloud builds submit --config cloudbuild.yaml echo "" echo -e "${GREEN}βœ“ Build and deployment complete${NC}" echo "" # Step 4: Get service URL echo -e "${YELLOW}🌐 Retrieving service URL...${NC}" SERVICE_URL=$(gcloud run services describe mcp-timezone-server \ --region "$GCLOUD_REGION" \ --format='value(status.url)') if [ -z "$SERVICE_URL" ]; then echo -e "${RED}Error: Could not retrieve service URL${NC}" exit 1 fi echo -e "${GREEN}βœ“ Service deployed successfully!${NC}" echo "" # Save the production URL to file for easy reference echo "$SERVICE_URL" > "$DEPLOY_PROJECT_ROOT/latest-prod-url.txt" echo -e "${GREEN}βœ“ Production URL saved to latest-prod-url.txt${NC}" echo "" echo "==================================" echo -e "${GREEN}πŸŽ‰ Deployment Complete!${NC}" echo "==================================" echo "" echo "Service URL: $SERVICE_URL" echo "MCP Endpoint (for Claude Desktop): $SERVICE_URL/mcp" echo "Health Check: $SERVICE_URL/health" echo "" # Step 5: Test the deployment (automatic) echo -e "${YELLOW}πŸ§ͺ Testing deployment...${NC}" echo "" # Test 1: Health check echo "Testing health endpoint..." if curl -s -f "$SERVICE_URL/health" | grep -q "ok"; then echo -e "${GREEN}βœ“ Health check passed${NC}" else echo -e "${RED}βœ— Health check failed${NC}" echo -e "${YELLOW}⚠️ Skipping cleanup due to failed health check${NC}" exit 1 fi # Test 2: Service info endpoint echo "Testing service info endpoint..." if curl -s -f "$SERVICE_URL/" > /dev/null 2>&1; then echo -e "${GREEN}βœ“ Service info endpoint accessible${NC}" else echo -e "${RED}βœ— Service info endpoint failed${NC}" echo -e "${YELLOW}⚠️ Skipping cleanup due to failed endpoint test${NC}" exit 1 fi # Test 3: MCP Streamable HTTP endpoint echo "Testing MCP endpoint..." # Test with a simple GET request to the MCP endpoint if curl -s -f "$SERVICE_URL/mcp" -I | grep -q "200\|404"; then echo -e "${GREEN}βœ“ MCP endpoint accessible${NC}" else echo -e "${YELLOW}⚠️ MCP endpoint may need further testing${NC}" fi echo "" echo -e "${GREEN}βœ“ All critical tests passed!${NC}" echo "" # Step 6: Clean up old resources echo -e "${YELLOW}🧹 Cleaning up old resources...${NC}" echo "" # Cleanup 1: Delete old Docker images (keep only latest tag) echo "Cleaning up old Docker images..." OLD_IMAGES=$(gcloud artifacts docker images list \ "europe-west2-docker.pkg.dev/$GCLOUD_PROJECT_ID/mcp-docker-repo/mcp-timezone-server" \ --format="value(IMAGE)" \ --filter="NOT tags:latest" 2>/dev/null || true) if [ -n "$OLD_IMAGES" ]; then IMAGE_COUNT=0 while IFS= read -r image; do if [ -n "$image" ]; then echo " Deleting: $image" gcloud artifacts docker images delete "$image" --quiet 2>/dev/null || true IMAGE_COUNT=$((IMAGE_COUNT + 1)) fi done <<< "$OLD_IMAGES" echo -e "${GREEN}βœ“ Deleted $IMAGE_COUNT old Docker image(s)${NC}" else echo -e "${GREEN}βœ“ No old Docker images to delete${NC}" fi # Cleanup 2: Delete old Cloud Run revisions (keep latest 2) echo "" echo "Cleaning up old Cloud Run revisions..." OLD_REVISIONS=$(gcloud run revisions list \ --service=mcp-timezone-server \ --region="$GCLOUD_REGION" \ --format="value(REVISION)" \ --sort-by="~metadata.creationTimestamp" \ 2>/dev/null | tail -n +3) if [ -n "$OLD_REVISIONS" ]; then REVISION_COUNT=0 while IFS= read -r revision; do if [ -n "$revision" ]; then echo " Deleting: $revision" gcloud run revisions delete "$revision" \ --region="$GCLOUD_REGION" \ --quiet 2>/dev/null || true REVISION_COUNT=$((REVISION_COUNT + 1)) fi done <<< "$OLD_REVISIONS" echo -e "${GREEN}βœ“ Deleted $REVISION_COUNT old revision(s)${NC}" else echo -e "${GREEN}βœ“ No old revisions to delete (keeping latest 2)${NC}" fi # Cleanup 3: Delete Cloud Build artifacts older than 1 day echo "" echo "Cleaning up old Cloud Build artifacts..." BUCKET_NAME="${GCLOUD_PROJECT_ID}_cloudbuild" CUTOFF_DATE=$(date -u -v-1d '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || date -u -d '1 day ago' '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || echo "") if [ -n "$CUTOFF_DATE" ]; then # List and delete old artifacts OLD_ARTIFACTS=$(gsutil ls -l "gs://$BUCKET_NAME/source/" 2>/dev/null | \ awk -v cutoff="$CUTOFF_DATE" '$1 < cutoff && $3 ~ /^gs:/ {print $3}' || true) if [ -n "$OLD_ARTIFACTS" ]; then ARTIFACT_COUNT=0 while IFS= read -r artifact; do if [ -n "$artifact" ]; then echo " Deleting: $artifact" gsutil -m rm -r "$artifact" 2>/dev/null || true ARTIFACT_COUNT=$((ARTIFACT_COUNT + 1)) fi done <<< "$OLD_ARTIFACTS" echo -e "${GREEN}βœ“ Deleted $ARTIFACT_COUNT old build artifact(s)${NC}" else echo -e "${GREEN}βœ“ No old build artifacts to delete (older than 1 day)${NC}" fi else echo -e "${YELLOW}⚠️ Could not determine cutoff date for artifact cleanup${NC}" fi echo "" echo -e "${GREEN}βœ“ Resource cleanup complete!${NC}" echo "" # Final Summary echo "==================================" echo -e "${GREEN}βœ… Deployment Complete!${NC}" echo "==================================" echo "" echo "Service URL: $SERVICE_URL" echo "MCP Endpoint: $SERVICE_URL/mcp" echo "Health Check: $SERVICE_URL/health" echo "" echo "To monitor logs:" echo " gcloud beta logging tail \"resource.type=cloud_run_revision AND resource.labels.service_name=mcp-timezone-server\" --project=$GCLOUD_PROJECT_ID" echo "" echo -e "${GREEN}Done!${NC}"

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/sam-artuso/demo-mcp'

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