파이썬으로 AI 슬랙봇 만들기 - Claude API + Slack Bolt 완전 가이드
파이썬으로 AI 슬랙봇 만들기 - Claude API + Slack Bolt 완전 가이드
2026년 4월 기준 | AI 개발 가이드
요약: 파이썬 Slack Bolt 프레임워크와 Claude API를 연동해 실무에서 바로 쓸 수 있는 AI 슬랙봇을 만듭니다. 멘션 응답, 스레드 대화 기억, 파일 요약, 슬래시 커맨드까지 구현한 실전 예제입니다.
왜 슬랙봇인가
팀에 AI를 도입할 때 가장 진입 장벽이 낮은 형태가 슬랙봇입니다. 별도 UI를 만들지 않아도 되고, 팀원들이 이미 쓰는 도구 안에서 동작하며, 필요한 사람만 호출하는 구조입니다. 사내 FAQ, 회의록 요약, 번역, 문서 검색 같은 업무에 즉시 가치를 줍니다.
이 글에서는 Slack의 공식 파이썬 프레임워크인 Bolt와 Claude API를 연결해 한 시간 안에 쓸 만한 봇을 만드는 전 과정을 담았습니다.
Slack 앱 생성과 권한 설정
api.slack.com/apps 에서 새 앱을 만들고 다음 권한(OAuth Scopes)을 부여합니다.
app_mentions:read— 봇이 멘션된 메시지 읽기chat:write— 메시지 보내기channels:history— 채널 이력 읽기files:read— 업로드된 파일 접근commands— 슬래시 커맨드
Event Subscriptions에서 app_mention, message.channels 이벤트를 구독합니다. Socket Mode를 활성화하면 퍼블릭 URL 없이도 로컬에서 개발할 수 있어 편합니다.
파이썬 환경 준비
pip install slack-bolt anthropic python-dotenv httpx
.env 파일에 토큰 3종을 저장합니다.
SLACK_BOT_TOKEN=xoxb-xxxxx
SLACK_APP_TOKEN=xapp-xxxxx
ANTHROPIC_API_KEY=sk-ant-xxxxx
기본 멘션 응답 봇
봇이 멘션되면 Claude에게 물어보고 답하는 가장 단순한 형태부터 시작합니다.
import os
import re
from dotenv import load_dotenv
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
from anthropic import Anthropic
load_dotenv()
app = App(token=os.environ["SLACK_BOT_TOKEN"])
claude = Anthropic()
def ask_claude(prompt: str) -> str:
response = claude.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return response.content[0].text
@app.event("app_mention")
def handle_mention(event, say):
text = re.sub(r"<@\w+>", "", event["text"]).strip()
answer = ask_claude(text)
say(text=answer, thread_ts=event["ts"])
if __name__ == "__main__":
SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()
이 40줄짜리 코드만으로도 "@봇 오늘 서울 날씨 대충 어떤지 알려줘" 같은 질문에 바로 답하는 봇이 동작합니다. 스레드로 답해(thread_ts) 채널이 지저분해지지 않도록 했습니다.
스레드 대화 기억하기
진짜 유용하려면 "이전 메시지를 기억"해야 합니다. Slack 스레드의 기존 메시지를 모두 읽어 Claude에게 컨텍스트로 넘기는 구조로 확장합니다.
def get_thread_history(client, channel, thread_ts):
result = client.conversations_replies(channel=channel, ts=thread_ts)
messages = []
for m in result["messages"]:
role = "assistant" if m.get("bot_id") else "user"
content = re.sub(r"<@\w+>", "", m["text"]).strip()
if content:
messages.append({"role": role, "content": content})
return messages
@app.event("app_mention")
def handle_mention(event, client, say):
thread_ts = event.get("thread_ts", event["ts"])
history = get_thread_history(client, event["channel"], thread_ts)
response = claude.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system="너는 팀 슬랙봇이다. 한국어로 간결하게 답하라.",
messages=history,
)
say(text=response.content[0].text, thread_ts=thread_ts)
이제 스레드 안에서 "아까 말한 방법 말고 다른 방법은?" 같은 연속 질문도 이해합니다.
업로드된 파일 요약 기능
팀원이 PDF, 회의록, 이미지를 올리고 봇을 멘션하면 그 파일을 요약하게 만듭니다. 이 기능 하나만 있어도 팀 생산성이 체감될 정도로 바뀝니다.
import httpx
import base64
def download_file(url, bot_token):
headers = {"Authorization": f"Bearer {bot_token}"}
return httpx.get(url, headers=headers).content
@app.event("app_mention")
def handle_mention_with_file(event, client, say):
thread_ts = event.get("thread_ts", event["ts"])
text = re.sub(r"<@\w+>", "", event["text"]).strip()
files = event.get("files", [])
content = [{"type": "text", "text": text or "이 파일을 요약해줘"}]
for f in files:
if f["mimetype"].startswith("image/"):
data = download_file(f["url_private"], os.environ["SLACK_BOT_TOKEN"])
content.append({
"type": "image",
"source": {
"type": "base64",
"media_type": f["mimetype"],
"data": base64.b64encode(data).decode(),
},
})
response = claude.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[{"role": "user", "content": content}],
)
say(text=response.content[0].text, thread_ts=thread_ts)
PDF는 Claude의 document 블록 타입을 쓰면 별도 파싱 없이도 이해합니다. 이미지는 base64 인코딩만 하면 곧장 비전 분석이 가능합니다.
슬래시 커맨드 추가
/요약, /번역 같은 전용 커맨드를 추가해 UX를 개선합니다. Slack 앱 설정에서 슬래시 커맨드를 등록한 뒤 다음 핸들러를 추가합니다.
@app.command("/번역")
def translate_command(ack, command, respond):
ack()
text = command["text"]
prompt = f"다음 문장을 한국어로 자연스럽게 번역:\n\n{text}"
result = ask_claude(prompt)
respond(text=result, response_type="in_channel")
응답이 3초 이상 걸리는 경우 ack()를 즉시 부르고, 결과는 respond()로 비동기 전송하는 것이 권장됩니다.
배포 전략
- 개발 단계: Socket Mode + 로컬 파이썬 실행
- 소규모 운영: Railway, Fly.io, Render의 무료/저가 인스턴스
- 사내 운영: AWS ECS / Google Cloud Run / 사내 쿠버네티스
중요한 점은 중복 이벤트 처리입니다. Slack은 3초 내 응답이 없으면 재전송하므로, 이벤트 ID로 중복 처리 여부를 Redis나 DB에 기록해두면 안전합니다.
마무리
100줄도 안 되는 코드로 팀이 즐겨 쓰는 AI 슬랙봇이 완성됩니다. 본문 예제는 샘플이지만, 여기서 확장할 수 있는 방향은 무궁무진합니다. 회의록 자동 요약, JIRA 이슈 생성, 내부 위키 RAG 검색, 일정 요약 등 팀의 반복 업무를 하나씩 봇에 위임해보세요.
다음 글에서는 이 봇에 RAG(사내 문서 검색)를 붙이는 방법과, Slack 대화 이력을 벡터 DB에 쌓아 "우리 팀이 예전에 이 문제를 어떻게 해결했지?"에 답하는 조직 메모리 봇을 만드는 법을 다루겠습니다.