使用说明
Slack MCP 服务器
🌐 韩语 | 英语
🤖 减少60%的Slack上AI Agent的费用
克劳德,将ChatGPT连接到Slack:
- 💰(钱的表情符号,可直译为“钱”或根据语境译为“金钱”、“钱财”等) 代币费用节省60% (350 → 135 个标记/消息)
- ⚡(闪电符号,常用于表示快速、活力或电) 搜索速度提升50倍 (FTS5 < 10毫秒)
- 🎯 目标(或“靶心”) 用自然语言控制Slack (频道、DM、线程全部)
💰 为什么要使用这个MCP服务器呢?
解决AI Agent的Slack成本问题
一般的Slack API响应充满了Block Kit结构、附件元数据等不必要的数据,导致AI代理的令牌成本急剧上升。
此MCP服务器已针对AI Agent进行了优化:
代币节省效果(估算值):
| 指标 | 一般 Slack API | Slack MCP 服务器 | 📈 改进效果 |
|---|---|---|---|
| 分隔线 | 标题1 | 标题2 | 标题3 |
| ** | ** 每用户令牌 ** | 约50个标记 | ** 约20个代币 🔥 60% 下降 |
| ** | ** 搜索速度 ** | API 调用 (~500ms) | ** 本地FTS5(<10毫秒) ** |
| ** | ** 1000条信息的费用 ** | 2.50美元(克劳德·莎士比亚) | ** 1.00美元(估计) ** |
|📊 计算依据
상세 비교 보기
Block Kit结构、附件元数据、移除空值+用户名自动转换,响应大小大幅减少。
{ "text": "Hello team!", "user": "U1234567890", "blocks": [{"type": "rich_text", "elements": [...]}], // ← 불필요 "attachments": [{"fallback": "..."}], // ← 불필요 "metadata": {"event_type": "..."}, // ← 불필요 "bot_id": "", // ← 빈 값 "app_id": null, // ← null // ... 기타 20+ 필드 }一般的Slack API响应(估计350个标记):
{ "text": "Hello team!", "user_id": "U1234567890", "user_name": "홍길동", // ← ID 대신 이름 (AI 친화적) "ts": "1234567890.123456", "timestamp": "2024-01-15T10:30:00Z" // blocks, attachments, 빈 값 모두 제거 }Slack MCP 服务器响应(估计135个标记): 结果:
节省约215个标记(减少约61%)
实际节省效果可能会根据信息复杂度的不同而有所差异。
- 怎么可能呢?
- ✅ 用户ID → 自动转换为姓名(便于AI理解)
- ✅ 移除 Block Kit 结构(复杂的 UI 数据)
- ✅ 移除附件元数据
- ✅ 线程信息优化(父级信息仅一次)
- ✅ 移除空字符串/空值✅ 使用SQLite FTS5本地缓存以最小化API调用(查看详情
)
💬 AI Agent能做的事情
👤 User: "Slack에서 'John'이라는 이름의 사용자를 찾아줘"
🤖 AI: *FTS5 로컬 캐시에서 밀리초 단위 검색*
"John Smith (@john.smith), John Doe (@j.doe) 2명을 찾았습니다."
👤 User: "#general 채널에 '팀 여러분 안녕하세요!' 메시지를 보내줘"
🤖 AI: *자동으로 채널 ID 변환 후 전송*
"메시지를 #general에 성공적으로 전송했습니다!"
👤 User: "최근 #dev-team 채널의 메시지 10개를 요약해줘"
🤖 AI: *메시지 읽기 + 사용자 이름 자동 변환 + 요약*
"지난 2시간 동안 3명이 버그 수정에 대해 논의했습니다:
- 홍길동: API 응답 시간 개선 제안
- 김철수: 데이터베이스 쿼리 최적화 완료
- 박영희: 테스트 케이스 추가 요청"
👤 User: "'마감일'이라는 단어가 포함된 메시지를 찾아줘"
🤖 AI: *워크스페이스 전체 검색*
"3개 채널에서 15개의 메시지를 찾았습니다..."
实际使用示例
🛠️ 8个强大工具
AI Agent可使用的工具:
send_message📨 消息(4条)get_channel_messages- 在频道、私信、线程中发送消息read_thread- 读取频道历史记录(支持分页)list_channel_members- 线程对话阅读(优化格式)
- 查看频道成员(包括详细信息)
search_users🔍 搜索(3个)search_channels- 用户搜索(FTS5 + 模糊匹配)search_messages- 频道搜索(所有类型)
- 搜索消息(整个工作区)
refresh_cache⚙️ 系统(1个)
- 手动刷新缓存
🎯 实际应用案例 您好奇AI Agent实际是如何使用的吗?
以下是实际的工作场景。
"#meeting 채널의 오늘 메시지를 3줄로 요약해줘"
→ 회의록 자동 생성
"#dev-team에서 'API'라는 단어가 포함된 최근 논의 찾아줘"
→ 기술 논의 추적
"@john이 어떤 프로젝트를 맡고 있는지 최근 메시지 보고 알려줘"
→ 팀원 업무 파악
团队合作🤝
"'환불'이라는 단어가 포함된 메시지를 모두 찾아줘"
→ 고객 이슈 검색
"#support 채널에서 '해결되지 않은' 상태의 대화 찾아줘"
→ 미해결 이슈 추적
"오늘 가장 많이 언급된 문제가 뭔지 분석해줘"
→ 고객 피드백 분석
客户支持 💬
매주 월요일 오전: "#weekly-report 채널에 지난 주 핵심 토픽 정리해서 올려줘"
→ 자동 주간 리포트
특정 키워드 감지 시: "'긴급'이라는 단어 나오면 @manager에게 DM 보내줘"
→ 실시간 알림 자동화
프로젝트 시작 시: "새 채널 만들고 팀원들 초대 후 킥오프 메시지 보내줘"
→ 워크플로우 자동화
自动化 🤖
# 1. 빌드
git clone https://github.com/junyeong-ai/mcp-slack && cd mcp-slack
cargo build --release
# 2. Slack 토큰 생성 (api.slack.com/apps)
# User Token Scopes 추가 후 xoxp- 토큰 복사
# 3. Claude Desktop 설정
# ~/.config/Claude/claude_desktop_config.json 또는
# ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
{
"mcpServers": {
"slack": {
"command": "/절대경로/mcp-slack/target/release/mcp-slack",
"env": { "SLACK_USER_TOKEN": "xoxp-your-token-here" }
}
}
}
# 4. Claude Desktop 재시작 → 완료! 🎉
⚡ 快速入门(1分钟) 💡 小贴士:xoxp-用户令牌(
建议使用它。相比机器人令牌,它可以使用更多功能。 👉 查看详细指南 |
解决问题
🚀 从第三步开始
- 先决条件
- Rust 1.90+(2024 版)
- Slack 工作区管理员权限
Claude Desktop 或 MCP 兼容客户端
git clone https://github.com/junyeong-ai/mcp-slack
cd mcp-slack
cargo build --release
# 빌드 완료! 바이너리 위치:
# target/release/mcp-slack
1️⃣ 安装(2分钟)
2️⃣ 创建Slack令牌(2分钟)
-
选项A:用户令牌(推荐)⭐ api.slack.com/apps(可翻译为):Slack API 应用页面 访问 → “创建新应用” →
-
“从零开始” 用户令牌作用域
channels:read channels:history groups:read groups:history im:read im:history mpim:read mpim:history users:read users:read.email chat:write search:read -
补充: “安装到工作区”
-
→ 安装到个人账户 用户OAuth令牌
xoxp-...复制(
(以“罗”开头)
-
选项B:机器人令牌(可选)
-
与上述相同创建应用 机器人令牌作用域
channels:read channels:history groups:read groups:history im:read im:history mpim:read mpim:history users:read users:read.email chat:write chat:write.public -
附加: “安装到工作区”
-
点击 机器人用户OAuth令牌
xoxb-...复制(
(以“罗”开头)
3️⃣ Claude Desktop 设置(1分钟)
- 设置文件位置:
~/Library/Application Support/Claude/claude_desktop_config.json - macOS:
%APPDATA%\Claude\claude_desktop_config.json - Windows:
~/.config/Claude/claude_desktop_config.json
Linux:
{
"mcpServers": {
"slack": {
"command": "/절대경로/mcp-slack/target/release/mcp-slack",
"env": {
"SLACK_USER_TOKEN": "xoxp-여기에-사용자-토큰-입력",
"LOG_LEVEL": "warn"
}
}
}
}
添加设置(建议使用用户令牌):
{
"mcpServers": {
"slack": {
"command": "/절대경로/mcp-slack/target/release/mcp-slack",
"env": {
"SLACK_BOT_TOKEN": "xoxb-여기에-봇-토큰-입력",
"LOG_LEVEL": "warn"
}
}
}
}
或者使用机器人令牌:⚠️ 重要 command: **(这是)是/属于/是...的(根据上下文可灵活翻译)**绝对路径~/ 请使用( /Users/username/...相反
) ✅ 完成!
重启Claude Desktop,然后向AI代理请求Slack任务试试。
🛠️ 工具详细指南
send_message 📨 消息工具
- 发送消息
AI Agent可以在频道、直接消息和线程中发送消息。
"#general 채널에 '회의 시작합니다' 메시지 보내줘"
"@john에게 DM으로 '안녕하세요' 보내줘"
"이 스레드에 '확인했습니다' 답장 보내줘"
使用示例:
参数:
| 参数 | 必填 | 说明 | 示例 |
|---------|------|------|------| channel | #general| ✅ | 频道名,ID,用户名 | C1234, @john ,
| text | "안녕하세요 *팀 여러분*" | ✅ | 消息内容(Slack Markdown) |
| thread_ts | "1234567890.123456" | ❌ | 线程时间戳 |
get_channel_messages |
- 阅读频道消息
获取频道的消息历史记录。AI代理能够理解并总结过去的对话。
"#dev-team 채널의 최근 메시지 20개 보여줘"
"#general의 오늘 메시지를 요약해줘"
使用示例:
参数:
| 参数 | 必填 | 默认值 | 说明 |
|---------|------|--------|------| channel |
| ✅ | - | 频道名或ID | limit |
| ❌ | 100 | 最多1,000个 | cursor |
| ❌ | - | 分页 |
{
"messages": [
{
"user_id": "U1234",
"user_name": "홍길동", // ← 자동 변환!
"text": "메시지 내용",
"ts": "1234567890.123456",
"timestamp": "2024-01-15T10:30:00Z"
}
],
"has_more": false
}
回答格式(令牌优化):
- 节省代币:
- ❌ 移除 Block Kit 结构
- ❌ 移除附件元数据
- ✅ 用户ID → 自动转换为姓名
read_thread ✅ 移除空值
- 阅读线程对话
获取完整的线程对话。仅提供一次父消息信息以节省令牌。
"이 메시지의 스레드를 모두 보여줘"
使用示例:
{
"thread_info": {
"parent_message": { /* 1회만 */ },
"reply_count": 5,
"channel": "C1234"
},
"messages": [
{ /* 답글 1 */ },
{ /* 답글 2 */ }
]
}
优化后的响应: 节省代币:
list_channel_members 通过消除父母信息重复,额外节省30%
- 查看频道成员
获取频道的所有成员及详细信息。
"#dev-team 채널에 누가 있는지 알려줘"
使用示例:
search_users 🔍 搜索工具
- 用户搜索FTS5专业搜索
以毫秒为单位来查找用户。
- 搜索对象:
- 用户名 (username)
- 显示名称(display_name)
- 实名(real_name)
电子邮件
"이메일에 'john'이 들어간 사용자 찾아줘"
"'김철수'라는 이름의 사람을 검색해줘"
使用示例:
参数:
| 参数 | 说明 | 默认值 |
|---------|------|--------| query |
| 搜索词 | (必填) | limit |
| 最大结果数 | 10 |
- 性能:
- 🔍 FTS5索引:通常少于10毫秒
- 🧠 模糊匹配:允许拼写错误
search_channels 💾 本地缓存:API 调用 0 次
- 频道搜索
搜索所有类型的频道(公开/非公开/直接消息/群组直接消息)。
"'dev'가 포함된 채널을 모두 찾아줘"
search_messages 使用示例:
- 搜索消息
在整个工作区中搜索消息。
"'마감일'이라는 단어가 포함된 메시지 찾아줘"
"#dev-team에서 'bug'를 검색해줘"
使用示例: SLACK_USER_TOKEN ⚠️ 要求: search:read (用户令牌) +
需要权限
refresh_cache ⚙️ 系统工具
- 刷新缓存
手动更新SQLite缓存。
"Slack 캐시를 새로 고침해줘"
使用示例:
scope参数:"users":"channels","all",
(默认值) 自动更新:
服务器启动时,如果缓存过期,则会自动更新(默认TTL:24小时)。
⚙️ 环境变量💡 重要 至少需要一个代币。
xoxp-用户令牌()建议
(进行)。
必需设置
| 变量 | 说明 | 示例 |
|------|------|------| SLACK_USER_TOKEN | xoxp-... ⭐ | 用户令牌(推荐) |
| SLACK_BOT_TOKEN | xoxb-... | 机器人令牌(替代) |
|
代币对比:
| 功能 | 用户令牌 ⭐ | 机器人令牌 |
|---|---|---|
| 频道访问 | ✅ 自动 | ⚠️ 需邀请 |
| 消息搜索 | ✅ 可行 | ❌ 不可行 |
| 发送者 | 用户本人 | 机器人账号 |
- 用户令牌生成: api.slack.com/应用(或“应用页面”)
- → “创建新应用” → “从头开始” “OAuth & 权限” 用户令牌作用域
channels:read channels:history groups:read groups:history im:read im:history mpim:read mpim:history users:read users:read.email chat:write search:read - 附加:
“安装到工作区”→ 复制令牌
推荐设置
| 变量 | 默认值 | 说明 |
|------|--------|------| LOG_LEVEL | warn |error| 日志级别 ( warn, info, debug,
) | DATA_PATH | ~/.mcp-slack |
🔧 고급 설정 (config.toml)
| SQLite 缓存存储位置 |
如需更精细的控制,请使用设置文件。 ./config.toml 文件位置: ~/.mcp-slack/config.toml
[slack]
bot_token = "xoxb-..."
user_token = "xoxp-..."
[cache]
data_path = "~/.mcp-slack"
ttl_users_hours = 24 # 사용자 캐시 TTL
ttl_channels_hours = 24 # 채널 캐시 TTL
ttl_members_hours = 12 # 멤버 목록 TTL
compression = "snappy" # 압축 방식
[retry]
max_attempts = 3 # API 재시도 횟수
initial_delay_ms = 1000 # 첫 재시도 대기
max_delay_ms = 60000 # 최대 대기 시간
exponential_base = 2.0 # 지수 백오프 배율
[connection]
timeout_seconds = 30 # HTTP 타임아웃
max_idle_per_host = 10 # 연결 풀 크기
pool_idle_timeout_seconds = 90 # 유휴 연결 유지
或者
设置效果:
| 设置 | 默认值 | 更改时机 | 效果 |
|------|--------|----------|------| ttl_users_hours | 标题1 | 标题2 | 标题3 | 标题4 |
| ttl_channels_hours | 24 | 团队成员变动频繁 → 12 | 现金新鲜度 ↑ |
| max_attempts | 24 | 创建频道多 → 12 | 最新反映 |
| timeout_seconds | 3 | 网络不稳定 → 5 | 重试 ↑ |
|
| 30 | 慢速网络 → 60 | 减轻超时 |
graph LR
A[Claude Desktop<br/>AI Agent] -->|MCP stdio| B[Slack MCP Server<br/>Rust/Tokio]
B -->|HTTPS API| C[Slack Workspace]
B -->|Read/Write| D[(SQLite Cache<br/>WAL + FTS5)]
D -.->|< 10ms| B
C -.->|~500ms| B
subgraph Cache
D
E[사용자 FTS5]
F[채널 FTS5]
G[분산 락]
H[메타데이터]
end
ASCII 다이어그램 보기
┌──────────────┐ ┌──────────────────┐ ┌─────────────┐
│ Claude │ MCP │ Slack MCP │ HTTPS │ Slack │
│ Desktop │◄───────►│ Server │◄───────►│ Workspace │
│ (AI Agent) │ stdio │ (Rust/Tokio) │ │ │
└──────────────┘ └─────────┬────────┘ └─────────────┘
│
▼
┌─────────────────┐
│ SQLite Cache │
│ (WAL + FTS5) │
│ │
│ • 사용자 FTS5 │
│ • 채널 FTS5 │
│ • 분산 락 │
│ • 메타데이터 │
└─────────────────┘
🏗️ 技术栈 & 架构
系统结构
为什么需要缓存?
- 为了克服Slack API的局限性,本地缓存是必不可少的:📉 Slack API的问题:
conversations.list无法搜索频道 - **:**API不支持按频道名称进行搜索
- 低速率限制Tier 2(每分钟20次)- 在大型工作空间中出现瓶颈
重复查询效率低
- 每次通过API查询用户/频道信息时速度下降 ✅ 缓存解决方案:🚀 表情符号“🚀”在中文中通常被理解为“火箭”或“快速前进”的意思,但它本身没有直接的中文翻译,更多是作为一种视觉符号来传达特定的情感或情境。在需要文字描述时,可以简单地表达为“火箭”或根据上下文意译为“快速进展”等。
- 服务器启动时全面加载 一次性缓存所有用户和频道信息🔍 看起来像是一个放大镜的符号,通常用于表示“查看”、“搜索”或“调查”的意思。在中文里,可以简单地翻译为“🔍 查看”或根据上下文具体翻译为“🔍 搜索”、“🔍 调查”等。
- FTS5专业搜索 在本地以毫秒级速度搜索频道/用户⚡(闪电符号,常用于表示速度、能量、电力或警告等,具体含义需根据上下文确定)
- 即时响应 直接从缓存中查询,无需API调用🔄 旋转(循环)
自动更新 基于TTL(24小时)的自动更新 性能比较: | 任务 | Slack API | 缓存 (FTS5) | 改进 | |------|-----------|-------------|------| | 序号 | 英文单词 | 中文翻译 | 音标 | | 用户搜索 | ~500毫秒 + 速率限制 | 小于10毫秒 | 50倍+更快 | | 频道搜索 | ❌ 不可能 | <10毫秒 | 可能 | | 连续查询 | 请求速率限制 | 无限量
|
无限制
- **|**核心技术
- **AI代理优化技术:**SQLite FTS5(全文搜索扩展5)
- 专业搜索引擎,实现毫秒级搜索WAL 模式
- 使用预写日志(Write-Ahead Logging)支持同时读取Snappy 压缩
- 最小化缓存存储空间门控速率限制
使用令牌桶自动处理API限制
- 整体数据缓存服务器启动时加载所有用户/频道信息
- **代币优化技术:**用户名丰富化
- ID → 自动转换为姓名移除 Block Kit
- 去除不必要的UI结构空值/空字符串过滤
自动移除空值
- 线程优化去除父母信息重复项
- **性能技术:**Rust 2024 版本
- 内存安全 + 高性能Tokio 异步运行时
- 使用异步I/O进行并发处理R2D2 连接池
HTTP连接复用
指数退避(或指数回退) 自动重试 技术栈 | 类别 | 技术 | 版本 | 用途 | |---------|------|------|------| | 语言 | Rust | 2024 版本 | 系统编程 | | 运行时 | 东京 | 1.47 | 异步处理 | | 数据库 | SQLite | 3.x | 嵌入式缓存 | | 搜索 | FTS5 | - | 专业搜索引擎 | | HTTP(超文本传输协议) | reqwest | 0.12 | HTTP客户端 | | 速率限制 | governor | 0.8 | 令牌桶 |
|
序列化
| serde | 1.0 | JSON处理 | 🔧 问题解决
缓存没有更新
# 1. 캐시 삭제
rm ~/.mcp-slack/cache.db
# 2. Claude Desktop 재시작
# 자동으로 캐시가 다시 생성됩니다
症状:
看不到新成员或新频道
解决:
使用AI代理: Error: Unauthorized - check Slack token
“请刷新Slack缓存”
- “未经授权”错误
xoxp-症状:xoxb-检查清单: - [ ] 标记格式确认:用户标记(
- ) 或者机器人令牌(
以()开始
# 사용자 토큰 테스트
curl -H "Authorization: Bearer xoxp-YOUR-TOKEN" \
https://slack.com/api/auth.test
# 봇 토큰 테스트
curl -H "Authorization: Bearer xoxb-YOUR-TOKEN" \
https://slack.com/api/auth.test
[ ] 确认添加所有必要权限
[ ] 权限更改后确认在工作区重新安装 search_messages 代币测试:
无法搜索消息 症状:
工具返回空结果
SLACK_USER_TOKEN原因:xoxp-无用户令牌或权限不足search:read解决:- 设置(
(以“罗”开头)
xoxb-添加权限
在工作区重新安装
💡 机器人令牌(
{
"mcpServers": {
"slack": {
"command": "/path/to/mcp-slack",
"env": {
"SLACK_USER_TOKEN": "xoxp-...", // 또는 SLACK_BOT_TOKEN
"LOG_LEVEL": "debug" // ← 변경
}
}
}
}
)无法搜索消息
RUST_LOG=debug cargo run
RUST_LOG=mcp_slack::cache=debug cargo run # 모듈별
调试日志记录
sqlite3 ~/.mcp-slack/cache.db
# 유용한 쿼리
SELECT COUNT(*) FROM users; # 사용자 수
SELECT COUNT(*) FROM channels; # 채널 수
SELECT * FROM metadata; # 마지막 동기화
# 캐시 신선도
SELECT
key,
datetime(CAST(value AS INTEGER), 'unixepoch') as last_sync,
(unixepoch() - CAST(value AS INTEGER)) / 3600 as hours_ago
FROM metadata
WHERE key LIKE 'last_%_sync';
Claude Desktop 设置:
在航站楼内:
git clone https://github.com/junyeong-ai/mcp-slack
cd mcp-slack
cargo build # 개발 빌드
cargo build --release # 최적화 빌드
cargo test # 테스트
cargo clippy # 린트
检查缓存数据
src/
├── mcp/ # MCP 프로토콜
│ ├── server.rs # JSON-RPC stdio
│ ├── handlers.rs # 도구 라우팅
│ └── types.rs # MCP 타입
│
├── slack/ # Slack 클라이언트
│ ├── client.rs # 통합 파사드
│ ├── core.rs # HTTP + Rate Limiting
│ ├── users.rs # 사용자 작업
│ ├── channels.rs # 채널 작업
│ └── messages.rs # 메시지 작업
│
├── cache/ # SQLite 캐시
│ ├── sqlite_cache.rs # 메인 구현
│ ├── schema.rs # FTS5 스키마
│ ├── users.rs # 사용자 캐싱
│ ├── channels.rs # 채널 캐싱
│ └── locks.rs # 분산 락
│
└── tools/ # MCP 도구 (8개)
├── search.rs # 검색 도구 3개
├── messages.rs # 메시징 4개
├── cache.rs # 캐시 1개
└── message_utils.rs # 토큰 최적화
🚀 开发 构建/建造
项目结构
开发文档: CLAUDE.md(文件名,可译为“克劳德文档”或保持原样,具体根据上下文决定是否翻译文件名)
📄 许可证
- **MIT 许可证 -**许可证 💬 支持
- GitHub 问题(或“GitHub 问题追踪”): 问题报告
- 开发文档: CLAUDE.md(文件名可译为“克劳德.md”或保持原样,具体取决于上下文是否需要翻译文件名)
MCP协议 : modelcontextprotocol.io
🌐 韩语 |
英语
