fix: only load GitHub MCP server when its tools are allowed (#124)

* fix: only load GitHub MCP server when its tools are allowed

- Add allowedTools parameter to prepareMcpConfig
- Check for mcp__github__ and mcp__github_file_ops__ tool prefixes
- Only include MCP servers when their tools are in allowed_tools
- Maintain backward compatibility when allowed_tools is not specified
- Update tests to reflect the new conditional loading behavior

This optimizes resource usage by not loading unnecessary MCP servers
when their tools are not allowed in the configuration.

Co-authored-by: ashwin-ant <ashwin-ant@users.noreply.github.com>

* fix: always load github_file_ops server regardless of allowed_tools

- Only apply conditional loading to the github MCP server
- Always load github_file_ops server as it contains essential tools
- Update tests to reflect this behavior

Co-authored-by: ashwin-ant <ashwin-ant@users.noreply.github.com>

* refactor: move allowedTools/disallowedTools parsing to parseGitHubContext

- Change allowedTools and disallowedTools from string to string[] in ParsedGitHubContext type
- Parse comma-separated environment variables into arrays in parseGitHubContext function
- Update create-prompt and install-mcp-server to use pre-parsed arrays
- Update all affected test files to use array syntax
- Eliminate duplicate parsing logic across the codebase

* style: apply prettier formatting

---------

Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
Co-authored-by: ashwin-ant <ashwin-ant@users.noreply.github.com>
This commit is contained in:
Ashwin Bhat
2025-06-04 11:56:56 -07:00
committed by GitHub
parent 94c0c31c1b
commit 699aa26b41
10 changed files with 159 additions and 72 deletions

View File

@@ -35,38 +35,35 @@ const BASE_ALLOWED_TOOLS = [
];
const DISALLOWED_TOOLS = ["WebSearch", "WebFetch"];
export function buildAllowedToolsString(customAllowedTools?: string): string {
export function buildAllowedToolsString(customAllowedTools?: string[]): string {
let baseTools = [...BASE_ALLOWED_TOOLS];
let allAllowedTools = baseTools.join(",");
if (customAllowedTools) {
allAllowedTools = `${allAllowedTools},${customAllowedTools}`;
if (customAllowedTools && customAllowedTools.length > 0) {
allAllowedTools = `${allAllowedTools},${customAllowedTools.join(",")}`;
}
return allAllowedTools;
}
export function buildDisallowedToolsString(
customDisallowedTools?: string,
allowedTools?: string,
customDisallowedTools?: string[],
allowedTools?: string[],
): string {
let disallowedTools = [...DISALLOWED_TOOLS];
// If user has explicitly allowed some hardcoded disallowed tools, remove them from disallowed list
if (allowedTools) {
const allowedToolsArray = allowedTools
.split(",")
.map((tool) => tool.trim());
if (allowedTools && allowedTools.length > 0) {
disallowedTools = disallowedTools.filter(
(tool) => !allowedToolsArray.includes(tool),
(tool) => !allowedTools.includes(tool),
);
}
let allDisallowedTools = disallowedTools.join(",");
if (customDisallowedTools) {
if (customDisallowedTools && customDisallowedTools.length > 0) {
if (allDisallowedTools) {
allDisallowedTools = `${allDisallowedTools},${customDisallowedTools}`;
allDisallowedTools = `${allDisallowedTools},${customDisallowedTools.join(",")}`;
} else {
allDisallowedTools = customDisallowedTools;
allDisallowedTools = customDisallowedTools.join(",");
}
}
return allDisallowedTools;
@@ -120,8 +117,10 @@ export function prepareContext(
triggerPhrase,
...(triggerUsername && { triggerUsername }),
...(customInstructions && { customInstructions }),
...(allowedTools && { allowedTools }),
...(disallowedTools && { disallowedTools }),
...(allowedTools.length > 0 && { allowedTools: allowedTools.join(",") }),
...(disallowedTools.length > 0 && {
disallowedTools: disallowedTools.join(","),
}),
...(directPrompt && { directPrompt }),
...(claudeBranch && { claudeBranch }),
};
@@ -636,11 +635,11 @@ export async function createPrompt(
// Set allowed tools
const allAllowedTools = buildAllowedToolsString(
preparedContext.allowedTools,
context.inputs.allowedTools,
);
const allDisallowedTools = buildDisallowedToolsString(
preparedContext.disallowedTools,
preparedContext.allowedTools,
context.inputs.disallowedTools,
context.inputs.allowedTools,
);
core.exportVariable("ALLOWED_TOOLS", allAllowedTools);