Read-only. Returns one workflow template by `workflow_id`: its name, description, status (Active / Inactive), ordered steps, declared inputs, allowed_tools and tags, plus its triggers (including the schedule, if any) and its latest run, and a `run_state` sentence saying what will and won't run. Call it before update_workflow to see the current values: steps, inputs and allowed_tools are replaced outright when updated.
Input roles:
- workflow_id: UUID string of the workflow to fetch.
Usage patterns:
- Before update_workflow: call get_workflow, read the current `steps` / `allowed_tools` / `inputs`, then construct your update payload with those existing values preserved for any field you aren't changing.
- To say whether it runs, and how: read `run_state` and follow it. It states both switches — the workflow's `status` (Active / Inactive) and its schedule (On / Paused / none) — and what that means will and won't run. `schedule` is the read-back of its schedule (`is_enabled`, a plain-language `summary`), present only when it has one.
- Two switches, two vocabularies: the workflow is Active or Inactive; the schedule is On or Paused. Never mix them, and never call a workflow Active without saying whether its schedule is On, Paused or absent — it runs on its own only when it is Active AND its schedule is On.
- To show last run outcome: inspect `_latest_run.status` + `_latest_run.completed_at`.
**Links:** present `link_url` to the user exactly as returned — copy it character for character. Never retype, shorten, or rebuild a link or the IDs inside it.