ms-todo-only-mcp
Click on "Deploy 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., "@ms-todo-only-mcplist my task lists"
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.
Microsoft To Do-only MCP
Microsoft To Do를 읽기 전용으로만 가져오는 아주 얇은 MCP 래퍼입니다. 내부적으로 Softeria의 @softeria/ms-365-mcp-server를 실행하되, To Do 조회 도구와 Tasks.Read 권한만 노출합니다.
노출 도구
list-todo-task-listslist-todo-tasksget-todo-tasklist-todo-linked-resources
Related MCP server: MCP for Microsoft To Do
빠른 시작
.env.example을 .env로 복사합니다.
cp .env.example .env처음 한 번 로그인합니다. Microsoft device-code 페이지가 Chrome 시크릿 새 창으로 열리고, 코드는 클립보드에도 복사됩니다.
npm run login로그인 계정 캐시를 확인합니다.
npm run verify권한이 Tasks.Read 하나만 남는지 확인합니다.
npm run permissionsMCP 서버를 stdio 모드로 실행합니다.
npm startMCP 클라이언트 설정 예시
mcp.example.json의 절대 경로를 본인 로컬 경로로 바꿔서 MCP 클라이언트 설정에 붙이면 됩니다.
{
"mcpServers": {
"ms-todo": {
"command": "node",
"args": [
"/absolute/path/to/ms-todo-only-mcp/bin/ms-todo-mcp.mjs"
]
}
}
}AI/Codex로 설치하기
다른 사람에게는 아래 프롬프트를 그대로 전달해도 됩니다.
이 저장소를 Microsoft To Do MCP로 설정해 주세요.
1. 저장소 루트에서 `.env.example`을 `.env`로 복사해 주세요.
2. `.env` 값은 아래처럼 유지해 주세요.
MS365_MCP_CLIENT_ID=6d381e43-6641-4a91-a452-d9352244d2b2
MS365_MCP_TENANT_ID=consumers
3. `.env`와 토큰 캐시는 커밋하거나 공유하지 마세요.
4. `npm run permissions`로 `Tasks.Read`만 요청하는지 확인해 주세요.
5. `npm run login`을 실행하고, 사용자가 Microsoft device-code 로그인 페이지에서 직접 로그인/동의하게 안내해 주세요.
6. 로그인 뒤 `npm start`로 MCP 서버를 실행할 수 있게 해 주세요.
주의: client id는 public client id라 secret이 아닙니다. client secret은 만들거나 요구하지 마세요.생산성 다마고치로 쓰기
Microsoft To Do를 데이터 소스로 사용해서 오늘 할 일 상태를 펫의 말투로 피드백받을 수 있습니다. MCP 연결 뒤 prompts/productivity-pet.md의 프롬프트를 Claude, Codex, 또는 MCP를 지원하는 AI에 붙여넣으세요.
바로 쓰는 요청 예시:
Microsoft To Do에서 오늘 할 일을 확인해서 생산성 다마고치 모드로 피드백해줘.
내 자기평가:
- 집중도 4/10
- 피로도 6/10설정
기본 .env.example은 개인 Microsoft 계정용입니다.
MS365_MCP_CLIENT_ID=6d381e43-6641-4a91-a452-d9352244d2b2
MS365_MCP_TENANT_ID=consumers이 client id는 public client id라 비밀이 아닙니다. 실제 access token, refresh token, 로컬 token cache는 절대 공유하면 안 됩니다.
기본 브라우저로 device-code 페이지를 열고 싶다면 .env에 다음을 추가합니다.
MS_TODO_MCP_BROWSER=default특정 계정만 허용하려면 다음을 추가할 수 있습니다.
MS365_MCP_EXPECTED_USERNAME=you@example.com참고
Softeria의 --verify-login은 내부적으로 Microsoft Graph /me를 호출합니다. 이 프로젝트는 최소 권한을 위해 User.Read를 요청하지 않으므로 /me 검증은 403이 날 수 있습니다. 대신 npm run verify는 캐시된 계정 목록만 확인합니다.
Microsoft Graph의 To Do API는 목록 조회에 GET /me/todo/lists, 특정 목록의 태스크 조회에 GET /me/todo/lists/{todoTaskListId}/tasks를 씁니다. Softeria 서버에는 이미 이 엔드포인트들이 선언되어 있어서, 직접 인증과 Graph 호출을 다시 구현하지 않고 도구 필터와 권한 필터만 씌우는 방식으로 유지합니다.
Softeria MCP server: https://github.com/Softeria/ms-365-mcp-server
Microsoft Graph To Do API: https://learn.microsoft.com/en-us/graph/api/resources/todo-overview
Available Tools
10 toolsget-todo-taskARead-only
Read the properties and relationships of a todoTask object.
💡 TIP: Returns a single To Do task. NOTE: $select is NOT supported — do not pass select parameter, Graph returns RequestBroker--ParseUri (400). Use $expand=linkedResources to include linked email/resource. Returns body content (HTML format), checklist items, and linked resources.
| Name | Required | Description | Default |
|---|---|---|---|
| expand | No | Expand related entities | |
| select | No | Comma-separated fields to return, e.g. id,subject,from,receivedDateTime | |
| todoTaskId | Yes | Path parameter: todoTaskId | |
| fetchAllPages | No | Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search. | |
| includeHeaders | No | Include response headers (including ETag) in the response metadata | |
| todoTaskListId | Yes | Path parameter: todoTaskListId | |
| excludeResponse | No | Exclude the full response body and only return success or failure indication |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive. Description adds crucial behavioral details: $select fails with a specific error, use $expand to include linked resources, returns HTML body content, checklist items, and linked resources. This significantly enriches the agent's understanding beyond annotations.
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?
Front-loaded with purpose statement. Includes a helpful tip section. Minor redundancy: 'Returns a single To Do task' repeats the purpose. Could be slightly more concise, but overall well-structured.
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?
Despite no output schema, description specifies return content (HTML, checklist items, linked resources). Warns about an error-prone parameter ($select). Covers key aspects for a read operation. Annotations (readOnlyHint, openWorldHint, destructiveHint) complement well.
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 coverage is 100% with parameter descriptions. Description adds critical meaning for the 'select' and 'expand' parameters (warning on $select, recommendation for $expand), which is not evident from schema alone. Other parameters are adequately described in 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?
Clearly states the action 'Read' and the resource 'todoTask object'. Differentiates from sibling 'list-todo-tasks' which lists multiple tasks, as it returns a single task.
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?
Provides explicit guidance on what not to use ($select causes error) and what to use instead ($expand for linked resources). Implies it is for retrieving a single task, but does not explicitly contrast with siblings like 'list-todo-tasks' or 'list-todo-linked-resources'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-accountsARead-only
List all Microsoft accounts configured in this server. Use this to discover available account emails before making tool calls. Reflects accounts added mid-session via --login.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true, and the description adds the valuable context that the tool reflects accounts added mid-session via --login. This is meaningful dynamic behavior beyond what the schema or annotations convey.
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 two short sentences: the first states the core function, the second states its primary purpose and a dynamic behavior. No filler or repetition of schema details.
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 zero-parameter list tool with readOnlyHint, the description fully covers what the agent needs: what is listed, why to call it, and that it stays current with mid-session account additions.
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, and the schema is correspondingly empty, so there is no parameter meaning to add. The description appropriately focuses on the result, which is the full set of configured account emails.
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-resource pair ('List all Microsoft accounts configured in this server') and immediately distinguishes this from account-management siblings like login, logout, select-account, and remove-account. The intent is unambiguous.
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 explicitly states when to use the tool: 'Use this to discover available account emails before making tool calls.' This is clear context, though it does not name alternative tools or explicitly say when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-todo-linked-resourcesARead-only
Get information of one or more items in a partner application, based on which a specified task was created. The information is represented in a linkedResource object for each item. It includes an external ID for the item in the partner application, and if applicable, a deep link to that item in the application.
💡 TIP: Lists resources linked to a To Do task (emails, URLs, etc.). Each linked resource has displayName, webUrl, applicationName, and externalId.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top. | |
| skip | No | Items to skip for pagination. Not supported with $search. | |
| count | No | Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). | |
| expand | No | Expand related entities | |
| filter | No | OData filter expression. Add $count=true for advanced filters (flag/flagStatus, contains()). Cannot combine with $search. | |
| search | No | KQL search query — wrap value in double quotes. Cannot combine with $filter. | |
| select | No | Comma-separated fields to return, e.g. id,subject,from,receivedDateTime | |
| orderby | No | Sort expression, e.g. receivedDateTime desc | |
| todoTaskId | Yes | Path parameter: todoTaskId | |
| fetchAllPages | No | Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search. | |
| includeHeaders | No | Include response headers (including ETag) in the response metadata | |
| todoTaskListId | Yes | Path parameter: todoTaskListId | |
| excludeResponse | No | Exclude the full response body and only return success or failure indication |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds the output structure (displayName, webUrl, etc.) and a tip, but does not disclose additional behavioral traits such as pagination limits or authentication requirements beyond what annotations provide.
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 two short paragraphs plus a tip, front-loading the core purpose. It is efficient but the tip could be integrated into the main text to reduce repetition. No unnecessary sentences.
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 tool has 13 parameters with full schema descriptions and no output schema, the description sufficiently explains the purpose and output structure. The tip aids completeness. However, a more comprehensive overview of pagination and filtering behavior would improve completeness.
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 coverage is 100% with all parameters described. The description does not add significant meaning beyond the schema; it only provides a tip about output fields. Following the rule, a baseline of 3 is appropriate.
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 that the tool gets information about linked resources for a specified task, using specific terms like 'linkedResource object' and listing fields such as externalId and deep link. This directly distinguishes it from sibling tools like get-todo-task or list-todo-tasks.
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 for listing linked resources, but does not explicitly state when to use it versus alternatives, nor does it provide when-not-to-use guidance. The sibling context suggests uniqueness, but no explicit direction is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-todo-task-listsARead-only
Get a list of the todoTaskList objects and their properties.
💡 TIP: Lists all To Do task lists. Returns todoTaskList-id needed for all task operations. The default list is typically called 'Tasks'. NOTE: $select is NOT supported by this endpoint — do not pass select parameter, Graph returns 400.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top. | |
| skip | No | Items to skip for pagination. Not supported with $search. | |
| count | No | Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). | |
| expand | No | Expand related entities | |
| filter | No | OData filter expression. Add $count=true for advanced filters (flag/flagStatus, contains()). Cannot combine with $search. | |
| search | No | KQL search query — wrap value in double quotes. Cannot combine with $filter. | |
| select | No | Comma-separated fields to return, e.g. id,subject,from,receivedDateTime | |
| orderby | No | Sort expression, e.g. receivedDateTime desc | |
| fetchAllPages | No | Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search. | |
| includeHeaders | No | Include response headers (including ETag) in the response metadata | |
| excludeResponse | No | Exclude the full response body and only return success or failure indication |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds valuable behavioral details: the $select parameter is unsupported and causes a 400 error, and the default list is named 'Tasks'. It does not cover pagination or response structure, but the added notes are significant for proper usage.
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 concise and front-loaded with the primary action. It uses efficient formatting (tip, note) to convey key information without excess verbiage. Every sentence serves a purpose.
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 tool has 11 parameters and no output schema, the description covers the core purpose, required ID, and a critical limitation ($select). It lacks details on pagination or response format, but the schema compensates for many gaps. Overall, it is reasonably complete for a well-documented schema.
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 input schema has 100% description coverage for all 11 parameters, so the description carries little additional parameter semantics. It only indirectly references the $select parameter, which is already well-documented in the schema. Baseline score of 3 is appropriate.
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 the tool retrieves a list of todoTaskList objects and their properties, and explicitly mentions it returns the ID needed for other operations. This distinguishes it from sibling tools like list-todo-tasks (which lists tasks within a list) and get-todo-task (single task), making its purpose unambiguous.
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 context for using the tool to obtain the todoTaskList-id for subsequent operations, and warns against passing the $select parameter. However, it does not explicitly compare to alternatives like list-todo-tasks or list-todo-linked-resources, so usage differentiation is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-todo-tasksARead-only
Get the todoTask resources from the tasks navigation property of a specified todoTaskList.
💡 TIP: Lists tasks in a To Do list. Requires todoTaskList-id — use list-todo-task-lists to find it. NOTE: $select is NOT supported — do not pass select, Graph returns 400. Use $filter=status eq 'notStarted' or $filter=status eq 'completed' to filter by status. Use $top to limit results. Status values: 'notStarted', 'inProgress', 'completed', 'waitingOnOthers', 'deferred'.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top. | |
| skip | No | Items to skip for pagination. Not supported with $search. | |
| count | No | Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). | |
| expand | No | Expand related entities | |
| filter | No | OData filter expression. Add $count=true for advanced filters (flag/flagStatus, contains()). Cannot combine with $search. | |
| search | No | KQL search query — wrap value in double quotes. Cannot combine with $filter. | |
| select | No | Comma-separated fields to return, e.g. id,subject,from,receivedDateTime | |
| orderby | No | Sort expression, e.g. receivedDateTime desc | |
| fetchAllPages | No | Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search. | |
| includeHeaders | No | Include response headers (including ETag) in the response metadata | |
| todoTaskListId | Yes | Path parameter: todoTaskListId | |
| excludeResponse | No | Exclude the full response body and only return success or failure indication |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by disclosing that $select is not supported and will cause a 400 error, which is critical behavioral information. Annotations already indicate read-only, but the description adds valuable context about API limitations.
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 concise and front-loaded with the main purpose, followed by a tip block with practical advice. Every sentence adds value, though a more structured layout could improve readability.
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 complexity (12 params, no output schema), the description covers key aspects: obtaining the required parameter, limitations, filtering, and pagination. It is reasonably complete for an AI agent, though it could mention pagination via nextLink explicitly.
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 input schema covers all 12 parameters with descriptions, and the description adds extra meaning: it clarifies the unsupported $select, provides example filter values, and mentions status enum values. This significantly enhances understanding beyond 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 clearly states the tool retrieves todoTask resources for a specified todoTaskList, using a specific verb and resource. It distinguishes from sibling tools like list-todo-task-lists and get-todo-task.
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 explicit usage guidance: requires todoTaskList-id (obtained via sibling tool), warns against using $select (returns 400), and recommends filters and $top. It lacks explicit when-not-to-use scenarios but is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loginC
Authenticate with Microsoft account
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Force a new login even if already logged in |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure, but it only says 'Authenticate with Microsoft account.' It does not mention side effects like establishing a session, whether user interaction (e.g., browser prompt) is required, or how the 'force' parameter affects behavior. The parameter is mentioned in the schema but not integrated into the tool's behavioral description.
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, succinct sentence with no wasted words. However, it lacks structured presentation of key aspects (e.g., side effects, usage), so it is very concise but not well structured for complex information.
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 an authentication tool that likely has significant side effects and requires user interaction, the description is incomplete. It does not mention what happens after authentication, return values, or the effect of the 'force' parameter in context. Without annotations or output schema, the agent lacks essential context to predict outcomes.
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 schema provides complete documentation for the single 'force' parameter (coverage 100%), so the description does not need to add parameter details. It adds no extra meaning beyond the schema, aligning with the baseline of 3.
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 'Authenticate with Microsoft account' clearly states the verb (authenticate) and resource (Microsoft account). It distinguishes from siblings like verify-login (which checks status) and logout (which ends session), though it does not elaborate on the specific outcome (e.g., establishing a session or obtaining tokens).
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 on when to use this tool versus related authentication tools such as verify-login, select-account, or remove-account. The description does not mention typical call scenarios, prerequisites, or when the 'force' parameter is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logoutB
Log out from Microsoft account
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. It only states the action without explaining side effects such as token invalidation, whether it affects all sessions, or if it is permanent. This lack of detail leaves an agent uncertain about the consequences.
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, clear clause with no unnecessary words. It is appropriately concise for a simple, parameterless action, though it could benefit from a sentence about behavior or usage context without becoming verbose.
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 logout action with no parameters or output schema, the description provides the essential action but lacks context about the result (e.g., does it invalidate tokens? clear local state?). It is sufficient for basic invocation but leaves some behavioral ambiguity.
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 schema fully covers them (100% coverage). The description correctly adds no parameter information because none exist, meeting the baseline of 4 for 0-parameter tools.
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 the action ('Log out') and the resource ('Microsoft account'), making the primary purpose unambiguous. It does not explicitly differentiate from siblings like 'remove-account' or 'login', but the verb and resource are specific enough that the intent is clear.
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 'remove-account' or 'login'. It does not mention context like ending a session before switching accounts, nor does it explain differences from related sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove-accountA
Remove a Microsoft account from the cache. Accepts email address (e.g. user@outlook.com) or account ID. Use list-accounts to discover available accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Email address or account ID of the account to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the core behavior (removing from cache) but does not mention potential side effects (e.g., whether it invalidates tokens, requires re-authentication, or affects active sessions). For a simple cache operation, this is minimally acceptable but not rich.
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?
Two concise sentences, front-loaded with the action and input format, followed by a useful usage hint. No wasted words or redundancy.
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 tool with one parameter, no output schema, and no annotations, the description covers what it does, what input to provide, and how to find that input. It could mention post-removal consequences, but given the simplicity, it is sufficiently complete.
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 schema already provides a clear parameter description ('Email address or account ID of the account to remove'). The tool description adds value by providing an example format (user@outlook.com) and a discovery hint (list-accounts), going beyond the 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 states a specific action ('Remove a Microsoft account from the cache') and specifies the accepted input format (email or account ID). It clearly differentiates from sibling tools like list-accounts and select-account by focusing on cache removal.
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?
Explicitly tells the agent to use list-accounts to discover available accounts, providing a clear prerequisite. It does not explicitly state when not to use it (e.g., versus logout), but the context of cache removal is inferred, making this adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select-accountA
Select a Microsoft account as the default. Accepts email address (e.g. user@outlook.com) or account ID. Use list-accounts to discover available accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | Email address or account ID of the account to select |
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. It states the action 'select as default,' which implies a persistent state change, but does not disclose side effects (e.g., whether the previous default is replaced, whether authentication is required, or if the change is reversible). For a state-modifying tool with no annotation coverage, this is a moderate gap—not misleading, but incomplete.
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?
Two sentences with no filler. The core purpose is front-loaded, followed by accepted formats and a pointed reference to a sibling. Every word earns its place.
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 single-parameter tool with no output schema, the description covers purpose, accepted input, and a discovery path. There are no nested objects or complex edge cases to disclose, so it is complete for an agent to call it correctly.
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 coverage is 100% (the parameter description already states 'Email address or account ID'). The description adds a concrete example (user@outlook.com) and a discovery mechanism (use list-accounts), which goes slightly beyond the schema. It adds value by giving the agent a way to find valid values.
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?
States a specific verb and resource: 'Select a Microsoft account as the default.' It also specifies the accepted identifier forms (email or account ID) and provides a concrete example. This clearly differentiates it from siblings like list-accounts (which discovers) and logout (which ends a session).
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?
Explicitly says to use list-accounts to discover available accounts, which routes the agent to the right discovery tool. However, it does not state when not to use this tool (e.g., when needing to log in or out) or list alternatives beyond list-accounts. The guidance is clear for the typical flow but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify-loginA
Check current Microsoft authentication status
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 states 'check', implying a read-only operation with no side effects, but it does not mention dependencies (e.g., requires an active session) or what happens if the user is not authenticated. The description adds no detail beyond the verb.
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, short sentence that is front-loaded with the action word 'Check'. There is zero wasted wording, and it is immediately understandable.
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 zero-parameter tool with no output schema, the description provides the essential purpose. However, it does not mention what the expected outcome is (e.g., returns a boolean or status object), which could leave an agent uncertain about how to interpret the result. Some additional detail about the return value would improve completeness.
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 and the schema description coverage is 100% (vacuously). Since there are no parameters, the baseline is 4. The description does not need to explain parameters that don't exist.
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 'Check current Microsoft authentication status' clearly states the verb 'Check' and the resource 'current Microsoft authentication status'. It distinguishes itself from sibling tools like 'login' and 'logout' by focusing on verification rather than initiating or terminating a session.
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. It does not mention that it should be used to confirm authentication before other operations, nor does it contrast with 'login' or 'logout'. The context is implied but not explicitly stated.
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.
10 tool updates
v0.1.0- First observed
get-todo-task - First observed
list-accounts - First observed
list-todo-linked-resources - First observed
list-todo-task-lists - First observed
list-todo-tasks - First observed
login - First observed
logout - First observed
remove-account - First observed
select-account - First observed
verify-login
TDQS
Scored across 10 tools
Each tool has a clearly distinct purpose: authentication tools (login, logout, etc.) are separate from task operations (get, list). No overlap between listing accounts, lists, tasks, or linked resources.
All tool names follow a consistent verb-noun pattern with lowercase and hyphens (e.g., get-todo-task, list-accounts, remove-account). Even login/logout are standard verb-only forms.
10 tools is appropriate for a To Do server, covering authentication (5 tools) and read operations (5 tools). Not excessive nor insufficient.
The server is read-only for tasks and lists; missing create, update, delete for tasks and linked resources. This significantly limits functionality for typical task management.
Maintenance
Related MCP Connectors
Create, list, and complete todo items through MCP.
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
Read and write Mission Control state via MCP — projects, tasks, subtasks, templates, status updates.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides integration with ClickUp's API, allowing you to retrieve task information and manage ClickUp data through MCP-compatible clients.-
- AlicenseBqualityDmaintenanceMCP server for Microsoft To Do via Microsoft Graph. MSAL device code flow, no client secret needed.2812511MIT
- 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 gradedqualityCmaintenanceEnables MCP clients to list, view details of, and update Microsoft Planner tasks grouped by bucket.1MIT