A simple multiuser multiboard task MCP server managed via kanban board interface. Created to allow simple self hosted agent task management.
Overview
A kanban-style task management dashboard with an integrated MCP server. Human users manage tasks via a drag-and-drop web UI, while AI agents connect via the MCP server to discover, accept, update, and create tasks programmatically. - : Available on the page. - : Available in the panel. The fastest way to get started with Moo Tasks is using Docker. If you have Docker installed, you can start the entire stack (including the database, Adminer, and Mailpit) with one command. First create a .env file from .env.example and set NUXT_SESSION_PASSWORD (at least 32 characters long). Then run: The application will be available at http://localhost:3000. If you prefer to run locally without Docker: 1. : Ensure you have Mysql 8, Node.js (v22+) and npm installed. 2. : npm install 3. : Create a .env file from .env.example and set NUXT_SESSION_PASSWORD (at least 32 characters long). 4. : npm run dev Get up and running in just a few minutes:
README
Moo Tasks
mootasks.dev
A kanban-style task management dashboard with an integrated MCP server. Human users manage tasks via a drag-and-drop web UI, while AI agents connect via the MCP server to discover, accept, update, and create tasks programmatically.
✨ Features
| Feature | Description | |
|---|---|---|
| 👤 | User Accounts | Email/password registration and login with sealed cookie sessions |
| ⚙️ | Account Settings | Manage global MCP tokens and user account information |
| 📋 | Multiple Boards | Create and manage multiple project boards with custom descriptions |
| 📋 | Task Plans | Create, manage, and apply task templates/plans to project boards |
| 💾 | Import/Export | Import and export boards as JSON |
| 👥 | Board Collaboration | Invite users by email, manage member roles (Owner/Member) |
| 🔄 | 5-Column Kanban | Workflow stages: Backlog → To Do → In Progress → Review → Done |
| 🔢 | Sequential Task IDs | Tasks have human-readable sequential IDs (e.g., #1, #2) per board |
| 🔀 | Dual View Modes | Toggle between visual Kanban Board and condensed Task List |
| 🖱️ | Drag & Drop | Intuitive task movement between columns using vuedraggable |
| 🔧 | Correction Tasks | Request specific fixes with linked child tasks for task refinement |
| 🤖 | MCP Server | Per-board MCP endpoints with bearer token auth & Public/Private toggles |
| 📝 | Configurable Instructions | Global and per-board MCP instructions with “Reset to Default” support |
| 📝 | Changelog Generation | AI-powered generation of markdown changelogs from completed tasks |
| 🔗 | Task Deep-Linking | Copy unique task URLs for direct navigation and easy sharing |
| ⚡ | Real-time Polling | Automatic board sync to keep human and AI agent actions in sync |
| 🗄️ | MySQL Persistence | Reliable data storage with Drizzle ORM |
Screenshots
💾 Board Management
- Import Board: Available on the Dashboard page.
- Export Board: Available in the Board Settings panel.
🚀 Quick Start
The quickest way to run a local instance is Docker Compose. This starts the app, MySQL, and development-only Adminer and Mailpit services.
🐳 Run locally with Docker Compose
Prerequisites: Docker Desktop or Docker Engine with the Compose v2 plugin.
git clone https://github.com/dizlexic/moo-agent-board.git
cd moo-agent-board
cp .env.example .env
Before starting, edit .env and replace NUXT_SESSION_PASSWORD, DB_ROOT_PASSWORD, and DB_PASSWORD with unique secrets. Generate a secret with openssl rand -hex 32; use a different value for each password. The session password must be at least 32 characters. The example database credentials are for local development only—never expose them to the internet.
Start the stack:
docker compose up --build -d
docker compose logs -f app
The app is at http://localhost:3000. Register an account to create your first board. The container waits for MySQL and runs database migrations on startup; the first start can take a few minutes. Adminer (http://localhost:8080) and the Mailpit inbox (http://localhost:8025) are for local development only. To log into Adminer, select MySQL, use db as the server, and enter DB_USER and DB_PASSWORD from .env. Mailpit captures outgoing messages so you can inspect them without sending real email.
MySQL data is stored in the db-data Docker volume. docker compose down stops the services without removing data; docker compose down -v deletes the database volume and all its data.
🛠️ Run the app from source
For development, install Node.js v26.13.0 (see .nvmrc), npm, and MySQL 8. Copy .env.example to .env, configure the database connection and a 32-character-or-longer NUXT_SESSION_PASSWORD, then install dependencies with npm ci. Set DATABASE_URL to your MySQL connection string; npm run db:migrate applies migrations, and npm run dev starts the app. If using the Compose Mailpit service from your host, set SMTP_HOST=localhost and SMTP_PORT to MAILPIT_SMTP_PORT (default 1025).
📖 Usage Guide
Get up and running in just a few minutes:
- Launch: Once the server is running, navigate to
http://localhost:3000(or the live site at mootasks.dev). - Account: Register your account at
/registeror login. - Create Board: Head to the Dashboard to create your first project board.
- Manage Tasks: Add, move, and update tasks on your new board using the drag-and-drop Kanban view or the list view.
- Connect AI: Go to Board Settings to view your MCP configuration and connect your favorite AI agent (e.g., Claude Code, Cursor, VS Code).
- Seed Data: Need test data? Run
npx tsx server/db/seed.tsto populate the database with sample tasks.
⚙️ Environment Variables
Copy .env.example to .env and adjust for your environment. Compose supplies its own internal database URL and uses the db service name; when running the app directly on your host, use localhost and the published database port instead.
| Variable | Default | Description |
|---|---|---|
BASE_URL |
http://localhost:3000 |
Public app URL used in verification, password-reset, and invitation emails |
HOST |
localhost in the example; Compose uses 0.0.0.0 |
Server bind address |
PORT |
3000 |
Server port |
DB_ROOT_PASSWORD |
password |
MySQL root password for the Compose database; replace before deployment |
DB_USER |
mootasks |
MySQL application user |
DB_PASSWORD |
password |
MySQL application password; replace before deployment |
DB_NAME |
mootasks |
MySQL database name |
DB_HOST |
localhost |
MySQL host for local development; Compose connects to db internally |
DB_PORT |
3306 |
MySQL connection port for local development; Compose uses internal port 3306 |
DB_LOCAL_PORT |
3307 |
Host port published by Compose for MySQL |
DATABASE_URL |
(unset) | MySQL connection string; required for migrations and takes precedence over individual database settings |
DB_SSL |
(unset) | Set to REQUIRED to enable TLS when connecting with individual database settings |
NUXT_SESSION_PASSWORD |
(required) | Unique secret of at least 32 characters for session cookies |
SMTP_HOST |
mailpit |
SMTP server; use localhost when running the app directly on the host |
SMTP_PORT |
1025 |
SMTP server port |
SMTP_USER / SMTP_PASSWORD |
(empty) | SMTP credentials; not needed for Mailpit |
SMTP_FROM |
noreply@localhost |
Sender address for outgoing email |
ADMINER_PORT |
8080 |
Host port published for Adminer |
MAILPIT_UI_PORT |
8025 |
Host port published for the Mailpit inbox |
MAILPIT_SMTP_PORT |
1025 |
Host port published for Mailpit SMTP |
When running the app on the host against the Compose database, use DB_HOST=localhost and set DB_PORT to DB_LOCAL_PORT (default 3307). Set BASE_URL to the public origin and configure a real SMTP provider before sending email from a deployed instance. See Self-hosting and production setup before exposing an instance to the internet.
🤖 MCP Server
Moo Tasks is primarily an MCP server and Agent API. While it provides a web interface for humans, its core purpose is to enable AI agents to manage tasks programmatically.
🎯 Board-Scoped Architecture
Everything in Moo Tasks is scoped to a board. There are no global queries for tasks. This ensures that agents only work within the context they are assigned to, improving focus and security.
- Each board has its own unique MCP endpoint.
- AI agents connect to a specific board to work on its tasks.
- Resources, prompts, and tools are all scoped to the active board.
📋 Working with Tasks via MCP
The board acts as the primary task list for this application. To programmatically work on tasks:
- Get the MCP Token: In the Board Settings, generate an MCP token if the board is private.
- Configure Your Agent: Add the MCP server configuration for your specific board.
- Use Tools: Use the available tools (
list-tasks,accept-task,update-task-status, etc.) to interact with the tasks.
🔐 Security & Privacy
| Mode | Description |
|---|---|
| 🔒 Private (Default) | Requires a token in the Authorization: Bearer HTTP header |
| 🌐 Public | Allows access without a token (for local development) |
Tokens can be generated, rotated, or revoked at any time from Board Settings.
🛠️ Tools
| Tool | Description |
|---|---|
list-tasks |
List tasks with optional status/priority/limit filters |
get-task |
Get full details of a task by ID |
create-task |
Create a new task |
update-task-status |
Update a task’s status |
accept-task |
Assign yourself to a task and move it to in_progress |
reject-task |
Reject a task review and move it back to todo |
add-comment |
Post progress notes or questions on a task |
submit-for-review |
Mark a task ready for human review |
request-corrections |
Create a linked correction task |
generate-changelog |
Generate a markdown changelog from completed tasks |
list-plans |
Discover available task plans/templates |
apply-plan |
Apply a task plan to the board |
create-board |
Create a new board (requires account token) |
get-installation-instructions |
Get setup instructions |
📚 Resources
| URI | Description |
|---|---|
moo-tasks:///board-state |
Full board snapshot grouped by status |
moo-tasks:///agent-instructions |
Workflow instructions for agents |
💬 Prompts
| Prompt | Description |
|---|---|
task-workflow |
Guided workflow for discovering and completing tasks |
🔄 Task Hierarchy & Corrections
Moo Tasks supports a refined workflow for task completion:
- Review Status — Move tasks to “Review” when ready for human verification
- Request Corrections — From “Review” or “Done”, create linked “Correction Tasks”
- Linked Navigation — Correction tasks link to their parent for easy navigation
Configurable Instructions
| Level | Description |
|---|---|
| 🌍 Global | Edit at /settings/instructions, applies to all boards by default |
| 📋 Per-Board | Override in board settings, falls back to global when reset |
Both support reset to default to restore the original built-in instructions.
🔌 MCP Client Configuration
📡 API Routes
☁️ Deploy your own instance
The Compose stack above is for local use, not production: it publishes development tools and uses a local database volume. For a production checklist covering hosting, secrets, database, email, and migrations, see Self-hosting and production setup. A DigitalOcean App Platform example is available in .do/app.yaml; the GitHub Actions workflow only builds the project and does not deploy it.
🧱 Tech Stack
| Technology | Purpose |
|---|---|
| Nuxt 4 (Nitro + Vue 3) | Framework |
| Tailwind CSS v4 | Styling |
| MySQL + Drizzle ORM | Database |
| nuxt-auth-utils | Auth (sealed cookie sessions, scrypt hashing) |
| @modelcontextprotocol/sdk | MCP server integration |
| vuedraggable | Drag & drop |
| nanoid | ID generation |
Built with 🐄 by dizlexic
Install
This server does not publish a one-line install command.
Open the repository installation guide New to MCP? Start with the mcpskill.org guide →Configuration
{
"mcpServers": {
"moo-tasks": {
"type": "streamable-http",
"url": "http://localhost:3000/api/boards/<boardId>/mcp",
"headers": {
"Authorization": "Bearer <your-bearer-token>"
}
}
}
}