[FEATURE] scheduled-tasks MCP: expose model + effort on create/update_scheduled_task, and make them readable
Preflight Checklist
- [x] I have searched existing requests and this feature hasn't been requested yet
- [x] This is a single feature request (not multiple features)
Problem Statement
First, genuine thanks — scheduled tasks are the feature that turned Claude Code from something I use into something that works while I sleep. Thirty of them run my week. This request comes from leaning on them hard.
The gap: a scheduled task runs on whatever the app's current default model is, and the session that creates and maintains those tasks can neither set that nor read it. The scheduled-tasks MCP tools (create_scheduled_task, update_scheduled_task, list_scheduled_tasks) expose taskId, prompt, description, cron/fireAt, enabled and notifyOnCompletion — nothing about model or effort. Task SKILL.md frontmatter accepts only name and description. The per-task dropdown in the desktop Edit form is a human-only lever.
Concrete, from a 30-task fleet (macOS, desktop 1.24012.9, claude-code 2.1.219, individual Max account). None of the 30 has an explicit per-task model. Reading what they actually ran — message.model plus the sibling top-level effort key in ~/.claude/projects/**/<session>.jsonl — every task ran claude-opus-4-8 @ high through 2026-07-24, then claude-opus-5 @ high from 2026-07-25. The whole fleet re-tiered in lockstep on a default change, unannounced. Some of those tasks are trivial pollers that belong on Haiku; some are reasoning-heavy audits that belong at the top tier and xhigh effort. Neither can be expressed.
This was asked once before, as #62337, and was auto-closed by the duplicate bot on the day it was filed (state "completed", 0 reactions, now locked) against two bug reports about the UI dropdown being ignored — a related but different problem. Re-filing with the effort dimension and the read-back added.
Proposed Solution
- Add optional
modelandefforttocreate_scheduled_taskandupdate_scheduled_task, using the same enums the Agent/Task tool already accepts. Omitted = exactly today's behavior, so nothing existing changes. - Return them from
list_scheduled_tasks, so a session can audit a whole fleet without doing transcript forensics. - Honor
model:/effort:in a task's SKILL.md frontmatter (currently stripped), so a task's tier lives beside its prompt and is version-controllable. - Ideally, an explicit
"default"sentinel that is distinct from unset — so "follow the app default" becomes a choice a user made, rather than the absence of one.
Alternative Solutions
settings.jsonmodel/effortLevel— global, so it re-tiers every interactive session too. Wrong granularity.- The per-task dropdown in the desktop Edit form — works (per the 2026-07-08 report in #68924), but it is manual, does not scale to 30 tasks, and cannot be audited or bulk-corrected by the agent that manages them.
- Delegating inside the prompt — have the task immediately hand its work to a subagent with a
modeloverride. This is my current workaround and it does work, but it pays for a top-tier orchestrator turn just to perform the handoff, and it cannot lower the effort of the task session itself. - Parsing
~/.claude/projects/**/*.jsonlafter the fact — good enough for observability, since model and effort are both recorded there, but it is forensics rather than configuration: it can only tell you what already ran, at whatever tier it already cost.
Priority
Medium - Would be very helpful
Feature Category
MCP server integration
Use Case Example
gmail-triage-3day— classify ~40 emails against a fixed rubric, three times a week. Wants Haiku at low effort. Currently runs on the top tier.rebuild-audit-weekly— a subtractive audit across a large document tree where a wrong call is expensive to undo. Wants the strongest model at xhigh. Also runs at whatever the default happens to be that week.- Fleet audit: "Claude, list any scheduled task that isn't on my chosen model and effort, and fix them." Impossible today at both ends — cannot read, cannot set.
Additional Context
Related issues: #62337 (this ask, bot-closed same-day, locked, 0 votes) · #36496 (per-task dropdown ignored — the older bug) · #68924 (individual-account default model) · #43326 (auto-select model/effort by complexity) · #43083 (configurable effort for subagents — the sibling surface where this was already requested).
The asymmetry that makes this read as an oversight rather than a decision: the Agent/Task tool already accepts both model and effort per call. Scheduled tasks are the one agent-spawning surface that does not — and they are the surface where it matters most, because nobody is watching when they fire.
Environment: macOS (Darwin 25.5.0), Claude desktop app 1.24012.9, claude-code 2.1.219, individual Max account, 30 active scheduled tasks.
3 Comments
Additional data point confirming the MCP-side gap, on claude-code 2.1.159 / macOS Desktop:
A daily recurring local task fired at its scheduled time and ran on
claude-opus-4-8, while~/.claude/settings.jsonhad no top-levelmodelkey at all. So the run inherited an ambient default that isn't expressed in any user-editable config.Confirming the tool surface from this version:
update_scheduled_taskaccepts onlyprompt,description,cronExpression,fireAt,enabled,notifyOnCompletion— nomodel.list_scheduled_taskslikewise returns nomodelfield, so a session can neither set nor read the model of the tasks it manages.This makes the documented guidance in
desktop-scheduled-tasksunactionable in the "or ask Claude" half:Claude cannot change the model, because no parameter exists. Either the tool needs a
modelparam, or that sentence should drop "or ask Claude" for model specifically.Read-back for auditing works as described in this issue (
message.modelin the session.jsonl), but it's after-the-fact only — which means the only way to learn what tier a routine actually ran on is to inspect a transcript after it has already billed.Confirming from a Windows fleet — both the issue and the existing comment are macOS, so adding platform coverage plus one angle I think is under-weighted here: the read side is the part that makes drift silent.
Setup: Windows 11, desktop app,
claude-code2.1.211 → 2.1.233, individual Max account, 26 scheduled tasks created and maintained through thescheduled-tasksMCP server.Tool surface confirmed identical on this platform and version:
create_scheduled_taskacceptstaskId,prompt,description,cronExpression/fireAt,notifyOnCompletion— nomodel, noeffort.update_scheduled_taskaddsenabledand nothing else.list_scheduled_tasksreturns schedule and run timestamps, never the model. TaskSKILL.mdfrontmatter carries onlynameanddescription. There is also noscheduled-tasks.jsonanywhere on this install (checked~/.claude,AppData/Roaming/Claude,AppData/Local/Claude), so the file-level workaround referenced in #78252 isn't available here either.The concrete cost, and it's the read side: our project documentation asserted one routine ran on Haiku. It had said so for weeks and was reviewed repeatedly. Reading
message.modelin the run's.jsonlshowed it had actually run onclaude-sonnet-5. Nobody could have caught that, because no surface exposes the model of a scheduled task — not the MCP tools, not the frontmatter, not any config file. The documentation drifted from reality and there was no cheap way to notice.That is a different failure mode from "I can't pin the model I want". Even for users who are happy with the ambient default, the absence of a readable field means a task's model can change under them silently — across app updates, across default-model changes — with no signal and no audit trail. Digging through session transcripts to answer "what model did my routine actually use?" is not a reasonable ask.
So I'd like to underline the second half of the request:
modelandeffortreturned bylist_scheduled_taskswould be valuable even if the write side landed later. Read-only visibility alone would turn an invisible drift into a one-call check.Still needed as of Sep 2026 — across 78 scheduled-task runs in the last 14 days on my side, every one had to have its model/effort pinned by hand in the apps Edit form, and the routine itself cannot read back which model created it, so a task cannot self-report what it is running on. Adding model+effort to create/update_scheduled_task (and to the read response) would remove both the manual pin step and the invisibility. Nothing needed from anyone else here. Thank you for building this out — the scheduling system itself has been great to build on.