with one click
ms-todo
Manage Microsoft To Do tasks via Microsoft Graph API.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Manage Microsoft To Do tasks via Microsoft Graph API.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | ms-todo |
| description | Manage Microsoft To Do tasks via Microsoft Graph API. |
| metadata | {"openclaw":{"emoji":"✅","requires":{"bins":["curl"],"env":["MS_TODO_CLIENT_ID","MS_TODO_REFRESH_TOKEN"]},"primaryEnv":"MS_TODO_REFRESH_TOKEN"}} |
Manage Microsoft To Do tasks using the Microsoft Graph API. Works on all platforms.
OpenClaw TodoTasks.ReadWrite and offline_accessRequest a device code:
curl -s -X POST "https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode" \
-d "client_id=$MS_TODO_CLIENT_ID&scope=Tasks.ReadWrite offline_access"
The response will show a user_code and verification_uri. Open the URL in a browser, enter the code, and sign in.
Then poll for the token:
curl -s -X POST "https://login.microsoftonline.com/consumers/oauth2/v2.0/token" \
-d "client_id=$MS_TODO_CLIENT_ID&device_code=DEVICE_CODE_HERE&grant_type=urn:ietf:params:oauth:grant-type:device_code"
Save the refresh_token from the response as MS_TODO_REFRESH_TOKEN.
Add to ~/.openclaw/openclaw.json:
{
skills: {
entries: {
"ms-todo": {
env: {
MS_TODO_CLIENT_ID: "your-azure-app-client-id",
MS_TODO_REFRESH_TOKEN: "your-refresh-token",
},
},
},
},
}
Tokens expire after ~1 hour. Refresh before each session:
ACCESS_TOKEN=$(curl -s -X POST "https://login.microsoftonline.com/consumers/oauth2/v2.0/token" \
-d "client_id=$MS_TODO_CLIENT_ID&refresh_token=$MS_TODO_REFRESH_TOKEN&grant_type=refresh_token&scope=Tasks.ReadWrite offline_access" \
| jq -r '.access_token')
Use $ACCESS_TOKEN in the Authorization header for all commands below.
curl -s "https://graph.microsoft.com/v1.0/me/todo/lists" \
-H "Authorization: Bearer $ACCESS_TOKEN" | jq '.value[] | {id, displayName}'
curl -s "https://graph.microsoft.com/v1.0/me/todo/lists/$LIST_ID/tasks" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
| jq '.value[] | {id, title, status, importance, dueDateTime}'
Filter incomplete tasks:
curl -s "https://graph.microsoft.com/v1.0/me/todo/lists/$LIST_ID/tasks?\$filter=status ne 'completed'" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
| jq '.value[] | {id, title, status, importance, dueDateTime}'
curl -s -X POST "https://graph.microsoft.com/v1.0/me/todo/lists/$LIST_ID/tasks" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Review PR #42",
"importance": "high",
"dueDateTime": {
"dateTime": "2026-02-15T00:00:00",
"timeZone": "Asia/Taipei"
},
"body": {
"content": "Check auth module changes",
"contentType": "text"
}
}' | jq '{id, title, status}'
Minimal create (title only):
curl -s -X POST "https://graph.microsoft.com/v1.0/me/todo/lists/$LIST_ID/tasks" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "Quick task"}' | jq '{id, title}'
curl -s -X PATCH "https://graph.microsoft.com/v1.0/me/todo/lists/$LIST_ID/tasks/$TASK_ID" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status": "completed"}' | jq '{id, title, status}'
curl -s -X PATCH "https://graph.microsoft.com/v1.0/me/todo/lists/$LIST_ID/tasks/$TASK_ID" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Updated title",
"importance": "high"
}' | jq '{id, title, importance}'
curl -s -X DELETE "https://graph.microsoft.com/v1.0/me/todo/lists/$LIST_ID/tasks/$TASK_ID" \
-H "Authorization: Bearer $ACCESS_TOKEN"
# Returns 204 No Content on success
| Field | Type | Values |
|---|---|---|
title | string | Required for create |
status | string | notStarted, inProgress, completed, waitingOnOthers, deferred |
importance | string | low, normal, high |
body.content | string | Task notes/details |
body.contentType | string | text or html |
dueDateTime.dateTime | string | ISO 8601 (e.g., 2026-02-15T00:00:00) |
dueDateTime.timeZone | string | IANA timezone (e.g., Asia/Taipei, UTC) |
isReminderOn | boolean | Enable/disable reminder |
reminderDateTime | object | Same format as dueDateTime |
offline_access scope to get a refresh token that works indefinitely.$LIST_ID can be found from the "List all task lists" command.jq for readable output; omit jq if not installed.curl is available.Persistent agent memory via OpenViking — store and retrieve context across sessions using a tiered filesystem database. L0/L1/L2 context layers with semantic search.
Windows Task Scheduler — create, list, manage, and delete scheduled tasks for automated workflows, zero dependencies.
Browser integration — open URLs, read bookmarks and history from Edge/Chrome, get active tabs, list downloads, zero dependencies.
Local AI inference via Ollama — run LLMs on-device, manage models, detect NPU/GPU/DirectML hardware, zero cloud dependencies.
System diagnostics — CPU, RAM, battery, GPU, network, processes, OS info via WMI, zero dependencies.
Read and search Windows Sticky Notes — access your notes via the local SQLite database using built-in winsqlite3.dll, zero dependencies.