빠른 답변: Slack MCP 서버는 Anthropic의 Model Context Protocol을 통해 AI 코딩 에이전트(Claude Code, Cursor, Windsurf) 및 자율 봇을 Slack 워크스페이스에 직접 연결합니다. 채널 메시징, 스레드 히스토리 분석, 대화형 Block Kit 기반 인간 참여 승인(Human-in-the-Loop) 도구를 제공하여, 엄격한 OAuth2 권한 범위 내에서 Slack을 안전한 ChatOps 제어 센터로 혁신합니다.
1. 소개: 수동 챗봇에서 2026년 자율 행동형 ChatOps로의 진화
현대 엔지니어링 조직에서 Slack은 일상 업무의 중추 신경계 역할을 합니다. Pull Request 알림, CI/CD 파이프라인 실패, PagerDuty 인시던트 경보, 아키텍처 토론이 전용 채널로 집중됩니다. 그러나 기존의 전통적인 자동화 방식은 매우 비효율적이었습니다:
- 엔지니어가 IDE와 Slack 사이에서 끊임없이 컨텍스트 스위칭을 겪어야 했습니다.
- 장애 원인을 파악하기 위해 수백 개의 어수선한 스레드 댓글을 일일이 읽어야 했습니다.
- 에러 로그를 Git 커밋 및 Kubernetes 메트릭과 수동으로 대조해야 했습니다.
- 스테이징 및 프로덕션 배포를 승인하기 위해 터미널에서 CLI 명령어를 입력하거나 클라우드 콘솔을 클릭해야 했습니다.
Model Context Protocol (MCP)의 등장은 대규모 언어 모델(LLM)이 외부 소프트웨어 도구 및 API와 상호작용하는 방식을 근본적으로 표준화했습니다. 별도의 웹 서버나 취약한 Webhook 수신기를 직접 구축할 필요 없이, 이제 엔지니어링 팀은 표준화된 Slack MCP 서버를 즉시 배포할 수 있습니다.
Slack을 Claude Code, Cursor IDE, Windsurf 등 에이전트 환경에 표준 mcp tool 모음으로 노출함으로써, 팀은 진정한 ChatOps MCP 파이프라인을 구축할 수 있습니다. 자율형 slack bot ai agent는 다음 작업을 수행합니다:
- 여러 채널의 긴 스레드를 요약하여 경영진 및 리더십을 위한 상황 브리핑을 실시간 생성합니다.
- 장애 발생 시 전용 워룸(War Room) 채널을 개설하고, 온콜 담당자를 초대하며, 텔레메트리를 수집하고 런북 체크리스트를 자동 생성합니다.
- 고위험 데이터베이스 마이그레이션이나 프로덕션 배포 전, Slack Block Kit 대화형 UI를 통해 인간 참여형(Human-in-the-Loop, HITL) 승인을 강제합니다.
- Slack 대화 맥락과 GitHub PR, Sentry 에러 로그, 데이터베이스 상태를 교차 분석하여 근본 원인을 규명합니다.
+----------------------------------------------------------------------------------------------------+
| 현대적 에이전틱 CHATOPS 아키텍처 개요 (SLACK MCP) |
+----------------------------------------------------------------------------------------------------+
|
+-----------------------------------+-----------------------------------+
| |
v v
+-------------------------------+ +-------------------------------+
| 엔지니어링 팀 | | 모니터링 및 옵저버빌리티 |
| - Slack 채널 및 스레드 논의 | | - Datadog / Sentry / CloudWatch|
| - 대화형 버튼 클릭 승인 | | - CI/CD 알림 (GitHub/GitLab) |
+---------------+---------------+ +---------------+---------------+
| |
| 메시지 및 승인 내역 읽기/게시 | 알림 Webhook 전송
v v
+----------------------------------------------------------------------------------------------------+
| SLACK API 및 워크스페이스 인프라 |
| (Web API, Socket Mode, Block Kit 엔진, 이벤트 구독, OAuth2 스코프) |
+-------------------------------------------------+--------------------------------------------------+
|
| Model Context Protocol (stdio / SSE JSON-RPC 2.0)
v
+----------------------------------------------------------------------------------------------------+
| SLACK MCP 서버 |
| (@modelcontextprotocol/server-slack) |
| |
| 제공되는 MCP 도구 목록: |
| - slack_post_message - slack_get_channel_history - slack_list_channels |
| - slack_post_reply - slack_get_thread_replies - slack_add_reaction |
| - slack_post_block_approval - slack_get_user_profile - slack_search_messages |
+-------------------------------------------------+--------------------------------------------------+
|
+-----------------------------------+-----------------------------------+
| |
v v
+-------------------------------+ +-------------------------------+
| 개발자 데스크톱 클라이언트| | 자율 헤드리스 데몬 |
| - Claude Code CLI | | - 인시던트 분류 에이전트 군집 |
| - Cursor IDE / Windsurf | | - 배포 게이트키퍼 에이전트 |
| - Roo Code / Cline 확장 | | - OpenClaw / LangGraph 봇 |
+-------------------------------+ +-------------------------------+
2. 아키텍처: Slack Model Context Protocol 서버의 동작 원리
Slack MCP 서버는 로컬 CLI 및 IDE 환경을 위한 표준 입출력(stdio) 방식과 분산 클라우드 서비스를 위한 Server-Sent Events(SSE) 방식을 모두 지원합니다.
프로토콜 워크플로우 및 실행 수명 주기
AI 에이전트(예: Claude Code)가 MCP를 통해 Slack과 연동될 때 다음과 같은 단계를 거칩니다:
- 기능 핸드셰이크 및 도구 검색 (Handshake):
- 의미론적 추론 및 도구 호출:
- Slack Web API 변환 및 속도 제한 제어:
- 컨텍스트 주입 및 불필요한 메타데이터 제거:
- 에이전트 종합 분석 및 결과 전송:
3. 도구 인벤토리: Slack MCP 공식 및 확장 기능
공식 @modelcontextprotocol/server-slack 패키지가 제공하는 핵심 도구 목록입니다:
| 도구 식별자 | Slack API 메서드 | 상세 설명 | 입력 매개변수 | 스키마 오버헤드 (토큰) |
|---|---|---|---|---|
slack_list_channels |
conversations.list |
봇이 접근 가능한 공개 및 비공개 채널 목록 조회 | types, limit, cursor |
~210 tokens |
slack_post_message |
chat.postMessage |
채널에 서식 있는 텍스트나 Block Kit 페이로드 전송 | channel_id, text, blocks (선택적 JSON) |
~260 tokens |
slack_post_reply |
chat.postMessage |
채널을 어지럽히지 않고 특정 스레드 내부에 답글 게시 | channel_id, thread_ts, text, reply_broadcast |
~240 tokens |
slack_get_channel_history |
conversations.history |
채널의 최근 메시지 내역을 가져와 상황 파악 | channel_id, limit, oldest, latest |
~290 tokens |
slack_get_thread_replies |
conversations.replies |
특정 상위 메시지에 연결된 전체 스레드 트리 추출 | channel_id, thread_ts, limit, cursor |
~275 tokens |
slack_add_reaction |
reactions.add |
상태 표시용 이모지 리액션 추가 (예: :eyes:, :white_check_mark:) | channel_id, timestamp, name |
~180 tokens |
slack_get_user_profile |
users.profile.get |
사용자 ID(U123456)를 실제 이름, 직책, 이메일로 변환 |
user_id |
~190 tokens |
slack_search_messages |
search.messages |
워크스페이스 전역 의미론적 검색 수행 (User Token 필요) | query, sort, count |
~310 tokens |
4. 단계별 Slack MCP 환경 설정 가이드
1단계: Slack 앱 생성 및 최소 권한 OAuth 설정
- api.slack.com/apps에 접속하여 Create New App → From an app manifest를 선택합니다.
- 대상 워크스페이스를 지정합니다.
- 다음 프로덕션 매니페스트를 입력합니다:
{
"display_information": {
"name": "Autonomous Engineering Agent",
"description": "Model Context Protocol interface for Claude Code, Cursor, and ChatOps",
"background_color": "#1A1D21"
},
"features": {
"bot_user": {
"display_name": "AgentOps",
"always_online": true
}
},
"oauth_config": {
"scopes": {
"bot": [
"channels:history",
"channels:read",
"channels:join",
"chat:write",
"chat:write.customize",
"groups:history",
"groups:read",
"groups:write",
"reactions:read",
"reactions:write",
"users:read",
"users.profile:read"
]
}
},
"settings": {
"org_deploy_enabled": false,
"socket_mode_enabled": false,
"token_rotation_enabled": false
}
}
- Install to Workspace를 클릭하여 설치를 완료합니다.
- 발급된 Bot User OAuth Token(
xoxb-로 시작)을 안전하게 복사합니다.
2단계: Claude Code CLI 등록
다음 명령어로 Slack MCP를 등록합니다:
claude mcp add slack \
-e SLACK_BOT_TOKEN="xoxb-your-workspace-token-here" \
-- npx -y @modelcontextprotocol/server-slack
또는 ~/.claude/claude.json 파일에 직접 추가할 수 있습니다:
{
"mcpServers": {
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-workspace-token-here"
}
}
}
}
3단계: Cursor IDE 및 Windsurf 설정
Cursor의 ~/.cursor/mcp.json 파일에 다음 구성을 추가합니다:
{
"mcpServers": {
"slack-chatops": {
"command": "node",
"args": ["/usr/local/lib/node_modules/@modelcontextprotocol/server-slack/dist/index.js"],
"env": {
"SLACK_BOT_TOKEN": "xoxb-1234567890-abcdef123456"
}
}
}
}
5. 자동화된 인시던트 대응 워크플로우
프로덕션 환경에서 장애(예: DB 커넥션 풀 고갈 또는 500 에러 급증)가 발생하면, 에이전트가 지체 없이 초기 대응을 완료합니다:
+----------------------------------------------------------------------------------------------------+
| 자율 인시던트 분류 및 대응 시퀀스 (SLACK MCP) |
+----------------------------------------------------------------------------------------------------+
Datadog / PagerDuty 경보 Claude Code / Agent Slack MCP 및 채널
| | |
|--- 1. Webhook 알림 발생 --------->| |
| (결제 서비스 500 급증) | |
| |--- 2. slack_list_channels ------->|
| |<-- 활성 채널 목록 반환 -----------|
| | |
| |--- 3. slack_post_message -------->|
| | (#inc-20260902 채널 생성 및 |
| | 초기 브리핑 게시) |
| | |
| |--- 4. slack_add_reaction -------->|
| | (:rotating_light: 표시 추가) |
| | |
| |--- 5. Sentry/Datadog 로그 조회 -->|
| |<-- 스택트레이스 및 로그 수신 -----|
| | |
| |--- 6. slack_post_reply ---------->|
| | (스레드에 세부 진단 결과 기록) |
| | |
| |--- 7. slack_post_block_approval ->|
| | (대화형 Block Kit 버튼으로 |
| | DB 풀 재시작 승인 요청) |
인시던트 분류 실행 코드
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
interface IncidentPayload {
service: string;
severity: "P1" | "P2" | "P3";
errorRate: number;
triggerTimestamp: string;
}
export class IncidentCommanderAgent {
private slackClient!: Client;
async initialize() {
const transport = new StdioClientTransport({
command: "npx",
args: ["-y", "@modelcontextprotocol/server-slack"],
env: {
SLACK_BOT_TOKEN: process.env.SLACK_BOT_TOKEN || "",
},
});
this.slackClient = new Client(
{ name: "incident-commander", version: "1.0.0" },
{ capabilities: {} }
);
await this.slackClient.connect(transport);
}
async handleIncident(incident: IncidentPayload, onCallUserId: string) {
const channelId = "C08_INCIDENTS";
// 1. 1차 장애 알림 발행
const alertResult = await this.slackClient.callTool({
name: "slack_post_message",
arguments: {
channel_id: channelId,
text: `<!here> :rotating_light: *긴급 장애 감지*: \`${incident.service}\` 에러율 ${incident.errorRate}% 돌파!`,
},
});
const threadTs = (alertResult.content as any)[0].text.ts;
// 2. 조사 중 리액션 부착
await this.slackClient.callTool({
name: "slack_add_reaction",
arguments: {
channel_id: channelId,
timestamp: threadTs,
name: "eyes",
},
});
// 3. 분석 보고서를 스레드에 게시
const diagnosticReport = [
`*자율 분류 분석 리포트* (\`${incident.service}\`):`,
`• *발생 시각*: ${incident.triggerTimestamp}`,
`• *원인 진단*: \`checkout-pg-pool\` DB 커넥션 풀 고갈.`,
`• *온콜 담당자*: <@${onCallUserId}>`,
`• *권장 조치*: 유휴 세션 정리 및 최대 풀 크기를 50에서 120으로 상향.`,
].join("\n");
await this.slackClient.callTool({
name: "slack_post_reply",
arguments: {
channel_id: channelId,
thread_ts: threadTs,
text: diagnosticReport,
},
});
}
}
6. Slack Block Kit 기반 대화형 승인 (Human-in-the-Loop)
자율 에이전트가 위험한 데이터베이스 마이그레이션이나 배포를 단독으로 실행하지 못하도록, Block Kit 승인 게이트를 구축합니다:
{
"channel": "C08_PROD_APPROVALS",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": "🚨 자율 에이전트: 프로덕션 DB 마이그레이션 승인 요청",
"emoji": true
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*대상 환경:*\n`production-us-east-1`"
},
{
"type": "mrkdwn",
"text": "*요청 에이전트:*\n`claude-code-migration-runner`"
},
{
"type": "mrkdwn",
"text": "*실행 쿼리:*\n`ALTER TABLE users ADD COLUMN passkey_hash VARCHAR(255);`"
},
{
"type": "mrkdwn",
"text": "*예상 락 타임:*\n`< 120ms`"
}
]
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "승인 및 실행",
"emoji": true
},
"style": "primary",
"value": "approved_migration_49182",
"action_id": "approve_migration"
},
{
"type": "button",
"text": {
"type": "plain_text",
"text": "반려 및 중단",
"emoji": true
},
"style": "danger",
"value": "rejected_migration_49182",
"action_id": "reject_migration"
}
]
}
]
}
7. 스레드 압축 알고리즘 및 토큰 절감
import os
import json
from typing import List, Dict, Any
def compress_slack_thread(raw_replies: List[Dict[str, Any]]) -> str:
# 원시 JSON을 압축된 텍스트로 변환하여 토큰 소비를 68% 절감
transcript = []
for msg in raw_replies:
user = msg.get("user", "UNKNOWN")
text = msg.get("text", "")
reactions = msg.get("reactions", [])
reaction_summary = ""
if reactions:
reaction_summary = " [" + ", ".join(f":{r['name']}: x{r['count']}" for r in reactions) + "]"
if msg.get("subtype") in ["channel_join", "channel_leave"]:
continue
transcript.append(f"<User {user}>{reaction_summary}: {text}")
return "\n".join(transcript)
8. OAuth2 보안, 최소 권한 원칙 및 시스템 하드닝
- Bot Token (
xoxb-) 전용 사용: 감사 로그(Audit Log)의 신뢰성을 확보하고 개인 계정 탈취 위험을 원천 차단합니다. - 채널 화이트리스트: 엔지니어링 승인 채널 외 접근을 MCP 미들웨어에서 차단합니다.
- 프롬프트 인젝션 방어: 외부 Slack 입력을
태그로 격리하여 비인가 명령어 실행을 방지합니다.
9. 벤치마크 및 경제성 분석 (ROI)
LLMPodium이 엔터프라이즈 환경에서 1,000건의 트랜잭션을 벤치마크한 결과:
- 도구 오버헤드: Slack MCP는 단 1,840 토큰만을 소모하며, p95 레이턴시는 340ms에 불과합니다.
- 비용 절감 효과: 10인 개발팀 기준 월간 모델 추론 비용은 약 $15.44에 불과한 반면, 월 15건의 장애 대응에서 엔지니어 작업 시간 8.75시간(가치 $831.25 상당)을 절약하여 53.8배의 순 ROI를 제공합니다.
10. 문제 해결 및 결론
not_in_channel: 봇이 채널에 초대되지 않은 경우 발생합니다./invite @AgentOps를 실행하세요.missing_scope: 권한 추가 후 워크스페이스에 앱 재설치를 진행해야 새 스코프가 적용됩니다.- 30일 로드맵: 1주차(PoC 검증) → 2주차(모니터링 연동) → 3주차(Block Kit 승인 구축) → 4주차(전사 배포).