Claude に Snowflake を触らせるとき、守りは設定ファイルではなくロールで決める
Claude から Snowflake に SQL を送れるようにすると、集計や調べものは速くなります。一方で、AI が表を消したり書き換えたりしないかが気になります。手元で使っている MCP(AI が外の道具を使うための接続口)には、送ってよい SQL の種類を絞る設定があります。この設定でどこまで守れるのかを、自社の Snowflake の試験用の置き場で1つずつ試しました。

試した環境
使っているのは Snowflake Labs が公開している MCP サーバー(snowflake-labs-mcp)です。Claude アプリの設定に登録し、Claude から SQL を送れるようにしています。
この MCP には、SQL の種類ごとに「送ってよい/よくない」を決める設定ファイルがあります。種類の名前は Select・Create・Delete・Drop などです。今回の設定は、「種類が分からない(Unknown)」だけを止め、ほかは通す形にしていました。
試すときは、作業の前に毎回、接続先が自社のアカウントかを問い合わせで確かめました。作るのは試験用の置き場の中だけにしています。
設定ファイルで止まるもの、止まらないもの
1つずつ送った結果です。
| 命令 | 結果 |
|---|---|
| CREATE TABLE・CREATE OR REPLACE TABLE | 通る |
| INSERT・UPDATE・DELETE・MERGE | 通る |
| TRUNCATE TABLE・DROP TABLE | 通る |
| SELECT … UNION ALL SELECT … | 止まる |
| SHOW TABLES | 止まる |
| GRANT | 止まる |
| CREATE SEMANTIC VIEW | 止まる |
| CALL・EXECUTE IMMEDIATE | 通る |
削除・表ごと消す・中身を空にする・上書きして作る命令は、どれも通りました。設定で許可しているので、ここは設定どおりです。
止まったのは、UNION・SHOW・GRANT のように、設定ファイルの一覧に名前が無い種類でした。CREATE SEMANTIC VIEW は新しい構文のため「種類が分からない」に分類され、止まりました。
包み直すと通ってしまう
止まる命令も、書き方を変えると通りました。
- UNION:`SELECT * FROM ( … UNION ALL … )` のように副問い合わせに包むと、全体が SELECT 扱いになって通る
- SHOW・GRANT・DELETE:`EXECUTE IMMEDIATE $$ BEGIN … END $$` の中に入れると、外側が「命令の実行」扱いになって通り、中身も実行される
- CALL:手続きの呼び出しは、中で何をしても CALL として通る
GRANT は、自分で作った試験用の表に対してだけ試し、すぐに元へ戻しました。
設定ファイルは、送られてきた文の見た目で種類を決めています。中で何が実行されるかまでは見ていません。そのため、AI が止まった命令を書き直して試すと、設定の柵を越えてしまいます。AI は止められると別の書き方を試すことがあるので、これは起こりうる話です。
読むだけのロールで入り直す
そこで、Snowflake の側で「読むだけ」のロール(何ができるかの役割)と、そのロールだけを持つ利用者を作りました。読めるのは、渡した置き場のビューとセマンティックビューだけです。このロールで入り直し、同じ抜け道を試しました。
| 命令 | 結果 |
|---|---|
| EXECUTE IMMEDIATE の中で DELETE | 止まる(対象が見えない) |
| EXECUTE IMMEDIATE の中で CREATE TABLE | 止まる(権限が無い) |
| CREATE TABLE | 止まる(権限が無い) |
| 渡したビュー・セマンティックビューを読む | 通る |
ロールに権限が無ければ、包み直しても中身ごと止まります。Snowflake は、文の見た目ではなく、実際に何をしようとしたかで権限を確かめているからです。
このロールと利用者を作る SQL(CREATE ROLE・CREATE USER・GRANT)は、AI には送らせず、人が Snowsight の画面で流しました。権限を作る作業そのものを AI に任せると、守りの意味が無くなるためです。
作った利用者は、Snowsight の「ガバナンスとセキュリティ」→「ユーザーとロール」で確かめられます。

ユーザータイプを「サービス」にしたので、パスワードではログインできず、鍵(キーペア)でしか入れません。既定のロールは読むだけのロールです。人が画面からこの利用者でログインして作業する、ということも起きません。
Claude アプリには、今の接続とは別に、この読むだけの利用者で入る接続をもう1本足しました。調べものは読むだけの接続、試験用の置き場で作業するときだけ作業用の接続、と使い分けます。

長い処理は MCP に向かない
もう1つ分かったことがあります。Snowflake の予測モデルの学習(4分ほどかかる処理)を MCP から送ると、MCP の待ち時間切れで止まりました。
ところが Snowflake 側では学習が続いていて、あとでモデルはできていました。もう一度送ると「既にある」と返ってきます。待ち時間切れは、処理が失敗したという意味ではありません。
長くかかる処理は MCP ではなく、手元のプログラムから Snowflake の接続ライブラリで直接送るようにしました。
まとめ
- MCP の設定ファイルは、文の見た目で種類を分けるだけ。副問い合わせや EXECUTE IMMEDIATE に包むと止まる命令も通るので、「うっかり」を減らす柵として使う
- 本番を守る鍵はロール。AI が使う接続は、読むだけのロールの利用者で入る。ロールや利用者を作る作業は人がやる
- MCP の待ち時間切れは失敗とは限らない。長い処理は MCP を使わず、直接送る

