Todoist Weekly Review MCP
The Todoist Weekly Review MCP server helps you conduct a structured weekly review of your Todoist tasks by surfacing problematic items and applying user-approved changes.
Read Capabilities
Get overdue tasks: Retrieve all overdue tasks with details like days overdue, times rescheduled, priority, project name, and due date.
Get stale tasks: Fetch tasks that haven't been touched in a configurable number of days (default: 60), surfacing neglected items.
Get projects: List all your Todoist projects, useful for checking existing project names before proposing moves.
Write Capabilities (user-approved batch via apply_changes)
Reschedule: Set a due date using
YYYY-MM-DDor natural language (e.g., "next monday").Set priority: Assign a priority from 1–4 (where 4 = highest/P1 in the UI).
Move to project: Move a task to a project by name — auto-creates the project if it doesn't exist (e.g., "Someday/Maybe").
Reword: Update a task's content/text.
Complete: Mark a task as done (advances recurring tasks to their next occurrence).
Apply a label: Add a label to a task if not already present.
Safety Guarantees
No changes are written without explicit user approval.
There is no delete action — tasks are retired via completion or project moves only.
A malformed change rejects the entire batch before anything is written.
Manage Todoist tasks, including overdue tasks, projects, and task modifications such as rescheduling, priority changes, and moving tasks between projects.
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., "@Todoist Weekly Review MCPrun my weekly review"
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.
Todoist Weekly Review MCP
An MCP server for doing a weekly review of your Todoist with Claude. It surfaces the three kinds of mess a task list collects — overdue pileups, stale tasks nobody has touched in months, and "hidden projects" (single tasks that are really whole projects) — with the signals that matter: days overdue, days since activity, priority, how often you've postponed each one. Claude suggests a fix per task, you approve or veto each one in chat, and only the approved changes are applied. The server decides nothing on its own and makes no LLM calls. Unofficial — not affiliated with Doist.
Design history and roadmap: PLAN.md, CONTEXT.md.
Quick start
npm install && npm run build
cp .env.example .env # paste your token from Todoist → Settings → Integrations → Developer
# (or create ~/.config/todoist-weekly-review/.env instead — see below)Open Claude Code in this folder, approve the todoist-weekly-review server when asked,
and say "run my weekly review".
Related MCP server: Todoist MCP Server Extended
Install as a Claude Code plugin
/plugin marketplace add yugmarwaha/todoist-weekly-review-mcp
/plugin install todoist-weekly-review@yugmarwaha-pluginsThen create ~/.config/todoist-weekly-review/.env containing
TODOIST_API_TOKEN=<your token> (or export that variable in your shell) and run
/todoist-weekly-review.
Tools
Tool | What it does |
| Read-only. Overdue tasks + signals. |
| Read-only. Tasks untouched for N days (default 60). |
| Read-only. Your projects. |
| The only write. Actions: |
Safety
Nothing is written without your explicit per-item approval in chat.
No delete exists. Tasks are retired by completing them or moving them to "Someday/Maybe" (created automatically if missing).
Token lives in the gitignored
.env(or~/.config/todoist-weekly-review/.env) — never logged, never committed.Read errors are loud (bad token, rate limit, etc.) — never a silent empty list.
A malformed change rejects the whole batch before anything is written.
Design notes
"Times rescheduled" comes from the task's
postponed_countfield, so the plan-gated activity log isn't needed. Omitted when Todoist doesn't return it.Priority is inverted in the API: 4 = highest (the UI's P1). Passed through as-is.
Endpoints verified against the live v1 OpenAPI spec. Two fixes vs. the draft plan: filtering is
GET /tasks/filter?query=…, and moving a task isPOST /tasks/{id}/move.Todoist quirk: a task due earlier today doesn't count as "overdue" until tomorrow.
Days overdue are computed in your Todoist account's timezone.
Recurring tasks are flagged
isRecurring— completing one advances it to the next occurrence instead of retiring it.Hidden-project detection is the client model's judgment call — the server just provides the
splitaction to break a task into sub-tasks.
Tests
npm test61 unit tests (API mocked, no live calls) plus a smoke test that boots the real server over stdio without any token.
Available Tools
3 toolsapply_changesApply approved changesA
Executes an explicit, already-approved list of changes against Todoist. ONLY call this
with changes the user has explicitly approved ITEM BY ITEM in chat. Never infer, batch,
or add a change the user did not individually confirm — if the user vetoed or didn't
respond to an item, leave it out of the changes array entirely.
Each change is { taskId, action, params? } where action is one of:
reschedule: params.dueDate (YYYY-MM-DD) OR params.dueString (Todoist natural language like "next monday"). Provide exactly one.
set_priority: params.priority, an integer 1-4, sent RAW to the API — 4 is highest/urgent, 1 is normal (inverse of the UI's P1 label). Do not remap.
move_to_project: params.projectName (a name, e.g. "Someday/Maybe"). The server finds the project by exact case-insensitive name, or creates it if missing, then moves the task there. This is the primary way to retire a task without deleting it.
reword: params.content, the new task text.
complete: no params. Marks the task done — the other way to retire a task.
apply_label: params.label. Fetches the task, appends the label if not already present, and saves it.
There is NO delete action in this server — tasks are never destroyed, only completed
or moved. split also does not exist in v1.
Input validation note: the changes array is validated as a whole against a strict
schema before any writes happen. If ANY item is malformed (unknown action, missing
required params, wrong type), the ENTIRE call is rejected and NOTHING is written — no
partial execution of a batch that contained a bad item. This is deliberately the safer
of two valid designs. Once validation passes, each item is executed independently and
the result reports success/failure per item (so a live API failure on one item, e.g. a
task that was deleted in Todoist meanwhile, does not stop the others).
| Name | Required | Description | Default |
|---|---|---|---|
| changes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: validation rejects the entire batch if any item is malformed, execution is per-item with independent success/failure reporting, and no delete action exists. This covers key safety and execution model details.
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 long but well-structured with clear sections for usage guidelines, action details, and validation behavior. Every sentence adds value given the complexity of six action types. Slightly verbose but justified; could be trimmed slightly without losing meaning.
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?
The description covers input comprehensively and mentions per-item result reporting, but does not provide output schema or detailed error response format. For a mutation tool with no output schema, this is fairly complete; minor gap on output specifics.
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?
Since schema description coverage is 0%, the description adds extensive meaning by detailing each action type (reschedule, set_priority, etc.), their required params, and nuances like priority mapping (1-4, 4 highest) and project name matching (case-insensitive, auto-create). This is far beyond the raw 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 executes an explicit list of approved changes against Todoist, which is a specific verb+resource. It distinguishes itself from sibling read-only tools (get_overdue_tasks, get_projects) by being a mutation tool. The phrasing 'ONLY call this with changes the user has explicitly approved' reinforces its unique purpose.
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 first paragraph provides explicit instructions on when to use (only with explicit user approval), what not to do (never infer, batch, or add unconfirmed changes), and what actions are missing (no delete, no split). This gives clear guidance on appropriate usage and distinguishes from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_overdue_tasksGet overdue tasksA
Returns every currently-overdue Todoist task as weekly-review candidates: { id, content, projectId, projectName, priority, dueDate, daysOverdue, timesRescheduled? }.
This tool is READ-ONLY and writes nothing. After calling it, propose a fix for EACH task in chat (reschedule to a concrete date, change priority, or retire it via complete / move_to_project to a project like "Someday/Maybe") and get the user's explicit approval or veto PER ITEM before ever calling apply_changes. Never batch-apply changes the user hasn't individually confirmed.
Signal reading guide: higher daysOverdue and higher timesRescheduled together indicate a stronger candidate to RETIRE (complete or move to Someday/Maybe) rather than reschedule yet again — a task rescheduled 6 times is a task the user isn't going to do. A task that is merely a day or two overdue with 0 reschedules is a normal reschedule candidate. timesRescheduled is omitted entirely when Todoist didn't report it for that task.
IMPORTANT: priority is the raw Todoist API value (1-4) where 4 = highest/urgent and 1 = normal. This is the INVERSE of the Todoist UI's "P1" (P1 in the UI = API value 4). Do not remap it — read it as-is and account for the inversion when you describe it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description takes full responsibility, stating 'This tool is READ-ONLY and writes nothing.' It also details output fields, including the conditional timesRescheduled, and explains priority inversion without contradiction.
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 detailed but well-structured with clear sections. Each sentence adds value; however, it could be slightly more concise without losing meaning.
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?
No output schema, but the description fully documents the output format, field meanings, and interpretation logic (priority inversion, reschedule vs retire decision). All necessary context is provided for a zero-parameter, output-only tool.
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?
No parameters (input schema empty), so baseline is 4. The description adds no param info, but no param info is needed; the context is fully covered elsewhere.
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 specifies that the tool returns overdue Todoist tasks as weekly-review candidates, listing exact fields. It is distinct from sibling tools like apply_changes and get_projects, which have different purposes.
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 states when to use (weekly review), provides step-by-step post-call workflow (propose fixes per task, get user approval before calling apply_changes), and includes signal-reading guidance for deciding between rescheduling and retiring tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectsGet projectsA
Returns every Todoist project as { id, name } (paginated to completion). Use this to see what projects already exist — in particular, to check whether a "Someday/Maybe" (or similarly named) retirement project already exists before proposing to move a task there. You do NOT need to create it yourself: apply_changes' move_to_project action finds-or-creates the target project by name automatically.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must carry full burden. It discloses pagination to completion and the return format. It does not explicitly state it's safe/idempotent, but the read nature is clear. Minor omission prevents a 5.
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?
Three concise sentences, front-loaded with the core function. Every sentence adds value: returns all projects, use case, reminder about apply_changes. No waste.
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 no parameters, no output schema, and a simple return, the description is complete. It explains the purpose, usage scenario, and relationship to sibling tools. Agent has all necessary info.
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?
No parameters exist, and schema coverage is 100% (empty). Baseline for 0 parameters is 4. Description adds no parameter info but doesn't need to. It adds context about what the tool does.
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 precisely the action: 'Returns every Todoist project as { id, name }'. It specifies the verb (returns) and resource (projects), and distinguishes from sibling tools by noting that apply_changes handles automatic creation.
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 states when to use: 'to check whether a Someday/Maybe retirement project already exists'. Also clarifies when NOT to create a project manually because apply_changes' move_to_project action finds-or-creates. Provides clear context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct purpose: get_overdue_tasks reads overdue items, get_projects lists projects, apply_changes writes changes. No overlap, clear boundaries.
All names follow a consistent verb_noun pattern in snake_case: get_overdue_tasks, get_projects, apply_changes. The verbs accurately describe the action.
Three tools are well-scoped for weekly review: data retrieval (overdue tasks, projects) and change execution. No extraneous or missing tools.
The set covers the full weekly review workflow: get overdue tasks, see available projects, and apply all required actions (reschedule, priority, move, complete, etc.). No obvious gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Persistent context for Claude. Your AI always knows your projects and next actions across sessions.
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
AI teammate for tasks: builds your list from meetings, email and chats, and checks off done work.
AI-native Kanban board — connect Claude to claim, work and move your tasks over MCP.
Related MCP Servers
- AlicenseBqualityDmaintenanceIntegrates Claude with Todoist for natural language task management, supporting project and section organization, task creation, updating, completion, and deletion using everyday language.192123MIT
- AlicenseAqualityDmaintenanceEnables natural language task management with Todoist, supporting tasks, projects, sections, labels, smart search, and batch operations for efficient workflow integration with Claude and other MCP-compatible LLMs.1921MIT
- AlicenseAqualityCmaintenanceConnects Claude to Todoist for transforming meeting notes into actionable tasks with inferred due dates and priorities. It enables full task lifecycle management, including creating subtasks, listing projects, and completing tasks through natural language.7MIT
- AlicenseNot gradedqualityCmaintenanceConnects Claude to self-hosted Vikunja instances for conversational task and project management. Supports CRUD operations on projects and tasks, plus labels, comments, weekly reviews, calendar feeds, and task relations.58The Unlicense
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/yugmarwaha/todoist-weekly-review-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server