MCP server + plugin for Super Productivity.
Install: Settings -> Plugins -> upload this zip. Version must match package.json/manifest/plugin.js (all 1.8.2).
What's in 1.8.2:
bulk_update_tasksnow supports the fullupdate_taskfield set:due_with_time(null = unplan),is_done, andtime_spent_on_daybucket merge. A 9-task +1h shift used to take nine separateupdate_taskcalls; now it's one- The plugin's
bulkUpdateTasksruns the same processing asupdateTaskvia one sharedapplyTaskUpdateprocessor: title short-syntax scrubbing,time_spent_on_daymerging, anddueDay->dueWithTimepreservation. Before, bulk was a raw passthrough that skipped all of that bulk_update_tasksechoes effective tasks: after the writes it re-fetches the affected ids and returnstasks(id -> effective task incl.plannedTime) alongsideresults, so one round-trip verifies the whole shiftbatch_update_projectupdate-ops acceptdue_with_timetoo, mappable in atomic project batches (null = unplan)
What's in 1.8.1:
get_schedulenow includes subtasks by default. Before, the default silently dropped every subtask fromscheduled,unscheduledInRange,completedInRange, and the summary counts, which hid 8 of 9 planned blocks in the container-parent workflow. SP's own Today/Schedule view always showed subtasks; now the API matches.include_subtasks: falseremains as an explicit opt-out, and the response reports what was hidden via a newfilteredSubtasks: { count, taskIds } | nullfield, so filtering is never silentsp://contextincludes subtasks in today's schedule too. The one-fetch session bootstrap used to hardcodeincludeSubtasks: false, so the morning snapshot missed subtask plans entirely. It now matchessp://tasks/todayand SP's Today view
What's in 1.8.0:
- Explicitly built for Super Productivity 18.16.0 only. Older builds are refused: the plugin checks SP's app version on every command and fails with a clear error instead of silently degrading. check_connection now reports minSupVersion next to appVersion, and the manifest declares minSupVersion 18.16.0
- update_task's planned_at parameter is gone. due_with_time is the only way to set a planned time. plannedAt is no longer accepted as a get_tasks fields alias either, and the legacy plannedAt read fallback is removed: dueWithTime is the only planned-time source
- start_task and stop_task dispatch the whitelisted [Task] SetCurrentTask action unconditionally. The old marker-only fallback for older SP builds is removed; a rejected dispatch now surfaces as an error
- The getAppState version-guard workarounds ("requires SP from 2026-05-26", the get_tasks recurring_only hint) are replaced with one message: requires SP 18.16.0+
What's in 1.7.3:
- update_task accepts time_spent_on_day, a { 'YYYY-MM-DD': ms } map that merges into the task's per-day bucket (timeSpentOnDay, what the worklog sums). Dates you don't list stay untouched, so you can correct an over-accrued day without negative values. timeSpent is recomputed as the bucket sum unless you also pass time_spent
- Before this there was no way to fix a bad day: update_task { time_spent } only zeroed the total, and add_time_today rejects negative ms. The merge runs plugin-side, mirroring the proven addTimeToday write path
What's in 1.7.2:
- start_task now drives SP's real timer. It dispatches the whitelisted NgRx action [Task] SetCurrentTask with { id }, so the UI shows the ticking timer and SP accrues timeSpentOnDay natively. Before, the plugin only wrote a currentTimestamp marker that never started the UI ticker
- stop_task dispatches [Task] SetCurrentTask with { id: null }. unsetCurrentTask is not on SP's allowed-action whitelist, and the null-id form reaches the same reducer branch
- The marker write stays as a verification signal. If the action is rejected on an older SP build, the plugin falls back to marker-only behaviour
What's in 1.7.1:
batch_update_projectnow resolves same-batchtemp_idreferences. Subtasks can reference a parent created in the same call, and reorders can include freshly created tasks. SP was silently dropping those tasks and ignoring the reorder before- Unresolvable references (cycles, unknown parents) now surface as errors instead of vanishing
- Update and delete still need real task ids from the first call's
createdTaskIds
What's in 1.7.0:
batch_update_project: create/update/delete/reorder in one atomic callget_app_state: full snapshot of tasks, projects, tags, notes, repeat configs, counters; optional JSON backup viaoutput_path- Work-context tools:
get_active_work_context,get_current_context_tasks,get_selected_task,get_focused_task,select_task - Simple counters:
get_counter,set_counter,increment_counter,decrement_counter,delete_counter,get_all_counters get_notes,get_plugin_config,reinit_data- Fixed: SP 18.16's chrono parser was re-parsing date-like
@tokensin plugin-written titles, mangling them and clobbering due dates. The plugin now strips residual date tokens while keeping non-date tokens (@dave,@tag) intact
What's in 1.6.0:
@dateskips non-date@tokens;get_task_repeat_cfgsfalls back gracefully whengetAppStateis unavailable
What's in 1.5.2:
get_scheduleexcludes done tasks from its scheduled list (no double-counting in the summary)
What's in 1.5.1:
- Schedule awareness:
get_schedule, a time-blocked day view with overlap detection, tasks due but unscheduled, and work completed in range - Task name enrichment: responses resolve
projectTitle+tags;sp://contextone-fetch session bootstrap resource
What's in 1.3.6:
get_timetool (machine time in the local timezone,epochMsready for scheduling);check_connectionreturnsserverNow, so agents no longer shell out todate@due timeshort syntax (@tomorrow 3pm) sets the exact planned time; due-day changes preserve itupdate_taskdue_with_time(exact planned time in epoch ms) andplan_tasks_for_todayplan_from_now- Canonical planned-time field moved to SP's
dueWithTime; responses expose it asplannedTime
Earlier releases (1.0.0-1.3.5):
- Initial MCP server + plugin (task/tag/project CRUD, short syntax parsing, IPC bridge), triage tools, timer & Today-view bulk tools, MCP resources,
add_time_today, diagnostics, install/consent fixes
Full docs in the repository README.