codex-microsoft-todo-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@codex-microsoft-todo-mcplist all my tasks from my Errands list"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Local Microsoft To Do MCP
English
A small local Model Context Protocol server that lets Codex and other MCP clients work with Microsoft To Do through Microsoft Graph.
It currently exposes five tools:
list_task_listslist_taskscreate_taskupdate_taskcomplete_task
Authentication uses Microsoft's device-code flow. No client secret or local callback server is required.
Related MCP server: microsoft-todo-mcp-server
Requirements
Node.js 20 or later
A Microsoft account with Microsoft To Do
Access to a Microsoft Entra tenant in which you can register an application
A local MCP client such as Codex
1. Register your own Entra application
Create an app registration in the Microsoft Entra admin center:
Choose a neutral display name such as
Local_Todo_Connector.Select Accounts in any organizational directory and personal Microsoft accounts, or the narrower account type appropriate for you.
Under API permissions, add the delegated Microsoft Graph permission
Tasks.ReadWrite.Under Authentication, enable public client flows.
Add the Mobile and desktop applications redirect URI:
https://login.microsoftonline.com/common/oauth2/nativeclientCopy the Application (client) ID. Do not create a client secret.
Each user should create and use their own app registration. Do not publish account tokens or the local authentication cache.
2. Install and sign in
git clone https://github.com/CyanRange/codex-microsoft-todo-mcp.git
cd codex-microsoft-todo-mcp
npm install
$env:MS_TODO_CLIENT_ID = "YOUR_APPLICATION_CLIENT_ID"
npm run loginFollow the device-login instructions shown in the terminal. The token cache is stored locally under .auth/, which is excluded by .gitignore.
3. Add it to Codex
From PowerShell, replace the placeholders with your values:
codex mcp add microsoft_todo `
--env MS_TODO_CLIENT_ID=YOUR_APPLICATION_CLIENT_ID `
-- node C:\absolute\path\to\codex-microsoft-todo-mcp\src\server.jsConfirm the registration:
codex mcp listStart a new Codex session after adding the server. You can then ask Codex to list To Do lists, create a task, update it, or mark it complete.
Security and privacy
.auth/,.env, andnode_modules/are excluded from Git.Never commit
msal-cache.json; it can contain access and refresh tokens.The application client ID is an identifier rather than a password, but this repository intentionally contains no personal client ID.
The server requests delegated
Tasks.ReadWriteaccess and acts only as the signed-in user.Review tool calls before allowing an MCP client to change real tasks.
See SECURITY.md for reporting guidance.
Development
npm install
node --check src/auth.js
node --check src/graph.js
node --check src/login.js
node --check src/server.jsLicense and trademarks
Released under the MIT License.
This is an independent, unofficial project. It is not affiliated with, endorsed by, or sponsored by Microsoft or OpenAI. Microsoft, Microsoft To Do, Microsoft Graph, OpenAI, and Codex are trademarks of their respective owners and are used only to describe compatibility.
简体中文
这是一个小型本地 Model Context Protocol(MCP)服务器,让 Codex 和其他 MCP 客户端能够通过 Microsoft Graph 操作 Microsoft To Do。
目前提供五个工具:
list_task_lists:列出任务清单list_tasks:列出清单中的任务create_task:创建任务update_task:修改任务complete_task:将任务标记为已完成
身份验证使用 Microsoft 设备代码流程,不需要客户端密码,也不需要运行本地回调服务器。
环境要求
Node.js 20 或更高版本
已开通 Microsoft To Do 的 Microsoft 账户
一个可以注册应用程序的 Microsoft Entra 租户
Codex 等本地 MCP 客户端
1. 注册自己的 Entra 应用
在 Microsoft Entra 管理中心创建应用注册:
使用中性的显示名称,例如
Local_Todo_Connector。选择 任何组织目录中的账户和个人 Microsoft 账户,或根据实际需求选择范围更窄的账户类型。
在 API 权限中添加 Microsoft Graph 委托权限
Tasks.ReadWrite。在 身份验证中启用公共客户端流。
添加 移动和桌面应用程序重定向 URI:
https://login.microsoftonline.com/common/oauth2/nativeclient复制 应用程序(客户端)ID。不要创建客户端密码。
每位用户都应注册并使用自己的应用。不要公开账户令牌或本地身份验证缓存。
2. 安装并登录
git clone https://github.com/CyanRange/codex-microsoft-todo-mcp.git
cd codex-microsoft-todo-mcp
npm install
$env:MS_TODO_CLIENT_ID = "你的应用程序客户端 ID"
npm run login按照终端显示的设备登录提示完成授权。令牌缓存保存在本机 .auth/ 目录中,该目录已被 .gitignore 排除。
3. 接入 Codex
在 PowerShell 中运行以下命令,并将占位内容替换为你的实际值:
codex mcp add microsoft_todo `
--env MS_TODO_CLIENT_ID=你的应用程序客户端ID `
-- node C:\你的绝对路径\codex-microsoft-todo-mcp\src\server.js确认 MCP 已经注册:
codex mcp list添加服务器后,请新建一个 Codex 会话。之后就可以让 Codex 列出 To Do 清单、创建任务、修改任务或将任务标记为完成。
安全与隐私
.auth/、.env和node_modules/均已被 Git 排除。切勿提交
msal-cache.json;其中可能包含访问令牌和刷新令牌。应用程序客户端 ID 是标识符而不是密码,但本仓库仍不会包含任何个人客户端 ID。
服务器只请求委托的
Tasks.ReadWrite权限,并且只能以当前登录用户的身份操作。在允许 MCP 客户端修改真实任务前,请先检查工具调用内容。
安全问题的报告方式请参阅 SECURITY.md。
开发检查
npm install
node --check src/auth.js
node --check src/graph.js
node --check src/login.js
node --check src/server.js许可证与商标
本项目采用 MIT License 发布。
这是一个独立的非官方项目,与 Microsoft 或 OpenAI 不存在隶属、认可或赞助关系。Microsoft、Microsoft To Do、Microsoft Graph、OpenAI 和 Codex 是其各自所有者的商标;本项目仅为说明兼容性而使用这些名称。
Available Tools
5 toolscomplete_taskB
将 Microsoft To Do 任务标记为已完成
| Name | Required | Description | Default |
|---|---|---|---|
| listId | Yes | ||
| taskId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Mark as completed' conveys the effect but does not mention idempotency, permissions, what happens if the task is already completed, or the response shape. This is a significant gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with zero fluff. It is appropriately concise for a simple action, though it omits behavioral context that could have been included without much length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low schema/annotation richness and absence of an output schema, the description leaves out important context: no mention of return values, side effects, required permissions, or behavior on already-completed tasks. The tool is simple, but the description is too sparse to be fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the parameters at all. While listId and taskId are reasonably self-explanatory, the description fails to compensate for the absent schema documentation, providing no meaning beyond the bare parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('mark as completed') and resource ('Microsoft To Do task'), which clearly identifies the operation. It distinguishes itself from siblings like update_task (general updates) and create_task (new task creation) via the explicit completion action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage scenario: when you want to set a task to completed. However, it provides no explicit guidance on when not to use it, such as 'use update_task for modifying other task fields', leaving alternative selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_taskB
在 Microsoft To Do 中创建任务
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| title | Yes | ||
| listId | Yes | 任务列表 ID | |
| timeZone | No | Asia/Shanghai | |
| importance | No | ||
| dueDateTime | No | ISO 8601 本地时间,例如 2026-08-15T15:00:00 | |
| reminderDateTime | No | ISO 8601 本地提醒时间 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'create a task' and does not explain side effects, whether an existing list is required, how invalid IDs are handled, default behaviors, or what the response format is. This is a notable gap for a mutating operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise, front-loaded sentence with no wasted words. It earns its place by stating the core action and resource, though brevity comes at the cost of missing supporting detail covered elsewhere in the scoring.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, no output schema, no annotations, and only partial schema descriptions, a one-sentence description is not enough for an agent to confidently invoke the tool. Important context such as required listId sourcing, timezone defaults, and parameter semantics is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 43%, with 4 of 7 parameters lacking any schema explanation, but the description adds no parameter-level semantics whatsoever. It does not help an agent understand title, body, importance, timeZone, or any other field beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('create') and resource ('task in Microsoft To Do'), making it unambiguous. The verb 'create' also distinguishes this tool from sibling tools like list_task_lists, update_task, and complete_task, so an agent can immediately identify its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when a new task needs to be created in Microsoft To Do, which is a clear enough context. However, it does not explicitly say when not to use it, mention alternatives, or note prerequisites such as needing a valid listId from list_task_lists before calling this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_task_listsA
列出当前 Microsoft To Do 的任务列表
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It does disclose this is a read/list operation on the current Microsoft To Do context, which implies no side effects. However, it does not mention return format, ordering, or whether all lists are returned, leaving some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that is front-loaded with the action and object. There is no wasted wording or extraneous detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless list operation, the description is mostly complete. It could slightly improve by stating that it returns all task lists, but the verb '列出' already conveys the core behavior, and there is no output schema to rely on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description has no parameter semantics to add. The baseline of 4 applies because there is no parameter documentation gap to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('列出' / list) and resource ('任务列表' / task lists), clearly distinguishing this tool from sibling list_tasks. Even without reading the sibling names, an agent understands exactly what object this tool operates on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: call this when you need the user's task lists. However, the description gives no explicit guidance on when to prefer this over siblings, nor does it mention that list_tasks would be the alternative for individual tasks. It is minimally viable but leaves the routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksC
列出一个 To Do 列表中的任务
| Name | Required | Description | Default |
|---|---|---|---|
| listId | Yes | 任务列表 ID | |
| includeCompleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'list tasks' and does not mention pagination, sorting, whether completed tasks are returned, or any read-only implications. The includeCompleted schema default hints at behavior, but the description adds nothing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise, purposeful sentence in Chinese with no filler or repeated information. It is appropriately sized for a simple read operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool, the description plus schema is minimally sufficient to select and invoke the tool: listId is required and the behavior is to list tasks. However, lacking output details, filter semantics for includeCompleted, and any usage context leaves clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, with listId documented but includeCompleted left undefined. The description does not compensate by clarifying either parameter; it only mirrors the general purpose of the listId parameter. With low schema coverage, this is a notable gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: list tasks in a To Do list. It is semantically distinct from the sibling tool list_task_lists, which lists lists rather than tasks. It does not explicitly name siblings, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as create_task or list_task_lists. The intended use is somewhat inferable, but the description itself never states when-not-to-use or which sibling to prefer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskC
修改 Microsoft To Do 任务的标题、正文、重要性、截止时间或提醒
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| title | No | ||
| listId | Yes | ||
| taskId | Yes | ||
| timeZone | No | Asia/Shanghai | |
| importance | No | ||
| dueDateTime | No | ||
| reminderDateTime | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure, but it only states that fields can be modified. It does not explain whether this is a partial update (only provided fields change) or a full overwrite, what happens to unspecified fields, whether timezone affects date/time values, or what response the agent can expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with no redundant wording, and the main verb and resource appear immediately. It earns its place by listing the mutable fields, though it could have used the space more effectively by adding behavioral context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with eight parameters, no annotations, and no output schema, this description is under-specified. It fails to convey partial-update semantics, required identifiers, timezone handling, or what happens on success or failure, leaving the agent to infer critical calling conventions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It maps five parameters (title, body, importance, dueDateTime, reminderDateTime) to recognizable field names, but it omits the required listId and taskId, and does not clarify timeZone or date-time format expectations. This is partial compensation for a low-coverage schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('修改' = modify) and clearly names the resource (Microsoft To Do task) plus the exact fields it changes: title, body, importance, due date, or reminder. It implicitly differentiates from siblings like create_task and complete_task by focusing on updating existing task fields, though it does not explicitly name the alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus list_tasks, create_task, or complete_task. There is no mention of prerequisites, such as needing an existing task ID, nor any exclusion like 'use complete_task to mark a task done instead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v0.1.0- First observed
complete_task - First observed
create_task - First observed
list_task_lists - First observed
list_tasks - First observed
update_task
TDQS
Each tool targets a distinct resource and action: task lists vs. tasks, and separate create/update/complete operations. There is no meaningful overlap between the tool purposes.
All tool names follow a consistent verb_noun snake_case pattern: list_task_lists, list_tasks, create_task, update_task, complete_task. The naming clearly indicates both the action and the resource.
With 5 tools, the server is well-scoped for a focused Microsoft To Do integration. Each tool covers a core operation without unnecessary bloat.
The core workflow of listing, creating, updating, and completing tasks is covered, but there is no delete_task or ability to create/rename task lists. The lack of delete capability is a notable gap in lifecycle management.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that enables AI assistants like Claude and Cursor to interact with Microsoft To Do via the Microsoft Graph API.47MIT
- AlicenseAqualityCmaintenanceMCP server for Microsoft To Do that enables managing task lists, tasks, and checklist items via the Microsoft Graph API with zero-config authentication.132Apache 2.0
- AlicenseNot gradedqualityAmaintenanceAn MCP server to read and manage your Microsoft To Do tasks through the Microsoft Graph To Do API.MIT
- AlicenseNot gradedqualityBmaintenanceA remote MCP server for Microsoft To Do that enables read/write access to tasks, lists, and checklists from ChatGPT or Claude, with multi-account support and Azure deployment.72MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/CyanRange/codex-microsoft-todo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server