Sandbox
@dizlexic/moo-tasks

MCP task board for Claude Code and Cursor

Moo Tasks gives you a kanban board for human task tracking and a board-scoped MCP server for agent work. The agent can discover tasks, accept them, update status, add comments, and create follow-up work through the same board.

45 stars3 forksVueUpdated 2mo ago
Who it's for

Builders who want an agent to manage tasks from a shared kanban board.

What it delivers

You can keep human and agent work in one board instead of switching between chat and task tools.

What it does

Kanban board and task list

Move tasks through Backlog, To Do, In Progress, Review, and Done in a drag-and-drop UI, or switch to a compact list view.

Board-scoped MCP server

Each board has its own MCP endpoint, so agents only see the tasks, comments, and instructions for that board.

Agent task tools

The MCP server exposes tools like `list-tasks`, `get-task`, `create-task`, `accept-task`, `update-task-status`, `add-comment`, and `request-corrections`.

Shared instructions and prompts

Global and per-board instructions, plus a `task-workflow` prompt, guide how agents should work on tasks.

Multiuser board management

Users can register, invite collaborators, manage roles, and keep boards private or public with bearer-token access.

Changelog and plans

Agents can generate changelogs from completed tasks and apply task plans or templates to a board.

How to get it

  1. 1If you have Docker installed, you can start the entire stack (including the database,…
    docker-compose up -d
  2. 2or
    docker compose up -d

README

Moo Tasks Logo

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.

Moo Tasks Workflow

Nuxt 4 Tailwind CSS v4 MySQL MCP MIT License


✨ Features

FeatureDescription
👤User AccountsEmail/password registration and login with sealed cookie sessions
⚙️Account SettingsManage global MCP tokens and user account information
📋Multiple BoardsCreate and manage multiple project boards with custom descriptions
📋Task PlansCreate, manage, and apply task templates/plans to project boards
💾Import/ExportImport and export boards as JSON
👥Board CollaborationInvite users by email, manage member roles (Owner/Member)
🔄5-Column KanbanWorkflow stages: Backlog → To Do → In Progress → Review → Done
🔢Sequential Task IDsTasks have human-readable sequential IDs (e.g., #1, #2) per board
🔀Dual View ModesToggle between visual Kanban Board and condensed Task List
🖱️Drag & DropIntuitive task movement between columns using vuedraggable
🔧Correction TasksRequest specific fixes with linked child tasks for task refinement
🤖MCP ServerPer-board MCP endpoints with bearer token auth & Public/Private toggles
📝Configurable InstructionsGlobal and per-board MCP instructions with "Reset to Default" support
📝Changelog GenerationAI-powered generation of markdown changelogs from completed tasks
🔗Task Deep-LinkingCopy unique task URLs for direct navigation and easy sharing
Real-time PollingAutomatic board sync to keep human and AI agent actions in sync
🗄️MySQL PersistenceReliable data storage with Drizzle ORM

Screenshots

Moo Tasks Workflow

Moo Tasks Workflow

Moo Tasks Workflow


💾 Board Management

  • Import Board: Available on the Dashboard page.
  • Export Board: Available in the Board Settings panel.

🚀 Quick Start

The fastest way to get started with Moo Tasks is using Docker.

🐳 Running with Docker (Recommended)

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:

docker-compose up -d

or

docker compose up -d

The application will be available at http://localhost:3000.

🛠️ Manual Development Setup

If you prefer to run locally without Docker:

  1. Prerequisites: Ensure you have Mysql 8, Node.js (v22+) and npm installed.
  2. Install dependencies: npm install
  3. Environment Variables: Create a .env file from .env.example and set NUXT_SESSION_PASSWORD (at least 32 characters long).
  4. Start development server: npm run dev

📖 Usage Guide

Get up and running in just a few minutes:

  1. Launch: Once the server is running, navigate to http://localhost:3000 (or the live site at mootasks.dev).
  2. Account: Register your account at /register or login.
  3. Create Board: Head to the Dashboard to create your first project board.
  4. Manage Tasks: Add, move, and update tasks on your new board using the drag-and-drop Kanban view or the list view.
  5. Connect AI: Go to Board Settings to view your MCP configuration and connect your favorite AI agent (e.g., Claude Code, Cursor, VS Code).
  6. Seed Data: Need test data? Run npx tsx server/db/seed.ts to populate the database with sample tasks.

⚙️ Environment Variables

Copy .env.example to .env and adjust as needed:

VariableDefaultDescription
HOST0.0.0.0Server bind address
PORT3000Server port
DB_USERmootasksMySQL user
DB_PASSWORDmootasksMySQL password
DB_NAMEmootasksMySQL database name
DB_PORT3307MySQL local port mapping
DATABASE_URL(required if not using Docker)MySQL connection string
NUXT_SESSION_PASSWORD(required)32+ char secret for sealed cookie sessions

🤖 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:

  1. Get the MCP Token: In the Board Settings, generate an MCP token if the board is private.
  2. Configure Your Agent: Add the MCP server configuration for your specific board.
  3. Use Tools: Use the available tools (list-tasks, accept-task, update-task-status, etc.) to interact with the tasks.

🔐 Security & Privacy

ModeDescription
🔒 Private (Default)Requires a Bearer Token via the token query parameter
🌐 PublicAllows access without a token (for local development)

Tokens can be generated, rotated, or revoked at any time from Board Settings.

🛠️ Tools

ToolDescription
list-tasksList tasks with optional status/priority/limit filters
get-taskGet full details of a task by ID
create-taskCreate a new task
update-task-statusUpdate a task's status
accept-taskAssign yourself to a task and move it to in_progress
reject-taskReject a task review and move it back to todo
add-commentPost progress notes or questions on a task
submit-for-reviewMark a task ready for human review
request-correctionsCreate a linked correction task
generate-changelogGenerate a markdown changelog from completed tasks
list-plansDiscover available task plans/templates
apply-planApply a task plan to the board
create-boardCreate a new board (requires account token)
get-installation-instructionsGet setup instructions

📚 Resources

URIDescription
moo-tasks://<boardId>/board-stateFull board snapshot grouped by status
moo-tasks://<boardId>/agent-instructionsWorkflow instructions for agents

💬 Prompts

PromptDescription
task-workflowGuided 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

LevelDescription
🌍 GlobalEdit at /settings/instructions, applies to all boards by default
📋 Per-BoardOverride in board settings, falls back to global when reset

Both support reset to default to restore the original built-in instructions.


🔌 MCP Client Configuration

Claude Code
{
  "mcpServers": {
    "moo-tasks": {
      "type": "streamable-http",
      "url": "http://localhost:3000/api/boards/<boardId>/mcp",
      "headers": {
        "Authorization": "Bearer <your-bearer-token>"
      }
    }
  }
}
Cursor

Add to .cursor/mcp.json:

{
  "mcpServers": {
    "moo-tasks": {
      "type": "streamable-http",
      "url": "http://localhost:3000/api/boards/<boardId>/mcp",
      "headers": {
        "Authorization": "Bearer <your-bearer-token>"
      }
    }
  }
}
VS Code / JetBrains / generic MCP client

Add to your client's MCP config (e.g. .vscode/mcp.json or JetBrains MCP settings):

{
  "mcpServers": {
    "moo-tasks": {
      "type": "streamable-http",
      "url": "http://localhost:3000/api/boards/<boardId>/mcp",
      "headers": {
        "Authorization": "Bearer <your-bearer-token>"
      }
    }
  }
}

💡 The board page has a 📋 Copy JSON button that emits this exact snippet pre-filled with your board ID and token.

🔐 Security & Scoping

  • Each MCP endpoint is scoped to a single board (/api/boards/<boardId>/mcp). The server only ever sees tasks, comments, and instructions belonging to that one board.
  • Tokens are sent via the standard Authorization: Bearer <token> HTTP header per the MCP authorization spec. Query-string tokens are no longer accepted.
  • Generate or revoke a board's token from the board settings drawer at any time. Revoking immediately invalidates all existing agent connections.
  • Boards may also be marked mcpPublic in settings for read-friendly demos; in that mode no token is required, but it is not recommended for real work.

📡 API Routes

Authentication
MethodRoutePurpose
POST/api/auth/registerRegister with email/password
POST/api/auth/loginLogin with email/password
Boards
MethodRoutePurpose
GET/api/boardsList boards for current user
POST/api/boardsCreate a new board
GET/api/boards/:idGet board details
PATCH/api/boards/:idUpdate board (owner only)
DELETE/api/boards/:idDelete board (owner only)
Board Members
MethodRoutePurpose
GET/api/boards/:id/membersList board members
POST/api/boards/:id/membersInvite user by email
DELETE/api/boards/:id/members/:userIdRemove member
Tasks
MethodRoutePurpose
GET/api/boards/:id/tasksList tasks for a board
POST/api/boards/:id/tasksCreate a task in a board
GET/api/tasks/:idGet a single task
PATCH/api/tasks/:idUpdate task fields
DELETE/api/tasks/:idDelete a task
Instructions
MethodRoutePurpose
GET/api/instructionsGet global instructions
PUT/api/instructions/:idUpdate global instruction
POST/api/instructions/:id/resetReset to default
GET/api/boards/:id/instructionsGet board instructions
PUT/api/boards/:id/instructions/:instructionIdUpdate board instruction
POST/api/boards/:id/instructions/:instructionId/resetReset board instruction

🐳 Docker

Build & Run

# Build
docker build -t moo-tasks .

# Run
docker run -p 3000:3000 \
  -e NUXT_SESSION_PASSWORD="your-secret" \
  -e DATABASE_URL="mysql://user:pass@host:3306/db" \
  moo-tasks

☁️ Deploy to DigitalOcean App Platform

Prerequisites
Option 1: One-Click via App Spec
  1. Fork/push this repo to GitHub
  2. Go to DigitalOcean App PlatformCreate App
  3. Connect your GitHub repo and select the main branch
  4. DigitalOcean will auto-detect the Dockerfile — confirm the settings
  5. Under Environment Variables, add these secrets:
    • NUXT_SESSION_PASSWORD — 32+ character secret for session encryption
    • DATABASE_URL — Your MySQL connection string
  6. Deploy!

Note: MySQL is recommended for production as it allows you to increase instance_count to handle more traffic.

Option 2: Deploy with doctl
# Install doctl and authenticate
doctl auth init

# Create the app from the spec (update repo in .do/app.yaml first)
doctl apps create --spec .do/app.yaml

# Set secrets
doctl apps update <app-id> --spec .do/app.yaml
Option 3: CI/CD with GitHub Actions

The included workflow at .github/workflows/deploy.yml automatically:

  • On pull requests — builds and validates the project
  • On push to main — builds, then deploys to DigitalOcean App Platform

Setup:

  1. Create the app on DigitalOcean first (Option 1 or 2)
  2. Generate a DigitalOcean API token
  3. Add it as a GitHub repository secret:
    • Go to Settings → Secrets and variables → Actions
    • Add DIGITALOCEAN_ACCESS_TOKEN with your DO API token
  4. Push to main — the workflow will deploy automatically
App Spec Reference

The .do/app.yaml file defines the full app configuration:

name: moo-tasks

services:
  - name: web
    dockerfile_path: Dockerfile
    github:
      branch: main
      deploy_on_push: true
    http_port: 3000
    instance_count: 1
    instance_size_slug: apps-s-1vcpu-1gb
    envs:
      - key: NUXT_SESSION_PASSWORD
        type: SECRET
      - key: DATABASE_URL
        type: SECRET
Troubleshooting
  • "Only board owners can invite users" or missing boards after creation: Ensure DATABASE_URL is correctly configured and the MySQL server is accessible from the app.
  • Scalability: Unlike SQLite, you can increase instance_count to handle more traffic, as all instances share the same MySQL database.
  • Session Reset: If the database is reset but your browser still has a session cookie, the app will automatically log you out. Simply register again to start fresh.

🧱 Tech Stack

TechnologyPurpose
Nuxt 4 (Nitro + Vue 3)Framework
Tailwind CSS v4Styling
MySQL + Drizzle ORMDatabase
nuxt-auth-utilsAuth (sealed cookie sessions, scrypt hashing)
@nuxtjs/mcp-toolkitMCP server integration
vuedraggableDrag & drop
nanoidID generation

Moo Tasks
Built with 🐄 by dizlexic

Files in the repo

Repository payload26 top-level entries
  • .do
  • .github
  • app
  • docs
  • drizzle
  • public
  • scripts
  • server
  • .dockerignore
  • .env.example
  • .gitignore
  • .nuxtrc
  • AGENTS.md
  • CHANGELOG.md
  • docker-compose.yml
  • Dockerfile
  • drizzle.config.ts
  • fetch_tasks.mjs
  • inspect_logs.mjs
  • LICENSE
  • nuxt.config.ts
  • package-lock.json
  • package.json
  • README.md
  • tsconfig.json
  • vitest.config.ts

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More connectors

Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface

86k

High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph — average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

43k

Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code

14k
okf-memory/
okf-agent-memory

Git-native persistent memory for AI coding agents. Implements Google OKF v0.2 with sub-300µs in-memory BM25 search, embedded MCP server, and progressive disclosure. Slashes token bloat by 80% with zero external databases or dependencies. Built in pure Go.

547
tirth8205/
code-review-graph

Local-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.

31k
2akouwu/
reverify

Stop your AI from making things up — it proposes, deterministic tools decide, every claim checked against ground truth with evidence. Grounded facts and context survive resets. Reverse engineering is the proving ground. MCP server + CLI.

1.1k