この実験では、GUIを持つJava SwingアプリケーションでSalesforceのAccountレコードを完全なCRUD操作で管理するようClaude Codeに依頼しました。シンプルなデータ連携タスクのはずが、デバッグの連続になってしまいました。
本ブログでは、その体験を紹介しつつ、同じプロジェクトをスキーマ探索にCData Code Assist MCP(ローカルにインストールされたMCPサーバー)と、ランタイム接続にCData JDBCドライバーを使った場合にどう動くかを探ります。CData Code Assist MCPは、Claude CodeのようなAIコーディングツールをデータソースに接続し、開発中にスキーマ、メタデータ、ライブデータへのアクセスを提供します。フィールド名や有効な値を推測するのではなく、AIはデータベースに直接必要な情報を問い合わせることができます。
課題
自然言語とLLMアシスト開発でJavaアプリを構築したいと思います。最初のユーザープロンプトはこうです。「SalesforceのAPIを使ってSalesforceからアカウント情報を読み取るGUI付きのJavaアプリを作成してください。挿入、更新、削除の機能も追加してください。」
シンプルに見えますよね?では、実際にどうなるか見ていきましょう。
アプローチ1: Salesforce REST APIで構築する
Claude Codeがクリーンなアーキテクチャを設計する
この実験ではJavaバージョン11.0.28を使用し、Salesforceへの接続方法を指定せずにClaude Codeにシンプルなプロンプトを与えます。(Salesforceへの接続方法として)REST API、SOAP、特定の認証方法については触れていません。
Claude Codeは独自のよく構造化されたプランを考案しました:
Auth、API、UIパッケージ全体で12個のJavaファイル
OAuth 2.0 Webフロー認証
RESTコール用のApache HttpClient
JSONシリアライゼーション用のGson
テーブルビューとフォームを持つSwingベースのGUI
アーキテクチャはきれいに見えます。しかし問題は実装中に発生しました。
認証がボトルネックになる
最初の実装では標準的なOAuth 2.0を試みました。しかしSalesforceはこれを拒否しました。
どこが問題だったのでしょう?最初の試みは認証コールバック待ちでタイムアウトしました。修正方法は?サーバーバインディングを「全インターフェース」からlocalhost(「127.0.0.1」)に変更する必要がありました。2回目の試みでは、コードチャレンジが欠けているというエラーメッセージが出ました。
最終的に、SalesforceはPKCE(Proof Key for Code Exchange)なしでは処理を続けませんでした。これはオプションではありません。現代のSalesforce組織はセキュリティ要件としてPKCEを強制しているため、APIはより単純なOAuthフローをアクティブにブロックします。
修正には完全なPKCEサポートの実装が必要です:
この認証コードだけで実装のおよそ100行を消費します。
AIがピックリスト値を推測に頼る
認証が通ると、Accountレコードを作成しようとしましたが、すぐに失敗しました。
コーディングアシスタントからの応答は?「入力した国は有効ではありません。リストから選択してください。」
SalesforceインスタンスでState/Countryピックリストが有効になっています。Claude Codeは有効な値を見つける方法を本質的に知りません。Salesforceのスキーマメタデータにアクセスできないと、AIはこの組織でどの値が設定されているかをクエリできません。代替案は包括的なAPIドキュメントをAIにアップロードすることですが、そのドキュメントでも標準フィールドは説明されていますが、組織固有のピックリスト設定は説明されていません。既知の有効な値を使う代わりに、単純に推測します:
private static final String[] COUNTRIES = {
"", "United States", "Canada", "United Kingdom", "Australia",
"Germany", "France", "Japan", "China", "India", "Brazil"...
};
Stateについても同じ問題があります。コーディングアシスタントは推測に基づいて別のハードコードされた配列を試みます。
このアプローチには根本的な欠陥があります:
不完全 - このSalesforceインスタンスで設定されている多くの有効な値が漏れる
脆弱 - Salesforceの設定値が推測と異なる場合、レコードの保存に失敗する
発見不可能 - AIはどの値が有効かを把握する手段がない
定型コードが積み重なる
SalesforceClient.javaファイルはSOQLクエリ構築とURLエンコード、HTTPリクエスト/レスポンスのライフサイクル、認証ヘッダーの注入、JSONパースとエラーハンドリング、APIバージョニング(/services/data/v59.0/)を処理する必要があります。
「全アカウントを取得する」などのシンプルな操作でも、それぞれ15〜20行のコードが必要です。
最終的な集計
複数のビルド・修正サイクルを経て、アプリは動作しました。しかし体験は辛いものでした:
指標 | 件数 |
作成されたファイル総数 | 12 |
OAuth + PKCEの行数 | 約100行 |
RESTクライアントの行数 | 約150行 |
ビルド・テスト・修正サイクル | 5回以上 |
ハードコードされた仮定 | 複数の配列 |
開発時間の目安 | 約2時間 |
アプローチ2: CData Code Assist MCPとJDBCで構築する
コードを書く前に、Claude CodeはCData Code Assist MCPを使ってSalesforceスキーマを調べることができます。接続にはAIの介入やプロンプトなしにClaude Codeがスキーマ探索のベストプラクティス手順を踏めるよう組み込み指示が含まれています。
注意: Salesforceへの接続方法について基盤となるLLMに指示はしていませんが、SalesforceのCode Assist MCPを設定しており、これがLLMをCData JDBCドライバーの使用に誘導します。
AIはコードを書く前にスキーマを探索します。Account関連のCRUD操作を計画する際、Claude Codeはランタイムで使用するSalesforce接続の基礎データモデルにアクセスできます。計画段階で、Claude CodeはSalesforceスキーマを推測して開発者がAPIドキュメントを手動で調べる必要がある状況を作り出す代わりに、専用のMCPツール(get_tables)を使ってスキーマを直接クエリします。
これにより、Accountに関連するすべてのSalesforceオブジェクトが返されます。SalesforceはこれらをObjectsと呼びますが、CDataのSQLインターフェースはそれらをtablesとして提示し、Claude Codeに使い慣れたデータベースのパラダイムを提供します。結果にはAccount、AccountContactRelation、AccountContactRole、AccountFeed、AccountHistoryなど関連するオブジェクトが含まれます。
Account CRUD操作の適切なオブジェクトを特定した後、Claude Codeは最初から動作する正確なSQLクエリを書けるようにフィールド構造を把握する必要があります。別の専用MCPツール(get_columns)を通じてこれを探索します。
これにより、Accountオブジェクト内のすべてのフィールドの重要なメタデータが返されます。Salesforceはこれらをfieldsと呼びますが、CDataはSQL互換性のためにcolumnsとして提示します。メタデータにはId(VARCHAR、主キー)、Name(VARCHAR)、BillingState(VARCHAR)、BillingCountry(VARCHAR)、Industry(VARCHAR)、Phone(VARCHAR)などのフィールドとそのデータ型とラベルが含まれます。
Claude CodeがAccountオブジェクトと関連フィールドの基礎構造を把握したので、コードを書く前にアプリケーションに含める適切な値を探索するクエリを構築できます。これにより、REST APIの実験でCountryの問題が発生したような事態を排除できます。正しい形式の正確な値が最初から含まれているからです。REST APIの実験では、計画段階でピックリスト値が必要になったとき、Claude Codeは推測しなければなりませんでした。APIドキュメントをアップロードしても役に立ちません。ドキュメントは標準フィールドを説明するだけで、この組織の固有設定は説明していないためです。Code Assist MCPを使えば、Claude Codeは最初から正確な値を取得できます。
Claude Codeは有効なピックリスト値を取得するクエリを自動的に生成します:
SELECT [PickList_Value], [PickList_Label], [PickList_IsActive]
FROM [PickListValues]
WHERE [TableName] = 'Account' AND [ColumnName] = 'BillingCountryCode'
このクエリはこのSalesforce組織で設定された正確な値を返します:AF(アフガニスタン)、AU(オーストラリア)、CA(カナダ)、US(アメリカ合衆国)など、ラベルとアクティブ状態を含むすべての有効な国コードです。
設定がカスタムコードを置き換える
REST APIアプローチはPKCEコード検証子とチャレンジの生成、すべてのパラメータを含む認証URLの構築、コールバック用のローカルHTTPサーバーの起動、ブラウザリダイレクトの処理、コードをトークンに交換、トークンリフレッシュの管理のためにおよそ100行以上のコードが必要です。
CDataのアプローチはカスタムコードの代わりにUIベースの設定を使います。開発とランタイムの両方に設定UIを提供します。
CData Code Assist for SalesforceとCData Salesforce JDBCドライバーはどちらも、コードではなくドロップダウンとフィールドを通じて同じ認証オプション(OAuth、OAuthPKCE、JWT、エンタープライズSSO)をサポートします。
Code Assist MCP UIはAIコーディングツール用の設定を生成し、JDBCドライバーUIはランタイムアプリケーション用の接続文字列を生成します。
100行以上のコードと複数のデバッグサイクルを消費する複雑さが、両フェーズで設定の選択になります。
2つのアプローチの比較
観点 | Salesforce REST API | Code Assist MCP + JDBC |
Salesforceの設定 | OAuth、コールバックURL、スコープを含むConnected App | 不要(ユーザー名/パスワード認証) |
認証コード | 約100行(OAuth + PKCE) | 0行(接続文字列) |
APIクライアントコード | 約150行 | 約30行 |
スキーマ探索 | 手動/ドキュメント参照 | インタラクティブなMCPクエリ |
ピックリスト値 | ハードコードされた配列(推測) | メタデータテーブルをクエリ |
デバッグサイクル | 5回以上 | 最小限(1〜2回) |
開発時間の目安 | 約2時間 | 約15分 |
長期メンテナンスへの影響
CDataの仮想化レイヤーは時間とともに複利的なメンテナンス上の優位性を提供します。
APIバージョン変更への対応:SalesforceはAPIバージョンを定期的に廃止します。REST APIコードにはハードコードされたバージョン文字列(/v59.0/)が含まれています。CDataはバージョニングを内部で処理するため、開発者はコードではなくドライバーを更新するだけです。
スキーマの進化への対応:Salesforce管理者がピックリストを変更したりフィールドを追加したりすると、ハードコードされた配列はサイレントに壊れます。CDataはライブメタデータをクエリするため、アプリケーションは常に現在の有効な値を把握しています。
認証要件の変化への対応:SalesforceはOAuthからPKCE、MFAへと認証要件を強化し続けています。カスタム認証コードは技術的負債になります。CDataはプロトコルの変更をドライバー更新に吸収します。
破壊的変更からの保護:JSONを直接パースするREST APIコードはレスポンス形式の変更に対して脆弱なままです。仮想化レイヤーはSQLベースのコードをこれらの変更から分離します。
CRUDを超えて:複雑なクエリをシンプルに
Account Managerはシンプルな単一テーブルアプリを表しています。より複雑なシナリオではさらに大きな価値が明らかになります。
こんなプロンプトを考えてみましょう:「アカウント詳細とコンタクト情報を含む営業パイプラインダッシュボードを構築してください。」
CData Code Assist MCPを使うと、AIは外部キーを発見してインタラクティブにJOINクエリを構築します:
SELECT a.[Name] AS AccountName,
o.[Name] AS OpportunityName,
o.[StageName],
o.[Amount],
c.[Name] AS ContactName,
c.[Email]
FROM [Account] a
INNER JOIN [Opportunity] o ON a.[Id] = o.[AccountId]
LEFT JOIN [Contact] c ON o.[ContactId] = c.[Id]
WHERE o.[IsClosed] = 0 AND o.[Amount] > 10000
ORDER BY o.[Amount] DESC
フィールド名の推測なし。手動のJSONの組み合わせなし。複数のAPIラウンドトリップなし。
主なポイント
AIコーディングツールは強力ですが、見えるものに制限されます。Claude CodeがSalesforceのREST APIを扱おうとしても、その動作は盲目的です。フィールド名、認証要件、有効な値を推測し、エラーで真実が明らかになるまで続けます。
CData Code Assist MCPは、計画フェーズ中にスキーマメタデータとライブデータへの会話型アクセスをAIに提供することで、このダイナミクスを変えます。そしてJDBCドライバーはランタイム実装のための使い慣れた標準化されたインターフェースを提供します。
このシンプルなAccount Managerプロジェクトは開発時間の8倍の削減(2時間対15分)を示しています。しかし利点は初期開発にとどまりません。開発者はより少ないコード、より少ないデバッグ、より少ないフラストレーション、メンテナンス負担の軽減、そして重要な機能に費やす時間を得られます。
AIコーディングアシスタントがデータ構造を見て、有効な値のメタデータテーブルをクエリし、複雑なREST APIの代わりに使い慣れたSQLインターフェースで作業できるとき、開発体験全体がデバッグマラソンから生産的なコラボレーションへと変わります。
CData Code Assist MCPでAIコーディングワークフローを強化
CData Code Assist MCPはAIコーディングツールを350以上のエンタープライズデータソースに接続し、Model Context Protocol(MCP)を通じたスキーマ探索を可能にします。
無料のCData Code Assist MCP for Salesforceをダウンロードして、その効果を直接ご確認ください!
※本記事はCData US ブログBuild Salesforce Applications Faster Using Claude Code and MCPの翻訳です。
CData ドライバー&コネクターを試してみる
データソースから日々使用するツールへのシームレスな接続で、ライブデータへの超高速アクセスを実現します。標準ベースのコネクターでデータ統合を手軽に。設定してクリックするだけです。
今すぐ試す