Claude CodeとMCPを使ったSalesforceからMySQLへの連携

by Jonathan Hikita | March 2, 2026

Build Salesforce to MySQL Integrations Using Claude Code and MCP

AIアシスト型コーディングの可能性は世界中の開発者を魅了しています。AIアシスタントは自然言語プロンプトから本番対応のコードを書いてくれます。しかし実際のエンタープライズデータ統合プロジェクトではどれほど機能するのでしょうか?

この検証ではCDataドライバーを使ったAIアシスト開発でSalesforceからMySQLへの統合アプリケーションを構築することで、その疑問に答えます。2回にわたって構築しました。1回目は従来のトライアル&エラー開発で、2回目はCData Code Assist MCPを使ってAI生成コードにライブスキーマコンテキストを与えて実施しました。本ブログでは、何がうまくいき、何がうまくいかなかったか、そしてClaudeとCData Code Assist MCPがあなたの次の統合構築をどのように効率化できるかを解説します。

課題

SalesforceオブジェクトをMySQLの既存テーブルに統合・同期するJavaアプリケーションを構築します(Account、Contact、Product、Order)。以下のビジネスルールも必要です:

  • 2025年1月1日以降に作成された注文のみ

  • AccountType = 'Direct' の注文のみ

  • 本番環境のランタイムにはJDBCドライバーを使用

  • ドキュメント化されていない既存のMySQLスキーマに対応

これはJDBCベースのデータアクセスで構築される典型的なエンタープライズ統合シナリオを表しています。開発者は通常、こうしたプロジェクトでスキーマの不一致、外部キーの関係、ドライバー固有の動作のデバッグに何時間も費やします。

一目でわかる結果

指標

CData Code Assist MCPなし

CData Code Assist MCPあり

改善

開発時間

約2.5時間

約35分

2時間以上の節約

コンパイル・実行・デバッグサイクル

13回

1〜2回

85%削減

初回実行の成功率

30%

90%

3倍の改善

スキーマ問題の発見タイミング

ランタイム中

コーディング中

事前検出


重要な違いは何か?開発中のCDataスキーマへの可視性です。CData Code Assist MCPを使えば、AIコーディングツールはCDataスキーマを探索し、クエリをテストし、Javaコードを1行も書く前に仮定を検証できます。その結果:初回コンパイルで正確な本番対応コードが得られます。

以下では、従来のアプローチで大幅なデバッグ時間を要した6つの主要なスキーマ発見の瞬間について詳しく見ていきます。

開発プロンプト

「Javaアプリケーションを作成してください。SalesforceのAccount、Contact、Product、Orderの情報をMySQLの既存テーブルにコピーしたいです。2025年1月1日以降に作成されたOrderのみをコピーしてください。AccountType='Direct'のOrderのみを選択してコピーしてください。JDBC接続プロパティはjdbc-connection.mdに保存されています。」

前提条件

  • JDKのインストール

  • Claude Code

  • SalesforceとMySQL用のCData JDBCドライバー

  • SalesforceとMySQLの認証情報

  • SalesforceとMySQL用のCData Code Assist MCP

Claude CodeでCData Code Assist MCPを設定する

ステップ1: CData Code Assist MCPをインストールする

CDataのウェブサイトにアクセスし、SalesforceとMySQL用のCData Code Assist MCPをダウンロードします。インストールを完了してください(WindowsとMacのバージョンが利用可能です)。

ステップ2: SalesforceとMySQLへの接続を設定する

インストール後、cdata.mcp.salesforce.jarcdata.mcp.mysql.jarファイルを開き、SalesforceとMySQLへの接続を設定します。UIで接続プロパティを設定し、「Save & Test」ボタンをクリックします。

ステップ3: MCPクライアント設定を生成する

「Next」をクリックしてMCPクライアント設定に進みます。ドロップダウンから「Claude Code」を選択します。UIが設定JSONとJSONファイルの保存場所に関するガイダンスを生成します。.mcp.jsonファイルを作成し、プロジェクトフォルダの下に保存します。

  "mcpServers" : {
  "CDataSalesforceSandbox" : {
   "type" : "stdio",
   "command" : "C:\Program Files\CData\CData MCP Server for Salesforce
 2025\jre\bin\java.exe",
   "args" : [ "-Dfile.encoding=UTF-8", "-jar", "C:/Program Files/CData/CData MCP Server for
 Salesforce 2025/lib/cdata.mcp.salesforce.jar", "CDataSalesforceSandbox" ],
  "env" : {}
 }
}

CData Code Assist MCP UIを閉じます。MySQL側でも同じプロセスを繰り返します。

ステップ4: Claude Codeを開いてMCPサーバーを設定する

Claude Codeを開き、MCPサーバーが検出されていることを確認します。

ステップ5: Claude CodeにJavaアプリケーションの生成を促す

シンプルなプロンプトがAIコーディングツールに届くと、Code Assist MCPを使ってCDataドライバーが公開するソーススキーマとターゲットスキーマを検査します。

検証済みのスキーマコンテキストを得て、AIはランタイムで使用されるのと同じCDataスキーマとSQLセマンティクスを使ってSalesforceとMySQLをマップするJavaアプリケーションを生成します。

開発プロンプト

CData Code Assist MCPなしでは、Claude Codeは6つの異なるスキーマ問題に直面します:

  • 誤った主キーマッピング(IdSalesforceId

  • 存在しないカラム/フィールド(BillingStreet、MobilePhone)

  • テーブル/オブジェクト名の不一致(Product2対products)

  • 存在しないテーブル/オブジェクト(order)

  • ドライバー構文の非互換性(VALUES()関数)

  • 外部キーの混乱(AccountIdSalesforceAccountId

以下のセクションでこれらの発見を詳しく探ります。

パート1: スキーマ発見の実践

発見1: Accountテーブルのフィールドマッピング

CData Code Assist MCPなし:

  • SalesforceのIdがMySQLのIdにマップすると仮定

  • 請求先住所フィールドがMySQLに存在すると仮定

  • 「Unknown column 'BillingStreet'」でランタイムに失敗

  • 実際のスキーマを発見するためにjavaユーティリティの作成が必要

CData Code Assist MCPあり:

Claude CodeはCDataSalesforceSandbox_get_columns(table="Account")を呼び出して以下を発見します:

  • 主キー: Id(VARCHAR)

  • 利用可能フィールド: BillingStreet、BillingCity、BillingState、BillingPostalCode、BillingCountry

  • 利用可能フィールド: Name、Type、Industry、Phone、Website

  • 利用可能フィールド: CreatedDate、LastModifiedDate

  • 合計: カスタムフィールドを含む190以上のカラム

次にClaude CodeはCDataMySQL_get_columns(catalog="internalcrm", table="account")を呼び出して以下を発見します:

  • 主キー: Id(INT、AUTO_INCREMENT)— Salesforceとは異なる

  • SalesforceId(VARCHAR)— ここにIdをマップする

  • 利用可能フィールド: Name、Type、Industry、Phone、Website

  • 請求先住所フィールドなし

重要な発見:

  • MySQLのIdはINT自動インクリメントであり、SalesforceのIDではない

  • MySQLのSalesforceIdにSalesforceのIdをマップする

  • MySQLには請求先住所カラムがない

  • Name、Type、Industry、Phone、Websiteは名前が一致

CData Code Assist MCPを使ったコード生成:

// Claude Codeは最初から正しいマッピングを生成します:
String upsert = "INSERT INTO account (SalesforceId, Name, Type, Industry, " +
        "Phone, Website, CreatedDate, LastModifiedDate) " +
        "VALUES (?, ?, ?, ?, ?, ?, ?, ?) " +
        "ON DUPLICATE KEY UPDATE Name = ?, Type = ?, ...";
// Salesforce.Id → MySQL.SalesforceId(Idではない)にマップ
pstmt.setString(1, account.getId()); // SalesforceIdカラムに
pstmt.setString(2, account.getName());
// 請求先住所フィールドは含めない

発見2: Contactテーブルのフィールドマッピング

CData Code Assist MCPなし:

  • 標準的なフィールドマッピングを仮定

  • ランタイムエラーでMobilePhoneがMySQLに存在しないことが判明

  • javaの書き直しが必要

CData Code Assist MCPあり:

Claude CodeはCDataSalesforceSandbox_get_columns(table="Contact")を呼び出して以下を発見します:

  • Id、AccountId、FirstName、LastName、Email、Phone

  • MobilePhone、Title、Department

  • CreatedDate、LastModifiedDate

次にClaude CodeはCDataMySQL_get_columns(catalog="internalcrm", table="contact")を呼び出して以下を発見します:

  • Id(INT)、SalesforceId(VARCHAR)、AccountId(INT)— account.Idへの外部キー

  • SalesforceAccountId(VARCHAR)— Salesforceアカウント参照用

  • FirstName、LastName、Email、Phone、Title、Department

  • MobilePhoneフィールドなし

重要な発見:

  • MySQLにはアカウント参照が2つあります:

    • AccountId(INT)はMySQLのIdにリンク

    • SalesforceAccountId(VARCHAR)はSalesforceのアカウントIDを保存

  • MySQLにはMobilePhoneフィールドがない

  • Accountと同じパターン:SalesforceのContactID用にSalesforceId

発見3: Productテーブルのスキーマ不一致

CData Code Assist MCPなし:

  • 「Product」テーブル用のjavaを作成

  • ランタイムで失敗:テーブル構造が完全に異なる

  • ユーザーが手動でProductの同期を無効化

CData Code Assist MCPあり:

Claude CodeはCDataSalesforceSandbox_get_columns(table="Product2")を呼び出して以下を発見します:

  • テーブル名は「Product2」(「Product」ではない)

  • Id、Name、ProductCode、Description

  • IsActive、Family、CreatedDate、LastModifiedDate

次にClaude CodeはCDataMySQL_get_columns(catalog="internalcrm", table="products")を呼び出して以下を発見します:

  • product_id(INT、主キー)

  • product_code、product_name、description

  • category、unit_price、cost_price、list_price

  • is_active、created_date、modified_date

  • salesforce_key(VARCHAR)— SalesforceのProduct ID用

重要な発見:

  • Salesforceのテーブル:Product2、MySQLのテーブル:products

  • スキーマ構造が全く異なります:

    • Salesforce: Id → MySQL: product_id(INT)

    • Salesforce: ProductCode → MySQL: product_code

    • Salesforce: Name → MySQL: product_name

    • MySQLには価格フィールドがあり、Salesforceにはない

    • MySQLにはマッピング用のsalesforce_keyがある

  • 単純なフィールドコピーではなく、カスタムマッピングロジックが必要

発見4: Orderテーブルが存在しない

CData Code Assist MCPなし:

  • 複雑なフィルタリングロジックを持つjavaを作成

  • ランタイムで失敗:「Table 'order' doesn't exist」

CData Code Assist MCPあり:

Claude CodeはCDataSalesforceSandbox_get_columns(table="Order")を呼び出して以下を発見します:

  • Id、AccountId、OrderNumber、Status、TotalAmount

  • EffectiveDate、Description、CreatedDate

  • 同期に必要なすべてのフィールドを持つ

次にClaude CodeはCDataMySQL_get_tables(catalog="internalcrm", table="%order%")を呼び出して以下を発見します:

  • 「order」または「orders」というテーブルなし

  • 見つかったテーブル: account、contact、products、invoices、opportunities

  • MySQLデータベースにOrderテーブルが存在しない

重要な発見:OrderテーブルはMySQLデータベースに存在しない

パート2: コーディング前のクエリテスト

発見5: JOINを使った複雑なOrderクエリ

CData Code Assist MCPなし:

  • INNER JOINクエリを盲目的に記述

  • コンパイル→実行→ログ確認でクエリが動作するかを確認するまで待機

  • クエリ構文が正しいかをランタイムになるまで知ることができない

CData Code Assist MCPあり:

CData Code Assist MCPを使って、AIはCOUNTクエリでCDataSalesforceSandbox_run_queryを呼び出して日付フィルターをテストします:

SELECT COUNT(*) AS TotalOrders
FROM [Order]
WHERE CreatedDate >= '2025-01-01 00:00:00'

結果:4,359件の注文が日付フィルターに一致。

次にClaude CodeはフルJOINクエリをテストします:

SELECT TOP 5 o.Id, o.AccountId, o.OrderNumber, o.Status,
   o.TotalAmount, o.CreatedDate,
   a.Name AS AccountName, a.Type AS AccountType
FROM [Order] o
INNER JOIN Account a ON o.AccountId = a.Id
WHERE o.CreatedDate >= '2025-01-01 00:00:00'
AND a.Type = 'Direct'
ORDER BY o.CreatedDate DESC

クエリは有効な結果を返します:

Id

アカウント名

タイプ

合計金額

作成日

801TV00000WLZhxYAH

Hartwell Distribution Co.

Direct

499.00

2025-09-09 10:59

801TV00000WHLteYAH

Meridian Beverage Group

Direct

1,996.00

2025-09-08 11:42

801TV00000WFu5wYAD

Stonefield Holdings Ltd

Direct

499.00

2025-09-08 04:43

801TV00000WFbedYAD

Vantara Systems GmbH

Direct

2,746.00

2025-09-08 03:44

801TV00000W9TQKYA3

Cascade Regional Authority

Direct

999.00

2025-09-05 19:02


これにより、クエリがライブCDataスキーマに対して有効で、期待通りのデータが返ることが確認されました。

生成されたコードは初回から動作します:

String query = "SELECT o.Id, o.AccountId, o.OrderNumber, o.Status, o.TotalAmount, " +
  "o.CreatedDate, o.LastModifiedDate " +
  "FROM [Order] o " +
  "INNER JOIN Account a ON o.AccountId = a.Id " +
  "WHERE o.CreatedDate >= '2025-01-01 00:00:00' " +
  "AND a.Type = 'Direct'";
// Javaコードに埋め込む前にテストと検証済み!

パート3: 開発時間の比較

このセクションでは、CData Code Assist MCPなしとありの2つの実際のタイムラインを比較し、最初からスキーマ対応ツールを統合することで節約できる時間、労力、フラストレーションをハイライトします。

CData Code Assist MCPなしのタイムライン

時間(hh:mm)

アクティビティ

0:00

ユーザーが同期アプリケーションをリクエスト

0:15

AIが仮定に基づいて12個のJavaクラスを生成

0:25

コンパイル成功

0:30

実行1: VALUES()関数エラー

0:45

4つのサービスクラスのUPSERT構文を修正、再コンパイル

0:50

実行2: バッチ実行エラー

1:00

4つのサービスクラスのバッチ処理を無効化、再コンパイル

1:05

実行3: Unknown column 'BillingStreet'

1:15

InspectMySQLSchema.javaユーティリティを作成

1:20

インスペクターを実行し、実際のスキーマを発見

1:35

正しいスキーマで4つのサービスクラスを書き直し

1:40

実行4: 接続数超過

1:50

バッチコミットを追加、再コンパイル

1:55

実行5: トランザクションタイムアウト

2:05

自動コミットモードを有効化、再コンパイル

2:10

実行6: まだタイムアウトの問題

2:20

接続スロットリングの遅延を追加

2:25

実行7: 部分的成功(100件のレコードのみ)

 

  • 合計時間:約5時間

  • イテレーション:13回のコンパイル・実行・デバッグサイクル

  • 成功率:部分的(ドライバーの制限による)

CData Code Assist MCPありのタイムライン

時間(hh:mm)

アクティビティ

0:00

ユーザーが同期アプリケーションをリクエスト

0:01

MCP経由でSalesforceのAccountスキーマを確認

0:02

MCP経由でMySQLのaccountスキーマを確認

0:03

フィールドマッピングの違いを発見(Id → SalesforceId)

0:04

MCP経由でContactスキーマを確認

0:05

MCP経由でOrder JOINクエリをテスト

0:06

MCP経由でProductスキーマを確認

0:07

Productスキーマの不一致を発見

0:08

MCP経由でMySQLのorderテーブルの存在を確認

0:09

MCP経由でUPSERT構文をテスト

0:10

VALUES()の非互換性を発見

0:11-0:25

すべての修正を含むJavaコードを生成

0:30

コンパイル成功

0:32

実行1: 正常動作!

0:35

CDataドライバーのパフォーマンス考慮事項への対応

  • 合計時間:約35分

  • イテレーション:1〜2回のコンパイル・実行サイクル

  • 成功率:高い(初回実行90%成功)

  • 節約時間:約2時間

MCPが開発にもたらすもの

開発者はスキーマ構造の推測、ドライバーのクセのデバッグ、壊れたクエリの書き直しに時間を無駄にしがちです。CData Code Assist MCPを使えば、これらすべてを事前に回避する可視性とツールが手に入ります。ライブスキーマの探索からSQLの検証、実行可能なコードの生成まで、統合開発の各フェーズでMCPが解放するものをご紹介します:

  1. インタラクティブなスキーマ探索

  • コードを書く前に正確なテーブル構造を確認

  • フィールドタイプ、制約、外部キーを把握

  • スキーマの不一致を即座に発見

  1. クエリ検証

  • コードに埋め込む前に複雑なSQLクエリをテスト

  • JOINの構文が実際のデータで機能することを検証

  • フィルターが期待する結果を返すことを確認

  1. ドライバー互換性テスト

  • JDBC接続文字列をテスト

  • JDBCドライバーのクセを発見(VALUES()、バッチ処理)

  • 構文の制限を早期に特定

  • UPSERTパターンが機能することを検証

  1. データサンプリング

  • 実際のデータ構造と値を確認

  • データタイプとフォーマットを把握

  • データに関する仮定を検証

  1. 情報に基づくコード生成

  • 最初から正しいマッピングでコードを生成

  • ターゲットに存在するフィールドのみを含める

  • 互換性のあるSQL構文を使用

  • エッジケースに事前に対応

主なポイント

CData Code Assist MCPは、AIアシスト型統合開発の在り方を根本的に変えます。

従来のワークフローでは、コードを書き、コンパイルし、実行し、エラーに直面し、デバッグし、繰り返すというループに陥りがちです。CData Code Assist MCPを使えば、ワークフローははるかに意図的で情報に基づくものになります。開発者はまずスキーマを探索し、クエリをテストし、仮定を検証してから、自信を持ってコードを生成できます。

真の優位性は、ランタイムにCDataドライバーが適用するのと同じスキーマと動作への開発時の可視性にあります。Claude Codeは、Javaコードを1行も書く前にソースとターゲット両方のデータシステムとやり取りできます。その早期の洞察が、最初から正しいフィールドマッピング、互換性のあるSQL構文、検証済みのクエリにつながります。その結果、チームはデバッグサイクルが少なく、初回実行の信頼性が高く、動作するコードへの道のりがずっと速くなります。

重要なのは、最終的なアプリケーションはCData JDBCで構築された標準的なJavaアプリケーションのままということです。MCPの依存関係もランタイムでのLLM呼び出しもありません。CData Code Assist MCPはよりスマートなコード生成を促すために開発時にのみ使用されます。

CData Code Assist MCPとCData DriverでAIアシスト開発を加速

CData Code Assist MCPはAIコーディングツールを350以上のエンタープライズデータソースに接続し、Model Context Protocol(MCP)を通じたスキーマ探索とライブデータアクセスを可能にします。無料のCData Code Assist MCP for Salesforceをダウンロードして、ご自身でお確かめください!

※本記事はCData US ブログBuild Salesforce to MySQL Integrations Using Claude Code and MCPの翻訳です。

CData ドライバー&コネクターを試してみる

データソースから日々使用するツールへのシームレスな接続で、ライブデータへの超高速アクセスを実現します。標準ベースのコネクターでデータ統合を手軽に。設定してクリックするだけです。

今すぐ試す