Microsoft To Do MCP provides an interface that lets you manage your Microsoft To Do tasks through an AI assistant, allowing seamless task management directly through conversational commands.
The installation process involves two main steps: installing the package and setting up authentication.
npm install -g @jhirono/todomcp
Even with a global package installation, you need to clone the repository to complete authentication:
git clone https://github.com/jhirono/todoMCP.git
cd todoMCP
npm install
http://localhost:3000/callback
Create a .env
file in the root directory with your configuration:
CLIENT_ID=your_client_id
CLIENT_SECRET=your_client_secret
TENANT_ID=your_tenant_setting
REDIRECT_URI=http://localhost:3000/callback
TENANT_ID Options:
organizations
- For multi-tenant organizational accountsconsumers
- For personal Microsoft accounts onlycommon
- For both organizational and personal accountsyour-specific-tenant-id
- For single-tenant configurationsRun the authentication command from the cloned repository:
npm run auth
This opens a browser window for Microsoft authentication and creates a tokens.json
file.
Create the MCP configuration file:
npm run create-config
This generates an mcp.json
file containing your authentication tokens.
Set up global MCP configuration:
# Copy the mcp.json file to your global Cursor configuration directory
cp mcp.json ~/.cursor/mcp-servers.json
After configuration, you can use Microsoft To Do commands directly in Cursor. Try commands like:
auth status
list up todos
For Claude Desktop, the configuration file is located at:
~/Library/Application Support/Claude/claude_desktop_config.json
%APPDATA%\Claude\claude_desktop_config.json
~/.config/Claude/claude_desktop_config.json
The MCP service provides several tools for task management:
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"MailboxNotEnabledForRESTAPI" error: Typically occurs with personal Microsoft accounts due to limited Graph API access.
Token acquisition failures: Verify your CLIENT_ID
, CLIENT_SECRET
, and TENANT_ID
in the .env
file.
Permission issues: Ensure you've granted admin consent for the required permissions.
Work/School Accounts: Work best with the To Do API. Use TENANT_ID=organizations
or your specific tenant ID.
Personal Accounts: Have limited API access. Try using TENANT_ID=consumers
or TENANT_ID=common
.
Check your authentication status with the auth-status
tool or examine token expiration:
cat tokens.json | grep expiresAt
Convert the timestamp to a readable date:
date -r $(echo "$(cat tokens.json | grep expiresAt | cut -d ":" -f2 | cut -d "," -f1) / 1000" | bc)
There are two ways to add an MCP server to Cursor. The most common way is to add the server globally in the ~/.cursor/mcp.json
file so that it is available in all of your projects.
If you only need the server in a single project, you can add it to the project instead by creating or adding it to the .cursor/mcp.json
file.
To add a global MCP server go to Cursor Settings > MCP and click "Add new global MCP server".
When you click that button the ~/.cursor/mcp.json
file will be opened and you can add your server like this:
{
"mcpServers": {
"cursor-rules-mcp": {
"command": "npx",
"args": [
"-y",
"cursor-rules-mcp"
]
}
}
}
To add an MCP server to a project you can create a new .cursor/mcp.json
file or add it to the existing one. This will look exactly the same as the global MCP server example above.
Once the server is installed, you might need to head back to Settings > MCP and click the refresh button.
The Cursor agent will then be able to see the available tools the added MCP server has available and will call them when it needs to.
You can also explictly ask the agent to use the tool by mentioning the tool name and describing what the function does.