Skip to main content
Glama

List schedules

well_list_schedules
Read-onlyIdempotent

List this workspace's schedules, newest first, each with its last 5 runs.

OPTIONAL: status (a list of "draft", "active", "paused", "completed", "cancelled"; omit it for every status). OPTIONAL: month ("YYYY-MM"): the calendar month a routine calendar reads, any month past or future; omit it for the next 62 days from now instead. Either way, upcoming_runs (in _meta) carries each clock routine's occurrence dates for the window, keyed by schedule_id, and capped_schedule_ids (in _meta) names every routine whose dates in that window were cut short by its own occurrence cap — say the calendar could not show every date for that routine, never that it has none.

Each schedule carries its name, kind, routine_summary and cadence_label (the words to say to the user), status_report (none, on_error, on_success or both: when Well sends a message after a run), instruction or method (the run's brief, never shown to the user; a morning brief that follows Well's own brief has instruction null, instruction_owner "well" and a sections list naming the pieces Well's brief carries, and is never compared with the person's words), when it runs (cron_expression and its timezone, or trigger_name; an event routine has no timezone), run_after, max_occurrences, ends_at (the moment after which the routine stops, or null for no end), approved_tools, status, next_run_at, consecutive_failures, paused_reason, report_destination, purpose (the job it does when it has a named one, such as weekly_missing_invoices_total), preset (null for a routine a member asked for, or the default routine Well created it from, such as weekly_missing_invoices_total), is_mine (true when the routine is the caller's own: they created it, or Well set it up for them), may_change (whether the caller may change, arm, pause, resume or cancel it: a routine runs as its creator, so only its creator or a workspace admin may), change_takes_over (true when a change by the caller, an admin, makes the routine theirs: it then runs as them and waits for their own yes) and recent_runs. report_destination says where the routine's report is expected to go: "whatsapp", "email" or "slack" (a direct message from Well in the creator's own Slack), from its creator's communication preference, or, when the creator set no preference, the report kind's default channel; null when the routine reports nothing. It is a prediction: a channel that cannot reach the creator at send time still falls back to email. Each run carries its status, summary, warning_message, skip_reason and the thread it ran in. A run of another member's morning brief carries its status and no summary, warning_message or thread: that brief is theirs alone. A skipped run with skip_reason "sunday" is a clock routine Well held back on a Sunday in the user's time zone: say it was skipped for Sunday, not that it failed. A skipped run with skip_reason "in_morning_brief" sent no message of its own because the user's morning brief already carries what it reports: say so, not that it failed. A skipped run with skip_reason "in_other_login_brief" is a morning brief Well held back because the brief of the user's other Well account on the same WhatsApp number already covers these workspaces: say one brief covers both, not that it failed. A skipped run with skip_reason "no_reachable_channel" did not run because no channel reaches the user in the order their preference sets (no WhatsApp conversation and no email, or an email preference with no email): say they get the brief once they link WhatsApp, add an email or change that preference, not that it failed. A skipped run with skip_reason "already_sent_today" is a morning brief that already went out that day: say the day's brief was sent, not that it failed. A trigger routine has a trigger_name and never a next_run_at. A draft, a paused or a cancelled schedule has no next_run_at. The list is capped, and truncated says when more exist.

A one-off at a set time shows max_occurrences 1 and completes after its run; a routine with an ends_at completes once that moment passes and draws no date after it; a recurring job shows a cron_expression with no max_occurrences. Use it to find a schedule before changing or cancelling it (a routine with a purpose is found by its purpose and is_mine, never by its text; another member's routine is never the caller's), and to answer what is scheduled, what reminders or timed jobs the user has and how the last runs went. Quote what it returns; never state a status it did not report. Describe a routine to the user by its routine_summary and cadence_label, and by next_run_at only when it is enabled. A disabled morning brief keeps its current status, but its runs skip with skip_reason "disabled" and send nothing; say it is off and can be turned back on. Never use its instruction, cron_expression or trigger_name.

Do NOT use this to create or change a schedule (use well_create_schedule and well_update_schedule).

When the token authorizes one workspace, call this directly — no workspace call is needed first. When it authorizes several, this read will not guess which one you mean: pass workspace_id on the call.

Input Schema

NameRequiredDescriptionDefault
monthNoThe calendar month a routine calendar reads, as "YYYY-MM". Any month, past or future.
statusNoOnly the schedules in these statuses.
workspace_idNoTarget workspace. Omit when the token authorizes one workspace. Required when it authorizes several: this read reports one workspace's own figures and will not choose which.
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.

Output Schema

NameRequiredDescriptionDefault
errorNo
statusNo
messageNo
successYes
scheduleNo
schedulesNo
truncatedNo
next_run_atNo
approved_toolsNo
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
resolved_workspaceNoThe workspace that answered, when the caller named none and the token authorizes several.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • removedOutput schema / properties / next_run_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / next_run_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / resolved_workspace / properties / name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / resolved_workspace / properties / name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Changed1 schema field changed
    • addedInput schema / properties / month
      Added value: +{
      +  "description": "The calendar month a routine calendar reads, as \"YYYY-MM\". Any month, past or future.",
      +  "pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
      +  "type": "string"
      +}
  3. Changed1 schema field changed
    • changedOutput schema / properties / newly_connected / description
      Previous value: -"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."New value: +"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."
  4. Added

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/idempotent/non-destructive; the description adds substantial context beyond them: _meta fields (upcoming_runs, capped_schedule_ids) and the instruction to say a routine was truncated rather than empty, cap/truncation behavior on the list, per-skip_reason semantics, disabled-brief behavior, and privacy rules (another member's brief carries no summary). It also constrains how results may be quoted ('never state a status it did not report').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and the paragraph order is logical, but the text is far longer than a list tool warrants and repeatedly restates schema content (status enum, month format, workspace_id rule). Much of the field-by-field enumeration overlaps the output schema, so several sentences do not strictly earn their place.

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?

For a read tool with 5 params, annotations, and an output schema, the description covers everything an agent needs: filtering defaults, workspace resolution, meta fields, truncation, how to describe a routine to the user, and what never to expose (instruction, cron_expression, trigger_name).

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?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: omitting status means every status, and omitting month means a live 62-day window rather than an arbitrary month. workspace_id is explained functionally (the read will not guess which workspace), though conversation_id and workspace_scope are mostly restated from the 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?

Opens with a specific verb and resource plus scope and ordering: 'List this workspace's schedules, newest first, each with its last 5 runs.' It is clearly separable from well_list_schedule_runs (runs only) and well_create_schedule/well_update_schedule, which are named later.

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?

Explicit when-to-use ('find a schedule before changing or cancelling it', 'answer what is scheduled... and how the last runs went') and explicit when-not ('Do NOT use this to create or change a schedule (use well_create_schedule and well_update_schedule)'). It also resolves the workspace-selection decision (one workspace → call directly; several → pass workspace_id).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources