開発者向け

Sonny MCP Beta

Claudeをはじめ、Model Context Protocolに対応したAIアシスタントを、公開APIと同じスコープと境界でワークスペースに接続できます。

公開APIガイドを読む

クイックスタート

  1. 01

    ClaudeにSonnyを追加する

    ClaudeまたはCoworkで、URL https://www.usesonny.com/api/mcp のカスタムコネクタを追加します。Sonnyはクライアントの自動登録に対応しているため、クライアントIDやシークレットをコピーする必要はありません。

  2. 02

    ワークスペースへのアクセスを承認する

    ClaudeがブラウザでSonnyを開きます。ログインし、要求された権限を確認して、接続するワークスペースを選びます。PKCE付きのOAuth 2.1により、発行されるアクセストークンとリフレッシュトークンは、その承認の範囲に限定されます。

  3. 03

    アシスタントにSonnyを使うよう依頼する

    ツールは自身の説明を持っているため、「オープンの会話を一覧表示して」のようなプロンプトで十分です。アシスタントにはどのツールが読み取り専用で、どれが破壊的な操作かがわかるため、優れたクライアントは何かを変更する前に確認を求めます。

Claude Code

claude mcp add --transport http sonny https://www.usesonny.com/api/mcp

JSONのクライアント設定

{
  "mcpServers": {
    "sonny": {
      "url": "https://www.usesonny.com/api/mcp"
    }
  }
}

APIキーとの互換性

クライアントがOAuthを完了できない場合は、設定 → 開発者でスコープ付きキーを作成し、Authorization Bearerヘッダーで送信します。APIキーは、サーバー間の連携や従来型のクライアント向けに引き続き完全にサポートされています。

"Authorization": "Bearer sonny_your_key"

Sonnyがツール呼び出しを安全に保つ仕組み

1つのワークスペースと、選んだスコープ
すべての呼び出しは、OAuthの同意時に選んだワークスペース、またはAPIキーを所有するワークスペースの中で実行されます。ツールは、認証情報に必要なスコープがある場合にのみ動作します。
正確なツールアノテーション
読み取り専用のツールには読み取り専用の印が、更新や削除を行うツールには破壊的な操作の印が付いているため、クライアントは実行前に確認できます。
同じビジネスルール
ツールは公開APIとまったく同じワークフローを実行します。監査履歴、通知、Webhookは、メンバーが変更した場合と同じように動作します。

アシスタントをひとつの受信トレイ内に限定する

APIキーで選択したチャネルは、すべてのツール呼び出しで自動的に適用されます。APIキーとOAuth接続は、接続したメンバーの現在のチャネルアクセスにも従います。OAuth接続やすべてのチャネルにアクセスできるキーの場合、ワークスペースには製品やブランドごとに複数のソースがあることがよくあります。アシスタントに一度 list_sources を呼び出させてソースを把握し、list_conversations に sourceId を渡せば、ある製品についての質問にはその製品の会話だけが返されます。各会話にも sourceId が含まれるため、結果を検証できます。

低コストのサポートループを回す

  1. 変更を検出:永続的な sync フィードで初期化し、各ページの処理後に nextCursor を保存し、イベントIDの重複を除外します。対応する仕事を選ぶには、sourceId、awaitingReply: true、snoozed: "false"、compact: true を指定して list_conversations を呼び出します。社内メモがあっても、未返信の顧客メッセージが隠れることはありません。
  2. 新しいテキストだけを読む:変更された会話ごとに、最後のメッセージIDまたはISOタイムスタンプを after に指定して list_messages を呼び出し、メールのHTMLが本当に必要でない限り includeHtml: false を設定します。
  3. 画像と動画を待つ:list_messages が readsInProgress を返したら、その nextStep にある呼び出しを行います。waitSeconds により、画像の読み取りと動画の文字起こしが完了するまでレスポンスが保留されるため、スリープは不要です。
  4. 顧客情報を読み込む:get_conversation は、identityVerified、署名付きの verifiedTraits、会話の発生元ページとクライアントの情報を返します。contact.id がある場合は、そのIDを list_conversations に渡すと、顧客の過去の会話を読み込めます。
  5. 必要なときに起動:message.created 用にソースで絞り込んだWebhookを使ってエージェントをすぐに起動し、そのあとsyncで追いつきます。永続フィードはWebhookの配信とは独立して動作します。Webhookの作成とソースIDの制限にはすべてのチャネルにアクセスできる認証情報を使い、エージェントはソースに限定された実行用の認証情報をそのまま使います。

ツールカタログ

公開APIのすべての操作をツールとして利用できます。必要なスコープは各ツールの横に記載されています。

get_connection_info
Read connection access
conversations:read
get_conversation_context
Read support context
conversations:read
list_conversation_checks
Read conversation checks
conversations:read
record_conversation_check
Record a conversation check
conversations:write
get_status
Check Sonny status
conversations:read
create_conversation
Create a conversation from a form
conversations:write
upload_attachment
Upload a message attachment
attachments:write
list_properties
List custom properties
contacts:read
get_contact_properties
Read contact properties
contacts:read
set_contact_property
Set a contact property
contacts:write
list_contact_memories
Read customer memories
contact-memory:read
create_contact_memory
Save a customer memory
contact-memory:write
delete_contact_memory
Remove a customer memory
contact-memory:write
get_report
Read a support report
reporting:read
sync
Read workspace changes
conversations:read
batch_update_conversations
Update conversations in a batch
conversations:write
list_members
List members
members:read
list_teams
List teams
members:read
list_tags
List tags
tags:read
create_tag
Create a tag
tags:write
get_tag
Get a tag
tags:read
update_tag
Update a tag
tags:write
delete_tag
Delete a tag
tags:write
add_conversation_tag
Add a conversation tag
conversations:write
remove_conversation_tag
Remove a conversation tag
conversations:write
list_contacts
List contacts
contacts:read
create_contact
Create a contact
contacts:write
get_contact
Get a contact
contacts:read
update_contact
Update a contact
contacts:write
archive_contact
Archive a contact
contacts:write
erase_contact
Permanently erase a contact
contacts:write
list_channels
List conversation channels
conversations:read
list_sources
List sources
conversations:read
list_conversations
List conversations
conversations:read
get_conversation
Get a conversation
conversations:read
update_conversation
Update a conversation
conversations:write
list_messages
List messages
messages:read
create_internal_note
Create an internal note
messages:write
edit_message
Edit a sent reply
messages:send
send_message
Send a reply to the customer
messages:send
list_webhooks
List webhook endpoints
webhooks:read
create_webhook
Create a webhook endpoint
webhooks:write
list_webhook_events
List webhook event types
webhooks:read
update_webhook
Update a webhook endpoint
webhooks:write
delete_webhook
Delete a webhook endpoint
webhooks:write
test_webhook
Queue a test event
webhooks:write
list_webhook_deliveries
List webhook deliveries
webhooks:read
retry_webhook_delivery
Retry a failed delivery
webhooks:write
list_kb_articles
List knowledge base articles
kb:read
create_kb_article
Create a knowledge base article
kb:write
get_kb_article
Get a knowledge base article
kb:read
update_kb_article
Update a knowledge base article
kb:write
delete_kb_article
Delete a knowledge base article
kb:write
list_kb_categories
List knowledge base categories
kb:read
create_kb_category
Create a knowledge base category
kb:write
update_kb_category
Update a knowledge base category
kb:write
delete_kb_category
Delete a knowledge base category
kb:write
get_csat_summary
Get CSAT scores
csat:read
list_csat_ratings
List CSAT ratings
csat:read
get_conversation_csat
Get a conversation's CSAT rating
csat:read
reorder_kb_articles
Reorder knowledge base articles
kb:write
upsert_kb_article
Sync a knowledge base article
kb:write
reorder_kb_categories
Reorder knowledge base categories
kb:write
upsert_kb_category
Sync a knowledge base category
kb:write
get_kb_category
Get a knowledge base category
kb:read
get_help_center
Get help center settings
kb:read
update_help_center
Update help center settings
kb:write
upload_kb_media
Upload a help center image
kb:write
list_kb_audiences
List audiences
kb:read
create_kb_audience
Create audience
kb:write
update_kb_audience
Update audience
kb:write
delete_kb_audience
Delete audience
kb:write

エージェントのワークフロー

振り分け、対応、そして常に同期

RESTとMCPは同じ権限とワークフローを共有しています。認証情報で、現在のチャネルへのアクセスを広げることはできず、絞り込むことだけができます。メンバーシップからチャネルを外すと、連携からもそのチャネルが外れます。

対応が必要な会話を見つける

awaitingReply、unread、unassigned、assigneeId、agentGroupId、snoozed、priority、tagIds で絞り込みます。awaitingReply は社内メモを無視します。unread は認証されたメンバーごとの状態です。unassigned は、チームが割り当てられていても個人の担当者がいないことを意味します。タグは指定したいずれかのIDに一致します。

list_conversations({ status: "open", awaitingReply: true, compact: true, sort: "waitingSince", direction: "asc" })

waitingSince、lastMessageAt、createdAt、またはビジネス上の優先度で、direction に asc または desc を指定して並べ替えます。同順の場合はIDで決まります。絞り込みを省略すると、compact=false と snoozed=any が維持されます。RESTの tagIds はカンマ区切りのIDを受け付け、MCPでは配列も使えます。waitingSince は、最後の返信の後の最初の受信メッセージから始まり、追加のメッセージや社内メモではリセットされません。古いスレッドが再び浮上するよう、Webhookが届かないときでも、この待機キューのスキャンを定期的に実行してください。

受信トレイを読み直さずに追いつく

conversations:read を指定して sync を使います。永続フィードには、会話の変更、タグ、メッセージ、連絡先のプロパティ、メモリー、削除の記録が含まれます。各ペイロードにはそれぞれの読み取りスコープも必要です。メッセージ本文には messages:read が、メモリーには contact-memory:read が必要です。制限された認証情報では、許可されたチャネルの分だけが返されます。

  1. カーソルなしで開始し、hasMore が false になるまで nextCursor をたどって、そのカーソルを保存します。
  2. 初期状態に必要な、現在の会話/連絡先の一覧と履歴を読み取ります。
  3. 保存したカーソルから再取得して、読み取り中に起きた変更に追いつきます。各ページを処理してから、nextCursor を保存します。

イベントの id で重複を除外してください。再取得は少なくとも1回の配信を保証するため、後続の処理にも独自の重複対策が必要です。カーソルなしのリクエストは直近1時間分で、完全なスナップショットではありません。イベントは30日間保持されます。HTTP 410 resync_required が返されたら、再度初期化してください。スコープやチャネルへのアクセスを広げた後も初期化してください。limit は最大100、maxBodyChars は最大10,000(デフォルト500)です。compact=true を設定すると、body/bodyTruncated の代わりに、200文字までのメッセージの textPreview/textTruncated フィールドが返されます。Webhookでエージェントを起動できますが、フィードはWebhookを購読していない場合や、Webhookの配信が滞っている場合でも利用できます。

確認結果を一度記録して共有する

調査を繰り返す前に、list_conversation_checks(GET /api/v1/conversations/{conversationId}/checks)を読み取ってください。結果は record_conversation_check(同じパスへのPUT)で、key、result、checkedBy と、カードのIDやURLを示す任意の reference を指定して保存します。例:key=product-version、result=Shopstar Go verified、checkedBy=Engineer、reference=card-X。Sonnyは認証された actorId と checkedAt のタイムスタンプを記録します。同じキーを再利用すると、その確認だけが置き換わります。これは履歴ではなく現在の状態です。読み取りには conversations:read、書き込みには conversations:write が必要で、どちらも会話のチャネルに限定されます。これらの呼び出しで返信が送られたり、販売者が回答済みとして記録されたりすることはありません。

割り当てと一括更新

list_members / list_teams(members:read)で、アクティブで割り当て可能なメンバーとチームを確認します。レスポンスには対応状況と実際のチャネルへのアクセスが含まれ、メールアドレスは含まれません。conversations:write を使って、status、priority、assigneeId、agentGroupId、snoozedUntil、snoozedUntilReply、addTagIds、removeTagIds を変更します。

batch_update_conversations({
  conversationIds: ["conversation_1", "conversation_2"],
  updates: { agentGroupId: "team_1", assignment: "round_robin" }
})

ラウンドロビンでは、会話のチャネルにアクセスできる対応可能なチームメンバーが選ばれます。対象となるメンバーがいない場合、単一の更新では409が返され、一括処理ではその項目が失敗します。一括処理では最大100個の一意なIDを受け付け、会話ごとにひとつのパッチをアトミックに適用します。{ id, ok, error? } の結果をすべて確認してください。一部の項目が失敗する場合があります。一括処理には現在のリクエスト単位のレート制限が適用され、項目数による重み付けはありません。

Sonny AIと顧客情報を共有する

contact-memory:read/write で、連絡先のメモリーを一覧表示、保存、削除します。contactId と、アクセス可能な sourceId の両方を指定してください。連絡先には、そのソースでの会話が必要です。保存した事実には、アプリと同じ検証、重複の処理、上限が適用され、手動のメモリーとして記録されます。

プロパティの定義は /api/v1/properties で読み取り、値は /api/v1/contacts/{contactId}/properties で読み取り・設定します。MCPでは list_properties、get_contact_properties、set_contact_property を使えます。これらには contacts:read/write と、すべてのチャネルへのアクセスが必要です。propertyId または propertyName のどちらか一方を指定し、文字列の値、またはクリアする場合は null を指定します。テキスト、数値、URL、日付、選択肢の値は、フィールドの定義に照らして検証されます。

set_contact_property({ contactId: "contact_1", propertyName: "Plan", value: "Pro" })
list_contacts({ property: { Plan: "Pro" } })

プロパティの絞り込みは、保存された文字列と完全一致で照合します。複数のプロパティを指定した場合は、すべてに一致する必要があります。APIで書き込まれた値は、Co-Pilotと自動応答でAPIのデータとして表示されます。既存の認証済み顧客とソースのルールは引き続き適用されます。通常の手動入力による社内向けのフィールド値は、このAIの文脈から除外されたままです。

チームと同じレポートを読み取る

reporting:read を指定して get_report({ kind, filters }) を呼び出します。種類は overview、volume、response-times、agents、sources、tags、csat、ai、knowledge、leads、online-hours です。overview は件数、応答時間、CSATをまとめたものです。絞り込みには、period(1〜365日、デフォルト30)、組み合わせで指定する from/to の日付(to は含みません)、granularity(day/month)、source、assigneeId、tagId を使えます。source には all、all-chat、all-email、website:{id}、email:{id} を指定できます。

レポートには、ダッシュボードと同じクエリと現在のアクセス確認が使われます。knowledge は、選択したソース、担当者、タグとは関係なく、日付と許可されたチャネルを使います。online-hours は、アクセス可能なメンバーのワークスペースでのオンライン状況を測定し、会話数はチャネルに限定されたままです。既存の /csat エンドポイントは、独自の csat:read スコープを使い、対象となる母集団が異なる場合があります。

返信や社内メモでファイルを送る

attachments:write を付与し、会話用に最大25MBのファイルをアップロードします。upload_attachment には conversationId、fileName、contentType、dataBase64 を指定します。 レスポンスには id と expiresAt が含まれます。1時間以内に、最大10個の attachmentIds を返信またはメモに渡します。各アップロードはあなたのユーザーと会話に紐づき、一度だけ使えます。使われなかったアップロードは、期限切れ後に削除されます。

send_message({ conversationId: "conversation_1", attachmentIds: ["upload_1"] })

返信には messages:send が、社内メモには messages:write が必要で、社内メモが顧客に届くことはありません。添付ファイルだけのメッセージにも対応しています。メールの返信では、メールのサイズの範囲内でファイルを添付し、残りはダウンロードリンクにします。オフライン時のチャットのメールにはファイルのリンクが含まれます。メールで送られたリンクは添付ファイルが存在する限り使えるため、受信者は後から開けます。メールを転送すると、それらのファイルへのアクセスも共有されます。配信の失敗は emailDeliveryStatus で確認してください。

認可されたメッセージの読み取りには、downloadUrl、downloadExpiresAt、aiStatus、aiDescription、aiExtractedText に加え、リンクされた動画(Loom、Vimeoなど)の videoTranscripts が含まれます。ダウンロードリンクの有効期間は15分です。新しいリンクが必要な場合は、メッセージを読み直してください。API/MCPで新しくアップロードしたファイルは非公開のストレージに保存されます。以前の添付ファイルは公開のままで、access=legacy_public と示され、元のURLは期限切れになりません。ワークスペースでSonny AIが有効な場合、メッセージを読み取るとその画像の読み取りが始まります。画像の読み取りと動画の文字起こしは、メッセージの到着後まもなく完了します。処理中のものがある間、レスポンスは readsInProgress で始まり、その nextStep に次に行うべき呼び出しが正確に示されます。waitSeconds(最大30)を指定すると、1回のリクエストで完了を待てます。顧客向けのウィジェットとリアルタイムのメッセージには、抽出内容や文字起こしは含まれません。

リクエストとレスポンスの仕様をすべて見る

ナレッジベース

外部のソースから同期する

固定の外部IDを使って記事とカテゴリーを同期し、MarkdownやHTMLをインポートし、画像をアップロードし、並び順を設定し、読者のオーディエンスを管理できます。アップサートを繰り返すと、既存のコンテンツが更新されます。

  1. チャネルの sourceId を選び、kb:read と kb:write を付与します。任意の確認のための list_sources には、conversations:read も必要です。
  2. カテゴリーを作成してから、記事を下書きとして同期します。公開する前に、書式とアクセスを確認してください。
  3. ヘルプセンターのアクセスを設定して公開し、読者の画面をテストします。以降の更新には、ページ送りと固定の外部IDを使ってください。
MCP の同期手順をすべて見る

顧客オーディエンスを管理する

認証済みの顧客の属性からグループを作成し、ヘルプセンター、カテゴリー、記事に適用します。引き継いだすべての制限を満たす必要があります。APIとMCPの認証情報は、スコープの範囲内でスタッフとして動作します。読者のアクセスを確認するには、プレビューと実際の顧客セッションでテストしてください。

ヘルプセンターのオーディエンスを設定・テストする

関連ドキュメント