@anyforge/mcp-server 3.4.0 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +123 -14
  2. package/dist/index.js +122 -8
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -72,8 +72,77 @@ Use the equivalent stdio MCP config (`command: npx`, `args: ["tsx",
72
72
 
73
73
  ## Tools
74
74
 
75
+ Code Studio tools require `@anyforge/mcp-server` **3.8.0 or later** and a
76
+ deployed Studio API. For stdio clients use `npx -y @anyforge/mcp-server@^3.8.0`
77
+ after its npm release, then restart the client to refresh its tool catalogue.
78
+ Hosted HTTP follows the application deployment and does not depend on the
79
+ installed stdio package version.
80
+
81
+ Code Studio tools require explicit `studio:read`, `studio:write`,
82
+ `studio:execute`, or `studio:publish` scopes; ordinary and legacy keys do not
83
+ inherit them. Owners and operators can request these scopes, and editors can
84
+ request them only when their company owner enables developer Studio access.
85
+ External coding runs use audited coding, reads and reviews. Hosted commands and
86
+ orchestration require browser Studio; crew launches and PR ready/merge require
87
+ confirmation there. See the portable `references/code-studio.md` guide for the
88
+ complete capability and local/remote workspace boundary.
89
+
75
90
  | Tool | Scope | Description |
76
91
  |------|-------|-------------|
92
+ | `anyforge_branch_studio_session` | studio:write | Fork a session with explicit conversation/files/both scope. File scope also requires studio:execute and checkpoints; rewind requires exact workspace revisions. Does not undo external GitHub actions. For branch, reuse the same idempotencyKey when retrying; inspect incomplete preparation before retrying. |
93
+ | `anyforge_rewind_studio_session` | studio:write | Rewind a session with explicit conversation/files/both scope. File scope also requires studio:execute and checkpoints; rewind requires exact workspace revisions. Does not undo external GitHub actions. For branch, reuse the same idempotencyKey when retrying; inspect incomplete preparation before retrying. |
94
+ | `anyforge_update_studio_review_finding` | studio:write | Record a finding disposition with rationale and the revision containing a claimed fix. A fixed status does not imply independent verification; request a linked re-review to verify. |
95
+ | `anyforge_get_studio_pr_comments` | studio:read | Read paged inline PR review comments and reviewed file/line/commit provenance. |
96
+ | `anyforge_get_studio_pr_jobs` | studio:read | Read CI job identifiers for the exact PR head and a workflow run from its checks. Follow nextPage before claiming complete evidence. |
97
+ | `anyforge_get_studio_pr_logs` | studio:read | Read a bounded CI log page only for a job belonging to this exact PR head. Preserve nextOffset to continue. |
98
+ | `anyforge_request_studio_review` | studio:execute | Enqueue a durable, budgeted specialist review of an exact checkpoint, branch or PR. Returns a run ID; inspect its events and structured review artifacts. Reviewers cannot publish changes. |
99
+ | `anyforge_list_studio_crew_batches` | studio:read | Read the session crew batches and unexpired proposals, including aggregate progress and limits. |
100
+ | `anyforge_get_studio_crew_batch` | studio:read | Read one owned Studio crew batch. Active crews remain governed by their own gates. |
101
+ | `anyforge_preview_studio_crew_batch` | studio:write | Persist a proposal for existing/new work items, planned or expedited crews, dependencies and aggregate limits. Starts nothing. Also requires studio:publish because orchestration can reach external systems. Open Code Studio to confirm the returned proposal; API/MCP arguments cannot attest human confirmation. |
102
+ | `anyforge_cancel_studio_crew_batch` | studio:execute | Cancel queued starts; already active crews require separate stop actions. Also requires studio:publish. |
103
+ | `anyforge_retry_studio_crew_batch` | studio:execute | Create a new proposal for failed/cancelled work; open Code Studio to confirm execution. This action never starts crews. Also requires studio:publish. |
104
+ | `anyforge_list_studio_sessions` | studio:read | List your owned remote Code Studio sessions and their active/latest run IDs. |
105
+ | `anyforge_create_studio_session` | studio:write | Prepare a direct coding session or attach it to an existing initiative. Does not start execution. Context is a reference; local edits are not uploaded to the remote checkout. additionalRepos needs an explicit repoFullName. |
106
+ | `anyforge_get_studio_usage` | studio:read | Read the owned session recorded billing subtotal from the newest 200 rows, grouped by model/product/run/leg. Preserve `truncated`, `coverage` and `pending`; historical coverage may be incomplete or unavailable, so this is not a complete session bill. Provider cost and platform fee remain separate fields. |
107
+ | `anyforge_get_studio_session` | studio:read | Read one owned Studio session and its reconnect IDs. |
108
+ | `anyforge_update_studio_session` | studio:write | Update a session title, repository, branch, additional repositories or initiative. Does not execute code. additionalRepos replaces the whole list; null or [] clears it. |
109
+ | `anyforge_get_studio_context` | studio:read | Inspect effective context provenance, instructions, skills, graph/document snapshots and MCP availability. Does not expose credentials. |
110
+ | `anyforge_add_studio_context` | studio:write | Attach a bounded context snapshot to a prepared prompt. No code execution; explicitly identify local versus remote provenance. |
111
+ | `anyforge_list_studio_runs` | studio:read | List durable runs for your session. |
112
+ | `anyforge_start_studio_run` | studio:execute | Start a durable coding run in the remote workspace. Can spend tokens and edit files. External runs are limited to audited coding, reads and reviews; hosted shell, browser, outbound connectors, Oracle and crew/workflow/approval actions require the browser Studio surface. Use planned=true for analysis only. Dedicated Git push and draft PR tools need studio:publish; ready/merge require confirmation in Code Studio. |
113
+ | `anyforge_get_studio_run` | studio:read | Read run status, usage and any pending user question. |
114
+ | `anyforge_get_studio_run_events` | studio:read | Read ordered durable run events after a sequence cursor. Persist nextCursor to reconnect without replaying earlier events. |
115
+ | `anyforge_control_studio_run` | studio:execute | Pause, cancel, resume, steer or answer a pending question. Answer requires its current questionId. Resuming may execute code and spend tokens. |
116
+ | `anyforge_get_studio_changes` | studio:read | Read remote workspace revision, Git state and changes. Does not create a workspace or install dependencies. |
117
+ | `anyforge_list_studio_artifacts` | studio:read | Read checkpoint and structured reviewer artifacts for this session. |
118
+ | `anyforge_get_studio_review` | studio:read | Read structured reviewer findings, dispositions and review target provenance. |
119
+ | `anyforge_create_studio_checkpoint` | studio:execute | Capture remote workspace files, including staged and untracked changes, as a persistent checkpoint. |
120
+ | `anyforge_get_studio_checkpoint` | studio:read | Read checkpoint metadata and exact revision. |
121
+ | `anyforge_diff_studio_checkpoint` | studio:read | Read the remote workspace diff for a saved checkpoint. |
122
+ | `anyforge_read_studio_checkpoint_file` | studio:read | Read a bounded file window from a persistent checkpoint. |
123
+ | `anyforge_restore_studio_checkpoint` | studio:execute | Restore a checkpoint into the remote workspace after comparing its current revision. Saves a safety checkpoint first; does not rewind external GitHub actions. |
124
+ | `anyforge_stage_studio_files` | studio:execute | Stage explicitly selected remote files after checking the current revision. |
125
+ | `anyforge_commit_studio_files` | studio:execute | Commit reviewed remote changes. Read changes and confirm file scope before committing; does not push. |
126
+ | `anyforge_push_studio_branch` | studio:publish | Publish the exact remote Git HEAD to its branch. Rejects changed HEAD and default-branch pushes. |
127
+ | `anyforge_get_studio_pull_request` | studio:read | Read a session repository pull request, checks, review decision and merge blockers. |
128
+ | `anyforge_create_studio_pull_request` | studio:publish | Create or reuse a draft PR for the persisted session branch after checking its exact pushed HEAD. Uses your connected GitHub identity. Does not mark ready or merge. |
129
+ | `anyforge_update_studio_pull_request` | studio:publish | Update metadata or mark a session branch PR as draft using its exact expectedHeadSha. Open Code Studio to review and confirm ready/merge; tool arguments cannot authorize those actions. |
130
+ | `anyforge_search_studio_sessions` | studio:read | Search your own Studio sessions by title, repository, branch or folder, newest first. Set conversations=true (q of 2+ characters) to also search message text, five sessions per page. Follow nextCursor; conversationsLimited means a session had more messages than were searched. |
131
+ | `anyforge_archive_studio_sessions` | studio:write | Archive all of your own unarchived Studio sessions (CI auto-fix monitors excluded). Transcripts are kept and each session can be unarchived with update_studio_session. Call again while remaining is true. |
132
+ | `anyforge_list_studio_decisions` | studio:read | List your Studio runs waiting on you: each owned session whose current run asked a question, with the question and its options. Answer with control_studio_run. |
133
+ | `anyforge_list_studio_models` | studio:read | List the models your company and personal credentials can run, grouped by provider, for the model argument of start_studio_run. A provider with ok=false is not configured or not reachable. Cached for 30 minutes unless refresh=true. |
134
+ | `anyforge_get_studio_quota` | studio:read | Read the remaining quota of the Anthropic subscription Studio runs on for you. oauth=false means runs use an API key, which has no subscription window. |
135
+ | `anyforge_get_studio_conversation` | studio:read | Read an owned session's conversation, oldest first: your messages, the agent's replies and, with includeTools=true, each round's tool calls and results. Long text is clipped and flagged truncated. A page can hold fewer than limit messages; follow nextCursor until it is null. |
136
+ | `anyforge_list_studio_tasks` | studio:read | Read the session's task list (the agent's to-do items), newest change first. |
137
+ | `anyforge_compact_studio_session` | studio:execute | Compact the session's stored history: older messages are replaced by one summary so the next run starts lean. Deletes the summarized messages and cannot be undone. Spends a small model call on your credential. Refused while a run is active. |
138
+ | `anyforge_list_studio_verifications` | studio:read | Read the session's verification reports (newest 20): diagnostics, tests, lint, typecheck, build and acceptance checks with their evidence and the exact source they ran against. Running a new verification requires the browser Studio surface. |
139
+ | `anyforge_get_studio_environment` | studio:read | Inspect the existing remote checkout's environment readiness: detected toolchain, dependencies and setup scripts. Never clones, installs or loads secrets; preparing the environment requires the browser Studio surface. |
140
+ | `anyforge_list_studio_outcomes` | studio:read | Read the accepted, needs-rework and abandoned outcomes recorded for the session's runs, with the verification each was bound to. Pass runId for one run's outcome history. Outcomes are recorded by a person in Code Studio. |
141
+ | `anyforge_list_studio_workspace_files` | studio:read | List a directory of the live remote workspace (omit path for the root). Never creates a checkout: a session without one returns workspace_missing. |
142
+ | `anyforge_read_studio_workspace_file` | studio:read | Read a line window of a file in the live remote workspace, including unsaved agent edits. offset is the first line (default 1), limit the line count (default 500, maximum 2000). Never creates a checkout. |
143
+ | `anyforge_inspect_studio_code` | studio:read | Run a language-service query on a live workspace file: diagnostics (default), definition, references, hover, completions, or rename (a preview of the edits; apply with rename_studio_symbol). line and column are 1-based. Pass revision to refuse a changed workspace. |
144
+ | `anyforge_write_studio_workspace_file` | studio:execute | Create an empty file or save a file's complete content in the live remote workspace, without a model run. Name the repository, branch and revision you read, so a changed workspace is refused. Each write saves a checkpoint first. Does not commit or push. |
145
+ | `anyforge_rename_studio_symbol` | studio:execute | Apply a language-service rename of the symbol at a 1-based line and column across the live remote workspace. Preview it first with inspect_studio_code operation=rename. Name the repository, branch and revision you read; a changed workspace is refused. Does not commit. |
77
146
  | `anyforge_list_pending_approvals` | read | List HIL approvals awaiting a decision |
78
147
  | `anyforge_get_approval_detail` | read | Read one approval's plan / ADR / security context |
79
148
  | `anyforge_submit_approval` | approve | Approve or reject a HIL (resumes the crew) |
@@ -86,12 +155,15 @@ Use the equivalent stdio MCP config (`command: npx`, `args: ["tsx",
86
155
  | `anyforge_restore_program_intake_version` | write | Republish an earlier intake definition version as a new version |
87
156
  | `anyforge_get_intake_request_details` | read | Read one program intake request's answers against its program's intake definition: each field's state, answer, who gave it, and whether it can be edited |
88
157
  | `anyforge_edit_intake_request_details` | write | Set, confirm or clear a program intake request's answers by hand (validated against the definition; audited; no re-approval, no follower notice) |
89
- | `anyforge_update_program` | write | Update a program's name / status / owner / target date / coverage goal / tags |
158
+ | `anyforge_update_program` | write | Update a program's name / status / owner / lead / long-lived flag / target date / coverage goal / tags |
159
+ | `anyforge_set_program_request_intake` | write | Turn a program's incoming requests on (creates its Incoming Requests initiative) or off |
90
160
  | `anyforge_delete_program` | write | Delete a program; `deleteChildren: true` also deletes child initiatives + work items (else they're detached) |
91
161
  | `anyforge_set_program_milestones` | write | Set a program's milestones/waves and the initiatives assigned to each (whole-array replace; an initiative sits in at most one wave) |
92
162
  | `anyforge_get_program_rollup` | read | Read a program's rolled-up progress, initiative/work-item counts, token budget/spend, and risks — the console program header numbers |
93
163
  | `anyforge_architect_program` | write | Run program-level architecture planning: decompose every still-DRAFT initiative in the program at once |
94
164
  | `anyforge_approve_program_architecture` | approve | Approve the program's rolled-up solution architecture — one review approves every proposed initiative backlog (HIL #1 each) |
165
+ | `anyforge_list_program_comments` | read | List a program brief's Discussion comments — the same threaded comments the console shows; shared-report comments are marked external with the author's name only |
166
+ | `anyforge_post_program_comment` | write | Post a Discussion comment on a program brief (default `overview` section, or pass `section`; reply with `parentId`), into the thread the console renders; always stored private to the team |
95
167
  | `anyforge_update_program_initiative` | write | Enrich one existing program initiative and return changed fields or a structured no-op |
96
168
  | `anyforge_close_program_initiative` | write | Preview then close one program initiative with a supported close reason |
97
169
  | `anyforge_close_program_work_items_as_fixed` | write | Preview then batch-close non-terminal program work items fixed outside AnyForge |
@@ -99,7 +171,7 @@ Use the equivalent stdio MCP config (`command: npx`, `args: ["tsx",
99
171
  | `anyforge_get_initiative` | read | Initiative + crew and work-item rows + burn-down; long text is excerpted unless `shape: "full"` |
100
172
  | `anyforge_get_initiative_spec` | read | Read the active ICE spec, its readiness, what backlog approval will decide (`approvalGate`), and any submission awaiting human review |
101
173
  | `anyforge_propose_initiative_spec` | write | Submit an ICE spec for human review; it becomes active only when a person reviews and publishes it in the Console |
102
- | `anyforge_update_initiative` | write | Update a (non-system) initiative — only the fields you pass change |
174
+ | `anyforge_update_initiative` | write | Update a (non-system) initiative — only the fields you pass change, including its owning team (`teamId`); an argument the tool does not declare is refused and nothing is changed |
103
175
  | `anyforge_delete_initiative` | write | Delete a DRAFT initiative (archive via update once it's past DRAFT) |
104
176
  | `anyforge_list_initiative_comments` | read | List an initiative's Discussion comments — the same threaded comments the console shows |
105
177
  | `anyforge_post_initiative_comment` | write | Post a Discussion comment on an initiative (reply with `parentId`), into the thread the console renders |
@@ -136,10 +208,10 @@ Use the equivalent stdio MCP config (`command: npx`, `args: ["tsx",
136
208
  | `anyforge_get_cluster_charter` | read | Read one theme's charter and outstanding lines |
137
209
  | `anyforge_approve_backlog` | approve | Approve a proposed backlog (HIL #1), optionally deferring chosen items (`deferItemIds`, `deferReason`) |
138
210
  | `anyforge_approve_task_proposal` | approve | Approve a mid-flight task proposal |
139
- | `anyforge_list_work_items` | read | List backlog items + crew state. Use `itemId` for a full work-item id or queue code, `search` for partial code/title matches, and `includeArchived: true` to include archived items. Also supports status, owner, assignee, program, initiative, priority and type filters. Returns ONE PAGE (50 default, 200 max) — continue with `nextCursor`. Unknown arguments are rejected; the page echoes `appliedFilters` |
140
- | `anyforge_get_work_item` | read | Get one work item by its returned id |
211
+ | `anyforge_list_work_items` | read | List backlog items + crew state. Use `itemId` for a full work-item id or queue code, `search` for partial code/title matches, and `includeArchived: true` to include archived items. Also supports status, owner, assignee, program, initiative, team (a team slug, including the teams beneath it), priority and type filters. Returns ONE PAGE (50 default, 200 max) — continue with `nextCursor`. Unknown arguments are rejected; the page echoes `appliedFilters` |
212
+ | `anyforge_get_work_item` | read | Get one work item by its returned id, with `assigneeName`, `blockerOwnerName` and `createdByName` beside the uids (null when nobody visible is named; list items carry them too) |
141
213
  | `anyforge_create_work_item` | write | Create a work item with routing, migration, incident, intake, estimate, and evidence fields |
142
- | `anyforge_update_work_item` | write | Edit, assign, begin, expedite, dispatch, confirm, drop (with optional `droppedReason`), archive, close, or reopen a work item |
214
+ | `anyforge_update_work_item` | write | Edit, assign, begin, expedite, dispatch, confirm, drop (with optional `droppedReason`), archive, close, or reopen a work item. Each action takes only its own fields: one it does not read is refused (`unsupported_fields`) and nothing is changed. There is no `status` argument |
143
215
  | `anyforge_retry_work_item` | write | Terminate a work item's crew and dispatch a fresh one on the same branch; recovers missing/phantom crew records from work-item + initiative defaults |
144
216
  | `anyforge_list_work_item_comments` | read | List the work item's discussion thread, separate from crew transcripts; every comment carries a boolean `clientVisible` |
145
217
  | `anyforge_post_work_item_comment` | write | Add a discussion comment to a work item; internal unless `clientVisible: true` shares it with the client as it is written |
@@ -148,11 +220,15 @@ Use the equivalent stdio MCP config (`command: npx`, `args: ["tsx",
148
220
  | `anyforge_merge_work_items` | write | Replace multiple unstarted work items with one merged item |
149
221
  | `anyforge_list_crews` | read | Discover crews by status, active state, and limit |
150
222
  | `anyforge_get_crew` | read | Crew state + recent outputs + comments |
151
- | `anyforge_post_crew_comment` | write | Comment on / @-mention people on a crew (the crew does not read comments; use `anyforge_amend_crew` to redirect it) |
223
+ | `anyforge_post_crew_comment` | write | Comment on / @-mention people on a crew (the crew does not read comments; use `anyforge_message_crew` to steer a running crew, `anyforge_amend_crew` for one at a gate) |
224
+ | `anyforge_message_crew` | approve | Message a running crew's Engineer ("skip X", "check Z first"). It reads the message before its next step and confirms in the crew chat; a crew not yet started or stopped inside the Engineer reads it on its first step or on resume. Refused with `crew_not_reading_messages` at a gate, in review or when finished. Optional `idempotencyKey` makes a retry safe |
152
225
  | `anyforge_resume_crew` | approve | Resume a PAUSED/HALTED crew |
153
226
  | `anyforge_halt_crew` | approve | Halt a crew |
154
227
  | `anyforge_amend_crew` | approve | Continue & finish — send a crew at its HIL gate back to the engineer with guidance. Optional `postToPullRequest` also posts the notes on the pull request; left out, the organization setting decides (off by default) |
155
- | `anyforge_create_program` | write | Create a program (cross-initiative grouping) |
228
+ | `anyforge_fix_crew_ci` | approve | Fix CI: send a crew whose pull request has failing checks back to the Engineer to fix them on the same PR. Works from PR review (HIL_SHIP) or a HALTED/PAUSED crew that has a PR; refused when GitHub does not report CI as failing. Requires `approve` scope and spends crew tokens. Only call when the operator asks. |
229
+ | `anyforge_resume_crew_with_pr` | approve | Review & approve: take a HALTED or PAUSED crew's already-open pull request through the specialist reviews to the approve & merge gate, without re-running the Engineer. Omit prUrl to use the PR stored on the crew. A merged PR is refused. Requires `approve` scope. |
230
+ | `anyforge_decide_crew_permission` | approve | Approve or deny the permission a crew in PERMISSION_PENDING is waiting on (see pendingPermissionRequest on anyforge_get_crew). A tool permission applies for the rest of the run; an MCP write approval decides that one call. Pass approvalId to refuse a decision on a newer request. Requires `approve` scope. Only call when the operator decides. |
231
+ | `anyforge_create_program` | write | Create a program (cross-initiative grouping), optionally with a lead and as long-lived |
156
232
  | `anyforge_create_initiative` | write | Create a (DRAFT) initiative, optionally under a program |
157
233
  | `anyforge_dispatch_architect` | write | Decompose an initiative into a backlog (→ HIL #1) |
158
234
  | `anyforge_list_repo_index` | read | List the org repo index (activity, coverage, analyzed) — discover codebases to scope |
@@ -178,10 +254,37 @@ Use the equivalent stdio MCP config (`command: npx`, `args: ["tsx",
178
254
  | `anyforge_run_workflow` | write | Dispatch a run of a workflow (returns the QUEUED run); runs pause at gate steps for an operator decision |
179
255
  | `anyforge_get_workflow_run` | read | Get a workflow run's status and per-step progress; gate decisions are made on the Console run page |
180
256
  | `anyforge_resolve_workflow_gate` | approve | Resolve a run paused at a gate (`approve` / `amend` / `reject`; `amend` carries guidance in `comment`) |
257
+ | `anyforge_retry_workflow_run` | write | Retry a `FAILED` run from the step that failed: finished steps and a map's answered items are kept, spend keeps accumulating; refused for a failed crew step. Runs on the company key |
181
258
  | `anyforge_list_observability_signals` | read | List production-error triage signals (filter by `status`) |
182
259
  | `anyforge_accept_observability_signal` | write | Accept a signal into a governed incident under the KTLO program |
183
260
  | `anyforge_dismiss_observability_signal` | write | Dismiss a production-error signal as noise |
184
261
  | `anyforge_list_audit_events` | audit:read | Read one page of the hash-chained audit trail, oldest first, with each entry's `sequence`, `hash` and `prevHash` (filter by `eventType`, `actor`, `from`, `to`; page with `cursor`). Needs a key minted with the explicit `audit:read` scope by an owner |
262
+ | `anyforge_list_members` | read | List the workspace's approved members with uid, name, email, role and whether they can be assigned work. Assignment takes the uid, not an email; `q` finds a person by name or email |
263
+ | `anyforge_invite_person` | people:invite | Invite one person, or refresh their pending invitation: `role` is operator, editor, viewer or filer (never owner), `email` on a verified company domain, optional `teamIds` and `notify`. Needs an owner's key with the `people:invite` scope |
264
+ | `anyforge_list_people_invitations` | people:invite | List the invitations a `people:invite` key could have written, pending and accepted |
265
+ | `anyforge_withdraw_person_invitation` | people:invite | Withdraw a pending invitation by email address (an accepted or owner invitation cannot be withdrawn this way) |
266
+ | `anyforge_list_page_spaces` | read | List the Pages spaces you can read, with each space's key and what you may do there |
267
+ | `anyforge_list_pages` | read | Browse a space by id, with its settings/revision and paginated page metadata; follow `nextCursor` while `hasMore` is true |
268
+ | `anyforge_create_page_space` | write | Create a space as a workspace Owner |
269
+ | `anyforge_update_page_space` | write | Change settings, access, main page or archive state as a space admin; requires `ifRevision` |
270
+ | `anyforge_list_page_versions` | read | Paginated history metadata; readers see only published history |
271
+ | `anyforge_restore_page_version` | write | Restore an older version as a new save; requires current `ifVersion` and keeps history |
272
+ | `anyforge_set_page_publishing` | write | Set live or publish-to-update mode and replace reviewers as the page owner or space admin |
273
+ | `anyforge_publish_page` | write | Publish, request publication, or approve a pending request as a named reviewer |
274
+ | `anyforge_search_pages` | read | Search the pages you can read (by meaning, or by title); each match has its page id, space, section and snippet |
275
+ | `anyforge_get_page` | read | Read one page: title, space, version, owner and markdown body (`version` for an older one) |
276
+ | `anyforge_create_page` | write | Create a page in a space you can edit (`space` key, `title`, optional `content` and `parentId`), owned by you |
277
+ | `anyforge_update_page` | write | Save a new version (title and/or body, optional change note); `ifVersion` is the version you read, and a page saved since is refused with 409 |
278
+ | `anyforge_move_page` | write | Move a page under another page, to the top level, or to a position among its siblings |
279
+ | `anyforge_archive_page` | write | Archive a page (kept with its history, hidden from the tree and search), or restore it |
280
+ | `anyforge_propose_page_edit` | write | Propose find/replace edits as suggestions an editor accepts or rejects in the page; nothing changes until they do (live pages only) |
281
+ | `anyforge_list_reports` | read | List the Insights reports, most recently edited first: id, title, description, widget count, updatedAt and Console `url`; one page at a time (follow `meta.nextCursor`) |
282
+ | `anyforge_get_report` | read | Read one report: settings (`datesShown`, `trendDays`, `textSize`), whether a share link is live, and every widget definition with its query |
283
+ | `anyforge_create_report` | write | Create an empty report (`title`, optional `description` and `datesShown`), owned by you; needs a role that edits reports |
284
+ | `anyforge_update_report` | write | Change the title, description or settings, and edit widgets by id (`addWidgets`, `replaceWidgets`, `removeWidgetIds`) or replace the whole list (`widgets`). Every widget is validated as a Console save is; a refusal saves nothing |
285
+ | `anyforge_preview_report_query` | read | Run one report query against live data without saving anything: total, rows and a text summary (program, strategy and cycles snapshots included); needs a role that edits reports |
286
+ | `anyforge_describe_report_catalog` | read | The report data catalog: sources, measures, group-bys, filter fields and widget types; needs a role that edits reports |
287
+ | `anyforge_list_report_filter_values` | read | The values a query filter field may take: an enum's closed set, or real ids with names (`query` looks one up by name); needs a role that edits reports |
185
288
  | `anyforge_triage_ticket` | read | Run or continue a Support Triage interview — classification, readiness scoring, owning-team routing — and get a paste-ready rendering plus the structured draft; pass the same `sessionId` to continue an interview. Never files anything itself |
186
289
  | `anyforge_list_triage_eval_cases` | read | List permitted triage eval cases; historical cases require Owner/Operator |
187
290
  | `anyforge_upsert_triage_eval_cases` | write | Create or update triage eval cases in bulk; pass an existing case's `id` to update it in place |
@@ -216,7 +319,10 @@ for a key with no user, to an API key. `share-evidence` with `evidenceId` and
216
319
  `clientVisible` shows or hides a reviewed entry on client reports and requires
217
320
  a user-bound key. `remove-evidence` with `evidenceId`
218
321
  removes one entry, for its author or an owner. `anyforge_get_work_item` returns
219
- the entries as `testEvidence`.
322
+ the entries as `testEvidence`. A program can require one entry before its items
323
+ are marked done: set `testEvidenceRequired` with `anyforge_update_program`.
324
+ While it is on, `complete` on an item with no entry answers 409
325
+ `test_evidence_required`; `close-as-fixed` is not held by it.
220
326
 
221
327
  Comment audience uses the same `clientVisible` vocabulary as test evidence.
222
328
  `anyforge_list_work_item_comments` returns a boolean `clientVisible` on every
@@ -248,7 +354,7 @@ Every tool advertises 2025-06-18 MCP metadata so clients can present it well:
248
354
 
249
355
  - **Title + behaviour annotations** — a human-readable `title` plus hints
250
356
  (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`) derived
251
- from the tool's verb, matching the read/write/approve column above. Clients use
357
+ from the tool's verb, matching the explicit policies and Scope column above. Clients use
252
358
  these to, e.g., auto-run read-only tools and confirm before a `delete_*`. They
253
359
  are advisory only: the control API still re-checks the key's scopes on every
254
360
  call, so annotations never widen access.
@@ -310,6 +416,7 @@ current state still come from the authenticated server and live tool results.
310
416
  - "What's waiting for my approval in AnyForge?" → `anyforge_list_pending_approvals`
311
417
  - "Show me the plan for approval `abc123` then approve it." → `anyforge_get_approval_detail` → `anyforge_submit_approval`
312
418
  - "Add a P1 bug: rate-limit the export endpoint." → `anyforge_create_work_item`
419
+ - "Crew `xyz` is running: tell it not to touch the migration files." → `anyforge_message_crew`
313
420
  - "What did crew `xyz` produce? Tag Sam on it to review the tests." → `anyforge_get_crew` → `anyforge_post_crew_comment`
314
421
  - "Scope a coverage program across our Go services." → run the `genesis` prompt → it lists repos, scopes, and creates an initiative per service.
315
422
 
@@ -358,15 +465,17 @@ npm pack --dry-run # verify the tarball: dist/ + README + package.json only
358
465
 
359
466
  Publishing is automated. **Push a `mcp-server-v<version>` tag** and the
360
467
  `.github/workflows/publish-mcp-server.yml` workflow builds and runs
361
- `npm publish` (scoped public). Keep the tag version in sync with
468
+ `npm publish` (scoped public), after a locked install, type check, build and
469
+ tarball inspection. Re-running a tag whose version is already on npm skips
470
+ publication. Keep the tag version in sync with
362
471
  `package.json`:
363
472
 
364
473
  ```bash
365
474
  cd packages/control/mcp-server
366
- npm version patch # bumps package.json, e.g. 2.0.0 → 2.0.1
367
- git commit -am "chore(mcp): release mcp-server vX.Y.Z" # if not committed by npm version
368
- git tag mcp-server-v$(node -p "require('./package.json').version")
369
- git push origin main --tags
475
+ npm version minor --no-git-tag-version # update package.json and package-lock.json
476
+ # Commit and merge the reviewed version change before tagging that merge:
477
+ git tag mcp-server-vX.Y.Z <reviewed-merge-sha>
478
+ git push origin refs/tags/mcp-server-vX.Y.Z
370
479
  ```
371
480
 
372
481
  > The workflow needs an `NPM_TOKEN` repo secret (an npm **automation**