# π Slack MCP Server
FastMCPλ₯Ό μ¬μ©ν μμ ν Slack ν΅ν© MCP μλ²μ
λλ€. Cursor IDEμμ Slack APIμ λͺ¨λ κΈ°λ₯μ μμ°μ΄λ‘ μ¬μ©ν μ μκ² ν΄μ€λλ€.
## π λͺ©μ°¨
- [νΉμ§](#-νΉμ§)
- [μꡬμ¬ν](#-μꡬμ¬ν)
- [λΉ λ₯Έ μ€μΉ](#-λΉ λ₯Έ-μ€μΉ)
- [μλ μ€μΉ](#-μλ-μ€μΉ)
- [μ¬μ©λ²](#-μ¬μ©λ²)
- [μ¬μ© κ°λ₯ν λꡬ](#-μ¬μ©-κ°λ₯ν-λꡬ)
- [νλ‘μ νΈ κ΅¬μ‘°](#-νλ‘μ νΈ-ꡬ쑰)
- [κ°λ°μ κ°μ΄λ](#-κ°λ°μ-κ°μ΄λ)
- [λ¬Έμ ν΄κ²°](#-λ¬Έμ -ν΄κ²°)
- [λΌμ΄μ μ€](#-λΌμ΄μ μ€)
## β¨ νΉμ§
### νμ κΈ°λ₯ (κ³Όμ μꡬμ¬ν)
- β
**λ©μμ§ μ μ‘**: μ±λμ λ©μμ§ μ μ‘
- β
**μ±λ λͺ©λ‘ μ‘°ν**: μ κ·Ό κ°λ₯ν λͺ¨λ μ±λ μ‘°ν
- β
**μ±λ νμ€ν 리 μ‘°ν**: μ§μ λ μ±λμ λ©μμ§ νμ€ν 리
- β
**λ€μ΄λ νΈ λ©μμ§**: 1:1 λ©μμ§ μ μ‘
### μΆκ° κΈ°λ₯
- β
**μ¬μ©μ λͺ©λ‘ μ‘°ν**: μν¬μ€νμ΄μ€ μ¬μ©μ μ 보
- β
**λ°μ μΆκ°**: λ©μμ§μ μ΄λͺ¨μ§ λ°μ μΆκ°
- β
**λ©μμ§ κ²μ**: ν€μλ κΈ°λ° λ©μμ§ κ²μ
- β
**μ°κ²° ν
μ€νΈ**: API μ°κ²° μν νμΈ
### κΈ°μ μ νΉμ§
- π **FastMCP κΈ°λ°**: μ΅μ MCP νλ μμν¬ μ¬μ©
- β‘ **λΉλκΈ° μ²λ¦¬**: aiohttpλ₯Ό μ΄μ©ν κ³ μ±λ₯ API νΈμΆ
- π‘οΈ **μμ ν μλ¬ μ²λ¦¬**: μμΈν μ€λ₯ λ©μμ§μ 볡ꡬ κ°λ₯ν μμΈ μ²λ¦¬
- π **νμ
ννΈ**: μμ ν νμ
μμ μ±
- π§ͺ **ν¬κ΄μ ν
μ€νΈ**: μλνλ ν
μ€νΈ μ€μνΈ
- π **λ‘κΉ
**: ꡬ쑰νλ λ‘κΉ
μμ€ν
- π§ **μλ μ€μΉ**: μν΄λ¦ μ€μΉ μ€ν¬λ¦½νΈ
## π μꡬμ¬ν
- **Python 3.8+**
- **pip** (ν¨ν€μ§ κ΄λ¦¬μ)
- **Cursor IDE** (MCP ν΄λΌμ΄μΈνΈ)
- **Slack Bot Token** (xoxb-λ‘ μμ)
### Slack Bot κΆν
Slack μ±μ λ€μ κΆνμ΄ νμν©λλ€:
```
Bot Token Scopes:
- channels:history # μ±λ λ©μμ§ μ½κΈ°
- channels:read # μ±λ μ 보 μ‘°ν
- chat:write # λ©μμ§ μ μ‘
- groups:history # λΉκ³΅κ° κ·Έλ£Ή λ©μμ§ μ½κΈ°
- groups:read # λΉκ³΅κ° κ·Έλ£Ή μ 보 μ‘°ν
- im:history # DM λ©μμ§ μ½κΈ°
- im:read # DM μ 보 μ‘°ν
- im:write # DM μ μ‘
- mpim:history # λ©ν°νν° DM λ©μμ§ μ½κΈ°
- mpim:read # λ©ν°νν° DM μ 보 μ‘°ν
- mpim:write # λ©ν°νν° DM μ μ‘
- reactions:write # λ°μ μΆκ°
- search:read # λ©μμ§ κ²μ
- users:read # μ¬μ©μ μ 보 μ‘°ν
```
## π λΉ λ₯Έ μ€μΉ
### 1. μλ μ€μΉ (κΆμ₯)
```bash
cd slack-mcp
python install.py
```
μ€μΉ μ€ν¬λ¦½νΈκ° λ€μμ μλμΌλ‘ μ²λ¦¬ν©λλ€:
- ν¨ν€μ§ μ€μΉ
- νκ²½ λ³μ μ€μ
- Cursor MCP μ€μ μ
λ°μ΄νΈ
- μ€μΉ ν
μ€νΈ μ€ν
### 2. Cursor μ¬μμ
μ€μΉ μλ£ ν Cursorλ₯Ό μ¬μμνλ©΄ Slack MCP λꡬλ₯Ό μ¬μ©ν μ μμ΅λλ€.
## π§ μλ μ€μΉ
### 1. μ μ₯μ ν΄λ‘
```bash
git clone <repository-url>
cd slack-mcp
```
### 2. ν¨ν€μ§ μ€μΉ
```bash
pip install -r requirements.txt
```
### 3. νκ²½ λ³μ μ€μ
`.env` νμΌ μμ±:
```bash
# Slack Bot Token (xoxb-λ‘ μμνλ ν ν°)
SLACK_BOT_TOKEN=xoxb-your-bot-token-here
# μ νμ : λ‘κ·Έ λ 벨 μ€μ
LOG_LEVEL=INFO
```
### 4. Cursor MCP μ€μ
`~/.cursor/mcp.json` νμΌμ λ€μ μΆκ°:
```json
{
"mcpServers": {
"slack": {
"command": "python",
"args": ["/path/to/slack-mcp/slack_mcp_server.py"],
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-bot-token-here"
}
}
}
}
```
### 5. ν
μ€νΈ μ€ν
```bash
python test_slack_mcp.py
```
## π μ¬μ©λ²
Cursorμμ μ μ±ν
μ μμνκ³ λ€μκ³Ό κ°μ΄ μμ°μ΄λ‘ Slack κΈ°λ₯μ μ¬μ©ν μ μμ΅λλ€:
### λ©μμ§ μ μ‘
```
#general μ±λμ "μλ
νμΈμ!"λΌλ λ©μμ§λ₯Ό 보λ΄μ£ΌμΈμ
```
### μ±λ μ 보 μ‘°ν
```
μ¬μ© κ°λ₯ν Slack μ±λ λͺ©λ‘μ 보μ¬μ£ΌμΈμ
```
### λ©μμ§ νμ€ν 리
```
#general μ±λμ μ΅κ·Ό λ©μμ§ 10κ°λ₯Ό κ°μ Έμμ£ΌμΈμ
```
### λ€μ΄λ νΈ λ©μμ§
```
μ¬μ©μ U1234567890μκ² "νμ μ€λΉ μλ£"λΌλ DMμ 보λ΄μ£ΌμΈμ
```
### λ©μμ§ κ²μ
```
"νλ‘μ νΈ"λΌλ ν€μλκ° ν¬ν¨λ λ©μμ§λ₯Ό κ²μν΄μ£ΌμΈμ
```
## π οΈ μ¬μ© κ°λ₯ν λꡬ
| λꡬ | μ€λͺ
| νλΌλ―Έν° |
|------|------|----------|
| `send_slack_message` | μ±λμ λ©μμ§ μ μ‘ | `channel`, `text` |
| `get_slack_channels` | μ±λ λͺ©λ‘ μ‘°ν | μμ |
| `get_slack_channel_history` | μ±λ νμ€ν 리 μ‘°ν | `channel_id`, `limit` |
| `send_slack_direct_message` | λ€μ΄λ νΈ λ©μμ§ μ μ‘ | `user_id`, `text` |
| `get_slack_users` | μ¬μ©μ λͺ©λ‘ μ‘°ν | μμ |
| `add_slack_reaction` | λ©μμ§μ λ°μ μΆκ° | `channel`, `timestamp`, `name` |
| `search_slack_messages` | λ©μμ§ κ²μ | `query`, `count` |
| `test_slack_connection` | μ°κ²° ν
μ€νΈ | μμ |
## π νλ‘μ νΈ κ΅¬μ‘°
```
slack-mcp/
βββ π README.md # μ΄ νμΌ
βββ π requirements.txt # Python ν¨ν€μ§ μμ‘΄μ±
βββ π slack_api.py # Slack API ν΄λΌμ΄μΈνΈ
βββ π slack_mcp_server.py # FastMCP μλ² κ΅¬ν
βββ π test_slack_mcp.py # ν
μ€νΈ μ€ν¬λ¦½νΈ
βββ π install.py # μλ μ€μΉ μ€ν¬λ¦½νΈ
βββ π mcp_config.json # MCP μ€μ ν
νλ¦Ώ
βββ π env_example.txt # νκ²½ λ³μ ν
νλ¦Ώ
βββ π .gitignore # Git 무μ νμΌ
```
## π¨βπ» κ°λ°μ κ°μ΄λ
### κ°λ° νκ²½ μ€μ
```bash
# κ°λ° λͺ¨λλ‘ ν¨ν€μ§ μ€μΉ
pip install -r requirements.txt
# νκ²½ λ³μ μ€μ
cp env_example.txt .env
# .env νμΌμ νΈμ§νμ¬ μ€μ ν ν° μ
λ ₯
# ν
μ€νΈ μ€ν
python test_slack_mcp.py
```
### μλ‘μ΄ λꡬ μΆκ°
1. `slack_api.py`μ API λ©μλ μΆκ°
2. `slack_mcp_server.py`μ MCP λꡬ λ°μ½λ μ΄ν° μΆκ°
3. `test_slack_mcp.py`μ ν
μ€νΈ μΌμ΄μ€ μΆκ°
### λ‘κΉ
μλ²λ λ€μ μμΉμ λ‘κ·Έλ₯Ό κΈ°λ‘ν©λλ€:
- **μ½μ μΆλ ₯**: μ€μκ° λ‘κ·Έ νμΈ
- **νμΌ λ‘κ·Έ**: `slack_mcp.log`
### λλ²κΉ
```bash
# μμΈ λ‘κ·Έμ ν¨κ» ν
μ€νΈ μ€ν
LOG_LEVEL=DEBUG python test_slack_mcp.py
# μλ² μ§μ μ€ν (λλ²κΉ
μ©)
python slack_mcp_server.py
```
## π λ¬Έμ ν΄κ²°
### μμ£Ό λ°μνλ λ¬Έμ
#### 1. "SLACK_BOT_TOKEN νκ²½ λ³μκ° μ€μ λμ§ μμμ΅λλ€"
**ν΄κ²°μ±
:**
- `.env` νμΌμ μ¬λ°λ₯Έ ν ν°μ΄ μλμ§ νμΈ
- ν ν°μ΄ `xoxb-`λ‘ μμνλμ§ νμΈ
#### 2. "invalid_auth" μλ¬
**ν΄κ²°μ±
:**
- Slack Bot Tokenμ΄ μ ν¨νμ§ νμΈ
- ν ν°μ΄ μ¬λ°λ₯Έ μν¬μ€νμ΄μ€μ©μΈμ§ νμΈ
- νμν κΆνμ΄ λͺ¨λ λΆμ¬λμλμ§ νμΈ
#### 3. "channel_not_found" μλ¬
**ν΄κ²°μ±
:**
- μ±λ IDκ° μ¬λ°λ₯Έμ§ νμΈ
- λ΄μ΄ ν΄λΉ μ±λμ μΆκ°λμλμ§ νμΈ
- κ³΅κ° μ±λμΈμ§ λλ λ΄μ΄ μ΄λλμλμ§ νμΈ
#### 4. Cursorμμ MCP λκ΅¬κ° λ³΄μ΄μ§ μμ
**ν΄κ²°μ±
:**
- Cursorλ₯Ό μμ ν μ¬μμ
- `~/.cursor/mcp.json` μ€μ νμΌ νμΈ
- νμΌ κ²½λ‘κ° μ¬λ°λ₯Έμ§ νμΈ
### λ‘κ·Έ νμΈ
```bash
# μλ² λ‘κ·Έ νμΈ
tail -f slack_mcp.log
# ν
μ€νΈ λ‘κ·Έμ ν¨κ» μ€ν
python test_slack_mcp.py 2>&1 | tee debug.log
```
### μλ μ°κ²° ν
μ€νΈ
```bash
# Pythonμμ μ§μ ν
μ€νΈ
python -c "
import asyncio
from slack_api import get_slack_client
import os
from dotenv import load_dotenv
load_dotenv()
token = os.getenv('SLACK_BOT_TOKEN')
client = get_slack_client(token)
async def test():
result = await client.test_connection()
print(result)
asyncio.run(test())
"
```
## π κ³Όμ μꡬμ¬ν λλΉ νν©
| μꡬμ¬ν | μν | ꡬν μμΉ |
|----------|------|-----------|
| **νμ κΈ°λ₯** |
| λ©μμ§ μ μ‘ | β
μλ£ | `send_slack_message` |
| μ±λ λͺ©λ‘ μ‘°ν | β
μλ£ | `get_slack_channels` |
| μ±λ νμ€ν 리 μ‘°ν | β
μλ£ | `get_slack_channel_history` |
| λ€μ΄λ νΈ λ©μμ§ | β
μλ£ | `send_slack_direct_message` |
| **μ ν κΈ°λ₯** |
| μ¬μ©μ λͺ©λ‘ μ‘°ν | β
μλ£ | `get_slack_users` |
| λ°μ μΆκ° | β
μλ£ | `add_slack_reaction` |
| λ©μμ§ κ²μ | β
μλ£ | `search_slack_messages` |
| **κΈ°μ μꡬμ¬ν** |
| FastMCP μ¬μ© | β
μλ£ | `slack_mcp_server.py` |
| μλ¬ μ²λ¦¬ | β
μλ£ | λͺ¨λ λꡬμ try-catch |
| νμ
ννΈ | β
μλ£ | λͺ¨λ ν¨μμ νμ
ννΈ |
| λ‘κΉ
| β
μλ£ | ꡬ쑰νλ λ‘κΉ
μμ€ν
|
| ν
μ€νΈ | β
μλ£ | `test_slack_mcp.py` |
| λ¬Έμν | β
μλ£ | μ΄ README λ° μ½λ μ£Όμ |
## π μΆκ° ꡬν μ¬ν
κ³Όμ μꡬμ¬νμ λμ΄μ λ€μ κΈ°λ₯λ€μ μΆκ°λ‘ ꡬννμ΅λλ€:
- π **μλ μ€μΉ μμ€ν
**: μν΄λ¦ μ€μΉ μ€ν¬λ¦½νΈ
- π§ͺ **ν¬κ΄μ ν
μ€νΈ**: λͺ¨λ κΈ°λ₯μ λν μλνλ ν
μ€νΈ
- π **μμΈν μλ΅ ν¬λ§·ν
**: ꡬ쑰νλ μ±κ³΅/μ€ν¨ μλ΅
- β‘ **λΉλκΈ° HTTP ν΄λΌμ΄μΈνΈ**: κ³ μ±λ₯ aiohttp μ¬μ©
- π‘οΈ **μΈμ
κ΄λ¦¬**: HTTP μΈμ
μ¬μ¬μ©μΌλ‘ μ±λ₯ μ΅μ ν
- π§ **κ°λ°μ λꡬ**: λλ²κΉ
λ° λ¬Έμ ν΄κ²° λꡬ
- π **μμ ν νλ‘μ νΈ κ΅¬μ‘°**: μμ° μ€λΉ μλ£λ μ½λ ꡬ쑰
## π λΌμ΄μ μ€
MIT License - μμΈν λ΄μ©μ [LICENSE](LICENSE) νμΌμ μ°Έμ‘°νμΈμ.
---
## π μμνκΈ°
```bash
# 1. νλ‘μ νΈ ν΄λ‘
git clone <repository-url>
cd slack-mcp
# 2. μλ μ€μΉ μ€ν
python install.py
# 3. Cursor μ¬μμ
# μ΄μ Cursorμμ Slack MCP λꡬλ₯Ό μ¬μ©ν μ μμ΅λλ€!
```
**λ¬Έμ κ° μμΌμλ©΄ [Issues](../../issues)μ λ³΄κ³ ν΄μ£ΌμΈμ.**