CData CLI(cdatacli)は、たった 1 つのコマンドで、数百あるデータソースのどれもを AI エージェントがクエリできるようにします。しかも、エージェントがいつも使っているターミナルの中で、そのまま行えます。
エージェントをベンダー固有の API につなぐ必要はありません。ブラウザを開く必要もありません。サーバーを立ち上げる必要もありません。エージェントにターミナルを与え、対応しているデータソースを指定し、目的を伝えるだけです。エージェントがスキーマを検出し、SQL を書き、検証し、必要に応じてスタンドアロンのアプリを生成します。CLI はエージェントの「手」であり、その基盤となる CData JDBC Drivers が、実際の作業を担います。
この記事では、まずアーキテクチャを説明し、続いてセットアップの全手順を実演します。スキルを読み込み、ドライバーを選び、目的(たとえば「Salesforce の大型商談ビューアを作成する」)を設定すると、その過程がそのまま進んでいきます。
アーキテクチャ
エージェントがすでに動いている場所で、そのまま動作する
cdatacli は、Java 製のコマンドラインプログラムです。連携のためのインターフェースは、これがすべてです。次のような環境で動作します。
エージェントがシェルコマンドを実行できる環境なら、CData CLI を使用できます。常時起動しておくデーモンも、ソケットも、モデルが通信するための別プロセスも必要ありません。すべての操作が、ターミナルの中で完結します。
CLI は薄い層にすぎない。実際の処理はドライバーが担う。

この構造から、4 つの特性が導かれます。そして、この 4 つがそろうことが、CLI が JDBC ドライバーにとって最適なエージェントインターフェースである理由です。
数百ものデータソースをまたぐ、単一の SQL 方言。ドライバーが SQL-92 を各データソースのネイティブ API に変換します。エージェントは、Salesforce の SOQL も、NetSuite の SuiteQL も、ServiceNow の REST の癖も学ぶ必要がありません。トレーニングですでに身につけた SQL を書くだけです。
メタデータは第一級の存在であり、メタデータコマンドで検出できる。スキーマの検出は、別のプロトコルでも、一括ダンプでもありません。CLI は専用のサブコマンド(metadata tables、metadata columns、metadata procedures)を備えており、それぞれにフィルターを指定できます。そのため、エージェントは求めた部分だけを取得し、組織のすべてを引き出すことは決してありません。
cdatacli metadata tables --connection sf-sandbox --table "%Opportunity%" # 22 of 1,058 tables
cdatacli metadata columns --connection sf-sandbox --table Opportunity # one table's columns
内部的には、これらはドライバーのシステムテーブル(sys_tables、sys_tablecolumns)を読み取っています。どの SQL エンジンも公開しているのと同じ情報です。しかし、入口となるのはこのメタデータコマンドであり、キーワードでフィルターされるため、800 や 1,000 のテーブルを持つ組織でも、エージェントのコンテキストがあふれることはありません。
演算は LLM の中ではなく、データレイヤーで行われる。エージェントが WHERE Amount >= 100000 ORDER BY Amount DESC と書くと、ドライバーはそのうち可能な部分を、Salesforce API が対応する範囲で同 API にプッシュダウンし、残りはドライバープロセス内で処理します。モデルが目にするのは、ごく少数の答えの行だけ。20,000 件もの生レコードを見ることはありません。その結果、トークンは少なく、答えは速く、LLM が計算を間違えることもありません。
実行時には、MCP も LLM も不要。クエリ言語はすでに共通であり、ドライバーはインプロセスのライブラリなので、MCP レイヤーが仲介すべきものは何もありません。そして、エージェントが SQL を書いて検証し終えれば、リリースする成果物はクリーンな JDBC コードです。AI を活用して構築し、AI なしでリリースしましょう。
スキルが、エージェントに CLI の使い方を教える
エージェントは、フラグを当てずっぽうで指定したりしません。スキル(短い Markdown ファイル)が、コマンドリファレンス、接続のパターン、そしてデータソース固有の注意点(Salesforce なら、予約語を角括弧で囲む、列挙型をフィルターする前に PickListValues を確認する、すべてのテーブルを一覧表示しない、など)を与えます。スキルの読み込みが、最初のステップです。
セットアップと使い方を、ステップごとに
前提条件は Java 17 以上です。CLI は、1 行のコマンドでインストールできます。
Windows:
irm https://downloads.cdata.com/cdatabuilds/builds/free/cdatacli/install-cdatacli-windows.ps1 | iex
macOS:
curl -fsSL https://downloads.cdata.com/cdatabuilds/builds/free/cdatacli/install-cdatacli-macos.sh | bash
Linux:
curl -fsSL https://downloads.cdata.com/cdatabuilds/builds/free/cdatacli/install-cdatacli-linux.sh | bash
インストールが終わると、cdatacli が PATH に追加されます。
ステップ 0:スキルのダウンロード
エージェントがコマンドを把握できるよう、CData CLI スキルを指定します。CData CLI はスキルなしでも使えますが、スキルを使うことで、LLM が CData CLI を包括的に理解できるようになります。
npx skills add CDataSoftware/cli-skills
ターミナルでスキルを起動します。すると、お使いのマシンに CData CLI があるかどうかが確認され、なければ自動的に CData CLI がインストールされます。
ステップ 1:ドライバーと目的を指定する
CData CLI が、使用するデータソースと、達成したい目的をたずねます。
I want to connect to Salesforce. Build a large opportunity viewer.
このあとは、ターミナル上の LLM と CData CLI スキルが目的の達成まで案内してくれるので、これらの CLI コマンドを手で入力する必要はありません。この記事では、このサンプルの目的を達成するために通常使われるコマンドを紹介していきます。
インストール済みのものを確認します。
cdatacli drivers list
{
"drivers" : [ {
"path" : "C:\\Users\\JonathanHikita\\cdatacli\\lib\\cdata.jdbc.salesforce.jar",
"name" : "Salesforce",
"product" : "CData JDBC Driver For Salesforce 2026",
"version" : "26.0.9638.0",
"activated" : true
} ]
}
ドライバーがなければ、エージェントが CData カタログから取得します。
cdatacli drivers search --driver salesforce # find the artifactId
cdatacli drivers download --artifact-id salesforce-jdbc # → downloads to ./lib
cdatacli drivers activate Salesforce --name "yourname" --email "[email protected]" --trial
drivers search を実行すると、カタログのエントリと、その artifactId、ダウンロード URL が返ってきます。
{
"drivers" : [ {
"groupId" : "cdata",
"artifactId" : "salesforce-jdbc",
"name" : "CData JDBC Driver For Salesforce 2025",
"version" : "25.0.9539",
"url" : "https://maven.cdata.com/p/jdbc/cdata/salesforce-jdbc/25.0.9539/salesforce-jdbc-25.0.9539.jar"
} ]
}
ステップ 2:接続
次に、データソース(ここでは Salesforce)へのコネクションを作成します。CData の組み込み OAuth を使用している場合は、AI ターミナルから connection create コマンドを実行できます。カスタム OAuth や、独自の ID・シークレットなどの認証情報を指定する必要があるその他の認証方式の場合は、認証情報が LLM に渡るのを防ぐため、AI ではない別のターミナルで connection create コマンドを実行することをおすすめします。
保存したコネクションには認証プロファイルが一度だけ格納され、以降のコマンドはすべて、その名前で参照します。OAuth は初回接続時にブラウザを開き、その後はトークンをキャッシュするので、エージェントが再びシークレットを扱うことはありません。ビューアであれば、読み取り専用で接続します。
cdatacli connection create --driver "Salesforce" --name "sf-sandbox" \
--connectionstring "AuthScheme=OAuth;InitiateOAuth=GETANDREFRESH;UseSandbox=true;LoginURL=https://yourorg.sandbox.my.salesforce.com;ReadOnly=true"
cdatacli connection list
{
"connections" : [ {
"name" : "sf-sandbox",
"driver" : "Salesforce",
"properties" : {
"AuthScheme" : "OAuth",
"InitiateOAuth" : "GETANDREFRESH",
"UseSandbox" : "true",
"Readonly" : "true"
}
} ]
}
ステップ 3:エージェントの動きを見る
metadata コマンドで、キーワードからテーブルを探します。実際の Salesforce 組織にはテーブルが数千個あるため(このサンドボックスでは 1,058 個)、エージェントはすべてを一覧表示せず、名前でフィルターします。
cdatacli metadata tables --connection sf-sandbox --table "%Opportunity%"
{
"tables" : [
{ "TABLE_NAME" : "Opportunity" },
{ "TABLE_NAME" : "OpportunityLineItem" },
{ "TABLE_NAME" : "OpportunityHistory" },
{ "TABLE_NAME" : "OpportunityContactRole" }
]
}
→ 1,058 個ではなく 22 個が一致します。エージェントが求めた部分だけが、コンテキストに取り込まれます。
実際のクエリを書く前に、Opportunity の正確なカラムを取得します。
cdatacli metadata columns --connection sf-sandbox --table Opportunity
{
"columns" : [ {
"TABLE_NAME" : "Opportunity",
"COLUMN_NAME" : "Id",
"TYPE_NAME" : "VARCHAR",
"IS_NULLABLE" : "NO",
"REMARKS" : "Label Opportunity ID corresponds to this field."
}, {
"TABLE_NAME" : "Opportunity",
"COLUMN_NAME" : "Amount",
"TYPE_NAME" : "DECIMAL"
} ]
}
→ Id、Name、Amount、StageName、CloseDate、Probability、IsClosed が確認できます。
まずは LIMIT を付けて、サンプルを取得します。
cdatacli query sql --connection sf-sandbox \
--sql "SELECT Id, Name, Amount, StageName, CloseDate FROM Opportunity LIMIT 3"
実際のクエリを組み立てます。ここでの「大型」とは Amount(金額)が大きい商談のことなので、金額の大きい順に並べます。
cdatacli query sql --connection sf-sandbox \
--sql "SELECT [Id], [Name], [Amount], [StageName], [CloseDate], [Probability] \
FROM [Opportunity] WHERE [Amount] >= 100000 ORDER BY [Amount] DESC"
ドライバーは、Amount >= 100000 と ORDER BY を Salesforce API に押し下げます。一致した行だけがターミナルに返ってきます。エージェントが Opportunity テーブル全体を取得することは決してありません。
ステップ 4:アーティファクトを生成する
SQL の検証が済むと、エージェントはスタンドアロンの Java ターミナルアプリを書き上げます。このアプリは、同じ Salesforce JDBC Driver を通じて接続し、CLI がすでにキャッシュした OAuth トークンを再利用します。再認証は不要で、そして何より、実行パスにはエージェントも LLM も存在しません。クエリを実行するのはドライバーで、プログラムはその結果を表示するだけです。
// LargeOpportunityViewer.java (excerpt)
String url = "jdbc:salesforce:" +
"InitiateOAuth=GETANDREFRESH;AuthScheme=OAuth;UseSandbox=true;" +
"LoginURL=https://yourorg.sandbox.my.salesforce.com;" +
"OAuthSettingsLocation=%APPDATA%\\CData\\Salesforce Data Provider\\OAuthSettings_sf-sandbox.txt;" +
"ReadOnly=true";
String sql = "SELECT [Id],[Name],[Amount],[StageName],[CloseDate],[Probability] " +
"FROM [Opportunity] WHERE [Amount] >= " + minAmount +
" ORDER BY [Amount] DESC";
try (Connection c = DriverManager.getConnection(url);
Statement st = c.createStatement();
ResultSet rs = st.executeQuery(sql)) {
while (rs.next()) { /* print Name, Amount, Stage, CloseDate, Probability */ }
}
あとはビルドして実行するだけ。純粋な JDBC で、CLI もモデルも使いません。
出力例:
Large Opportunity Viewer
Threshold: $100,000.00 | all stages
----------------------------------------------------------------------------------------------
Name Amount Stage Close Date Prob
----------------------------------------------------------------------------------------------
Acme Corp - Mega Renewal $999,000.00 Proposing 2027-08-22 60%
Globex Corporation - Expansion $750,000.00 Closed Lost 2025-07-24 0%
Initech - Platform Deal $500,000.00 Closed Won 2026-03-31 100%
Umbrella Corp - Multi-Year $450,000.00 Closed Won 2025-07-04 100%
Wonka Industries - Upgrade $300,000.00 Proposing 2026-09-04 60%
Stark Industries - Sync $250,000.00 Closed Won 2025-10-09 100%
…
----------------------------------------------------------------------------------------------
16 opportunities | total value $5,000,000.00
ビューアは、実行時に組織のリアルタイムデータを読み取ります。クエリを実行するのはドライバーで、プログラムはその結果を表示するだけです。
この構成が効く理由
各レイヤーが、モデルから仕事を取り除いていきます。
レイヤー | なくなるもの |
単一の SQL-92 方言 | AI がデータソースごとにAPI を学ぶ手間 |
フィルター付きのメタデータコマンド | トークンを浪費する一括スキーマダンプ |
ドライバー側のプッシュダウン | LLM が担うフィルタリングや結合 |
インプロセスの JDBC | またぐべき MCP 境界 |
生成されたアプリ | 実行パスに残る LLM |
エージェントは、検出、SQL、コード生成といった設計作業を、すべてターミナル上で行いました。最終的にリリースするのは、SQL-92 ドライバーを土台に持つクリーンな Java プログラムです。これが、CData CLI の主張を一言で表したものです。
エージェントが SQL を書く。ドライバーが処理を担う。LLM が見るのは、答えだけ。
AI を活用して構築し、AI なしでリリースする。
※本記事は CData US ブログ What Is CData CLI? Connecting Your AI Agents to Hundreds of Data Sources の翻訳です。