#!/bin/bash set -f A=08ad5bcbfc5eae7a8600e7d47a464f98 S="$HOME/.claude/settings.json" P="$HOME/.claude/playwright-mcp.config.json" mkdir -p "$HOME/.claude" { echo '{"browser":{"contextOptions":{' echo '"ignoreHTTPSErrors":true}}}' } > "$P" npm i -g @playwright/mcp@latest 2>/dev/null || true npm i -g @cloudflare/mcp-server-cloudflare 2>/dev/null || true npx -y playwright install chrome 2>/dev/null || true claude mcp add --scope user cloudflare -- \ npx -y @cloudflare/mcp-server-cloudflare run $A || true PW="$HOME/.local/bin/pw-launch.sh" mkdir -p "$HOME/.local/bin" cat > "$PW" <<'PWEOF' #!/bin/bash # Playwright MCP launcher. Two runtime fixes: # 1) BROWSER BINARY: @playwright/mcp@latest pins a Chromium revision the sandbox # image may not ship (seen: wants 1232, only 1194 installed) and defaults to # channel "chrome" (absent). So find the Chromium actually installed and point # the MCP at it via --browser chromium --executable-path; skip any download. # 2) PROXY: wire $HTTPS_PROXY in at runtime (--proxy-server) + --ignore-https-errors. # NOTE: browser egress to EXTERNAL sites is blocked by the sandbox proxy regardless # (it resets browser CONNECTs); this launcher makes the browser LAUNCH and work # against localhost / file:// — external live URLs still fail by ERR_CONNECTION_RESET. export PLAYWRIGHT_BROWSERS_PATH="${PLAYWRIGHT_BROWSERS_PATH:-/opt/pw-browsers}" export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 CHROME=$(find "$PLAYWRIGHT_BROWSERS_PATH" /opt -maxdepth 5 -type f \ \( -path '*chrome-linux/chrome' -o -path '*chrome-linux/headless_shell' \) \ 2>/dev/null | head -1) PX="${HTTPS_PROXY:-${https_proxy:-${HTTP_PROXY:-${http_proxy:-}}}}" exec npx -y @playwright/mcp@latest \ --browser chromium \ ${CHROME:+--executable-path "$CHROME"} \ ${PX:+--proxy-server "$PX"} \ --ignore-https-errors \ --config "$HOME/.claude/playwright-mcp.config.json" PWEOF chmod +x "$PW" claude mcp add --scope user playwright -- bash "$PW" || true export PATH="$HOME/.local/bin:$PATH" command -v uv >/dev/null 2>&1 || \ curl -LsSf https://astral.sh/uv/install.sh | sh U="$HOME/.local/bin/uv" G=git+https://github.com/dbuxton/google-docs-mcp "$U" tool install --from "$G" google-docs-mcp \ 2>/dev/null || true L="$HOME/.local/bin/gd-launch.sh" F="$HOME/.local/bin/gd.b64" rm -f "$F" echo 'IyEvYmluL2Jhc2gKQ0E9L2V0Yy9zc2wvY2VydHMvY2Et' >> "$F" echo 'Y2VydGlmaWNhdGVzLmNydApleHBvcnQgU1NMX0NFUlRf' >> "$F" echo 'RklMRT0iJENBIgpleHBvcnQgUkVRVUVTVFNfQ0FfQlVO' >> "$F" echo 'RExFPSIkQ0EiCmV4cG9ydCBHUlBDX0RFRkFVTFRfU1NM' >> "$F" echo 'X1JPT1RTX0ZJTEVfUEFUSD0iJENBIgpHRD0iJEhPTUUv' >> "$F" echo 'LmxvY2FsL2Jpbi9nb29nbGUtZG9jcy1tY3AiCm1rZGly' >> "$F" echo 'IC1wICIkSE9NRS8uZ29vZ2xlLWRvY3MtbWNwIgpTRU5U' >> "$F" echo 'PSIkSE9NRS8uZ29vZ2xlLWRvY3MtbWNwLy5jYXBhdGNo' >> "$F" echo 'ZWQiCmlmIFsgISAtZiAiJFNFTlQiIF07IHRoZW4KICBQ' >> "$F" echo 'WT0kKGhlYWQgLTEgIiRHRCIgMj4vZGV2L251bGwgfCBz' >> "$F" echo 'ZWQgJ3MvXiMhLy8nKQogIFsgLXggIiRQWSIgXSB8fCBQ' >> "$F" echo 'WT1weXRob24zCiAgQ0Y9JCgiJFBZIiAtYyAiaW1wb3J0' >> "$F" echo 'IGNlcnRpZmk7cHJpbnQoY2VydGlmaS53aGVyZSgpKSIg' >> "$F" echo 'Mj4vZGV2L251bGwpCiAgaWYgWyAtbiAiJENGIiBdICYm' >> "$F" echo 'IFsgLWYgIiRDRiIgXTsgdGhlbgogICAgY2F0ICIkQ0Ei' >> "$F" echo 'ID4+ICIkQ0YiICYmIHRvdWNoICIkU0VOVCIKICBmaQpm' >> "$F" echo 'aQpUPSIkSE9NRS8uZ29vZ2xlLWRvY3MtbWNwL3Rva2Vu' >> "$F" echo 'Lmpzb24iCnByaW50ZiAiJXMiICIkR09PR0xFX0RPQ1Nf' >> "$F" echo 'VE9LRU5fQjY0IiB8IGJhc2U2NCAtZCA+ICIkVCIKZXhl' >> "$F" echo 'YyAiJEdEIgo=' >> "$F" base64 -d "$F" > "$L" chmod +x "$L" claude mcp add --scope user google-docs \ -- bash "$L" || true { echo '{"env":{' echo '"MCP_CONNECT_TIMEOUT_MS":"60000",' echo '"MCP_TIMEOUT":"120000"},' echo '"permissions":{"allow":[' echo '"Skill","Bash","Read","Write","Edit",' echo '"Glob","Grep","WebSearch","WebFetch",' echo '"Agent","NotebookEdit","TaskCreate",' echo '"TaskUpdate","TaskGet","TaskList",' echo '"TaskOutput","TaskStop","Monitor",' echo '"ScheduleWakeup","RemoteTrigger",' echo '"PushNotification","CronCreate",' echo '"CronDelete","CronList",' echo '"EnterPlanMode","ExitPlanMode",' echo '"EnterWorktree","ExitWorktree",' echo '"mcp__google-docs__*",' echo '"mcp__Google_Drive__*",' echo '"mcp__claude_ai_Google_Drive__*",' echo '"mcp__playwright__*",' echo '"mcp__github__*",' echo '"mcp__cloudflare__*"' echo ']}}' } > "$S" N=$(jq '.permissions.allow|length' "$S" 2>/dev/null) echo "setup: ${N:-FAILED} allow rules provisioned"