feat(mcp): add list_tree tool - #870

Merged
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree
Feb 10, 2026
Merged

feat(mcp): add list_tree tool#870
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree

Conversation

@brianphillips

@brianphillipsbrianphillips commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

This PR adds a list_tree tool to the MCP package. This tool allows an agent to list files and directories from a repository path. This can be used as a simple directory listing tool or for a directory tree tool by specifying a depth > 1

Summary by CodeRabbit

  • New Features

    • Added a new list_tree tool to browse repository trees with depth control, includeFiles/includeDirectories toggles, and a maxEntries limit.
  • Documentation

    • Added usage details, parameters, and examples for the new list_tree tool in docs, README, and changelog.
  • Bug Fixes

    • Improved repository-not-found message to include the repository name for clearer diagnostics.

This tool allows an agent to list files and directories from a
repository path. This can be used as a simple directory listing tool or
for a directory tree tool by specifying a depth > 1
@coderabbitai

coderabbitaiBot commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new MCP tool list_tree (client method, server tool, schemas, types, utils, and documentation) that lists repository files/directories with depth, includeFiles/includeDirectories, and maxEntries controls; returns sorted, deduplicated entries with truncation metadata.

Changes

Cohort / File(s)Summary
Documentation
docs/docs/features/mcp-server.mdx, packages/mcp/README.md, packages/mcp/CHANGELOG.md
Added docs and changelog entries describing the new list_tree tool and its parameters (repo, path, ref, depth, includeFiles, includeDirectories, maxEntries).
Client API
packages/mcp/src/client.ts
Added listTree(request: ListTreeApiRequest) which POSTs to /api/tree, sends JSON body and optional API key header, and validates/parses the response via new schema.
Server & Exports
packages/mcp/src/index.ts
Registered list_tree tool implementation on the MCP server (breadth-first traversal, depth/maxEntries bounds, deduplication, filtering, truncation) and exported related constants, types, and utilities. (Implementation appears inserted twice.)
Schemas / Constants
packages/mcp/src/schemas.ts
Added API and public schemas: listTreeApiRequestSchema, listTreeApiResponseSchema, listTreeRequestSchema, listTreeEntrySchema, listTreeResponseSchema, plus constants DEFAULT_TREE_DEPTH, MAX_TREE_DEPTH, DEFAULT_MAX_TREE_ENTRIES, MAX_MAX_TREE_ENTRIES.
Types
packages/mcp/src/types.ts
Exported new types mapped from schemas: ListTreeApiRequest, ListTreeApiResponse, ListTreeApiNode, ListTreeRequest, ListTreeEntry, ListTreeResponse.
Utilities
packages/mcp/src/utils.ts
Added normalizeTreePath, joinTreePath, buildTreeNodeIndex, and sortTreeEntries for path normalization, tree indexing, and stable sorting of entries.
Web API message
packages/web/src/features/git/getTreeApi.ts
Adjusted repository-not-found response to include a descriptive message: notFound(\Repository "${repoName}" not found.`)`.

Sequence Diagram

sequenceDiagram
participant Client as MCP Client
participant Server as MCP Server
participant TreeAPI as Tree API (/api/tree)
Client->>Server: list_tree(request: repo,path,ref,depth,filters,maxEntries)
Server->>Server: normalizeTreePath(path)
Server->>Server: enforceBounds(depth,maxEntries)
alt includeFiles OR includeDirectories
Server->>TreeAPI: POST /api/tree (breadth-first per depth)
TreeAPI-->>Server: tree nodes
Server->>Server: buildTreeNodeIndex(nodes)
Server->>Server: extract, dedupe, filter entries
Server->>Server: sortTreeEntries(entries)
Server->>Server: truncateWhenMaxReached()
else both filters false
Server->>Server: return empty entries
end
Server-->>Client: ListTreeResponse(entries,totalReturned,truncated)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(mcp): add list_tree tool' accurately and concisely summarizes the main change—adding a new list_tree tool to the MCP package.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

}
);

server.tool(

@brendan-kellambrendan-kellamFeb 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This approach makes sense for the apis that we expose, and I'm happy to ship this. For context,/api/tree is designed around the file tree viewer in the code browser, and is why we accept a list of paths (representing open directories) and return a tree spanning the union.

An alternative, potentially simpler, approach I was going to suggest is that we could use ls-tree with -r to recurse from a specified path. It does not accept a max depth unfortunately, so we would need to truncate the output to the specified depth. Perf is ok (because of #791), even on large repos like UnrealEngine:

> UnrealEngine git:(release) time git ls-tree -r HEAD . > /dev/null
git ls-tree -r HEAD . > /dev/null 0.10s user 0.02s system 94% cpu 0.125 total

Regardless of the approach, we will want to move this api surface into the server s.t., we can also add a list_tree tool to the Ask agent. I'll leave that for a follow-up PR that I can open later this week.

@brendan-kellam
brendan-kellam merged commit e4327ea into sourcebot-dev:mainFeb 10, 2026
9 of 10 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 10, 2026
@brianphillips
brianphillips deleted the mcp-list-tree branch February 10, 2026 21:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brianphillips@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(mcp): add list_tree tool - #870

Merged
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree
Feb 10, 2026
Merged

feat(mcp): add list_tree tool#870
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree

Conversation

@brianphillips

@brianphillipsbrianphillips commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

This PR adds a list_tree tool to the MCP package. This tool allows an agent to list files and directories from a repository path. This can be used as a simple directory listing tool or for a directory tree tool by specifying a depth > 1

Summary by CodeRabbit

  • New Features

    • Added a new list_tree tool to browse repository trees with depth control, includeFiles/includeDirectories toggles, and a maxEntries limit.
  • Documentation

    • Added usage details, parameters, and examples for the new list_tree tool in docs, README, and changelog.
  • Bug Fixes

    • Improved repository-not-found message to include the repository name for clearer diagnostics.

This tool allows an agent to list files and directories from a
repository path. This can be used as a simple directory listing tool or
for a directory tree tool by specifying a depth > 1
@coderabbitai

coderabbitaiBot commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new MCP tool list_tree (client method, server tool, schemas, types, utils, and documentation) that lists repository files/directories with depth, includeFiles/includeDirectories, and maxEntries controls; returns sorted, deduplicated entries with truncation metadata.

Changes

Cohort / File(s)Summary
Documentation
docs/docs/features/mcp-server.mdx, packages/mcp/README.md, packages/mcp/CHANGELOG.md
Added docs and changelog entries describing the new list_tree tool and its parameters (repo, path, ref, depth, includeFiles, includeDirectories, maxEntries).
Client API
packages/mcp/src/client.ts
Added listTree(request: ListTreeApiRequest) which POSTs to /api/tree, sends JSON body and optional API key header, and validates/parses the response via new schema.
Server & Exports
packages/mcp/src/index.ts
Registered list_tree tool implementation on the MCP server (breadth-first traversal, depth/maxEntries bounds, deduplication, filtering, truncation) and exported related constants, types, and utilities. (Implementation appears inserted twice.)
Schemas / Constants
packages/mcp/src/schemas.ts
Added API and public schemas: listTreeApiRequestSchema, listTreeApiResponseSchema, listTreeRequestSchema, listTreeEntrySchema, listTreeResponseSchema, plus constants DEFAULT_TREE_DEPTH, MAX_TREE_DEPTH, DEFAULT_MAX_TREE_ENTRIES, MAX_MAX_TREE_ENTRIES.
Types
packages/mcp/src/types.ts
Exported new types mapped from schemas: ListTreeApiRequest, ListTreeApiResponse, ListTreeApiNode, ListTreeRequest, ListTreeEntry, ListTreeResponse.
Utilities
packages/mcp/src/utils.ts
Added normalizeTreePath, joinTreePath, buildTreeNodeIndex, and sortTreeEntries for path normalization, tree indexing, and stable sorting of entries.
Web API message
packages/web/src/features/git/getTreeApi.ts
Adjusted repository-not-found response to include a descriptive message: notFound(\Repository "${repoName}" not found.`)`.

Sequence Diagram

sequenceDiagram
participant Client as MCP Client
participant Server as MCP Server
participant TreeAPI as Tree API (/api/tree)
Client->>Server: list_tree(request: repo,path,ref,depth,filters,maxEntries)
Server->>Server: normalizeTreePath(path)
Server->>Server: enforceBounds(depth,maxEntries)
alt includeFiles OR includeDirectories
Server->>TreeAPI: POST /api/tree (breadth-first per depth)
TreeAPI-->>Server: tree nodes
Server->>Server: buildTreeNodeIndex(nodes)
Server->>Server: extract, dedupe, filter entries
Server->>Server: sortTreeEntries(entries)
Server->>Server: truncateWhenMaxReached()
else both filters false
Server->>Server: return empty entries
end
Server-->>Client: ListTreeResponse(entries,totalReturned,truncated)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(mcp): add list_tree tool' accurately and concisely summarizes the main change—adding a new list_tree tool to the MCP package.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

}
);

server.tool(

@brendan-kellambrendan-kellamFeb 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This approach makes sense for the apis that we expose, and I'm happy to ship this. For context,/api/tree is designed around the file tree viewer in the code browser, and is why we accept a list of paths (representing open directories) and return a tree spanning the union.

An alternative, potentially simpler, approach I was going to suggest is that we could use ls-tree with -r to recurse from a specified path. It does not accept a max depth unfortunately, so we would need to truncate the output to the specified depth. Perf is ok (because of #791), even on large repos like UnrealEngine:

> UnrealEngine git:(release) time git ls-tree -r HEAD . > /dev/null
git ls-tree -r HEAD . > /dev/null 0.10s user 0.02s system 94% cpu 0.125 total

Regardless of the approach, we will want to move this api surface into the server s.t., we can also add a list_tree tool to the Ask agent. I'll leave that for a follow-up PR that I can open later this week.

@brendan-kellam
brendan-kellam merged commit e4327ea into sourcebot-dev:mainFeb 10, 2026
9 of 10 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 10, 2026
@brianphillips
brianphillips deleted the mcp-list-tree branch February 10, 2026 21:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brianphillips@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mcp): add list_tree tool - #870

Merged
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree
Feb 10, 2026
Merged

feat(mcp): add list_tree tool#870
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree

Conversation

@brianphillips

@brianphillipsbrianphillips commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

This PR adds a list_tree tool to the MCP package. This tool allows an agent to list files and directories from a repository path. This can be used as a simple directory listing tool or for a directory tree tool by specifying a depth > 1

Summary by CodeRabbit

  • New Features

    • Added a new list_tree tool to browse repository trees with depth control, includeFiles/includeDirectories toggles, and a maxEntries limit.
  • Documentation

    • Added usage details, parameters, and examples for the new list_tree tool in docs, README, and changelog.
  • Bug Fixes

    • Improved repository-not-found message to include the repository name for clearer diagnostics.

This tool allows an agent to list files and directories from a
repository path. This can be used as a simple directory listing tool or
for a directory tree tool by specifying a depth > 1
@coderabbitai

coderabbitaiBot commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new MCP tool list_tree (client method, server tool, schemas, types, utils, and documentation) that lists repository files/directories with depth, includeFiles/includeDirectories, and maxEntries controls; returns sorted, deduplicated entries with truncation metadata.

Changes

Cohort / File(s)Summary
Documentation
docs/docs/features/mcp-server.mdx, packages/mcp/README.md, packages/mcp/CHANGELOG.md
Added docs and changelog entries describing the new list_tree tool and its parameters (repo, path, ref, depth, includeFiles, includeDirectories, maxEntries).
Client API
packages/mcp/src/client.ts
Added listTree(request: ListTreeApiRequest) which POSTs to /api/tree, sends JSON body and optional API key header, and validates/parses the response via new schema.
Server & Exports
packages/mcp/src/index.ts
Registered list_tree tool implementation on the MCP server (breadth-first traversal, depth/maxEntries bounds, deduplication, filtering, truncation) and exported related constants, types, and utilities. (Implementation appears inserted twice.)
Schemas / Constants
packages/mcp/src/schemas.ts
Added API and public schemas: listTreeApiRequestSchema, listTreeApiResponseSchema, listTreeRequestSchema, listTreeEntrySchema, listTreeResponseSchema, plus constants DEFAULT_TREE_DEPTH, MAX_TREE_DEPTH, DEFAULT_MAX_TREE_ENTRIES, MAX_MAX_TREE_ENTRIES.
Types
packages/mcp/src/types.ts
Exported new types mapped from schemas: ListTreeApiRequest, ListTreeApiResponse, ListTreeApiNode, ListTreeRequest, ListTreeEntry, ListTreeResponse.
Utilities
packages/mcp/src/utils.ts
Added normalizeTreePath, joinTreePath, buildTreeNodeIndex, and sortTreeEntries for path normalization, tree indexing, and stable sorting of entries.
Web API message
packages/web/src/features/git/getTreeApi.ts
Adjusted repository-not-found response to include a descriptive message: notFound(\Repository "${repoName}" not found.`)`.

Sequence Diagram

sequenceDiagram
participant Client as MCP Client
participant Server as MCP Server
participant TreeAPI as Tree API (/api/tree)
Client->>Server: list_tree(request: repo,path,ref,depth,filters,maxEntries)
Server->>Server: normalizeTreePath(path)
Server->>Server: enforceBounds(depth,maxEntries)
alt includeFiles OR includeDirectories
Server->>TreeAPI: POST /api/tree (breadth-first per depth)
TreeAPI-->>Server: tree nodes
Server->>Server: buildTreeNodeIndex(nodes)
Server->>Server: extract, dedupe, filter entries
Server->>Server: sortTreeEntries(entries)
Server->>Server: truncateWhenMaxReached()
else both filters false
Server->>Server: return empty entries
end
Server-->>Client: ListTreeResponse(entries,totalReturned,truncated)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(mcp): add list_tree tool' accurately and concisely summarizes the main change—adding a new list_tree tool to the MCP package.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

}
);

server.tool(

@brendan-kellambrendan-kellamFeb 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This approach makes sense for the apis that we expose, and I'm happy to ship this. For context,/api/tree is designed around the file tree viewer in the code browser, and is why we accept a list of paths (representing open directories) and return a tree spanning the union.

An alternative, potentially simpler, approach I was going to suggest is that we could use ls-tree with -r to recurse from a specified path. It does not accept a max depth unfortunately, so we would need to truncate the output to the specified depth. Perf is ok (because of #791), even on large repos like UnrealEngine:

> UnrealEngine git:(release) time git ls-tree -r HEAD . > /dev/null
git ls-tree -r HEAD . > /dev/null 0.10s user 0.02s system 94% cpu 0.125 total

Regardless of the approach, we will want to move this api surface into the server s.t., we can also add a list_tree tool to the Ask agent. I'll leave that for a follow-up PR that I can open later this week.

@brendan-kellam
brendan-kellam merged commit e4327ea into sourcebot-dev:mainFeb 10, 2026
9 of 10 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 10, 2026
@brianphillips
brianphillips deleted the mcp-list-tree branch February 10, 2026 21:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brianphillips@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mcp): add list_tree tool - #870

Merged
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree
Feb 10, 2026
Merged

feat(mcp): add list_tree tool#870
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree

Conversation

@brianphillips

@brianphillipsbrianphillips commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

This PR adds a list_tree tool to the MCP package. This tool allows an agent to list files and directories from a repository path. This can be used as a simple directory listing tool or for a directory tree tool by specifying a depth > 1

Summary by CodeRabbit

  • New Features

    • Added a new list_tree tool to browse repository trees with depth control, includeFiles/includeDirectories toggles, and a maxEntries limit.
  • Documentation

    • Added usage details, parameters, and examples for the new list_tree tool in docs, README, and changelog.
  • Bug Fixes

    • Improved repository-not-found message to include the repository name for clearer diagnostics.

This tool allows an agent to list files and directories from a
repository path. This can be used as a simple directory listing tool or
for a directory tree tool by specifying a depth > 1
@coderabbitai

coderabbitaiBot commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new MCP tool list_tree (client method, server tool, schemas, types, utils, and documentation) that lists repository files/directories with depth, includeFiles/includeDirectories, and maxEntries controls; returns sorted, deduplicated entries with truncation metadata.

Changes

Cohort / File(s)Summary
Documentation
docs/docs/features/mcp-server.mdx, packages/mcp/README.md, packages/mcp/CHANGELOG.md
Added docs and changelog entries describing the new list_tree tool and its parameters (repo, path, ref, depth, includeFiles, includeDirectories, maxEntries).
Client API
packages/mcp/src/client.ts
Added listTree(request: ListTreeApiRequest) which POSTs to /api/tree, sends JSON body and optional API key header, and validates/parses the response via new schema.
Server & Exports
packages/mcp/src/index.ts
Registered list_tree tool implementation on the MCP server (breadth-first traversal, depth/maxEntries bounds, deduplication, filtering, truncation) and exported related constants, types, and utilities. (Implementation appears inserted twice.)
Schemas / Constants
packages/mcp/src/schemas.ts
Added API and public schemas: listTreeApiRequestSchema, listTreeApiResponseSchema, listTreeRequestSchema, listTreeEntrySchema, listTreeResponseSchema, plus constants DEFAULT_TREE_DEPTH, MAX_TREE_DEPTH, DEFAULT_MAX_TREE_ENTRIES, MAX_MAX_TREE_ENTRIES.
Types
packages/mcp/src/types.ts
Exported new types mapped from schemas: ListTreeApiRequest, ListTreeApiResponse, ListTreeApiNode, ListTreeRequest, ListTreeEntry, ListTreeResponse.
Utilities
packages/mcp/src/utils.ts
Added normalizeTreePath, joinTreePath, buildTreeNodeIndex, and sortTreeEntries for path normalization, tree indexing, and stable sorting of entries.
Web API message
packages/web/src/features/git/getTreeApi.ts
Adjusted repository-not-found response to include a descriptive message: notFound(\Repository "${repoName}" not found.`)`.

Sequence Diagram

sequenceDiagram
participant Client as MCP Client
participant Server as MCP Server
participant TreeAPI as Tree API (/api/tree)
Client->>Server: list_tree(request: repo,path,ref,depth,filters,maxEntries)
Server->>Server: normalizeTreePath(path)
Server->>Server: enforceBounds(depth,maxEntries)
alt includeFiles OR includeDirectories
Server->>TreeAPI: POST /api/tree (breadth-first per depth)
TreeAPI-->>Server: tree nodes
Server->>Server: buildTreeNodeIndex(nodes)
Server->>Server: extract, dedupe, filter entries
Server->>Server: sortTreeEntries(entries)
Server->>Server: truncateWhenMaxReached()
else both filters false
Server->>Server: return empty entries
end
Server-->>Client: ListTreeResponse(entries,totalReturned,truncated)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(mcp): add list_tree tool' accurately and concisely summarizes the main change—adding a new list_tree tool to the MCP package.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

}
);

server.tool(

@brendan-kellambrendan-kellamFeb 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This approach makes sense for the apis that we expose, and I'm happy to ship this. For context,/api/tree is designed around the file tree viewer in the code browser, and is why we accept a list of paths (representing open directories) and return a tree spanning the union.

An alternative, potentially simpler, approach I was going to suggest is that we could use ls-tree with -r to recurse from a specified path. It does not accept a max depth unfortunately, so we would need to truncate the output to the specified depth. Perf is ok (because of #791), even on large repos like UnrealEngine:

> UnrealEngine git:(release) time git ls-tree -r HEAD . > /dev/null
git ls-tree -r HEAD . > /dev/null 0.10s user 0.02s system 94% cpu 0.125 total

Regardless of the approach, we will want to move this api surface into the server s.t., we can also add a list_tree tool to the Ask agent. I'll leave that for a follow-up PR that I can open later this week.

@brendan-kellam
brendan-kellam merged commit e4327ea into sourcebot-dev:mainFeb 10, 2026
9 of 10 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 10, 2026
@brianphillips
brianphillips deleted the mcp-list-tree branch February 10, 2026 21:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brianphillips@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(mcp): add list_tree tool - #870

Merged
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree
Feb 10, 2026
Merged

feat(mcp): add list_tree tool#870
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree

Conversation

@brianphillips

@brianphillipsbrianphillips commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

This PR adds a list_tree tool to the MCP package. This tool allows an agent to list files and directories from a repository path. This can be used as a simple directory listing tool or for a directory tree tool by specifying a depth > 1

Summary by CodeRabbit

  • New Features

    • Added a new list_tree tool to browse repository trees with depth control, includeFiles/includeDirectories toggles, and a maxEntries limit.
  • Documentation

    • Added usage details, parameters, and examples for the new list_tree tool in docs, README, and changelog.
  • Bug Fixes

    • Improved repository-not-found message to include the repository name for clearer diagnostics.

This tool allows an agent to list files and directories from a
repository path. This can be used as a simple directory listing tool or
for a directory tree tool by specifying a depth > 1
@coderabbitai

coderabbitaiBot commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new MCP tool list_tree (client method, server tool, schemas, types, utils, and documentation) that lists repository files/directories with depth, includeFiles/includeDirectories, and maxEntries controls; returns sorted, deduplicated entries with truncation metadata.

Changes

Cohort / File(s)Summary
Documentation
docs/docs/features/mcp-server.mdx, packages/mcp/README.md, packages/mcp/CHANGELOG.md
Added docs and changelog entries describing the new list_tree tool and its parameters (repo, path, ref, depth, includeFiles, includeDirectories, maxEntries).
Client API
packages/mcp/src/client.ts
Added listTree(request: ListTreeApiRequest) which POSTs to /api/tree, sends JSON body and optional API key header, and validates/parses the response via new schema.
Server & Exports
packages/mcp/src/index.ts
Registered list_tree tool implementation on the MCP server (breadth-first traversal, depth/maxEntries bounds, deduplication, filtering, truncation) and exported related constants, types, and utilities. (Implementation appears inserted twice.)
Schemas / Constants
packages/mcp/src/schemas.ts
Added API and public schemas: listTreeApiRequestSchema, listTreeApiResponseSchema, listTreeRequestSchema, listTreeEntrySchema, listTreeResponseSchema, plus constants DEFAULT_TREE_DEPTH, MAX_TREE_DEPTH, DEFAULT_MAX_TREE_ENTRIES, MAX_MAX_TREE_ENTRIES.
Types
packages/mcp/src/types.ts
Exported new types mapped from schemas: ListTreeApiRequest, ListTreeApiResponse, ListTreeApiNode, ListTreeRequest, ListTreeEntry, ListTreeResponse.
Utilities
packages/mcp/src/utils.ts
Added normalizeTreePath, joinTreePath, buildTreeNodeIndex, and sortTreeEntries for path normalization, tree indexing, and stable sorting of entries.
Web API message
packages/web/src/features/git/getTreeApi.ts
Adjusted repository-not-found response to include a descriptive message: notFound(\Repository "${repoName}" not found.`)`.

Sequence Diagram

sequenceDiagram
participant Client as MCP Client
participant Server as MCP Server
participant TreeAPI as Tree API (/api/tree)
Client->>Server: list_tree(request: repo,path,ref,depth,filters,maxEntries)
Server->>Server: normalizeTreePath(path)
Server->>Server: enforceBounds(depth,maxEntries)
alt includeFiles OR includeDirectories
Server->>TreeAPI: POST /api/tree (breadth-first per depth)
TreeAPI-->>Server: tree nodes
Server->>Server: buildTreeNodeIndex(nodes)
Server->>Server: extract, dedupe, filter entries
Server->>Server: sortTreeEntries(entries)
Server->>Server: truncateWhenMaxReached()
else both filters false
Server->>Server: return empty entries
end
Server-->>Client: ListTreeResponse(entries,totalReturned,truncated)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(mcp): add list_tree tool' accurately and concisely summarizes the main change—adding a new list_tree tool to the MCP package.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

}
);

server.tool(

@brendan-kellambrendan-kellamFeb 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This approach makes sense for the apis that we expose, and I'm happy to ship this. For context,/api/tree is designed around the file tree viewer in the code browser, and is why we accept a list of paths (representing open directories) and return a tree spanning the union.

An alternative, potentially simpler, approach I was going to suggest is that we could use ls-tree with -r to recurse from a specified path. It does not accept a max depth unfortunately, so we would need to truncate the output to the specified depth. Perf is ok (because of #791), even on large repos like UnrealEngine:

> UnrealEngine git:(release) time git ls-tree -r HEAD . > /dev/null
git ls-tree -r HEAD . > /dev/null 0.10s user 0.02s system 94% cpu 0.125 total

Regardless of the approach, we will want to move this api surface into the server s.t., we can also add a list_tree tool to the Ask agent. I'll leave that for a follow-up PR that I can open later this week.

@brendan-kellam
brendan-kellam merged commit e4327ea into sourcebot-dev:mainFeb 10, 2026
9 of 10 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 10, 2026
@brianphillips
brianphillips deleted the mcp-list-tree branch February 10, 2026 21:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brianphillips@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mcp): add list_tree tool - #870

Merged
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree
Feb 10, 2026
Merged

feat(mcp): add list_tree tool#870
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree

Conversation

@brianphillips

@brianphillipsbrianphillips commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

This PR adds a list_tree tool to the MCP package. This tool allows an agent to list files and directories from a repository path. This can be used as a simple directory listing tool or for a directory tree tool by specifying a depth > 1

Summary by CodeRabbit

  • New Features

    • Added a new list_tree tool to browse repository trees with depth control, includeFiles/includeDirectories toggles, and a maxEntries limit.
  • Documentation

    • Added usage details, parameters, and examples for the new list_tree tool in docs, README, and changelog.
  • Bug Fixes

    • Improved repository-not-found message to include the repository name for clearer diagnostics.

This tool allows an agent to list files and directories from a
repository path. This can be used as a simple directory listing tool or
for a directory tree tool by specifying a depth > 1
@coderabbitai

coderabbitaiBot commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new MCP tool list_tree (client method, server tool, schemas, types, utils, and documentation) that lists repository files/directories with depth, includeFiles/includeDirectories, and maxEntries controls; returns sorted, deduplicated entries with truncation metadata.

Changes

Cohort / File(s)Summary
Documentation
docs/docs/features/mcp-server.mdx, packages/mcp/README.md, packages/mcp/CHANGELOG.md
Added docs and changelog entries describing the new list_tree tool and its parameters (repo, path, ref, depth, includeFiles, includeDirectories, maxEntries).
Client API
packages/mcp/src/client.ts
Added listTree(request: ListTreeApiRequest) which POSTs to /api/tree, sends JSON body and optional API key header, and validates/parses the response via new schema.
Server & Exports
packages/mcp/src/index.ts
Registered list_tree tool implementation on the MCP server (breadth-first traversal, depth/maxEntries bounds, deduplication, filtering, truncation) and exported related constants, types, and utilities. (Implementation appears inserted twice.)
Schemas / Constants
packages/mcp/src/schemas.ts
Added API and public schemas: listTreeApiRequestSchema, listTreeApiResponseSchema, listTreeRequestSchema, listTreeEntrySchema, listTreeResponseSchema, plus constants DEFAULT_TREE_DEPTH, MAX_TREE_DEPTH, DEFAULT_MAX_TREE_ENTRIES, MAX_MAX_TREE_ENTRIES.
Types
packages/mcp/src/types.ts
Exported new types mapped from schemas: ListTreeApiRequest, ListTreeApiResponse, ListTreeApiNode, ListTreeRequest, ListTreeEntry, ListTreeResponse.
Utilities
packages/mcp/src/utils.ts
Added normalizeTreePath, joinTreePath, buildTreeNodeIndex, and sortTreeEntries for path normalization, tree indexing, and stable sorting of entries.
Web API message
packages/web/src/features/git/getTreeApi.ts
Adjusted repository-not-found response to include a descriptive message: notFound(\Repository "${repoName}" not found.`)`.

Sequence Diagram

sequenceDiagram
participant Client as MCP Client
participant Server as MCP Server
participant TreeAPI as Tree API (/api/tree)
Client->>Server: list_tree(request: repo,path,ref,depth,filters,maxEntries)
Server->>Server: normalizeTreePath(path)
Server->>Server: enforceBounds(depth,maxEntries)
alt includeFiles OR includeDirectories
Server->>TreeAPI: POST /api/tree (breadth-first per depth)
TreeAPI-->>Server: tree nodes
Server->>Server: buildTreeNodeIndex(nodes)
Server->>Server: extract, dedupe, filter entries
Server->>Server: sortTreeEntries(entries)
Server->>Server: truncateWhenMaxReached()
else both filters false
Server->>Server: return empty entries
end
Server-->>Client: ListTreeResponse(entries,totalReturned,truncated)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(mcp): add list_tree tool' accurately and concisely summarizes the main change—adding a new list_tree tool to the MCP package.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

}
);

server.tool(

@brendan-kellambrendan-kellamFeb 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This approach makes sense for the apis that we expose, and I'm happy to ship this. For context,/api/tree is designed around the file tree viewer in the code browser, and is why we accept a list of paths (representing open directories) and return a tree spanning the union.

An alternative, potentially simpler, approach I was going to suggest is that we could use ls-tree with -r to recurse from a specified path. It does not accept a max depth unfortunately, so we would need to truncate the output to the specified depth. Perf is ok (because of #791), even on large repos like UnrealEngine:

> UnrealEngine git:(release) time git ls-tree -r HEAD . > /dev/null
git ls-tree -r HEAD . > /dev/null 0.10s user 0.02s system 94% cpu 0.125 total

Regardless of the approach, we will want to move this api surface into the server s.t., we can also add a list_tree tool to the Ask agent. I'll leave that for a follow-up PR that I can open later this week.

@brendan-kellam
brendan-kellam merged commit e4327ea into sourcebot-dev:mainFeb 10, 2026
9 of 10 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 10, 2026
@brianphillips
brianphillips deleted the mcp-list-tree branch February 10, 2026 21:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brianphillips@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mcp): add list_tree tool - #870

Merged
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree
Feb 10, 2026
Merged

feat(mcp): add list_tree tool#870
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree

Conversation

@brianphillips

@brianphillipsbrianphillips commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

This PR adds a list_tree tool to the MCP package. This tool allows an agent to list files and directories from a repository path. This can be used as a simple directory listing tool or for a directory tree tool by specifying a depth > 1

Summary by CodeRabbit

  • New Features

    • Added a new list_tree tool to browse repository trees with depth control, includeFiles/includeDirectories toggles, and a maxEntries limit.
  • Documentation

    • Added usage details, parameters, and examples for the new list_tree tool in docs, README, and changelog.
  • Bug Fixes

    • Improved repository-not-found message to include the repository name for clearer diagnostics.

This tool allows an agent to list files and directories from a
repository path. This can be used as a simple directory listing tool or
for a directory tree tool by specifying a depth > 1
@coderabbitai

coderabbitaiBot commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new MCP tool list_tree (client method, server tool, schemas, types, utils, and documentation) that lists repository files/directories with depth, includeFiles/includeDirectories, and maxEntries controls; returns sorted, deduplicated entries with truncation metadata.

Changes

Cohort / File(s)Summary
Documentation
docs/docs/features/mcp-server.mdx, packages/mcp/README.md, packages/mcp/CHANGELOG.md
Added docs and changelog entries describing the new list_tree tool and its parameters (repo, path, ref, depth, includeFiles, includeDirectories, maxEntries).
Client API
packages/mcp/src/client.ts
Added listTree(request: ListTreeApiRequest) which POSTs to /api/tree, sends JSON body and optional API key header, and validates/parses the response via new schema.
Server & Exports
packages/mcp/src/index.ts
Registered list_tree tool implementation on the MCP server (breadth-first traversal, depth/maxEntries bounds, deduplication, filtering, truncation) and exported related constants, types, and utilities. (Implementation appears inserted twice.)
Schemas / Constants
packages/mcp/src/schemas.ts
Added API and public schemas: listTreeApiRequestSchema, listTreeApiResponseSchema, listTreeRequestSchema, listTreeEntrySchema, listTreeResponseSchema, plus constants DEFAULT_TREE_DEPTH, MAX_TREE_DEPTH, DEFAULT_MAX_TREE_ENTRIES, MAX_MAX_TREE_ENTRIES.
Types
packages/mcp/src/types.ts
Exported new types mapped from schemas: ListTreeApiRequest, ListTreeApiResponse, ListTreeApiNode, ListTreeRequest, ListTreeEntry, ListTreeResponse.
Utilities
packages/mcp/src/utils.ts
Added normalizeTreePath, joinTreePath, buildTreeNodeIndex, and sortTreeEntries for path normalization, tree indexing, and stable sorting of entries.
Web API message
packages/web/src/features/git/getTreeApi.ts
Adjusted repository-not-found response to include a descriptive message: notFound(\Repository "${repoName}" not found.`)`.

Sequence Diagram

sequenceDiagram
participant Client as MCP Client
participant Server as MCP Server
participant TreeAPI as Tree API (/api/tree)
Client->>Server: list_tree(request: repo,path,ref,depth,filters,maxEntries)
Server->>Server: normalizeTreePath(path)
Server->>Server: enforceBounds(depth,maxEntries)
alt includeFiles OR includeDirectories
Server->>TreeAPI: POST /api/tree (breadth-first per depth)
TreeAPI-->>Server: tree nodes
Server->>Server: buildTreeNodeIndex(nodes)
Server->>Server: extract, dedupe, filter entries
Server->>Server: sortTreeEntries(entries)
Server->>Server: truncateWhenMaxReached()
else both filters false
Server->>Server: return empty entries
end
Server-->>Client: ListTreeResponse(entries,totalReturned,truncated)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(mcp): add list_tree tool' accurately and concisely summarizes the main change—adding a new list_tree tool to the MCP package.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

}
);

server.tool(

@brendan-kellambrendan-kellamFeb 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This approach makes sense for the apis that we expose, and I'm happy to ship this. For context,/api/tree is designed around the file tree viewer in the code browser, and is why we accept a list of paths (representing open directories) and return a tree spanning the union.

An alternative, potentially simpler, approach I was going to suggest is that we could use ls-tree with -r to recurse from a specified path. It does not accept a max depth unfortunately, so we would need to truncate the output to the specified depth. Perf is ok (because of #791), even on large repos like UnrealEngine:

> UnrealEngine git:(release) time git ls-tree -r HEAD . > /dev/null
git ls-tree -r HEAD . > /dev/null 0.10s user 0.02s system 94% cpu 0.125 total

Regardless of the approach, we will want to move this api surface into the server s.t., we can also add a list_tree tool to the Ask agent. I'll leave that for a follow-up PR that I can open later this week.

@brendan-kellam
brendan-kellam merged commit e4327ea into sourcebot-dev:mainFeb 10, 2026
9 of 10 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 10, 2026
@brianphillips
brianphillips deleted the mcp-list-tree branch February 10, 2026 21:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brianphillips@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(mcp): add list_tree tool - #870

Merged
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree
Feb 10, 2026
Merged

feat(mcp): add list_tree tool#870
brendan-kellam merged 4 commits into
sourcebot-dev:mainfrom
brianphillips:mcp-list-tree

Conversation

@brianphillips

@brianphillipsbrianphillips commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

This PR adds a list_tree tool to the MCP package. This tool allows an agent to list files and directories from a repository path. This can be used as a simple directory listing tool or for a directory tree tool by specifying a depth > 1

Summary by CodeRabbit

  • New Features

    • Added a new list_tree tool to browse repository trees with depth control, includeFiles/includeDirectories toggles, and a maxEntries limit.
  • Documentation

    • Added usage details, parameters, and examples for the new list_tree tool in docs, README, and changelog.
  • Bug Fixes

    • Improved repository-not-found message to include the repository name for clearer diagnostics.

This tool allows an agent to list files and directories from a
repository path. This can be used as a simple directory listing tool or
for a directory tree tool by specifying a depth > 1
@coderabbitai

coderabbitaiBot commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a new MCP tool list_tree (client method, server tool, schemas, types, utils, and documentation) that lists repository files/directories with depth, includeFiles/includeDirectories, and maxEntries controls; returns sorted, deduplicated entries with truncation metadata.

Changes

Cohort / File(s)Summary
Documentation
docs/docs/features/mcp-server.mdx, packages/mcp/README.md, packages/mcp/CHANGELOG.md
Added docs and changelog entries describing the new list_tree tool and its parameters (repo, path, ref, depth, includeFiles, includeDirectories, maxEntries).
Client API
packages/mcp/src/client.ts
Added listTree(request: ListTreeApiRequest) which POSTs to /api/tree, sends JSON body and optional API key header, and validates/parses the response via new schema.
Server & Exports
packages/mcp/src/index.ts
Registered list_tree tool implementation on the MCP server (breadth-first traversal, depth/maxEntries bounds, deduplication, filtering, truncation) and exported related constants, types, and utilities. (Implementation appears inserted twice.)
Schemas / Constants
packages/mcp/src/schemas.ts
Added API and public schemas: listTreeApiRequestSchema, listTreeApiResponseSchema, listTreeRequestSchema, listTreeEntrySchema, listTreeResponseSchema, plus constants DEFAULT_TREE_DEPTH, MAX_TREE_DEPTH, DEFAULT_MAX_TREE_ENTRIES, MAX_MAX_TREE_ENTRIES.
Types
packages/mcp/src/types.ts
Exported new types mapped from schemas: ListTreeApiRequest, ListTreeApiResponse, ListTreeApiNode, ListTreeRequest, ListTreeEntry, ListTreeResponse.
Utilities
packages/mcp/src/utils.ts
Added normalizeTreePath, joinTreePath, buildTreeNodeIndex, and sortTreeEntries for path normalization, tree indexing, and stable sorting of entries.
Web API message
packages/web/src/features/git/getTreeApi.ts
Adjusted repository-not-found response to include a descriptive message: notFound(\Repository "${repoName}" not found.`)`.

Sequence Diagram

sequenceDiagram
participant Client as MCP Client
participant Server as MCP Server
participant TreeAPI as Tree API (/api/tree)
Client->>Server: list_tree(request: repo,path,ref,depth,filters,maxEntries)
Server->>Server: normalizeTreePath(path)
Server->>Server: enforceBounds(depth,maxEntries)
alt includeFiles OR includeDirectories
Server->>TreeAPI: POST /api/tree (breadth-first per depth)
TreeAPI-->>Server: tree nodes
Server->>Server: buildTreeNodeIndex(nodes)
Server->>Server: extract, dedupe, filter entries
Server->>Server: sortTreeEntries(entries)
Server->>Server: truncateWhenMaxReached()
else both filters false
Server->>Server: return empty entries
end
Server-->>Client: ListTreeResponse(entries,totalReturned,truncated)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(mcp): add list_tree tool' accurately and concisely summarizes the main change—adding a new list_tree tool to the MCP package.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

}
);

server.tool(

@brendan-kellambrendan-kellamFeb 10, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This approach makes sense for the apis that we expose, and I'm happy to ship this. For context,/api/tree is designed around the file tree viewer in the code browser, and is why we accept a list of paths (representing open directories) and return a tree spanning the union.

An alternative, potentially simpler, approach I was going to suggest is that we could use ls-tree with -r to recurse from a specified path. It does not accept a max depth unfortunately, so we would need to truncate the output to the specified depth. Perf is ok (because of #791), even on large repos like UnrealEngine:

> UnrealEngine git:(release) time git ls-tree -r HEAD . > /dev/null
git ls-tree -r HEAD . > /dev/null 0.10s user 0.02s system 94% cpu 0.125 total

Regardless of the approach, we will want to move this api surface into the server s.t., we can also add a list_tree tool to the Ask agent. I'll leave that for a follow-up PR that I can open later this week.

@brendan-kellam
brendan-kellam merged commit e4327ea into sourcebot-dev:mainFeb 10, 2026
9 of 10 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Feb 10, 2026
@brianphillips
brianphillips deleted the mcp-list-tree branch February 10, 2026 21:37
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@brianphillips@brendan-kellam