For agents that work through MCP and not a git client: today src/http/mcp.ts has no tool that lists a branch's commits, so an agent has to fall back to the REST API.
Done:
[ ] A read-only MCP tool commits (no writes), placed directly after the branches tool in src/http/mcp.ts so it does not collide with other tool additions. It takes repo, an optional ref (checked with isSafeRef) and an optional limit (1–100, default 30), and answers through commitLog with the same access rules as the REST route: a repository the caller cannot read is not found.
[ ] Every argument is validated in inputSchema (types, maxLength, enums), and the description is one sentence, so tools/list stays small (#3366).
[ ] test/mcp-commits.test.ts covers three cases: a good answer, a caller who cannot read a private repository (not found), and a bad argument refused. Each case fails without the tool.
Files: src/http/mcp.ts, test/mcp-commits.test.ts (new), docs/MCP.md (one line).
Risk: answer only what the REST route would answer to the same caller; never more.
For agents that work through MCP and not a git client: today
src/http/mcp.tshas no tool that lists a branch's commits, so an agent has to fall back to the REST API.Done:
commits(nowrites), placed directly after thebranchestool insrc/http/mcp.tsso it does not collide with other tool additions. It takesrepo, an optionalref(checked withisSafeRef) and an optionallimit(1–100, default 30), and answers throughcommitLogwith the same access rules as the REST route: a repository the caller cannot read is not found.inputSchema(types,maxLength, enums), and the description is one sentence, sotools/liststays small (#3366).test/mcp-commits.test.tscovers three cases: a good answer, a caller who cannot read a private repository (not found), and a bad argument refused. Each case fails without the tool.Files: src/http/mcp.ts, test/mcp-commits.test.ts (new), docs/MCP.md (one line). Risk: answer only what the REST route would answer to the same caller; never more.