Для розробників

Sonny MCP Beta

Підключіть до свого робочого простору AI-асистентів, сумісних з MCP, — Claude та будь-який клієнт, що підтримує Model Context Protocol, — з тими самими областями доступу й обмеженнями, що й у публічному API.

Читати посібник із публічного API

Швидкий старт

  1. 01

    Додайте Sonny до Claude

    У Claude або Cowork додайте користувацький конектор з URL https://www.usesonny.com/api/mcp. Sonny підтримує автоматичну реєстрацію клієнтів, тож копіювати client ID чи секрет не потрібно.

  2. 02

    Схваліть доступ до робочого простору

    Claude відкриє Sonny у вашому браузері. Увійдіть, перегляньте запитувані дозволи й виберіть робочий простір для підключення. OAuth 2.1 із PKCE обмежує отримані токени доступу й оновлення саме цим схваленням.

  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, створіть API-ключ з обмеженими областями доступу в розділі «Налаштування → Для розробників» і передавайте його в заголовку Authorization Bearer. API-ключі й надалі повністю підтримуються для інтеграцій «сервер — сервер» і старіших клієнтів.

"Authorization": "Bearer sonny_your_key"

Як Sonny захищає виклики інструментів

Один робочий простір, вибрані області доступу
Кожен виклик виконується в межах робочого простору, вибраного під час надання згоди в OAuth, або робочого простору, якому належить API-ключ. Інструмент працює, лише якщо облікові дані мають потрібну область доступу.
Чесні анотації інструментів
Інструменти лише для читання позначено відповідно; інструменти, що оновлюють і видаляють дані, позначено як руйнівні, тож клієнт може запитати підтвердження, перш ніж діяти.
Ті самі бізнес-правила
Інструменти виконують ті самі робочі процеси, що й публічний API: історія аудиту, сповіщення й вебхуки працюють так, ніби зміну вніс колега.

Тримайте асистента в межах одних вхідних

Вибрані канали API-ключа автоматично застосовуються до кожного виклику інструментів. API-ключі й OAuth-підключення також враховують поточний доступ підключеного колеги до каналів. Для OAuth-підключень або ключів з доступом до всіх каналів: робочі простори часто мають кілька джерел — по одному на продукт чи бренд. Нехай асистент один раз викличе list_sources, щоб їх виявити, а потім передає sourceId у list_conversations — так запитання про один продукт повертатимуть лише розмови цього продукту. Кожна розмова також містить власний sourceId, тож результати можна перевірити.

Запустіть недорогий цикл підтримки

  1. Відстежуйте зміни: почніть зі стійкої стрічки sync, зберігайте nextCursor після обробки кожної сторінки й відкидайте дублікати ID подій. Щоб вибрати роботу, викликайте list_conversations із sourceId, awaitingReply: true, snoozed: "false" і compact: true. Внутрішні нотатки не приховують повідомлень клієнтів без відповіді.
  2. Читайте лише новий текст: для кожної зміненої розмови викликайте list_messages, передаючи в after ID останнього повідомлення або позначку часу ISO, і встановлюйте includeHtml: false, якщо HTML листа справді не потрібен.
  3. Чекайте на зображення й відео: коли list_messages повертає readsInProgress, виконайте виклик із його nextStep. Його waitSeconds утримує відповідь, доки не будуть готові розпізнавання зображень і транскрипти відео, тож чекати вручну не потрібно.
  4. Завантажуйте контекст клієнта: get_conversation повертає identityVerified, підписані verifiedTraits, а також сторінку, з якої почалася розмова, і контекст клієнтського застосунку. Якщо в ній є contact.id, передайте цей ID у list_conversations, щоб завантажити попередні розмови клієнта.
  5. Пробуджуйте на вимогу: використовуйте вебхук для message.created із фільтром за джерелом, щоб негайно пробуджувати агента, а потім надолужуйте через sync. Стійка стрічка працює незалежно від доставки вебхуків. Щоб створити вебхук і обмежити його 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
import_conversations
Import conversation history
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. Фільтр «очікує відповіді» ігнорує внутрішні нотатки; «непрочитані» стосується конкретного автентифікованого колеги. «Не призначено» означає відсутність окремого відповідального, навіть якщо призначено команду. Теги збігаються з будь-яким переданим ID. Передайте propertyId (поле типу «Список» із list_properties) разом із propertyValues, щоб знайти контакти з будь-яким із цих варіантів; у REST повторюйте propertyValues для кожного варіанта.

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

Сортуйте за waitingSince, lastMessageAt, createdAt або бізнес-пріоритетом у напрямку asc чи desc. За однакових значень порядок визначають ID. Якщо фільтри не вказано, зберігаються compact=false і snoozed=any. У REST tagIds приймає ID через кому; MCP також приймає масив. waitingSince починається з першого вхідного повідомлення після останньої відповіді; подальші повідомлення та внутрішні нотатки його не скидають. Запускайте це сканування черги очікування за розкладом, навіть коли вебхуки не надходять, щоб старі гілки знову спливали.

Наздоганяйте зміни, не перечитуючи вхідні

Використовуйте sync з conversations:read. Надійна стрічка містить зміни розмов, теги, повідомлення, властивості контактів, спогади та записи про видалення. Кожен вміст також потребує власної області доступу на читання: тексти повідомлень — messages:read, а спогади — contact-memory:read. Облікові дані з обмеженнями отримують лише дозволені канали.

  1. Почніть без курсора, переходьте за nextCursor, доки hasMore не стане false, і збережіть цей курсор.
  2. Прочитайте поточні списки розмов і контактів та всю історію, потрібну для початкового стану.
  3. Відтворіть зміни від збереженого курсора, щоб охопити все, що змінилося під час цього читання. Обробіть кожну сторінку, а потім збережіть nextCursor.

Усувайте дублікати за id події: доставка відбувається за принципом «щонайменше один раз», тож подальші дії потребують власного захисту від дублікатів. Запит без курсора охоплює останню годину, а не повний знімок. Події зберігаються 30 днів; HTTP 410 resync_required означає, що потрібно знову завантажити початковий стан. Робіть це також після розширення областей доступу або доступу до каналів. Використовуйте limit до 100 і maxBodyChars до 10 000 (за замовчуванням 500). Установіть compact=true, щоб отримувати поля повідомлень textPreview/textTruncated з обмеженням 200 символів замість body/bodyTruncated. Вебхуки можуть «будити» агента; стрічка залишається доступною і без підписок на вебхуки, і тоді, коли доставка вебхуків затримується.

Записуйте перевірки один раз і діліться результатом

Перш ніж повторювати дослідження, прочитайте list_conversation_checks (GET /api/v1/conversations/{conversationId}/checks). Збережіть результат через record_conversation_check (PUT за тим самим шляхом), передавши key, result, checkedBy і необов’язковий reference для ID або URL картки. Наприклад: key=product-version, result=Shopstar Go verified, checkedBy=Engineer, reference=card-X. Sonny записує actorId автентифікованого користувача й позначку часу checkedAt. Повторне використання key замінює лише цю перевірку; це поточний стан, а не журнал історії. Читання потребує 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" }
})

Розподіл по черзі (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, позначаються як дані API в Co-Pilot і автовідповідачі. Наявні правила для верифікованих клієнтів і джерел і далі діють. Звичайні значення внутрішніх полів, введені вручну, як і раніше не входять до цього контексту 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 і завантажте для розмови файл розміром до 25 МБ. upload_attachment приймає conversationId, fileName, contentType і dataBase64. Відповідь містить id і expiresAt. Передайте до 10 attachmentIds у відповідь чи нотатку протягом години. Кожне завантаження прив’язане до вашого користувача й розмови та може бути використане лише один раз. Невикористані завантаження видаляються після завершення терміну дії.

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

Відповіді потребують messages:send; внутрішні нотатки потребують messages:write і ніколи не потрапляють до клієнтів. Підтримуються повідомлення лише з вкладеннями. Відповіді ел. поштою містять файли в межах ліміту розміру листа, а для решти — посилання на завантаження; листи з офлайн-чату містять посилання на файли. Посилання в листах працюють, доки існує вкладення, тож отримувачі можуть відкрити їх пізніше. Пересилання листа надає доступ до цих файлів. Перевіряйте emailDeliveryStatus, щоб виявити помилки доставки.

Авторизоване читання повідомлень містить downloadUrl, downloadExpiresAt, aiStatus, aiDescription та aiExtractedText, а також videoTranscripts для відео за посиланнями (Loom, Vimeo та інші). Посилання на завантаження діють 15 хвилин; щоб отримати нові, прочитайте повідомлення знову. Нові завантаження через API/MCP зберігаються приватно. Старіші вкладення залишаються публічними й позначаються access=legacy_public: їхня початкова URL-адреса не має терміну дії. Читання повідомлення запускає розпізнавання його зображень, якщо робочий простір має Sonny AI. Розпізнавання зображень і розшифровки відео завершуються невдовзі після надходження повідомлення: поки якісь із них ще тривають, відповідь починається з readsInProgress, де nextStep вказує точний виклик, який потрібно зробити. Передайте waitSeconds (до 30), щоб дочекатися їх в одному запиті. Повідомлення у віджеті й у реальному часі, які бачать клієнти, ніколи не містять витягнутого тексту чи розшифровок.

Перегляньте повні контракти запитів і відповідей

База знань

Синхронізація із зовнішнього джерела

Синхронізуйте статті й категорії за стабільними зовнішніми ID, імпортуйте Markdown або HTML, завантажуйте зображення, задавайте порядок і керуйте аудиторіями читачів. Повторний upsert оновлює наявний вміст.

  1. Виберіть sourceId свого каналу й надайте kb:read і kb:write. Для необов’язкового пошуку джерел list_sources також потребує conversations:read.
  2. Створіть категорію, а потім синхронізуйте статтю як чернетку. Перед публікацією перевірте її форматування й доступ.
  3. Налаштуйте доступ до довідкового центру, опублікуйте статтю й перевірте, як її бачить читач. Для подальших оновлень використовуйте пагінацію та стабільні зовнішні ID.
Покроковий посібник із синхронізації через MCP

Керуйте аудиторіями клієнтів

Створюйте групи за атрибутами верифікованих клієнтів і застосовуйте їх до довідкового центру, категорії чи статті. Мають виконуватися всі успадковані обмеження. Облікові дані API та MCP діють як персонал у межах своїх областей доступу; щоб перевірити доступ читача, скористайтеся попереднім переглядом і протестуйте справжній сеанс клієнта.

Налаштування й перевірка аудиторій довідкового центру

Пов’язані посібники