Skip to content

Commit e52478f

Browse files
committed
feat: add mcpServersInitialized event to API and ClineProvider, emit on MCP server initialization
1 parent 5cb60d9 commit e52478f

File tree

6 files changed

+46
-15
lines changed

6 files changed

+46
-15
lines changed

apps/vscode-e2e/src/suite/tools/use-mcp-tool.test.ts

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,33 +26,38 @@ suite("Roo Code use_mcp_tool Tool", function () {
2626
// Create test files in VSCode workspace directory
2727
const workspaceDir = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || tempDir
2828

29+
// Resolve the real path to avoid symlink issues on macOS
30+
const realWorkspaceDir = await fs.realpath(workspaceDir)
31+
console.log("Original workspace dir:", workspaceDir)
32+
console.log("Real workspace dir:", realWorkspaceDir)
33+
2934
// Create test files for MCP filesystem operations
3035
testFiles = {
31-
simple: path.join(workspaceDir, `mcp-test-${Date.now()}.txt`),
32-
testData: path.join(workspaceDir, `mcp-data-${Date.now()}.json`),
33-
mcpConfig: path.join(workspaceDir, ".roo", "mcp.json"),
36+
simple: path.join(realWorkspaceDir, `mcp-test-${Date.now()}.txt`),
37+
testData: path.join(realWorkspaceDir, `mcp-data-${Date.now()}.json`),
38+
mcpConfig: path.join(realWorkspaceDir, ".roo", "mcp.json"),
3439
}
3540

3641
// Create initial test files
3742
await fs.writeFile(testFiles.simple, "Initial content for MCP test")
3843
await fs.writeFile(testFiles.testData, JSON.stringify({ test: "data", value: 42 }, null, 2))
3944

4045
// Create .roo directory and MCP configuration file
41-
const rooDir = path.join(workspaceDir, ".roo")
46+
const rooDir = path.join(realWorkspaceDir, ".roo")
4247
await fs.mkdir(rooDir, { recursive: true })
4348

4449
const mcpConfig = {
4550
mcpServers: {
4651
filesystem: {
4752
command: "npx",
48-
args: ["-y", "@modelcontextprotocol/server-filesystem", workspaceDir],
53+
args: ["-y", "@modelcontextprotocol/server-filesystem", realWorkspaceDir],
4954
alwaysAllow: [],
5055
},
5156
},
5257
}
5358
await fs.writeFile(testFiles.mcpConfig, JSON.stringify(mcpConfig, null, 2))
5459

55-
console.log("MCP test files created in:", workspaceDir)
60+
console.log("MCP test files created in:", realWorkspaceDir)
5661
console.log("Test files:", testFiles)
5762
})
5863

@@ -76,7 +81,8 @@ suite("Roo Code use_mcp_tool Tool", function () {
7681

7782
// Clean up .roo directory
7883
const workspaceDir = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || tempDir
79-
const rooDir = path.join(workspaceDir, ".roo")
84+
const realWorkspaceDir = await fs.realpath(workspaceDir)
85+
const rooDir = path.join(realWorkspaceDir, ".roo")
8086
try {
8187
await fs.rm(rooDir, { recursive: true, force: true })
8288
} catch {
@@ -353,7 +359,6 @@ suite("Roo Code use_mcp_tool Tool", function () {
353359
}
354360
}
355361
api.on("taskCompleted", taskCompletedHandler)
356-
await sleep(2000) // Wait for Roo Code to fully initialize
357362

358363
// Trigger MCP server detection by opening and modifying the file
359364
console.log("Triggering MCP server detection by modifying the config file...")
@@ -386,7 +391,9 @@ suite("Roo Code use_mcp_tool Tool", function () {
386391
console.error("Failed to modify/save MCP config file:", error)
387392
}
388393

389-
await sleep(5000) // Wait for MCP servers to initialize
394+
// Give MCP servers a moment to be ready (they should already be initialized)
395+
await sleep(1000)
396+
390397
let taskId: string
391398
try {
392399
// Start task requesting to use MCP filesystem write_file tool
@@ -514,7 +521,6 @@ suite("Roo Code use_mcp_tool Tool", function () {
514521
}
515522
}
516523
api.on("taskCompleted", taskCompletedHandler)
517-
await sleep(2000) // Wait for Roo Code to fully initialize
518524

519525
// Trigger MCP server detection by opening and modifying the file
520526
console.log("Triggering MCP server detection by modifying the config file...")
@@ -547,7 +553,9 @@ suite("Roo Code use_mcp_tool Tool", function () {
547553
console.error("Failed to modify/save MCP config file:", error)
548554
}
549555

550-
await sleep(5000) // Wait for MCP servers to initialize
556+
// Give MCP servers a moment to be ready (they should already be initialized)
557+
await sleep(1000)
558+
551559
let taskId: string
552560
try {
553561
// Start task requesting MCP filesystem list_directory tool
@@ -686,7 +694,6 @@ suite("Roo Code use_mcp_tool Tool", function () {
686694
}
687695
}
688696
api.on("taskCompleted", taskCompletedHandler)
689-
await sleep(2000) // Wait for Roo Code to fully initialize
690697

691698
// Trigger MCP server detection by opening and modifying the file
692699
console.log("Triggering MCP server detection by modifying the config file...")
@@ -719,7 +726,9 @@ suite("Roo Code use_mcp_tool Tool", function () {
719726
console.error("Failed to modify/save MCP config file:", error)
720727
}
721728

722-
await sleep(5000) // Wait for MCP servers to initialize
729+
// Give MCP servers a moment to be ready (they should already be initialized)
730+
await sleep(1000)
731+
723732
let taskId: string
724733
try {
725734
// Start task requesting MCP filesystem directory_tree tool
@@ -940,7 +949,8 @@ suite("Roo Code use_mcp_tool Tool", function () {
940949
}
941950
}
942951
api.on("taskCompleted", taskCompletedHandler)
943-
await sleep(2000) // Wait for Roo Code to fully initialize
952+
953+
// Wait for MCP servers to be initialized instead of using sleep
944954

945955
// Trigger MCP server detection by opening and modifying the file
946956
console.log("Triggering MCP server detection by modifying the config file...")
@@ -973,7 +983,9 @@ suite("Roo Code use_mcp_tool Tool", function () {
973983
console.error("Failed to modify/save MCP config file:", error)
974984
}
975985

976-
await sleep(5000) // Wait for MCP servers to initialize
986+
// Give MCP servers a moment to be ready (they should already be initialized)
987+
await sleep(1000)
988+
977989
let taskId: string
978990
try {
979991
// Start task requesting MCP filesystem get_file_info tool

packages/types/src/api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface RooCodeAPIEvents {
2121
taskCompleted: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage, isSubtask: IsSubtask]
2222
taskTokenUsageUpdated: [taskId: string, tokenUsage: TokenUsage]
2323
taskToolFailed: [taskId: string, toolName: ToolName, error: string]
24+
mcpServersInitialized: []
2425
}
2526

2627
export interface RooCodeAPI extends EventEmitter<RooCodeAPIEvents> {

packages/types/src/ipc.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export enum RooCodeEventName {
2929
TaskCompleted = "taskCompleted",
3030
TaskTokenUsageUpdated = "taskTokenUsageUpdated",
3131
TaskToolFailed = "taskToolFailed",
32+
McpServersInitialized = "mcpServersInitialized",
3233
EvalPass = "evalPass",
3334
EvalFail = "evalFail",
3435
}
@@ -52,6 +53,7 @@ export const rooCodeEventsSchema = z.object({
5253
[RooCodeEventName.TaskCompleted]: z.tuple([z.string(), tokenUsageSchema, toolUsageSchema, isSubtaskSchema]),
5354
[RooCodeEventName.TaskTokenUsageUpdated]: z.tuple([z.string(), tokenUsageSchema]),
5455
[RooCodeEventName.TaskToolFailed]: z.tuple([z.string(), toolNamesSchema, z.string()]),
56+
[RooCodeEventName.McpServersInitialized]: z.tuple([]),
5557
})
5658

5759
export type RooCodeEvents = z.infer<typeof rooCodeEventsSchema>
@@ -165,6 +167,11 @@ export const taskEventSchema = z.discriminatedUnion("eventName", [
165167
payload: rooCodeEventsSchema.shape[RooCodeEventName.TaskToolFailed],
166168
taskId: z.number().optional(),
167169
}),
170+
z.object({
171+
eventName: z.literal(RooCodeEventName.McpServersInitialized),
172+
payload: rooCodeEventsSchema.shape[RooCodeEventName.McpServersInitialized],
173+
taskId: z.number().optional(),
174+
}),
168175
z.object({
169176
eventName: z.literal(RooCodeEventName.EvalPass),
170177
payload: z.undefined(),

src/core/webview/ClineProvider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ import { ProfileValidator } from "../../shared/ProfileValidator"
7676

7777
export type ClineProviderEvents = {
7878
clineCreated: [cline: Task]
79+
mcpServersInitialized: []
7980
}
8081

8182
class OrganizationAllowListViolationError extends Error {

src/extension/api.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,11 @@ export class API extends EventEmitter<RooCodeEvents> implements RooCodeAPI {
248248

249249
this.emit(RooCodeEventName.TaskCreated, cline.taskId)
250250
})
251+
252+
// Listen for MCP servers initialized event
253+
provider.on("mcpServersInitialized", () => {
254+
this.emit(RooCodeEventName.McpServersInitialized)
255+
})
251256
}
252257

253258
// Logging

src/services/mcp/McpHub.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -995,6 +995,11 @@ export class McpHub {
995995
await this.notifyWebviewOfServerChanges()
996996
if (manageConnectingState) {
997997
this.isConnecting = false
998+
// Emit MCP servers initialized event
999+
const provider = this.providerRef.deref()
1000+
if (provider) {
1001+
provider.emit("mcpServersInitialized")
1002+
}
9981003
}
9991004
}
10001005

0 commit comments

Comments
 (0)