Snowflake MCP Oauth Scope Test
Verify OAuth session:role scope and config.warehouse for Snowflake Managed MCP Server
Ask AI about Snowflake MCP Oauth Scope Test
Powered by Claude · Grounded in docs
I know everything about Snowflake MCP Oauth Scope Test. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
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 設定ガイド
