3行でいうと

  • ツールの種類は、公式のdocsでは、Client Tools、Webhook tools、Code Tools、MCP Tools、System Toolsです。Webhookツールは、エージェントの設定の「Agent」の節で、「Add Tool」から種類に「Webhook」を選んで作ります。
  • 外のMCPサーバー(Zapier MCPなど)は、「Add Custom MCP Server」から、名前、説明、サーバーURL、(任意で)秘密のトークンとヘッダを入れて足します。承認のモードは「Always Ask」「Fine-Grained Tool Approval」「No Approval」で、公式は「Always Ask」を recommended と書いています。MCPは、初期ではワークスペースで無効で、Zero Retention ModeとHIPAAでは使えません。
  • 他社のLLMは、公式のdocsが、Google、OpenAI、Anthropicのモデルを挙げています。自前のLLMは、OpenAIのチャット補完(/v1/chat/completions)か、Responses API(/v1/responses)と同じ形のサーバーを用意し、Server-Sent Eventsで返す必要があります。リアルタイム用のモデルとは組み合わせられません。
  • 通話のあとの結果は、「post-call webhook」で自分のサーバーに送れます。ヘッダ ElevenLabs-Signature で署名を確かめられます。10回以上続けて失敗し、直近の成功が7日より前だと、自動で無効になります。
  • ウェブサイトに置くウィジェットは、認証を無効にした公開のエージェントが必要です。許可するドメインは「Security」のタブの「Allowlist」で決めます。

この記事は、公式の資料を2026年10月25日に読んでまとめたものです。この記事は、実際に使って確かめた記録ではありません。

手順は「公式の手順を順に並べたもの」です。コマンドと設定のうち、公式のページに書かれていたものは「公式の例の写し」と書き、この記事で組んだ例は「この記事の例」と書きます。システムへ権限やシークレットを登録する操作は、原文を公式ページで見て写してください。公式に書かれていない画面の経路、ボタンの表記、初期値は書かず、「公式で確認できていない」と書きます。画面の表記は変わるので、手元の画面と照らして読んでください。

先に結論

前提:用語をそろえる

たとえ話:窓口の係と、持たせる名刺

音声エージェントを窓口の係だと考えてみます。Webhookツールは、係に渡す「外線の電話番号表」で、番号と話す内容を決めて渡します。MCPサーバーは、係が使える「道具箱」です。道具の使用に上司の承認を必須にするか、読むだけの道具は自動にするか、決められます。LLMは、係の「頭脳」で、どの頭脳を使うかで、会話の内容が出ていく先が変わります。これは僕らのたとえで、公式の表現ではありません。

連携1:Webhookツール × 自分のAPI

作る手順(公式のdocs、Webhook tools)

  1. エージェントの設定を開き、「Agent」の節に進む。
  2. 「Add Tool」を選び、Tool Typeに「Webhook」を選ぶ。
  3. 「Name」「Description」「Method」「URL」を入れる。
  4. パス、クエリ、ボディのパラメータ、ヘッダ、認証、ダイナミック変数への代入を、必要に応じて足す。

別のページ(Client tools)は、「エージェントのダッシュボードで『Tools』を開き『Add Tool』を押す」と書いています。画面の呼び方が少し違うので、手元の画面で確かめてください。

項目(公式の表より)

項目 公式の説明
Name ツールの名前。LLMが、いつ呼ぶかを決める手がかりになる。略語は避ける
Description ツールの目的。LLMが、いつ呼ぶかを知るための説明
Method HTTPのメソッド(例 GET)
URL 呼び先。パスのパラメータは、波かっこで囲む(例 /api/resource/{id})
Authentication カスタムヘッダか、認証の接続
Headers 毎回のリクエストに付けるヘッダ
Path/Query/Body parameters URLのパス、クエリ、ボディに入れる値。ダッシュボードでは値の種類が「LLM Prompt」で、会話から、アシスタントが作る
Content Type JSON(初期、application/json)か、URLエンコード(application/x-www-form-urlencoded)。POST、PUT、PATCHでボディがあるときだけ
Dynamic variable assignment ツールの応答の値を、あとの会話で使う変数に保存する

公式は、複雑なツールでは、引数ごとに説明を書き、日付はYYYY-mm-ddのように形式をそろえるとよい、と書いています。

認証(公式のdocs)

認証の方式は、「Workspace Auth Connections」(「Agent」の節の「Add Auth」)で作ってから、ツールに結びつけます。

APIキーが要る場合は、ヘッダで渡し、シークレットに保存する、と書かれています。

公式の例(天気のツール)

公式は、tool_configs/get_weather.json として、次の形の設定を示しています(type は webhook、name、description、api_schema に url、method、path_params_schema)。要点だけ書きます。全文は公式ページで確認してください。

elevenlabs tools add "get_weather" --type "webhook" --config-path ./tool_configs/get_weather.json
elevenlabs agents push --agent "<agent-name>"

渡るデータ・外し方・確認点

連携2:Clientツール × 自分のアプリ

公式のdocs(Client tools)の記載です。

連携3:外のMCPサーバー × エージェント(Zapierを含む)

事前:ワークスペースで有効にする(公式のdocs、MCP)

足す手順(公式のdocs)

  1. 「MCP server integrations」のダッシュボードで、「Add Custom MCP Server」をクリックする。
  2. 次の項目を入れる。
  3. Name
  4. Description
  5. Server URL:URLに秘密のキーが含まれる場合は、ワークスペースのシークレットとして保存する。
  6. Secret Token(任意):認証のヘッダの値。
  7. HTTP Headers(任意):サーバーが必要とする追加のヘッダ。
  8. 「Add Integration」をクリックする。サーバーを保存して接続を試し、使えるツールの一覧が出る。
  9. サーバーを、エージェントに結びつける。公開のエージェントにも、非公開にも対応している。

APIでは、mcp_servers.create(TypeScriptは mcpServers.create)で、url、name、description、approval_policy、transport を持つ設定を渡し、そのサーバーのIDを、エージェントの設定の agent.prompt.mcp_server_ids に入れます。公式の例は approval_policy: "always_ask"、transport: "SSE" です。ストリーミング可能なHTTPのAPI上の値は、ページに書かれていませんでした。

対応する通信方式は、SSEと、HTTPのストリーミングです。

承認のモード(公式のdocsとセキュリティのページ)

モード 内容
Always Ask ツールを使う前に、毎回、許可を求める。公式が「recommended」と書く
Fine-Grained Tool Approval ツールごとに、自動で承認、承認が必要、無効、の3つから選ぶ
No Approval 聞かずに、どのツールも使える。公式は、十分に確かめた、信頼できるサーバーに限る、と書く

公式は、読むだけで低リスクのツールは自動承認、データを変えたり、機微な操作をするものは承認が必要、不要やリスクのあるものは無効、という使い分けの例を書いています。新しい連携は「Always Ask」で始め、十分に試してからゆるめる、とも書かれています。

Zapier(公式のZapierのページ)

公式の「Connect Zapier to ElevenLabs Conversational AI Voice Agents」のページは、Zapierを、7,000以上のアプリへの、1つのMCPのエンドポイントとして説明しています。手順の見出しは次の4つです。

  1. 「Generate Zapier MCP endpoint URL」
  2. 「Configure permitted actions and permissions」
  3. 「Add MCP server URL to ElevenLabs dashboard」
  4. 「Test integration with sample workflows」

読んだページでは、各見出しの本文が、上の見出しとは別の内容(予約の確認や、get_available_slots、book_meeting というツールの使い方)に見える書き方で、Zapier側の画面の操作は読み取れませんでした。ZapierのMCPのエンドポイントを作る操作は、Zapier社のドキュメントを見る必要があります(読んでいません)。ElevenLabs側は、上の「Add Custom MCP Server」の手順に、Zapierが発行したURLを入れる形になる、と読めます(この記事の読み取りで、ページの明記ではありません)。

ページが挙げるセキュリティ面の記載は、トークンによる認証、HTTPSの暗号化、細かい権限の制御、許可する操作を決められること、影響の大きい操作の前の確認、自動の操作の監査の記録です。データの保存場所と保持期間は、ページには書かれていません。ページに載っている項目として、設定の時間は10〜15分、難しさは「Intermediate」、種類は「MCP」とあります。

渡るデータ・外し方

使えない場合

連携4:他社LLM × エージェント

公式のdocs(LLM)の記載です。

連携5:自前のLLM × エージェント

公式のdocs(Integrate your own model)の記載です。

条件

方法1:自分のOpenAIのキーを使う(公式の手順)

  1. エージェントの設定で、LLMのドロップダウンから「Custom LLM」を選ぶ。
  2. 「server URL」と「Model ID」を入れる。
  3. 「API key」で「Create new secret」を選び、名前を OPENAI_API_KEY にして、キーの値を入れ、「Add secret」を押す。
  4. LLMのモーダルを閉じて、「Publish」を押す。

方法2:自前のサーバー(公式の手順)

  1. 上のエンドポイントを実装するサーバーを作る。
  2. 公開する。公式の例は、ngrok http --url=<Your url>.ngrok.app 8013 です(公式の例の写し)。
  3. エージェントのLLMの設定で、サーバーURLに、その公開のエンドポイントを指す。
  4. 「Limit token usage」を設定する(公式の例は5000)。
  5. 公開して、試す。

ストリームの形(公式の記載)

追加のパラメータ

Python SDKでは、ConversationInitiationData を通じて extra_body を渡せます。サーバーには、リクエストの elevenlabs_extra_body として届きます。上流のモデルに送る前に、この項目を取り除く、と書かれています。

渡るデータ・外し方・確認点

連携6:通話後のWebhook × 自分のサーバー

公式のdocs(Post-call webhooks)の記載です。

設定

  1. ElevenAgentsの設定のページ(https://elevenlabs.io/app/agents/settings)で、post-call webhookを有効にする。ワークスペースのすべてのエージェントに適用される。
  2. webhookを作ると、共有のシークレットが生成される。保存する。
  3. 「Send audio data」のトグルで、音声のwebhookを送るかを決める。ワークスペース単位か、エージェント単位で設定できる。
  4. 自分のエンドポイントは、200 を返す。そうでなければ失敗と数えられる。

イベントの種類

type 内容
post_call_transcription 会話の全体:書き起こし、分析、メタデータ
post_call_audio agent_id、conversation_id、full_audio(base64のMP3)のみ
call_initiation_failure agent_id、conversation_id、failure_reason、metadata

書き起こしの data について、公式の例には agent_id、conversation_id、status、user_id、transcript、metadata、analysis、conversation_initiation_client_data が出てきます。ページの項目表には agent_name、version_id も挙がっています。branch_id と environment は、例では conversation_initiation_client_data の中に null として出てきます。失敗の理由は busy、no-answer、unknown です。

署名の確認

再試行と自動の無効化

渡るデータ

書き起こしの全体、分析(要約、通話の成功を含む)、メタデータ(時間、費用、電話の情報)、ダイナミック変数が、自分のサーバーへ送られます。音声のwebhookは、会話IDとエージェントIDと音声だけです。外し方(webhookの無効化の画面)は、読んだページには、記載がありません。

連携7:ウィジェット × Webページ

公式のdocs(Widget customization)の記載です。

  1. サイト全体で使うなら、index.html の <body> に、次のスニペットを置く(公式の例の写し。agent-id は自分のもの)。
<elevenlabs-convai agent-id="agent-id"></elevenlabs-convai>
<script src="https://unpkg.com/@elevenlabs/convai-widget-embed" async type="text/javascript"></script>
  1. 認証:「ウィジェットは、認証を無効にした公開のエージェントが必要」と書かれています。エージェントの「Advanced」のタブで切り替えます。
  2. 許可するドメイン:エージェントの「Security」のタブの「Allowlist」で、使えるホストを決める。
  3. 見た目、アバター、文言、言語:エージェントの「Widget」のタブ。
  4. 入力のモード(音声のみ、音声とテキスト、チャット):「Channels」→「Widget」→「Interface」。

属性として、agent-id(必須)、signed-url、variant、dismissible、見た目の avatar-*、文言の *-text、リンクを開く markdown-link-allowed-hosts、実行時の dynamic-variables、override-*(言語、プロンプト、最初のメッセージ、声のID。項目ごとに有効にする必要がある)が書かれています。

渡るデータ・確認点

渡るデータの比較

連携 データの流れ(公式の記載)
Webhookツール 会話から作られたパラメータとヘッダのトークンが、設定したURLへ
Clientツール 自分のアプリの中の関数。結果は、「Wait for response」で会話に戻る
外のMCPサーバー 会話のデータが、そのサーバーへ(ユーザーの入力を含みうる)。Zapier経由なら、Zapierとその先のアプリへ
ElevenLabs提供のLLM ElevenLabsの基盤の中で処理される。元の提供元は受け取らない
Google、OpenAI、Anthropic、自前のLLM データの扱いは、読んだページには書かれていない
通話後Webhook 書き起こし、分析、メタデータ、(設定すれば)音声が、自分のサーバーへ
ウィジェット 訪問者とエージェントの会話が、ElevenLabsを通じて流れる

気をつけること

出典