Reference

Heartbeat

All MCP tools that schedule and manage heartbeats.

Tools for scheduling and managing heartbeats. The full external contract lives at sprout://heartbeat/authoring-guide.

Heartbeats are server-capped at 4 fires per 24h in the heartbeat's timezone. assignmentSkillId is now optional (pass it when you want the scheduler itself to be an auditable skill).

heartbeat.createSafe to retry

Schedule a run skill to fire on cron.

Scope: heartbeat:write

Parameters

NameTypeRequiredDescription
namestringyesHuman-readable label, ≤ 100 chars.
cronstringyes5-field cron in the heartbeat's timezone.
tzstringnoIANA timezone. Defaults to America/New_York.
runSkillIdstringyesThe run-shaped skill the heartbeat runs each fire. Must not declare heartbeat.create in handsReferenced.
assignmentSkillIdstringnoThe assignment-shaped skill (declares heartbeat.create). Must be distinct from runSkillId if passed.
childIdstringnoScope to one kid. Omit for family-wide.
sourceChatIdstringnoChat to inherit participants from. Defaults to the caller's family chat.
skillInputobjectnoStructured values for the skill's {{input.*}} placeholders. Same map on every fire.
postResultNotifybooleannoWhether the structured result posts to the family inbox.

Request example

JSON
{
  "method": "tools/call",
  "params": {
    "name": "heartbeat.create",
    "arguments": {
      "name": "Morning check-in refresh",
      "cron": "0 8 * * 1-5",
      "tz": "America/New_York",
      "runSkillId": "sk_2f...",
      "skillInput": {
        "child_name": "Jay",
        "child_id": "a4b9-...",
        "today": "{{fireDate}}"
      },
      "postResultNotify": true
    }
  }
}

Returns. { heartbeatId, chatId, nextFireAt }

Response example

JSON
{
  "result": {
    "heartbeatId": "hb_71...",
    "chatId": "th_4a...",
    "nextFireAt": "2026-05-24T08:00:00-04:00"
  }
}

Errors

heartbeat.update

Modify a heartbeat. Discrete action-based, not a partial patch.

Scope: heartbeat:write

Parameters

NameTypeRequiredDescription
heartbeatIdstringyesThe heartbeat to modify.
actionenumyesedit_schedule | edit_text | edit_name | pause | resume | cancel | add_member | remove_member | promote_admin.
cron / tzvariousnoRequired when action: edit_schedule. Re-validated against 4-fires/24h cap.
promptTextstringnoRequired when action: edit_text. Free-form heartbeats only; skill-backed reject.
namestringnoRequired when action: edit_name.
targetUserIdstringnoRequired for member actions.

Request example

JSON
{
  "method": "tools/call",
  "params": {
    "name": "heartbeat.update",
    "arguments": {
      "heartbeatId": "hb_71...",
      "action": "edit_schedule",
      "cron": "0 7 * * 1-5"
    }
  }
}

Returns. { heartbeatId, status }

Response example

JSON
{
  "result": { "heartbeatId": "hb_71...", "status": "updated" }
}

Notes. Permission rules: admins edit, members only leave, only owners cancel.

heartbeat.describe

Dry-run preview. Returns the human-readable cadence and first-fire timestamp.

Scope: heartbeat:read

Parameters

NameTypeRequiredDescription
mode"create" | "update"yesWhich preview shape.
payload (create) / patch (update)objectyesSame shape as the matching write tool.
heartbeatIdstringnoRequired for update.

Request example

JSON
{
  "method": "tools/call",
  "params": {
    "name": "heartbeat.describe",
    "arguments": {
      "mode": "create",
      "payload": {
        "name": "Morning check-in refresh",
        "cron": "0 8 * * 1-5",
        "tz": "America/New_York",
        "runSkillId": "sk_2f..."
      }
    }
  }
}

Returns. { cadenceText, nextFireAt, preview, warnings: ["schedule_conflict" | "age_edge" | "age_mismatch" | "program_not_assignable" | "already_assigned"] }

Response example

JSON
{
  "result": {
    "cadenceText": "Every weekday at 8am ET",
    "nextFireAt": "2026-05-24T08:00:00-04:00",
    "preview": { "kind": "skill", "skillId": "sk_2f...", "name": "Refresh today's check-in" },
    "warnings": []
  }
}

Notes. Read warnings back to the parent before committing.

heartbeat.list

Cursor-paginated list of heartbeats.

Scope: heartbeat:read

Parameters

NameTypeRequiredDescription
cursor / limitvariousnoStandard pagination.

Request example

JSON
{
  "method": "tools/call",
  "params": {
    "name": "heartbeat.list",
    "arguments": { "limit": 50 }
  }
}

Returns. { items: [{ heartbeatId, name, cron, cadenceText, enabled, nextRunAt, lastRunAt, chatId }], nextCursor }

Response example

JSON
{
  "result": {
    "items": [
      {
        "heartbeatId": "hb_71...",
        "name": "Morning check-in refresh",
        "cron": "0 8 * * 1-5",
        "cadenceText": "Every weekday at 8am ET",
        "enabled": true,
        "nextRunAt": "2026-05-24T08:00:00-04:00",
        "lastRunAt": "2026-05-23T08:00:00-04:00",
        "chatId": "th_4a..."
      }
    ],
    "nextCursor": null
  }
}

See also