Dify MCPプラグインを使って自然言語でSnowflakeからデータを取得してみた

DifyのMCPプラグインとZapier MCPを利用してDifyとSnowflakeを連携させ、Snowflakeのデータを自然言語で扱ってみました。本記事では、その連携方法を中心に紹介したいと思います。

はじめに

こんにちは。NTTコミュニケーションズの大島です。普段は、クラウドサービスを中心に、データレイクやデータウェアハウスの検証をしています。

最近注目されているMCP (Model Context Protocol)という技術があります。 これはAnthropic が発表したオープンなプロトコルで、AI と外部システムの接続を標準化するものです。 LLMを利用したアプリケーション(MCPクライアント)が、MCPサーバーを介し外部システムのツールを動作させるために利用されます。

私の目線だと、このMCPにより、LLMとデータとの連携が簡単になるかが気になるところです。 そこで今回は、DifyのMCPプラグインとZapier MCPを利用してDifyとSnowflakeを連携させ、Snowflakeのデータを自然言語で扱ってみました。本記事では、その連携方法を中心に紹介したいと思います。

利用したサービス

まず、簡単に本記事に登場するサービスについて紹介します。

Dify

DifyはLLMアプリケーションをローコードで開発するためのプラットフォームです。LLMを利用したチャットボットやRAG等のアプリケーションが簡単に作成できます。 MCPプラグインを用いることでMCPクライアントとして利用することも可能です。

Zapier

Zapier自体は、Webサービスやアプリケーションを連携させて、作業を自動化できるサービスです。 Zapierは現在β版として、MCPサーバーとしての機能を提供しています。これを使うことで、Zapierを介してSnowflakeを含めた多数の外部サービスが利用できます。

Snowflake

Snowflakeは、言わずと知れたクラウドのデータウェアハウスサービスです。

構成

今回は、DifyをMCPクライアント、ZapierをMCPサーバーとして利用します。ZapierはMCPクライアントから受けたリクエストを元に、Snowflake に格納したデータを取得します。このような構成をとることで、LLMがSnowflakeのデータを利用できるようになります。

なお、MCPを利用するための選択肢としては、ほかに Claude for desktop 等のローカル環境で動作するアプリケーションもあります。今回は、Difyであれば応用する際のユースケースの幅が広いと考え、これを利用しました。

連携設定

それでは、連携に必要な設定について説明していきます。各サービスのアカウントは保有しているものとして、連携設定にスコープをあてて記述します。

Snowflake の設定

Zapier経由でアクセスさせるための設定をします。具体的にはSnowflakeにOAuthの設定をいれます。(参考:カスタムクライアント用のSnowflake OAuth の構成 | Snowflake Documentation

まず、 ACCOUNTADMIN ロールを付与したアカウントで、OAuth integration を作成します。

CREATE SECURITY INTEGRATION oauth_kp_int
  TYPE = OAUTH
  ENABLED = TRUE
  OAUTH_CLIENT = CUSTOM
  OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
  OAUTH_REDIRECT_URI = 'https://zapier.com/dashboard/auth/oauth/return/SnowflakeCLIAPI/'
  OAUTH_ISSUE_REFRESH_TOKENS = TRUE
  OAUTH_REFRESH_TOKEN_VALIDITY = 86400
;

OAUTH_REDIRECT_URI の値は、Zapier側画面(後述)で指定される値です。ちなみに、 OAUTH_REFRESH_TOKEN_VALIDITYは、トークンの有効期間で単位は秒です。

作成したOAuth integration のclient ID とsecret (Zapier側の設定で必要)は以下のSQLで取得できます。

select SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('OAUTH_KP_INT');

--実行結果例
{"OAUTH_CLIENT_SECRET_2":"nEVL****************************************","OAUTH_CLIENT_SECRET":"/cId****************************************","OAUTH_CLIENT_ID":"Tnx1************************"}

secretは 2つ払い出されますが、どちらを使ってもOKです。

Zapierの設定

Zapier MCP 設定ページにアクセスして、Zapier MCP Server URL を取得します。Zapier MCP Server URLは、MCPクライアント側、つまりDify 側の設定で必要となります。

Edit MCP Actions を押下し、Add a new action の項目で、文字列 "Snowflake" で検索します。いくつかヒットしますが、今回は Execute SQL を選択しました。

つづいて、Snowflake Acoount のところで、Snowflake の接続情報を入力します。Connect Newを押すと以下の画面が開きます。入力が必須なのは、Account, ClientID, Client Secret です。Account は Snowflakeにアクセスする際のURLの .snowflakecomputing.com より前の部分です。Client ID, Client Secretは、前段 Snowflakeの設定で作成した OAuth Integrationの Client ID, Client Secretを指定します。 これらを設定し Yes, Continue to Snowflake をおすと、Snowflake のログイン画面に遷移するので、ユーザー、パスワード(+必要に応じMFA)でログインすると接続情報が登録されます。

前段の画面に戻りますので、残りの SQL Statement について設定します。選択肢として Set a specific value in this field(SQL文を指定する)と Have AI guess value fields (AIに推測させる)の2つが選べます。AIに推測させてみたいので、Have AI guess value fields を選択して動作確認することにします。

Dify の設定

まず、MCP SSE プラグインをインストールします。この MCP SSE プラグインはコミュニティから提供されているものではあるものの、Dify公式サイトのベストプラクティス Dify MCPプラグインガイド でも紹介されています。

Dify のマーケットプレイスで "MCP SSE" プラグインを検索してインストールします。

プラグインの認証設定で必要となる MCP Servers Config には、以下の情報を投入します。url には、Zapier 設定の箇所で取得した Zapier MCP Server URL を入力します。 timeout 値などは、必要に応じて適切な値にしてください。

{
  "server_name": {
    "url": "https://actions.zapier.com/mcp/*******/sse",
    "headers": {},
    "timeout": 300,
    "sse_read_timeout": 300
  }
}

続いて、同様にマーケットプレイスから Agent Strategies (Support MCP Tools) プラグインをインストールします。プラグインのインストールが完了すれば利用可能です。

動作確認

動作確認の目的で、Difyにて以下のようなシンプルな Chatflow を作成しました。

LLM は Azure OpenAI の o1 を利用しました。

Agent ノードでは、AGENTIC STRATEGY の項目で、インストールしたAgent Strategies (Support MCP Tools) のFunction Calling (Support MCP Tools) を選択します。 同様に TOOL LIST の項目で、MCP Tools のFetch MCP ToolsCall MCP Tool を追加します。 MCP SEVERS CONFIG は、プラグインインストール時に設定した値と同じものを設定します。

Snowflake には、KaggleのBooks Dataset のデータを事前に格納してあります。 Snowflake 内にどんなデータがあるか、見てもらいます。

きちんとテーブルやカラムの情報が取得できています。Snowflake のクエリヒストリを見ると、SHOW DATABASES, SHOW SCHEMAS ~, SHOW TABLES ~, DESCRIBE TABLE ~ のクエリを、合計で7クエリ実行していました。

この書籍に関するテーブルから、データを取得してみます。

シェイクスピアの書籍情報を取得してくれました。Snowflakeへのクエリは以下を投げていました。

SELECT * FROM BOOKS_DATASET_RAW WHERE TITLE ILIKE '%shakespeare%' OR AUTHORS ILIKE '%shakespeare%'

ちなみに、Agentノードの設定でMemoryをonにしていますが、これが off では上記のやりとりはうまくいきませんでした。 やりとりを記憶しないので、最初の質問でテーブルのカラム名を調べているにもかかわらず、次の「シェイクスピアの書籍の情報を取得して」の指示に対し、誤ったカラム名(AUTHORS ではなくAUTHOR)のSELECT 文を生成するという結果になりました。

まとめ

Dify のMCPプラグインを用いて Zapier MCPを利用することで、LLMにSnowflakeのデータを利用させることが簡単にできました。 今回は、Snowflakeにどんなデータがあるかの確認と、そこからデータを取り出すという初歩的な使い方まででしたが、高度なことができるかさらに調査を進めていきたいと思います。

また、今回Difyを用いて検証を実施しましたが、DifyからMCPを用いてさまざまな外部サービスを利用できるのであれば、Difyのワークフロー機能などと組み合わせることでより複雑なこともできそうです。 変化の激しい今この分野においては、Difyのようなツールを利用して、新しい技術やそれを活用するアイディアなどを、簡単に手早くどんどん試していくのもアリだと思いました。

参考