Slack AI代理优化服务器

通过优化Slack API响应结构和本地缓存,显著降低AI代理使用Slack时的令牌成本并提升搜索速度。

  • by junyeong-ai
  • Rust
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 junyeong-ai/mcp-slack

使用说明

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分钟)

  1. 选项A:用户令牌(推荐)⭐ api.slack.com/apps(可翻译为):Slack API 应用页面 访问 → “创建新应用” →

  2. “从零开始” 用户令牌作用域

    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
    
  3. 补充: “安装到工作区”

  4. → 安装到个人账户 用户OAuth令牌xoxp-...复制(

(以“罗”开头)

  1. 选项B:机器人令牌(可选)

  2. 与上述相同创建应用 机器人令牌作用域

    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
    
  3. 附加: “安装到工作区”

  4. 点击 机器人用户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-... | 机器人令牌(替代) |

|

代币对比:

功能 用户令牌 ⭐ 机器人令牌
频道访问 ✅ 自动 ⚠️ 需邀请
消息搜索 ✅ 可行 ❌ 不可行

| 发送者 | 用户本人 | 机器人账号 |

  1. 用户令牌生成: api.slack.com/应用(或“应用页面”)
  2. → “创建新应用” → “从头开始” “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
    
  3. 附加:

“安装到工作区”→ 复制令牌

推荐设置 | 变量 | 默认值 | 说明 | |------|--------|------| 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 代币测试:

无法搜索消息 症状:

工具返回空结果

  1. SLACK_USER_TOKEN 原因:xoxp-无用户令牌或权限不足
  2. search:read 解决:
  3. 设置(

(以“罗”开头)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(文件名,可译为“克劳德文档”或保持原样,具体根据上下文决定是否翻译文件名)


📄 许可证


MCP协议 : modelcontextprotocol.io

🌐 韩语 |

英语