Claude CodeからMCPでSalesforceを操作してみた話

今回やること:Claude CodeからMCPでSalesforceを操作する
Claude Codeを使って、SalesforceへMCP(Model Context Protocol)経由で実際に接続し、レコードを操作してみます。
MCPとはAIエージェントとAPIを繋ぐ、共通の接続規格のようなものです。
AIエージェントが普及してきた今、AIエージェントがシステムを操作することが当たり前になってきました。
ユーザとの対話から、AIエージェントが自らどう処理すべきか判断し、MCPで定義された操作を呼び出して実行します。MCPは対応するAIエージェントとツールならどんな組み合わせでもそのまま繋がるようにします。

「AIエージェントにSalesforce組織を直接触らせる」と聞くと身構えてしまうかもしれませんが、Claude Code側にも接続先を絞ったり、操作ごとに許可を管理したりする仕組みが用意されています。この記事では、接続までの手順とClaude Codeの許可設定の例を紹介します。
なお、この検証は前回の記事で用意した実行環境の上で行っています。前回の記事では、Claude Codeが作業する場所を、普段使っているWindows環境から切り離した実行環境(WSL2 + SSH)を用意しました。
前回記事:Claude CodeでSalesforceを操作する前に整えた安全な実行環境ーWSL2 + VS Code(SSH)でローカルから隔離する
この記事で得られること
- Claude CodeをインストールしてSalesforceのHosted MCPサーバーに接続するまでの手順が分かります
- Hosted MCP経由で実際にどんな操作ができるのか・MCPの種類(一部)が分かります
想定読者
- Salesforceを業務で使用している方
- Salesforceの運用・開発にかかわる方(エンジニア含む)
- 業務・開発へのAIエージェント導入に関心がある方
- AIエージェントに不安をお持ちの方
開発環境
- WSL2(Ubuntu)
- VS Code(前回のRemote-SSHで接続した状態)
Claude Codeをインストールする
前回用意したWSL2環境にSSH接続した状態から始めます。
1. sandboxを使用するためのbubblewrap(とsocat)をインストールする
Ubuntu側のターミナルで、bubblewrapをインストールします。
sudo apt install bubblewrap socat2. Claude Code CLIをインストールする
Ubuntu側のターミナルで、公式のインストールスクリプトを実行します。
curl -fsSL https://claude.ai/install.sh | bash3. VS Code拡張機能をインストールし、ログインする
VS Codeの拡張機能タブを開き、検索で「Claude」を入力し、
「Claude Code for VS Code」をインストールします。

拡張機能をインストールすると、画面左側のアクティビティバーにClaude Codeのアイコンが追加されます。バー内のNew Sessionを押すか、エディタ右上のアイコンを押すとパネルが開きます。

ログイン方法を選ぶ画面が表示されるので、「Claude.ai Subscription」ボタンを押します(ClaudeのPro/Team/Enterpriseサブスクリプションでログインする場合)。

続けてVS Codeから「Codeで外部のWebサイトを開きますか?」という確認ダイアログが表示されるので、「開く(O)」を押してブラウザを開きます。

ブラウザでClaude.aiのログイン画面が表示されるので、GoogleアカウントまたはメールアドレスでログインしClaude.aiアカウントにアクセスします。

ログインすると「Claude CodeさんがClaude chat accountへの接続を希望しています」という確認画面が表示されるので、「承認する」を押します。

ブラウザのタブを閉じてVS Codeに戻ると、ログインが完了しClaude Codeが使える状態になっています。
Salesforce Hosted MCP
Claude CodeからSalesforceを操作する方法はいくつかありますが、今回使ったのはSalesforceが提供するHosted MCP Serverという仕組みです。MCPサーバーそのものをSalesforce側がホスティングしてくれるため、自分でサーバーを用意する必要がありません。
Salesforce組織側の設定
本番で使っているSalesforce組織にAIエージェントを直接つなぐことは推奨しません。試す場合は、Developer Edition組織やSandbox環境を使うことをお勧めします。
Hosted MCPを使うには、まずSalesforce組織側で「外部クライアントアプリケーション(External Client Application)」を作成し、OAuthのクライアントID・シークレットを発行します。あわせて、MCP Serverを有効にする設定も必要です。
1. MCPサーバーを有効にする
Salesforceの設定画面左上の検索欄に「MCP」と入力し、「MCP サーバー」を選びます。「Salesforce サーバー」タブに、MCPサーバーが一覧表示されます。今回はレコードの参照・作成・更新・削除・検索が一通りできる「sobject-all」を使うので、選んで「有効化」ボタンを押します。


2. 外部クライアントアプリケーションを作成する
設定の検索欄に「外部クライアント」と入力し、「外部クライアントアプリケーションマネージャー」を開きます。右上の「新規外部クライアントアプリケーション」ボタンを押します。

外部クライアントアプリケーション名(例:Hosted MCP)・API参照名・取引先責任者メールを入力し、「作成」ボタンを押します。

3. OAuth設定を行う
「API(OAuth設定の有効化)」を開き、「OAuthを有効化」にチェックを入れます。
コールバックURLの欄に次の2行を改行して入力します。
https://claude.ai/api/mcp/auth_callback
http://localhost:38000/callback1行目はclaude.ai側で認証を仲介する場合のコールバック、2行目は後述するclaude mcp addコマンドで、自組織のクライアントID・シークレットを使って直接接続する場合に使うコールバックです。今回は自分たちで作成したクライアントID・シークレットを使ってClaude Codeから直接接続するため、2行目のポート番号(38000)は後述の接続コマンドで指定するポートと一致させる必要があります。
「OAuth範囲」の一覧に以下を追加します。

「セキュリティ」項目を設定します。以下2点にチェックを入れてください。

4. クライアントID・シークレットを取得する
作成したアプリケーションの「設定」タブを開きます。


別タブでコンシューマー鍵(クライアントID)とコンシューマーの秘密(クライアントシークレット)が表示されるので、それぞれ「コピー」ボタンで控えておきます。

Claude Code側から接続する
接続する前に、フォルダ構成について1点説明します。今回の環境は、次のような構成になっています。
/home/ユーザー名/ ← ホームディレクトリ
└── projects/ ← 作業用フォルダをまとめる場所
└── test/ ← 今回VS Codeで開いているフォルダ
└── .claude/
└── settings.json/home/<ユーザー名>/projects/の下に作業内容ごとにフォルダを分け、その都度VS Codeで1つのフォルダを開いて作業しています。このあと実行するclaude mcp addは、いま開いているプロジェクトごとの接続設定です。複数のプロジェクトで同じ接続を使い回したい場合は、claude mcp addに--scope userを付けて登録することで可能になるようです。
発行したクライアントID・シークレットを使い、VS Codeのターミナルで以下のコマンドを実行します。
claude mcp add --transport http sf-sobject https://api.salesforce.com/platform/mcp/v1/platform/sobject-all --callback-port 38000 --client-id "<クライアントID>" --client-secret
チャット欄に/mcpと入力して、「MCP servers」を押してください。

sf-sobjectの「Needs Auth」を押してください。

「Authenticate」を選ぶとブラウザが開き、Salesforceへのログイン・認可画面が表示されます。完了すると以下成功画面になります。

認可が完了すると、サーバーの状態が「Connected」に変わり、利用できるツールの数も確認できます。

Hosted MCPの種類
Hosted MCPには、用途ごとに複数のtoolset(接続先サーバーの種類)が用意されています。今回使ったのは、レコードの参照・作成・更新・削除・検索が一通りできる「SObject All」です。
SObject Servers
| 種類 | できること |
|---|---|
| SObject All | 参照・作成・更新・削除・検索(今回使用) |
| SObject Reads | 参照・検索のみ |
| SObject Mutations | 作成・更新のみ |
| SObject Deletes | 削除のみ |
Product-Specific Servers
| 種類 | できること |
|---|---|
| Data 360 | Data 360上の統合顧客データにクエリを実行する |
| Headless 360 (Beta) | Discover・Describe・DispatchなどのツールでSalesforceのSetup・プラットフォーム機能全般にアクセスする |
| Tableau Next | セマンティックモデルの探索、KPIのクエリ、分析の実行を行う |
実際に動かしてみる
接続ができたので、実際にSalesforceのレコードを参照・作成してみます。
事前にSalesforce側には、取引先「テスト株式会社」のレコードを用意してあります。

参照してみる
Claude Codeに、次のように話しかけてみます。
Salesforceの取引先レコードを取得して。取引先名が「テスト株式会社」Claude Codeはsf-sobjectのsoqlQueryツールを呼び出し、事前確認を挟むことなく結果を返しました。

参照系の操作は、あらかじめ許可リストに入れておいたため、都度の確認なしでそのまま実行されています(許可リストの中身は次の章で説明します)。
作成してみる
続けて、レコードを新規作成するよう指示します。
テスト株式会社のレコードをコピーして取引先レコードを作成して。まず、新しいレコードの名前をどうするか、Claude Code自身が確認してきました。

名前を選ぶと、今度は実際にレコードを作成する直前で、確認プロンプトが表示されました。作成・更新・削除の動作の際は都度確認を挟むよう設定しています。(許可リストの中身は次の章で説明します)。

「Yes」を選ぶとレコードが作成され、Salesforce側でも新しい取引先「テスト株式会社(コピー)」が増えていることを確認できました。

参照は確認なしで即座に実行され、書き込みを伴う作成には必ず一呼吸置く確認が入る、という挙動の違いが実際に確認できました。この確認プロンプトがどういう設定で成り立っているかは、次の章で説明します。
事前に設定していた許可リスト
Claude CodeからSalesforceを安全に操作するため、あらかじめ許可設定(permissions)とSandboxの設定をしておきました。参照系の操作は自動承認、作成・更新・削除は実行前に確認を求める、という方針です。
※設定の一例です。一部ユーザ名を含むため、書き換えが必要です。
{
"sandbox": {
"enabled": true,
"allowUnsandboxedCommands": false,
"filesystem": {
"denyRead": ["~/"],
"allowRead": ["."]
},
"credentials": {
"files": [
{ "path": "~/.ssh", "mode": "deny" },
{ "path": "~/.aws/credentials", "mode": "deny" }
]
}
},
"permissions": {
"allow": [
"mcp__sf-sobject__soqlQuery",
"mcp__sf-sobject__find",
"mcp__sf-sobject__getObjectSchema",
"mcp__sf-sobject__getRelatedRecords",
"mcp__sf-sobject__listRecentSobjectRecords",
"mcp__sf-sobject__getUserInfo"
],
"ask": [
"mcp__sf-sobject__createSobjectRecord",
"mcp__sf-sobject__updateSobjectRecord",
"mcp__sf-sobject__updateRelatedRecord",
"mcp__sf-sobject__deleteSobjectRecord",
"mcp__sf-sobject__deleteRelatedRecord"
],
"deny": [
"Bash(sf data query:*)",
"Bash(sf data get record:*)",
"Bash(sf data search:*)",
"Bash(sf data create record:*)",
"Bash(sf data update record:*)",
"Bash(sf data delete record:*)",
"Bash(sf data upsert record:*)",
"Edit(//home/<ユーザー名>/.claude/settings.json)",
"Edit(/.claude/settings.json)"
]
}
}参照系のツール(soqlQueryなど)はallowに入れて自動承認、作成・更新・削除系のツールはaskに入れて実行前に確認、という振り分けにしています。またdenyにあるBash(sf data ...)は、MCPの確認をBash経由のsfコマンドで迂回されないようにするための備えです。
この設定は、プロジェクトフォルダ配下に.claudeフォルダを作り、その中にsettings.jsonファイルとして置きます。
まとめ
今回は、次のことを行いました。
- WSL2(Linux)にClaude Codeをインストールした
- Salesforce組織側でHosted MCPを有効にし、Claude Codeから接続した
- MCPでレコードの参照・作成を試した
- 参照は自動承認・作成は事前確認というClaude Codeの制御設定の違いを確認した
今回あらためて感じたのは、MCPを使うと外部システムと連携するためのプログラムを自分で書かずに済む、ということです。これまでならAPIを呼び出すコードを組むのが基本でした。ですが今回は接続の設定をして日本語で指示しただけで済みました。しかもこの接続の仕組みは、MCPに対応していれば他のAIからも同じように使えます。
自然言語で話しかけるだけでSalesforceを操作できるのは、便利だと感じました。今回は参照・作成にとどめましたが、取得したデータをもとにAIエージェントに推論させるといった応用も期待できそうです。
Salesforceの内製化支援に関するご相談をお待ちしております。
















