Microsoft To Do CLI
Manage tasks in Microsoft To Do using the todo command.
References
references/setup.md (Azure app registration + OAuth configuration)
Prerequisites
todo CLI installed (pip install microsoft-todo-cli)
- Microsoft Azure app registered (see
references/setup.md)
- Credentials configured at
~/.config/microsoft-todo-cli/keys.yml
- First run completes OAuth flow in browser
Commands
Tasks
# List tasks
todo tasks --json # Default list
todo tasks Work --json # Specific list
todo tasks --due-today --json # Due today
todo tasks --overdue --json # Past due
todo tasks --important --json # High priority
todo tasks --completed --json # Done tasks
todo tasks --all --json # Everything
# Create task
todo new "Task name" --json # Basic
todo new "Task" -l Work --json # In specific list
todo new "Task" -d tomorrow --json # With due date
todo new "Task" -r 2h --json # With reminder
todo new "Task" -d mon -r 9am --json # Due Monday, remind 9am
todo new "Task" -I --json # Important
todo new "Task" -R daily --json # Recurring daily
todo new "Task" -R weekly:mon,fri --json # Specific days
todo new "Task" -S "Step 1" -S "Step 2" --json # With subtasks
todo new "Task" -N "Note content" --json # With note
# Update task
todo update "Task" --title "New" --json
todo update "Task" -d friday -I --json
# Complete/Uncomplete
todo complete "Task" --json
todo complete 0 1 2 --json # Batch by index
todo uncomplete "Task" --json
# Delete
todo rm "Task" -y --json
Subtasks (Steps)
todo new-step "Task" "Step text" --json
todo list-steps "Task" --json
todo complete-step "Task" "Step" --json
todo uncomplete-step "Task" "Step" --json
todo rm-step "Task" 0 --json
Notes
todo note "Task" "Note content"
todo show-note "Task"
todo clear-note "Task"
Lists
todo lists --json
todo new-list "Project X" --json
todo rename-list "Old" "New" --json
todo rm-list "Project X" -y --json
Task Identification
| Method |
Stability |
Use Case |
--id "AAMk..." |
Stable |
Automation, scripts |
Index (0, 1) |
Unstable |
Interactive only |
Name ("Task") |
Unstable |
Unique names only |
Use ID for multi-step operations:
ID=$(todo new "Task" -l Work --json | jq -r '.id')
todo complete --id "$ID" -l Work --json
Date & Time Formats
| Type |
Examples |
| Relative |
1h, 30m, 2d, 1h30m |
| Time |
9:30, 9am, 17:00, 5:30pm |
| Days |
tomorrow, monday, fri |
| Date |
2026-12-31, 31.12.2026 |
| Keywords |
morning (7:00), evening (18:00) |
Recurrence Patterns
| Pattern |
Description |
daily |
Every day |
weekly |
Every week |
monthly |
Every month |
yearly |
Every year |
weekdays |
Monday to Friday |
weekly:mon,wed,fri |
Specific days |
every 2 days |
Custom interval |
Aliases
| Alias |
Command |
t |
tasks |
n |
new |
c |
complete |
d |
rm |
sn |
show-note |
cn |
clear-note |
Notes
- Always use
--json for all commands to get structured output
- Always use
-y with rm commands to skip confirmation
- Use
--id with -l ListName for list context
- First run opens browser for OAuth authentication