Ms Todo Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Ms Todo Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP server that lets an LLM client (Claude Desktop, Cowork, etc.) read and manage your Microsoft To Do tasks through the Microsoft Graph To Do API.
It exposes seven tools:
| Tool | What it does | Write? |
|---|---|---|
todo_list_lists | List your task lists | – |
todo_list_tasks | List tasks in a list (by id or name), optional status filter | – |
todo_create_task | Create a task (title, note, due date, importance) | ✓ |
todo_update_task | Update title / note / due date / importance / status | ✓ |
todo_complete_task | Mark a task completed | ✓ |
todo_delete_task | Delete a task (permanent) | ✓ |
todo_create_list | Create a new task list | ✓ |
Microsoft Graph does not support application-only (daemon) permissions for creating or updating To Do tasks — only delegated permissions work. This server therefore signs in as you using the OAuth2 device-code flow and caches the resulting access + refresh tokens on disk, so you only sign in once.
The token cache contains live credentials. It is written to ~/.ms_todo_mcp/token_cache.json by default and is git-ignored. Never commit it.ms-todo-mcp. For Supported account types pickAccounts in this organizational directory only (single tenant) unless you need broader access.
Allow public client flows = Yes (required for device-code).
Delegated permissions → add `Tasks.ReadWrite`. If your tenant requires it, click Grant admin consent.
app's Overview page.
cp .env.example .env
# edit .env and set MS_TODO_CLIENT_ID and MS_TODO_TENANT_ID| Variable | Required | Notes |
|---|---|---|
MS_TODO_CLIENT_ID | ✓ | Application (client) ID |
MS_TODO_TENANT_ID | ✓ for work/school | Tenant ID/domain, or organizations / common |
MS_TODO_TOKEN_CACHE | – | Override token-cache path |
MS_TODO_TIMEZONE | – | IANA tz for due dates (default UTC) |
Install the package into the Python interpreter your MCP client will launch. By default that is plain python on your PATH. Because the client starts the server from its own working directory, the simplest, path-free setup is to install into that default interpreter — not a virtualenv:
pip install -e . # from the repo root (use `pip install .` for non-editable)On Windows this also places an ms-todo-mcp launcher in your Python Scripts\ folder.
Want isolation instead of a global install? Don't reach for a bare venv with the default config —"command": "python"won't see a venv package. Use pipx (pipx install .), which isolates the package and puts thems-todo-mcpcommand on yourPATH; then set"command": "ms-todo-mcp"in the config. (A manual venv also works, but only if the config points at that venv'spython.exeby absolute path — seeexamples/README.md.)
ms-todo-mcp loginFollow the printed instructions: open the URL, enter the code, sign in. The token cache is then stored and reused.
ms-todo-mcp # stdio transport (for local MCP clients)
ms-todo-mcp --http # streamable HTTP on :8000 (for remote use)For a local stdio client (e.g. Claude Desktop / Cowork custom connector), add an entry like the following. A ready-to-edit copy lives at examples/claude_desktop_config.json and uses your default Python on PATH (no virtualenv path hardcoded):
{
"mcpServers": {
"ms-todo": {
"command": "python",
"args": ["-m", "ms_todo_mcp"],
"env": {
"MS_TODO_CLIENT_ID": "<your-client-id>",
"MS_TODO_TENANT_ID": "<your-tenant-id>",
"MS_TODO_TIMEZONE": "Europe/Madrid"
}
}
}
}Notes:
%APPDATA%\Claude\claude_desktop_config.json (Windows)or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS). Restart the app after editing it.
python -m ms_todo_mcp to resolve, install the package into that defaultPython — run pip install -e . (or pip install .) without an active virtualenv. If python isn't your launcher, use python3 or the absolute interpreter path. On Windows you can instead set "command": "ms-todo-mcp" (the console script in your Python Scripts folder).
client launches the server (the device-code prompt goes to stderr, not chat).
env here because the repo .env is not read when theclient starts the server (its working directory isn't the project).
pip install -e ".[dev]"
ruff check .
python -m py_compile src/ms_todo_mcp/*.pyms-todo-mcp/
├── pyproject.toml
├── README.md
├── CONTRIBUTING.md
├── LICENSE # MIT
├── .env.example
├── .gitignore
├── examples/
│ ├── README.md
│ └── claude_desktop_config.json
└── src/
└── ms_todo_mcp/
├── __init__.py
├── __main__.py
├── auth.py
├── graph.py
└── server.pyReleases are automated with release-please. You do not create tags or GitHub releases by hand.
The version is derived from Conventional Commits. Because main is squash-merged, the PR title is what counts — prefix it accordingly:
fix: ... → patch bump (0.1.0 → 0.1.1)feat: ... → minor bump (0.1.0 → 0.2.0)feat!: ... or a BREAKING CHANGE: footer → major bump (0.1.0 → 1.0.0)docs: ..., chore: ..., ci: ..., refactor: ... → no releaseFlow:
main using Conventional Commit titles.chore: release X.Y.Z, bumping the version in pyproject.toml and src/ms_todo_mcp/__init__.py and updating CHANGELOG.md.
vX.Y.Z git tagand the GitHub Release with auto-generated notes.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.