Skip to main content
Glama
yugmarwaha

Todoist Weekly Review MCP

by yugmarwaha

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-plugins

Then 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

get_overdue_tasks

Read-only. Overdue tasks + signals.

get_stale_tasks

Read-only. Tasks untouched for N days (default 60).

get_projects

Read-only. Your projects.

apply_changes

The only write. Actions: reschedule, set_priority, move_to_project, reword, complete, apply_label, split.

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_count field, 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 is POST /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 split action to break a task into sub-tasks.

Tests

npm test

61 unit tests (API mocked, no live calls) plus a smoke test that boots the real server over stdio without any token.

Available Tools

3 tools
apply_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).

ParametersJSON Schema
NameRequiredDescriptionDefault
changesYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

A4.9/5.0
Disambiguation5/5

Each tool has a distinct purpose: get_overdue_tasks reads overdue items, get_projects lists projects, apply_changes writes changes. No overlap, clear boundaries.

Naming Consistency5/5

All names follow a consistent verb_noun pattern in snake_case: get_overdue_tasks, get_projects, apply_changes. The verbs accurately describe the action.

Tool Count5/5

Three tools are well-scoped for weekly review: data retrieval (overdue tasks, projects) and change execution. No extraneous or missing tools.

Completeness5/5

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

ActivityMaintained
ResponsivenessSyncing

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

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Integrates Claude with Todoist for natural language task management, supporting project and section organization, task creation, updating, completion, and deletion using everyday language.
    19
    21
    23
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Connects 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.
    7
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Connects 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.
    58
    The Unlicense

Latest Blog Posts

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