AnyForge
NPM · @ANYFORGE/MCP-SERVER · 2 COMPONENTS
Approve plans, track initiatives and work items, and steer AI engineering crews in AnyForge.
Available components
Last scanned (9 hours ago)
Scores higher than 33% of npm servers
Category Project Management
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 30 of 92 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency6
- Repository check failed: no source repository is declared. See how to fix → View diagnostics → Fail
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: the license (UNLICENSED) isn't a recognized OSI-approved license. See how to fix → Fail
- Actively maintained (last published 0 days ago).Pass
- Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 42263 tokens (~180/item across 234 items; 229 tools + 5 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management26
- Stability check failed: the tool surface changed between 3.14.4 and 3.16.0: 0 tool removals, 1 breaking changes, 10 additions. See how to fix → Fail
Tool Coverage93
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 76% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety97
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 17 of 19 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "anyforge_get_triage_eval_run" implies "eval" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
- An AI judge read all 231 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 4 Nov 26 +1
- Malware scan: unverified → pass ▲ security
- Package version: 3.15.1 → 3.16.0 functional
- 3 Nov 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 3.15.0 → 3.15.1 functional
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 13 to 16.
- 1 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 31 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Stability: 0.07 → fail ▼ security
- Package version: 3.14.5 → 3.15.0 functional
- 30 Oct 26 +16
- Malware scan: unverified → pass ▲ security
- 29 Oct 26 −4
- Malware scan: pass → unverified ▼ security
- Known CVEs: unverified → pass ▲ security
- Dependency health: unverified → 0.85 ▲ functional
- Package version: 3.14.4 → 3.14.5 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/@anyforge/mcp-server@3.16.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 92 packages
| Packages resolved | 92 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
anyforge_start_coverage_sweep Start coverage sweep ~150
Launch a hands-off, paced analysis sweep: runs Phase 1 across every repo, then Phase 2, keeping at most `concurrency` analyses in flight so the operator OAuth token window is never exhausted. Seed from a programId (derives repos from its initiatives) or an explicit repos list. Re-seeding overwrites the current sweep. Requires `write` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| concurrency | number | – | Max in-flight analyses per phase (default 5, 1–10). |
| programId | string | – | Derive the repo set from this program’s initiatives. |
| repos | array | – | Explicit repo full names ("owner/name"). Used when programId is omitted. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_start_escrow_sweep Start escrow sweep ~220
Seed a fleet-wide escrow deposit sweep over all escrow-scoped codebases (codebase escrow.enabled). Requires `write` scope. A 10-minute server tick advances it at ≤concurrency deposits in flight. Options: onlyStale (default true — skip fresh deposits), clientTag (one beneficiary only), concurrency (1–5), verifyBuilds (also measure a build+test run per codebase alongside the deposit). Pass {status: true} to just read current sweep progress without seeding.
| Name | Type | Req | Description |
|---|---|---|---|
| clientTag | string | – | Limit to codebases tagged for this client/beneficiary. |
| concurrency | number | – | 1–5 deposits in flight (default 3). |
| onlyStale | boolean | – | Default true — only codebases whose deposit is stale. |
| status | boolean | – | true = return current sweep progress, seed nothing. |
| verifyBuilds | boolean | – | Also run a measured build+test verification per codebase (records buildEvidence: duration, toolchains, machine spec). |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_start_file_upload Start file upload ~434
Start a DIRECT UPLOAD of one file (up to 1 GB) to a work item, initiative or program. Returns `uploadUrl`, a one-time Storage URL that accepts exactly `size` bytes for 24 hours, and a `curl` command that sends them. After the PUT succeeds, call anyforge_complete_file_upload with the `uploadId`; the file is not attached until then. Accepted: images, video, PDF, Office documents, text, Markdown, CSV, JSON, XML, HTML pages, logs, HAR captures and zip; the extension decides the type. On a work item the file is added INTERNAL. When a file with the same name and size is already on the record, the answer is { alreadyAttached: true, file } and there is nothing to upload; a same-name file of another size is refused (file_name_exists, 409) unless onNameConflict is "keep_both". Requires `write` scope and an Editor or above. On the local (stdio) server, anyforge_upload_local_file does all three steps for a file on disk.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The work item, initiative or program id. |
| mediaType | string | – | Optional MIME type; the extension wins when they disagree. |
| name | string | yes | File name with its extension, e.g. "repro.mp4". |
| onNameConflict | string | – | A same-name file of a different size already on the record: refuse it (default, file_name_exists) or attach both. A same-name, same-size file is never attached twice. |
| originalCreatedAt | string | – | Optional. When the file was created in the tool it came from: an ISO 8601 date or a date and time with a zone, e.g. 2024-03-01T10:22:33.000+0000. Kept beside the upload time. |
| size | integer | yes | Exact size in bytes. The upload URL accepts exactly this many. |
| target | string | yes | The kind of record the file is attached to. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_start_studio_run Start studio run ~212
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.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | – |
| idempotencyKey | string | yes | Stable unique request key. Reuse only when retrying exactly this request. |
| images | array | – | Screenshots for the agent to read: at most five PNG, JPEG, GIF or WebP images, 5 MB each. |
| maxLegs | integer | – | – |
| maxRounds | integer | – | – |
| maxTotalTokens | integer | – | – |
| model | string | – | – |
| planned | boolean | – | – |
| sessionId | string | yes | Owned Code Studio session ID. |
| verbosity | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_submit_approval Submit approval ~112
Submit a decision on a HIL approval. APPROVED resumes the crew past the gate; REJECTED sends it back. Requires a key with the `approve` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| approvalId | string | yes | The HIL approval id. |
| decision | string | yes | 'APPROVED' or 'REJECTED'. |
| notes | string | – | Reviewer notes (shown in the audit trail). Required to reject an initiative plan: the plan goes back to the Architect with these notes as its instructions. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_triage_ticket Triage ticket ~319
Run or continue a Support Triage interview: classify the issue (incident / bug / enhancement / misconfiguration / new_feature), score it against that type's readiness rubric, resolve the likely owning team from the code graph, and return a paste-ready rendering plus the structured draft. Pass the SAME sessionId returned by a prior call to continue the SAME interview — the server owns the conversation, the caller only ever sends the newest message. Never files or writes anything; take `rendered` and file it wherever you actually track issues.
| Name | Type | Req | Description |
|---|---|---|---|
| context | string | – | Optional background for the agent — an incident channel, a related ticket id, prior investigation notes. |
| externalUserRef | string | – | An opaque, stable reference for the END CUSTOMER this interview is for — your own id for them, never anything they supply. Keeps two of your customers' conversations in separate sessions even though… |
| format | string | – | Rendering format for the paste-ready output. Defaults to markdown. Use adf for pasting into Jira Cloud. |
| repos | array | – | Repo full names (owner/name) known to be relevant, if any — improves ownership routing. |
| sessionId | string | – | The sessionId from a PRIOR call, to continue the same interview. Omit to start a new one. |
| text | string | yes | The newest message in the interview — the initial problem description, or the answer to the agent's last follow-up question. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_initiative Update initiative ~1,029
Update an existing initiative — only the fields you provide change. Use to rename, re-prioritise, retarget, adjust the token budget, move it under a program, set its owning team (teamId), record the team's own estimate (estimate), or set its repositories (defaultGithubRepo, additionalGithubRepos) and branch. An argument this tool does not declare is refused with the valid names and nothing is changed, so a success means every field you passed was applied. Requires `write` scope. (System-managed initiatives are read-only and reject edits.)
| Name | Type | Req | Description |
|---|---|---|---|
| additionalGithubRepos | array | – | Further repositories ("owner/name") this initiative's work items may modify, beside defaultGithubRepo — so an item can set targetGithubRepo to one of them. Replaces the list; [] clears it. Removing a… |
| assignedOperatorId | string | – | New operator (DRI) — a member uid or their email (anyforge_list_members lists both). Must be an approved editor-or-above member. Can be changed after the initiative is COMPLETE, without reopening it. |
| autoDispatchOnApproval | boolean | – | Start a crew on each READY work item as soon as the backlog is approved, instead of dispatching each by hand. |
| autoMergeOnApproval | boolean | – | Default for "Auto-merge PR on GitHub after approval" on this initiative's ship gates. Approving a gate still decides; this only pre-sets the choice. Overrides the program and company default. |
| brdContent | string | – | Business-requirements doc text. |
| contextNotes | string | – | Intake notes: context the architect reads until the initiative has a spec (refused on update once a spec exists — edit the spec instead). |
| decompositionStrategy | string | – | Backlog shape for the next Architect run. |
| defaultCrewType | string | – | The crew type this initiative's dispatches use when the caller names none; it outranks the work item's type. |
| defaultGithubBranch | string | – | Base branch the crews build on. Omit to inherit the repository's own default branch — there is no hard-coded "main" guess. A value you supply is checked against the remote and the real default is use… |
| defaultGithubRepo | string | – | Repo the crews run on, "owner/name". |
| description | string | – | Updated intent (what needs to be done). |
| estimate | string|null | – | The team's own estimate as a person says it — "5d", "3w", "1m", or a number of days. Stored as teamEstimateDays, beside the system's estimate; null or "" clears it. |
| initiativeId | string | yes | The initiative id. |
| longLived | boolean | – | Ongoing delivery stream (skips the terminal integration-validation item). |
| name | string | – | New initiative name. |
| operatorPlanned | boolean | – | Bounded work the operator plans themselves: no architect run, no plan to approve. Setting it true moves a DRAFT initiative to IN_PROGRESS so its work can be filed and dispatched; it is refused while… |
| priority | string | – | P0 / P1 / P2 / P3. |
| programId | string|null | – | Parent program id; null unlinks from its program. |
| prsLeftForHumanReview | boolean | – | People review and merge this initiative's pull requests; AnyForge never merges them. When true: no integration-validation work item is created (an existing one is dropped, and restored when set back… |
| status | string | – | DRAFT | BACKLOG_PROPOSED | IN_PROGRESS | COMPLETE | ARCHIVED. COMPLETE records today as the close date (what delivery reports and time recording read); moving off COMPLETE clears it. |
| tags | array | – | Free-form tags (replaces the list). |
| targetCompletionDate | string|null | – | Target date (ISO yyyy-mm-dd); null clears. |
| taskTracker | boolean | – | People deliver this initiative and AnyForge only tracks it: work items are worked by hand and no crew ever runs under it. Setting it true also makes bounded work operatorPlanned (and moves a DRAFT in… |
| teamId | string | – | The owning team, by slug (an existing team in this workspace; "default" hands the initiative back to the unowned team). It cannot be cleared, and an unknown slug is refused. |
| tokenBudget | number | – | Token budget cap. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_key_result Update key result ~221
Update a key result, including recording a new READING — send current as { value, asOf, source }. Always cite a source: a measure with no source fails delivery condition 2, which is what stops one number being quoted two ways. Requires `write` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | – | – |
| baseline | object | – | { value, asOf, source }. |
| current | object | – | The new reading: { value, asOf, source }. Ignored on a derived measure, which is recomputed on every read. |
| derivedMetric | string | – | Required when switching to "derived". |
| direction | string | – | "up" or "down". |
| id | string | yes | The key result id. |
| label | string | – | – |
| objectiveId | string | – | Move it under a different objective. |
| ownerUid | string | – | Send null to clear. |
| sourceKind | string | – | "entered" or "derived". |
| target | number | – | – |
| unit | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_objective Update objective ~100
Update an objective: statement, description, owner, parent pillar, order, or archived. Requires `write` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | – | – |
| description | string | – | – |
| id | string | yes | The objective id. |
| ownerUid | string | – | Send null to clear. |
| pillarId | string | – | Move it under a different pillar. |
| sortOrder | number | – | – |
| statement | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_opportunity Update opportunity ~291
Update an existing opportunity — edit its RICE inputs, stage, theme assignment, program link, or other fields. At least one field must be provided. Requires `write` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | – | Set true to soft-archive this opportunity; false to restore it. |
| description | string | – | Updated description of what the opportunity is and why it matters. |
| evidence | string | – | Free-text evidence backing the opportunity. Persisted; an empty string clears it. |
| id | string | yes | ID of the opportunity to update. |
| programId | string|null | – | Delivery program to link this opportunity to, without promoting it (find ids via anyforge_list_programs). Pass null to unlink. Promotion (anyforge_promote_opportunity) still sets this automatically. |
| rice | object | – | RICE prioritisation inputs. All four numbers and a rationale are required when provided; each number snaps to the nearest RICE bucket. |
| stage | string | – | Opportunity stage. Allowed: IDEA | VALIDATED | READY_TO_PLAN | PLANNED | SHIPPED | MEASURING | ARCHIVED. |
| themeId | string | – | Theme ID to assign this opportunity to. |
| timeCriticality | number | – | Time criticality score (≥ 0). Higher values indicate more time-sensitive opportunities. |
| title | string | – | New short name for the opportunity. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_page Update page ~171
Save a new version of a page: a new title, a new body, or both, with an optional change note. `ifVersion` is the version you read with anyforge_get_page; if someone saved since, this is refused with 409 and you should read the page again. This replaces the text directly, everyone sees it at once: to propose a change for an editor to accept instead, use anyforge_propose_page_edit. Only call when the person asked for this change.
| Name | Type | Req | Description |
|---|---|---|---|
| changeNote | string | – | What changed, in a sentence. |
| content | string | – | The whole new body, in markdown. |
| ifVersion | number | yes | The version you read. |
| pageId | string | yes | The page id. |
| title | string | – | A new title. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_page_space Update page space ~179
Change a space as its admin: settings, access, owners, review cadence, main page (homePageId; null clears it), or archive/restore (archived). Read its revision with anyforge_list_pages and pass ifRevision; stale settings are refused with 409. The key cannot change. Access fields merge with existing settings; member/owner/team arrays replace the old arrays. Only call when the person asked for these changes.
| Name | Type | Req | Description |
|---|---|---|---|
| access | object | – | – |
| archived | boolean | – | – |
| description | string | – | – |
| homePageId | string|null | – | – |
| ifRevision | integer | yes | – |
| name | string | – | – |
| ownerUids | array | – | – |
| reviewEveryDays | integer|null | – | – |
| sensitive | boolean | – | – |
| spaceId | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_pillar Update pillar ~89
Update a pillar: name, description, lead (ownerUid), order, or archived. Requires `write` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | – | – |
| description | string | – | – |
| id | string | yes | The pillar id. |
| name | string | – | – |
| ownerUid | string | – | New lead. Send null to clear. |
| sortOrder | number | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_program Update program ~401
Update an existing program — only the fields you provide change. Edit its name, description, status, owner, lead, whether it is long-lived, target date, coverage goal, tags, or whether its work items need test evidence before they can be marked Done. Incoming requests are switched with anyforge_set_program_request_intake. Requires `write` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| changeFreezes | array | – | The program's change freezes (a client's Black Friday freeze): the WHOLE list, replacing the stored one; [] removes them all. Drawn as bands on the program's Gantt, they gate nothing, but they move t… |
| coverageTarget | number | – | Test-coverage goal 0–100. |
| description | string | – | Updated description. |
| longLived | boolean | – | true for a standing program that never ends; false makes it bounded. |
| name | string | – | New program name. |
| ownerId | string | – | Owning operator uid. |
| programId | string | yes | The program id. |
| programLeadUid | string | – | Program lead uid: must be an approved member of the workspace. An empty string clears the lead. |
| status | string | – | PLANNING | IN_PROGRESS | COMPLETE | CANCELLED. |
| tags | array | – | Free-form tags (replaces the list). |
| targetDate | string | – | Target completion date (ISO yyyy-mm-dd); empty string clears it. |
| testEvidenceRequired | boolean | – | When true, a work item in this program cannot be marked Done until it has at least one test evidence entry (any result); marking one Done without any is refused with 409 test_evidence_required. false… |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_program_initiative Update program initiative ~175
Enrich one existing initiative within a program. Prefer initiativeId; repoFullName is allowed only when that repository has one initiative in the program. Pass appendContext for factual context, or change description/priority. A description change on an ICE-spec initiative is rejected with the revise_program_initiative_scope replacement. The result reports changed fields or a structured no-op.
| Name | Type | Req | Description |
|---|---|---|---|
| appendContext | string | – | Factual context to append, maximum 4000 characters. |
| description | string | – | Replacement objective; not allowed for spec-required initiatives. |
| initiativeId | string | – | Exact initiative id; preferred when available. |
| priority | string | – | – |
| programId | string | yes | The parent program id. |
| repoFullName | string | – | owner/name repository selector when it is unique in the program. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_report Update report ~426
Change an Insights report: its title, description or settings, and its widgets. Edit single widgets by id without resending the rest: `addWidgets` appends new widgets, `replaceWidgets` swaps each named widget in place, `removeWidgetIds` deletes widgets. Or send `widgets` to replace the whole list in render order (a widget left out is deleted); `widgets` cannot be combined with the single-widget edits. Every widget is validated as the Console validates it: an invalid query is refused with 400 `invalid_widget_query` (the widget id and the validator's code in `detail`) and nothing is saved. Preview each new query with anyforge_preview_report_query first. If the report changed since you read it, a single-widget edit is refused with 409 `report_modified`: read it again. If the report has a live share link, the people holding it see the change. Requires `write` scope and a role that edits reports. Only call when the person asked for this change. Each report carries `url`, its Console page; when you show a report to the user, render its title as a link to that url.
| Name | Type | Req | Description |
|---|---|---|---|
| addWidgets | array | – | New widgets, appended in this order. Each id must be new. |
| datesShown | string | – | – |
| description | string | – | A new one-line description. |
| removeWidgetIds | array | – | Ids of widgets to delete. |
| replaceWidgets | array | – | Changed widgets; each replaces the stored widget with the same id, in place. |
| reportId | string | yes | The report id. |
| textSize | string | – | – |
| title | string | – | A new title (1-120 characters). |
| trendDays | integer | – | How far back stat and kpi trends compare, in days (default 7; 0 turns trends off). A value the Console does not offer is refused with 400 `invalid_trend_days`. |
| widgets | array | – | The whole widget list, in render order. Replaces every widget. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_risk Update risk ~225
Update an accepted risk: change its status (e.g. MATERIALISED or CLOSED), owner, review date, mitigation or follow-up work items. Only the fields you pass change. Requires `write` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| acceptedUntilMilestoneId | string | – | Program milestone id the risk is accepted until. |
| description | string | – | What was accepted and why. |
| followUpWorkItemIds | array | – | Work items that will retire the risk. |
| mitigation | string | – | Mitigation or fallback. |
| origin | string | – | Where the decision happened (default manual). |
| ownerUid | string | – | Owner user id. Defaults to the key holder. |
| reviewBy | string | – | UTC date YYYY-MM-DD the risk must be reviewed again. |
| riskId | string | yes | The risk id. |
| severity | string | – | Default medium. |
| status | string | – | Default ACCEPTED on create. |
| title | string | – | Short statement of the accepted risk. |
| trigger | string | – | The condition under which this becomes a real problem. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_signal Update signal ~200
Update an existing signal — edit its status, linked opportunity, source, or other fields. At least one field must be provided. Requires `write` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | – | Set true to soft-archive this signal; false to restore it. |
| body | string | – | Updated full text of the signal. |
| id | string | yes | ID of the signal to update. |
| opportunityId | string | – | ID of the opportunity this signal is linked to. |
| requesterContact | string | – | Contact details for the requester (email, Slack handle, etc.). |
| requesterName | string | – | Name of the person who surfaced this signal. |
| source | string | – | Where the signal came from. Allowed: client | sales | stakeholder | internal | strategy. |
| status | string | – | Signal status. Allowed: NEW | TRIAGED | LINKED | ARCHIVED. |
| title | string | – | New short summary of the signal. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_studio_pull_request Update studio pull request ~106
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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | – | yes | – |
| body | string | – | – |
| expectedHeadSha | string | yes | – |
| prNumber | integer | yes | – |
| repoFullName | string | – | – |
| sessionId | string | yes | Owned Code Studio session ID. |
| title | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_studio_review_finding Update studio review finding ~103
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.
| Name | Type | Req | Description |
|---|---|---|---|
| findingId | string | yes | – |
| rationale | string | yes | – |
| resolutionRevision | string | – | Exact revision returned by the changes or checkpoint read. |
| reviewId | string | yes | – |
| sessionId | string | yes | Owned Code Studio session ID. |
| status | – | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_studio_session Update studio session ~131
Update a session title, repository, branch, additional repositories or initiative. Does not execute code. additionalRepos replaces the whole list; null or [] clears it.
| Name | Type | Req | Description |
|---|---|---|---|
| additionalRepos | array|null | – | – |
| archived | boolean | – | – |
| branch | string|null | – | – |
| folder | string|null | – | – |
| initiativeId | string|null | – | – |
| pinned | boolean | – | – |
| repoFullName | string|null | – | – |
| sessionId | string | yes | Owned Code Studio session ID. |
| title | string | – | – |
| tokenBudget | number|null | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_theme Update theme ~432
Update a theme (a.k.a. cluster — the same record as its delivery program): name, status/horizon, colour, and the CHARTER lines (standsToday, fundingSource, stopCondition, waitsFor, dependsOnThemeIds). A theme carries no strategy link: the objectives it serves are derived from the key results its program's initiatives name (anyforge_set_initiative_key_results). fundingSource + stopCondition are what delivery condition 4 checks; dependsOnThemeIds is what condition 5 walks. Changing `status` MOVES the cluster between horizons and is the only place that can be done. At least one field must be provided. Requires `write` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | – | Set true to soft-archive this theme; false to restore it. |
| color | string | – | Display color for the theme (e.g. hex code). |
| dependsOnThemeIds | array | – | Charter: clusters this one cannot finish without, as theme ids. Walked by delivery condition 5. |
| description | string | – | Updated description of what this theme covers. |
| fundingSource | string | – | Charter: where the money comes from. Checked by delivery condition 4. |
| id | string | yes | ID of the theme to update. |
| name | string | – | New theme name. |
| objective | string | – | Free-text outcome for the roadmap card. |
| ownerId | string | – | UID of the user responsible for this theme. |
| standsToday | string | – | Charter: what is measurably true today, each figure with the document it came from. |
| status | string | – | Theme status. Allowed: NOW | NEXT | LATER | DONE | ARCHIVED. LATER is shown as "Beyond". This is the only place a cluster changes horizon. |
| stopCondition | string | – | Charter: what would make us stop. Checked by delivery condition 4. |
| tags | array | – | List of string tags to associate with the theme. |
| waitsFor | string | – | Charter: the condition that must hold before this cluster can start. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_triage_eval_case Update triage eval case ~197
Edit one triageEvalCases entry in place — only the fields you provide change. Use to fix a case's ticket text, expected classification, expected owning team, or metadata. To update many cases at once, prefer anyforge_upsert_triage_eval_cases (pass each case's id). Requires `write` scope.
| Name | Type | Req | Description |
|---|---|---|---|
| audience | string | – | – |
| caseId | string | yes | The eval case id to update. |
| expectedAction | string | – | Optional exact recommended-action text to score; this never executes an action. |
| expectedRepoFullName | string | – | Optional owner/name repository prediction to score. |
| expectedTeamId | string | – | Set to also score routing accuracy. |
| expectedType | string | – | – |
| historical | object | – | – |
| input | string | – | The ticket description this case classifies. |
| notes | string | – | – |
| repoFullName | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_update_work_item Update work item ~5,964
Mutate one work item. `action` is one of advance, approve_refinement, approve-and-route, move-initiative, dispatch, complete, update, reorder, archive, unarchive, close-as-fixed, reopen, mark-incident, drop, undrop, confirm-repo, assign, begin, dismiss-automation-suggestion, expedite, block, unblock, link-external, verification, add-evidence, remove-evidence, share-evidence, undefer, set-cycle, scope-change, link-pull-request, unlink-pull-request, link-work-item, or unlink-work-item. Each action takes only its own fields: a field the action does not read is refused with 400 unsupported_fields, naming the field and the actions that do read it, and nothing is changed — so a success means every field you passed was applied. To move an item BACK (or between BACKLOG, REFINED and READY), send `status` with NO action: it takes BACKLOG, REFINED or READY, from one of those statuses or from work a person began (IN_PROGRESS with no crew) — the Console status menu's plain move, with the same role and initiative-steward rules, recorded in the item's history. Any other move is refused with 409 raw_status_not_allowed, naming allowedStatuses and the action to use instead (useAction): reopen for DONE, undrop for DROPPED, begin for IN_PROGRESS, complete for DONE, dispatch for a crew, drop; an item a crew carries moves with its crew. anyforge_get_work_item returns `nextActions.statusMoves`, the exact arguments for each move you may make now. Forward moves have their own actions too: advance, approve_refinement, begin, dispatch, complete. Use action='set-review' with inReview (true or false) to put work a person began (IN_PROGRESS, no crew) in or out of review; begin also takes inReview: true to start an item already in review. Use action='assign' with assigneeUid (a member uid or their email; anyforge_list_members lists both) to set the human executor. Use action='block' with blockReason (what the item is waiting on), blockCategory and optionally blockerOwnerUid (who is chasing it, u…
| Name | Type | Req | Description |
|---|---|---|---|
| acceptanceCriteria | string | – | For update: replacement acceptance criteria. |
| action | string | – | The lifecycle or field mutation to apply. Leave it out only to send `status`. |
| addTags | array | – | For update: labels to add to the item's current labels. No revision needed. Labels are trimmed, lower-cased and deduplicated; at most 20 per item, 40 characters each. A label in one of the workspace'… |
| allowedWritePaths | array|null | – | File write scope: a hard boundary on the repository files the crew may change, as relative patterns (literal, * or **; [ and ] are literal characters, so src/pages/[slug].astro is a valid entry). nul… |
| architectPlan | string | – | For action='approve_refinement' only: the architect plan text recorded with the approval. action='update' does not take it. |
| assigneeUid | string|null | – | For assign/begin (and a checklist op's step owner, by uid, inside checklistOps): the human executor — a member uid or their email (anyforge_list_members lists both); null clears the assignee. assign… |
| blockCategory | string | – | For action='block': what kind of blocker it is. Required. |
| blockReason | string | – | For action='block': what the item is waiting on. Required. |
| blockerOwnerUid | string|null | – | For action='block': who owns clearing the block — a member uid or their email (editor or above; anyforge_list_members lists them); null leaves it unowned. |
| branchName | string|null | – | For update: the branch this item's crew works on instead of the derived name. null or '' clears it back to the derived name. Takes effect at the next dispatch. |
| bumpKind | string | – | For update: release-note impact. |
| checklistItemId | string | – | For action='checklist-promote': the id of the checklist step to turn into a sibling work item. |
| checklistOps | array | – | For action='checklist': the operations to apply in order, all or nothing: { op: 'add', text, assigneeUid?, index? }, { op: 'edit', id, text }, { op: 'toggle', id, done }, { op: 'assign', id, assignee… |
| clientVisible | boolean | – | For action='share-evidence': true shares the entry on client reports; false keeps it internal. |
| closedAsFixedByWorkItemId | string | – | For action='close-as-fixed': optional item that delivered the fix. |
| closedEvidenceUrls | array | – | For action='close-as-fixed': optional absolute http(s) links to evidence that the work is already fixed. |
| closedReason | string | – | For action='close-as-fixed': required explanation for the external fix. |
| committedCycleNumber | integer|null | – | For action='set-cycle': the cycle to commit the item to, on its own team's cadence; null takes it out of every cycle. For action='scope-change': the locked cycle to bring the item into. |
| confirmActiveDrop | boolean | – | For action='drop': true to drop an IN_PROGRESS or IN_CREW item (its crew is halted). Send only after the person confirmed; otherwise the drop is refused with active_drop_unconfirmed. |
| confirmOverCapacity | boolean | – | For action='scope-change': true to bring the item in although the cycle goes over its team's capacity. Send only after the person saw the overage and agreed; otherwise it is refused with over_capacit… |
| confirmedInitiativeId | string | – | For action='confirm-repo': initiative whose repository is confirmed. |
| continuesPullRequest | string|null | – | For update: the open pull request this work continues, as its link in the item's repository. Sets the item's branch to the pull request's head and its base branch to its base, read from GitHub, so th… |
| crewId | string | – | For action='dispatch' — OPTIONAL: omit to mint a fresh crew; provide only to attach to an existing one. |
| crewType | string | – | For dispatch: the crew's type, a label (default roster and usage estimates). Every crew type runs the same Engineer-led crew and does not restrict which models run. |
| dependsOn | array | – | For update: work-item ids that must finish first (Jira's 'is blocked by'). Not editable once the item is DONE or DROPPED; record history there with link-work-item. |
| description | string | – | For update: replacement description. |
| droppedReason | string | – | For action='drop': optional operator/agent reason retained on the DROPPED item. |
| dueDate | string|null | – | For update or set-due-date: ISO yyyy-mm-dd date; null clears it. set-due-date works at any status. |
| estimate | string|null | – | For update: the effort estimate as a person says it — "2h", "1.5d", "1w", or a number of days. Stored as operator-days, marked operator-entered; null clears it. |
| estimatePoints | number|string|null | – | For update: the point estimate on the point scale this workspace uses (a number, or a T-shirt size such as "M"); null clears it. Refused while the workspace estimates in time. |
| evidence | object | – | For action='add-evidence': one test run done outside AnyForge. Recorded against the key's user, or as an API key when the key is not bound to one. Secret-shaped text in summary/environment is redacte… |
| evidenceId | string | – | For action='remove-evidence' or 'share-evidence': the id of the evidence entry. |
| expedite | boolean | – | For action='expedite': true enters the expedite lane; false removes the lane flag. |
| externalKey | string|null | – | Legacy: use externalRef. For action='link-external': the item's id in the other tracker; null or "" unlinks it. |
| externalRef | object|null | – | For action='link-external': where the same work lives in another system, { key, url? }; null unlinks it. Do not send it with externalKey or externalUrl. |
| externalUrl | string|null | – | Legacy: use externalRef.url. For action='link-external': optional http(s) link to the item in the other tracker. |
| folderScope | string|null | – | For update: the repository folder this item's work is in (for example apps/web): picks the crew's setup and which repository skills come first, and restricts nothing. null or '' clears it. Takes effe… |
| ifChecklistRevision | integer | – | For action='checklist' and 'checklist-promote': the item's checklistRevision as read with anyforge_get_work_item (0 when absent). Required. |
| ifClassificationRevision | integer | – | For update: the item's classificationRevision as read with anyforge_get_work_item. Required with tags; optional with addTags/removeTags, where it is still checked. |
| inReview | boolean | – | For action='set-review': true puts work a person began in review, false takes it back to In progress. For action='begin': true starts the item already in review. |
| incident | object | – | Incident severity and impact metadata when the item is an incident. |
| itemId | string | yes | The work item id. |
| latestStatus | string|null | – | For action='set-latest-status': the item's one-line current status, shown to clients on shared reports. Up to 1000 characters; null or "" clears it. |
| linkType | string | – | For action='link-work-item' / 'unlink-work-item': relates_to, or duplicates (this item duplicates linkedWorkItemId). |
| linkedWorkItemId | string | – | For action='link-work-item' / 'unlink-work-item': the id of the other work item in this workspace. |
| migrationStrategy | string|null | – | For update, migration only: copy, history-preserving, or subtree. |
| milestoneId | string|null | – | For action='approve-and-route': one of the TARGET initiative's existing milestone ids; omit or null to leave the item unplaced. |
| outOfScope | string | – | For update: bullet-list markdown of what this item explicitly does NOT cover; empty string clears it. |
| priority | string | – | For update: P0, P1, P2, P3, or none to clear it (no priority). |
| pullRequestUrl | string | – | For action='link-pull-request' / 'unlink-pull-request': the pull request link, https://github.com/{owner}/{repo}/pull/{number}. |
| reason | string | – | For action='scope-change': why this item comes into the agreed cycle. Required; shown in the cycle's Scope changes log. |
| removeTags | array | – | For update: labels to remove from the item's current labels; one it does not carry is ignored. No revision needed. |
| reportedMilestoneId | string|null | – | For update: the program milestone (wave) this was reported against; null or "" clears it. Must be a milestone id of the program that owns the item's initiative. |
| requestReview | string|null | – | For action='set-request-review': under_review or waiting_on_requester on a request in Incoming Requests; null clears it. |
| runProfileId | string | – | For dispatch: id of a saved crew run profile (Settings → Agents). Sets the provider and model for every crew role. Do not combine with runProfileOverride. |
| runProfileOverride | object | – | For dispatch: a one-off run configuration for this crew only, `{ roles: { SOFTWARE_ARCHITECT, FULL_STACK_ENGINEER, QA_REVIEWER, COMPLIANCE_SECURITY } }` where each role is `{ provider, model }`. All… |
| sortOrder | number | – | For action='reorder': numeric queue position. |
| sourceGithubBranch | string|null | – | For update, migration only: source branch to copy from. |
| sourceGithubRepo | string|null | – | For update, migration only: read-only source repository to copy from. The source fields and targetPath need it. |
| sourceGithubSha | string|null | – | For update, migration only: source commit to copy from. |
| sourcePath | string|null | – | For update, migration only: path in the source repository to copy. |
| status | string | – | Only with NO action: move the item to BACKLOG, REFINED or READY, from one of those or from work a person began (IN_PROGRESS, no crew). This is how an item moves back (READY to BACKLOG, In progress to… |
| tags | array | – | For update: replaces every label; [] clears them. Needs ifClassificationRevision. Not with addTags/removeTags. Labels are trimmed, lower-cased and deduplicated; at most 20 per item, 40 characters eac… |
| targetGithubBranch | string|null | – | For update: the base branch this item's crew branches from and opens its pull request against, instead of the initiative's source branch. null or '' clears it back to the initiative's source branch.… |
| targetGithubRepo | string|null | – | For update: writable owner/name repository; null clears it where allowed. confirm-repo takes confirmedInitiativeId instead. |
| targetInitiativeId | string | – | For action='approve-and-route': the initiative that will DELIVER this request. For action='move-initiative': the initiative the item moves to. Required for both; must not be an Incoming Requests buck… |
| targetPath | string|null | – | For update, migration only: where the copied source lands in the target repository. Not a working folder for ordinary work; use folderScope for that. |
| teamSlug | string|null | – | For update: the item's own team (an existing team's slug); null or "" clears it so the item inherits its initiative's team. Allowed at any status when sent alone. The item's own team also limits who… |
| title | string | – | For update: replacement title. |
| triageType | string | – | For update: corrected intake classification. |
| type | string | – | For update or set-type: BUG, FEATURE, ENHANCEMENT, KTLO, TECH_DEBT, or INCIDENT. set-type works at any status. |
| validationBranch | string|null | – | For update on an integration-validation item: validate this branch instead of waiting for every crew PR to merge. When it differs from the base branch, the validation run checks it out and accepts ea… |
| verificationState | string|null | – | For action='verification': 'verified' when the client accepted a DONE item; null stops tracking an item that is not yet accepted. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_upload_coverage Upload coverage ~335
Upload test-coverage measurements for one or many repos (e.g. synced from SonarQube). Requires `write` scope. Each item needs repo ("owner/name") and either percent (0–100) or a raw lcov report. percent is LINE coverage: from SonarQube read the `line_coverage` measure, not `coverage`, which also counts branch conditions and so does not compare with other sources. Optionally send branch and measuredAt (the analysis date) per item: a reading for a non-default branch, or older than the stored figure, is kept as history only. Writes coverage to the matching codebase + the org repo index, so a Program Genesis quality program can scope "repos below X%". Batch up to 200 items per call — chunk larger syncs. Map SonarQube projects to owner/repo via their GitHub binding before calling; ask the operator about any you can't map.
| Name | Type | Req | Description |
|---|---|---|---|
| branch | string | – | Single-repo branch (with `repo`). |
| commitSha | string | – | Single-repo commit sha (with `repo`). |
| items | array | – | Coverage measurements (up to 200). Use this for batch sync. |
| lcov | string | – | Single-repo lcov report (with `repo`). |
| measuredAt | string | – | Single-repo measurement time, ISO 8601 (with `repo`). |
| percent | number | – | Single-repo coverage % (with `repo`). |
| repo | string | – | Single-repo shortcut (use instead of items): "owner/name". |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_upload_local_file Upload local file ~318
Upload a file from THIS machine to a work item, initiative or program and attach it: starts a direct upload, sends the bytes straight to Storage and completes it, for files up to 1 GB. Local (stdio) server only; the hosted connection refuses it with `local_files_unavailable`, use anyforge_start_file_upload there. Confirm the exact file with the user before sending it: the file leaves this machine. A file with the same name and size already on the record is not sent again ({ alreadyAttached: true, file }).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The work item, initiative or program id. |
| mediaType | string | – | Optional MIME type; the extension wins when they disagree. |
| name | string | – | Name to store it under. Defaults to the file name in `path`. |
| onNameConflict | string | – | A same-name file of a different size already on the record: refuse it (default, file_name_exists) or attach both. A same-name, same-size file is never attached twice. |
| originalCreatedAt | string | – | Optional. When the file was created in the tool it came from: an ISO 8601 date or a date and time with a zone, e.g. 2024-03-01T10:22:33.000+0000. Kept beside the upload time. |
| path | string | yes | Absolute path of the file on this machine. |
| target | string | yes | The kind of record the file is attached to. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_upsert_triage_eval_cases Upsert triage eval cases ~145
Create or update triageEvalCases in bulk — pass every case in ONE call, including a full corpus. Each case needs `input` (the ticket text) and `expectedType` (incident / bug / enhancement / misconfiguration / new_feature); `expectedTeamId` is optional and, when set, ALSO scores routing accuracy. Pass an existing case's `id` to update it in place — re-uploading the same corpus updates rather than duplicates. Returns `created` (the cases that saved) and `errors` (per-index validation failures) — a bad row does not fail the whole batch.
| Name | Type | Req | Description |
|---|---|---|---|
| cases | array | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_withdraw_person_invitation Withdraw person invitation ~84
Withdraw a pending invitation by email address. Requires an API key with the `people:invite` scope, held by an owner. An accepted invitation and an owner invitation cannot be withdrawn this way; another company's invitation reads as not found. Only call when the operator asked to withdraw it.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | The address the invitation was sent to. |
Structured output declared, but exposes no named fields.
No examples provided.
anyforge_write_studio_workspace_file Write studio workspace file ~150
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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | – | yes | – |
| content | string | – | The complete UTF-8 file content for save (400 KB maximum). Omit for create. |
| expectedBranch | string | yes | – |
| expectedRepoFullName | string | yes | – |
| expectedRevision | string | yes | Exact revision returned by the changes or checkpoint read. |
| path | string | yes | – |
| sessionId | string | yes | Owned Code Studio session ID. |
Structured output declared, but exposes no named fields.
No examples provided.
How do I install the AnyForge MCP server?
AnyForge runs locally as an npm package, launched with npx -y @anyforge/mcp-server. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @anyforge/mcp-server
claude mcp add ai-anyforge-anyforge -- npx -y @anyforge/mcp-server
What is the AnyForge MCP server?
AnyForge is an MCP server listed in the public MCP registry as ai.anyforge/anyforge. Approve plans, track initiatives and work items, and steer AI engineering crews in AnyForge. This page covers its npm package (@anyforge/mcp-server).
Is the AnyForge MCP server safe to use?
AnyForge scores 65 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the AnyForge MCP server expose?
AnyForge exposes 229 tools: anyforge_branch_studio_session, anyforge_rewind_studio_session, anyforge_update_studio_review_finding, anyforge_get_studio_pr_comments, anyforge_get_studio_pr_jobs, and 224 more. Their descriptions and schemas cost roughly 41,840 tokens of context every time the server is loaded.
Is the AnyForge MCP server still maintained?
AnyForge is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the AnyForge MCP server under?
AnyForge declares the UNLICENSED licence, which is not on the OSI-approved list. Read the terms before using it at work, and note this covers the source only, not the cost of any service it calls.