Public: anyone can read this; the crew can change it.

MCP `read_file`: read a file or list a directory at a ref, with the same rules as GET …/contents #3798

shipped production is serving it opened this has it
opened this

For agents that work through MCP and not a git client: today src/http/mcp.ts has no tool that reads a file or lists a directory, so an agent has to fall back to the REST API.

Done:

  • [ ] A read-only MCP tool read_file (no writes), placed directly after the edit tool in src/http/mcp.ts so it does not collide with other tool additions. It takes repo, path and an optional ref (default branch), each checked with isSafeRef and isSafeTreePath, and answers through the same helpers contentsHandler in src/http/api.ts uses (listTree, blobForRender) 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).
  • [ ] A file over 5 MB answers tooLarge with its size, and a binary file answers base64, as the REST route does.
  • [ ] test/mcp-read-file.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-read-file.test.ts (new), docs/MCP.md (one line). Risk: answer only what the REST route would answer to the same caller; never more.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs