DataikuとConnect AIでPingOne のデータを統合

Yazhini G
Yazhini G
Technical Marketing Engineer
CData Connect AI のリモート MCP サーバーを活用して、Dataiku エージェントからPingOneのリアルタイムデータにセキュアにクエリ・操作できるようにします。

Dataiku は、チームがガバナンスされた環境内で機械学習や生成 AI プロジェクトを設計、デプロイ、管理できるコラボレーティブなデータサイエンス・AI プラットフォームです。エージェントと GenAI フレームワークにより、カスタムワークフローとモデルオーケストレーションを通じてデータを分析、生成、操作できるインテリジェントエージェントを構築できます。

Dataiku を CData Connect AI の組み込み MCP(Model Context Protocol)サーバーと統合することで、これらのエージェントはリアルタイムのPingOne のデータにセキュアにアクセスできるようになります。この統合により、Dataiku のエージェント実行環境と CData のガバナンスされたエンタープライズ接続レイヤーが橋渡しされ、すべてのクエリや指示が手動エクスポートやステージングなしで、承認されたデータソースに対して安全に実行されます。

この記事では、Connect AI での PingOne 接続の設定、MCP サポートを含む Dataiku の Python コード環境の準備、そして Dataiku 内から直接リアルタイムのPingOne のデータにクエリ・操作できるエージェントの作成方法を説明します。

ステップ 1:Dataiku 用の PingOne 接続を設定

Dataiku から PingOne への接続は、CData Connect AI のリモート MCP サーバーによって実現されます。Dataiku からPingOne のデータを操作するには、まず CData Connect AI で PingOne 接続を作成・設定します。

  1. Connect AI にログインし、Sources をクリック、次に Add Connection をクリック
  2. 接続を追加
  3. Add Connection パネルから「PingOne」を選択
  4. データソースを選択
  5. PingOne に接続するために必要な認証プロパティを入力します。

    PingOne に接続するには以下のプロパティを設定します。

    • Region:自身のPingOne 組織のデータがホスティングされている地域。
    • AuthScheme:PingOne に接続する際に使用する認証の種類。
    • WorkerAppEnvironmentId (デフォルトのPingOne ドメインを使用する場合に必要)、またはAuthorizationServerURL のいずれかで、下で説明するように設定します。

    WorkerAppEnvironmentId の設定

    WorkerAppEnvironmentId は、Worker アプリケーションが存在するPingOne 環境のID です。 このパラメータは、環境がデフォルトのPingOne ドメイン(auth.pingone)を利用している場合のみ使用されます。 これは、ヘルプドキュメントのカスタムOAuth アプリケーションの作成で説明するように、PingOne への認証に使用するカスタムOAuth アプリケーションを作成した後に設定します。

    はじめに、このプロパティの値を見つけます。

    1. 自身のPingOne 組織のホームページからナビゲーションサイドバーに移動し、Environments をクリックします。
    2. OAuth / Worker のカスタムアプリケーションを作成した環境(通常はAdministrators)を見つけ、Manage Environment をクリックします。 環境のホームページが表示されます。
    3. 環境のホームページのナビゲーションサイドバーで、Applications をクリックします。
    4. リストから、OAuth またはWorker アプリケーションの詳細を見つけます。
    5. Environment ID フィールドの値をコピーします。 以下の例に似たものになるはずです:
      WorkerAppEnvironmentId='11e96fc7-aa4d-4a60-8196-9acf91424eca'

    次に、WorkerAppEnvironmentId をEnvironment ID フィールドの値に設定します。

    AuthorizationServerURL の設定

    AuthorizationServerURL は、お使いのアプリケーションが配置されている環境のPingOne 認可サーバーのベースURL です。 このプロパティは、PingOne プラットフォームAPI ドキュメントで説明されているように、環境にカスタムドメインを設定した場合にのみ使用されます。 Custom Domains を参照してください。

    OAuth でのPingOne への認証

    PingOne はOAuth とOAuthClient 認証の両方をサポートしています。 上述の設定手順に加え、OAuth またはOAuthCliet 認証をサポートするために、さらに2つの手順を完了する必要があります。

    • ヘルプドキュメントのカスタムOAuth アプリケーションの作成で説明するように、カスタムOAuth アプリケーションを作成して設定します。
    • ドライバーがデータモデル内のエンティティにアクセスできるようにするには、ヘルプドキュメントのAdministrator Roles での説明のとおり、使用するアドミンユーザー / ワーカーアプリケーションに対して正しいロールを設定していることを確認してください。
    • 以下のサブセクションで説明されているように、選択した認証スキームと認証フローに適切なプロパティを設定します。

    OAuth(認可コードグラント)

    AuthScheme をOAuth に設定します。

    デスクトップアプリケーション

    OAuth アクセストークンの取得およびリフレッシュ

    以下を設定して、接続してください。

    • InitiateOAuth:GETANDREFRESH。繰り返しOAuth の交換を行ったり、手動でOAuthAccessToken を設定する必要をなくすには、InitiateOAuth を使用します。
    • OAuthClientId:カスタムOAuth アプリケーションを作成した際に取得したClient ID。
    • OAuthClientSecret:カスタムOAuth アプリケーションを作成した際に取得したClient Secret。
    • CallbackURL:カスタムOAuth アプリケーションの登録時に定義したリダイレクトURI。例:https://localhost:3333

    接続すると、CData 製品 はデフォルトブラウザでPingOne のOAuth エンドポイントを開きます。ログインして、アプリケーションにアクセス許可を与えます。 ドライバーはこれでOAuth プロセスを完了します。

    1. ドライバーはPingOne からアクセストークンを取得し、それを使ってデータをリクエストします。
    2. OAuth 値はOAuthSettingsLocation で指定された場所に保存され、接続間で永続化されるようにします。

    ドライバーはアクセストークンの期限が切れると自動的にリフレッシュします。

    Web アプリケーションやヘッドレスマシン、クライアントクレデンシャルグラントを含むその他のOAuth メソッドについては、ヘルプドキュメントを参照してください。

    接続を設定(Salesforce の例)
  6. Save & Test をクリック
  7. Permissions タブを開き、ユーザーベースの権限を設定
  8. 権限を更新

Personal Access Token を追加

Personal Access Token(PAT)は、Dataiku から Connect AI への接続を認証するために使用されます。きめ細かいアクセス制御を維持するため、統合ごとに個別の PAT を作成することをお勧めします

  1. Connect AI アプリの右上にある歯車アイコン()をクリックして Settings を開く
  2. Settings ページで Access Tokens セクションに移動し、 Create PAT をクリック
  3. PAT にわかりやすい名前を付けて Create をクリック
  4. 新しい PAT を作成
  5. トークンが表示されたらコピーして安全な場所に保存してください。再度表示されることはありません

PingOne 接続の設定と PAT の生成が完了したら、Dataiku から Connect AI 経由でPingOne のデータに接続できます。

ステップ 2:Dataiku とコード環境を準備

Dataiku の専用 Python コード環境が、MCP ベースの通信に必要なランタイムサポートを提供します。Dataiku エージェントを CData Connect AI に接続できるようにするには、Python 環境を作成し、エージェントとサーバー間の対話に必要な MCP クライアント依存関係をインストールします。

  1. Dataiku Cloud で Code Envs を開く
  2. Dataiku Cloud Code Envs
  3. Add a code env をクリックして DSS 設定ウィンドウを開く
  4. Code Envs の DSS 設定を開く
  5. DSS で New Python env をクリック。名前を付け(例:MCP_Package)、Python 3.10 を選択(3.10 から 3.13 がサポートされています)
  6. Python 環境を作成
  7. Packages to install を開き、以下の pip パッケージを追加:
    • httpx
    • anyio
    • langchain-mcp-adapters
    MCP クライアント依存関係を追加
  8. Containerized execution を開き、Container runtime additions の下で Agent tool MCP servers support を選択
  9. Agent tool MCP servers support を有効化
  10. Rebuild env をチェックし、Save and update をクリックしてパッケージをインストール
  11. Dataiku Cloud に戻り、Overview を開いて Open instance をクリック
  12. DSS インスタンスを開く
  13. + New project をクリックして Blank project を選択。プロジェクト名を入力
  14. 空のプロジェクトを作成

ステップ 3:Dataiku エージェントを作成して MCP サーバーに接続

Dataiku エージェントは、Dataiku ワークスペースと Connect AI 間のブリッジとして機能します。この接続を有効にするには、カスタムコードベースエージェントを作成し、設定した Python 環境を割り当て、Connect AI の認証情報を埋め込んで、エージェントがリアルタイムのPingOne のデータにクエリ・操作できるようにします。

  1. Agents & GenAI Models に移動し、Create your first agent をクリック
  2. Agents and GenAI Models
  3. Code agent を選択し、名前を付け、Agent version で Asynchronous agent without streaming を選択
  4. エージェントスターターの選択
  5. 上部のタブから Settings を選択。Code env selection で Default Python code env を作成した環境(例:MCP_Package)に設定
  6. プロジェクト設定の Code env 選択
  7. Agent の Design タブに戻り、以下のコードを貼り付けます。EMAIL と PAT を自分の値に置き換えてください
  8. 
    
    import os
    import base64
    from typing import Dict, Any, List
    
    from dataiku.llm.python import BaseLLM
    from langchain_mcp_adapters.client import MultiServerMCPClient
    
    # ---------- Persistent MCP client (cached between calls) ----------
    _MCP_CLIENT = None
    
    def _get_mcp_client() -> MultiServerMCPClient:
        """Create (or reuse) a MultiServerMCPClient to CData Cloud MCP."""
        global _MCP_CLIENT
        if _MCP_CLIENT is not None:
            return _MCP_CLIENT
    
        # Set creds via env/project variables ideally
        EMAIL = os.getenv("CDATA_EMAIL", "YOUR_EMAIL")
        PAT   = os.getenv("CDATA_PAT",   "YOUR_PAT")
        BASE_URL = "https://mcp.cloud.cdata.com/mcp"
    
        if not EMAIL or PAT == "YOUR_PAT":
            raise ValueError("Set CDATA_EMAIL and CDATA_PAT as env variables or inline in the code.")
    
        token = base64.b64encode(f"{EMAIL}:{PAT}".encode()).decode()
        headers = {"Authorization": f"Basic {token}"}
    
        _MCP_CLIENT = MultiServerMCPClient(
            connections={
                "cdata": {
                    "transport": "streamable_http",
                    "url": BASE_URL,
                    "headers": headers,
                }
            }
        )
        return _MCP_CLIENT
    
    
    def _pick_tool(tools, names: List[str]):
        L = [n.lower() for n in names]
        return next((t for t in tools if t.name.lower() in L), None)
    
    
    async def _route(prompt: str) -> str:
        """
        Simple intent router:
          - 'list connections' / 'list catalogs' -> getCatalogs
          - 'sql: ...' or 'query: ...' -> queryData
          - otherwise -> help text
        """
        client = _get_mcp_client()
        tools = await client.get_tools()
    
        p = prompt.strip()
        low = p.lower()
    
        # 1) List connections (catalogs)
        if "list connections" in low or "list catalogs" in low:
            t = _pick_tool(tools, ["getCatalogs", "listCatalogs"])
            if not t:
                return "No 'getCatalogs' tool found on the MCP server."
            res = await t.ainvoke({})
            return str(res)[:4000]
    
        # 2) Run SQL
        if low.startswith("sql:") or low.startswith("query:"):
            sql = p.split(":", 1)[1].strip()
            t = _pick_tool(tools, ["queryData", "sqlQuery", "runQuery", "query"])
            if not t:
                return "No query-capable tool (queryData/sqlQuery) found on the MCP server."
            try:
                res = await t.ainvoke({"query": sql})
                return str(res)[:4000]
            except Exception as e:
                return f"Query failed: {e}"
    
        # 3) Help
        return (
            "Connected to CData MCP
    
    "
            "Say **'list connections'** to view available sources, or run a SQL like:
    "
            "  sql: SELECT * FROM [Salesforce1].[SYS].[Connections] LIMIT 5
    
    "
            "Remember to use bracket quoting for catalog/schema/table names."
        )
    
    
    class MyLLM(BaseLLM):
        async def aprocess(self, query: Dict[str, Any], settings: Dict[str, Any], trace: Any):
            # Extract last user message from the Quick Test payload
            prompt = ""
            try:
                prompt = (query.get("messages") or [])[-1].get("content", "")
            except Exception:
                prompt = ""
    
            try:
                reply = await _route(prompt)
            except Exception as e:
                reply = f"Error: {e}"
    
            # The template expects a dict with a 'text' key
            return {"text": reply}
    
    

    クイックテストを実行

    1. 右側のパネルで Quick Test を開く
    2. JSON コードを貼り付けて Run test をクリック
    3. 
      
      {
         "messages": [
            {
               "role": "user",
               "content": "list connections"
            }
         ],
         "context": {}
      }
      
      

    エージェントとチャット

    Chat タブに切り替えて、「List all connections」 のようなプロンプトを試してみてください。チャット出力に接続カタログの一覧が表示されます。

    チャット:カタログの一覧表示とクエリの実行

    CData Connect AI を入手

    AI エージェントから 数百種類の SaaS、ビッグデータ、NoSQL ソースにアクセスするには、CData Connect AI をお試しください。

はじめる準備はできましたか?

CData Connect AI の詳細、または無料トライアルにお申し込みください:

無料トライアル