slack-mcp и slack-cli: дай своему ИИ-ассистенту доступ к Slack на чтение
← Назад в блог

slack-mcp и slack-cli: дай своему ИИ-ассистенту доступ к Slack на чтение

Опубликовано
5 мин чтения
--- просмотров
slack-mcp — ИИ-ассистент ищет сообщения, треды и пользователей в Slack

Значительная часть контекста, который нужен ИИ-ассистенту, живёт в Slack — переписка за тикетом, обсуждение, объясняющее баг, тред, где реально было принято решение. Модель ничего этого не видит. Поэтому я написал пару инструментов, которые это исправляют: slack-mcp — сервер Model Context Protocol, и slack-cli — Go-инструмент командной строки, который его питает.

Вместе они дают твоему ИИ-ассистенту доступ к Slack на чтение — искать сообщения, разворачивать треды и выяснять, кто что сказал — и подтягивать этот реальный контекст прямо в его рабочую память.

Два репозитория, один инструмент

Это два бинарника, и это сделано намеренно:

  • slack-cli — это движок. Он аутентифицируется в Slack, шифрует и хранит учётные данные и делает реальные вызовы API — его можно использовать самостоятельно из терминала или скрипта.
  • slack-mcp — тонкий MCP-слой поверх него. Он выставляет те же возможности как MCP-инструменты через stdio, чтобы любой MCP-совместимый агент (Claude, Cursor и т.д.) мог их вызывать.

Такое разделение означает, что логика авторизации и работы со Slack живёт в одном хорошо протестированном месте, а MCP-сервер остаётся небольшим. Ты можешь управлять Slack из шелл-скрипта и из своего ИИ-ассистента с одними и теми же учётными данными.

MCP-инструменты

Сервер выставляет девять инструментов для чтения и авторизации. load_slack_context — главный из них:

ИнструментПараметрыОписание
search_messagesworkspace, query, count?, start_from?Искать сообщения по всем каналам — возвращает канал, автора, фрагмент, время, постоянную ссылку
load_slack_contextworkspace, channel_id, thread_ts, permalink?, channel_name?, search_query?, start_from?Основной инструмент — загружает тред со всеми разрешёнными пользователями, отформатированный как markdown
load_threadworkspace, channel_id, thread_ts, start_from?Загружает каждое сообщение в треде (сырые ID пользователей; пагинация до ~2000)
get_user_infoworkspace, user_idРазрешает ID пользователя в отображаемое имя
list_workspacesСписок воркспейсов с сохранёнными учётными данными
get_credentialsworkspaceПроверяет, существуют ли учётные данные (никогда не раскрывает токены)
auth_startworkspace?Открывает Slack + возвращает инструкции по извлечению токена
auth_completeworkspace, token, cookieПроверяет и сохраняет учётные данные
delete_credentialsworkspaceУдаляет сохранённые учётные данные

load_slack_context — это тот инструмент, вокруг которого я спроектировал всё остальное: дай ему канал и тред, и он вернёт полный разговор со всеми пользователями, разрешёнными в отображаемые имена, отформатированный как markdown — именно то, что хочет прочитать LLM. Никаких сырых ID вроде U01ABCD, никакого JSON-супа.

📅 start_from принимает дату в формате YYYY-MM-DD — возвращаются только сообщения на эту дату или позже. Работает с search_messages, load_thread и load_slack_context.

Команды CLI

Всё, что делает сервер, slack-cli выставляет напрямую — удобно для авторизации и для скриптинга:

КомандаПараметрыОписание
auth[workspace]Интерактивная авторизация — открывает браузер, запрашивает токен + cookie
auth-start[workspace]Выводит инструкции по извлечению через DevTools без сохранения
auth-complete<workspace> --token --cookieСохраняет учётные данные неинтерактивно
list-workspacesСписок всех сохранённых имён воркспейсов
get-credentials<workspace>Показывает, присутствуют ли токен + cookie
test-creds[workspace]Проверяет сохранённые учётные данные через Slack auth.test
remove-creds[workspace]Удаляет сохранённые учётные данные для воркспейса
show-credsВыводит путь к файлу учётных данных

Авторизация без Slack-приложения

Это та часть, которая делает всё это реально применимым. slack-cli авторизуется через токен браузерной сессии (xoxc-…) плюс cookie (xoxd-…) — не нужно регистрировать Slack-приложение, не нужно одобрение админа, не нужно выпрашивать OAuth-скоупы. Ты входишь в воркспейс, которым уже пользуешься, извлекаешь пару значений один раз — и готово.

slack-cli auth acme            # interactive — opens the browser, prompts for token + cookie
# or, non-interactively:
export SLACK_MCP_PASSPHRASE=your-passphrase-here
slack-cli auth-complete acme --token xoxc-... --cookie xoxd-...

Учётные данные шифруются в состоянии покоя с помощью пасфразы, считанной из SLACK_MCP_PASSPHRASE (или интерактивного запроса). Пасфраза, которой они были сохранены, должна совпадать с той, которой их читают — MCP-сервер использует ту же переменную окружения, так что агент расшифровывает данные и никогда не видит сырые токены в транскрипте.

Настройка

Предварительные требования

  • Go 1.26+ — для сборки или go install
  • slack-cli в твоём PATH (или укажи путь через SLACK_CLI_PATH=/abs/path/to/slack-cli) — это сопутствующий бинарник, который хранит учётные данные и вызывает Slack

Установка

# the CLI engine
go install github.com/artschekoff/slack-cli/cmd/slack-cli@latest

# the MCP server
go install github.com/artschekoff/slack-mcp/cmd/slack-mcp@latest

Оба также собираются из исходников через git clone … && make install.

Подключи его к своему MCP-клиенту

Добавь запись stdio-сервера — пасфраза указывается в env, чтобы учётные данные расшифровывались во время выполнения:

{
  "mcpServers": {
    "slack": {
      "type": "stdio",
      "command": "slack-mcp",
      "env": {
        "SLACK_MCP_PASSPHRASE": "your-passphrase"
      }
    }
  }
}

Или через Claude Code CLI:

claude mcp add slack --env SLACK_MCP_PASSPHRASE=your-passphrase -- slack-mcp

Почему только чтение и почему разделены бинарники

Я намеренно ограничил область применения чтением. Агент, который может постить в Slack от твоего имени, — это совсем другой, более пугающий профиль риска; агент, который может вытянуть контекст за тикетом, — просто полезен. Ограничение только чтением означает, что ты можешь передать это своему ассистенту, не переживая, что он напишет в канал.

Разделение CLI и MCP-сервера следует тому же принципу, что и мои другие MCP-инструменты — реальная работа в зрелом, тестируемом бинарнике, а затем обёртка ровно тех операций, которые нужны агенту, в тонком MCP-слое. Учётные данные остаются зашифрованными, токены никогда не попадают в транскрипт, и один и тот же движок обслуживает и твой шелл, и твоего ИИ-ассистента.

Оба проекта открыты на GitHub — slack-mcp и slack-cli — чистый Go, работающий через stdio. Issues и пул-реквесты приветствуются.

Открыт для работы по контракту

Я доступен для работы по контракту. Если у вас есть интересная идея проекта — запишитесь на звонок через Calendly.

Записаться на 30-минутный звонок