About Snowflake MCP Oauth Scope Test
Snowflake MCP Oauth Scope Test is an MCP server in the Data category: verify OAuth session:role scope and config.warehouse for Snowflake Managed MCP Server. It has been installed 0 times through Conduid.
Install
git clone https://github.com/sfc-gh-kfukamori/snowflake-mcp-oauth-scope-testThis server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.
Ask AI
Ask AI about Snowflake MCP Oauth Scope Test
Powered by Claude · Grounded in docs
Security checks
- ·README presentNot checked yet.
- ·License declaredNot checked yet.
- ·Tests presentNot checked yet.
- ·Dependencies pinnedNot checked yet.
- ·No dynamic code executionNot checked yet.
- ·Scoped permissionsNot checked yet.
README
Snowflake Managed MCP Server — OAuth scope & Warehouse 固定検証
Snowflake の Managed MCP Server で、SQL 実行時のロールとウェアハウスをユーザーの OAuth セッションに依存せず固定できるかを検証するアプリケーションです。
背景・課題
Snowflake Managed MCP Server の SYSTEM_EXECUTE_SQL ツールは、デフォルトではユーザーの OAuth セッションコンテキスト(ロール・ウェアハウス)で SQL を実行します。そのため:
- MCP クライアント(Cursor、Claude Desktop 等)のユーザーごとに異なるロールで実行される
- ウェアハウスが未設定の場合、SQL 実行がエラーになる
解決策として以下の 2 つの仮説を検証しました。
検証内容
仮説 1: OAuth scope session:role:<role_name> でロールを固定
OAuth 認可リクエストの scope パラメータに session:role:MCP_TEST_ROLE を指定すると、発行される Access Token にロールが紐付けられ、MCP Server での SQL 実行ロールが固定される。
仮説 2: MCP Server の config.warehouse で WH を固定
CREATE MCP SERVER の tool spec で config.warehouse を指定すると、ユーザーのデフォルト WH に関わらず、指定した WH で SQL が実行される。
検証結果
テスト 1: ロール固定
| 条件 | CURRENT_ROLE() |
|---|---|
scope=session:role:MCP_TEST_ROLE |
MCP_TEST_ROLE |
| scope 指定なし(デフォルト) | MCP_ROLE(ユーザーの DEFAULT_ROLE) |
結論: session:role スコープでロールを固定できる。
テスト 2: ウェアハウス固定
| 条件 | CURRENT_WAREHOUSE() |
|---|---|
ユーザーの DEFAULT_WAREHOUSE = MCP_WH |
MCP_WH |
MCP 経由 CURRENT_WAREHOUSE() |
MCP_TEST_WH |
ユーザーのデフォルト WH(MCP_WH)と MCP Server の config WH(MCP_TEST_WH)を意図的に異なる値に設定して検証。MCP 経由では config の WH が使われることを確認。
結論: config.warehouse で WH を固定できる。
アーキテクチャ
[ブラウザ]
|
| (1) ログインボタンクリック
v
[Flask App (localhost:8080)]
|
| (2) OAuth 認可リクエスト (scope=session:role:MCP_TEST_ROLE)
v
[Snowflake OAuth /oauth/authorize]
|
| (3) ユーザー認証 → Authorization Code
v
[Flask App]
|
| (4) Authorization Code → Access Token (POST /oauth/token-request)
| (5) Snowflake Python Connector で接続コンテキスト確認
v
[/query ページ — SQL 入力フォーム]
|
| (6) MCP 経由で実行ボタン
v
[Snowflake REST API — Streamable HTTP Transport]
POST /api/v2/databases/{db}/schemas/{schema}/mcp-servers/{name}
|
| (7) JSON-RPC: initialize → notifications/initialized → tools/call
v
[MCP Server 内部]
ロール = OAuth Token の scope で固定
WH = MCP Server config.warehouse で固定
→ SELECT CURRENT_USER(), CURRENT_ROLE(), CURRENT_WAREHOUSE()
前提条件
- Snowflake アカウント(ACCOUNTADMIN ロールでのセットアップ権限)
- Python 3.10+
ghCLI(GitHub リポジトリ作成時のみ)
セットアップ手順
1. Snowflake 側の準備
setup.sql を Snowflake で実行します:
# Snowsight の SQL Worksheet、または SnowSQL で実行
# setup.sql 内の <YOUR_USERNAME> を自身のユーザー名に書き換えてください
実行後、SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('MCP_TEST_INTEGRATION') の出力から Client ID / Secret を取得します。
2. 環境変数の設定
export OAUTH_CLIENT_ID="<上記で取得した Client ID>"
export OAUTH_CLIENT_SECRET="<上記で取得した Client Secret>"
export SNOWFLAKE_ACCOUNT_URL="https://<account>.<region>.<cloud>.snowflakecomputing.com"
export SNOWFLAKE_ACCOUNT_ID="<account>.<region>.<cloud>" # e.g. zx48016.ap-northeast-1.aws
export OAUTH_FIXED_ROLE="MCP_TEST_ROLE"
export MCP_DATABASE="MCP_DEMO_DB"
export MCP_SCHEMA="MCP_DEMO_SCHEMA"
export MCP_SERVER_NAME="MCP_TEST_SERVER"
3. Python 環境の構築と起動
pip install -r requirements.txt
python app.py
http://localhost:8080 をブラウザで開きます。
検証手順
- 「scope=session:role:MCP_TEST_ROLE で認証」 ボタンをクリック → Snowflake ログイン
/queryページで接続コンテキスト(ロール、WH)を確認- デフォルト SQL
SELECT CURRENT_USER(), CURRENT_ROLE(), CURRENT_WAREHOUSE()で 「MCP 経由で実行」 をクリック - 結果テーブルで MCP 経由のロール・WH を確認
- トップに戻り 「scope 指定なし で認証」 で同じ手順を繰り返し、結果を比較
発見したポイント
MCP Server エンドポイント URL
Snowflake Managed MCP Server のエンドポイントは REST API v2 の標準パスに従います:
POST https://<account_url>/api/v2/databases/{DB}/schemas/{SCHEMA}/mcp-servers/{SERVER_NAME}
SYSTEM$ALLOWLIST()でSNOWSIGHT_DEPLOYMENTホストを確認可能- サーバー名にハイフンを含む場合、URL エンコードされたダブルクォート(
%22)が必要。アンダースコア推奨
MCP プロトコル
Snowflake Managed MCP Server は Streamable HTTP transport (MCP 2025-03-26) を採用:
- GET ではなく POST で JSON-RPC メッセージを送信
- レスポンスは
application/jsonまたはtext/event-stream(SSE) - 旧来の SSE transport (2024-11-05) の GET
/sseエンドポイントは 使用されていない
config.warehouse (undocumented)
SYSTEM_EXECUTE_SQL ツールの config.warehouse は公式ドキュメントに記載がありません(GENERIC ツールのみ記載)。動作は確認済みですが、将来の仕様変更リスクがあるため、正式サポートについては Snowflake に確認を推奨します。
必要な権限
MCP Server を利用するロールには以下の全てが必要です:
GRANT USAGE ON DATABASE <db> TO ROLE <role>;
GRANT USAGE ON SCHEMA <db>.<sch> TO ROLE <role>;
GRANT USAGE ON MCP SERVER <db>.<sch>.<server> TO ROLE <role>;
OAuth Security Integration
BLOCKED_ROLES_LISTでブロックされたロール(ACCOUNTADMIN 等)はsession:roleスコープで指定不可OAUTH_ALLOW_NON_TLS_REDIRECT_URI = TRUEはローカル開発(http://localhost)でのみ使用
ファイル構成
.
├── README.md # 本ファイル
├── app.py # Flask 検証アプリ(OAuth + MCP クライアント)
├── setup.sql # Snowflake セットアップ SQL
├── requirements.txt # Python 依存パッケージ
└── .gitignore
参考
- CREATE MCP SERVER — Snowflake 公式ドキュメント
- Model Context Protocol Specification — MCP 仕様
- Snowflake OAuth Custom Client — OAuth 設定ガイド
README mirrored from the source repository 4 months ago. The original is authoritative.