Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Added "answer_planning_question"; changed the definition of "list_escalations", "project_digest", "project_status" and 1 more (48 tools before, 49 now)
⟨126 unchanged words⟩ id), other stale work to `replan_task`, an open planning question (reason `expand_needs_clarification`, with its `planning_questions`) to the owner tool `answer_planning_question`, and only safe auxiliary cards to `resolve_escalation`. For ⟨22 unchanged words⟩
Read a compact progress digest for one project (delivery, activity,holds, next decision).Returns the closed MCP projection: delivery counts and the five newestdelivered items, a recent loop-activity count, current holds, the singlehighest-priority open decision, and `more_decisions`. Two steering fieldsare ALWAYS present: `next_action` is `"call_tool"` with`next_tool="list_escalations"` when a decision exists, otherwise`"none"` with `next_tool: null`. `since` is an optional ISO-8601timestamp with a timezone; it defaults to 24 hours ago and is clamped tothe last seven days.This tool is **off by default and not generally available**: it is registered only when the server was started with `KEELEN_PROGRESS_DIGEST_ENABLED` enabled, and a live disable refuses calls until restart.Tenant-scoped: a project outside the caller's
⟨130 unchanged words⟩ not guaranteed to be a purely local read. `model_roles` (only when the Researcher/Integrator feature is enabled for the project) reports each optional stage's on/off configuration and last outcome.
⟨57 unchanged words⟩ or supersede operation is the correct path instead. An open planning question is refused too: answer it with `answer_planning_question` (or `cancel_roadmap_item` if the item is no longer needed), because an acknowledgement would drop the answer. The acknowledgement itself is replay-guarded (a repeat ⟨35 unchanged words⟩
Answer Planning Question — Answer an open planning question and release its roadmap item. Use this for a `list_escalations` row with reason `expand_needs_clarification` (its `next_tool` names this tool). The planner asked one or more product questions about one roadmap item; give ONE answer that covers every question (1-4,000 characters). The answer is stored with the item, the card is resolved, and the next planning run of that item reads the answer. It is stored once: a second answer to the same round is refused. Requires the personal connection of an active workspace owner; a workspa…
Certificate changed, valid to 2027-01-18
Authorization not required, issuer https://keelen.ai
Added "remove_cancelled_dependency" (47 tools before, 48 now)
Remove Cancelled Dependency — List or remove a dependency on a task cancelled without delivery. ``escalation_id`` is a ``prerequisite_hold_stalled`` card. A waiting task whose dependency points at a task cancelled without proof of delivery can never start. Without ``task_id`` and ``predecessor_task_id`` this lists every such dependency in the card's project and changes nothing. With both, it removes that ONE dependency, so the waiting task can be groomed and built without the cancelled work; any other dependency is refused. The card then refreshes, or resolves when no held prerequisite remains…
Changed the definition of "list_steering_rules"
⟨28 unchanged words⟩ `pending` = waiting for a project member's approval, `expired` = past its expiry and no longer in the prompt) and `origin`: `owner_request` (written from a ⟨49 unchanged words⟩
Added "approve_steering_rule", "list_steering_rules" and "retire_steering_rule"; changed the definition of "resolve_platform_policy_conflict" (44 tools before, 47 now)
Resolve a platform-policy dead-end with a structured plan decision.``decision`` isChooseone``decision``offrom ``reuse_existing_evidence``,``split_task``,``raise_project_cap``, ``remove_scenario``, or ``correct_evidence_selector``. ``raise_project_cap`` also requires ⟨12 unchanged words⟩ task lineage is requeued before the escalation resolves. ``split_task`` is not a recommended decision: it does NOT decompose the task and does NOT create a follow-up task. Never use it to create a follow-up; to split work, use ``replan_task`` or submit a new Request. ``correct_evidence_selector`` (web_app tasks, active workspace owner only; ⟨236 unchanged words⟩
Authorization not required, issuer https://keelen.ai
Changed the definition of "list_escalations" and "resolve_platform_policy_conflict"
⟨131 unchanged words⟩ `replan_task`, and only safe auxiliary cards to `resolve_escalation`. For an active workspace owner, an eligible platform conflict on a web_app task also lists `evidence_selector_cells`, the input of the owner-only `correct_evidence_selector` decision.
⟨10 unchanged words⟩ is one of ``reuse_existing_evidence``, ``split_task``, ``raise_project_cap``,or``remove_scenario``,``remove_scenario``.or ``correct_evidence_selector``.
Recently observed → Live
Live → Recently observed
Added "requeue_for_review"; changed the definition of "list_escalations" (43 tools before, 44 now)
⟨98 unchanged words⟩ `rearm_roadmap_item`, platform conflicts to their structured resolver,stalean orphan block whose task keeps its own PR to the owner tool `requeue_for_review` (it takes the row's task_id, not its id), other stale work to `replan_task`, and only safe auxiliary cards to `resolve_escalation`.
Requeue Task for Review — Return one blocked task's existing pull request to normal review. Requires a personal OAuth connection of an active workspace owner; workspace keys are refused. Pass the task id (not an escalation id), the PR's exact 40-character head SHA, a reason (1-2000 characters) and a request_id you choose (1-128 of letters, digits, `.`, `:`, `_`, `-`). The task's own open keelen/iter-* PR must be green and cleanly mergeable at that head, and its latest DEV run must have verified that head. Status becomes done (implementation awaiting review), never delivered. Review, CI…
Authorization not required, issuer https://keelen.ai
Changed the definition of "get_request_status"
⟨43 unchanged words⟩ no items), "failed" (see intake_failure_reason), "approve_plan" (a planned request's plan awaits the user's approval in the dashboard). A planned request also carries `stage`, `plan_cycle` and `max_cycles`.
Added "stop_iteration" (42 tools before, 43 now)
Stop Running Iteration — Stop one running iteration after confirmed runtime cleanup. Requires a personal active workspace owner. Workspace keys and Portfolio delegation cannot stop compute. The exact project iteration number binds the runtime. Cleanup failure leaves it active; a busy subject is refused. Confirmed cleanup finalizes unfinished runtime iterations, holds its legacy tasks for owner close or replan and records the owner and reason. It grants no delivery, retry or merge authority. A repeat returns the same receipt.
Authorization not required, issuer https://keelen.ai
Changed the definition of "refine_request"
Only numbers and dates differ: this server embeds live figures in the definition, so the text moves without the contract changing.
⟨13 unchanged words⟩ Status must be "done". `feedback_md` is1..20001..1979 chars. Moves the thread to refine_pending; get_request_status reports ⟨41 unchanged words⟩
Authorization not required, issuer https://keelen.ai
Authorization not required, issuer https://keelen.ai
Changed the definition of "get_provisioning_status" and "list_github_repos"
⟨34 unchanged words⟩ "wait" with poll_after_seconds (~10s) while provisioning,or"wait" with NO poll_after_seconds when errored (fix the reported cause, then re-check — polling again without fixing it will not change the result), and "done" when overall is 'ready' ⟨32 unchanged words⟩
⟨48 unchanged words⟩ connected yet — connect_github() is required first.
Changed the definition of "answer_request", "archive_project", "cancel_roadmap_item" and 39 more
before
—after
Answer Request Questions⟨19 unchanged words⟩ , "answer_md": <str, 1..2000 chars>}.Answer EVERYEvery question needs exactlyonce.oneFlipsanswer. The call flips the threadback to intake_pending;poll
Changed the definition of "list_escalations" and "list_roadmap"
⟨32 unchanged words⟩ the blocked task's title + PR url. A card about a roadmap item carries its `roadmap_item_id` (null for a task-only, project-level or synthetic row), which matches the `id` in `list_roadmap`. A "forever-paused" project with no open `project_pause` row ⟨46 unchanged words⟩
⟨25 unchanged words⟩ not, why it skips them (`skip_reason`:crash_cappedawaiting_intake_thread | awaiting_clarification | crash_capped | noop_capped | crash_cooldown | noop_cooldown |awaiting_intake_thread
Authorization not required, issuer https://keelen.ai
Added "project_digest" (41 tools before, 42 now)
Read a compact progress digest for one project (delivery, activity, holds, next decision). Returns the closed MCP projection: delivery counts and the five newest delivered items, a recent loop-activity count, current holds, the single highest-priority open decision, and `more_decisions`. Two steering fields are ALWAYS present: `next_action` is `"call_tool"` with `next_tool="list_escalations"` when a decision exists, otherwise `"none"` with `next_tool: null`. `since` is an optional ISO-8601 timestamp with a timezone; it defaults …
Authorization not required, issuer https://keelen.ai
Changed the definition of "resolve_platform_policy_conflict"
⟨144 unchanged words⟩ worker to cover that cell with one scenario. Criteria on one route, state and variant that name different ready selectors are likewise refrozen to one selector. Every criterionkeeps its row and alias; unrelated specs are notchanged.
Changed the definition of "resolve_platform_policy_conflict"
⟨82 unchanged words⟩ decision is needed to make room in it. On a ``web_app`` task, ``reuse_existing_evidence`` also repairs a frozen theme-only collision in the same transaction: criteria whose evidence specs differ only by a light/dark variant token (for example ``setup-timeline-light`` and ``setup-timeline-dark``) are refrozen to one shared cell that lists the required ``themes``, the old and new specs are audited, and the plan tells the worker to cover that cell with one scenario. Every criterion keeps its row and alias; unrelated specs are not changed.
Authorization not required, issuer https://keelen.ai
Changed the definition of "resolve_platform_policy_conflict" and "set_ui_review_scenario_cap"
⟨33 unchanged words⟩ task lineage is requeued before the escalation resolves. On a project that runs the ui-review evidence lifecycle (``ui-review.json`` is a retained evidence catalog), ``raise_project_cap`` changes the per-run capture budget -- how many scenarios one capture run holds -- not catalog capacity: the catalog has no scenario limit, so no decision is needed to make room in it.
⟨100 unchanged words⟩ manifest fails every push while CI stays green. On a project with the retained evidence catalog (the response carries ``evidence_lifecycle: true``) the same parameter is a CAPTURE-RUN setting: it limits how many scenarios and screenshots one capture run holds, a pull request that needs more is split into capture batches, and the catalog keeps every scenario whatever the value. The response then also reports ``catalog`` (the retained counts) separately from ``run_limits``, and a lower is not refused for catalog size once the catalog is migrated.
Authorization not required, issuer https://keelen.ai
Changed the definition of "submit_request"
⟨8 unchanged words⟩ "title":"Text","type":"string"},"workflow_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Workflow Profile"}},"required":["project_id","text"], ⟨4 unchanged words⟩
Authorization not required, issuer https://keelen.ai
Authorization not required, issuer https://keelen.ai
Authorization not required, issuer https://keelen.ai
Changed the definition of "answer_request", "archive_project", "cancel_roadmap_item" and 36 more
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":falsetrue,"readOnlyHint":false}
⟨51 unchanged words⟩ can be restored from the dashboard project page.Idempotent.Stopping a machine DESTROYS the running process state — restoring the project later cannot bring that execution back, so this is destructive despite being reversible. A replay on an already-archived project changes no row, but is not idempotent end to end.
Changed the definition of "resolve_platform_policy_conflict" and "set_ui_review_scenario_cap"
Only numbers and dates differ: this server embeds live figures in the definition, so the text moves without the contract changing.
⟨15 unchanged words⟩ ``raise_project_cap``, or ``remove_scenario``. ``raise_project_cap`` also requires ``project_cap`` (6..246..32). The decision becomes a new task-plan section; ⟨10 unchanged words⟩
Only numbers and dates differ: this server embeds live figures in the definition, so the text moves without the contract changing.
⟨9 unchanged words⟩ it. ``scenario_cap`` is an integer from 6 through
Authorization not required, issuer https://keelen.ai
Authorization not required, issuer https://keelen.ai
Authorization not required, issuer https://keelen.ai
Certificate recorded, valid to 2026-11-19
Authorization not required, issuer https://keelen.ai
First tool surface recorded: 41 tools
Showing the latest 41 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
Approve Steering Rule — Approve one pending steering rule so it reaches the iteration prompts. Pass the project id and the rule `id` from list_steering_rules. Only a `pending` rule changes; an already active rule returns `changed: false`. A retired rule is refused (409): approval never re-activates it. Your identity comes from this connection and is recorded on the audit trail.
List Steering Rules — List this project's active and pending steering rules. Steering rules are prepended to every planning, development and QA prompt. Each rule has `state` (`active` = in the prompt, `pending` = waiting for a project member's approval) and `origin`: `owner_request` (written from a Request), `retro_kaizen` (a sprint retrospective kaizen), `failure_pattern` (a recurring failure), `automatic` (activated without human review from another source) or `unknown` (a legacy rule with no recorded source). `auto_approved` is true when no person reviewed it. Retired rules are …
Retire Steering Rule — Retire one steering rule so no later iteration prompt carries it. Pass the project id and the rule `id` from list_steering_rules. Works for an active or a pending rule, including a retro kaizen the automatic curation pass protects. The rule's text and history are kept and the retirement appears in Loop Activity. A rule that is already retired returns `changed: false`. There is no un-retire: to bring a convention back, submit it as a new Request. Running iterations keep the prompt they started with.
⟨24 unchanged words⟩ "default":null,"title":"Project Cap"},"selector_corrections":{"anyOf":[{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object"},{"type":"null"}],"default":null,"title":"Selector Corrections"}},"required":["escalation_id","decision"," ⟨5 unchanged words⟩
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Answer Request Questions"}
before
—after
Archive Project⟨93 unchanged words⟩ , but is not idempotent end to end.PreferThisthisisoverpreferable to `delete_project` unlessyouthespecificallyprojectwantmustthebeprojectgone.Owner-scoped (an MCP key is owner-only); a project not in theworkspace 404s.
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Archive Project"}
before
—after
Cancel Roadmap ItemCancel / close a single roadmap item (getlist_roadmap returns its idfrom list_roadmap).Use this to closeFor a DELIVERED or duplicate item that keeps re-parking:whenonce the workalreadyhas shipped, every expand produces no dev-ready tasks and files arecurringrecurring `roadmap_item_parked` escalationyouthathavehas tokeepbeacking.acked. Cancellingdrops theitem out of the expand queue AND resolves any open expand-laneescalation forit. Business-level replay guard: an already expanded/cancelleditem changes nostate, and the dashboard can restore a cancelled item.Refuses (409) while theitem is actively being expanded (a retry once thatiteriteration ends succeeds). Returns {id, status, changed, next_step}.
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Cancel Roadmap Item"}
before
—after
Clear Horizon Pin⟨81 unchanged words⟩ refuses (422) on a non-queued item —useacancel_roadmap_item todeliveredcloseitemais closeddeliveredwithitem.cancel_roadmap_item. Returns {id, previous_pin, horizon_pin,next_step}.
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Clear Horizon Pin"}
before
—after
Close Task⟨8 unchanged words⟩ — a duplicate, or work already shipped.Use this whenFor a task on the board that is obsolete: the change already landed in another ⟨32 unchanged words⟩ is REQUIRED and is recorded on the audittrail; say whytrail in oneline.Passline. `superseded_by_pr_number` (or `superseded_by_task_id`) records verified provenance when thework was genuinely delivered somewhere else— that records verified provenance, instead ofa bare abandon. Closing does NOT claim the content ison the default branch,so any task that declared a dependency on this onekeeps waiting;deliverthoseorare deliveredre-planorthosere-planned separately. Refuses with 409 while the task is being worked on by a running iteration (stopanthein-flightmachineiterationfirstmust finish, orwaititsformachineitmusttobefinishstopped, before the close succeeds). A task in another workspace 404s. Business-level ⟨37 unchanged words⟩ the project, counted after the close commits.Check it —Aifcountitthat did not drop,means the ticket was already closed and this call ⟨9 unchanged words⟩ and neither counts a closed task as open.PreferThisthisisoverpreferable to leaving a dead task on the board: unfinished taskscountcount against the project's planning capacity, so stale duplicates quietlystopstop new roadmap items from being expanded.
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Close Task"}
before
—after
Connect GitHub Account⟨9 unchanged words⟩ work can reach real repos. Returns an `install_url`— send it tothat the userto openopens in abrowser.browserTheyto pick the GitHubaccount/org, approve the install, and land on a "connected"page;then pollpage; get_onboarding_status()untilthengithub_connectedreportsisgithub_connected true. Thelink expiresin 10minutes —minutes;callaconnect_github()repeatagaincallformints a fresh one.
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Connect GitHub Account"}
before
—after
Control Project Scheduler⟨84 unchanged words⟩ process_now can start an intake batch, sotreat thisthe toolasis destructiveeveneven when the echoed scheduler state looks unchanged. Returns the resulting scheduler state.
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Control Project Scheduler"}
before
—after
Create Project⟨5 unchanged words⟩ a GitHub repo and begins work on it.Use this ONLY when the user wantsFor a NEWrepo scaffolded. Ifrepo.theyGivenalready haveanaexisting repo,useimport_project(repo_full_name)insteadis the right call — thistoolone wouldcreate a second, emptyonerepo besidetheirsit (list_github_repos() browses whatthe workspace can see). Scaffolds a new ⟨269 unchanged words⟩ repo, thread_id, next_action, poll_after_seconds, next_step};follownext_step(names the follow-up poll of get_request_status withthe returnedthread_id).thread_id. On the rare arm where the first Request failed tosubmit,next_action is "call_tool" with next_tool="submit_request". ⟨34 unchanged words⟩
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Create Project"}
before
—after
Delete Project{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Project"}
before
—after
Get Billing Status⟨44 unchanged words⟩ returns a `checkout_url` with next_action "browser" —send it tothe usertoopensopenit in a browser (theone setupstep that can't happen in chat). Compute unlocks automaticallyonce paymentcompletes (a Stripe webhook flips the workspace to active);youdo not need to blockblocking onit.it is unnecessary. A past_due workspace gets NO checkout —the fix is a cardupdate in the dashboard billing page (a new checkoutwould create a secondsubscription);follownext_stepnext_step.carries that fix. Subscribed or suspended-with-subscription states return checkout_url=None with an explanatory next_step.
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Get Billing Status"}
before
—after
Get Control Gap Findings⟨15 unchanged words⟩ without a total or an overall framework outcome.Read`not_determinable` and `outside_review_scope`beforedescribing anyqualify every observation. An empty group does not establish thata control is inplace, and `disclaimer_md` must reach the user. `limit` ⟨30 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Get Control Gap Findings"}
before
—after
Get Legal Exposure Findings⟨60 unchanged words⟩ , and no overall state in this output.Read`not_determinable`before you summarise: thoselistsarethe checks that couldnot reach averdict, and leavingverdict; omitting themoutwould turn a partial review intoa clean answer. The`disclaimer_md` field must reach the user. `limit` defaults ⟨34 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Get Legal Exposure Findings"}
before
—after
Get Onboarding Status⟨19 unchanged words⟩ / project_count / payment_status and a `next_action` stringyouwhoseshouldvaluefollowisVERBATIMauthoritative,pollingwith this tool polled between steps. `next_action` is "call_tool" (callthe tool named in `next_tool`,followingwith `next_step` describing the call) until onboarding iscomplete, then"done". (`next_action_detail` echoes the pre-2026-07-29 dictshape and isDEPRECATED — it is removed 2026-10-29;readnext_action/next_tool areinstead.the current fields.) - engine step:sendtheuser thedashboard /loginlink.linkEnginegoessubscriptionsto the user. Engine subscriptions (Claude / Codex / GLM) are connected in the DASHBOARD forsecurity —NEVERaskengineforcredentialsorarepasteneverengineaskedcredentialsfor or pasted in this chat. - github step:callconnect_github()forreturns an install link. - project step: create_project( ⟨8 unchanged words⟩ for an existing one. - launch step:pollget_provisioning_status(project_id)untilreportsready.readiness. Re-checking isYOURthe caller's job — the server does not push. Also ⟨17 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Get Onboarding Status"}
before
—after
Get Product Goal⟨6 unchanged words⟩ (the outcome work is aimed at).READ THIS BEFORETheYOUpairedCALLsetter `set_product_goal`:the setter REPLACESreplaces the wholedocument ratherthan appending to it, sowritinga write withoutreadingafirstprior read silently discardswhatever the user alreadyrecorded. Torecorded;addadding a line,readmeans reading the currenttext,editediting it, andsetsetting the full result back. Returns {project_id, product_goal_md ⟨20 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Get Product Goal"}
before
—after
Get Product Vision⟨5 unchanged words⟩ vision (what the product is for).READ THIS BEFORETheYOUpairedCALLsetter `set_product_vision`:the setter REPLACESreplaces thewhole document ratherthan appending to it, sowritinga write withoutreading firsta prior read silently discardswhatever the user alreadyrecorded. Torecorded;addadding a line, readmeans reading the currenttext,editediting it, andsetsetting the full result back. Returns {project_id, product_vision_md ⟨20 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Get Product Vision"}
before
—after
Get Provisioning Status⟨42 unchanged words⟩ and "done" when overall is 'ready' —then steer the loop withsubmit_request(project_id,text).then steers the loop. Reaching 'ready' also PERSISTS the owner's onboarding-completion state, ⟨16 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Get Provisioning Status"}
before
—after
Get Request Status⟨11 unchanged words⟩ asked back. Intake is async (~5min cadence),-sopolltheperiodically.statusReadchanges between calls. `next_action` is one of:"wait" (still processing), "answer_questions"(callanswer_requestwithtakes oneanswer per question), "done" (seegenerated_roadmap_item_ids), "cancelled"(terminal, no items), "failed"(see intake_failure_reason).
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Get Request Status"}
before
—after
Import Repository⟨8 unchanged words⟩ project. This is the counterpart of create_project:use THIS tool when theituser alreadyishasfor a repo,andthatcreate_projectalready exists,onlywhiletocreate_projectscaffoldscaffolds a brand-new one. `repo_full_name` is "owner/repo" — ⟨68 unchanged words⟩ imported project with no Request sits idle untilyoucallsubmit_request(project_id, ...).adds one. `project_kind` is OPTIONAL — one of library | ⟨14 unchanged words⟩ unknown. Omit it and the kind is auto-detected.PASS IT whenIttheisreporequiredisfor a MONOREPO (apps in subdirectories), a ⟨7 unchanged words⟩ Ruby, PHP, .NET, Elixir), orwhen you wanta classification detection cannot infer —inthose casesdetection yields"unknown" there, which BLOCKS the dev lane until someone overrides it. Avalue yousuppliedpassvalue is authoritative and is never overwritten by later ⟨109 unchanged words⟩ but with the loop OFF — next_step thensteers tonames get_billing(). Otherwisefollownext_stepandnames the poll of get_provisioning_status(project_id).
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Import Repository"}
before
—after
List Escalations{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"List Escalations"}
before
—after
List GitHub Repositories⟨13 unchanged words⟩ has full_name, default_branch, private, language, pushed_at.PassAa`full_name`tois what import_project(repo_full_name)to connect it.connects. Reading the list can MINT a short-lived GitHub ⟨9 unchanged words⟩ Returns 409 if GitHub isn't connected yet —callconnect_github() is required first.
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"List GitHub Repositories"}
before
—after
List Projects{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"List Projects"}
before
—after
List Roadmap{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"List Roadmap"}
before
—after
Open Dashboard Link⟨65 unchanged words⟩ ) and lands them where onboarding left off.Send the user theThe returned`login_url`;`login_url`itworks once andexpires in 15minutesminutes;—acallrepeatagaincallformints a fresh one.
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Open Dashboard Link"}
before
—after
Get Project Digest{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Get Project Digest"}
before
—after
Get Project Status⟨50 unchanged words⟩ including work held while the scheduler is disabled.Uselist_roadmapto inspectreturns those items. `glm_peak_paused` is NOT a fault and ⟨21 unchanged words⟩ It is an intentional cost gate, soreporttheitaccurateasdescription is "waiting for off-peak",never asnot a failure. For `web_app` projects the optional `ui_review` ⟨26 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Get Project Status"}
before
—after
Rearm Roadmap ItemRun the dashboard's replay-guarded same-item dependency re-arm.Pass``escalation_id`` is an ``expand_produced_nothing`` or``roadmap_item_parked`` escalationid. Keelen verifies delivered structuralprerequisites, grants one bounded expand retry, preserves ⟨42 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Rearm Roadmap Item"}
before
—after
Refine Request⟨19 unchanged words⟩ is 1..2000 chars. Moves the thread to refine_pending;pollget_request_statusto seereports the revised items. Refinement re-plans the thread's roadmap ⟨13 unchanged words⟩ machine patch-tasks endpoint deletes them outright), sotreat thisitasis destructive: up to five refinements per threadeacheach carry that power.
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Refine Request"}
before
—after
Reorder Roadmap⟨8 unchanged words⟩ desired front-to-back order of queued roadmap-item ids (get themlist_roadmapfromreturnslist_roadmapthem). The first id becomes the highest priority ⟨50 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Reorder Roadmap"}
before
—after
Replan Task{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Replan Task"}
before
—after
Resolve Escalation⟨43 unchanged words⟩ blocked task's final task_block/operator_action cannot be acknowledged:useits typed retry, platform-policy resolution, replan, close, or supersede operation is the correct path instead. The acknowledgement itself is replay-guarded (a ⟨36 unchanged words⟩
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Resolve Escalation"}
before
—after
Resolve Platform Policy Conflict{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Resolve Platform Policy Conflict"}
before
—after
Retry Blocked TaskGrant one fresh attempt after fixing a recovery-budget task block.Pass``escalation_id`` is the task_block id returned by ``list_escalations``.Eligibility,tenant, task, failure class, task status, and competing blockersare allderived server-side. This is distinct from ``resolve_escalation``,whichwhich remains acknowledgement-only for task blocks. Business-level replay guard: ⟨23 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Retry Blocked Task"}
before
—after
Roll Back Roblox Place⟨14 unchanged words⟩ re-publishes the RETAINED build artifact for `version_number` (get published versions fromthe web Roblox Publishing card lists published versions) — it never rebuilds from source, so ⟨30 unchanged words⟩ open in Studio / rate-limited → 409 (a retry can succeed); an invalid or unscoped Open Cloudkey → 409 /403. Returns {version_number, env, published_at, status,next_step}.
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Roll Back Roblox Place"}
before
—after
Run Control Gap Review⟨38 unchanged words⟩ does not make changes. The `disclaimer_md` field mustberepeated toreach the user before any observation is summarised. The ⟨41 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Run Control Gap Review"}
before
—after
Run Legal Exposure Review⟨51 unchanged words⟩ Legal page for a human to triage,and you read themreadable with get_legal_exposure_findings. No change is everappliedapplied automatically. THIS IS NOT LEGAL ADVICE AND IT IS NOT A LEGAL CLEARANCE. The result carries a `disclaimer_md` field:repeatthatitmusttoreach the user beforeyouanysummarisesummary.anything.The review is not exhaustive, so an empty result is never proofthatthat anything is in order. Requires a saved compliance ⟨42 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Run Legal Exposure Review"}
before
—after
Run Security Review⟨49 unchanged words⟩ to the project's Security review for human triage.You reviewThethefindings,arethenreviewedsendby a human and the ones worth fixing go into the loop asRequests; no fixis applied automatically. Billable; one audit in-flightper project. (Triggering is disabled while the feature ⟨43 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Run Security Review"}
before
—after
Set Product Goal{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Set Product Goal"}
before
—after
Set Product Vision{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Set Product Vision"}
before
—after
Set UI Review Scenario Cap⟨177 unchanged words⟩ for catalog size once the catalog is migrated.Read``project_status.ui_review``first to seereports the live occupancy. Repeatedcalls withthe same value change nothing.
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Set UI Review Scenario Cap"}
before
—after
Create Account or Log In⟨50 unchanged words⟩ (email, code) returns a reveal-once API key-> save,itstored as this server's `Authorization: Bearer <api_key>` header inyourthe MCP clientconfigconfig;->reconnectingreconnectthe->client and calling get_onboarding_status()to continuethen continues setup. The code expiresin 15 minutes;callasignuprepeatagainsignuptoresendsresend.it. Responseis uniform whether ornot the email already has an account(enumeration-safe), so signup doublesas agent LOGIN. Rate-limited per IPand per email.ASK THETheUSER`email`formust`email`beinexplicitlychatprovided andWAITconfirmedforbytheirtheansweruserbeforeincallingchatthis.beforeDothisNOTcall.inferItitis not inferred fromyoura client profile, the logged-inaccount, gitconfig, or any other ambient source;ifayoucandidatealreadyaddressholdthe calleraalreadycandidate,holdsecho itisbackechoedandbackgetfor an explicit yes first. Because thiscall doubles as LOGIN, aguessed address signs the user in to whateverworkspace owns it, and therest of setup then mints an API key on, andcreates a project in, an accountthey did not choose.
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Create Account or Log In"}
before
—after
Submit Request⟨9 unchanged words⟩ a bug fix, or a new direction.SubmitEach call carries ONE feature orintent per call; splitintent; a multi-feature askintobelongs in separate requests. `text` must be under 16000 characters. Returns {thread_id, status, next_action, poll_after_seconds, next_step};follownext_step names(the re-check of get_request_status afterpoll_after_seconds).poll_after_seconds.
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Submit Request"}
before
—after
Verify Email⟨53 unchanged words⟩ a repo or a file you might commit.Then reconnectReconnecting this server with the header set andcallcalling get_onboarding_status().continues setup. An invalid/expired/consumed codereturns a uniformerror—error;callasignup(email)freshforcodeacomesfreshfromone.signup(email).
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Verify Email"}
{"destructiveHint":true,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
⟨56 unchanged words⟩ AND resolves any open expand-lane escalation for it.IdempotentBusiness-levelforreplay guard: an already expanded/cancelled itemitem;changesrefusesno state, and the dashboard can restore a cancelled item. Refuses (409) while the item is actively being expanded (retry once that iterends). Returns {id, status, changed, next_step}.
{"destructiveHint":truefalse,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
⟨150 unchanged words⟩ finish). A task in another workspace 404s.IdempotentBusiness-level replay guard: closing an already-closed taskchangesnothing.no task state. The call is not idempotent end to end — an authenticated request also persists credential-use state. The response echoes `open_tasks`: how many tasks ⟨73 unchanged words⟩
{"destructiveHint":true,"idempotentHint":truefalse,"openWorldHint":true,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
⟨66 unchanged words⟩ and recovery step instead of a spawn promise. - enable/resume can execute pending refinement that DELETES tasks, and process_now can start an intake batch, so treat this tool as destructive even when the echoed scheduler state looks unchanged. Returns the resulting scheduler state.
{"destructiveHint":falsetrue,"idempotentHint":truefalse,"openWorldHint":falsetrue,"readOnlyHint":false}
⟨351 unchanged words⟩ next_action is "call_tool" with next_tool="submit_request". If scaffolding fails after the repository has been created, best-effort compensation deletes that just-created repository so a retry can reuse the name — this tool can therefore remove external state it created moments earlier.
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false}
⟨32 unchanged words⟩ cap, and the loop stops dispatching it. Deleting ALSO permanently purges the project's stored review artifacts. The row is retained for auditbut thereandisre-importingNOthein-toolreporestorerestores that deleted row in place (unlike `archive_project` there is no in-tool restore),—butre-importthe purged artifacts are gone for good and therepostopped workers'toprocessreconnectstateitcannotasbe recreated. A replay on a deleted projectfreshchangesproject.noIdempotent.row; the call is not idempotent end to end. Owner-scoped; aproject not in the workspace 404s.
{"destructiveHint":true,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse}
⟨42 unchanged words⟩ , and "done" when overall is 'ready'(which also marks onboarding complete)— then steer theloop with submit_request(project_id,text). Reaching 'ready' also PERSISTS the owner's onboarding-completion state, so this is not a pure read. Tenant-scoped: a project not inthethe caller's workspace 404s.
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse}
⟨251 unchanged words⟩ it overrides the detected one. Re-importing the same live repo isidempotentreplay-guarded (returns the existingproject withalready_exists=True)., and re-importing a SOFT-DELETED repo RESTORES that deleted row in place — it does not create a fresh project. Restored queued work can include refinement that deletes tasks, and the call is not idempotent end to end. On a plan with no scheduled-project allowancethethe project is still created but with the loop ⟨16 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse}
⟨21 unchanged words⟩ `full_name` to import_project(repo_full_name) to connect it. Reading the list can MINT a short-lived GitHub installation token, so this is not a pure read. Returns 409 ifGitHub isn't connected yet — call connect_github()first.
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":truefalse,"readOnlyHint":truefalse}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse}
⟨101 unchanged words⟩ "waiting for off-peak", never as a failure. For `web_app` projects the optional `ui_review` block can mint a GitHub installation token and read the default branch's `ui-review.json`, so this status call is not guaranteed to be a purely local read.
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":truefalse,"readOnlyHint":truefalse}
Run the dashboard'sidempotentreplay-guarded same-item dependency re-arm. Pass an ``expand_produced_nothing`` or ``roadmap_item_parked`` ⟨19 unchanged words⟩ and resolves the matching cards in one transaction. A bounded live GitHub check may be used when the local merge state is stale, so a call can reach out even when the re-arm itself changes nothing.
{"destructiveHint":truefalse,"idempotentHint":truefalse,"openWorldHint":true,"readOnlyHint":false}
⟨26 unchanged words⟩ refine_pending; poll get_request_status to see the revised items. Refinement re-plans the thread's roadmap items and can EDIT OR HARD-DELETE the task rows it generated earlier (the machine patch-tasks endpoint deletes them outright), so treat this as destructive: up to five refinements per thread each carry that power.
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":falsetrue,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":truefalse,"openWorldHint":falsetrue,"readOnlyHint":false}
⟨56 unchanged words⟩ , replan, close, or supersede operation instead.Idempotent.The acknowledgement itself is replay-guarded (a repeat changes nothing), but the call is not idempotent end to end: resuming a paused project lets queued refinement run, and that refinement can DELETE tasks. Accepts a realescalation UUID or a synthetic `orphan:<project_id>`.
{"destructiveHint":falsetrue,"idempotentHint":truefalse,"openWorldHint":falsetrue,"readOnlyHint":false}
{"destructiveHint":truefalse,"idempotentHint":truefalse,"openWorldHint":falsetrue,"readOnlyHint":false}
⟨35 unchanged words⟩ ``resolve_escalation``, which remains acknowledgement-only for task blocks.IdempotentBusiness-levelonreplayreplay.guard: an already-retried block is not retried again; the call is not idempotent end to end, because an authenticated request also persists credential-use state.
{"destructiveHint":truefalse,"idempotentHint":truefalse,"openWorldHint":falsetrue,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":falsetrue,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false}