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-минутный звонок