diff --git a/action.yml b/action.yml index 319a6de..d544f67 100644 --- a/action.yml +++ b/action.yml @@ -39,6 +39,10 @@ inputs: description: "Direct instruction for Claude (bypasses normal trigger detection)" required: false default: "" + mcp_config: + description: "Additional MCP configuration (JSON string) that merges with the built-in GitHub MCP servers" + required: false + default: "" # Auth configuration anthropic_api_key: @@ -92,6 +96,7 @@ runs: ALLOWED_TOOLS: ${{ inputs.allowed_tools }} CUSTOM_INSTRUCTIONS: ${{ inputs.custom_instructions }} DIRECT_PROMPT: ${{ inputs.direct_prompt }} + MCP_CONFIG: ${{ inputs.mcp_config }} OVERRIDE_GITHUB_TOKEN: ${{ inputs.github_token }} GITHUB_RUN_ID: ${{ github.run_id }} diff --git a/src/entrypoints/prepare.ts b/src/entrypoints/prepare.ts index c3e0b38..006a62e 100644 --- a/src/entrypoints/prepare.ts +++ b/src/entrypoints/prepare.ts @@ -84,11 +84,13 @@ async function run() { ); // Step 11: Get MCP configuration + const additionalMcpConfig = process.env.MCP_CONFIG || ""; const mcpConfig = await prepareMcpConfig( githubToken, context.repository.owner, context.repository.repo, branchInfo.currentBranch, + additionalMcpConfig, ); core.setOutput("mcp_config", mcpConfig); } catch (error) { diff --git a/src/mcp/install-mcp-server.ts b/src/mcp/install-mcp-server.ts index 462967d..f07d00b 100644 --- a/src/mcp/install-mcp-server.ts +++ b/src/mcp/install-mcp-server.ts @@ -5,9 +5,10 @@ export async function prepareMcpConfig( owner: string, repo: string, branch: string, + additionalMcpConfig?: string, ): Promise { try { - const mcpConfig = { + const baseMcpConfig = { mcpServers: { github: { command: "docker", @@ -40,7 +41,35 @@ export async function prepareMcpConfig( }, }; - return JSON.stringify(mcpConfig, null, 2); + // Merge with additional MCP config if provided + if (additionalMcpConfig && additionalMcpConfig.trim()) { + try { + const additionalConfig = JSON.parse(additionalMcpConfig); + + // Merge mcpServers objects, with additional config overriding base config + if (additionalConfig.mcpServers) { + baseMcpConfig.mcpServers = { + ...baseMcpConfig.mcpServers, + ...additionalConfig.mcpServers, + }; + } + + // Merge any other top-level properties from additional config + const mergedConfig = { + ...baseMcpConfig, + ...additionalConfig, + mcpServers: baseMcpConfig.mcpServers, // Ensure mcpServers uses the merged version + }; + + return JSON.stringify(mergedConfig, null, 2); + } catch (parseError) { + core.warning( + `Failed to parse additional MCP config: ${parseError}. Using base config only.`, + ); + } + } + + return JSON.stringify(baseMcpConfig, null, 2); } catch (error) { core.setFailed(`Install MCP server failed with error: ${error}`); process.exit(1);