From 1d1dd262c6f62bad07324a25a9e248df6b6e28ae Mon Sep 17 00:00:00 2001 From: gpt-5-codex Date: Sat, 11 Oct 2025 07:10:01 +0200 Subject: [PATCH] chore: switch ngrok helper to oauth-based auth --- docs/NGROK.md | 16 ++++++++----- scripts/run_mcp_ngrok.sh | 50 ++++++++++++++++++++++++++++++---------- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/docs/NGROK.md b/docs/NGROK.md index a5e50af..5b97fb1 100644 --- a/docs/NGROK.md +++ b/docs/NGROK.md @@ -2,12 +2,14 @@ The `scripts/run_mcp_ngrok.sh` helper launches `mcp-browser` in streamable-http mode and exposes it through an ngrok tunnel. By default it uses -the `builtin-only` server profile so only the minimal proxy tools are visible. +whatever server is marked as default in your configuration (or you can specify +one explicitly with `--server`). ```bash ./scripts/run_mcp_ngrok.sh \ --allow-origin https://platform.openai.com \ - --ngrok-basic-auth "user:pass" + --ngrok-oauth-provider google \ + --ngrok-oauth-allow-email you@example.com ``` Key behaviours: @@ -25,8 +27,9 @@ Useful options: - `--config ~/.claude/mcp-browser/config.yaml` – point at a custom config file. - `--ngrok-region eu` or `--ngrok-domain your-name.ngrok.app` – choose a region or reserved domain. -- `--ngrok-basic-auth user:pass` – require HTTP basic auth. Strongly recommended - if the tunnel is exposed to the public. +- `--ngrok-oauth-provider google --ngrok-oauth-allow-email you@example.com` – + gate the tunnel behind ngrok’s OAuth support (recommended when exposing the + gateway). Additional `mcp-browser` arguments can be passed after `--`, for example to connect to a streamable HTTP upstream: @@ -37,5 +40,6 @@ connect to a streamable HTTP upstream: --transport-url http://127.0.0.1:12306/mcp ``` -The resulting public URL terminates at `/mcp`. Configure your MCP client (e.g. -OpenAI’s MCP interface) with that URL and the optional basic auth credentials. +The resulting public URL terminates at `/mcp` and is served via HTTPS by ngrok +automatically. Configure your MCP client (e.g. OpenAI’s MCP interface) with +that URL plus any OAuth restrictions you defined. diff --git a/scripts/run_mcp_ngrok.sh b/scripts/run_mcp_ngrok.sh index 9990c01..46a581f 100755 --- a/scripts/run_mcp_ngrok.sh +++ b/scripts/run_mcp_ngrok.sh @@ -1,18 +1,17 @@ #!/usr/bin/env bash set -euo pipefail -set -x usage() { cat <<'USAGE' Usage: run_mcp_ngrok.sh [options] [-- additional mcp-browser args] Launch mcp-browser in streamable-http mode and expose it via an ngrok HTTPS -endpoint. Designed to publish only the minimal built-in API (builtin-only -server) unless overridden. +endpoint. By default it uses the configured default MCP server, but you can +override that with --server if needed. Options: --config PATH Path to mcp-browser config file. - --server NAME Server entry to use (default: builtin-only). + --server NAME Server entry to use (optional). --http-host HOST Local interface for the gateway (default: 127.0.0.1). --http-port PORT Local port for the gateway (default: auto). --http-path PATH HTTP path prefix (default: /mcp). @@ -20,7 +19,10 @@ Options: (default: https://platform.openai.com). --ngrok-domain DOMAIN Reserved ngrok domain to use (optional). --ngrok-region REGION ngrok region code (optional). - --ngrok-basic-auth USER:PASS Require HTTP basic auth on the tunnel. + --ngrok-oauth-provider PROVIDER Enable ngrok OAuth (e.g. google, github). + --ngrok-oauth-allow-email EMAIL Restrict OAuth to a specific email (repeatable). + --ngrok-oauth-allow-domain DOMAIN Restrict OAuth to an email domain (repeatable). + --ngrok-oauth-scope SCOPE Additional OAuth scope (repeatable). --ngrok-inspect true|false Enable ngrok inspector (default: false). --mcp-arg ARG Extra argument passed to mcp-browser (repeatable). --ngrok-arg ARG Extra argument passed to ngrok (repeatable). @@ -37,13 +39,17 @@ USAGE MCP_BIN=${MCP_BROWSER_BIN:-mcp-browser} NGROK_BIN=${NGROK_BIN:-ngrok} CONFIG_PATH="" +SERVER_NAME="" HTTP_HOST="127.0.0.1" HTTP_PORT="" HTTP_PATH="/mcp" ALLOW_ORIGIN="https://platform.openai.com" NGROK_DOMAIN="" NGROK_REGION="" -NGROK_BASIC_AUTH="" +NGROK_OAUTH_PROVIDER="" +NGROK_OAUTH_ALLOW_EMAILS=() +NGROK_OAUTH_ALLOW_DOMAINS=() +NGROK_OAUTH_SCOPES=() NGROK_INSPECT="false" MCP_EXTRA_ARGS=() NGROK_EXTRA_ARGS=() @@ -52,6 +58,8 @@ while [[ $# -gt 0 ]]; do case "$1" in --config) CONFIG_PATH=$2; shift 2;; + --server) + SERVER_NAME=$2; shift 2;; --http-host) HTTP_HOST=$2; shift 2;; --http-port) @@ -64,8 +72,14 @@ while [[ $# -gt 0 ]]; do NGROK_DOMAIN=$2; shift 2;; --ngrok-region) NGROK_REGION=$2; shift 2;; - --ngrok-basic-auth) - NGROK_BASIC_AUTH=$2; shift 2;; + --ngrok-oauth-provider) + NGROK_OAUTH_PROVIDER=$2; shift 2;; + --ngrok-oauth-allow-email) + NGROK_OAUTH_ALLOW_EMAILS+=("$2"); shift 2;; + --ngrok-oauth-allow-domain) + NGROK_OAUTH_ALLOW_DOMAINS+=("$2"); shift 2;; + --ngrok-oauth-scope) + NGROK_OAUTH_SCOPES+=("$2"); shift 2;; --ngrok-inspect) NGROK_INSPECT=$2; shift 2;; --mcp-arg) @@ -115,10 +129,13 @@ HTTP_PATH="/${HTTP_PATH#/}" MCP_CMD=("$MCP_BIN" --mode streamable-http \ --http-host "$HTTP_HOST" --http-port "$HTTP_PORT" \ --http-path "$HTTP_PATH" --http-allow-origin "$ALLOW_ORIGIN") +if [[ -n "$SERVER_NAME" ]]; then + MCP_CMD+=(--server "$SERVER_NAME") +fi if [[ -n "$CONFIG_PATH" ]]; then MCP_CMD+=(--config "$CONFIG_PATH") fi -#[[ ${#MCP_EXTRA_ARGS[@]} -gt 0 ]] && MCP_CMD+=("${MCP_EXTRA_ARGS[@]}") +[[ ${#MCP_EXTRA_ARGS[@]} -gt 0 ]] && MCP_CMD+=("${MCP_EXTRA_ARGS[@]}") MCP_LOG=$(mktemp -t mcp-browser-gateway.XXXXXX.log) NGROK_LOG=$(mktemp -t ngrok-mcp.XXXXXX.log) @@ -152,7 +169,7 @@ if [[ $? -ne 0 ]]; then exit 1 fi -NGROK_CMD=("$NGROK_BIN" http --scheme=http "http://$HTTP_HOST:$HTTP_PORT") +NGROK_CMD=("$NGROK_BIN" http "http://$HTTP_HOST:$HTTP_PORT") NGROK_CMD+=(--request-header-add "X-MCP-Gateway:true") NGROK_CMD+=(--response-header-add "Cache-Control:no-store") NGROK_CMD+=(--inspect="$NGROK_INSPECT") @@ -162,8 +179,17 @@ fi if [[ -n "$NGROK_REGION" ]]; then NGROK_CMD+=(--region "$NGROK_REGION") fi -if [[ -n "$NGROK_BASIC_AUTH" ]]; then - NGROK_CMD+=(--basic-auth "$NGROK_BASIC_AUTH") +if [[ -n "$NGROK_OAUTH_PROVIDER" ]]; then + NGROK_CMD+=(--oauth="$NGROK_OAUTH_PROVIDER") + for email in "${NGROK_OAUTH_ALLOW_EMAILS[@]}"; do + NGROK_CMD+=(--oauth-allow-email "$email") + done + for domain in "${NGROK_OAUTH_ALLOW_DOMAINS[@]}"; do + NGROK_CMD+=(--oauth-allow-domain "$domain") + done + for scope in "${NGROK_OAUTH_SCOPES[@]}"; do + NGROK_CMD+=(--oauth-scope "$scope") + done fi [[ ${#NGROK_EXTRA_ARGS[@]} -gt 0 ]] && NGROK_CMD+=("${NGROK_EXTRA_ARGS[@]}")