diff options
Diffstat (limited to 'packages/core/src/tools/mcp-client.ts')
| -rw-r--r-- | packages/core/src/tools/mcp-client.ts | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/packages/core/src/tools/mcp-client.ts b/packages/core/src/tools/mcp-client.ts index 9a35b84e..83bc4024 100644 --- a/packages/core/src/tools/mcp-client.ts +++ b/packages/core/src/tools/mcp-client.ts @@ -20,6 +20,7 @@ import { ListPromptsResultSchema, GetPromptResult, GetPromptResultSchema, + ListRootsRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import { parse } from 'shell-quote'; import { AuthProviderType, MCPServerConfig } from '../config/config.js'; @@ -33,6 +34,9 @@ import { MCPOAuthProvider } from '../mcp/oauth-provider.js'; import { OAuthUtils } from '../mcp/oauth-utils.js'; import { MCPOAuthTokenStorage } from '../mcp/oauth-token-storage.js'; import { getErrorMessage } from '../utils/errors.js'; +import { basename } from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { WorkspaceContext } from '../utils/workspaceContext.js'; export const MCP_DEFAULT_TIMEOUT_MSEC = 10 * 60 * 1000; // default to 10 minutes @@ -306,6 +310,7 @@ export async function discoverMcpTools( toolRegistry: ToolRegistry, promptRegistry: PromptRegistry, debugMode: boolean, + workspaceContext: WorkspaceContext, ): Promise<void> { mcpDiscoveryState = MCPDiscoveryState.IN_PROGRESS; try { @@ -319,6 +324,7 @@ export async function discoverMcpTools( toolRegistry, promptRegistry, debugMode, + workspaceContext, ), ); await Promise.all(discoveryPromises); @@ -363,6 +369,7 @@ export async function connectAndDiscover( toolRegistry: ToolRegistry, promptRegistry: PromptRegistry, debugMode: boolean, + workspaceContext: WorkspaceContext, ): Promise<void> { updateMCPServerStatus(mcpServerName, MCPServerStatus.CONNECTING); @@ -372,6 +379,7 @@ export async function connectAndDiscover( mcpServerName, mcpServerConfig, debugMode, + workspaceContext, ); mcpClient.onerror = (error) => { @@ -655,12 +663,30 @@ export async function connectToMcpServer( mcpServerName: string, mcpServerConfig: MCPServerConfig, debugMode: boolean, + workspaceContext: WorkspaceContext, ): Promise<Client> { const mcpClient = new Client({ name: 'gemini-cli-mcp-client', version: '0.0.1', }); + mcpClient.registerCapabilities({ + roots: {}, + }); + + mcpClient.setRequestHandler(ListRootsRequestSchema, async () => { + const roots = []; + for (const dir of workspaceContext.getDirectories()) { + roots.push({ + uri: pathToFileURL(dir).toString(), + name: basename(dir), + }); + } + return { + roots, + }; + }); + // patch Client.callTool to use request timeout as genai McpCallTool.callTool does not do it // TODO: remove this hack once GenAI SDK does callTool with request options if ('callTool' in mcpClient) { |
