Microsoft To Do CLI
Manage tasks in Microsoft To Do using the todo command.
User Request
$ARGUMENTS
Commands Reference
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 including completed
# Create task
todo new "Task name" --json # Basic task
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 (in 2 hours)
todo new "Task" -d mon -r 9am --json # Due Monday, remind at 9am
todo new "Task" -I --json # Important (high priority)
todo new "Task" -R daily --json # Recurring daily
todo new "Task" -R weekly:mon,fri --json # Recurring on specific days
todo new "Task" -S "Step 1" -S "Step 2" --json # With subtasks
todo new "Task" -N "Note content" --json # With note
todo new "Task" -L "https://jira.com/ZD-1" --json # With link
# View single task
todo show "Task" --json # Show task details
todo show 0 --json # Show by index
# Update task
todo update "Task" --title "New" --json # Rename
todo update "Task" -d friday -I --json # Change due date, make important
# Complete/Uncomplete
todo complete "Task" --json # Mark complete
todo complete 0 1 2 --json # Complete by index (batch)
todo uncomplete "Task" --json # Reopen task
# Delete
todo rm "Task" -y --json # Delete task
Subtasks (Steps)
todo new-step "Task" "Step text" --json # Add step
todo list-steps "Task" --json # List steps
todo complete-step "Task" "Step" --json # Check off step
todo uncomplete-step "Task" "Step" --json # Uncheck step
todo rm-step "Task" 0 --json # Remove step by index
Notes
todo note "Task" "Note content" --json # Add/update note
todo show-note "Task" --json # Display note
todo clear-note "Task" --json # Remove note
Notes are text content attached to a task. Use todo show "Task" to see the note along with other task details.
Deep Links
# Add a link to a task
todo link "Task" "https://jira.com/ZD-123" --app Jira --title ZD-123 --json
todo link "Task" "https://github.com/org/repo/pull/42" --app GitHub --json
todo link "Task" "https://app.slack.com/..." --app Slack --json
# Add link by task ID
todo link --id "AAMk..." -l Tasks "https://jira.com/ZD-123" --app Jira --json
# List links on a task
todo links "Task" --json
todo links --id "AAMk..." -l Tasks --json
# Remove all links from a task
todo unlink "Task" --json
todo unlink --id "AAMk..." -l Tasks --json
# Remove a specific link by index
todo unlink "Task" --index 0 --json
Deep links attach URLs to tasks using Microsoft To Do's linked resources API. In the To Do app, links appear as clickable "Open in {app}" buttons. The --app flag sets the application name (defaults to URL domain), --title sets the display name (defaults to URL).
File Attachments
# Attach a file to a task
todo attach "Task" /path/to/file.pdf --json
todo attach --id "AAMk..." -l Tasks /path/to/file.pdf --json
# List attachments on a task
todo attachments "Task" --json
todo attachments --id "AAMk..." -l Tasks --json
# Remove all attachments from a task
todo detach "Task" --json
# Remove a specific attachment by index
todo detach "Task" --index 0 --json
# Download all attachments to current directory
todo download "Task"
# Download specific attachment to a directory
todo download "Task" --index 0 -o /tmp/downloads
# Create a task with an attachment
todo new "Review report" --attach /path/to/report.pdf --json
File attachments use the Microsoft Graph API. Files up to 3 MB are uploaded directly; 3-25 MB use an upload session. Max size: 25 MB.
todo attachments --json:
{
"list": "Tasks",
"attachments": [
{
"id": "AAMk...",
"name": "report.pdf",
"content_type": "application/pdf",
"size": 123456
}
]
}
todo attach / todo detach:
{"action": "attached", "attachment_id": "AAMk...", "file_name": "report.pdf", "task_id": "AAMk...", "title": "Task", "list": "Tasks"}
{"action": "detached", "task_id": "AAMk...", "title": "Task", "count": 1, "list": "Tasks"}
todo links --json:
{
"list": "Tasks",
"links": [
{
"id": "b9b5a24d-...",
"url": "https://jira.com/ZD-123",
"app": "Jira",
"display_name": "ZD-123"
}
]
}
todo link / todo unlink:
{"action": "linked", "link_id": "b9b5...", "task_id": "AAMk...", "title": "Task", "url": "https://...", "list": "Tasks"}
{"action": "unlinked", "task_id": "AAMk...", "title": "Task", "count": 1, "list": "Tasks"}
Lists
todo lists --json # Show all lists
todo new-list "Project X" --json # Create list
todo rename-list "Old" "New" --json # Rename list
todo rm-list "Project X" -y --json # Delete list
JSON Response Structures
todo tasks --json:
{
"list": "Tasks",
"tasks": [
{
"id": "AAMkADU3...",
"title": "Buy groceries",
"status": "notStarted",
"importance": "normal",
"due_date": null,
"reminder": null,
"recurrence": null,
"steps": []
}
]
}
todo lists --json:
{
"lists": [
{"id": "AAMk...", "name": "Tasks", "is_owner": true},
{"id": "AAMk...", "name": "Work", "is_owner": true}
]
}
Write commands (new, complete, rm):
{"action": "created", "id": "AAMk...", "title": "Task", "list": "Tasks"}
{"action": "completed", "id": "AAMk...", "title": "Task", "list": "Tasks"}
{"action": "removed", "id": "AAMk...", "title": "Task", "list": "Tasks"}
Task Identification
| Method | Stability | When to Use |
|---|---|---|
--id "AAMk..." | Stable | Multi-step operations, automation |
Index (0, 1) | Unstable | Quick interactive commands only |
Name ("Task") | Unstable | Unique task names only |
# Use --id with -l (list context required)
todo complete --id "AAMkADU3..." -l Tasks --json
todo update --id "AAMkADU3..." --title "New title" -l Work --json
todo rm --id "AAMkADU3..." -l Tasks -y --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, 12/31/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 |
Instructions
- Parse the user's natural language request
- Determine the appropriate
todocommand - Always use
--jsonflag -- all examples above include it - Always use
-yflag withrmcommands - For multi-step operations, capture ID from JSON response:
ID=$(todo new "Task" -l Work --json | jq -r '.id') todo complete --id "$ID" -l Work --json - Parse JSON response and report result clearly to the user
If the request is ambiguous, ask for clarification.
