Manage Harness deployment freeze windows via MCP. Create, list, get, update, and delete project-level freeze windows; toggle them Enabled/Disabled; and get or enable/disable the project-level global freeze. Use when asked about freeze windows, deployment freezes, change freezes, release blackouts, maintenance windows, holiday freezes, or to pause deployments. Trigger phrases: freeze window, deployment freeze, change freeze, release blackout, maintenance window, holiday freeze, pause deployments, block pipeline execution, global freeze.
87%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Create and toggle Harness deployment freeze windows via MCP. A freeze window blocks pipeline executions within a time window so you can enforce change freezes for releases, holidays, or maintenance.
| Tool | Resource Type | Purpose |
|---|---|---|
harness_list | freeze_window | List project freeze windows, filter by status / time / keyword |
harness_get | freeze_window | Get a single freeze window by identifier |
harness_create | freeze_window | Create a freeze window from YAML |
harness_update | freeze_window | Replace an existing freeze window's YAML definition |
harness_delete | freeze_window | Delete a freeze window |
harness_execute (action: toggle_status) | freeze_window | Enable / disable one or more freeze windows in bulk |
harness_get | global_freeze | Get the current project-level global freeze state |
harness_execute (action: manage) | global_freeze | Enable or disable the project global freeze from YAML |
harness_schema | freeze_window | Exact JSON Schema for the create / update body |
Both resources are project-scoped — every call needs org_id and project_id.
Create/update bodies take a raw freeze YAML string passed as body: { yaml: "<yaml string>" }. The MCP server forwards it to the Harness API with Content-Type: application/yaml.
freeze:
name: Q4 Release Freeze
identifier: q4_release_freeze
entityConfigs:
- name: All Services
entities:
- type: Service
filterType: All
- type: Environment
filterType: All
- type: EnvType
filterType: All
- type: Org
filterType: All
- type: Project
filterType: All
status: Enabled # Enabled | Disabled
description: "Change freeze for Q4 GA release"
windows:
- timeZone: America/Los_Angeles
startTime: 2026-12-20 00:00 AM
duration: 14d # e.g. 2h, 3d, 14d, 4w
recurrence:
type: Yearly # Daily | Weekly | Monthly | Yearly (optional)
notificationRules: []Use harness_schema(resource_type="freeze_window") if you want the authoritative field list. Key rules:
identifier matches ^[a-zA-Z_][0-9a-zA-Z_]{0,127}$.entityConfigs is required and must match at least one deployment scope.windows[].duration accepts h, d, w suffixes (no seconds).windows[].startTime format: YYYY-MM-DD HH:mm AM|PM in the given timeZone.Call MCP tool: harness_list
Parameters:
resource_type: "freeze_window"
org_id: "<organization>"
project_id: "<project>"
freeze_status: "Enabled" # optional: Enabled | Disabled
search_term: "release" # optional: keyword filter
start_time: 1735689600000 # optional: epoch ms lower bound
end_time: 1738368000000 # optional: epoch ms upper boundCall MCP tool: harness_get
Parameters:
resource_type: "freeze_window"
resource_id: "<freeze_identifier>"
org_id: "<organization>"
project_id: "<project>"Call MCP tool: harness_create
Parameters:
resource_type: "freeze_window"
org_id: "<organization>"
project_id: "<project>"
body:
yaml: |
freeze:
name: Holiday Freeze
identifier: holiday_freeze
entityConfigs:
- name: All Services
entities:
- type: Service
filterType: All
- type: Environment
filterType: All
- type: EnvType
filterType: All
status: Enabled
windows:
- timeZone: America/Los_Angeles
startTime: 2026-12-22 06:00 PM
duration: 10dharness_update performs a full replace of the YAML — include every field you want to keep.
Call MCP tool: harness_update
Parameters:
resource_type: "freeze_window"
resource_id: "<freeze_identifier>"
org_id: "<organization>"
project_id: "<project>"
body:
yaml: "<full updated freeze YAML>"Call MCP tool: harness_execute
Parameters:
resource_type: "freeze_window"
action: "toggle_status"
org_id: "<organization>"
project_id: "<project>"
status: "Enabled" # Enabled | Disabled
body:
freeze_ids: ["holiday_freeze", "q4_release_freeze"]Pass an array of identifiers — toggle works in bulk. Use this instead of editing the YAML when you just need to flip enabled/disabled.
Call MCP tool: harness_delete
Parameters:
resource_type: "freeze_window"
resource_id: "<freeze_identifier>"
org_id: "<organization>"
project_id: "<project>"Call MCP tool: harness_get
Parameters:
resource_type: "global_freeze"
org_id: "<organization>"
project_id: "<project>"Returns { status: "Enabled" | "Disabled", ... }. The global freeze is a singleton — there is exactly one per project scope, no resource_id needed.
Call MCP tool: harness_execute
Parameters:
resource_type: "global_freeze"
action: "manage"
org_id: "<organization>"
project_id: "<project>"
body:
yaml: |
freeze:
name: Project Global Freeze
identifier: _global_
status: Enabled # Enabled | Disabled
entityConfigs:
- name: All
entities:
- type: Service
filterType: All
- type: Environment
filterType: All
- type: EnvType
filterType: All
windows:
- timeZone: UTC
startTime: 2026-12-22 00:00 AM
duration: 14dThe global freeze takes effect immediately when status: Enabled — pipelines at the project scope will start being blocked.
/manage-freeze-windows
Create a holiday freeze window called "Winter 2026 Shutdown" in org default, project payments,
covering all services and environments, from 2026-12-22 6pm PT for 14 days./manage-freeze-windows
List every Enabled freeze window in project "payments" and also show me whether the project global
freeze is on./manage-freeze-windows
Disable all Enabled freeze windows in project "payments" temporarily so I can ship a hotfix./manage-freeze-windows
Enable the global freeze for project "payments" right now with a 4-hour duration in UTC —
we're running incident response./manage-freeze-windows
Show me every freeze window in project "release-ops" whose start_time is in the next 30 days.harness_schema(resource_type="freeze_window") to get the authoritative body schema before drafting new YAML — field names are case-sensitive and several fields (entityConfigs, windows, notificationRules) are required.toggle_status over update when you only want to flip enabled/disabled — it avoids re-sending the full YAML and works in bulk.global_freeze per project).global_freeze is a singleton per project — there is no list/create/delete. harness_get reads it, harness_execute(action="manage") flips it on or off via YAML.timeZone is an IANA name (e.g. America/Los_Angeles, Europe/Berlin), not an offset. The server interprets startTime in that zone.body must include yaml (freeze YAML string with 'freeze:' root)You passed the body as a plain YAML string or JSON object — the bodyBuilder expects the outer shape body: { yaml: "<yaml string>" }. Wrap your YAML string in a yaml key.
INVALID_REQUEST on createentityConfigs is present and non-empty. entityConfigs[].entities must include at least Service and Environment (or EnvType) filters.identifier matches ^[a-zA-Z_][0-9a-zA-Z_]{0,127}$ — hyphens and dots are not allowed in identifiers.duration values use suffixes (2h, 3d, 14d, 4w) — raw numbers without a suffix are rejected.DUPLICATE_IDENTIFIERA freeze window with that identifier already exists at the same project scope. Either harness_update the existing one or pick a new identifier.
toggle_status expects body.freeze_ids as an array of strings, even for a single window. Pass body: { freeze_ids: ["my_freeze"] }, not body: "my_freeze" or resource_id: "my_freeze".
status is Enabled and not Disabled — harness_get will show the current status.windows[].startTime and duration — if the current time is outside the window, the freeze is scheduled but not active.entityConfigs actually cover the service/environment you're deploying to — a freeze with Service: filterType: NotEquals / entityRefs: [payments] will not block payments.Disabled is enough to let a deployment through if that's the only one matching.Active (currently firing) freeze windows cannot be deleted in some account tiers — Disabled them first via toggle_status then harness_delete.
harness/harness-ai
ca2ab81
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.