Slack API集成服务

一个完整的Slack API集成MCP服务器,支持消息发送、文件上传、用户管理及时间管理功能,适用于团队协作和自动化任务。

  • by yeoamlog
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 yeoamlog/slack-mcp-server

使用说明

Slack MCP服务器-完整实施

📋 项目概述

使用FastMCP v2实现的完整Slack API集成MCP服务器。根据课题指南 4个必需功能, 4个可选功能,还有 奖励波莫多4个计时器功能已全部实施。

🎯 主要功能

  • ✅ 完全UTF-8韩文支持 -在所有消息中完全支持韩文
  • ✅ 双令牌系统 -通过Bot Token+User Token支持所有功能
  • ✅ 上载智能文件 -根据大小自动选择最佳上传方式
  • ✅ 波莫多罗计时器 -具有自动通知功能的时间管理工具
  • ✅ 异步处理 -基于asyncio的高性能实施
  • ✅ 详细的错误处理 -对所有API调用进行适当的异常处理

🚀 功能列表

🔴 必需功能(4个)

  1. send_slack_message -发送消息

    • 向通道或DM发送消息
    • 主题回复支持
    • 完全UTF-8韩文支持
  2. get_slack_channels -查看频道列表

    • 区分公开/非公开渠道
    • 检查成员资格状态
    • 过滤存档的频道
  3. get_slack_channel_history -查看消息历史记录

    • 从最新消息开始查看
    • 可指定时间范围
    • 包含消息元数据
  4. send_slack_direct_message -DM传输

    • 向特定用户发送1:1消息
    • 自动创建DM通道
    • 过滤机器人用户

🟡 可选功能(Optional Features-4个)

  1. get_slack_users -查看用户列表

    • 按用户类型分类(管理员、成员、来宾、机器人)
    • 启用DM的用户筛选
    • 详细配置文件信息
  2. search_slack_messages -搜索消息(需要User Token)

    • 基于关键字的整个工作空间搜索
    • 排序和过滤选项
    • 搜索结果元数据
  3. upload_file_to_slack -上载智能文件

    • 按文件大小优化上载方式
    • 支持多种文件格式
    • 自动预览和代码加亮
  4. add_slack_reaction -添加消息响应

    • 添加姨妈反应
    • 支持多种表情格式

🟢 奖励功能(Bonus Features-4个)

  1. start_pomodoro_timer -以波莫多开始计时器

    • 5种计时器类型(study,work,break,meeting,custom)
    • 自动启动/关闭通知
    • 自定义时间和消息
  2. cancel_pomodoro_timer -取消计时器

    • 立即停止运行的计时器
    • 发送取消通知
  3. list_active_timers -活动计时器列表

    • 当前运行的所有计时器
    • 显示进度和剩余时间
  4. get_timer_status -查看计时器状态

    • 特定计时器的详细状态
    • 实时进度

🛠️ 实用程序功能

  1. test_slack_connection -测试连接
  2. get_workspace_info -关于工作空间
  3. get_file_preview -预览文件
  4. verify_or_create_file -确认/创建文件

📦 如何安装和运行

1.项目初始化

# 프로젝트 클론 또는 다운로드 후
cd slack-mcp

# uv 패키지 매니저 설치 (없는 경우)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 가상환경 생성 및 활성화
uv venv
source .venv/bin/activate  # Linux/macOS
# .venv\Scripts\activate  # Windows

# 의존성 설치
uv sync
# 또는
uv pip install -r requirements.txt

2.设置环境变量

.env 创建文件并将其设置为:

# 필수: Slack Bot Token (xoxb-로 시작)
SLACK_BOT_TOKEN=xoxb-your-bot-token-here

# 선택: Slack User Token (xoxp-로 시작) - 검색, 파일업로드용
SLACK_USER_TOKEN=xoxp-your-user-token-here

# 선택: 기본 채널 ID (테스트용)
SLACK_TEST_CHANNEL_ID=C08UZKK9Q4R

# 선택: 로그 레벨
LOG_LEVEL=INFO

3.设置Slack App

需要Bot Token Scopes:

channels:read        # 채널 목록 조회
channels:history     # 채널 메시지 히스토리 조회
chat:write          # 메시지 전송
im:read             # DM 채널 읽기
im:write            # DM 메시지 전송
im:history          # DM 히스토리 조회
users:read          # 사용자 정보 조회
reactions:write     # 반응 추가

其他User Token Scopes(可选):

search:read         # 메시지 검색
files:write         # 파일 업로드

4.运行服务器

# MCP 서버 실행
python slack_mcp_server.py

# 또는 직접 실행
uv run slack_mcp_server.py

💡 用法和示例

发送默认消息

# Claude/LLM이 도구 호출 시
send_slack_message(
    channel="C08UZKK9Q4R", 
    text="안녕하세요! MCP에서 보내는 메시지입니다! 🚀"
)

上载文件(智能处理)

# 다양한 크기의 파일을 자동으로 최적 방식으로 업로드
upload_file_to_slack(
    file_path="./report.pdf",
    channels="C08UZKK9Q4R",
    title="분석 보고서",
    comment="월간 데이터 분석 결과입니다."
)

使用POMODO计时器

# 수업 타이머 시작 (50분)
start_pomodoro_timer(
    timer_type="study",
    channel_id="C08UZKK9Q4R",
    duration_minutes=50,
    custom_name="파이썬 고급 문법 학습"
)

# 활성 타이머 확인
list_active_timers()

# 타이머 취소
cancel_pomodoro_timer("study_20250602_143022_123456")

搜索消息(需要User Token)

# 워크스페이스 전체에서 메시지 검색
search_slack_messages(
    query="MCP 서버",
    count=10,
    sort="timestamp"
)

🏗️ 项目结构

slack-mcp/
├── .env                     # 환경 변수 (Git 제외)
├── .env.example            # 환경 변수 템플릿
├── .gitignore              # Git 무시 파일
├── README.md               # 이 파일
├── requirements.txt        # 의존성 목록
├── pyproject.toml         # 프로젝트 설정
├── slack_api_client.py    # Slack API 클라이언트 (핵심 모듈)
├── pomodoro_timer.py      # 뽀모도로 타이머 모듈
└── slack_mcp_server.py    # FastMCP 서버 메인

🔧 技术实施详细信息

双令牌系统

  • 机器人令牌(xoxb-):典型的机器人功能(发送消息、查看频道等)
  • 用户令牌(xoxp-):需要用户权限的功能(搜索、上载大型文件)

智能文件上传策略

  1. 小文本文件(<50KB):直接发送到消息内容
  2. 中间文件(50KB-1MB):上传到代码段
  3. 常规文件(1MB-100MB):上载标准文件
  4. 大文件(100MB-1GB):上传到User Token
  5. 超大文件(>1GB):仅共享文件信息

异步和并发

  • asyncio 实现基于的完全异步
  • 支持以POMODORO并行运行计时器
  • 通过锁定确保客户端初始化的安全性

UTF-8韩文支持

headers = {
    'Content-Type': 'application/json; charset=utf-8'
}

🐛 开发过程中遇到的困难和解决方法

1.函数之间的Input变量名难以统一

问题:每个API函数的参数名称不同,不一致

  • channel 兽医 channel_id 兽医 channels
  • text 兽医 message 兽医 content

解决方案:

  • Slack API基于官方文档统一变量名(未来将更新)
  • 在内部函数中应用一致的命名约定
  • 向docstring添加明确的参数说明
async def send_message(
    self, 
    channel: str,      # 가능한 부분들은 channel 로 통일 예정
    text: str,         # 통일: text
    thread_ts: Optional[str] = None
) -> Dict[str, Any]:

2.难以找到Input-Output变量名

问题:Slack API响应的复杂嵌套结构难以提取所需数据

解决方案:

  • 通过日志输出API响应来确定结构
  • 创建通用数据提取函数
  • 规范化和格式化响应数据
# 응답 데이터 정규화 예시
formatted_messages.append({
    'text': msg.get('text', ''),
    'user': msg.get('user', 'Unknown'),
    'timestamp': readable_time,
    'ts': msg.get('ts', ''),
    # ... 필요한 필드만 추출
})

3.在使用最新版本的Outdated file_upload函数之前,犯了很多错误

问题:Slack的文件上传API多次更改,以传统方式deprecated

解决方案:

  • files.upload (已弃用)→ files.getUploadURLExternal + files.completeUploadExternal
  • Slack SDK与现有REST API的混合方法
  • 实施不同文件大小的上载策略
# 새로운 파일 업로드 플로우
# 1. 업로드 URL 요청
upload_response = await self._make_request('files.getUploadURLExternal', 'POST', upload_data)

# 2. 외부 URL로 파일 업로드
async with self._session.put(upload_url, data=file_content) as response:
    # 파일 업로드

# 3. 업로드 완료 처리
complete_response = await self._make_request('files.completeUploadExternal', 'POST', complete_data)

4.需要User Token时,仅通过vs Bot Token解决;

问题:很难确定哪些功能需要哪些令牌

解决方案:

  • 按功能明确分类令牌要求
  • 自动选择双令牌系统
  • 代币不足时的明确提示信息
# Bot Token으로 가능한 기능
- 메시지 전송 (chat.postMessage)
- 채널 목록 (conversations.list)
- 사용자 목록 (users.list)
- 파일 업로드 (< 100MB)

# User Token이 필요한 기능  
- 메시지 검색 (search.messages)
- 대용량 파일 업로드 (> 100MB)

5.GET与POST的区别

问题:何时使用GET,何时使用POST,令人困惑

解决方案:

  • 正确检查Slack API文档中的HTTP方法
  • 数据查询GET,数据生成/修改POST
  • 统一的 _make_request 作为函数处理
# GET: 데이터 조회
await self._make_request('conversations.list', 'GET', params)
await self._make_request('users.list', 'GET', params)

# POST: 데이터 생성/수정
await self._make_request('chat.postMessage', 'POST', data)
await self._make_request('files.getUploadURLExternal', 'POST', data)

6.其他解决的问题

  • 速率限制:指数回退和重试逻辑
  • 错误处理:针对每个错误代码提出自定义解决方案
  • UTF-8编码:完全支持韩文信息
  • 异步安全:使用POMODO处理计时器的同时运行

📊 性能和限制

文件上传限制

  • 免费计划:高达5GB的工作空间存储
  • 单个文件:最高1GB(在付费计划中)
  • 机器人令牌:上传高达100MB的文件
  • 用户令牌:上传高达1GB的文件

API费率限制

  • 第1层方法:每分钟1+
  • 第2层方法:每分钟20+
  • 第3层方法:每分钟50+
  • 第4层方法:100+每分钟

🔍 测试方法

1.测试连接

# 서버 실행 후 Claude에서 테스트
test_slack_connection()

2.基本功能测试

# 채널 목록 조회
get_slack_channels()

# 메시지 전송 테스트  
send_slack_message("C08UZKK9Q4R", "테스트 메시지입니다! 🎉")

3.高级功能测试

# 파일 업로드 테스트
upload_file_to_slack("./test.txt", title="테스트 파일")

# 뽀모도로 타이머 테스트
start_pomodoro_timer("work", duration_minutes=25, custom_name="테스트 작업")

🤝 贡献方法

  1. 问题提示:使用GitHub Issues
  2. 功能建议:使用Feature Request模板
  3. 代码贡献:欢迎Pull Request
  4. 文档增强:README和docstring增强

📄 许可证

此项目符合MIT许可证。

🙋‍♂️ 联系和支持

  • 开发者:权俊赫
  • 版本:8.5.2(完整实施)
  • 上次更新: 2025-06-04

课题完成度:4个必须+4个选择+4个分享+4个分享+4个分享工具= 共实现16项功能

通过该项目,您可以构建可用于实际工作的高品质Slack集成工具! 🚀