Ms Todo Oauth
A robust CLI skill to manage Microsoft To Do tasks via Microsoft Graph API.
- Rating
- 4.1 (171 reviews)
- Downloads
- 17,120 downloads
- Version
- 1.0.0
Overview
A robust CLI skill to manage Microsoft To Do tasks via Microsoft Graph API.
Complete Documentation
View Source →ms-todo-oauth
A fully-tested Microsoft To Do command-line client for managing tasks and lists via Microsoft Graph API.
⚠️This is a oauth based script. It contains a generated Azure Client ID and Secret ID
IF YOU WORRIED ABOUT YOUR PRIVACY, CONSIDER REPLACING THEM TO YOUR OWN IN scripts\ms-todo-oauth.py.
Just search for values below:
client_id="ca6ec244……
client_secret="TwQ8Q……
✨ Features
- ✅ Full Task Management: Create, complete, delete, and search tasks
- 🗂️ List Organization: Create and manage multiple task lists
- ⏰ Rich Task Options: Priorities, due dates, reminders, descriptions, tags
- 🔄 Recurring Tasks: Daily, weekly, monthly patterns with custom intervals
- 📊 Multiple Views: Today, overdue, pending, statistics
- 🔍 Powerful Search: Find tasks across all lists
- 💾 Data Export: Export all tasks to JSON
- 🧪 Fully Tested: 29 comprehensive automated tests
- 🌐 Unicode Support: Full support for Chinese characters and emojis
Prerequisites
- Python >= 3.9 must be installed
- Working directory: All commands MUST be run from the root of this skill (the directory containing this SKILL.md file)
- Network access: Requires internet access to Microsoft Graph API endpoints
- Microsoft Account: Personal Microsoft account (Hotmail, Outlook.com) or work/school account
- Authentication: First-time use requires OAuth2 login via browser. See Authentication section
- Token cache:
~/.mstodo_token_cache.json(persists across sessions, auto-refreshed)
Installation & Setup
First-Time Setup
Before using this skill for the first time, dependencies must be installed:
# Navigate to skill directory
cd <path-to-ms-todo-oauth>
# Create a venv in the project (creates '.venv' folder)
python3 -m venv .venv
# Activate the venv choose based on platforms:
#- Bash/Zsh:
source .venv/bin/activate
# - Fish:
source .venv/bin/activate.fish
# - Windows (PowerShell):
.venv\Scripts\Activate.ps1
pip install --upgrade pip
pip install -r requirements.txt
# Alternative (global python env, not recommended):
# pip install -r requirements.txt
Dependencies:
msal(Microsoft Authentication Library) - Official Microsoft OAuth libraryrequests- HTTP client for API calls- Specified in
requirements.txt
Environment Verification
After installation, verify the setup:
# If using native venv (activate as above):
python3 scripts/ms-todo-oauth.py --help
# Expected: Command help text should be displayed
Troubleshooting:
- If
Python not found, install Python 3.9 or higher from https://python.org
Testing (Optional but Recommended)
Verify all functionality works correctly:
# Run comprehensive automated test suite (29 tests)
python3 test_ms_todo_oauth.py
# Expected: All tests pass (100% pass rate)
See Testing section for details.
Security Notes
- Uses official Microsoft Graph API via Microsoft's
msallibrary - All code is plain Python (.py files), readable and auditable
- Tokens stored locally in
~/.mstodo_token_cache.json - All API calls go directly to Microsoft endpoints (graph.microsoft.com)
- OAuth2 standard authentication flow
- No third-party services involved
Command Reference
All commands follow this pattern:
python3 scripts/ms-todo-oauth.py [GLOBAL_OPTIONS] <command> [COMMAND_OPTIONS]
Global Options
| Option | Description |
|---|---|
| -v, --verbose | Show detailed information (IDs, dates, notes).Must be placed BEFORE the subcommand. |
| --debug | Enable debug mode to display API requests and responses. Useful for troubleshooting.Must be placed BEFORE the subcommand. |
| --reauth | Force re-authentication by clearing the token cache and starting fresh login |
⚠️ Common mistake: Global options MUST come before the subcommand.
> - ✅ python3 scripts/ms-todo-oauth.py -v lists
- ✅ python3 scripts/ms-todo-oauth.py --debug add "Task"
- ❌ python3 scripts/ms-todo-oauth.py lists -vAuthentication
Authentication uses OAuth2 authorization code flow, designed for both interactive and automated environments.
#### login get — Get OAuth2 authorization URL
python3 scripts/ms-todo-oauth.py login get
Output example:
======================================================================
🔐 OAuth2 Authorization Required
======================================================================
Please visit the following URL to authorize the application:
https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?...
After authorization, you will be redirected to a callback URL.
Copy the 'code' parameter from the callback URL and run:
ms-todo-oauth.py login verify <authorization_code>
======================================================================
What to do:
- Open the provided URL in your browser
- Sign in with your Microsoft account
- Grant permissions when prompted
- You'll be redirected to a URL like:
http://localhost:8000/callback?code=M.R3_BAY.abc123... - Copy the entire code after
code=(usually a long string starting withM.R3_BAY.)
- Visit the URL
- Complete the login
- Copy the authorization code from the callback URL
- Provide it to you
login verify — Complete login with authorization codepython3 scripts/ms-todo-oauth.py login verify <authorization_code>
Example:
python3 scripts/ms-todo-oauth.py login verify "M.R3_BAY.abc123def456..."
Output on success:
✓ Authentication successful!
✓ Login information saved, you will be logged in automatically next time.
Output on failure:
❌ Token acquisition failed
Error: invalid_grant
Description: AADSTS54005: OAuth2 Authorization code was already redeemed...
Exit code: 0 on success, 1 on failure.
Important notes:
- Each authorization code can only be used ONCE
- If verification fails, you need to run
login getagain to get a new code - Once successfully logged in, the token is cached and you won't need to login again unless:
- You run
logout - You run
--reauth - The token expires and cannot be auto-refreshed
logout — Clear saved loginpython3 scripts/ms-todo-oauth.py logout
Output: ✓ Login information cleared
Only use when the user explicitly asks to switch accounts or clear login data. Under normal circumstances, the token is cached and login is automatic.
List Management
#### lists — List all task lists
python3 scripts/ms-todo-oauth.py lists
python3 scripts/ms-todo-oauth.py -v lists # with IDs and creation dates
Output example:
📋 Task Lists (3 total):
1. 任务
ID: AQMkADAwATYwMAItYTQwZC04OThhLTAwAi0wMAoALgAAA0QJKpxW32BIsIlHaM...
Created: 2024-12-15T08:30:00Z
2. Work
3. Shopping
#### create-list — Create a new list
python3 scripts/ms-todo-oauth.py create-list "<name>"
| Argument | Required | Description |
|---|---|---|
| name | Yes | Name of the new list (supports Unicode/Chinese) |
python3 scripts/ms-todo-oauth.py create-list "项目 A"
Output: ✓ List created: 项目 A
#### delete-list — Delete a list
python3 scripts/ms-todo-oauth.py delete-list "<name>" [-y]
| Argument/Option | Required | Description |
|---|---|---|
| name | Yes | Name of the list to delete |
| -y, --yes | No | Skip confirmation prompt |
⚠️ This is a destructive operation. Without -y, the command will prompt for confirmation. All tasks in the list will be deleted. Consider asking the user before deleting important lists.Output: ✓ List deleted:
Exit code: 1 if list not found, 0 on success
Task Operations
#### add — Add a new task
python3 scripts/ms-todo-oauth.py add "<title>" [options]
| Option | Required | Default | Description |
|---|---|---|---|
| title | Yes | — | Task title (positional argument, supports Unicode/Chinese/emojis) |
| -l, --list | No | (default list) | Target list name. If not specified, uses your Microsoft To Do default list. |
| -p, --priority | No | normal | Priority:low, normal, high |
| -d, --due | No | — | Due date. Accepts days from now (3 or 3d) or date (2026-02-15). Note: Only date is supported by Microsoft To Do API, not time. |
| -r, --reminder | No | — | Reminder datetime. Formats:3h (hours from now), 2d (days from now), 2026-02-15 14:30 (date+time with space, needs quotes), 2026-02-15T14:30:00 (ISO format), 2026-02-15 (date only, defaults to 09:00). |
| -R, --recurrence | No | — | Recurrence pattern. Formats:daily (every day), weekdays (Mon-Fri), weekly (every week), monthly (every month). With interval: daily:2 (every 2 days), weekly:3 (every 3 weeks), monthly:2 (every 2 months). |
| -D, --description | No | — | Task description/notes (supports multiline with quotes) |
| -t, --tags | No | — | Comma-separated tags/categories (e.g.,"work,urgent") |
| --create-list | No | False | Create the list if it doesn't exist (deprecated, lists auto-create now) |
Output example:
✓ Task added: Complete report
With recurrence:
✓ Task added: Daily standup
🔄 Recurring task created
Examples:
# Simple task
python3 scripts/ms-todo-oauth.py add "Buy milk" -l "Shopping"
# High priority task due in 3 days
python3 scripts/ms-todo-oauth.py add "Submit report" -l "Work" -p high -d 3
# Task with reminder in 2 hours
python3 scripts/ms-todo-oauth.py add "Call client" -r 2h
# Task with specific date and time reminder
python3 scripts/ms-todo-oauth.py add "Meeting" -d 2026-03-15 -r "2026-03-15 14:30"
# Daily recurring task
python3 scripts/ms-todo-oauth.py add "Daily standup" -l "Work" -R daily
# Weekday recurring task
python3 scripts/ms-todo-oauth.py add "Gym" -R weekdays -l "Personal"
# Task with all options
python3 scripts/ms-todo-oauth.py add "Project Review" \
-l "Work" \
-p high \
-d 7 \
-r "2026-02-20 14:00" \
-D "Review Q1 deliverables and prepare presentation" \
-t "work,important,meeting"
# Chinese task with emoji
python3 scripts/ms-todo-oauth.py add "🎉 完成项目" -l "任务" -p high
#### complete — Mark a task as completed
python3 scripts/ms-todo-oauth.py complete "<title>" [-l "<list>"]
| Option | Required | Default | Description |
|---|---|---|---|
| title | Yes | — | Exact task title |
| -l, --list | No | (default list) | List name where the task resides |
search first.Output: ✓ Task completed:
Exit code: 1 if task not found, 0 on success
#### delete — Delete a task
python3 scripts/ms-todo-oauth.py delete "<title>" [-l "<list>"] [-y]
| Option | Required | Default | Description |
|---|---|---|---|
| title | Yes | — | Exact task title |
| -l, --list | No | (default list) | List name where the task resides |
| -y, --yes | No | — | Skip confirmation prompt |
⚠️ Destructive operation. Without -y, will prompt for confirmation.Output: ✓ Task deleted:
Exit code: 1 if task not found, 0 on success
Task Views
#### tasks — List tasks in a specific list
python3 scripts/ms-todo-oauth.py tasks "<list>" [-a]
| Option | Required | Description |
|---|---|---|
| list | Yes | List name (exact match) |
| -a, --all | No | Include completed tasks (default: incomplete only) |
📋 Tasks in list "Work" (2 total):
1. [In Progress] Write documentation ⭐
2. [In Progress] Review PR
With -a flag:
📋 Tasks in list "Work" (3 total):
1. [In Progress] Write documentation ⭐
2. [Completed] Submit report
3. [In Progress] Review PR
Exit code: 1 if list not found, 0 on success
#### pending — All incomplete tasks across all lists
python3 scripts/ms-todo-oauth.py pending [-g]
| Option | Required | Description |
|---|---|---|
| -g, --group | No | Group results by list |
-g):📋 All incomplete tasks (3 total):
📂 Work:
[In Progress] Write documentation ⭐
[In Progress] Review PR
📂 Shopping:
[In Progress] Buy groceries
Without -g:
📋 All incomplete tasks (3 total):
[In Progress] Write documentation ⭐
List: Work
[In Progress] Review PR
List: Work
[In Progress] Buy groceries
List: Shopping
#### today — Tasks due today
python3 scripts/ms-todo-oauth.py today
Lists incomplete tasks with due date matching today's date.
Output example:
📅 Tasks due today (2 total):
[In Progress] Submit report ⭐
List: Work
[In Progress] Buy groceries
List: Shopping
If no tasks: 📅 No tasks due today
#### overdue — Overdue tasks
python3 scripts/ms-todo-oauth.py overdue
Lists incomplete tasks past their due date, sorted by days overdue.
Output example:
⚠️ Overdue tasks (1 total):
[In Progress] Submit report ⭐
List: Work
Overdue: 3 days
If no overdue tasks: ✓ No overdue tasks
#### detail — View full task details
python3 scripts/ms-todo-oauth.py detail "<title>" [-l "<list>"]
| Option | Required | Default | Description |
|---|---|---|---|
| title | Yes | — | Task title (supportspartial/fuzzy match) |
| -l, --list | No | (default list) | List name |
When multiple tasks match:
- Prefers incomplete tasks over completed
- Returns most recently modified task
============================================================
📌 Task Details
============================================================
📋 Title: Complete Q1 Report
🔖 Status: [In Progress]
⚡ Priority: ⭐ High
📅 Created: 2026-01-15 08:30:00
📝 Modified: 2026-02-10 14:22:00
⏰ Due: 2026-02-20 00:00:00
🔔 Reminder: 2026-02-20 09:00:00
📝 Notes:
- Review sales figures
- Include charts
- Prepare for board meeting
🏷️ Categories: work, important, Q1
🔄 Recurrence:
Every week on Monday
Start date: 2026-02-17
No end date
============================================================
#### search — Search tasks by keyword
python3 scripts/ms-todo-oauth.py search "<keyword>"
Searches across all lists in both task titles and descriptions (case-insensitive).
Output example:
🔍 Search results for "report" (2 found):
[In Progress] Complete Q1 Report ⭐
List: Work
Notes: Review sales figures...
[Completed] Submit weekly report
List: Work
#### stats — Task statistics
python3 scripts/ms-todo-oauth.py stats
Shows aggregate statistics across all lists.
Output example:
📊 Task Statistics:
Total lists: 3
Total tasks: 15
Completed: 10
Pending: 5
High priority: 2
Overdue: 1
Completion rate: 66.7%
#### export — Export all tasks to JSON
python3 scripts/ms-todo-oauth.py export [-o "<filename>"]
| Option | Required | Default | Description |
|---|---|---|---|
| -o, --output | No | todo_export.json | Output file path |
Output: ✓ Tasks exported to:
JSON structure:
{
"Work": [
{
"id": "AQMkADAwATYwMAItYTQw...",
"title": "Complete report",
"status": "notStarted",
"importance": "high",
"createdDateTime": "2026-01-15T08:30:00Z",
"dueDateTime": {
"dateTime": "2026-02-20T00:00:00.0000000",
"timeZone": "UTC"
},
"body": {
"content": "Review Q1 numbers",
"contentType": "text"
},
"categories": ["work", "important"]
}
],
"Shopping": [...]
}
Error Handling
Exit Codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Failure (not logged in, API error, invalid arguments, resource not found) |
| 2 | Invalid command-line arguments |
Common Error Messages
| Error | Cause | Resolution |
|---|---|---|
| ❌ Not logged in | No cached token or token expired | Run login get then login verify |
| ModuleNotFoundError: No module named 'msal' | Dependencies not installed | Run pip install -r requirements.txt |
| ❌ List not found: | Specified list does not exist | Check list name with lists command. Note: exact match required. |
| ❌ Task not found: | No task with exact matching title | Use search to find exact title, or tasks "
|
| ❌ Error: Invalid isoformat string | DateTime parsing error | This should not occur in v1.1.0+. If you see this, report as bug. |
| ❌ Error: Unsupported HTTP method | Internal API error | This should not occur in v1.1.0+. If you see this, report as bug. |
| ❌ Error: | Microsoft Graph API error | Retry; check network; use --debug for full details |
| Network error / Connection timeout | No internet or API unreachable | Check network connection; verify access to graph.microsoft.com |
Testing
This skill includes a comprehensive test suite to ensure reliability.
Automated Testing
Run the full test suite:
cd <skill-directory>
python3 test_ms_todo_oauth.py
Prerequisites:
- Must be authenticated (logged in) before running tests
- Internet connection required
- Approximately 2-3 minutes to complete
- ✅ Authentication (login/logout)
- ✅ List management (create, delete, list)
- ✅ Basic task operations (add, complete, delete, list)
- ✅ Task options (priorities, due dates, reminders, descriptions, tags)
- ✅ Recurring tasks (daily, weekly, weekdays, monthly, custom intervals)
- ✅ Task views (today, overdue, pending, search, stats)
- ✅ Data export and validation
- ✅ Error handling (non-existent resources)
- ✅ Unicode support (Chinese characters, emojis)
========================================================================
TEST SUMMARY
========================================================================
Total tests: 29
Passed: 29
Failed: 0
Pass rate: 100.0%
========================================================================
🎉 ALL TESTS PASSED! 🎉
========================================================================
Manual Testing
For manual verification, see MANUAL_TEST_CHECKLIST.txt which provides:
- Step-by-step test procedures
- Expected outcomes
- 9 test categories covering all functionality
Test Cleanup
The automated test suite:
- Creates a temporary test list (e.g.,
🧪 Test List 14:23:45) - Runs all tests in isolation
- Deletes the test list on completion
- Cleans up any temporary files
Agent Usage Guidelines
Critical Rules
- Working directory: Always
cdto the directory containing this SKILL.md before running commands. - Dependency installation: Before first use or when encountering import errors, ensure all dependencies are installed.
- Check authentication first: Before any operation, verify authentication status:
python3 scripts/ms-todo-oauth.py lists
If this returns "Not logged in" error (exit code 1), initiate the login flow.
- Task list organization: When adding tasks:
- First, run
liststo see available task lists - If user doesn't specify a list, tasks will be added to their default list (usually "Tasks" or "任务")
- Intelligently categorize tasks into appropriate lists:
- Work tasks → "Work" list
- Personal errands → "Personal" or default list
- Shopping → "Shopping" list
- Project-specific → Use project name as list
- Lists will be auto-created if they don't exist
- Support Chinese list names and Unicode characters
- Destructive operations: For
deleteanddelete-list: - These commands prompt for confirmation by default (blocking behavior)
- Use
-yflag ONLY when: - User has explicitly requested to delete without confirmation
- The deletion intent is unambiguous and confirmed through conversation
- When in doubt, ask the user for confirmation instead of using
-y - These operations return exit code 1 on failure (resource not found)
- Global option placement:
-v,--debug, and--reauthmust come BEFORE the subcommand: - ✅
python3 scripts/ms-todo-oauth.py -v lists - ❌
python3 scripts/ms-todo-oauth.py lists -v - Login flow:
- Do NOT call
login verifyuntil user confirms they've completed browser authentication - Each authorization code can only be used once
- If verify fails, you must run
login getagain for a new code - Error handling:
- Check exit codes: 0 = success, 1 = failure, 2 = invalid arguments
- Parse error messages to provide helpful guidance
- Use
--debugflag when troubleshooting API issues
Recommended Workflow for Agents
Step 1: Setup and Authentication Check
---------------------------------------
cd <skill_directory>
python3 scripts/ms-todo-oauth.py lists # Test auth & see available lists
If exit code is 1 and output contains "Not logged in":
a. python3 scripts/ms-todo-oauth.py login get
b. Present URL to user
c. Explain: "Visit this URL, login, and copy the 'code' parameter from callback URL"
d. Wait for user to provide authorization code
e. python3 scripts/ms-todo-oauth.py login verify "<code>"
f. Verify success (exit code 0)
Step 2: Task Analysis and List Selection
-----------------------------------------
When user requests to add task(s):
a. Analyze task context from user's description
b. Review available lists (from Step 1 output)
c. Choose appropriate list or use default:
- Work-related → "Work"
- Personal errands → "Personal" or default
- Shopping items → "Shopping"
- Project-specific → "<ProjectName>"
d. If list doesn't exist, it will be auto-created
Step 3: Execute Operation
--------------------------
Add task with appropriate options:
python3 scripts/ms-todo-oauth.py add "Task Title" \
-l "Work" \
-p high \
-d 3 \
-r 2h \
-D "Detailed description" \
-t "tag1,tag2"
Step 4: Verify and Report
--------------------------
Check exit code:
- 0: Success → Confirm to user
- 1: Failure → Parse error, provide guidance
- 2: Invalid args → Fix command syntax
Optionally verify:
python3 scripts/ms-todo-oauth.py tasks "<list>" # Show updated list
Task Title Matching Rules
- Exact match required:
complete,deletecommands - Partial/fuzzy match supported:
detail,searchcommands - Case-insensitive: All search operations
- Best practice: Use
searchfirst to find exact title, then use it in subsequent commands
# Find task with fuzzy search
python3 scripts/ms-todo-oauth.py search "report"
# Output shows: "Complete Q1 Report"
# Use exact title from search results
python3 scripts/ms-todo-oauth.py complete "Complete Q1 Report" -l "Work"
Default List Behavior
- When
-lis not specified, operations use the Microsoft To Do default list - The default list is typically named "Tasks" (English) or "任务" (Chinese)
- To target a specific list, always provide
-l ""
Example Task Categorization
User request: "Add these tasks: buy milk, finish report, call dentist"
Agent approach:
# First check available lists
python3 scripts/ms-todo-oauth.py lists
# Categorize intelligently:
python3 scripts/ms-todo-oauth.py add "Buy milk" -l "Shopping"
python3 scripts/ms-todo-oauth.py add "Finish report" -l "Work" -p high -d 2
python3 scripts/ms-todo-oauth.py add "Call dentist" -l "Personal"
# Or use default list if no specific context: add "Call dentist"
Quick Reference
Common Workflows
Daily task review:
python3 scripts/ms-todo-oauth.py today # Check today's tasks
python3 scripts/ms-todo-oauth.py overdue # Check overdue tasks
python3 scripts/ms-todo-oauth.py -v pending -g # Review all pending, grouped
Adding various task types:
# Simple task (default list)
python3 scripts/ms-todo-oauth.py add "Buy milk"
# Work task with priority and deadline
python3 scripts/ms-todo-oauth.py add "Quarterly review" -l "Work" -p high -d 7
# Task with reminder
python3 scripts/ms-todo-oauth.py add "Call client" -r 3h
# Detailed task with all options
python3 scripts/ms-todo-oauth.py add "Project meeting" \
-l "Work" \
-p high \
-d 2026-03-15 \
-r "2026-03-15 14:30" \
-D "Discuss Q1 goals and resource allocation" \
-t "meeting,important,Q1"
# Recurring tasks
python3 scripts/ms-todo-oauth.py add "Daily standup" -R daily -l "Work"
python3 scripts/ms-todo-oauth.py add "Weekly review" -R weekly -d 7
python3 scripts/ms-todo-oauth.py add "Gym" -R weekdays -l "Personal"
python3 scripts/ms-todo-oauth.py add "Monthly report" -R monthly -p high
Task completion workflow:
# Search for task
python3 scripts/ms-todo-oauth.py search "report"
# Complete using exact title from search results
python3 scripts/ms-todo-oauth.py complete "Quarterly review" -l "Work"
Data management:
# Export for backup
python3 scripts/ms-todo-oauth.py export -o "backup_$(date +%Y%m%d).json"
# View statistics
python3 scripts/ms-todo-oauth.py stats
Changelog
Version 1.1.0 (Current)
- ✅ Fixed: DateTime parsing errors (Microsoft's 7-decimal format)
- ✅ Fixed: HTTP method parameter order bugs
- ✅ Fixed: Missing
start_dateparameter increate_task() - ✅ Fixed: Missing
complete_task()method - ✅ Fixed: Error exit codes now correctly return 1 on failure
- ✅ Added: Comprehensive test suite (29 automated tests)
- ✅ Added: Better error messages and troubleshooting
- ✅ Improved: OAuth2 authentication flow documentation
- ✅ Improved: Unicode and emoji support documentation
- ✅ Improved: Agent usage guidelines
Version 1.0.2 (Previous)
- Initial release with OAuth2 authentication
- Basic task and list management
- Recurring task support
- Multiple task views
- Data export functionality
Troubleshooting
Authentication Issues
Problem: ❌ Not logged in
- Solution: Run
login get, complete browser flow, thenlogin verify
❌ Token acquisition failed: invalid_grant
- Cause: Authorization code already used or expired
- Solution: Run
login getagain to get a fresh code
- Cause: Token expired and auto-refresh failed
- Solution: Run
--reauthto force fresh login:
python3 scripts/ms-todo-oauth.py --reauth lists
Import/Dependency Issues
Problem: ModuleNotFoundError: No module named 'msal'
- Solution: Install dependencies:
pip install -r requirements.txt
API/Network Issues
Problem: Connection timeout or network errors
- Check: Internet connection
- Check: Can you access https://graph.microsoft.com in browser?
- Try: Using
--debugflag to see full API request/response
- Try: Re-authenticate:
python3 scripts/ms-todo-oauth.py --reauth lists - Try: Debug mode:
python3 scripts/ms-todo-oauth.py --debug
Task/List Not Found
Problem: ❌ Task not found:
- Solution: Use
searchto find exact title - Note:
completeanddeleterequire exact title match
❌ List not found:
- Solution: Run
liststo see exact list names - Note: List names are case-sensitive
Test Failures
Problem: Tests failing with datetime errors
- Solution: Ensure you've applied all v1.1.0 fixes
- Check: Verify
_parse_ms_datetime()helper function exists
- Solution: Authenticate before running tests:
python3 scripts/ms-todo-oauth.py login get
# Complete browser flow
python3 scripts/ms-todo-oauth.py login verify <code>
# Then run tests
python3 test_ms_todo_oauth.py
Additional Resources
- Test Suite:
test_ms_todo_oauth.py- Automated tests - Manual Tests:
MANUAL_TEST_CHECKLIST.txt- Step-by-step testing guide - Quick Reference:
QUICK_REFERENCE.txt- Command cheat sheet - Bug Fixes:
COMPLETE_FIX_PATCH.txt- Documentation of v1.1.0 fixes
Support & Contributing
Reporting Issues:
- Provide error message and command used
- Include output from
--debugflag if applicable - Note your Python version:
python3 --version - Note your OS: Windows/Mac/Linux
- Always run the test suite after code changes
- Add new test cases to
test_ms_todo_oauth.pyfor new features - Update
MANUAL_TEST_CHECKLIST.txtwith manual test procedures
License
MIT License - See LICENSE file for details
Version: 1.1.0 Last Updated: 2026-02-13 Status: ✅ Fully Tested & Production Ready
Installation
openclaw install ms-todo-oauth
💻Code Examples
# pip install -r requirements.txt
**Dependencies:**
- `msal` (Microsoft Authentication Library) - Official Microsoft OAuth library
- `requests` - HTTP client for API calls
- Specified in `requirements.txt`
### Environment Verification
After installation, verify the setup:# Expected: Command help text should be displayed
**Troubleshooting:**
- If `Python not found`, install Python 3.9 or higher from https://python.org
### Testing (Optional but Recommended)
Verify all functionality works correctly:# Expected: All tests pass (100% pass rate)
See [Testing](#testing) section for details.
### Security Notes
- Uses official Microsoft Graph API via Microsoft's `msal` library
- All code is plain Python (.py files), readable and auditable
- Tokens stored locally in `~/.mstodo_token_cache.json`
- All API calls go directly to Microsoft endpoints (graph.microsoft.com)
- OAuth2 standard authentication flow
- No third-party services involved
## Command Reference
All commands follow this pattern:python3 scripts/ms-todo-oauth.py [GLOBAL_OPTIONS] <command> [COMMAND_OPTIONS]
### Global Options
| Option | Description |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `-v, --verbose` | Show detailed information (IDs, dates, notes).**Must be placed BEFORE the subcommand.** |
| `--debug` | Enable debug mode to display API requests and responses. Useful for troubleshooting.**Must be placed BEFORE the subcommand.** |
| `--reauth` | Force re-authentication by clearing the token cache and starting fresh login |
> ⚠️ **Common mistake**: Global options MUST come before the subcommand.
>
> - ✅ `python3 scripts/ms-todo-oauth.py -v lists`
> - ✅ `python3 scripts/ms-todo-oauth.py --debug add "Task"`
> - ❌ `python3 scripts/ms-todo-oauth.py lists -v`
---
### Authentication
Authentication uses OAuth2 authorization code flow, designed for both interactive and automated environments.
#### `login get` — Get OAuth2 authorization URL======================================================================
**What to do:**
1. Open the provided URL in your browser
2. Sign in with your Microsoft account
3. Grant permissions when prompted
4. You'll be redirected to a URL like: `http://localhost:8000/callback?code=M.R3_BAY.abc123...`
5. Copy the entire code after `code=` (usually a long string starting with `M.R3_BAY.`)
**Agent behavior**: Present the URL to the user and explain they need to:
1. Visit the URL
2. Complete the login
3. Copy the authorization code from the callback URL
4. Provide it to you
#### `login verify` — Complete login with authorization codeDescription: AADSTS54005: OAuth2 Authorization code was already redeemed...
**Exit code**: 0 on success, 1 on failure.
**Important notes:**
- Each authorization code can only be used ONCE
- If verification fails, you need to run `login get` again to get a new code
- Once successfully logged in, the token is cached and you won't need to login again unless:
- You run `logout`
- You run `--reauth`
- The token expires and cannot be auto-refreshed
#### `logout` — Clear saved loginpython3 scripts/ms-todo-oauth.py logout
Output: `✓ Login information cleared`
Only use when the user explicitly asks to switch accounts or clear login data. Under normal circumstances, the token is cached and login is automatic.
---
### List Management
#### `lists` — List all task listspython3 scripts/ms-todo-oauth.py create-list "<name>"
| Argument | Required | Description |
| -------- | -------- | ----------------------------------------------- |
| `name` | Yes | Name of the new list (supports Unicode/Chinese) |
**Example:**python3 scripts/ms-todo-oauth.py create-list "项目 A"
Output: `✓ List created: 项目 A`
#### `delete-list` — Delete a listpython3 scripts/ms-todo-oauth.py delete-list "<name>" [-y]
| Argument/Option | Required | Description |
| --------------- | -------- | -------------------------- |
| `name` | Yes | Name of the list to delete |
| `-y, --yes` | No | Skip confirmation prompt |
> ⚠️ **This is a destructive operation**. Without `-y`, the command will prompt for confirmation. All tasks in the list will be deleted. Consider asking the user before deleting important lists.
Output: `✓ List deleted: <name>`
**Exit code**: 1 if list not found, 0 on success
---
### Task Operations
#### `add` — Add a new taskTags
Quick Info
Ready to Install?
Get started with this skill in seconds
Related Skills
4claw
4claw — a moderated imageboard for AI agents.
Aap Passport
Agent Attestation Protocol - The Reverse Turing Test.
Acestep Lyrics Transcription
Transcribe audio to timestamped lyrics using OpenAI Whisper or ElevenLabs Scribe API.
Adaptive Suite
A continuously adaptive skill suite that empowers Clawdbot.