name: aatex-messenger description: Мессенджер ЦУП ААТех — чаты, сообщения, каналы. Применяй для "отправь сообщение", "напиши в чат", "прочитай чат", "сколько непрочитанных", "создай канал", "добавь в группу", "поиск по переписке". Поддерживает DM, группы, каналы, файлы через upload_message_file.
Мессенджер ЦУП ААТех
Когда использовать
- Отправить сообщение пользователю или в группу/канал
- Прочитать историю чата
- Создать новый чат
- Проверить непрочитанные
- Искать по тексту сообщений
- Добавить людей в группу/канал
- Прикрепить файл к сообщению
Типы бесед
| Тип | Участники | Когда использовать |
|---|---|---|
dm |
2 (личка) | Один на один |
group_dm |
3+ (приватная группа) | Рабочая группа |
channel |
Много (публично в орге) | Обсуждения, темы, объявления |
saved |
1 (только вы) | Заметки себе |
Инструменты
| Инструмент | Параметры | Назначение |
|---|---|---|
list_conversations |
type? |
Беседы (фильтр по типу) |
list_messages |
conversationId, limit?, before? |
История (курсорная пагинация) |
send_message |
conversationId, content, attachmentIds? |
Отправить |
create_conversation |
type, targetUserId?|userIds?|name, ... |
Создать чат |
get_unread_summary |
— | Сводка непрочитанных по всем |
add_conversation_participants |
conversationId, userIds |
Добавить людей |
search_messages |
query, conversationId?, limit? |
Поиск по тексту |
Сценарии
1. Написать сообщение конкретному человеку (DM)
1. list_users(search="Иван") → userId = "uid_abc"
2. list_conversations(type: "dm") → проверь, есть ли уже DM
# DM найти можно по type="dm" и одному из участников
3a. Если DM есть:
send_message(conversationId, content)
3b. Если DM нет:
create_conversation(type: "dm", targetUserId: "uid_abc") → conversationId
send_message(conversationId, content)
Оптимизация: create_conversation(type: "dm") идемпотентен — если DM уже существует, вернёт существующую. Можно смело вызывать.
2. Создать групповой чат
1. list_users(search="...") → несколько userIds
2. create_conversation(
type: "group_dm",
userIds: ["uid1", "uid2", "uid3"],
name: "Проект X - команда"
)
→ conversationId
3. send_message(conversationId, "Привет, команда!")
3. Создать канал
create_conversation(
type: "channel",
name: "production-news",
description: "Новости производства",
isPrivate: false, // true — только по приглашению
userIds: ["..."] // начальные участники (optional)
)
4. Прочитать последние сообщения
list_messages(conversationId, limit: 50)
→ массив сообщений (новые сверху)
5. Пагинация — более старые
# Первая страница:
list_messages(conversationId, limit: 50)
→ последнее сообщение id = "msg_xxx"
# Следующая (ещё старее):
list_messages(conversationId, limit: 50, before: "msg_xxx")
6. Сводка непрочитанных
get_unread_summary
Возвращает:
{
"totalUnread": 17,
"conversations": [
{"conversationId": "...", "name": "Проект X", "type": "group_dm", "unreadCount": 8},
...
]
}
Отсортировано по unreadCount убыв. — первые самые «горящие».
7. Поиск по тексту
search_messages(query: "договор", limit: 20)
→ массив сообщений из всех чатов, где вы участник
Ограничить поиск одним чатом:
search_messages(query: "срок", conversationId: "...")
8. Добавить участников в группу
add_conversation_participants(
conversationId: "...",
userIds: ["uid1", "uid2"]
)
Работает для group_dm и channel. Для dm нельзя — только 2 участника.
9. Отправить с файлом
1. Прочитать файл локально и закодировать в base64
2. upload_message_file(
conversationId,
fileName: "contract.pdf",
mimeType: "application/pdf",
base64Content: "<base64>"
) → attachmentId
3. send_message(
conversationId,
content: "Вот договор",
attachmentIds: [attachmentId]
)
Лимит: ~20 МБ на файл.
Важные нюансы
Socket.io + push
send_message автоматически:
- Создаёт сообщение в БД
- Эмитит socket event в комнату беседы
- Отправляет push-уведомления участникам (fire-and-forget)
Сообщение сразу видно всем участникам в UI в реальном времени.
Типы сообщений
message.type:
text— обычноеfile— с прикреплёнными файлами (ставится автоматически приattachmentIds)system— системное (создание чата, добавление участников)bot— от ботаcall— звонок (метаданные вmetadata)
Через MCP отправляются только text и file.
Непрочитанные
MCP не отмечает сообщения как прочитанные автоматически. Если прочитал через list_messages — счётчик не изменится. Для отметки прочитанным — только UI.
Поиск — ilike по содержимому
search_messages использует ILIKE '%query%' по messages.content. Не fuzzy, не морфология — точное вхождение. Для русского может потребоваться попробовать разные формы слова.
Права доступа к беседам
dm,group_dm— видны только участникамchannel public— все в оргеchannel private— только приглашённые- Все операции проверяют
conversationMembers
Типичные ошибки
| Ошибка | Причина |
|---|---|
targetUserId is required for dm type |
Забыл targetUserId в create_conversation для dm |
userIds is required for group_dm type |
Забыл userIds для group_dm |
name is required for channel type |
Забыл name для канала |
You are not a member of this conversation |
Нет доступа к беседе |
File too large |
> 20 МБ в upload_message_file |
Связь с другими скиллами
aatex-files— работа с файлами в сообщенияхaatex-cards—list_usersдля поиска получателя (тот же инструмент)
Пример диалога
Пользователь: «Напиши Петру в личку, что заказ №42 готов»
1. list_users(search="Пётр")
→ [{id: "uid_petr", name: "Пётр Петров"}, ...]
2. create_conversation(type: "dm", targetUserId: "uid_petr")
→ { id: "conv_abc", type: "dm", ... } (или существующая)
3. send_message(
conversationId: "conv_abc",
content: "Пётр, заказ №42 готов ✓"
)
→ отправлено