Back to Skills
    🦞

    microsoft-todo

    Manage Microsoft To Do tasks via the `todo` CLI.

    By @underwear
    View on GitHub
    SKILL.md
    ---
    name: microsoft-todo
    description: "Manage Microsoft To Do tasks via the `todo` CLI. Use when user wants to add, list, complete, remove tasks, manage subtasks (steps), notes, or organize task lists."
    homepage: https://github.com/underwear/microsoft-todo-cli
    metadata:
      {
        "openclaw":
          {
            "emoji": "✅",
            "requires": { "bins": ["todo"] },
            "install":
              [
                {
                  "id": "pip",
                  "kind": "uv",
                  "package": "microsoft-todo-cli",
                  "bins": ["todo"],
                  "label": "Install microsoft-todo-cli (pip/uv)",
                },
              ],
          },
      }
    ---
    
    # Microsoft To Do CLI
    
    Manage tasks in Microsoft To Do using the `todo` command.
    
    ## References
    
    - `references/setup.md` (Azure app registration + OAuth configuration)
    
    ## Prerequisites
    
    1. `todo` CLI installed (`pip install microsoft-todo-cli`)
    2. Microsoft Azure app registered (see `references/setup.md`)
    3. Credentials configured at `~/.config/microsoft-todo-cli/keys.yml`
    4. First run completes OAuth flow in browser
    
    ## Commands
    
    ### Tasks
    
    ```bash
    # 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)
    
    ```bash
    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
    
    ```bash
    todo note "Task" "Note content"
    todo show-note "Task"
    todo clear-note "Task"
    ```
    
    ### Lists
    
    ```bash
    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:
    
    ```bash
    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