ScrumAgent
The Discord Scrum Master is an open-source AI-powered supervisor agent designed to facilitate agile project management within Discord communities. Acting as a virtual Scrum Master, this agent integrates multiple tools to streamline sprint planning, issue tracking, research, and collaboration.
Install / Use
/learn @Shikenso-Analytics/ScrumAgentREADME
Scrum Agent
![]()
Table of Contents
- Introduction
- Features
- Architecture
- Installation and Setup
- Running Locally
- Environment Variables
- MCP Server Configuration
- Wiki-based Skills
- Usage Examples
- Testing
- Tracing with LangSmith
- Roadmap
- Contact
1. Introduction
Scrum Agent is an open-source, AI-powered Scrum Master that integrates Discord with Taiga project management. It uses a single ReAct agent powered by LangGraph and connects to external tools via the Model Context Protocol (MCP).
By mapping Discord channels to Taiga projects, Scrum Agent facilitates user story management through threaded discussions, automated stand-ups, and seamless synchronization between both platforms.
Join our Discord Server to test the Scrum Agent.
Project Goals & Audience
Scrum Agent is designed for small dev teams without a dedicated Scrum Master, but can also be used by larger teams to keep Discord conversations and Taiga boards in sync. The project is under active development — contributions and feedback are welcome.
2. Features
Discord Integration
- Automated Discord thread creation for each Taiga user story
- Semantic search over Discord message history (ChromaDB)
- Daily stand-up posts at 08:00 (Berlin time)
- Hourly Taiga-Discord synchronization
- Smart message splitting for Discord's 2000-char limit
Taiga Project Management
- Retrieve, create, and update user stories, tasks, and issues
- Wiki page management (list, read, create, update with optimistic locking)
- Sprint tracking and status updates
- Watchers and assignee management
Wiki-based Skills
- Dynamic system prompt extensions loaded from Taiga wiki pages
- No code changes needed — create a wiki page with the
skills-prefix and it is automatically discovered - TTL-based auto-refresh (default: 5 minutes) — update skills without restarting the bot
- Graceful degradation when Taiga is unreachable
MCP Tool Servers
- Taiga MCP — Full Taiga API access via
langchain-taiga - GitHub MCP — Repository browsing, commits, branches (Docker)
- Discord Chroma MCP — Semantic search over Discord messages
- Discord API MCP — Direct Discord channel/message operations
Web Research
- DuckDuckGo search, ArXiv papers, YouTube, Wikipedia
Multi-LLM Support
- OpenAI (default:
gpt-4o) - Anthropic Claude (
claude-sonnet-4-5-20250929, etc.) - Ollama local models (
ollama/llama3, etc.)
Stand-up Scheduling via Tags
| Tag on Taiga user story | Bot behaviour |
|-------------------------|---------------|
| daily stand-up | Stand-up every day |
| weekly stand-up | Stand-up Mondays only |
| no stand-up | No stand-up |
| no tag | Mondays only (default) |
3. Architecture
Scrum Agent v2.0 uses a single ReAct agent (LangGraph create_react_agent) that connects to external tools via MCP (Model Context Protocol). Each MCP server runs as a subprocess and communicates via stdio.
Discord Bot (main_discord_bot.py)
└── ScrumAgent (agent.py)
├── Skills Loader (Taiga wiki → system prompt, TTL-cached)
├── LangGraph ReAct Agent
│ ├── LLM (OpenAI / Anthropic / Ollama)
│ ├── System Prompt (base + loaded skills)
│ └── Tools
│ ├── MCP: Taiga (langchain-taiga)
│ ├── MCP: GitHub (Docker container)
│ ├── MCP: Discord Chroma (custom, ChromaDB)
│ ├── MCP: Discord API (mcp-discord npm)
│ ├── DuckDuckGo Search
│ ├── ArXiv
│ ├── YouTube Search
│ └── Wikipedia
└── Checkpointer (MongoDB or MemorySaver)
Key Files
| File | Description |
|------|-------------|
| scrumagent/agent.py | Core agent with MCP client and LLM factory |
| scrumagent/main_discord_bot.py | Discord bot entry point |
| mcp_servers/discord_chroma_server.py | Custom MCP server for semantic Discord search |
| config/mcp_config.yaml | MCP server configuration |
| config/taiga_discord_maps.yaml | Discord-to-Taiga project mappings |
| pyproject.toml | Dependencies and project config |
4. Installation and Setup
Prerequisites
- Python 3.10–3.12
- uv (Python package manager)
- Docker (for GitHub MCP server)
- Node.js / npm (for Discord API MCP server)
Install Dependencies
git clone https://github.com/Shikenso-Analytics/ScrumAgent.git
cd ScrumAgent
git checkout claude/scrumagent-langgraph-mcp-bz738
# Install all dependencies including dev tools
uv sync --all-extras
Configure Environment
cp .env.example .env
# Edit .env with your credentials (see Section 6)
cp config/taiga_discord_maps.yaml.example config/taiga_discord_maps.yaml
# Edit the mapping file to match your Discord channels and Taiga projects
Discord Bot Setup
- Go to the Discord Developer Portal
- Create a new Application and go to the Bot tab
- Enable Server Members Intent and Message Content Intent
- In OAuth2, enable the bot scope with these permissions:
- View Channels, Send Messages, Read Message History
- Create Public/Private Threads, Manage Threads, Send Messages in Threads
- Manage Messages, Add Reactions
- Use the generated OAuth2 URL to invite the bot to your server
- Copy the bot token and add it to your
.envfile asDISCORD_TOKEN
5. Running Locally
Start the Discord Bot (production mode)
uv run python scrumagent/main_discord_bot.py
This starts the Discord bot, which will:
- Connect to Discord and establish MCP server connections
- Create/update threads for each active Taiga user story
- Begin the daily stand-up and hourly sync tasks
- Listen for messages in configured channels
Debug a Single Agent Invocation
To test the agent without the Discord bot, use a Python script:
uv run python -c "
import asyncio
from scrumagent.agent import ScrumAgent
from langchain_core.messages import HumanMessage
async def main():
agent = ScrumAgent()
await agent.start()
print(f'Tools loaded: {len(agent.graph.get_graph().nodes)}')
result = await agent.ainvoke(
[HumanMessage(content='List all active user stories in project my-project-slug')],
{'configurable': {'user_id': 'debug', 'thread_id': 'debug-session'}}
)
print(result['messages'][-1].content)
asyncio.run(main())
"
Test Individual MCP Servers
# Taiga MCP — should print FastMCP banner and start listening
uv run python -m langchain_taiga.mcp_server
# Discord Chroma MCP — starts and waits on stdio
uv run python mcp_servers/discord_chroma_server.py
# GitHub MCP (requires Docker + GITHUB_PERSONAL_ACCESS_TOKEN)
docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN ghcr.io/github/github-mcp-server
# Discord API MCP (requires npm + DISCORD_TOKEN)
DISCORD_TOKEN=your_token npx -y mcp-discord
Test MCP Tool Loading (without credentials)
# Verify all 4 web tools load
uv run python -c "
from scrumagent.agent import _build_web_tools
tools = _build_web_tools()
print(f'{len(tools)} tools: {[type(t).__name__ for t in tools]}')
"
# Verify MCP config loads and env vars resolve
uv run python -c "
from scrumagent.agent import _load_mcp_config
config = _load_mcp_config()
for name, cfg in config.items():
env_keys = list(cfg.get('env', {}).keys()) if 'env' in cfg else 'none'
print(f'{name}: env={env_keys}')
"
# Verify LLM factory
uv run python -c "
from scrumagent.agent import _build_llm
llm = _build_llm()
print(f'LLM: {type(llm).__name__}')
"
6. Environment Variables
Copy .env.example to .env and fill in the values:
| Variable | Required | Description |
|----------|----------|-------------|
| SCRUM_AGENT_MODEL | No | LLM model name. Default: gpt-4o. Options: claude-sonnet-4-5-20250929, ollama/llama3 |
| SCRUM_AGENT_TEMPERATURE | No | LLM temperature. Default: 0 |
| DISCORD_TOKEN | Yes | Discord bot token |
| DISCORD_GUILD_ID | Yes | Discord server (guild) ID |
| DISCORD_THREAD_TYPE | No | public_thread or private_thread. Default: public_thread |
| OPENAI_API_KEY | Yes | OpenAI API key (for embeddings and default LLM) |
| GITHUB_PERSONAL_ACCESS_TOKEN | No | GitHub token for GitHub MCP server |
| CHROMA_DB_PATH | No | ChromaDB storage path. Default: resources/chroma |
| TAIGA_API_URL | Yes | Taiga API URL (e.g. https://api.taiga.io) |
| TAIGA_URL | Yes | Taiga web URL (e.g. https://tree.taiga.io) |
| TAIGA_TOKEN | Yes* | Taiga auth token (alternative to username/password) |
| TAIGA_USERNAME | Yes* | Taiga username (alternative to
