Просмотр исходного кода

fix: prevent MCP server creation when setting is disabled (#6613)

* fix: prevent MCP server creation when setting is disabled

- Modified getFetchInstructionsDescription to conditionally include create_mcp_server task
- Updated getToolDescriptionsForMode to pass enableMcpServerCreation parameter
- Added tests to verify the conditional behavior
- Updated snapshot test to reflect the new expected behavior

Fixes #6607

* fix: address review comments - add JSDoc, null test, and clarify default behavior

---------

Co-authored-by: Roo Code <[email protected]>
roomote[bot] 4 месяцев назад
Родитель
Сommit
8a35b64b9b

+ 2 - 3
src/core/prompts/__tests__/__snapshots__/add-custom-instructions/mcp-server-creation-disabled.snap

@@ -99,13 +99,12 @@ IMPORTANT: You MUST use this Efficient Reading Strategy:
 Description: Request to fetch instructions to perform a task
 Parameters:
 - task: (required) The task to get instructions for.  This can take the following values:
-  create_mcp_server
   create_mode
 
-Example: Requesting instructions to create an MCP Server
+Example: Requesting instructions to create a Mode
 
 <fetch_instructions>
-<task>create_mcp_server</task>
+<task>create_mode</task>
 </fetch_instructions>
 
 ## search_files

+ 1 - 0
src/core/prompts/system.ts

@@ -105,6 +105,7 @@ ${getToolDescriptionsForMode(
 	experiments,
 	partialReadsEnabled,
 	settings,
+	enableMcpServerCreation,
 )}
 
 ${getToolUseGuidelinesSection(codeIndexManager)}

+ 53 - 0
src/core/prompts/tools/__tests__/fetch-instructions.spec.ts

@@ -0,0 +1,53 @@
+import { describe, it, expect } from "vitest"
+import { getFetchInstructionsDescription } from "../fetch-instructions"
+
+describe("getFetchInstructionsDescription", () => {
+	it("should include create_mcp_server when enableMcpServerCreation is true", () => {
+		const description = getFetchInstructionsDescription(true)
+
+		expect(description).toContain("create_mcp_server")
+		expect(description).toContain("create_mode")
+		expect(description).toContain("Example: Requesting instructions to create an MCP Server")
+		expect(description).toContain("<task>create_mcp_server</task>")
+	})
+
+	it("should include create_mcp_server when enableMcpServerCreation is undefined (default behavior)", () => {
+		const description = getFetchInstructionsDescription()
+
+		expect(description).toContain("create_mcp_server")
+		expect(description).toContain("create_mode")
+		expect(description).toContain("Example: Requesting instructions to create an MCP Server")
+		expect(description).toContain("<task>create_mcp_server</task>")
+	})
+
+	it("should exclude create_mcp_server when enableMcpServerCreation is false", () => {
+		const description = getFetchInstructionsDescription(false)
+
+		expect(description).not.toContain("create_mcp_server")
+		expect(description).toContain("create_mode")
+		expect(description).toContain("Example: Requesting instructions to create a Mode")
+		expect(description).toContain("<task>create_mode</task>")
+		expect(description).not.toContain("Example: Requesting instructions to create an MCP Server")
+	})
+
+	it("should have the correct structure", () => {
+		const description = getFetchInstructionsDescription(true)
+
+		expect(description).toContain("## fetch_instructions")
+		expect(description).toContain("Description: Request to fetch instructions to perform a task")
+		expect(description).toContain("Parameters:")
+		expect(description).toContain("- task: (required) The task to get instructions for.")
+		expect(description).toContain("<fetch_instructions>")
+		expect(description).toContain("</fetch_instructions>")
+	})
+
+	it("should handle null value consistently (treat as default/undefined)", () => {
+		const description = getFetchInstructionsDescription(null as any)
+
+		// Should behave the same as undefined (default to true)
+		expect(description).toContain("create_mcp_server")
+		expect(description).toContain("create_mode")
+		expect(description).toContain("Example: Requesting instructions to create an MCP Server")
+		expect(description).toContain("<task>create_mcp_server</task>")
+	})
+})

+ 27 - 8
src/core/prompts/tools/fetch-instructions.ts

@@ -1,14 +1,33 @@
-export function getFetchInstructionsDescription(): string {
-	return `## fetch_instructions
-Description: Request to fetch instructions to perform a task
-Parameters:
-- task: (required) The task to get instructions for.  This can take the following values:
-  create_mcp_server
-  create_mode
+/**
+ * Generates the fetch_instructions tool description.
+ * @param enableMcpServerCreation - Whether to include MCP server creation task.
+ *                                  Defaults to true when undefined.
+ */
+export function getFetchInstructionsDescription(enableMcpServerCreation?: boolean): string {
+	const tasks =
+		enableMcpServerCreation !== false
+			? `  create_mcp_server
+  create_mode`
+			: `  create_mode`
 
-Example: Requesting instructions to create an MCP Server
+	const example =
+		enableMcpServerCreation !== false
+			? `Example: Requesting instructions to create an MCP Server
 
 <fetch_instructions>
 <task>create_mcp_server</task>
 </fetch_instructions>`
+			: `Example: Requesting instructions to create a Mode
+
+<fetch_instructions>
+<task>create_mode</task>
+</fetch_instructions>`
+
+	return `## fetch_instructions
+Description: Request to fetch instructions to perform a task
+Parameters:
+- task: (required) The task to get instructions for.  This can take the following values:
+${tasks}
+
+${example}`
 }

+ 6 - 2
src/core/prompts/tools/index.ts

@@ -29,7 +29,7 @@ import { CodeIndexManager } from "../../../services/code-index/manager"
 const toolDescriptionMap: Record<string, (args: ToolArgs) => string | undefined> = {
 	execute_command: (args) => getExecuteCommandDescription(args),
 	read_file: (args) => getReadFileDescription(args),
-	fetch_instructions: () => getFetchInstructionsDescription(),
+	fetch_instructions: (args) => getFetchInstructionsDescription(args.settings?.enableMcpServerCreation),
 	write_to_file: (args) => getWriteToFileDescription(args),
 	search_files: (args) => getSearchFilesDescription(args),
 	list_files: (args) => getListFilesDescription(args),
@@ -61,6 +61,7 @@ export function getToolDescriptionsForMode(
 	experiments?: Record<string, boolean>,
 	partialReadsEnabled?: boolean,
 	settings?: Record<string, any>,
+	enableMcpServerCreation?: boolean,
 ): string {
 	const config = getModeConfig(mode, customModes)
 	const args: ToolArgs = {
@@ -70,7 +71,10 @@ export function getToolDescriptionsForMode(
 		browserViewportSize,
 		mcpHub,
 		partialReadsEnabled,
-		settings,
+		settings: {
+			...settings,
+			enableMcpServerCreation,
+		},
 		experiments,
 	}