Dubber について
Dubber は、Dubber の通話録音や通信データを扱うチーム向けの MCP サーバーです。録音、コンプライアンスメタデータ、アカウント・ユーザー管理、通知、Dub.Point 連携のツールを提供します。
主な機能
- 01録音のアップロード・取得・一覧表示
- 02録音メタデータとタグの管理
- 03アカウント・グループ・ユーザー管理
- 04REST-hook 通知の設定
- 05Dub.Point レコードへのアクセス
活用シーン
- 01期間を指定した録音の確認
- 02録音へのコンプライアンスタグ追加
- 03Dubber のユーザーとグループの管理
- 04Dub.Point の通信データをワークフローに接続
MCP 対応
録音、コンプライアンスデータ、アカウント・ユーザー管理、通知、Dub.Point を扱う 37 個の Dubber ツールを MCP クライアントに公開します。stdio と HTTP のトランスポートに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e DUBBER_CLIENT_ID -e DUBBER_CLIENT_SECRET -e DUBBER_AUTH_ID -e DUBBER_AUTH_TOKEN -e DUBBER_REGION -e DUBBER_BASE_URL -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-ai/dubber-mcp:v1.1.0DUBBER_CLIENT_IDMashery application key (developer.dubber.net)DUBBER_CLIENT_SECRETシークレットMashery application secretDUBBER_AUTH_IDシークレットDubber Auth ID (Dubber portal → API tab)DUBBER_AUTH_TOKENシークレットDubber Auth Token (Dubber portal → API tab)DUBBER_REGIONAPI region segment, e.g. 'sandbox' for testing.DUBBER_BASE_URLFull API base URL override (env mode only; overrides DUBBER_REGION)MCP_TRANSPORTTransport mode. Set to 'stdio' for local CLI use; the image defaults to 'http' for gateway hosting.AUTH_MODEシークレットCredential source: 'env' reads vars locally, 'gateway' expects header injection from the WYRE MCP Gateway.LOG_LEVELLog verbosity: debug, info, warn, errorローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/wyre-ai/dubber-mcp:v1.1.0stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
dubber-mcp
Dubber 用 MCP サーバーです。通話録音のアップロード/取得、コンプライアンスメタデータとタグ、グループ/アカウント/ユーザー管理、REST フック(webhook)通知、Dub.Point テレコムシステム(例:BroadWorks)との連携に対応しています。
分割された v2 SDK(@modelcontextprotocol/server / /node / /client ^2.0.0-beta.5)を使用し、MCP 2026-07-28 仕様に基づいて構築されています。2 世代のクライアントへの同時対応として、createMcpHandler({ legacy: 'stateless' }) の背後に共有の McpServerFactory を配置し、2025 年世代の initialize ハンドシェイククライアント(現在の WYRE ゲートウェイ)と最新の 2026-07-28 エンベロープクライアントの両方に、同一で決定的な 37 個のツールを提供します。GHCR コンテナのみで提供されます(MCPB バンドルはありません)。Dubber クライアントは @wyre-ai/node-dubber です。
ツール(37 個、フラット)
- コア:
dubber_test_connection。 - グループ:
dubber_groups_get、dubber_groups_create_child、dubber_groups_list_unidentified_recordings、dubber_groups_create_unidentified_recording。 - アカウント:
dubber_accounts_create、dubber_accounts_get、dubber_accounts_update。 - 録音:
dubber_recordings_list、dubber_recordings_create、dubber_recordings_get、dubber_recordings_get_waveform、dubber_recordings_update_metadata、dubber_recordings_add_tags、dubber_recordings_initiate_multipart_upload、dubber_recordings_get_upload_target、dubber_recordings_complete_upload。 使用制限あり:dubber_recordings_delete(⚠ 破壊的)、dubber_recordings_delete_tags(⚠ 重大な影響あり)。dubber_recordings_listは、新しい順に録音を一覧表示します。limit(1~500、デフォルトは 100)、offset、cursor、query、dubPointId/teamId、およびstart_timeの期間を指定できます。詳しくは 録音の一覧表示 をご覧ください。 - ユーザー:
dubber_users_list、dubber_users_create、dubber_users_get、dubber_users_update。使用制限あり:dubber_users_delete(⚠ 破壊的)。 - プロフィール:
dubber_profile_get。 - 通知(REST フック):
dubber_notifications_list、dubber_notifications_create、dubber_notifications_get、dubber_notifications_update、dubber_notifications_activate、dubber_notifications_list_unclaimed。使用制限あり:dubber_notifications_delete(⚠ 重大な影響あり)。 - Dub.Point:
dubber_dub_points_list、dubber_dub_points_create、dubber_dub_points_get、dubber_dub_points_find。 - OAuth:使用制限ありの
dubber_oauth_revoke_token(⚠ 重大な影響あり)。
認証情報
4つの値がすべて必須です。いずれも人間のログイン情報ではありません(下記の「ベンダー固有の注意事項」を参照)。
| 環境変数(env モード) | ゲートウェイヘッダー(AUTH_MODE=gateway) | 取得元 |
|---|---|---|
DUBBER_CLIENT_ID | X-Dubber-Client-Id | Mashery アプリケーションキー(developer.dubber.net) |
DUBBER_CLIENT_SECRET | X-Dubber-Client-Secret | Mashery アプリケーションシークレット |
DUBBER_AUTH_ID | X-Dubber-Auth-Id | Dubber ポータル → API タブ |
DUBBER_AUTH_TOKEN | X-Dubber-Auth-Token | Dubber ポータル → API タブ |
DUBBER_REGION(任意、デフォルトは sandbox) | X-Dubber-Region | api.dubber.net/<region>/v1 を選択します |
DUBBER_BASE_URL(任意) | なし(意図的) | env モードのみで使用する完全な上書き値 |
ゲートウェイモードでは、必須の4つのヘッダーのいずれかが欠けているリクエストには、MCP ハンドラーが実行される前に 401(JSON-RPC エラー -32001)が返されます。環境変数の認証情報へのフォールバックは行われません。また、ヘッダーで指定されたベース URL も全面的に拒否されます(env モードのみで使用可能)。そのため、呼び出し元がクライアントシークレットを別のホストに送信させることはできません。空のヘッダー値や複数回指定されたヘッダー値は、未指定として扱われます。
/health と /healthz は引き続き認証不要で、認証情報も読み取りません。stdio トランスポートでは CONDUIT_S2S_SECRET は使用されません。
| 変数 | 必須 | 説明 |
|---|---|---|
CONDUIT_S2S_SECRET | HTTP では必須 | サービス間シークレットです。空の場合、または既知のプレースホルダー(changeme、secret、replace-me、replace-with-a-real-secret、その他のサンプル値)の場合、HTTP サーバーはエラーをログに記録して、ゼロ以外の終了コードで終了します。openssl rand -hex 32 で生成してください。設定されていない場合、Compose は起動しません。この値がログに記録されることはありません。 |
MCP_ALLOW_INSECURE_DEV | いいえ | CONDUIT_S2S_SECRET なしで HTTP を起動する場合に限り、ローカル開発用として厳密に 1 に設定します。プロセスは警告をログに記録し、X-Gateway-S2S の検証を行わず、127.0.0.1 のみでバインドします。ループバック以外の MCP_HTTP_HOST(0.0.0.0 を含む)は無視され、上書きがログに記録されます。既知のプレースホルダーシークレットを指定した場合は、引き続き起動が拒否されます。 |
MCP_HTTP_HOST | いいえ | 有効な CONDUIT_S2S_SECRET が設定されている場合のバインドアドレスです。未設定の場合は、従来のコンテナのバインド先である 0.0.0.0 が維持されます。イメージと Compose は、コンテナ内で 0.0.0.0 を設定します。 |
MCP_HTTP_PORT | いいえ | HTTP ポートです。デフォルトは 8080 です。 |
AUTH_MODE | いいえ | gateway(Docker イメージおよび Compose)または env です。ゲートウェイモードでは、各 /mcp リクエストに4つの X-Dubber-* 認証情報ヘッダーが必要で、DUBBER_* へのフォールバックは行いません。env は、S2S 認証に成功した後にのみこれらの環境変数を使用します。未設定の場合は env になります(イメージ外の stdio とシングルテナント HTTP)。 |
HTTP 認証
MCP_TRANSPORT=http かつ CONDUIT_S2S_SECRET が設定されている場合、/health と
/healthz を除くすべてのリクエストに X-Gateway-S2S が必要です。検証処理は
src/s2s-verify.ts の verifyS2sHeader です。ヘッダー値は
t=<unix seconds>,v1=<hex> の形式で、<hex> は CONDUIT_S2S_SECRET をキーとして
リテラル文字列 t=<unix seconds> の HMAC-SHA256 を計算した値です(小文字の16進数64文字)。
タイムスタンプはサーバー時刻から300秒以内でなければなりません。ヘッダーがない場合や
無効な場合は、ベンダーの認証情報を読み取る前に HTTP 401 が返されます。
TS=$(date +%s)
SIG=$(printf 't=%s' "$TS" | openssl dgst -sha256 -hmac "$CONDUIT_S2S_SECRET" -hex | awk '{print $NF}')
curl -sS http://127.0.0.1:8080/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H "X-Gateway-S2S: t=${TS},v1=${SIG}" \
-H "X-Dubber-Client-Id: $DUBBER_CLIENT_ID" \
-H "X-Dubber-Client-Secret: $DUBBER_CLIENT_SECRET" \
-H "X-Dubber-Auth-Id: $DUBBER_AUTH_ID" \
-H "X-Dubber-Auth-Token: $DUBBER_AUTH_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
AUTH_MODE=gateway の場合、/mcp には X-Dubber-Client-Id、X-Dubber-Client-Secret、
X-Dubber-Auth-Id、X-Dubber-Auth-Token も必要です(X-Dubber-Region は任意です)。これらのヘッダーのみが、そのリクエストの認証情報として使用されます。AUTH_MODE=env の場合も署名付きの
X-Gateway-S2S ヘッダーが必要で、その後、環境変数の DUBBER_* が使用されます。
実行
export NODE_AUTH_TOKEN=$(gh auth token) # GitHub Packages auth for @wyre-ai/*
npm install
npm run build
node dist/index.js # stdio (default)
# HTTP refuses to start until CONDUIT_S2S_SECRET is set
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" MCP_TRANSPORT=http node dist/index.js
# Local HTTP only, without a service-to-service secret (always binds 127.0.0.1)
MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 node dist/index.js
npm run smoke # proves both protocol eras serve the same tools
Docker(fleet law に従い linux/amd64)。イメージはコンテナ内で 0.0.0.0(MCP_HTTP_HOST)をリッスンし、デフォルトは AUTH_MODE=gateway です。ポートはループバックに公開し、実際の S2S シークレットを渡してください。gateway モードでは、Dubber の認証情報はリクエストごとにヘッダーとして渡され、環境変数からは読み込まれません。
docker build --platform linux/amd64 --build-arg GITHUB_TOKEN=$(gh auth token) -t dubber-mcp .
docker run \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-p 127.0.0.1:8080:8080 \
dubber-mcp
CONDUIT_S2S_SECRET が設定されていない場合、Compose は起動を拒否します。gateway サービスは AUTH_MODE=gateway を設定し、DUBBER_CLIENT_ID、DUBBER_CLIENT_SECRET、DUBBER_AUTH_ID、DUBBER_AUTH_TOKEN を注入せず、127.0.0.1:8080:8080 を公開します。
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" docker compose up
シングルテナント HTTP(AUTH_MODE=env)でも S2S シークレットが必要です。その後、DUBBER_* 変数を使用します。これは上記の gateway Compose サービスとは別の構成です。
docker run \
-e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
-e AUTH_MODE=env \
-e DUBBER_CLIENT_ID=... -e DUBBER_CLIENT_SECRET=... \
-e DUBBER_AUTH_ID=... -e DUBBER_AUTH_TOKEN=... \
-p 127.0.0.1:8080:8080 \
dubber-mcp
エリシテーションと破壊的操作への同意
確認が必要なツールは、実行前に必ず確認を求めます。エリシテーションは SDK v2 の MRTR 境界を利用します。ハンドラーは input_required の結果を返し、2026-07-28 クライアントがそれを満たして再試行します。また、SDK のレガシー shim は、2025 年代のステートフル接続(stdio)に対してサーバー側でこれを満たします。読み取りと確認はすべて、Dubber への単一の変更呼び出しより前に行われます。
プロンプトを表示できない呼び出し元(WYRE Conduit gateway が接続する方法である、ステートレスなレガシー HTTP リクエストを含む)は、フェイルクローズします。確認が必要なツールを実行するには、呼び出しに "confirm_destructive_action": true が含まれていなければなりません。この引数はプロンプトを表示できない場合にのみ参照され、対話型ユーザーに表示される確認を省略することはありません。
録音の一覧表示と時間範囲
Dubber の録音エンドポイントが受け付けるのは count(最大 100)、page(最大 5 ページ)、before_id カーソル、query のみです。limit/offset や日付フィルターはなく、不明なパラメーターは黙って無視されます。そのため、dubber_recordings_list は Dubber 自体をページングし(count=100、before_id を連鎖)、残りの処理をサーバー側で行います。
limit(1~500、デフォルト 100):返される一致録音の最大数。offset(≥0):スキップする一致録音(新しい順)の数。startTimeFrom(開始時刻を含む)/startTimeTo(日時の場合は終了時刻を含まない。日付のみの値の場合はその日全体を含む):ISO 8601 形式。オフセットがない場合は UTC です。取得後、各録音のstart_timeに対してフィルターを適用します。start_timeを解析できない録音は除外され、excludedUnparseableStartTimeにカウントされます。メルボルンの夏時間(AEDT、+11:00)における週次取得(月~金):startTimeFrom=2026-10-19T00:00:00+11:00、startTimeTo=2026-10-24T00:00:00+11:00、limit=500。dubPointId/teamId(省略可能。前後の空白を除去し、空でない値を指定。各ページのリクエストで Dubber のdub_point/teamとして送信され、filtersにも含まれます):1 回の呼び出しにつき、1 つの dub point または 1 つのチームを指定します。Dubber は両方の組み合わせを許可しないため、両方を渡すとエラーになります。Dubber の録音にはユーザーを直接指定するフィルターがありません。特定の技術者の週次録音を取得するには、dubber_dub_points_listでそのユーザーの dub point ID を調べます(各 dub point のuserは/users/<USER_ID>で終わる URL です)。その後、dub point ごとに 1 回呼び出します。cursorは同じdubPointId/teamIdとともに再利用する必要があります。- 各呼び出しでの Dubber リクエストは最大 25 件です(録音を 2,500 件スキャン)。この上限、または
limitによってスキャンが早期終了した場合、hasMoreは true になり、nextCursorが設定されます。ギャップや重複なく続きを取得するには、cursor=<nextCursor>、offset=<remainingOffset>(スキップ中にスキャン上限に達した場合を除き 0)、および同じフィルターを指定して再度呼び出します。scanCapReachedは、上限に達したことが終了理由かどうかを示します。startTimeFromが設定されている場合、録音の開始時刻がその値より前のページを丸ごと 1 ページ取得すると、スキャンは停止します。 - 結果:
{ recordings, returned, hasMore, nextCursor, remainingOffset, scanned, requests, scanCapReached, filters, note }。
ハンドラーは、@wyre-ai/node-dubber 1.0.0(型付きパラメーターは {limit, offset})を通じて、単一のキャストで Dubber のパラメーターを送信します。count/before_id/query に型を定義した SDK リリースを採用したら、キャストを削除してください。
ここに反映されているベンダー固有の仕様
- 人間用パスワードを使わないパスワードグラント認証。 OAuth トークンリクエストの
username/passwordには、個人のログイン情報ではなく、ポータルの API タブにある Dubber Auth ID/Dubber Auth Token のペアを指定します。docs/DESIGN.md§3 を参照してください。 - リージョンごとにホストが異なり、本番環境に共通のデフォルトはありません。
sandboxは無料でセルフサービス利用できます。本番環境では、Dubber に確認したリージョンのhttps://api.dubber.net/<region>/v1を使用します。誤ったホストを指定すると、気づかないまま別のテナントに接続します。 - ダウンロード可能な API 仕様書はありません。 すべてのエンドポイントと認証フローは、稼働中の
/io-docsコンソールと公式 Getting Started Guide を使って確認しました。レスポンスボディの完全な形式については、node-dubberのsrc/types/index.tsに記載された、最善努力による最低限の定義であり、網羅性を保証するものではありません。docs/DESIGN.md§4 とCONTRIBUTING.mdを参照してください。 - リフレッシュトークンフローは実装されていません。 Dubber のレスポンスには
refresh_tokenが含まれますが、その仕様は検証可能な形でどこにも記載されていません。このクライアントは、有効期限が切れたときに同じパスワードグラントでトークンを再取得します。同じ制約下で node-kpn が採用している既存の方式に準じています。
ライセンス
Apache-2.0 © WYRE Technology
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。