【徹底解説】Agentforce とNetSuite のデータをMCP Server で簡単連携

加藤龍彦
加藤龍彦
デジタルマーケティング
CData Connect AI のリモートMCP Serverを活用して、Agentforce がNetSuite のデータを安全に読み取り、アクションを実行できるようにする方法を解説します。

Agentforce は、エンタープライズチーム向けに設計されたAI プラットフォームです。宣言的なツールとAPI ファーストなアーキテクチャで、アシスタントの構成やCRM ベースのワークフロー自動化を簡単に実現できます。

しかし、エージェントがNetSuite 以外のデータを扱う必要がある場合、多くの実装では定期的な同期や独自のミドルウェアを使用して外部システムをローカルデータベースに複製しています。この方法では、複雑性の増加、ガバナンスとメンテナンスのオーバーヘッド、同期の遅延が発生し、エージェントのリアルタイム性能が制限されてしまいます。

CData Connect AIは、300以上のビジネスアプリケーション、データベース、ERP、会計ツールへのリアルタイムアクセスを提供することで、このギャップを埋めます。CData のリモートMCP Serverを使用することで、Agentforce エージェントは実行時に最新のコンテキストに沿ったデータをセキュアに読み書きし、アクションを実行できます。そのため、より少ない構成要素で、より強力な制御のもと、根拠に基づいた応答、リアルタイムの意思決定、システム間の自動化を実現できます。

本記事では、Connect AI でNetSuite への接続を設定し、MCP Server をAgentforce に登録し、NetSuite データをクエリするワークフローを構築するために必要な手順を説明します。

NetSuite データ連携について

CData は、Oracle NetSuite のライブデータにアクセスし、統合するための最も簡単な方法を提供します。お客様は CData の接続機能を以下の目的で使用しています:

  • Standard、CRM、OneWorld を含む、すべてのエディションの NetSuite にアクセスできます。
  • SuiteTalk API(SOAP ベース)のすべてのバージョンと、SQL のように機能し、より簡単なデータクエリと操作を可能にする SuiteQL に接続できます。
  • Saved Searches のサポートにより、事前定義されたレポートとカスタムレポートにアクセスできます。
  • トークンベースおよび OAuth 2.0 で安全に認証でき、あらゆるユースケースで互換性とセキュリティを確保します。
  • SQL ストアドプロシージャを使用して、ファイルのアップロード・ダウンロード、レコードや関連付けのアタッチ・デタッチ、ロールの取得、追加のテーブルやカラム情報の取得、ジョブ結果の取得などの機能的なアクションを実行できます。

お客様は、Power BI や Excel などのお気に入りの分析ツールからライブ NetSuite データにアクセスするために CData ソリューションを使用しています。また、CData Sync を直接使用するか、Azure Data Factory などの他のアプリケーションとの CData の互換性を活用して、NetSuite データを包括的なデータベースやデータウェアハウスに統合しています。CData は、Oracle NetSuite のお客様が NetSuite からデータを取得し、NetSuite にデータをプッシュするアプリを簡単に作成できるよう支援し、他のソースからのデータを NetSuite と統合することを可能にしています。

当社の Oracle NetSuite ソリューションの詳細については、ブログをご覧ください:Drivers in Focus Part 2: Replicating and Consolidating ... NetSuite Accounting Data


はじめに


前提条件:

  • CData Connect AI アカウント
  • Python 3.9 以上のインストール
  • Agentforce が有効化されたNetSuite アカウントと、接続アプリの作成/管理権限

必要な認証情報のチェックリスト

開始する前に、以下の認証情報を準備してください。

CData Connect AI MCP

  1. 「USERNAME」: アカウントのメールアドレス
  2. 「PAT:」 Connect AIの「Settings」から「アクセストークン」をクリック(一度だけコピー可能)
  3. 「MCP_BASE_URL: 」https://mcp.cloud.cdata.com/mcp
  4. 「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 連携用のNetSuite への接続を設定

それでは、Agentforce からCData Connect AI のリモートMCP 経由でNetSuite への接続を設定していきましょう。Agentforce からNetSuite を操作するには、まずCData Connect AI でNetSuite へのコネクションを作成し、設定します。

  1. Connect AI にログインして「Sources」をクリック。次に「Add Connection」をクリックします。
  2. 一覧から「NetSuite」を選択します。
  3. NetSuite に接続するために必要な認証プロパティを入力します。

    NetSuiteへの接続

    NetSuite では、2種類のAPI でデータにアクセスできます。どちらのAPI を使用するかは、Schema 接続プロパティで以下のいずれかを選択して指定してください。

    • SuiteTalk は、NetSuite との通信に使用されるSOAP ベースの従来から提供されているサービスです。幅広いエンティティをサポートし、INSERT / UPDATE / DELETE の操作も対応しています。ただし、SuiteQL API と比べるとデータの取得速度が劣ります。また、サーバーサイドでのJOIN に対応していないため、これらの処理はCData 製品がクライアントサイドで実行します。
    • SuiteQL は、より新しいAPI です。JOIN、GROUP BY、集計、カラムフィルタリングをサーバーサイドで処理できるため、SuiteTalk よりもはるかに高速にデータを取得できます。ただし、NetSuite データへのアクセスは読み取り専用となります。

    データの取得のみが目的でしたらSuiteQL をお勧めします。データの取得と変更の両方が必要な場合は、SuiteTalk をお選びください。

    NetSuite への認証

    CData 製品では、以下の認証方式がご利用いただけます。

    • トークンベース認証(TBA)はOAuth1.0に似た仕組みです。2020.2以降のSuiteTalk とSuiteQL の両方で利用できます。
    • OAuth 2.0 認証(OAuth 2.0 認可コードグラントフロー)は、SuiteQL でのみご利用いただけます。
    • OAuth JWT 認証は、OAuth2.0 クライアント認証フローの一つで、クライアント認証情報を含むJWT を使用してNetSuite データへのアクセスを要求します。

    トークンベース認証(OAuth1.0)

    トークンベース認証(TBA)は、基本的にOAuth 1.0 の仕組みです。この認証方式はSuiteTalk とSuiteQL の両方でサポートされています。管理者権限をお持ちの方がNetSuite UI 内でOAuthClientId、OAuthClientSecret、OAuthAccessToken、OAuthAccessTokenSecret を直接作成することで設定できます。 NetSuite UI でのトークン作成手順については、ヘルプドキュメントの「はじめに」セクションをご参照ください。

    アクセストークンを作成したら、以下の接続プロパティを設定して接続してみましょう。

    • AuthScheme = Token
    • AccountId = 接続先のアカウント
    • OAuthClientId = アプリケーション作成時に表示されるコンシューマーキー
    • OAuthClientSecret = アプリケーション作成時に表示されるコンシューマーシークレット
    • OAuthAccessToken = アクセストークン作成時のトークンID
    • OAuthAccessTokenSecret = アクセストークン作成時のトークンシークレット

    その他の認証方法については、ヘルプドキュメントの「はじめに」をご確認ください。

  4. Save & Test」をクリック。
  5. NetSuite ページの「Permissions」タブに移動し、ユーザーごとの権限を更新します。

パーソナルアクセストークンの追加

パーソナルアクセストークン(PAT)は、Agentforce からConnect AI への接続を認証するために使用されます。アクセスの粒度を維持するため、サービスごとに個別のPAT を作成するのがベストプラクティスです。

  1. Connect AI アプリの右上にある歯車アイコン()をクリックして、設定ページを開きます。
  2. 設定ページで、アクセストークンセクションに移動し、PATを作成をクリックします。
  3. PATに名前を付けて、作成をクリックします。
  4. パーソナルアクセストークンは作成時のみ表示されるため、必ずコピーして安全に保管してください。

接続が設定され、PAT が生成されたので、Agentforce からSalesforce に接続する準備が整いました。

ステップ2: Agentforce を有効化し、Experience Cloud サイトを公開

  1. Salesforce の設定ページで「Einstein Setup」に移動し、「Turn on Einstein」トグルを有効化します。
  2. Agentforce Agents に移動し、「Agentforce」をオンにします。
  3. 次に、Coral Cloud をホストする「Experience Cloud サイト」を公開します。 設定で「すべてのサイト」を検索し、「Builder(for coral-cloud)」を選択して「Publish」をクリックし、「Confirm」をクリックします。
  4. Experience Builder メニューをクリック
  5. Salesforce Settings をクリック
  6. ブラウザを更新して設定を再読み込みします。Experience Site のブラウザタブは閉じてもOKです。

ステップ3: EinsteinServiceAgentユーザーとプロファイルを設定する

  1. 設定のクイック検索で「Users」を検索して選択
  2. EinsteinServiceAgent ユーザーの横にある編集をクリック
  3. プロファイルを「Einstein Agent User」に更新
  4. その他の設定はそのまま
  5. 「保存」をクリック

ステップ4: エージェントを作成し、外部接続をアタッチ

  1. 設定で「Agentforce Agents」を検索し、「新しいエージェント」をクリックします。
  2. 「Create with Gen AI」をクリック
  3. 概要、名前、役割、会社情報を入力します。Agent User = EinsteinServiceAgent Userと設定しましょう。
  4. 「Keep a record of conversations with enhanced event logs」にチェックを入れ、「Save」をクリックします。
  5. 「Create」をクリック
  6. 「Connections」を追加し、「Needs Setup」を選択して「External App」をクリック
  7. Connection Type = API を設定し、「Integratoin Name」に任意の名前を入力します。
  8. 「新しい接続アプリ」をクリック(次のステップで設定します)

ステップ5: Salesforce接続アプリを作成・設定する(クライアント認証情報)

  1. 接続アプリの作成を許可します。
  2. 「New Connected App」をクリックし、「Name」と「Admin Email」を入力
  3. 「Enable OAuth Settings」をオンにしてCallback URL: https://login.salesforce.com に設定しましょう。
  4. 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)
  5. 以下の選択を解除してください。
    • PKCE
    • Require Secret for Web Server Flow
    • Require Secret for Refresh Token Flow
  6. 以下を選択してください。
    • Enable Client Credentials Flow
    • Issue JWT-based access tokens for named users.
    • Enable the Save option
  7. アプリの「Manage」ページで「Edit Policies」をクリック
  8. 「Permitted Users」は、自社のポリシーに合わせて設定してください。
    • 「Client Credentials Flow」でRun As: choose a user with at least API Only access を選択します。
    • 「JWT-based Access Tokens」を有効化し、Token Timeout: 30 minutesを設定して「保存」をクリックします。
  9. 最後に、「Agent Connection」に戻り、今作成したアプリを選択して「Save」をクリックします。
  10. 「App Manager」から「Consumer Key」と「Consumer Secret」を取得
  11. 作成したアプリを見つけて、「Manage Consumer Details」を表示します。
  12. 「Consumer Key」と「Consumer Secret」をコピー

ステップ6:連携に必要な残りのID を入手

  1. 「My Domain」: 設定でMy Domain に移動し、トークンリクエスト用の...my.salesforce.com URLをコピーします。
  2. 「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 経由でNetSuite とAgentforce を連携してAgentforce がNetSuite のデータを取得するPython スクリプトを用意しました。Python スクリプトは3つの内容で構成されています。

  1. Salesforce / Einstein Agent関数
    • get_salesforce_token() - OAuth2トークンを取得
    • start_agent_session() - エージェントセッションを開始
    • post_message_to_agent() - エージェントにメッセージを送信
  2. MCP関数
    • query_mcp() - カタログを取得し、MCPツールからサンプルクエリを実行
  3. 全体のオーケストレーション
    • 「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 [NetSuite].[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 を300以上の外部システムに接続してみましょう!

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

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

無料トライアル お問い合わせ