開発者向け
Sonny MCP Beta
Claudeをはじめ、Model Context Protocolに対応したAIアシスタントを、公開APIと同じスコープと境界でワークスペースに接続できます。
公開APIガイドを読むクイックスタート
- 01
ClaudeにSonnyを追加する
ClaudeまたはCoworkで、URL
https://www.usesonny.com/api/mcpのカスタムコネクタを追加します。Sonnyはクライアントの自動登録に対応しているため、クライアントIDやシークレットをコピーする必要はありません。 - 02
ワークスペースへのアクセスを承認する
ClaudeがブラウザでSonnyを開きます。ログインし、要求された権限を確認して、接続するワークスペースを選びます。PKCE付きのOAuth 2.1により、発行されるアクセストークンとリフレッシュトークンは、その承認の範囲に限定されます。
- 03
アシスタントにSonnyを使うよう依頼する
ツールは自身の説明を持っているため、「オープンの会話を一覧表示して」のようなプロンプトで十分です。アシスタントにはどのツールが読み取り専用で、どれが破壊的な操作かがわかるため、優れたクライアントは何かを変更する前に確認を求めます。
Claude Code
claude mcp add --transport http sonny https://www.usesonny.com/api/mcpJSONのクライアント設定
{
"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 が含まれるため、結果を検証できます。
低コストのサポートループを回す
- 変更を検出:永続的な
syncフィードで初期化し、各ページの処理後に nextCursor を保存し、イベントIDの重複を除外します。対応する仕事を選ぶには、sourceId、awaitingReply: true、snoozed: "false"、compact: true を指定してlist_conversationsを呼び出します。社内メモがあっても、未返信の顧客メッセージが隠れることはありません。 - 新しいテキストだけを読む:変更された会話ごとに、最後のメッセージIDまたはISOタイムスタンプを
afterに指定してlist_messagesを呼び出し、メールのHTMLが本当に必要でない限りincludeHtml: falseを設定します。 - 画像と動画を待つ:
list_messagesがreadsInProgressを返したら、そのnextStepにある呼び出しを行います。waitSecondsにより、画像の読み取りと動画の文字起こしが完了するまでレスポンスが保留されるため、スリープは不要です。 - 顧客情報を読み込む:
get_conversationは、identityVerified、署名付きのverifiedTraits、会話の発生元ページとクライアントの情報を返します。contact.idがある場合は、そのIDをlist_conversationsに渡すと、顧客の過去の会話を読み込めます。 - 必要なときに起動:
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 が必要です。制限された認証情報では、許可されたチャネルの分だけが返されます。
- カーソルなしで開始し、hasMore が false になるまで nextCursor をたどって、そのカーソルを保存します。
- 初期状態に必要な、現在の会話/連絡先の一覧と履歴を読み取ります。
- 保存したカーソルから再取得して、読み取り中に起きた変更に追いつきます。各ページを処理してから、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をインポートし、画像をアップロードし、並び順を設定し、読者のオーディエンスを管理できます。アップサートを繰り返すと、既存のコンテンツが更新されます。
- チャネルの sourceId を選び、kb:read と kb:write を付与します。任意の確認のための
list_sourcesには、conversations:read も必要です。 - カテゴリーを作成してから、記事を下書きとして同期します。公開する前に、書式とアクセスを確認してください。
- ヘルプセンターのアクセスを設定して公開し、読者の画面をテストします。以降の更新には、ページ送りと固定の外部IDを使ってください。
顧客オーディエンスを管理する
認証済みの顧客の属性からグループを作成し、ヘルプセンター、カテゴリー、記事に適用します。引き継いだすべての制限を満たす必要があります。APIとMCPの認証情報は、スコープの範囲内でスタッフとして動作します。読者のアクセスを確認するには、プレビューと実際の顧客セッションでテストしてください。
ヘルプセンターのオーディエンスを設定・テストする