【徹底解説】Agentforce とJSON のデータをMCP Server で簡単連携
Agentforce は、エンタープライズチーム向けに設計されたAI プラットフォームです。宣言的なツールとAPI ファーストなアーキテクチャで、アシスタントの構成やCRM ベースのワークフロー自動化を簡単に実現できます。
しかし、エージェントがJSON 以外のデータを扱う必要がある場合、多くの実装では定期的な同期や独自のミドルウェアを使用して外部システムをローカルデータベースに複製しています。この方法では、複雑性の増加、ガバナンスとメンテナンスのオーバーヘッド、同期の遅延が発生し、エージェントのリアルタイム性能が制限されてしまいます。
CData Connect AIは、数百種類のビジネスアプリケーション、データベース、ERP、会計ツールへのリアルタイムアクセスを提供することで、このギャップを埋めます。CData のリモートMCP Serverを使用することで、Agentforce エージェントは実行時に最新のコンテキストに沿ったデータをセキュアに読み書きし、アクションを実行できます。そのため、より少ない構成要素で、より強力な制御のもと、根拠に基づいた応答、リアルタイムの意思決定、システム間の自動化を実現できます。
本記事では、Connect AI でJSON への接続を設定し、MCP Server をAgentforce に登録し、JSON データをクエリするワークフローを構築するために必要な手順を説明します。
前提条件:
- CData Connect AI アカウント
- Python 3.9 以上のインストール
- Agentforce が有効化されたJSON アカウントと、接続アプリの作成/管理権限
必要な認証情報のチェックリスト
開始する前に、以下の認証情報を準備してください。
CData Connect AI MCP
- 「USERNAME」: アカウントのメールアドレス
- 「PAT:」 Connect AIの「Settings」から「アクセストークン」をクリック(一度だけコピー可能)
- 「MCP_BASE_URL: 」https://mcp.cloud.cdata.com/mcp
- 「MCP_AUTH: 」Base64エンコードされた(EMAIL:PAT)。EMAILはConnect AIのメールアドレス、PATはConnect AIのパーソナルアクセストークンです(下記参照)。
MCP_AUTH のBase64 エンコード版は、Base64 エンコーディングツールを使用して作成できます。
Agentforce
- 「SFDC_DOMAIN」: ドメインのURL (https://your_domain.my.salesforce.com)
- 「SFDC_CLIENT_ID & SFDC_CLIENT_SECRET」: 接続アプリから取得
- 「AGENT_ID」: Agentforce Agents でエージェントを開き、URL の末尾にある18文字のIDをコピー
ステップ1: Agentforce 連携用のJSON への接続を設定
それでは、Agentforce からCData Connect AI のリモートMCP 経由でJSON への接続を設定していきましょう。Agentforce からJSON を操作するには、まずCData Connect AI でJSON へのコネクションを作成し、設定します。
- Connect AI にログインして「Sources」をクリック。次に「Add Connection」をクリックします。
- 一覧から「JSON」を選択します。
-
JSON に接続するために必要な認証プロパティを入力します。
データソースへの認証については、ヘルプドキュメントの「はじめに」を参照してください。CData 製品は、JSON API を双方向データベーステーブルとして、JSON ファイルを読み取り専用ビュー(ローカル ファイル、一般的なクラウドサービスに保存されているファイル、FTP サーバー)としてモデル化します。HTTP Basic、Digest、NTLM、OAuth、FTP などの主要な認証スキームがサポートされています。詳細はヘルプドキュメントの「はじめに」を参照してください。
URI を設定して認証値を入力したら、DataModel を設定してデータ表現とデータ構造をより厳密に一致させます。
DataModel プロパティは、データをどのようにテーブルに表現するかを制御するプロパティで、次の基本設定を切り替えます。
- Document(デフォルト):JSON データのトップレベルのドキュメントビューをモデル化します。CData 製品 は、ネストされたオブジェクト配列を集約されたJSON オブジェクトとして返します。
- FlattenedDocuments:ネストされた配列オブジェクトと親オブジェクトを、単一テーブルに暗黙的に結合します。
- Relational:階層データから個々の関連テーブルを返します。テーブルには、親ドキュメントにリンクする主キーと外部キーが含まれています。
リレーショナル表現の設定についての詳細は、ヘルプドキュメントの「JSON データのモデリング」を参照してください。また、以下の例で使用されているサンプルデータも確認できます。データには人や所有する車、それらの車に行われたさまざまなメンテナンスサービスのエントリが含まれています。
Amazon S3 内のJSON への接続
URI をバケット内のJSON ドキュメントに設定します。さらに、次のプロパティを設定して認証します。
- AWSAccessKey:AWS アクセスキー(username)に設定。
- AWSSecretKey:AWS シークレットキーに設定。
Box 内のJSON への接続
URI をJSON ファイルへのパスに設定します。Box へ認証するには、OAuth 認証標準を使います。 認証方法については、Box への接続 を参照してください。
Dropbox 内のJSON への接続
URI をJSON ファイルへのパスに設定します。Dropbox へ認証するには、OAuth 認証標準を使います。 認証方法については、Dropbox への接続 を参照してください。ユーザーアカウントまたはサービスアカウントで認証できます。ユーザーアカウントフローでは、以下の接続文字列で示すように、ユーザー資格情報の接続プロパティを設定する必要はありません。 URI=dropbox://folder1/file.json; InitiateOAuth=GETANDREFRESH; OAuthClientId=oauthclientid1; OAuthClientSecret=oauthcliensecret1; CallbackUrl=http://localhost:12345;
SharePoint Online SOAP 内のJSON への接続
URI をJSON ファイルを含むドキュメントライブラリに設定します。認証するには、User、Password、およびStorageBaseURL を設定します。
SharePoint Online REST 内のJSON への接続
URI をJSON ファイルを含むドキュメントライブラリに設定します。StorageBaseURL は任意です。指定しない場合、ドライバーはルートドライブで動作します。 認証するには、OAuth 認証標準を使用します。
FTP 内のJSON への接続
URI をJSON ファイルへのパスが付いたサーバーのアドレスに設定します。認証するには、User およびPassword を設定します。
Google Drive 内のJSON への接続
デスクトップアプリケーションからのGoogle への認証には、InitiateOAuth をGETANDREFRESH に設定して、接続してください。詳細はドキュメントの「Google Drive への接続」を参照してください。
- 「 Save & Test」をクリック。
-
JSON ページの「Permissions」タブに移動し、ユーザーごとの権限を更新します。
パーソナルアクセストークンの追加
パーソナルアクセストークン(PAT)は、Agentforce からConnect AI への接続を認証するために使用されます。アクセスの粒度を維持するため、サービスごとに個別のPAT を作成するのがベストプラクティスです。
- Connect AI アプリの右上にある歯車アイコン()をクリックして、設定ページを開きます。
- 設定ページで、アクセストークンセクションに移動し、PATを作成をクリックします。
-
PATに名前を付けて、作成をクリックします。
- パーソナルアクセストークンは作成時のみ表示されるため、必ずコピーして安全に保管してください。
接続が設定され、PAT が生成されたので、Agentforce からSalesforce に接続する準備が整いました。
ステップ2: Agentforce を有効化し、Experience Cloud サイトを公開
- Salesforce の設定ページで「Einstein Setup」に移動し、「Turn on Einstein」トグルを有効化します。
- Agentforce Agents に移動し、「Agentforce」をオンにします。
- 次に、Coral Cloud をホストする「Experience Cloud サイト」を公開します。 設定で「すべてのサイト」を検索し、「Builder(for coral-cloud)」を選択して「Publish」をクリックし、「Confirm」をクリックします。
- Experience Builder メニューをクリック
- Salesforce Settings をクリック
- ブラウザを更新して設定を再読み込みします。Experience Site のブラウザタブは閉じてもOKです。
ステップ3: EinsteinServiceAgentユーザーとプロファイルを設定する
- 設定のクイック検索で「Users」を検索して選択
- EinsteinServiceAgent ユーザーの横にある編集をクリック
- プロファイルを「Einstein Agent User」に更新
- その他の設定はそのまま
- 「保存」をクリック
ステップ4: エージェントを作成し、外部接続をアタッチ
- 設定で「Agentforce Agents」を検索し、「新しいエージェント」をクリックします。
- 「Create with Gen AI」をクリック
- 概要、名前、役割、会社情報を入力します。Agent User = EinsteinServiceAgent Userと設定しましょう。
- 「Keep a record of conversations with enhanced event logs」にチェックを入れ、「Save」をクリックします。
- 「Create」をクリック
- 「Connections」を追加し、「Needs Setup」を選択して「External App」をクリック
- Connection Type = API を設定し、「Integratoin Name」に任意の名前を入力します。
- 「新しい接続アプリ」をクリック(次のステップで設定します)
ステップ5: Salesforce接続アプリを作成・設定する(クライアント認証情報)
- 接続アプリの作成を許可します。
- 「New Connected App」をクリックし、「Name」と「Admin Email」を入力
- 「Enable OAuth Settings」をオンにしてCallback URL: https://login.salesforce.com に設定しましょう。
- OAuth スコープは、以下をすべて追加してください。
- Access chatbot services (chatbot_api)
- Access the Salesforce API Platform (sfap_api)
- Manage user data via APIs (api)
- Perform requests at any time (refresh_token, offline_access)
- 以下の選択を解除してください。
- PKCE
- Require Secret for Web Server Flow
- Require Secret for Refresh Token Flow
- 以下を選択してください。
- Enable Client Credentials Flow
- Issue JWT-based access tokens for named users.
- Enable the Save option
- アプリの「Manage」ページで「Edit Policies」をクリック
- 「Permitted Users」は、自社のポリシーに合わせて設定してください。
- 「Client Credentials Flow」でRun As: choose a user with at least API Only access を選択します。
- 「JWT-based Access Tokens」を有効化し、Token Timeout: 30 minutesを設定して「保存」をクリックします。
- 最後に、「Agent Connection」に戻り、今作成したアプリを選択して「Save」をクリックします。
- 「App Manager」から「Consumer Key」と「Consumer Secret」を取得
- 作成したアプリを見つけて、「Manage Consumer Details」を表示します。
- 「Consumer Key」と「Consumer Secret」をコピー
ステップ6:連携に必要な残りのID を入手
- 「My Domain」: 設定でMy Domain に移動し、トークンリクエスト用の...my.salesforce.com URLをコピーします。
- 「AGENT_ID」: 「Agentforce Agents」でエージェントを開き、URL の末尾から18文字のID をコピー
ステップ7: Python プロジェクトをセットアップ
まずは、必要となるPython パッケージをインストールしていきます。
pip install requests asyncio langchain-mcp-adapters
次に、Connect AIおよびAgentforce への接続に必要となる「config.py」を作成します(プレースホルダーを実際の値に置き換えてください)。以下を定義します。
- 「MCP」: USERNAME、PAT、MCP_BASE_URL、およびMCP_AUTH = base64(username:pat)を計算
- 「Salesforce」: SFDC_DOMAIN、SFDC_CLIENT_ID、SFDC_CLIENT_SECRET、AGENT_ID
import base64 --- MCP (CData Connect AI) --- EMAIL = "[email protected]" PAT = "your_PAT" MCP_BASE_URL = "https://mcp.cloud.cdata.com/mcp" MCP_AUTH = base64.b64encode(f"{EMAIL}:{PAT}".encode()).decode() --- Salesforce Agentforce --- SFDC_DOMAIN = "https://your_domain.my.salesforce.com" SFDC_CLIENT_ID = "your_SFDC_CLIENT_ID" SFDC_CLIENT_SECRET = "your_SFDC_CLIENT_SECRET" AGENT_ID = "your_AGENT_ID"
連携を実行するためのPython スクリプト(フローと主要な関数)
以下に、Connect AI 経由でJSON とAgentforce を連携してAgentforce がJSON のデータを取得するPython スクリプトを用意しました。Python スクリプトは3つの内容で構成されています。
- Salesforce / Einstein Agent関数
- get_salesforce_token() - OAuth2トークンを取得
- start_agent_session() - エージェントセッションを開始
- post_message_to_agent() - エージェントにメッセージを送信
- MCP関数
- query_mcp() - カタログを取得し、MCPツールからサンプルクエリを実行
- 全体のオーケストレーション
- 「MCP関数」を呼び出し
- 「Salesforceトークン」を取得し、「エージェントセッション」を開始
- 「MCP結果」を推論のためにエージェントに送信
- 「エージェントの応答」を出力
スクリプトを実行するには、スクリプトが保存されているディレクトリでターミナルを開き、以下を実行します。
python agentforce_script.py
agentforce_script.py
import asyncio
import requests
import time
import uuid
from langchain_mcp_adapters.client import MultiServerMCPClient
from config import SFDC_DOMAIN, SFDC_CLIENT_ID, SFDC_CLIENT_SECRET, AGENT_ID, MCP_BASE_URL, MCP_AUTH
---------------- Salesforce / Einstein Agent ----------------
def get_salesforce_token():
"""クライアント認証情報を使用して新しいSalesforce OAuthトークンを取得します。"""
print(" 新しいSalesforceトークンをリクエスト中...")
token_url = f"{SFDC_DOMAIN}/services/oauth2/token"
data = {
"grant_type": "client_credentials",
"client_id": SFDC_CLIENT_ID,
"client_secret": SFDC_CLIENT_SECRET,
}
headers = {"Content-Type": "application/x-www-form-urlencoded"}
resp = requests.post(token_url, data=data, headers=headers)
resp.raise_for_status()
token_data = resp.json()
print(" アクセストークンを取得しました。")
return token_data["access_token"], token_data["instance_url"]
def start_agent_session(access_token):
"""Salesforce Einstein Agentとのセッションを開始します。"""
session_url = f"https://api.salesforce.com/einstein/ai-agent/v1/agents/{AGENT_ID}/sessions"
payload = {
"externalSessionKey": str(uuid.uuid4()),
"instanceConfig": {"endpoint": SFDC_DOMAIN},
"streamingCapabilities": {"chunkTypes": ["Text"]},
"bypassUser": True,
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {access_token}",
}
resp = requests.post(session_url, json=payload, headers=headers)
resp.raise_for_status()
session_data = resp.json()
print(f" エージェントセッションを開始しました: {session_data['sessionId']}")
return session_data["sessionId"]
def post_message_to_agent(access_token, session_id, message_text):
"""Salesforce Einstein Agentセッションにメッセージを送信します。"""
messages_url = f"https://api.salesforce.com/einstein/ai-agent/v1/sessions/{session_id}/messages"
payload = {
"message": {
"sequenceId": int(time.time() * 1000),
"type": "Text",
"text": message_text,
},
"variables": [],
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {access_token}",
}
resp = requests.post(messages_url, json=payload, headers=headers)
resp.raise_for_status()
return resp.json()
---------------- MCP部分 ----------------
async def query_mcp():
"""カタログとサンプルクエリをMCP Serverから取得します。"""
mcp_client = MultiServerMCPClient(
connections={
"default": {
"transport": "streamable_http",
"url": MCP_BASE_URL,
"headers": {"Authorization": f"Basic {MCP_AUTH}"},
}
}
)
tools = await mcp_client.get_tools()
print("検出されたMCPツール:", [t.name for t in tools])
# カタログのリスト取得
get_catalogs_tool = next(t for t in tools if t.name == "getCatalogs")
catalogs = await get_catalogs_tool.ainvoke({})
print("カタログ:", catalogs)
# サンプルクエリの実行
query_tool = next(t for t in tools if t.name == "queryData")
query_result = await query_tool.ainvoke({
"query": "SELECT * FROM [JSON].[PUBLIC].[EMPLOYEES] LIMIT 5"
})
print("クエリ結果:", query_result)
return catalogs, query_result
---------------- メイン ----------------
async def main():
# ステップ1: MCP
catalogs, query_result = await query_mcp()
# ステップ2: Salesforceトークンとエージェント
access_token, _ = get_salesforce_token()
session_id = start_agent_session(access_token)
# ステップ3: MCP結果を指示と共にエージェントに送信
context_message = (
f"あなたは親切なアシスタントです。\n"
f"以下のMCPデータが取得されました:\n\n"
f"カタログ: {catalogs}\n"
f"クエリ結果: {query_result}\n\n"
f"このデータに基づいてユーザーの質問に答えてください: "
f"利用可能なすべてのカタログをリストし、クエリ結果を要約してください。"
)
response = post_message_to_agent(access_token, session_id, context_message)
print("\n エージェントの応答:")
print(response)
if name == "main":
asyncio.run(main())
サンプル出力
Salesforce Agentforce でデータ駆動型エージェントを構築
Agentforce を使用すると、AI エージェントをオーケストレーションしてCRM ワークフローを自動化できます。CData Connect AI とリモートMCP Server によるリアルタイムデータ接続を活用すれば、エージェントはCRM、ERP、データベース、財務プラットフォームなど、スタック全体のリアルタイムでコンテキストに沿ったデータを活用して動作できます。
Connect AI は14日間の無償トライアルがご利用いただけます。今すぐサインアップ、Agentforce を数百種類の外部システムに接続してみましょう!