Omnispindle Todo Management
STDIOFastMCP-based server that receives todo requests and stores them in MongoDB.
FastMCP-based server that receives todo requests and stores them in MongoDB.
A comprehensive FastMCP-based todo management system that serves as a central nervous system for multi-project task coordination. Part of the Madness Interactive ecosystem, Omnispindle combines AI-powered task insights, an MCP toolbelt, and task board to transform chaos into productivity.
Example of a todo output from Claude Sonnet 4.0 without anything being additional being added to the prompt:
{ "project": "Omnispindle", "description": "ANALYSIS: Node-RED routing issues - need to fix link-in/link-out patterns for project operations to match todo operation patterns", "priority": "High", "metadata": { "ticket": "routing-analysis", "tags": [ "node-red", "routing", "analysis", "link-nodes" ] } } Result: {"success": true, "todo_id": "af007427-9ebb-4304-8d95-5cafc4a855dd", "message": "Todo created successfully"}
Omnispindle consists of multiple integrated components:
The captured tasks integrate seamlessly with the Todomill Projectorium dashboard, where you can review, refine, and execute them when you're ready to tackle them.
Clone the repository:
git clone https://github.com/DanEdens/Omnispindle.git cd Omnispindle
Install with uv (recommended):
curl -LsSf https://astral.sh/uv/install.sh | sh uv venv source .venv/bin/activate # On Unix/macOS uv pip install -r requirements.txt
Configure environment:
cp .env.example .env # Edit .env with your MongoDB and MQTT settings
Start with Docker (easiest):
docker-compose up -d
Create a .env
file with your settings:
# MongoDB Configuration MONGODB_URI=mongodb://localhost:27017 MONGODB_DB=todo_app MONGODB_COLLECTION=todos # MQTT Configuration MQTT_HOST=localhost MQTT_PORT=1883 # AI Integration (optional) AI_API_ENDPOINT=http://localhost:1234/v1 AI_MODEL=qwen2.5-7b-instruct
Add to your Claude Desktop claude_desktop_config.json
:
{ "mcpServers": { "omnispindle": { "command": "docker", "args": [ "run", "--rm", "-i", "--network", "host", "-e", "MONGODB_URI=mongodb://localhost:27017", "-e", "MONGODB_DB=swarmonomicon", "-e", "MQTT_HOST=localhost", "danedens31/omnispindle:latest" ] } } }
{ "mcpServers": { "omnispindle": { "command": "docker", "args": [ "run", "--rm", "-i", "--env-file", "/path/to/your/.env", "--network", "omnispindle_default", "danedens31/omnispindle:latest" ] } } }
{ "mcpServers": { "omnispindle": { "command": "python", "args": ["-m", "src.Omnispindle"], "cwd": "/path/to/Omnispindle", "env": { "MONGODB_URI": "mongodb://localhost:27017", "MONGODB_DB": "swarmonomicon", "MQTT_HOST": "localhost" } } } }
The server exposes the following tools for AI agents:
add_todo_tool
- Create new tasks with metadataquery_todos_tool
- Search and filter tasksupdate_todo_tool
- Modify existing tasksmark_todo_complete_tool
- Complete taskslist_project_todos_tool
- Get tasks by projectadd_lesson_tool
- Capture lessons learnedsearch_lessons_tool
- Query knowledge basemqtt_publish_tool
- Send real-time messagesmqtt_get_tool
- Retrieve MQTT messages# Development mode python -m src.Omnispindle # Production mode uvicorn src.Omnispindle.server:app --host 0.0.0.0 --port 8000
The server exposes standardized MCP tools that AI agents can call:
# Example: AI agent creating a todo await add_todo_tool( description="Implement user authentication", project="Omnispindle", priority="High", target_agent="developer", metadata={"ticket": "AUTH-123", "tags": ["security", "backend"]} ) # Example: AI agent querying todos results = await query_todos_tool( query_or_filter="project:Omnispindle", fields_or_projection="all", limit=50 )
from fastmcp import FastMCPClient # Connect to Omnispindle client = FastMCPClient("http://localhost:8000") # Create a new todo response = await client.call_tool("add_todo_tool", { "description": "Fix critical bug in authentication", "project": "Madness_interactive", "priority": "High" }) # Get project todos todos = await client.call_tool("list_project_todos_tool", { "project": "Omnispindle", "limit": 10 })
http://localhost:1880/ui
Todomill_projectorium/ExportedNodeRedTabs/
Omnispindle/
├── src/Omnispindle/ # Main MCP server implementation
│ ├── __init__.py # Tool registration and initialization
│ ├── server.py # FastMCP server core
│ ├── tools.py # Todo and lesson management tools
│ ├── ai_assistant.py # AI integration and suggestions
│ ├── scheduler.py # Smart scheduling features
│ ├── mqtt.py # MQTT messaging integration
│ └── todo_log_service.py # Audit logging service
├── Todomill_projectorium/ # Node-RED dashboard subrepo
│ ├── ExportedNodeRedTabs/ # Node-RED flow definitions
│ ├── JavascriptFromFunctionNode/ # Dashboard logic
│ ├── HtmlFromTemplateNode/ # UI templates
│ └── UIComponents/ # Reusable UI components
├── tests/ # Test suite
├── config/ # Configuration files
├── docs/ # Documentation
├── docker-compose.yml # Container orchestration
└── pyproject.toml # Project metadata
# Run all tests pytest tests/ # Run with coverage pytest --cov=src tests/ # Run specific tests pytest tests/test_todo_log.py -v
Todomill_projectorium/
src/Omnispindle/tools.py
src/Omnispindle/__init__.py
tests/
# Omnispindle works with Swarmonomicon for distributed task processing from swarmonomicon import TaskAgent agent = TaskAgent("omnispindle-worker") agent.register_mcp_server("http://localhost:8000") # Agent can now create and manage todos via MCP await agent.execute_task("create_todo", { "description": "Process data pipeline", "project": "Swarmonomicon" })
# Sync todos with GitHub issues todo_id = await add_todo_tool( description="Fix authentication bug", project="Madness_interactive", metadata={"github_issue": 1234} )
# Subscribe to todo events mosquitto_sub -t "omnispindle/todos/+/+" # Publish todo creation request mosquitto_pub -t "omnispindle/todos/create" -m '{ "description": "Deploy to production", "project": "Omnispindle", "priority": "High" }'
git checkout -b feature/amazing-feature
pytest tests/
MIT License - see LICENSE file for details.
"In the chaotic symphony of development tasks, Omnispindle conducts with AI-powered precision!" 🎭✨