feat(mcp): hide ask_codebase tool when no LLM providers configured - #1018

Merged
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc
Mar 20, 2026
Merged

feat(mcp): hide ask_codebase tool when no LLM providers configured#1018
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc

Conversation

@msukkari

@msukkarimsukkari commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR hides the ask_codebase tool in MCP when no language model providers are configured. Previously, the tool was always visible but would return an error when invoked without configured models. Now the tool is simply not registered/visible when there are no models configured.

Changes

Web MCP Server (packages/web/src/features/mcp/server.ts)

  • Made createMcpServer() async to support checking for configured language models
  • Added check for hasLanguageModels before registering the ask_codebase tool
  • Tool is now conditionally registered only when at least one language model is configured

MCP Route Handler (packages/web/src/app/api/(server)/mcp/route.ts)

  • Updated to await the now-async createMcpServer() function

AGENTS.md

  • Added note about packages/mcp being deprecated (it should not be modified)

Analysis: Making createMcpServer Async

Confirmed that making createMcpServer async is safe:

  • The call site is already in an async context (withOptionalAuthV2 callback)
  • Only adds minimal latency (~1-5ms) for config file read on session creation
  • No race conditions introduced - session creation is atomic within a request
  • Error handling is proper - config load failures gracefully return empty models array

Testing

Verified the feature works correctly by testing the MCP API endpoint:

Without models configured (6 tools visible):

  • list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase is NOT visible

With models configured (7 tools visible):

  • ask_codebase, list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase IS visible

All existing tests pass:

  • yarn test - 617 tests passing
  • yarn workspace @sourcebot/web lint - No errors
  • yarn workspace @sourcebot/web build - Successful

Fixes SOU-718

Linear Issue: SOU-718

Open in WebOpen in Cursor

Summary by CodeRabbit

  • Changed

    • The ask_codebase MCP tool is now hidden when no language model providers are configured, ensuring it's only available when applicable.
  • Documentation

    • Added deprecation notice for obsolete package; MCP functionality is handled elsewhere.

- Modified web MCP server to check configured language models before
registering the ask_codebase tool
- Made createMcpServer() async to support awaiting the config check
- Updated standalone MCP package to check /api/models before registering
ask_codebase tool
- Tool is now only visible when at least one language model is configured
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 16661059-74a2-441a-97f5-63feb05b5a09

📥 Commits

Reviewing files that changed from the base of the PR and between 6b52d37 and cbf8f25.

📒 Files selected for processing (4)
  • AGENTS.md
  • CHANGELOG.md
  • packages/web/src/app/api/(server)/mcp/route.ts
  • packages/web/src/features/mcp/server.ts

Walkthrough

This change refactors MCP server initialization to be asynchronous and conditionally registers the ask_codebase tool only when language model providers are configured. The MCP route handler is updated to await async server creation. Documentation is updated to note the deprecation of packages/mcp package and changelog entry for the conditional tool visibility.

Changes

Cohort / File(s)Summary
Documentation
AGENTS.md, CHANGELOG.md
Added deprecation notice for packages/mcp package and changelog entry noting ask_codebase tool is now hidden when no language models are configured.
MCP Server Implementation
packages/web/src/features/mcp/server.ts
Changed createMcpServer from synchronous to asynchronous function, added preflight check for configured language models, and conditionally register ask_codebase tool only when language models are available.
MCP Route Handler
packages/web/src/app/api/(server)/mcp/route.ts
Updated POST handler to await the now-asynchronous createMcpServer() call before using the server instance.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as Route Handler
participant ServerInit as Server Init
participant LMService as LM Service
participant MCPServer as MCP Server
Client->>RouteHandler: POST /mcp (new session)
RouteHandler->>ServerInit: await createMcpServer()
ServerInit->>LMService: getConfiguredLanguageModels()
LMService-->>ServerInit: models list
ServerInit->>MCPServer: new McpServer()
alt hasLanguageModels = true
ServerInit->>MCPServer: register ask_codebase tool
else hasLanguageModels = false
ServerInit->>MCPServer: skip ask_codebase tool
end
MCPServer-->>ServerInit: server instance
ServerInit-->>RouteHandler: Promise resolved
RouteHandler->>MCPServer: mcpServer.connect(transport)
MCPServer-->>Client: connection established
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/SOU-718-ask-codebase-tool-visibility-26fc

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.

cursoragentand others added 3 commits March 20, 2026 02:21
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
The packages/mcp package is deprecated and should not be modified.
Reverted the conditional ask_codebase registration changes from this package.
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@msukkari
msukkari marked this pull request as ready for review March 20, 2026 17:20
@msukkari
msukkari merged commit 48fb8b1 into mainMar 20, 2026
6 checks passed
@msukkari
msukkari deleted the cursor/SOU-718-ask-codebase-tool-visibility-26fc branch March 20, 2026 17:22
@github-actionsgithub-actionsBot mentioned this pull request Mar 20, 2026
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

@msukkari@cursoragent
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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): hide ask_codebase tool when no LLM providers configured - #1018

Merged
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc
Mar 20, 2026
Merged

feat(mcp): hide ask_codebase tool when no LLM providers configured#1018
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc

Conversation

@msukkari

@msukkarimsukkari commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR hides the ask_codebase tool in MCP when no language model providers are configured. Previously, the tool was always visible but would return an error when invoked without configured models. Now the tool is simply not registered/visible when there are no models configured.

Changes

Web MCP Server (packages/web/src/features/mcp/server.ts)

  • Made createMcpServer() async to support checking for configured language models
  • Added check for hasLanguageModels before registering the ask_codebase tool
  • Tool is now conditionally registered only when at least one language model is configured

MCP Route Handler (packages/web/src/app/api/(server)/mcp/route.ts)

  • Updated to await the now-async createMcpServer() function

AGENTS.md

  • Added note about packages/mcp being deprecated (it should not be modified)

Analysis: Making createMcpServer Async

Confirmed that making createMcpServer async is safe:

  • The call site is already in an async context (withOptionalAuthV2 callback)
  • Only adds minimal latency (~1-5ms) for config file read on session creation
  • No race conditions introduced - session creation is atomic within a request
  • Error handling is proper - config load failures gracefully return empty models array

Testing

Verified the feature works correctly by testing the MCP API endpoint:

Without models configured (6 tools visible):

  • list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase is NOT visible

With models configured (7 tools visible):

  • ask_codebase, list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase IS visible

All existing tests pass:

  • yarn test - 617 tests passing
  • yarn workspace @sourcebot/web lint - No errors
  • yarn workspace @sourcebot/web build - Successful

Fixes SOU-718

Linear Issue: SOU-718

Open in WebOpen in Cursor

Summary by CodeRabbit

  • Changed

    • The ask_codebase MCP tool is now hidden when no language model providers are configured, ensuring it's only available when applicable.
  • Documentation

    • Added deprecation notice for obsolete package; MCP functionality is handled elsewhere.

- Modified web MCP server to check configured language models before
registering the ask_codebase tool
- Made createMcpServer() async to support awaiting the config check
- Updated standalone MCP package to check /api/models before registering
ask_codebase tool
- Tool is now only visible when at least one language model is configured
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 16661059-74a2-441a-97f5-63feb05b5a09

📥 Commits

Reviewing files that changed from the base of the PR and between 6b52d37 and cbf8f25.

📒 Files selected for processing (4)
  • AGENTS.md
  • CHANGELOG.md
  • packages/web/src/app/api/(server)/mcp/route.ts
  • packages/web/src/features/mcp/server.ts

Walkthrough

This change refactors MCP server initialization to be asynchronous and conditionally registers the ask_codebase tool only when language model providers are configured. The MCP route handler is updated to await async server creation. Documentation is updated to note the deprecation of packages/mcp package and changelog entry for the conditional tool visibility.

Changes

Cohort / File(s)Summary
Documentation
AGENTS.md, CHANGELOG.md
Added deprecation notice for packages/mcp package and changelog entry noting ask_codebase tool is now hidden when no language models are configured.
MCP Server Implementation
packages/web/src/features/mcp/server.ts
Changed createMcpServer from synchronous to asynchronous function, added preflight check for configured language models, and conditionally register ask_codebase tool only when language models are available.
MCP Route Handler
packages/web/src/app/api/(server)/mcp/route.ts
Updated POST handler to await the now-asynchronous createMcpServer() call before using the server instance.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as Route Handler
participant ServerInit as Server Init
participant LMService as LM Service
participant MCPServer as MCP Server
Client->>RouteHandler: POST /mcp (new session)
RouteHandler->>ServerInit: await createMcpServer()
ServerInit->>LMService: getConfiguredLanguageModels()
LMService-->>ServerInit: models list
ServerInit->>MCPServer: new McpServer()
alt hasLanguageModels = true
ServerInit->>MCPServer: register ask_codebase tool
else hasLanguageModels = false
ServerInit->>MCPServer: skip ask_codebase tool
end
MCPServer-->>ServerInit: server instance
ServerInit-->>RouteHandler: Promise resolved
RouteHandler->>MCPServer: mcpServer.connect(transport)
MCPServer-->>Client: connection established
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/SOU-718-ask-codebase-tool-visibility-26fc

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.

cursoragentand others added 3 commits March 20, 2026 02:21
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
The packages/mcp package is deprecated and should not be modified.
Reverted the conditional ask_codebase registration changes from this package.
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@msukkari
msukkari marked this pull request as ready for review March 20, 2026 17:20
@msukkari
msukkari merged commit 48fb8b1 into mainMar 20, 2026
6 checks passed
@msukkari
msukkari deleted the cursor/SOU-718-ask-codebase-tool-visibility-26fc branch March 20, 2026 17:22
@github-actionsgithub-actionsBot mentioned this pull request Mar 20, 2026
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

@msukkari@cursoragent
, '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): hide ask_codebase tool when no LLM providers configured - #1018

Merged
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc
Mar 20, 2026
Merged

feat(mcp): hide ask_codebase tool when no LLM providers configured#1018
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc

Conversation

@msukkari

@msukkarimsukkari commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR hides the ask_codebase tool in MCP when no language model providers are configured. Previously, the tool was always visible but would return an error when invoked without configured models. Now the tool is simply not registered/visible when there are no models configured.

Changes

Web MCP Server (packages/web/src/features/mcp/server.ts)

  • Made createMcpServer() async to support checking for configured language models
  • Added check for hasLanguageModels before registering the ask_codebase tool
  • Tool is now conditionally registered only when at least one language model is configured

MCP Route Handler (packages/web/src/app/api/(server)/mcp/route.ts)

  • Updated to await the now-async createMcpServer() function

AGENTS.md

  • Added note about packages/mcp being deprecated (it should not be modified)

Analysis: Making createMcpServer Async

Confirmed that making createMcpServer async is safe:

  • The call site is already in an async context (withOptionalAuthV2 callback)
  • Only adds minimal latency (~1-5ms) for config file read on session creation
  • No race conditions introduced - session creation is atomic within a request
  • Error handling is proper - config load failures gracefully return empty models array

Testing

Verified the feature works correctly by testing the MCP API endpoint:

Without models configured (6 tools visible):

  • list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase is NOT visible

With models configured (7 tools visible):

  • ask_codebase, list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase IS visible

All existing tests pass:

  • yarn test - 617 tests passing
  • yarn workspace @sourcebot/web lint - No errors
  • yarn workspace @sourcebot/web build - Successful

Fixes SOU-718

Linear Issue: SOU-718

Open in WebOpen in Cursor

Summary by CodeRabbit

  • Changed

    • The ask_codebase MCP tool is now hidden when no language model providers are configured, ensuring it's only available when applicable.
  • Documentation

    • Added deprecation notice for obsolete package; MCP functionality is handled elsewhere.

- Modified web MCP server to check configured language models before
registering the ask_codebase tool
- Made createMcpServer() async to support awaiting the config check
- Updated standalone MCP package to check /api/models before registering
ask_codebase tool
- Tool is now only visible when at least one language model is configured
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 16661059-74a2-441a-97f5-63feb05b5a09

📥 Commits

Reviewing files that changed from the base of the PR and between 6b52d37 and cbf8f25.

📒 Files selected for processing (4)
  • AGENTS.md
  • CHANGELOG.md
  • packages/web/src/app/api/(server)/mcp/route.ts
  • packages/web/src/features/mcp/server.ts

Walkthrough

This change refactors MCP server initialization to be asynchronous and conditionally registers the ask_codebase tool only when language model providers are configured. The MCP route handler is updated to await async server creation. Documentation is updated to note the deprecation of packages/mcp package and changelog entry for the conditional tool visibility.

Changes

Cohort / File(s)Summary
Documentation
AGENTS.md, CHANGELOG.md
Added deprecation notice for packages/mcp package and changelog entry noting ask_codebase tool is now hidden when no language models are configured.
MCP Server Implementation
packages/web/src/features/mcp/server.ts
Changed createMcpServer from synchronous to asynchronous function, added preflight check for configured language models, and conditionally register ask_codebase tool only when language models are available.
MCP Route Handler
packages/web/src/app/api/(server)/mcp/route.ts
Updated POST handler to await the now-asynchronous createMcpServer() call before using the server instance.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as Route Handler
participant ServerInit as Server Init
participant LMService as LM Service
participant MCPServer as MCP Server
Client->>RouteHandler: POST /mcp (new session)
RouteHandler->>ServerInit: await createMcpServer()
ServerInit->>LMService: getConfiguredLanguageModels()
LMService-->>ServerInit: models list
ServerInit->>MCPServer: new McpServer()
alt hasLanguageModels = true
ServerInit->>MCPServer: register ask_codebase tool
else hasLanguageModels = false
ServerInit->>MCPServer: skip ask_codebase tool
end
MCPServer-->>ServerInit: server instance
ServerInit-->>RouteHandler: Promise resolved
RouteHandler->>MCPServer: mcpServer.connect(transport)
MCPServer-->>Client: connection established
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/SOU-718-ask-codebase-tool-visibility-26fc

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.

cursoragentand others added 3 commits March 20, 2026 02:21
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
The packages/mcp package is deprecated and should not be modified.
Reverted the conditional ask_codebase registration changes from this package.
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@msukkari
msukkari marked this pull request as ready for review March 20, 2026 17:20
@msukkari
msukkari merged commit 48fb8b1 into mainMar 20, 2026
6 checks passed
@msukkari
msukkari deleted the cursor/SOU-718-ask-codebase-tool-visibility-26fc branch March 20, 2026 17:22
@github-actionsgithub-actionsBot mentioned this pull request Mar 20, 2026
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

@msukkari@cursoragent
, '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 \u003e 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): hide ask_codebase tool when no LLM providers configured - #1018

Merged
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc
Mar 20, 2026
Merged

feat(mcp): hide ask_codebase tool when no LLM providers configured#1018
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc

Conversation

@msukkari

@msukkarimsukkari commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR hides the ask_codebase tool in MCP when no language model providers are configured. Previously, the tool was always visible but would return an error when invoked without configured models. Now the tool is simply not registered/visible when there are no models configured.

Changes

Web MCP Server (packages/web/src/features/mcp/server.ts)

  • Made createMcpServer() async to support checking for configured language models
  • Added check for hasLanguageModels before registering the ask_codebase tool
  • Tool is now conditionally registered only when at least one language model is configured

MCP Route Handler (packages/web/src/app/api/(server)/mcp/route.ts)

  • Updated to await the now-async createMcpServer() function

AGENTS.md

  • Added note about packages/mcp being deprecated (it should not be modified)

Analysis: Making createMcpServer Async

Confirmed that making createMcpServer async is safe:

  • The call site is already in an async context (withOptionalAuthV2 callback)
  • Only adds minimal latency (~1-5ms) for config file read on session creation
  • No race conditions introduced - session creation is atomic within a request
  • Error handling is proper - config load failures gracefully return empty models array

Testing

Verified the feature works correctly by testing the MCP API endpoint:

Without models configured (6 tools visible):

  • list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase is NOT visible

With models configured (7 tools visible):

  • ask_codebase, list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase IS visible

All existing tests pass:

  • yarn test - 617 tests passing
  • yarn workspace @sourcebot/web lint - No errors
  • yarn workspace @sourcebot/web build - Successful

Fixes SOU-718

Linear Issue: SOU-718

Open in WebOpen in Cursor

Summary by CodeRabbit

  • Changed

    • The ask_codebase MCP tool is now hidden when no language model providers are configured, ensuring it's only available when applicable.
  • Documentation

    • Added deprecation notice for obsolete package; MCP functionality is handled elsewhere.

- Modified web MCP server to check configured language models before
registering the ask_codebase tool
- Made createMcpServer() async to support awaiting the config check
- Updated standalone MCP package to check /api/models before registering
ask_codebase tool
- Tool is now only visible when at least one language model is configured
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 16661059-74a2-441a-97f5-63feb05b5a09

📥 Commits

Reviewing files that changed from the base of the PR and between 6b52d37 and cbf8f25.

📒 Files selected for processing (4)
  • AGENTS.md
  • CHANGELOG.md
  • packages/web/src/app/api/(server)/mcp/route.ts
  • packages/web/src/features/mcp/server.ts

Walkthrough

This change refactors MCP server initialization to be asynchronous and conditionally registers the ask_codebase tool only when language model providers are configured. The MCP route handler is updated to await async server creation. Documentation is updated to note the deprecation of packages/mcp package and changelog entry for the conditional tool visibility.

Changes

Cohort / File(s)Summary
Documentation
AGENTS.md, CHANGELOG.md
Added deprecation notice for packages/mcp package and changelog entry noting ask_codebase tool is now hidden when no language models are configured.
MCP Server Implementation
packages/web/src/features/mcp/server.ts
Changed createMcpServer from synchronous to asynchronous function, added preflight check for configured language models, and conditionally register ask_codebase tool only when language models are available.
MCP Route Handler
packages/web/src/app/api/(server)/mcp/route.ts
Updated POST handler to await the now-asynchronous createMcpServer() call before using the server instance.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as Route Handler
participant ServerInit as Server Init
participant LMService as LM Service
participant MCPServer as MCP Server
Client->>RouteHandler: POST /mcp (new session)
RouteHandler->>ServerInit: await createMcpServer()
ServerInit->>LMService: getConfiguredLanguageModels()
LMService-->>ServerInit: models list
ServerInit->>MCPServer: new McpServer()
alt hasLanguageModels = true
ServerInit->>MCPServer: register ask_codebase tool
else hasLanguageModels = false
ServerInit->>MCPServer: skip ask_codebase tool
end
MCPServer-->>ServerInit: server instance
ServerInit-->>RouteHandler: Promise resolved
RouteHandler->>MCPServer: mcpServer.connect(transport)
MCPServer-->>Client: connection established
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/SOU-718-ask-codebase-tool-visibility-26fc

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.

cursoragentand others added 3 commits March 20, 2026 02:21
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
The packages/mcp package is deprecated and should not be modified.
Reverted the conditional ask_codebase registration changes from this package.
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@msukkari
msukkari marked this pull request as ready for review March 20, 2026 17:20
@msukkari
msukkari merged commit 48fb8b1 into mainMar 20, 2026
6 checks passed
@msukkari
msukkari deleted the cursor/SOU-718-ask-codebase-tool-visibility-26fc branch March 20, 2026 17:22
@github-actionsgithub-actionsBot mentioned this pull request Mar 20, 2026
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

@msukkari@cursoragent
, '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): hide ask_codebase tool when no LLM providers configured - #1018

Merged
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc
Mar 20, 2026
Merged

feat(mcp): hide ask_codebase tool when no LLM providers configured#1018
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc

Conversation

@msukkari

@msukkarimsukkari commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR hides the ask_codebase tool in MCP when no language model providers are configured. Previously, the tool was always visible but would return an error when invoked without configured models. Now the tool is simply not registered/visible when there are no models configured.

Changes

Web MCP Server (packages/web/src/features/mcp/server.ts)

  • Made createMcpServer() async to support checking for configured language models
  • Added check for hasLanguageModels before registering the ask_codebase tool
  • Tool is now conditionally registered only when at least one language model is configured

MCP Route Handler (packages/web/src/app/api/(server)/mcp/route.ts)

  • Updated to await the now-async createMcpServer() function

AGENTS.md

  • Added note about packages/mcp being deprecated (it should not be modified)

Analysis: Making createMcpServer Async

Confirmed that making createMcpServer async is safe:

  • The call site is already in an async context (withOptionalAuthV2 callback)
  • Only adds minimal latency (~1-5ms) for config file read on session creation
  • No race conditions introduced - session creation is atomic within a request
  • Error handling is proper - config load failures gracefully return empty models array

Testing

Verified the feature works correctly by testing the MCP API endpoint:

Without models configured (6 tools visible):

  • list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase is NOT visible

With models configured (7 tools visible):

  • ask_codebase, list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase IS visible

All existing tests pass:

  • yarn test - 617 tests passing
  • yarn workspace @sourcebot/web lint - No errors
  • yarn workspace @sourcebot/web build - Successful

Fixes SOU-718

Linear Issue: SOU-718

Open in WebOpen in Cursor

Summary by CodeRabbit

  • Changed

    • The ask_codebase MCP tool is now hidden when no language model providers are configured, ensuring it's only available when applicable.
  • Documentation

    • Added deprecation notice for obsolete package; MCP functionality is handled elsewhere.

- Modified web MCP server to check configured language models before
registering the ask_codebase tool
- Made createMcpServer() async to support awaiting the config check
- Updated standalone MCP package to check /api/models before registering
ask_codebase tool
- Tool is now only visible when at least one language model is configured
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 16661059-74a2-441a-97f5-63feb05b5a09

📥 Commits

Reviewing files that changed from the base of the PR and between 6b52d37 and cbf8f25.

📒 Files selected for processing (4)
  • AGENTS.md
  • CHANGELOG.md
  • packages/web/src/app/api/(server)/mcp/route.ts
  • packages/web/src/features/mcp/server.ts

Walkthrough

This change refactors MCP server initialization to be asynchronous and conditionally registers the ask_codebase tool only when language model providers are configured. The MCP route handler is updated to await async server creation. Documentation is updated to note the deprecation of packages/mcp package and changelog entry for the conditional tool visibility.

Changes

Cohort / File(s)Summary
Documentation
AGENTS.md, CHANGELOG.md
Added deprecation notice for packages/mcp package and changelog entry noting ask_codebase tool is now hidden when no language models are configured.
MCP Server Implementation
packages/web/src/features/mcp/server.ts
Changed createMcpServer from synchronous to asynchronous function, added preflight check for configured language models, and conditionally register ask_codebase tool only when language models are available.
MCP Route Handler
packages/web/src/app/api/(server)/mcp/route.ts
Updated POST handler to await the now-asynchronous createMcpServer() call before using the server instance.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as Route Handler
participant ServerInit as Server Init
participant LMService as LM Service
participant MCPServer as MCP Server
Client->>RouteHandler: POST /mcp (new session)
RouteHandler->>ServerInit: await createMcpServer()
ServerInit->>LMService: getConfiguredLanguageModels()
LMService-->>ServerInit: models list
ServerInit->>MCPServer: new McpServer()
alt hasLanguageModels = true
ServerInit->>MCPServer: register ask_codebase tool
else hasLanguageModels = false
ServerInit->>MCPServer: skip ask_codebase tool
end
MCPServer-->>ServerInit: server instance
ServerInit-->>RouteHandler: Promise resolved
RouteHandler->>MCPServer: mcpServer.connect(transport)
MCPServer-->>Client: connection established
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/SOU-718-ask-codebase-tool-visibility-26fc

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.

cursoragentand others added 3 commits March 20, 2026 02:21
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
The packages/mcp package is deprecated and should not be modified.
Reverted the conditional ask_codebase registration changes from this package.
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@msukkari
msukkari marked this pull request as ready for review March 20, 2026 17:20
@msukkari
msukkari merged commit 48fb8b1 into mainMar 20, 2026
6 checks passed
@msukkari
msukkari deleted the cursor/SOU-718-ask-codebase-tool-visibility-26fc branch March 20, 2026 17:22
@github-actionsgithub-actionsBot mentioned this pull request Mar 20, 2026
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

@msukkari@cursoragent
, '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): hide ask_codebase tool when no LLM providers configured - #1018

Merged
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc
Mar 20, 2026
Merged

feat(mcp): hide ask_codebase tool when no LLM providers configured#1018
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc

Conversation

@msukkari

@msukkarimsukkari commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR hides the ask_codebase tool in MCP when no language model providers are configured. Previously, the tool was always visible but would return an error when invoked without configured models. Now the tool is simply not registered/visible when there are no models configured.

Changes

Web MCP Server (packages/web/src/features/mcp/server.ts)

  • Made createMcpServer() async to support checking for configured language models
  • Added check for hasLanguageModels before registering the ask_codebase tool
  • Tool is now conditionally registered only when at least one language model is configured

MCP Route Handler (packages/web/src/app/api/(server)/mcp/route.ts)

  • Updated to await the now-async createMcpServer() function

AGENTS.md

  • Added note about packages/mcp being deprecated (it should not be modified)

Analysis: Making createMcpServer Async

Confirmed that making createMcpServer async is safe:

  • The call site is already in an async context (withOptionalAuthV2 callback)
  • Only adds minimal latency (~1-5ms) for config file read on session creation
  • No race conditions introduced - session creation is atomic within a request
  • Error handling is proper - config load failures gracefully return empty models array

Testing

Verified the feature works correctly by testing the MCP API endpoint:

Without models configured (6 tools visible):

  • list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase is NOT visible

With models configured (7 tools visible):

  • ask_codebase, list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase IS visible

All existing tests pass:

  • yarn test - 617 tests passing
  • yarn workspace @sourcebot/web lint - No errors
  • yarn workspace @sourcebot/web build - Successful

Fixes SOU-718

Linear Issue: SOU-718

Open in WebOpen in Cursor

Summary by CodeRabbit

  • Changed

    • The ask_codebase MCP tool is now hidden when no language model providers are configured, ensuring it's only available when applicable.
  • Documentation

    • Added deprecation notice for obsolete package; MCP functionality is handled elsewhere.

- Modified web MCP server to check configured language models before
registering the ask_codebase tool
- Made createMcpServer() async to support awaiting the config check
- Updated standalone MCP package to check /api/models before registering
ask_codebase tool
- Tool is now only visible when at least one language model is configured
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 16661059-74a2-441a-97f5-63feb05b5a09

📥 Commits

Reviewing files that changed from the base of the PR and between 6b52d37 and cbf8f25.

📒 Files selected for processing (4)
  • AGENTS.md
  • CHANGELOG.md
  • packages/web/src/app/api/(server)/mcp/route.ts
  • packages/web/src/features/mcp/server.ts

Walkthrough

This change refactors MCP server initialization to be asynchronous and conditionally registers the ask_codebase tool only when language model providers are configured. The MCP route handler is updated to await async server creation. Documentation is updated to note the deprecation of packages/mcp package and changelog entry for the conditional tool visibility.

Changes

Cohort / File(s)Summary
Documentation
AGENTS.md, CHANGELOG.md
Added deprecation notice for packages/mcp package and changelog entry noting ask_codebase tool is now hidden when no language models are configured.
MCP Server Implementation
packages/web/src/features/mcp/server.ts
Changed createMcpServer from synchronous to asynchronous function, added preflight check for configured language models, and conditionally register ask_codebase tool only when language models are available.
MCP Route Handler
packages/web/src/app/api/(server)/mcp/route.ts
Updated POST handler to await the now-asynchronous createMcpServer() call before using the server instance.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as Route Handler
participant ServerInit as Server Init
participant LMService as LM Service
participant MCPServer as MCP Server
Client->>RouteHandler: POST /mcp (new session)
RouteHandler->>ServerInit: await createMcpServer()
ServerInit->>LMService: getConfiguredLanguageModels()
LMService-->>ServerInit: models list
ServerInit->>MCPServer: new McpServer()
alt hasLanguageModels = true
ServerInit->>MCPServer: register ask_codebase tool
else hasLanguageModels = false
ServerInit->>MCPServer: skip ask_codebase tool
end
MCPServer-->>ServerInit: server instance
ServerInit-->>RouteHandler: Promise resolved
RouteHandler->>MCPServer: mcpServer.connect(transport)
MCPServer-->>Client: connection established
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/SOU-718-ask-codebase-tool-visibility-26fc

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.

cursoragentand others added 3 commits March 20, 2026 02:21
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
The packages/mcp package is deprecated and should not be modified.
Reverted the conditional ask_codebase registration changes from this package.
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@msukkari
msukkari marked this pull request as ready for review March 20, 2026 17:20
@msukkari
msukkari merged commit 48fb8b1 into mainMar 20, 2026
6 checks passed
@msukkari
msukkari deleted the cursor/SOU-718-ask-codebase-tool-visibility-26fc branch March 20, 2026 17:22
@github-actionsgithub-actionsBot mentioned this pull request Mar 20, 2026
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

@msukkari@cursoragent
, '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): hide ask_codebase tool when no LLM providers configured - #1018

Merged
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc
Mar 20, 2026
Merged

feat(mcp): hide ask_codebase tool when no LLM providers configured#1018
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc

Conversation

@msukkari

@msukkarimsukkari commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR hides the ask_codebase tool in MCP when no language model providers are configured. Previously, the tool was always visible but would return an error when invoked without configured models. Now the tool is simply not registered/visible when there are no models configured.

Changes

Web MCP Server (packages/web/src/features/mcp/server.ts)

  • Made createMcpServer() async to support checking for configured language models
  • Added check for hasLanguageModels before registering the ask_codebase tool
  • Tool is now conditionally registered only when at least one language model is configured

MCP Route Handler (packages/web/src/app/api/(server)/mcp/route.ts)

  • Updated to await the now-async createMcpServer() function

AGENTS.md

  • Added note about packages/mcp being deprecated (it should not be modified)

Analysis: Making createMcpServer Async

Confirmed that making createMcpServer async is safe:

  • The call site is already in an async context (withOptionalAuthV2 callback)
  • Only adds minimal latency (~1-5ms) for config file read on session creation
  • No race conditions introduced - session creation is atomic within a request
  • Error handling is proper - config load failures gracefully return empty models array

Testing

Verified the feature works correctly by testing the MCP API endpoint:

Without models configured (6 tools visible):

  • list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase is NOT visible

With models configured (7 tools visible):

  • ask_codebase, list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase IS visible

All existing tests pass:

  • yarn test - 617 tests passing
  • yarn workspace @sourcebot/web lint - No errors
  • yarn workspace @sourcebot/web build - Successful

Fixes SOU-718

Linear Issue: SOU-718

Open in WebOpen in Cursor

Summary by CodeRabbit

  • Changed

    • The ask_codebase MCP tool is now hidden when no language model providers are configured, ensuring it's only available when applicable.
  • Documentation

    • Added deprecation notice for obsolete package; MCP functionality is handled elsewhere.

- Modified web MCP server to check configured language models before
registering the ask_codebase tool
- Made createMcpServer() async to support awaiting the config check
- Updated standalone MCP package to check /api/models before registering
ask_codebase tool
- Tool is now only visible when at least one language model is configured
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 16661059-74a2-441a-97f5-63feb05b5a09

📥 Commits

Reviewing files that changed from the base of the PR and between 6b52d37 and cbf8f25.

📒 Files selected for processing (4)
  • AGENTS.md
  • CHANGELOG.md
  • packages/web/src/app/api/(server)/mcp/route.ts
  • packages/web/src/features/mcp/server.ts

Walkthrough

This change refactors MCP server initialization to be asynchronous and conditionally registers the ask_codebase tool only when language model providers are configured. The MCP route handler is updated to await async server creation. Documentation is updated to note the deprecation of packages/mcp package and changelog entry for the conditional tool visibility.

Changes

Cohort / File(s)Summary
Documentation
AGENTS.md, CHANGELOG.md
Added deprecation notice for packages/mcp package and changelog entry noting ask_codebase tool is now hidden when no language models are configured.
MCP Server Implementation
packages/web/src/features/mcp/server.ts
Changed createMcpServer from synchronous to asynchronous function, added preflight check for configured language models, and conditionally register ask_codebase tool only when language models are available.
MCP Route Handler
packages/web/src/app/api/(server)/mcp/route.ts
Updated POST handler to await the now-asynchronous createMcpServer() call before using the server instance.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as Route Handler
participant ServerInit as Server Init
participant LMService as LM Service
participant MCPServer as MCP Server
Client->>RouteHandler: POST /mcp (new session)
RouteHandler->>ServerInit: await createMcpServer()
ServerInit->>LMService: getConfiguredLanguageModels()
LMService-->>ServerInit: models list
ServerInit->>MCPServer: new McpServer()
alt hasLanguageModels = true
ServerInit->>MCPServer: register ask_codebase tool
else hasLanguageModels = false
ServerInit->>MCPServer: skip ask_codebase tool
end
MCPServer-->>ServerInit: server instance
ServerInit-->>RouteHandler: Promise resolved
RouteHandler->>MCPServer: mcpServer.connect(transport)
MCPServer-->>Client: connection established
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/SOU-718-ask-codebase-tool-visibility-26fc

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.

cursoragentand others added 3 commits March 20, 2026 02:21
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
The packages/mcp package is deprecated and should not be modified.
Reverted the conditional ask_codebase registration changes from this package.
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@msukkari
msukkari marked this pull request as ready for review March 20, 2026 17:20
@msukkari
msukkari merged commit 48fb8b1 into mainMar 20, 2026
6 checks passed
@msukkari
msukkari deleted the cursor/SOU-718-ask-codebase-tool-visibility-26fc branch March 20, 2026 17:22
@github-actionsgithub-actionsBot mentioned this pull request Mar 20, 2026
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

@msukkari@cursoragent
, '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): hide ask_codebase tool when no LLM providers configured - #1018

Merged
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc
Mar 20, 2026
Merged

feat(mcp): hide ask_codebase tool when no LLM providers configured#1018
msukkari merged 5 commits into
mainfrom
cursor/SOU-718-ask-codebase-tool-visibility-26fc

Conversation

@msukkari

@msukkarimsukkari commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR hides the ask_codebase tool in MCP when no language model providers are configured. Previously, the tool was always visible but would return an error when invoked without configured models. Now the tool is simply not registered/visible when there are no models configured.

Changes

Web MCP Server (packages/web/src/features/mcp/server.ts)

  • Made createMcpServer() async to support checking for configured language models
  • Added check for hasLanguageModels before registering the ask_codebase tool
  • Tool is now conditionally registered only when at least one language model is configured

MCP Route Handler (packages/web/src/app/api/(server)/mcp/route.ts)

  • Updated to await the now-async createMcpServer() function

AGENTS.md

  • Added note about packages/mcp being deprecated (it should not be modified)

Analysis: Making createMcpServer Async

Confirmed that making createMcpServer async is safe:

  • The call site is already in an async context (withOptionalAuthV2 callback)
  • Only adds minimal latency (~1-5ms) for config file read on session creation
  • No race conditions introduced - session creation is atomic within a request
  • Error handling is proper - config load failures gracefully return empty models array

Testing

Verified the feature works correctly by testing the MCP API endpoint:

Without models configured (6 tools visible):

  • list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase is NOT visible

With models configured (7 tools visible):

  • ask_codebase, list_commits, list_language_models, list_repos, list_tree, read_file, search_code
  • ask_codebase IS visible

All existing tests pass:

  • yarn test - 617 tests passing
  • yarn workspace @sourcebot/web lint - No errors
  • yarn workspace @sourcebot/web build - Successful

Fixes SOU-718

Linear Issue: SOU-718

Open in WebOpen in Cursor

Summary by CodeRabbit

  • Changed

    • The ask_codebase MCP tool is now hidden when no language model providers are configured, ensuring it's only available when applicable.
  • Documentation

    • Added deprecation notice for obsolete package; MCP functionality is handled elsewhere.

- Modified web MCP server to check configured language models before
registering the ask_codebase tool
- Made createMcpServer() async to support awaiting the config check
- Updated standalone MCP package to check /api/models before registering
ask_codebase tool
- Tool is now only visible when at least one language model is configured
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 16661059-74a2-441a-97f5-63feb05b5a09

📥 Commits

Reviewing files that changed from the base of the PR and between 6b52d37 and cbf8f25.

📒 Files selected for processing (4)
  • AGENTS.md
  • CHANGELOG.md
  • packages/web/src/app/api/(server)/mcp/route.ts
  • packages/web/src/features/mcp/server.ts

Walkthrough

This change refactors MCP server initialization to be asynchronous and conditionally registers the ask_codebase tool only when language model providers are configured. The MCP route handler is updated to await async server creation. Documentation is updated to note the deprecation of packages/mcp package and changelog entry for the conditional tool visibility.

Changes

Cohort / File(s)Summary
Documentation
AGENTS.md, CHANGELOG.md
Added deprecation notice for packages/mcp package and changelog entry noting ask_codebase tool is now hidden when no language models are configured.
MCP Server Implementation
packages/web/src/features/mcp/server.ts
Changed createMcpServer from synchronous to asynchronous function, added preflight check for configured language models, and conditionally register ask_codebase tool only when language models are available.
MCP Route Handler
packages/web/src/app/api/(server)/mcp/route.ts
Updated POST handler to await the now-asynchronous createMcpServer() call before using the server instance.

Sequence Diagram

sequenceDiagram
participant Client
participant RouteHandler as Route Handler
participant ServerInit as Server Init
participant LMService as LM Service
participant MCPServer as MCP Server
Client->>RouteHandler: POST /mcp (new session)
RouteHandler->>ServerInit: await createMcpServer()
ServerInit->>LMService: getConfiguredLanguageModels()
LMService-->>ServerInit: models list
ServerInit->>MCPServer: new McpServer()
alt hasLanguageModels = true
ServerInit->>MCPServer: register ask_codebase tool
else hasLanguageModels = false
ServerInit->>MCPServer: skip ask_codebase tool
end
MCPServer-->>ServerInit: server instance
ServerInit-->>RouteHandler: Promise resolved
RouteHandler->>MCPServer: mcpServer.connect(transport)
MCPServer-->>Client: connection established
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • brendan-kellam
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/SOU-718-ask-codebase-tool-visibility-26fc

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.

cursoragentand others added 3 commits March 20, 2026 02:21
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
The packages/mcp package is deprecated and should not be modified.
Reverted the conditional ask_codebase registration changes from this package.
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
@msukkari
msukkari marked this pull request as ready for review March 20, 2026 17:20
@msukkari
msukkari merged commit 48fb8b1 into mainMar 20, 2026
6 checks passed
@msukkari
msukkari deleted the cursor/SOU-718-ask-codebase-tool-visibility-26fc branch March 20, 2026 17:22
@github-actionsgithub-actionsBot mentioned this pull request Mar 20, 2026
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

@msukkari@cursoragent