[FEATURE] scheduled-tasks MCP: expose model + effort on create/update_scheduled_task, and make them readable

Status Open
Reported on v2.1.219
Maintainer reply None cached
Activity 3 comments · opened Jul 25, 2026

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

  1. Add optional model and effort to create_scheduled_task and update_scheduled_task, using the same enums the Agent/Task tool already accepts. Omitted = exactly today's behavior, so nothing existing changes.
  2. Return them from list_scheduled_tasks, so a session can audit a whole fleet without doing transcript forensics.
  3. 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.
  4. 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.json model / 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 model override. 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/**/*.jsonl after 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

  1. 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.
  2. 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.
  3. 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.

View original on GitHub ↗

3 Comments

quenio · 2 months ago

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.json had no top-level model key 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_task accepts only prompt, description, cronExpression, fireAt, enabled, notifyOnCompletion — no model. list_scheduled_tasks likewise returns no model field, so a session can neither set nor read the model of the tasks it manages.

This makes the documented guidance in desktop-scheduled-tasks unactionable in the "or ask Claude" half:

Schedule, folder, model, and enabled state are not in this file: change them through the Edit form or ask Claude.

Claude cannot change the model, because no parameter exists. Either the tool needs a model param, or that sentence should drop "or ask Claude" for model specifically.

Read-back for auditing works as described in this issue (message.model in 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.

RubenARNAUD · 2 months ago

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-code 2.1.211 → 2.1.233, individual Max account, 26 scheduled tasks created and maintained through the scheduled-tasks MCP server.

Tool surface confirmed identical on this platform and version: create_scheduled_task accepts taskId, prompt, description, cronExpression/fireAt, notifyOnCompletion — no model, no effort. update_scheduled_task adds enabled and nothing else. list_scheduled_tasks returns schedule and run timestamps, never the model. Task SKILL.md frontmatter carries only name and description. There is also no scheduled-tasks.json anywhere 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.model in the run's .jsonl showed it had actually run on claude-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: model and effort returned by list_scheduled_tasks would be valuable even if the write side landed later. Read-only visibility alone would turn an invisible drift into a one-call check.

geokao · 1 month ago

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.