update_project_settings
Changes the settings every later module reads, from the sprint length to the council's seats, after the person confirms.
Change a project's settings by project_id: any of sprint_length_days, working_days, timezone, estimation_unit, story_point_scale, default_assignee_rule, auto_transition_on_pr, auto_transition_on_merge, require_dor_for_sprint, require_dod_for_done, guest_can_comment, ai_assist_enabled, telegram_group_chat_id, wip_limits, hidden_columns, business_hours, auto_incident_on_down, council_voices and council_budget_percent. A key left out keeps its value. The change goes through the same action the Settings page runs and project.settings_changed goes out with the keys that moved.
The tool is destructive in the MCP sense: a setting changes how the project behaves rather than what it says, so a Heimdall turn pauses for the person's confirmation and an MCP client asks before sending. A staff token with project:update on the project is needed.
Requires ability
The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Fires one event
Delivered to every endpoint subscribed to it once the change is made.
Annotations
A client that honours annotations asks a person before running it.
Arguments
project_id*stringUUID of the project.
sprint_length_daysintegeroptionalHow long a sprint runs, 1 to 60 days.
working_daysinteger[]optionalThe working days as ISO weekday numbers, Monday 1 to Sunday 7.
timezonestringoptionalThe timezone the project's deadlines are read in, such as Asia/Colombo; null for the workspace default.
estimation_unitstringoptionalWhat work is sized in.
pointshoursstory_point_scalestringoptionalThe scale story points come from.
fibonaccilineartshirtdefault_assignee_rulestringoptionalWho a new item is handed to by default.
reporterleadnoneauto_transition_on_prbooleanoptionalWhether an opened pull request moves its story into review.
auto_transition_on_mergebooleanoptionalWhether a merged pull request moves its story on.
require_dor_for_sprintbooleanoptionalWhether a story needs its definition of ready ticked before a sprint takes it.
require_dod_for_donebooleanoptionalWhether an item needs its definition of done ticked before it is done.
guest_can_commentbooleanoptionalWhether client guests may comment.
ai_assist_enabledbooleanoptionalWhether Heimdall assists on this project at all.
telegram_group_chat_idstringoptionalThe Telegram group the project speaks in; null for none.
wip_limitsobjectoptionalA map of board column code to its work-in-progress limit.
hidden_columnsstring[]optionalThe board columns the project hides.
business_hoursobjectoptionalAn object with start and end as HH:MM, the hours SLAs count.
auto_incident_on_downbooleanoptionalWhether a production environment found down twice opens an incident.
council_voicesobjectoptionalA map of council moment code to the voice keys that sit on it.
council_budget_percentintegeroptionalThe share of the team's monthly AI budget the council may spend here, 1 to 100.
What it returns
{ "data": { "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13", "sprint_length_days": 7, "working_days": [1, 2, 3, 4, 5], "timezone": "Asia/Colombo", "estimation_unit": "points", "story_point_scale": "fibonacci", "default_assignee_rule": "nobody", "auto_transition_on_pr": true, "auto_transition_on_merge": true, "require_dor_for_sprint": false, "require_dod_for_done": true, "guest_can_comment": true, "ai_assist_enabled": true, "telegram_group_chat_id": null, "wip_limits": { "in_progress": 4 }, "hidden_columns": [], "business_hours": { "start": "09:00", "end": "18:00" }, "auto_incident_on_down": true, "council_voices": { "intake_scaffold": ["odin", "thor", "loki", "tyr", "frigg", "baldur"] }, "council_budget_percent": 25 }}How it fails
VALIDATION_FAILEDa sprint length outside 1 to 60, a weekday outside 1 to 7, an unknown timezone, a unit, scale or rule outside its set, a WIP limit on an unknown column, business hours without both ends, a council voice that does not exist, or a budget share outside 1 to 100.
RESOURCE_NOT_FOUNDunknown project_id, or a project outside the token's scope or the person's visibility.
FORBIDDENthe token is a client guest's, or the holder's role on the project does not carry project:update.
TOKEN_MISSING_ABILITYtoken lacks project:update.
How is this guide?
Last updated on