@jhirono/todomcp
v1.0.1
Published
Microsoft Todo MCP service for Claude and Cursor
Maintainers
Readme
Microsoft To Do MCP
This MCP (Model Context Protocol) service allows you to interact with Microsoft To Do tasks using an AI assistant.
Setup Instructions
1. Prerequisites
- Node.js 16 or higher
- npm
- A Microsoft account (Microsoft 365 business account recommended)
- Azure App Registration (see setup below)
2. Installation
Clone the repository and install dependencies:
git clone https://github.com/yourusername/todoMCP.git
cd todoMCP
npm install3. Azure App Registration
- Go to the Azure Portal
- Navigate to "App registrations" and create a new registration
- Name your application (e.g., "To Do MCP")
- For "Supported account types", select one of the following based on your needs:
- Accounts in this organizational directory only (Single tenant) - For use within a single organization
- Accounts in any organizational directory (Any Azure AD directory - Multitenant) - For use across multiple organizations
- Accounts in any organizational directory and personal Microsoft accounts - For both work accounts and personal accounts
- Set the Redirect URI to
http://localhost:3000/callback - After creating the app, go to "Certificates & secrets" and create a new client secret
- Go to "API permissions" and add the following permissions:
- Microsoft Graph > Delegated permissions:
- Tasks.Read
- Tasks.ReadWrite
- User.Read
- Microsoft Graph > Delegated permissions:
- Click "Grant admin consent" for these permissions
4. Configuration
Create a .env file in the root directory with the following information:
CLIENT_ID=your_client_id
CLIENT_SECRET=your_client_secret
TENANT_ID=your_tenant_setting
REDIRECT_URI=http://localhost:3000/callbackTENANT_ID Options:
organizations- For multi-tenant organizational accounts (default if not specified)consumers- For personal Microsoft accounts onlycommon- For both organizational and personal accountsyour-specific-tenant-id- For single-tenant configurations
Examples:
# For multi-tenant organizational accounts (default)
TENANT_ID=organizations
# For personal Microsoft accounts
TENANT_ID=consumers
# For both organizational and personal accounts
TENANT_ID=common
# For a specific organization tenant
TENANT_ID=00000000-0000-0000-0000-000000000000Usage
Complete Workflow
Follow these steps to set up and use the MCP service:
Authenticate to get tokens
npm run authThis will open a browser window for you to authenticate with Microsoft and create a
tokens.jsonfile.Build the application
npm run buildCreate MCP config file (optional but recommended)
npm run create-configThis creates an
mcp.jsonfile with your authentication tokens.Run the application (choose one)
# Using npm start npm run start # Using CLI directly npm run cli # Using npx with local package npx .
Running in Local Development
For development and testing:
# Build and run in one command
npm run dev
# Run CLI directly
node build/cli.jsUsing with MCP Configuration
The recommended approach for tools like Claude or Cursor is to use an MCP configuration file:
First authenticate and create tokens:
npm run authGenerate the MCP configuration file:
npm run create-configUse the MCP file with Claude or Cursor (see below).
Using with Cursor
To use this MCP with Cursor, you need to configure it with your Microsoft Todo tokens. The configuration should be in .cursor/mcp.json:
{
"mcpServers": {
"mstodo": {
"command": "npx",
"args": ["-y", "@jhirono/todomcp"],
"env": {
"MSTODO_ACCESS_TOKEN": "your_access_token_here",
"MSTODO_REFRESH_TOKEN": "your_refresh_token_here"
}
}
}
}You can generate this configuration automatically by running:
npm run auth # First authenticate to get tokens
npm run create-config # Then create the MCP configurationUsing with Claude
The Claude Desktop configuration should be similar. Add this to your Claude configuration file:
{
"mcpServers": {
"mstodo": {
"command": "npx",
"args": ["-y", "@jhirono/todomcp"],
"env": {
"MSTODO_ACCESS_TOKEN": "your_access_token_here",
"MSTODO_REFRESH_TOKEN": "your_refresh_token_here"
}
}
}
}The configuration file is located at:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
You can open it with the following commands:
macOS:
open ~/Library/Application\ Support/Claude/claude_desktop_config.jsonWindows (PowerShell):
notepad $env:APPDATA\Claude\claude_desktop_config.jsonLinux:
xdg-open ~/.config/Claude/claude_desktop_config.jsonAvailable Tools
auth-status: Check your authentication statusget-task-lists: Get all your To Do task listscreate-task-list: Create a new task listupdate-task-list: Update an existing task listdelete-task-list: Delete a task listget-tasks: Get all tasks in a listcreate-task: Create a new taskupdate-task: Update an existing taskdelete-task: Delete a taskget-checklist-items: Get checklist items for a taskcreate-checklist-item: Create a checklist itemupdate-checklist-item: Update a checklist itemdelete-checklist-item: Delete a checklist item
Limitations
- Personal Microsoft accounts (outlook.com, hotmail.com, etc.) may experience the "MailboxNotEnabledForRESTAPI" error
- The API requires proper authentication and permissions
- Rate limits may apply according to Microsoft's policies
Troubleshooting
Authentication Issues
"MailboxNotEnabledForRESTAPI" error: This typically means you're using a personal Microsoft account. Microsoft To Do API access is limited for personal accounts through the Graph API.
Token acquisition failures: Make sure your
CLIENT_ID,CLIENT_SECRET, andTENANT_IDare correct in your.envfile.Permission issues: Ensure you have granted admin consent for the required permissions in your Azure App registration.
Account Type Issues
Work/School Accounts: These typically work best with the To Do API. Use
TENANT_ID=organizationsor your specific tenant ID.Personal Accounts: These have limited access to the To Do API. If you must use a personal account, try
TENANT_ID=consumersorTENANT_ID=common.
Checking Authentication Status
You can check your authentication status using the auth-status tool or by examining the expiration time in your tokens:
cat tokens.json | grep expiresAtTo convert the timestamp to a readable date:
date -r $(echo "$(cat tokens.json | grep expiresAt | cut -d ":" -f2 | cut -d "," -f1) / 1000" | bc)