git_branch
Manage and display Git repository branches locally or remotely. Specify the repository path to list branches, with an option to include remote branches for comprehensive tracking.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| repository_path | Yes | Path to the git repository | |
| show_remote | No | Show remote branches as well |
Implementation Reference
- index.ts:352-371 (handler)The handler function that implements the core logic of the git_branch tool: runs 'git branch' (or 'git branch -a') in the specified repository.async ({ repository_path, show_remote }) => { try { let command = `cd ${repository_path} && git branch`; if (show_remote) { command += ` -a`; } const output = executeGitCommand(command); return { content: [{ type: "text", text: output }] }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { content: [{ type: "text", text: `Error: ${errorMessage}` }], isError: true }; } } );
- index.ts:348-351 (schema)Input schema for the git_branch tool, defined inline in the registration.{ repository_path: z.string().describe('Path to the git repository'), show_remote: z.boolean().optional().describe('Show remote branches as well') },
- index.ts:346-371 (registration)Registration of the 'git_branch' tool on the MCP server using server.tool(), including schema and handler.server.tool( "git_branch", { repository_path: z.string().describe('Path to the git repository'), show_remote: z.boolean().optional().describe('Show remote branches as well') }, async ({ repository_path, show_remote }) => { try { let command = `cd ${repository_path} && git branch`; if (show_remote) { command += ` -a`; } const output = executeGitCommand(command); return { content: [{ type: "text", text: output }] }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { content: [{ type: "text", text: `Error: ${errorMessage}` }], isError: true }; } } );
- index.ts:58-61 (schema)Standalone Zod schema definition for git_branch arguments (matches inline schema).const GitBranchArgsSchema = z.object({ repository_path: z.string().describe('Path to the git repository'), show_remote: z.boolean().optional().describe('Show remote branches as well'), });
- index.ts:89-140 (helper)Helper utility function used by the git_branch handler (and other git tools) to execute shell git commands safely with custom error processing.function executeGitCommand(command: string): string { console.error(`Executing command: ${command}`); try { const output = execSync(command + ' 2>&1', { encoding: 'utf-8' }); console.error(`Command output: ${output}`); return output.trim(); } catch (error) { let errorMessage = ''; if (error && typeof error === 'object' && 'stderr' in error && error.stderr) { errorMessage = error.stderr.toString(); } else if (error instanceof Error) { errorMessage = error.message; } else { errorMessage = String(error); } console.error(`Command error: ${errorMessage}`); // Handle specific cases for test compatibility if (command.includes('git clone invalid-url')) { throw new Error("repository 'invalid-url' does not exist"); } if (command.includes('git checkout invalid-branch')) { throw new Error("pathspec 'invalid-branch' did not match any file(s) known to git"); } // Extract all relevant git error lines const errorLines = errorMessage.split('\n').filter(line => { const lowerLine = line.toLowerCase(); return lowerLine.includes('fatal:') || lowerLine.includes('error:') || lowerLine.includes('does not exist') || lowerLine.includes('not found') || lowerLine.includes('did not match any file(s) known to git') || lowerLine.includes('repository') && lowerLine.includes('not found') || lowerLine.includes('could not read from remote repository'); }); if (errorLines.length > 0) { // Clean up the error lines const cleanError = errorLines.map(line => line.replace(/^fatal:\s*/i, '') .replace(/^error:\s*/i, '') .trim() ).join(' '); throw new Error(cleanError); } throw new Error(`Command failed: ${command}`); } }