๐ 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. ์๋ ์ค์น (๊ถ์ฅ)
cd slack-mcp
python install.py
์ค์น ์คํฌ๋ฆฝํธ๊ฐ ๋ค์์ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค:
- ํจํค์ง ์ค์น
- ํ๊ฒฝ ๋ณ์ ์ค์
- Cursor MCP ์ค์ ์ ๋ฐ์ดํธ
- ์ค์น ํ ์คํธ ์คํ
2. Cursor ์ฌ์์
์ค์น ์๋ฃ ํ Cursor๋ฅผ ์ฌ์์ํ๋ฉด Slack MCP ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ง ์๋ ์ค์น
1. ์ ์ฅ์ ํด๋ก
git clone <repository-url>
cd slack-mcp
2. ํจํค์ง ์ค์น
pip install -r requirements.txt
3. ํ๊ฒฝ ๋ณ์ ์ค์
.env ํ์ผ ์์ฑ:
# Slack Bot Token (xoxb-๋ก ์์ํ๋ ํ ํฐ)
SLACK_BOT_TOKEN=xoxb-your-bot-token-here
# ์ ํ์ : ๋ก๊ทธ ๋ ๋ฒจ ์ค์
LOG_LEVEL=INFO
4. Cursor MCP ์ค์
~/.cursor/mcp.json ํ์ผ์ ๋ค์ ์ถ๊ฐ:
{
"mcpServers": {
"slack": {
"command": "python",
"args": ["/path/to/slack-mcp/slack_mcp_server.py"],
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-bot-token-here"
}
}
}
}
5. ํ ์คํธ ์คํ
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 ๋ฌด์ ํ์ผ
๐จโ๐ป ๊ฐ๋ฐ์ ๊ฐ์ด๋
๊ฐ๋ฐ ํ๊ฒฝ ์ค์
# ๊ฐ๋ฐ ๋ชจ๋๋ก ํจํค์ง ์ค์น
pip install -r requirements.txt
# ํ๊ฒฝ ๋ณ์ ์ค์
cp env_example.txt .env
# .env ํ์ผ์ ํธ์งํ์ฌ ์ค์ ํ ํฐ ์
๋ ฅ
# ํ
์คํธ ์คํ
python test_slack_mcp.py
์๋ก์ด ๋๊ตฌ ์ถ๊ฐ
slack_api.py์ API ๋ฉ์๋ ์ถ๊ฐslack_mcp_server.py์ MCP ๋๊ตฌ ๋ฐ์ฝ๋ ์ดํฐ ์ถ๊ฐtest_slack_mcp.py์ ํ ์คํธ ์ผ์ด์ค ์ถ๊ฐ
๋ก๊น
์๋ฒ๋ ๋ค์ ์์น์ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํฉ๋๋ค:
- ์ฝ์ ์ถ๋ ฅ: ์ค์๊ฐ ๋ก๊ทธ ํ์ธ
- ํ์ผ ๋ก๊ทธ:
slack_mcp.log
๋๋ฒ๊น
# ์์ธ ๋ก๊ทธ์ ํจ๊ป ํ
์คํธ ์คํ
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์ค์ ํ์ผ ํ์ธ- ํ์ผ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
๋ก๊ทธ ํ์ธ
# ์๋ฒ ๋ก๊ทธ ํ์ธ
tail -f slack_mcp.log
# ํ
์คํธ ๋ก๊ทธ์ ํจ๊ป ์คํ
python test_slack_mcp.py 2>&1 | tee debug.log
์๋ ์ฐ๊ฒฐ ํ ์คํธ
# 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 ํ์ผ์ ์ฐธ์กฐํ์ธ์.
๐ ์์ํ๊ธฐ
# 1. ํ๋ก์ ํธ ํด๋ก
git clone <repository-url>
cd slack-mcp
# 2. ์๋ ์ค์น ์คํ
python install.py
# 3. Cursor ์ฌ์์
# ์ด์ Cursor์์ Slack MCP ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค!
๋ฌธ์ ๊ฐ ์์ผ์๋ฉด Issues์ ๋ณด๊ณ ํด์ฃผ์ธ์.