All images and scripts

Claude controller setup

sh1 included script

What it asks for

Api keyrequired
The api key of the project

What it runs

The whole script, exactly as it will execute in your workspace. Nothing is hidden — read it before you run it.

#!/usr/bin/env sh

set -e

MCP_NAME="devgrail"
MCP_HEADER="Authorization: Bearer $DEVGRAIL_API_KEY"

if claude mcp get "$MCP_NAME" >/dev/null 2>&1; then
    echo "MCP server '$MCP_NAME' already registered — skipping"
else
    claude mcp add --transport http --scope user "$MCP_NAME" "$DEVGRAIL_MCP_URL" \
        --header "$MCP_HEADER" \
        || { echo "ERROR: claude mcp add failed (exit $?)" >&2; exit 1; }
    echo "Added MCP server '$MCP_NAME'"
fi

Included scripts

These come along automatically when you add this script.

Claude code setup with credentials
#!/usr/bin/env sh

set -e

# ── helpers ────────────────────────────────────────────────────────────────────
log()  { printf '[setup] %s\n' "$*"; }
warn() { printf '[setup] WARNING: %s\n' "$*" >&2; }
die()  { printf '[setup] ERROR: %s\n' "$*" >&2; exit 1; }

# ── install jq if missing ──────────────────────────────────────────────────────
if ! command -v jq >/dev/null 2>&1; then
    log "jq not found; attempting install..."
    if   command -v apt-get >/dev/null 2>&1; then sudo apt-get update -qq && sudo apt-get install -y jq
    elif command -v dnf     >/dev/null 2>&1; then sudo dnf install -y jq
    elif command -v yum     >/dev/null 2>&1; then sudo yum install -y jq
    elif command -v pacman  >/dev/null 2>&1; then sudo pacman -Sy --noconfirm jq
    elif command -v zypper  >/dev/null 2>&1; then sudo zypper install -y jq
    elif command -v brew    >/dev/null 2>&1; then brew install jq
    else die "no supported package manager found; install jq manually and re-run"
    fi
    command -v jq >/dev/null 2>&1 || die "jq installation appeared to succeed but jq is still not on PATH"
    log "jq installed: $(jq --version)"
fi

# ── update ~/.claude.json ──────────────────────────────────────────────────────
CLAUDE_JSON="$HOME/.claude.json"
if [ ! -f "$CLAUDE_JSON" ]; then
    printf '%s\n' '{"hasCompletedOnboarding":true}' > "$CLAUDE_JSON"
    log "created $CLAUDE_JSON"
else
    tmp="$(mktemp)"
    # Write to temp first; only replace on success
    if jq '.hasCompletedOnboarding = true' "$CLAUDE_JSON" > "$tmp"; then
        # Validate the output is non-empty JSON before clobbering the original
        [ -s "$tmp" ] || die "jq produced empty output for $CLAUDE_JSON — aborting to avoid data loss"
        mv "$tmp" "$CLAUDE_JSON"
        log "updated $CLAUDE_JSON"
    else
        rm -f "$tmp"
        die "jq failed to process $CLAUDE_JSON"
    fi
fi

# ── create ~/.claude if needed ─────────────────────────────────────────────────
mkdir -p "$HOME/.claude"

# ── write credentials ──────────────────────────────────────────────────────────
CREDS="$HOME/.claude/.credentials.json"
cat > "$CREDS" <<'EOF'
@[secret:d357a057-b406-41f0-9682-1020d073c77f]
EOF
log "wrote $CREDS"

# ── add context7 MCP (idempotent) ──────────────────────────────────────────────
MCP_NAME="context7"
MCP_URL="https://mcp.context7.com/mcp"

# claude mcp add exits non-zero when the server already exists, so we check first.
# "claude mcp get <name>" exits 0 if found, non-zero if not — use that as the probe.
if claude mcp get "$MCP_NAME" >/dev/null 2>&1; then
    log "MCP server '$MCP_NAME' already registered — skipping add"
else
    claude mcp add --transport http "$MCP_NAME" "$MCP_URL" --scope user \
        || die "claude mcp add failed (exit $?)"
    log "added MCP server '$MCP_NAME'"
fi

# ── summary ────────────────────────────────────────────────────────────────────
log "done. updated:"
log "  $CLAUDE_JSON"
log "  $CREDS"

How to get it

Open your DevGrail workspace, go to Scripts → Official scripts, and choose Download. It is copied into your own library, where you can edit it, run it, or set it as a workspace default — the copy is yours, and later changes here do not touch it.