Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions src/mcp/install-mcp-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -12,8 +13,8 @@ type PrepareConfigParams = {
baseBranch: string;
claudeCommentId?: string;
allowedTools: string[];
mode: AutoDetectedMode;
context: GitHubContext;
mode: "tag" | "agent";
};

async function checkActionsReadPermission(
Expand Down Expand Up @@ -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__"),
);
Expand All @@ -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 = {
Expand Down
2 changes: 1 addition & 1 deletion src/modes/agent/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
33 changes: 18 additions & 15 deletions src/modes/tag/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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 = "";
Expand Down
18 changes: 9 additions & 9 deletions test/install-mcp-server.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ describe("prepareMcpConfig", () => {
branch: "test-branch",
baseBranch: "main",
allowedTools: [],
context: mockContextWithSigning,
mode: "tag",
context: mockContextWithSigning,
});

const parsed = JSON.parse(result);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -172,8 +172,8 @@ describe("prepareMcpConfig", () => {
branch: "test-branch",
baseBranch: "main",
allowedTools: [],
context: mockContext,
mode: "tag",
context: mockContext,
});

const parsed = JSON.parse(result);
Expand All @@ -193,8 +193,8 @@ describe("prepareMcpConfig", () => {
branch: "test-branch",
baseBranch: "main",
allowedTools: [],
context: mockContextWithSigning,
mode: "tag",
context: mockContextWithSigning,
});

const parsed = JSON.parse(result);
Expand All @@ -213,8 +213,8 @@ describe("prepareMcpConfig", () => {
branch: "test-branch",
baseBranch: "main",
allowedTools: [],
context: mockContextWithSigning,
mode: "tag",
context: mockContextWithSigning,
});

const parsed = JSON.parse(result);
Expand All @@ -231,8 +231,8 @@ describe("prepareMcpConfig", () => {
branch: "test-branch",
baseBranch: "main",
allowedTools: [],
context: mockPRContext,
mode: "tag",
context: mockPRContext,
});

const parsed = JSON.parse(result);
Expand All @@ -251,8 +251,8 @@ describe("prepareMcpConfig", () => {
branch: "test-branch",
baseBranch: "main",
allowedTools: [],
context: mockContext,
mode: "tag",
context: mockContext,
});

const parsed = JSON.parse(result);
Expand All @@ -269,8 +269,8 @@ describe("prepareMcpConfig", () => {
branch: "test-branch",
baseBranch: "main",
allowedTools: [],
context: mockPRContext,
mode: "tag",
context: mockPRContext,
});

const parsed = JSON.parse(result);
Expand Down
Loading