内容
# slack-huddle-mcp
> **Slack 已经为每次会议生成了文字记录。这个 MCP 服务器将记录提供给您的代理。** 不需要 Recall.ai,不需要 Granola,不需要在会议中添加录音机器人。
[](https://pypi.org/project/slack-huddle-mcp/)
[](https://pypi.org/project/slack-huddle-mcp/)
[](https://github.com/prithvi-bharadwaj/slack-huddle-mcp/actions/workflows/ci.yml)
[](LICENSE)
---
## 1. 问题
Slack Huddle 是许多团队日常站会的首选工具。在 Pro / Business+ 工作区中,Slack 会自动生成 AI 文字记录和摘要画布。
**但是 Slack 的公共 Web API 不提供这些文字记录。** 所有现有的指南都告诉您运行第三方录音机器人(Recall.ai、Granola、Otter、Fireflies、Circleback)。
有一个 Slack 网络客户端未公开的端点。此 MCP 服务器封装了它。您的文字记录可供任何支持 MCP 的代理使用 — Claude Code、Claude Cowork、Cursor、Cline、Continue、Zed — 约 200 行 Python 代码。
### 比较
| | slack-huddle-mcp | Recall.ai / similar | Granola / Otter / Fireflies | Slack 公共 API |
| --- | --- | --- | --- | --- |
| 读取 Slack **自己的** AI 文字记录 | ✅ | ❌ | ❌ | ❌ |
| 会议中没有录音机器人 | ✅ | ❌ | ❌ | ✅ |
| 数据路径中没有第三方服务器 | ✅ | ❌ | ❌ | ✅ |
| 适用于现有的 Huddle(无需设置) | ✅ | ❌ | ❌ | ❌ |
| 成本 | **免费** | $$$/月 | $$/席位/月 | 免费 |
| 设置时间 | **2 分钟** | 数小时 | 数小时 | 无 |
## 2. 快速入门
```bash
# until PyPI publish:
pipx install git+https://github.com/prithvi-bharadwaj/slack-huddle-mcp.git
# (发布后:pipx install slack-huddle-mcp)
slack-huddle-mcp setup --auto # macOS: 从 Slack 桌面应用程序自动提取
slack-huddle-mcp smoke-test # 对最新 Huddle 进行端到端检查
```
三种方式为工具提供令牌,按所需努力程度排序:
| 设置路径 | 努力程度 | 您需要 |
| --- | --- | --- |
| `setup --auto` *(macOS)* | **零点击** 在一次 Keychain “始终允许”之后 | 已安装并登录 Slack 桌面应用程序 |
| `bookmarklet` | 一次点击 `app.slack.com`,粘贴一次 `xoxd` | 任意现代浏览器 |
| `setup` *(手动)* | DevTools 控制台 + cookie 选项卡 | 任意浏览器 |
设置完成后,将 `setup` 打印的 MCP 配置代码片段粘贴到您的 MCP 客户端,重启它,然后询问您的代理:
> “用三点总结今天的站会,并列出按负责人分组的任何障碍。”
### 每天的命令(设置后)
```bash
slack-huddle-mcp status # 我的令牌是否仍然有效?
slack-huddle-mcp list -n 10 # 10 个最近的 Huddle(id,时间,持续时间)
slack-huddle-mcp list -c C0XXXXXXX # 限定为一个频道
slack-huddle-mcp get <huddle_id> # markdown 文字记录
slack-huddle-mcp get <huddle_id> --format summary # Slack 的 AI 摘要画布
slack-huddle-mcp smoke-test # 重新验证整个管道
```
如果 `status` 曾经显示 `AUTH_FAILED`,您已退出 Slack,`xoxc` 已旋转 — 只需重新运行 `slack-huddle-mcp setup --auto`。
## 3. 用例
- **每日站会简报** — 拉入您的晨间代理流程。
- **行动项目提取** — 跨越最近的 N 个 Huddle,按负责人分组。
- **异步跟进** — “我错过了设计 Huddle,这里有我需要知道的。”
- **会议后起草** — 在您的频道的语气中进行第一稿 Slack 跟进。
- **跨会议回顾** — 团队在上个冲刺中承诺了什么,有什么被推迟了?
### 此工具适用于
已经在 Slack Huddle 中运行站会并希望其代理**读取**它们的团队 — 不需要用单独的机器人再次转录,不需要按席位付费,不需要邀请陌生人进入每次会议。
## 4. 安全模型
您的 `xoxc` 令牌在功能上是您的 Slack 密码。在安装前请阅读本节。
- 令牌存储在您的 **OS 密钥链** (macOS 密钥链,Linux libsecret/KWallet,Windows 凭证管理器)中,通过 [`keyring`](https://pypi.org/project/keyring/)。它们不写入磁盘,不存储在环境变量中,**从不记录**。
- 所有 API 调用直接从您的机器发送到 `*.slack.com`。**没有第三方服务器。没有遥测。没有分析。** `grep -rE 'https?://[a-z0-9.-]+' src/` 进行验证。
- `401`/`403` 立即停止,并带有修复消息。工具不会在错误的身份验证上循环。
## 5. 工作原理
Slack 网络客户端发布 `files.info`,带有 `include_transcription=true` 作为 `multipart/form-data`,带有用户会话令牌(`xoxc`)在表单正文中,会话 cookie(`xoxd`)在 `Cookie` 头中。响应包括一个填充的 `huddle_transcription` 对象,带有 `lines[]`、`blocks` 和 `transcription_time_ranges`。
```
┌────────────────────┐ 1. POST huddles.history (Cookie: d={xoxd}, token={xoxc})
│ huddles.history │ ──────────────────────────────────────────────────────────►
└─────────┬──────────┘
│ huddle.transcript_file_id ← 这是 CANVAS 文件 ID(反直觉)
▼
┌────────────────────┐ 2. POST files.info?file={canvas_id}
│ files.info (canvas) │ ──────────────────────────────────────────────────────────►
└─────────┬──────────┘
│ canvas.huddle_transcript_file_id ← 原始文字记录文件 ID
▼
┌──────────────────────────┐ 3. POST files.info?file={transcript_id}&include_transcription=true
│ files.info (transcript) │ ──────────────────────────────────────────────────────►
└─────────┬────────────────┘
│ file.huddle_transcription.lines[] ← {user_id, start_time_ms, contents}
▼
解析 + 合并连续的说话者 → markdown / json / lines
```
三个调用。所有 `POST multipart/form-data`。`token=xoxc-...` 在表单正文中,`Cookie: d=<xoxd>` 在头部。
### 示例输出
给定一个 3 人 Huddle 文字记录,`get_huddle_transcript(huddle_id="H...", format="markdown", user_map={...})` 返回:
```markdown
**Alice** [00:00]: Lorem ipsum dolor sit amet. Consectetur adipiscing elit.
**Bob** [00:09]: Sed do eiusmod tempor.
**Carol** [00:17]: Incididunt ut labore et dolore. Magna aliqua.
**Alice** [00:25]: Ut enim ad minim veniam.
```
连续的相同说话者行合并。时间戳使用每个回合的开始。
## 6. 我走过的死胡同(以便您不必走)
<details>
<summary><b>我尝试过但失败的事情 — 节省贡献者时间。点击展开。</b></summary>
- `files.info` **不带** `include_transcription=true` — 字段被识别但 `huddle_transcription` 返回空 `{}`。
- 直接 `GET https://files.slack.com/files-pri/{team}-{file}/huddle_transcript` 带有 cookie + bearer — 重定向到 Slack React 应用程序 HTML shell。内容由后续 XHR 加载(此工具使用的)。
</details>
## 7. 令牌提取指南
### 选项 A — 从 Slack 桌面应用程序自动提取(macOS)
```bash
slack-huddle-mcp setup --auto # 提取、验证、存储
slack-huddle-mcp setup --auto --dry-run # 提取 + 验证但不存储
slack-huddle-mcp -v setup --auto # 在 stderr 上添加 DEBUG 日志
```
从 `~/Library/Application Support/Slack/Local Storage/leveldb/` 读取 `xoxc` (使用正则扫描)并使用 macOS 密钥链解密 `xoxd` (PBKDF2-SHA1 → AES-128-CBC,这是标准的 Chromium 方案)。
第一次运行会触发一次性 macOS 密钥链提示,请求访问 `Slack Safe Storage`。点击 **始终允许**。之后,未来运行将保持沉默。
### 选项 B — 单击浏览器书签
```bash
slack-huddle-mcp bookmarklet # 写入 + 在浏览器中打开帮助页面
slack-huddle-mcp bookmarklet --no-open # 仅写入帮助文件
slack-huddle-mcp bookmarklet --print-only # 打印书签 URL
```
从帮助页面将链接拖到书签栏。点击 `app.slack.com` 的任意选项卡,粘贴提示的 `xoxd`,然后将完整的 `slack-huddle-mcp setup --xoxc ... --xoxd ...` 命令放在剪贴板上。
(JavaScript 无法直接读取 `xoxd`,因为它是 HttpOnly — 那是手动步骤。)
### 选项 C — 手动(在任何地方都适用)
Slack 令牌来自浏览器。它们不是开发者 API 的一部分。
#### `xoxc` (用户会话令牌,表单正文)
1. 在浏览器中打开 Slack (`https://app.slack.com`)并登录。
2. 打开开发者工具 → 控制台。
3. 粘贴以下内容并复制结果:
```js
JSON.parse(localStorage.localConfig_v2).teams[
Object.keys(JSON.parse(localStorage.localConfig_v2).teams)[0]
].token
```
格式:`xoxc-{team_id}-{user_id}-{session_id}-{secret}`。
> ⚠️ `xoxc` 在您 **每次退出** Slack 时都会旋转。当此工具返回 `401` 时,请重新运行 `slack-huddle-mcp setup` 以刷新。
### `xoxd` (会话 cookie,头部)
1. 开发者工具 → 应用程序 → Cookie → `https://app.slack.com`。
2. 找到名为 `d` 的 cookie (HttpOnly)。
3. 复制 **原始值** — 存储时已 URL 编码。不要解码。
`xoxd` 生命周期约为一年。
## 8. MCP 客户端配置代码片段
所有客户端都使用相同的命令。选择适合您设置的客户端。
### Claude Code (CLI) — 最简单,本地标准输入输出
```bash
claude mcp add slack-huddle -s user -- "$(which slack-huddle-mcp)" serve
```
然后在任何 Claude Code 会话中运行 `/mcp` 以确认它已连接。
### Claude 桌面版(`~/Library/Application Support/Claude/claude_desktop_config.json`)
```json
{
"mcpServers": {
"slack-huddle": {
"command": "slack-huddle-mcp",
"args": ["serve"]
}
}
}
```
如果您的 MCP 客户端看不到您的 shell 的 PATH(与 GUI 启动器常见),请使用绝对路径:`~/.local/bin/slack-huddle-mcp` (或 `which slack-huddle-mcp` 显示的位置)。
### Cursor (`.cursor/mcp.json`)
```json
{
"mcpServers": {
"slack-huddle": {
"command": "slack-huddle-mcp",
"args": ["serve"]
}
}
}
```
### Claude.ai 网页版 / **Claude Cowork** — 需要公共隧道
Claude Cowork 无法运行本地标准输入输出 MCP — 它从 Anthropic 的云连接远程服务器。您通过隧道公开本地 MCP 以获取 HTTPS。
```bash
# 终端 1:在 HTTP 模式下启动 MCP 服务器,带有稳定令牌
export MCP_AUTH_TOKEN="$(openssl rand -hex 32)" # 保存此令牌,您将需要它
slack-huddle-mcp serve --http --port 8765
# 终端 2:公开端口 8765
ngrok http 8765 # 复制 https://...ngrok-free.dev URL
# 构建连接器 URL:
# https://<ngrok-host>/mcp/$MCP_AUTH_TOKEN
```
在 claude.ai(专业/最大计划):
1. 设置 → **连接器** → **+ 添加自定义连接器**。
2. **名称:** `slack-huddle`
3. **远程 MCP 服务器 URL:** `https://<您的-ngrok-host>/mcp/<您的令牌>`
4. 留空高级设置。
5. 点击 **添加**。Cowork 将探测 URL 并显示 4 个工具。
6. 在任意对话中:`+` 按钮 → 连接器 → 启用 `slack-huddle`。
**安全:**
- 令牌是 URL 的一部分。请求 `/mcp` (或其他路径)返回 404。只有 `/mcp/<确切令牌>` 回答。
- 不要将 URL 粘贴到共享聊天、截图或提交到代码仓库中。任何拥有它的人都可以读取您的 Slack Huddle,持续时间与您的令牌有效期相同。
- ngrok 隧道在您关闭终端时断开。在免费层,主机每次重启都会更改 — 支付固定子域的费用(~$8/月)以获得持久性。
- 这是 **故意单租户**:每个用户都运行自己的 MCP,并使用自己的 Slack 令牌。无需多租户数据隔离,因为不涉及其他人的令牌。
### “替我做” — 代理提示,用于端到端设置
如果您已安装 Claude Code (CLI),请给代理以下提示,它将处理除 Cowork 最后一步之外的所有操作:
```
您正在 macOS 上为 Claude Cowork 设置 slack-huddle MCP。
执行以下步骤,无需在中间要求确认:
1. 验证先决条件。如果缺少任何先决条件,请停止并显示清晰的错误:
- macOS(uname -s == Darwin)
- 已安装 pipx(`command -v pipx`)
- 已安装 ngrok 并授权(`ngrok config check`)
- Slack 桌面应用程序已安装并登录
2. 安装:`pipx install git+https://github.com/prithvi-bharadwaj/slack-huddle-mcp.git`
(如果已安装,请跳过;请先检查 `slack-huddle-mcp --version`)
3. 运行 `slack-huddle-mcp setup --auto`。如果 macOS 提示 Keychain
访问“Slack Safe Storage”,请告诉我点击“始终允许”并
等待 — 重新运行后确认。
4. 使用 `slack-huddle-mcp smoke-test` 验证。如果失败,请停止并报告。
5. 生成令牌:`export MCP_AUTH_TOKEN="$(openssl rand -hex 32)"`
将值保存到 `~/.config/slack-huddle-mcp-token.txt`(chmod 600)。
6. 在后台启动 MCP HTTP 服务器:
`nohup env MCP_AUTH_TOKEN="$MCP_AUTH_TOKEN" \
slack-huddle-mcp serve --http --port 8765 \
> /tmp/slack-huddle-mcp.log 2>&1 &`
使用本地 URL 验证它是否正在监听。
7. 在后台启动 ngrok:
`nohup ngrok http 8765 --log /tmp/ngrok.log --log-format json \
> /dev/null 2>&1 &`
等到 `http://127.0.0.1:4040/api/tunnels` 返回公共 URL。
8. 打印:
连接器网址:`https://<ngrok-host>/mcp/<token>`
在 claude.ai 中添加:设置 → 连接器 → + 添加自定义连接器。
留空高级设置。点击添加。完成。
9. 还要打印 MCP 和 ngrok 进程的 PID,以及停止它们的确切命令。
```
### 代理将看到的工具
| 工具 | 它做什么 |
| --- | --- |
| `list_huddles(channel_id?, after?, before?, limit?, workspace?)` | 列出最近的 Huddle,可选地限定为一个频道或时间范围。 |
| `get_huddle_transcript(huddle_id? \| transcript_file_id?, format="markdown"\|"json"\|"lines", merge_consecutive?, user_map?, workspace?)` | 获取一个 Huddle 的 AI 文字记录。 |
| `get_huddle_summary(canvas_id? \| huddle_id?, workspace?)` | 获取 AI 生成的摘要画布。 |
| `list_workspaces()` | 列出此机器上存储令牌的工作区。 |
## 9. 常见问题
**问:这在免费 Slack 工作区中有效吗?**
否。Slack 仅在 Pro / Business+ 工作区中生成 Huddle 文字记录。如果您的 Huddle 没有自动摘要画布,此工具没有任何可读取的内容。
**问:我的 `xoxc` 令牌会通过此工具泄露吗?**
令牌永远不会从您的机器离开,除了作为 `*.slack.com` 的 `POST` 正文发送。它存储在您的 OS 密钥链中,从不以明文存储在磁盘上,并且 `grep -rE 'xox[abc]-[a-z0-9]+' src/` 在已发布的代码中返回零匹配。审核它。
**问:Slack 会因为使用此工具而禁止我吗?**
与使用 Slack 网络客户端的风险相同。该工具发送与您的浏览器相同的请求。没有抓取,没有速率限制游戏,没有伪造的用户代理。使用合理的 `limit` 值。
**问:我的令牌停止工作了。**
您已退出 Slack(`xoxc` 在退出时旋转)。再次运行 `slack-huddle-mcp setup` 以刷新。
**问:如何使用多个工作区?**
为每个工作区运行一次 `slack-huddle-mcp setup --workspace <subdomain>`。工具采用可选的 `workspace` 参数;如果没有该参数,工具默认为唯一配置的工作区,或如果有多个工作区则报错。
**问:为什么 `transcript_file_id` 在 Huddle 上实际上指向画布,而不是文字记录?**
Slack 的内部命名是一个已知的历史怪癖。`huddles.history` 上的“文字记录文件 ID”实际上是 AI 摘要画布;画布的 `huddle_transcript_file_id` 字段是原始文字记录。第 5 节中的 3 步管道会遍历这两个。
**问:您会支持实时(流式)文字记录吗?**
在源端点稳定后,计划在路线图中。一旦 AI 文字记录生成,今日的 Huddle 即可使用。
## 10. 路线图
- Huddle 音频下载(Slack 通过相同的文件机制存储 m4a 文件)。
- 异步客户端(`httpx.AsyncClient`)用于并行画布解析。
- 实时 Huddle 流式文字记录。
- 更好的多工作区 UX — 环境变量覆盖,配置文件切换。
- 当 Slack 发布时,使用原生 Slack 端点 — 放弃 web 客户端伪装。
## 11. 贡献与许可
欢迎 PR — 特别是针对 section 8 中的新 MCP 客户端、section 6 中的更多死胡同和 `parser.py` 中的更严格的解析器。
```bash
git clone https://github.com/prithvi-bharadwaj/slack-huddle-mcp.git
cd slack-huddle-mcp
pip install -e ".[dev]"
pytest -q --cov
ruff check src/ tests/
mypy --strict src/
```
本项目遵循 [Contributor Covenant](https://www.contributor-covenant.org/version/2/1/code_of_conduct/)。友善待人。
在 [MIT License](LICENSE) 下许可。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器