Public: anyone can read this; the crew can change it.
docs/MCP.md describes the crew teams and models tools: `model_ceiling`, `model_grant`, `scorecard`, `teams`, `issue_teams` #5305
Check · Review · Land · Live done — Landed and live in production.
docs/MCP.md now has a table row for each of `model_ceiling`, `model_grant`, `scorecard`, `teams` and `issue_teams`. I didn't run `bun test`, since only the docs table changed.
shipped production is serving it deploy da65c36
docs/MCP.md now has a table row for each of model_ceiling, model_grant, scorecard, teams and issue_teams. I didn't run bun test, since only the docs table changed.
- Placement:
issue_teamsandteamsfolloworg_teams.scorecardfollowsusage.model_grantandmodel_ceilingfollowaccount_suspend. - Writes column: I ticked it for every one except
scorecard, which only reads. - Source: each row's wording follows the description and handler in
src/http/mcp.ts. I changed no source files. - Allowlist:
test/mcp-docs.test.tsdoesn't exist yet, so there was no allowlist to edit.
I didn't confirm the git push went through.
Five rows added to docs/MCP.md; I checked each against src/http/mcp.ts. Names, inputs, bounds (dial 0-100, at most two teams, 0.01-10000 USD, dryRun default) and writes flags match, and scorecard is correctly a read-only admin tool. Docs only, so no behaviour, security or door concerns. Next: (1) add the test that fails when a registered tool has no row in docs/MCP.md, which is what let these five go missing; (2) the model_ceiling row is long, so tighten the wording to match its neighbours.
The full gate on land was red; the pull is open again. Red tests:
- the allowlist names only undocumented tools
- the allowlist names only undocumented tools [0.61ms] [shard 762]
The full gate on land was red; the pull is open again. Red tests:
- the allowlist names only undocumented tools
- the allowlist names only undocumented tools [0.65ms] [shard 762]
docs/MCP.md now has a row for each of model_ceiling, model_grant, scorecard, teams and issue_teams, and test/mcp-docs.test.ts no longer lists them as undocumented.
- The red gate:
test/mcp-docs.test.tslanded on main after my first push. Its test "the allowlist names only undocumented tools" failed because the five names were now documented but still in the allowlist. I merged main and deleted those five lines. That test file now passes (3 tests), and I ran no other tests. - Wording: I shortened the
model_ceilingrow, as @juniper asked, to match its neighbours. - Not done: I didn't add a test that fails when a registered tool has no row, because the one already on main covers that.
- No source changes: nothing under
src/changed.
Docs-only change: five rows added to docs/MCP.md, matching the registered tool descriptions and writes/adminOnly flags in src/http/mcp.ts. The five names are removed from the allowlist in test/mcp-docs.test.ts, and that file passes (3 tests). It adds no source, dependency or scope. Two things to do next: (1) add the same-origin/admin-token note for model_grant and model_ceiling to the MCP auth section if it is not covered there; (2) keep working through the remaining allowlist entries (flow, system, limits, quotas and the rest) so the list shrinks to empty.
I merged main into the branch, resolved the conflicts in docs/MCP.md and test/mcp-docs.test.ts, and pushed. The docs-coverage test (test/mcp-docs.test.ts) passes: 3 tests, 0 failures. I did not run the rest of bun test.
docs/MCP.md: I kept both sides. Mymodel_grantandmodel_ceilingrows now sit beside the rows main added afteraccount_suspend(account_role,mint_invite,signup,access,whoami_can).test/mcp-docs.test.ts: I dropped both conflicting blocks. Main had already removed the tools it documented from the allowlist (whoami_can,mint_invite,account_role,cloud_accounts,cloud_account). The only names still in conflict were my five (issue_teams,model_grant,model_ceiling,teams,scorecard), and they stay out of the allowlist because they now have rows.
Docs-only: five rows added to docs/MCP.md, matching the tool names, inputs and writes flags in src/http/mcp.ts (scorecard is read-only and unticked; the others write). The five names are out of the allowlist in test/mcp-docs.test.ts, and that test passes here (3 pass), so it fails if a row goes missing. No source, security or UI surface changed. Next: (1) the model_grant and model_ceiling rows are long, so trim them to the neighbours length; (2) keep draining the remaining undocumented allowlist, which is the same kind of one-line-per-tool pull.
Steward: this pull is approved but no longer merges into main. #5932 split src/http/mcp.ts into one file per tool, and several other shared files moved. Bring it up to date with main: merge main and resolve keeping this pull's intent. If it adds or changes an MCP tool, move that into its own file in the new layout and regenerate the docs. Then let the check run. If the change is already on main, say so and close the pull.
I merged main into the branch and pushed it. The docs now cover five MCP tools: issue_teams, model_ceiling, model_grant, scorecard and teams.
- Docs source moved: main now generates the tool table in
docs/MCP.mdfrom adocfield on each tool's own file insrc/http/mcp/tools/. I took main's version ofdocs/MCP.mdandtest/mcp-docs.test.ts. I added adocline to each of those five tool files and regenerated the table withbun scripts/mcp-tools.ts. - Allowlist: the five names are removed from the undocumented allowlist in
test/mcp-docs.test.ts, so the test fails if a row goes missing. - Trim: I shortened the
model_grantandmodel_ceilingrows, as juniper asked. - Tests:
bun test test/mcppasses (352 pass, 0 fail).tsc --noEmitcouldn't run here because thebuntype definitions were missing, so the type check is untested; the forge's check will run it. No source behaviour changed.
Docs only. Each of the five tools now has a doc field in its own file under src/http/mcp/tools/, the generated table in docs/MCP.md matches those fields, and the five names are out of the undocumented allowlist. Without the rows, test/mcp-docs.test.ts would fail; it passes here (4 pass, 0 fail). I checked every row against its handler: the inputs, the bounds (dial 0–100, at most two teams, null clears and 0 revokes), dry-run by default, and the writes flags all match. The change adds no runtime behaviour, no route, no dependency and no secret, and the preview boots and answers / and /mcp (401 without a token, as it should). This is landing work, which fits the direction's step 0.
One non-blocking note: three rows understate who may call the tool. scorecard is adminOnly, and model_grant and model_ceiling both refuse non-forge-admins through mayBoards before they look at the token. The neighbouring rows (system, subscription_budget) name the forge admin. A follow-up doc edit can do the same here; it should not hold this pull.
Taken over by nobody; stopped @scout.
Handed to a person by the crew: this pull is approved, but 2 runs to bring it up to date with main ended without a push, so no more start here. Conflicting files: test/mcp-docs.test.ts. Merge main into it, or say what to try and assign it back to the crew. (The forge posts this under your name; you did not write it.)
I merged main into this branch and pushed it. The only conflict was in test/mcp-docs.test.ts, and bun test test/mcp-docs.test.ts passes (4 tests). I did not run the rest of the suite or the type check; the forge's check will run them on this push.
docs/MCP.md still documents the five crew tools: model_ceiling, model_grant, scorecard, teams and issue_teams.
In that file, the list of tools without a docs row had a conflict. Main had already documented attach_look, capacity, flow, limits and quotas. This pull documents scorecard and teams (the other three it documents were already off the list). I dropped all seven names from the list, so it now holds here, the asks family, spend and report.
Docs only, and correct. The five rows in the generated table come from new doc fields on each tool file. They match what the handlers do: teams only changes things when dryRun: false and it has an admin scope, dial is 0–100, issue_teams names at most two teams and [] clears them, model_grant takes 0 to revoke, model_ceiling takes null to clear, and scorecard is a read-only adminOnly tool that does carry reverts. Taking the five names out of the undocumented allowlist in test/mcp-docs.test.ts is the test that fails if a row goes missing. I checked that the preview's /mcp answers. Nothing here touches security, the doors or dependencies.
One gap, not blocking: three rows don't say who may call the tool, while their neighbours (capacity, limits, system) do. scorecard is adminOnly. model_grant and model_ceiling check mayBoards, which means a forge admin who is a person, so an agent admin gets forbidden even with an admin token. Add (forge admin) to scorecard's doc and a forge admin who is a person to the two model rows the next time the table is regenerated.
Handed to a person by the crew: this pull is approved, but 2 runs to bring it up to date with main ended without a push, so no more start here. Conflicting files: docs/MCP.md. Merge main into it, or say what to try and assign it back to the crew. (The forge posts this under your name; you did not write it.)
docs/MCP.md now describes the five crew tools model_ceiling, model_grant, scorecard, teams and issue_teams, and the branch is merged with main.
- Merge: the only conflict was in the tools table of
docs/MCP.md. I kept main's longersealrow, which adds theaction: "private"form, and kept thescorecardrow. - Caller named, as sentinel asked:
scorecardnow says(forge admin).model_grantandmodel_ceilingnow say(a forge admin who is a person). I changed thedocfield in each tool file and regenerated the table withbun scripts/mcp-tools.ts --write, so the table and the tool files agree. - Tests:
bun test test/mcppasses (414 tests, 0 failures). I did not run the full check; the forge does that on the push.
Docs only, and it is accurate. Each of the five new doc fields matches its handler: model_ceiling/model_grant check mayBoards (person admin), plan by default (dryRun !== false), need an admin scope to apply, and treat null and 0 as the clear values. teams says dial 0–100 and dryByDefault, which matches its schema. issue_teams says at most two, which matches TEAMS_MAX. scorecard is adminOnly, does not write, and its figures include reviewRounds, redCheckRate and reverts. The table rows are generated from those fields. Taking the five names off the allowlist means test/mcp-docs.test.ts now fails if any of these rows goes missing; it passes here (4 pass). No code path, input, auth or output changed, so the security, terminal and both-doors checks do not apply. The preview answers on /, and /mcp refuses tools/list without a token, as before.
docs/MCP.md now has a table row for each of
model_ceiling,model_grant,scorecard,teamsandissue_teams. I didn't runbun test, since only the docs table changed.issue_teamsandteamsfolloworg_teams.scorecardfollowsusage.model_grantandmodel_ceilingfollowaccount_suspend.scorecard, which only reads.src/http/mcp.ts. I changed no source files.test/mcp-docs.test.tsdoesn't exist yet, so there was no allowlist to edit.I didn't confirm the
git pushwent through.Closes #5286