Skip to main content

Microsoft To Do ExecModule

Overview

MicrosoftToDoModule connects ValkyrAI workflows to Microsoft Graph v1.0. It uses the native map I/O ExecModule ABI, appears in the annotation-backed Workflow Studio catalog as MicrosoftToDoModule, and resolves OAuth credentials only from an IntegrationAccount.

The connector implements the complete list, task, and linked-resource behavior represented by n8n's built-in Microsoft To Do node:

  • task lists: list_lists, get_list, create_list, update_list, delete_list
  • tasks: list_tasks, get_task, create_task, update_task, delete_task
  • linked resources: list_linked_resources, get_linked_resource, create_linked_resource, update_linked_resource, delete_linked_resource

The Microsoft Graph origin, OAuth token, allowed payload fields, retry boundary, and response limits cannot be overridden by mapped workflow input.

Usage

  1. Register or select a Microsoft Entra application that can call Microsoft Graph.
  2. Grant the minimum delegated or application task scopes needed by the workflow.
  3. Store the current OAuth access token in a Microsoft To Do IntegrationAccount SecureField and keep the account in READY status.
  4. Add MicrosoftToDoModule to a workflow and bind the account through ExecModuleConfig.authConfig.integrationAccount.
  5. Set operation and the operation-specific fields in module configuration or map them from upstream workflow state.

Leave userId blank for delegated /me operations. Set an authorized user object ID or user principal name only when the token can operate through /users/{id}. Linked-resource writes require delegated task write access; Microsoft Graph does not support application permissions for that API family.

Inputs

NameTypeRequired forDefaultConstraints
operationstringEvery executionNoneOne of the 15 documented operations.
userIdstringOptional explicit-user access/meOpaque object ID or UPN; no path, query, fragment, or control characters.
listIdstringList read/update/delete and every task operationNoneOpaque Graph task-list ID, at most 2,048 characters.
taskIdstringTask read/update/delete and every linked-resource operationNoneOpaque Graph task ID.
linkedResourceIdstringLinked-resource read/update/deleteNoneOpaque Graph linked-resource ID.
displayNamestringList create/update and linked-resource createNone1–255 characters.
titlestringTask create; optional task updateNone1–255 characters.
bodyContentstringOptional task create/updateNoneUp to 64 KiB; an explicitly empty update clears the body.
bodyContentTypestringWhen body is suppliedtexttext or html.
importancestringOptional task create/updateProvider defaultlow, normal, or high.
taskStatusstringOptional task create/updateProvider defaultnotStarted, inProgress, completed, waitingOnOthers, or deferred.
categoriesarrayOptional task create/updateProvider defaultUp to 25 non-empty strings, each at most 255 characters.
dueDateTime / startDateTime / reminderDateTimestringOptional task schedulingNoneISO-8601 date-time; an explicitly empty update clears that field.
dueTimeZone / startTimeZone / reminderTimeZonestringCorresponding non-empty date-timeUTCWindows or IANA label, at most 255 characters.
isReminderOnbooleanOptional task create/updateProvider defaultAutomatically true when a reminder date is supplied unless explicitly set.
applicationNamestringLinked-resource create; optional updateNone1–255 characters.
externalIdstringLinked-resource create; optional updateNonePartner-system ID, at most 2,048 characters.
webUrlstringLinked-resource create; optional updateNoneHTTPS URL without credentials or fragment, at most 4,096 characters.
etagstringOptional update/delete concurrencyNoneSent as If-Match; at most 1,024 characters.
cursorstringOptional list resume pointNoneOpaque token: continuation returned by this module.
limitintegerList operations1001–10,000 total returned items.
returnAllbooleanList operationsfalseFollows provider pages until exhaustion or limit.
confirmDeletebooleanEvery delete operationfalseMust be true because provider deletion is permanent.

Outputs

Every execution returns stable status, operation, and attempts fields.

NameTypeWhen presentDescription
statusstringAlwayssuccess or error.
operationstringAlwaysNormalized operation name.
attemptsintegerAlwaysProvider HTTP attempts, including paginated reads.
httpStatusintegerProvider response receivedLast Microsoft Graph HTTP status.
dataobjectSingle-resource, mutation, or deletion successProvider object or a stable {deleted, id} receipt.
idstringSingle-resource or deletion successProvider resource identifier.
etagstringProvider returns @odata.etagConcurrency value for a later update or delete.
itemsarrayList successBounded list, task, or linked-resource objects.
countintegerList successNumber of returned items.
hasMorebooleanList successWhether Graph returned another supported continuation.
nextCursorstringAnother page existsOpaque continuation for a later execution.
requestIdstringGraph supplies oneBounded provider request reference for support.
errorobjectFailureSafe {code, message, httpStatus?, retryable} details.

OAuth tokens are never returned. Provider errors are bounded and redacted through the shared workflow sensitive-data policy.

IntegrationAccount Requirements

SettingRequirement
ProviderMicrosoft To Do / Microsoft Graph
Auth mechanismOAuth 2.0 bearer access token
accountNameHuman-readable Microsoft account or tenant label
apiKeyPreferred encrypted SecureField containing the access token
passwordLegacy token fallback only; prefer apiKey
statusMust be READY; all other states fail closed

Use the least-privilege scopes applicable to the selected operations:

  • delegated reads: Tasks.Read
  • delegated creates, updates, deletes, and linked-resource operations: Tasks.ReadWrite
  • application reads through userId: Tasks.Read.All
  • application writes: only where the current Microsoft Graph operation explicitly supports the applicable application task permission

See Microsoft Graph To Do permissions. Never place tokens in parameters, mapped workflow input, examples, logs, or outputs. Use the platform OAuth refresh flow to rotate expired access tokens.

Configuration

Module-specific fields belong in ExecModulePayloadConfig.parameters; retries and timeouts use existing normalized configuration groups.

{
"version": "1.0.0",
"authConfig": {
"authStrategy": 1,
"integrationAccount": "integration-account:microsoft-todo-primary"
},
"retryPolicy": {
"maxAttempts": 3,
"backoffStrategy": "EXPONENTIAL",
"initialDelayMs": 1000,
"maxDelayMs": 60000,
"jitter": false
},
"executionConfig": {
"timeoutMs": 30000
},
"payloadConfig": {
"parameters": "{\"operation\":\"list_tasks\",\"listId\":\"list-1\",\"limit\":100}"
}
}

The relationship value is illustrative. Persisted workflows bind the generated IntegrationAccount relationship, never a plaintext token.

Operations

OperationProvider behaviorSide effect and retry behavior
list_listsLists task lists for /me or an authorized explicit user.Read-only; retries transient failures and supports opaque pagination.
get_listReads one task list.Read-only; retries and verifies a returned ID when present.
create_listCreates a list with a bounded display name.Write; single attempt.
update_listRenames one task list and optionally sends If-Match.Write; single attempt.
delete_listPermanently deletes one task list.Irreversible; requires confirmation; single attempt.
list_tasksLists tasks in one list.Read-only; retries and paginates.
get_taskReads one task.Read-only; retries and verifies returned identity.
create_taskCreates a typed task with optional body, categories, schedule, reminder, importance, and status.Write; single attempt.
update_taskPatches only supplied typed task fields and optionally sends If-Match.Write; requires at least one field; single attempt.
delete_taskPermanently deletes one task.Irreversible; requires confirmation; single attempt.
list_linked_resourcesLists partner resources associated with a task.Read-only; retries and paginates.
get_linked_resourceReads one linked resource.Read-only; retries and verifies identity.
create_linked_resourceAttaches an HTTPS partner resource to a task.Write; single attempt; delegated permission required.
update_linked_resourcePatches supplied partner metadata.Write; requires at least one field; single attempt.
delete_linked_resourcePermanently removes one association.Irreversible; requires confirmation; single attempt.

Errors and Failure Modes

CodeTypical causeRetryableResolution
VALIDATION_ERRORMissing or invalid ID, payload, schedule, cursor, URL, etag, or delete confirmation.NoCorrect inputs; no unsafe request was sent.
UNSUPPORTED_OPERATIONUnknown operation.NoSelect a documented operation.
INTEGRATION_ACCOUNT_REQUIREDNo account is bound.NoBind a Microsoft To Do IntegrationAccount.
INTEGRATION_ACCOUNT_NOT_READYAccount status is not READY.NoReconnect or repair the account.
MICROSOFT_TODO_HTTP_401OAuth token is expired or invalid.NoRefresh the token.
MICROSOFT_TODO_HTTP_403Required scope, user access, or linked-resource permission is absent.NoGrant least privilege or choose an accessible principal.
MICROSOFT_TODO_HTTP_404List, task, linked-resource, or user ID is wrong or invisible.NoVerify resource IDs and principal.
MICROSOFT_TODO_HTTP_409 / 412Stale etag or provider write conflict.NoRead current state, reconcile, and intentionally retry.
MICROSOFT_TODO_HTTP_429Graph throttling.Yes for readsHonor provider guidance and retry later.
RESPONSE_TOO_LARGEResponse exceeded 5 MiB.NoLower limit or narrow the workflow.
NETWORK_ERRORDNS, TLS, timeout, or connectivity failure.Yes for readsVerify connectivity and retry.
INVALID_PROVIDER_RESPONSEGraph returned a collection without value[].NoCapture request ID and check API compatibility.

Example

Create an approved customer follow-up task:

{
"operation": "create_task",
"listId": "customer-success-list",
"title": "Follow up with Acme",
"bodyContent": "Review the signed proposal and confirm onboarding dates.",
"bodyContentType": "text",
"importance": "high",
"categories": ["Sales", "Approved"],
"dueDateTime": "2026-08-20T09:00:00-07:00",
"dueTimeZone": "America/Los_Angeles",
"reminderDateTime": "2026-08-20T08:30:00-07:00",
"reminderTimeZone": "America/Los_Angeles"
}

Expected result shape:

{
"status": "success",
"operation": "create_task",
"attempts": 1,
"httpStatus": 201,
"id": "task-9",
"etag": "provider-etag",
"data": {
"id": "task-9",
"title": "Follow up with Acme",
"importance": "high"
}
}

Notes

  • Pagination: list operations request at most 100 items per Graph page. returnAll=true follows only provider continuations whose opaque $skiptoken can be extracted; requests are rebuilt against the fixed Graph origin and hard-capped at 10,000 results.
  • Rate limits: GET operations retry HTTP 408, 429, and 5xx responses according to the normalized retry configuration and bounded Retry-After. Creates, updates, and deletes are never automatically retried.
  • API limits: the module covers Graph task lists, tasks, and linked resources. It does not implement Outlook flagged-email tasks, checklist items, file attachments, delta queries, subscriptions, batch requests, or provider-specific recurrence builders.
  • Idempotency: provider creates do not accept a caller-controlled idempotency key. After a timeout, list/read and reconcile by immutable provider IDs or stable business fields before replaying.
  • Concurrency: etag is optional because Graph support differs by operation; when supplied for update/delete it is sent as If-Match. A 409 or 412 requires read-and-reconcile handling.
  • Destructive behavior: all three delete operations are permanent, require confirmDelete=true, and use one provider attempt.
  • Application permissions: /users/{id} supports authorized application access for applicable Graph task operations. Linked-resource operations remain delegated-only according to the current Microsoft contract.
  • External verification: local tests use a deterministic mock Graph server. Live Microsoft behavior remains unverified until an authorized Microsoft To Do credential is supplied.
  • Functional reference: n8n's current built-in Microsoft To Do node supports list, task, and linked-resource create/get/get-all/update/delete flows, OAuth Graph credentials, explicit-user app access, and opaque pagination. ValkyrAI adds bounded payloads and responses, fixed-host continuation rebuilding, provider identity checks, explicit destructive confirmation, concurrency headers, redaction, and read-only retry boundaries.