diff --git a/src/mcp/install-mcp-server.ts b/src/mcp/install-mcp-server.ts index c107fc1fa..0a2e7b4cf 100644 --- a/src/mcp/install-mcp-server.ts +++ b/src/mcp/install-mcp-server.ts @@ -3,6 +3,7 @@ import { GITHUB_API_URL, GITHUB_SERVER_URL } from "../github/api/config"; import type { GitHubContext } from "../github/context"; import { isEntityContext } from "../github/context"; import { Octokit } from "@octokit/rest"; +import type { AutoDetectedMode } from "../modes/detector"; type PrepareConfigParams = { githubToken: string; @@ -12,8 +13,8 @@ type PrepareConfigParams = { baseBranch: string; claudeCommentId?: string; allowedTools: string[]; + mode: AutoDetectedMode; context: GitHubContext; - mode: "tag" | "agent"; }; async function checkActionsReadPermission( @@ -65,8 +66,13 @@ export async function prepareMcpConfig( try { const allowedToolsList = allowedTools || []; + // Detect if we're in agent mode (explicit prompt provided) const isAgentMode = mode === "agent"; + const hasGitHubCommentTools = allowedToolsList.some((tool) => + tool.startsWith("mcp__github_comment__"), + ); + const hasGitHubMcpTools = allowedToolsList.some((tool) => tool.startsWith("mcp__github__"), ); @@ -86,7 +92,7 @@ export async function prepareMcpConfig( // Include comment server: // - Always in tag mode (for updating Claude comments) // - Only with explicit tools in agent mode - const shouldIncludeCommentServer = !isAgentMode; + const shouldIncludeCommentServer = !isAgentMode || hasGitHubCommentTools; if (shouldIncludeCommentServer) { baseMcpConfig.mcpServers.github_comment = { diff --git a/src/modes/agent/index.ts b/src/modes/agent/index.ts index 9c3a7b2dd..4bcd4aaaf 100644 --- a/src/modes/agent/index.ts +++ b/src/modes/agent/index.ts @@ -135,8 +135,8 @@ export const agentMode: Mode = { baseBranch: baseBranch, claudeCommentId: undefined, // No tracking comment in agent mode allowedTools, - context, mode: "agent", + context, }); // Build final claude_args with multiple --mcp-config flags diff --git a/src/modes/tag/index.ts b/src/modes/tag/index.ts index adcf6e8df..be7df091c 100644 --- a/src/modes/tag/index.ts +++ b/src/modes/tag/index.ts @@ -14,6 +14,7 @@ import { createPrompt, generateDefaultPrompt } from "../../create-prompt"; import { isEntityContext } from "../../github/context"; import type { PreparedContext } from "../../create-prompt/types"; import type { FetchDataResult } from "../../github/data/fetcher"; +import { parseAllowedTools } from "../agent/parse-tools"; /** * Tag mode implementation. @@ -112,20 +113,10 @@ export const tagMode: Mode = { await createPrompt(tagMode, modeContext, githubData, context); - // Get our GitHub MCP servers configuration - const ourMcpConfig = await prepareMcpConfig({ - githubToken, - owner: context.repository.owner, - repo: context.repository.repo, - branch: branchInfo.claudeBranch || branchInfo.currentBranch, - baseBranch: branchInfo.baseBranch, - claudeCommentId: commentId.toString(), - allowedTools: [], - context, - mode: "tag", - }); - - // Don't output mcp_config separately anymore - include in claude_args + const userClaudeArgs = process.env.CLAUDE_ARGS || ""; + const userAllowedMCPTools = parseAllowedTools(userClaudeArgs).filter( + (tool) => tool.startsWith("mcp__github_"), + ); // Build claude_args for tag mode with required tools // Tag mode REQUIRES these tools to function properly @@ -141,6 +132,7 @@ export const tagMode: Mode = { "mcp__github_ci__get_ci_status", "mcp__github_ci__get_workflow_run_details", "mcp__github_ci__download_job_log", + ...userAllowedMCPTools, ]; // Add git commands when not using commit signing @@ -162,7 +154,18 @@ export const tagMode: Mode = { ); } - const userClaudeArgs = process.env.CLAUDE_ARGS || ""; + // Get our GitHub MCP servers configuration + const ourMcpConfig = await prepareMcpConfig({ + githubToken, + owner: context.repository.owner, + repo: context.repository.repo, + branch: branchInfo.claudeBranch || branchInfo.currentBranch, + baseBranch: branchInfo.baseBranch, + claudeCommentId: commentId.toString(), + allowedTools: Array.from(new Set(tagModeTools)), + mode: "tag", + context, + }); // Build complete claude_args with multiple --mcp-config flags let claudeArgs = ""; diff --git a/test/install-mcp-server.test.ts b/test/install-mcp-server.test.ts index 987dd7c68..9d628504d 100644 --- a/test/install-mcp-server.test.ts +++ b/test/install-mcp-server.test.ts @@ -106,8 +106,8 @@ describe("prepareMcpConfig", () => { branch: "test-branch", baseBranch: "main", allowedTools: [], - context: mockContextWithSigning, mode: "tag", + context: mockContextWithSigning, }); const parsed = JSON.parse(result); @@ -130,8 +130,8 @@ describe("prepareMcpConfig", () => { branch: "test-branch", baseBranch: "main", allowedTools: ["mcp__github__create_issue", "mcp__github__create_pr"], - context: mockContext, mode: "tag", + context: mockContext, }); const parsed = JSON.parse(result); @@ -151,8 +151,8 @@ describe("prepareMcpConfig", () => { branch: "test-branch", baseBranch: "main", allowedTools: ["mcp__github_inline_comment__create_inline_comment"], - context: mockPRContext, mode: "tag", + context: mockPRContext, }); const parsed = JSON.parse(result); @@ -172,8 +172,8 @@ describe("prepareMcpConfig", () => { branch: "test-branch", baseBranch: "main", allowedTools: [], - context: mockContext, mode: "tag", + context: mockContext, }); const parsed = JSON.parse(result); @@ -193,8 +193,8 @@ describe("prepareMcpConfig", () => { branch: "test-branch", baseBranch: "main", allowedTools: [], - context: mockContextWithSigning, mode: "tag", + context: mockContextWithSigning, }); const parsed = JSON.parse(result); @@ -213,8 +213,8 @@ describe("prepareMcpConfig", () => { branch: "test-branch", baseBranch: "main", allowedTools: [], - context: mockContextWithSigning, mode: "tag", + context: mockContextWithSigning, }); const parsed = JSON.parse(result); @@ -231,8 +231,8 @@ describe("prepareMcpConfig", () => { branch: "test-branch", baseBranch: "main", allowedTools: [], - context: mockPRContext, mode: "tag", + context: mockPRContext, }); const parsed = JSON.parse(result); @@ -251,8 +251,8 @@ describe("prepareMcpConfig", () => { branch: "test-branch", baseBranch: "main", allowedTools: [], - context: mockContext, mode: "tag", + context: mockContext, }); const parsed = JSON.parse(result); @@ -269,8 +269,8 @@ describe("prepareMcpConfig", () => { branch: "test-branch", baseBranch: "main", allowedTools: [], - context: mockPRContext, mode: "tag", + context: mockPRContext, }); const parsed = JSON.parse(result);