Skip to content

Soundcheck: dogfood @mcpjam/design-system (#1850) #10

Soundcheck: dogfood @mcpjam/design-system (#1850)

Soundcheck: dogfood @mcpjam/design-system (#1850) #10

name: Deploy MCP Staging
on:
push:
branches:
- main
paths:
- "mcp/**"
- "package.json"
- "package-lock.json"
- ".changeset/config.json"
- ".github/workflows/deploy-mcp-staging.yml"
workflow_dispatch:
permissions:
contents: read
deployments: write
concurrency:
group: mcp-staging
cancel-in-progress: true
env:
NODE_VERSION: "24.14.0"
# Hardcoded instead of `steps.deploy.outputs.deployment-url` because
# cloudflare/wrangler-action@v3 returns a malformed value for
# custom-domain deploys — e.g. `mcp-staging.mcpjam.com (custom domain)`
# with no scheme and a trailing suffix (wrangler-action#396). Pinning
# the known hostname sidesteps that.
STAGING_URL: "https://mcp-staging.mcpjam.com"
jobs:
deploy:
runs-on: ubuntu-latest
timeout-minutes: 30
environment:
name: mcp-staging
url: ${{ vars.MCP_WORKER_STAGING_URL }}
steps:
- name: Enforce main branch
run: |
if [ "${GITHUB_REF_NAME}" != "main" ]; then
echo "deploy-mcp-staging.yml must run from main" >&2
exit 1
fi
- name: Require Cloudflare credentials
env:
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
run: |
if [ -z "$CLOUDFLARE_ACCOUNT_ID" ]; then
echo "Missing GitHub Actions secret: CLOUDFLARE_ACCOUNT_ID" >&2
exit 1
fi
if [ -z "$CLOUDFLARE_API_TOKEN" ]; then
echo "Missing GitHub Actions secret: CLOUDFLARE_API_TOKEN" >&2
exit 1
fi
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- name: Install workspace dependencies
run: npm ci --legacy-peer-deps
- name: Typecheck MCP worker
run: npm run typecheck -w @mcpjam/mcp
- name: Deploy staging worker
id: deploy
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
workingDirectory: "mcp"
command: deploy --env staging
- name: Smoke test landing page
run: |
# First deploy onto a new custom domain can take up to ~60s for
# Cloudflare to provision the edge cert and propagate the
# hostname. Budget 20 × 3s = ~60s of retries (plus curl
# latency) so the cold-start case actually covers the window.
for attempt in $(seq 1 20); do
if curl --fail --silent --show-error "$STAGING_URL" | grep -q "MCPJam MCP"; then
echo "Smoke OK on attempt $attempt"
exit 0
fi
echo "Attempt $attempt returned non-200 or mismatched content; retrying in 3s…"
sleep 3
done
echo "Staging URL never resolved correctly." >&2
exit 1
- name: Summarize staging deployment
run: |
echo "## ✅ MCP staging deployed" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "- Worker: \`mcpjam-mcp-staging\`" >> "$GITHUB_STEP_SUMMARY"
echo "- URL: \`$STAGING_URL\`" >> "$GITHUB_STEP_SUMMARY"
echo "- MCP endpoint: \`$STAGING_URL/mcp\`" >> "$GITHUB_STEP_SUMMARY"