Microsoft To Do 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., "@Microsoft To Do MCPWhat's on my to-do list today?"
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.
Contents
Related MCP server: Procrastinator MCP Server
What is this?
This adds a skill to Claude Desktop that lets you manage your Microsoft To Do tasks just by asking, in plain English — things like "What's on my to-do list today?" or "Add 'call the dentist' to my list, due Friday." Claude reads and updates your actual Microsoft To Do account. No separate app, no new interface to learn.
Setup has two parts:
Who | How long | ||
Everyone | ~2 minutes | Install the extension, sign in once | |
One admin, once | ~15 minutes | Registers the app with Microsoft — skip this if someone at your org already did it |
Quick start — Claude Desktop
You'll need: Claude Desktop installed, and a Microsoft account with Microsoft To Do — ideally a work/school Microsoft 365 account (see the personal accounts note in the FAQ if you only have a personal one).
1. Install
Get g6-mstodo-mcp.mcpb from your team, then either:
Double-click the file, or
Open Claude Desktop → Settings → Extensions and drag the file in.
No Node.js, no terminal, no hand-edited config files — Claude Desktop bundles its own Node runtime, and this extension ships its dependencies pre-installed.
2. About the "unverified extension" warning
You'll likely see:
"Installing will grant this extension access to everything on your computer. Any developer information shown has not been verified by Anthropic."
This is expected and not specific to this extension — it's Claude Desktop's standard message for any extension outside Anthropic's public directory, which this one isn't (it's a private tool built for this org). It doesn't indicate a problem. If the file came from a trusted source on your team, it's safe to continue.
3. Settings
The install screen shows a few settings fields — none are required. Defaults are pre-filled; click Install as-is unless your admin gave you specific values to enter (see org setup).
4. Sign in with Microsoft (first time only)
The first time you ask Claude something involving your tasks:
Claude opens a browser window for you.
Sign in with your Microsoft account.
Review the consent screen (it lists reading/managing your tasks and basic profile info) and click Accept.
You'll land on a success page — close the tab and go back to Claude.
Ask again — it now works, and you won't need to sign in again unless you explicitly sign out or switch accounts.
Try it out
"What are my Microsoft To Do lists?"
"What's on my [list name] list?"
"Add a task to my list: pick up dry cleaning, due tomorrow."
"Mark [task] as complete."
"Create a new list called Groceries."
Deleting something? Claude will describe what it's about to delete and ask you to confirm first — nothing is removed silently.
One-time organization setup (Microsoft Entra)
This registers the app as a known, trusted app with Microsoft so it's allowed to ask people to sign in.
1. Open the Microsoft Entra admin center
Go to entra.microsoft.com and sign in with an account that can manage app registrations for your organization.
2. Start a new app registration
Go to Identity → Applications → App registrations → New registration.
Under Name, enter something recognizable, e.g.
Microsoft To Do MCP.Under Supported account types, choose Accounts in any organizational directory (Any Microsoft Entra ID tenant) — matches this extension's default
organizationstenant setting. (Restricting to your own tenant only is fine too — just note the Tenant ID from the Overview page for step 6.)Leave Redirect URI blank for now, then click Register.
3. Copy the Application (client) ID
On the app's Overview page, copy the Application (client) ID (looks
like 4fdb1079-ff55-434a-bec9-c1f31d9daad4) — you'll need it in step 6.
4. Allow sign-in from a desktop app
Under Manage, click Authentication → Add a platform.
Choose Mobile and desktop applications.
Under Custom redirect URIs, add both of these (one for the Claude Desktop flow, one for the advanced/manual flow below):
http://localhost:51823/callback http://localhost:3000/callbackClick Configure.
No client secret to create. There's intentionally no "Certificates & secrets" step — see Why a public client + PKCE.
5. Grant the permissions it needs
Click API permissions → Add a permission → Microsoft Graph → Delegated permissions.
Search for and check Tasks.Read and Tasks.ReadWrite, then Add permissions.
If a Grant admin consent for [org] button appears, click it — optional, but it saves each person one extra click on their first sign-in.
6. Hand out what you've got
What | Where | Needed if |
Application (client) ID | Overview page | Always — share with whoever installs the extension |
Directory (tenant) ID | Overview page | Only if you chose "this organizational directory only" above |
If your build of g6-mstodo-mcp.mcpb already has your Application ID baked
in as the default, you can skip handing this out entirely.
Advanced setup — IT admins / other MCP clients
The original manual flow still works for anything that isn't Claude Desktop (e.g. Cursor), or if you'd rather manage configuration by hand.
npm install
npm run build1. Configure Azure — create a .env file:
CLIENT_ID=your_client_id
TENANT_ID=your_tenant_id_or_organizations_or_consumers_or_commonNo CLIENT_SECRET — see Why a public client + PKCE.
2. Authenticate:
npm run authOpens a browser to http://localhost:3000. Sign in, grant access, done — the
server saves your session and shuts itself down automatically a few seconds
later (or after 10 minutes of inactivity if you don't finish).
3. Point your MCP client at it:
npm run create-configWrites mcp.json with a g6-mstodo entry pointing at build/cli.js — merge
into your client's MCP config. It never embeds live tokens; build/cli.js
reads them from the same secure storage npm run auth just wrote to.
Why a public client + PKCE
Earlier versions of this project used a confidential OAuth client — a
CLIENT_SECRET typed into a .env file or settings field. For a tool
installed on many machines, a "confidential" secret that ends up on every
installation isn't really confidential. This build uses a public client
with PKCE instead (PublicClientApplication in @azure/msal-node; a fresh
code_verifier/code_challenge pair generated per sign-in — no secret,
ever).
Flow | Redirect URI | Trigger |
Embedded (Claude Desktop / MCPB) |
| Automatic, on first tool call that needs a token |
Standalone / advanced |
| Manual, via |
(Embedded port configurable via the oauth_port setting in Claude Desktop, or MSTODO_OAUTH_PORT in the manual flow.)
What's hardened here, and why
This build was hardened following a security review of the original codebase.
Hardening | Detail |
Token storage | OS keychain (macOS Keychain / Windows DPAPI / Linux |
No client secret | Public client + PKCE — see above. |
Narrower scopes by default | Only |
Confirmation on deletes |
|
Prompt-injection framing | Content read back from Graph (list names, task titles/bodies, checklist items) is explicitly framed as untrusted reference data before reaching the LLM — a mitigation, not a guarantee. |
Lazy, singleton sign-in | The embedded flow starts only when a tool call needs a token, and is safe against Claude Desktop spawning multiple copies of the server: whichever process binds the sign-in port first serves it, the rest wait, since every process reads the same shared token storage. |
Quieter logging | Full response bodies and account email are off by default. Enable via |
Local audit trail | Every tool call appended to |
Sign-in listener lockdown | Binds |
Available tools
Tool | Description |
| Check sign-in status and token expiry |
| List all task lists |
| Create a task list |
| Rename a task list |
| Delete a task list and everything in it — requires |
| List tasks in a list (supports OData filter/sort/paging) |
| Create a task |
| Update a task's fields |
| Delete a task — requires |
| List a task's checklist items (subtasks) |
| Add a checklist item |
| Edit or check off a checklist item |
| Delete a checklist item — requires |
Configuration reference
Manual-flow env var | Claude Desktop setting | Default | Purpose |
| Azure App (client) ID | GuardSix's app | Public-client Azure App Registration ID |
| Microsoft tenant |
| Which accounts can sign in |
| Include lists shared with me |
| Request |
| Verbose debug logging |
| May include account email / response content |
| Keep a local audit log |
| Local content-free audit trail of tool calls |
| Sign-in listener port (advanced) |
| Embedded flow's local sign-in port |
| — | per-user app-data dir | Override the token storage path |
| — | — | Inject tokens directly, bypassing storage |
| — |
| How long standalone |
Building the extension from source
npm install -g @anthropic-ai/mcpb # one-time
npm run package:mcpbProduces g6-mstodo-mcp.mcpb at the project root:
File | Purpose |
| Extension metadata and the settings shown during install |
| Extension icon (the GuardSix "g6" mark) |
| Builds, stages, and packs the bundle — exactly what's included |
Troubleshooting
Claude said it opened a browser, but nothing seems to have happened.
Check for a new tab or window (sometimes behind existing ones). If you don't
see one, go to http://localhost:51823/ directly.
Claude says it's "still waiting" for me to sign in. The sign-in window is open somewhere — finish there, then ask again. If you truly don't see one, use the direct link above.
I got an error during Microsoft sign-in about the app or redirect URI. The one-time org setup likely hasn't been completed, or a redirect URI doesn't match exactly — check with your admin.
FAQ
Is this safe to install? Yes, when the file comes from a trusted source on your team. The "unverified extension" warning is generic to any extension outside Anthropic's public directory — see step 2 of Quick start.
Does this cost anything? No. Using the extension doesn't add any cost beyond whatever Claude and Microsoft 365 plans you already have. The Azure App Registration and Microsoft Graph API calls it makes are free. (Code-signing this extension would cost a nominal yearly fee — that's a deliberate, deferred decision, not something you're paying for today.)
I only have a personal Microsoft account (outlook.com, hotmail.com, etc.) — will this work?
Possibly not. You may see an error mentioning MailboxNotEnabledForRESTAPI
— a Microsoft limitation, not a bug here. Microsoft only fully supports the
To Do API for Microsoft 365 (work/school) accounts.
Known, unresolved limitations
Prompt injection can't be fully solved at the tool layer — the framing in the hardening table above is a mitigation, not a guarantee.
DLP/CASB bypass is inherent to any tool that pulls Microsoft 365 data into a local LLM's context. The audit log is a compensating control (visibility after the fact), not a preventive one.
Unsigned extension.
g6-mstodo-mcp.mcpbisn't code-signed, so Claude Desktop shows an "installing unsigned extension" warning (not a hard block). Revisit signing (mcpb sign) if usage grows enough to justify the Apple/Windows signing costs.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/Aashish079/g6-MSToDoMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server