summaryrefslogtreecommitdiff
path: root/packages/core/src/tools/mcp-client.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/tools/mcp-client.ts')
-rw-r--r--packages/core/src/tools/mcp-client.ts26
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) {