Skip to main content
Glama
markheramis

GIT MCP Server

by markheramis

git_clone

Clone a Git repository into a specified directory and checkout a specific branch using the GIT MCP Server. Simplifies repository management via natural language commands for AI assistants.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
branchNoBranch to checkout
directoryNoTarget directory for the repository
repositoryYesGit repository URL to clone

Implementation Reference

  • index.ts:149-183 (registration)
    Registration of the git_clone MCP tool using server.tool(), defining input schema and handler function.
    server.tool( "git_clone", { repository: z.string().describe('Git repository URL to clone'), directory: z.string().optional().describe('Target directory for the repository'), branch: z.string().optional().describe('Branch to checkout') }, async ({ repository, directory, branch }) => { try { let command = `git clone ${repository}`; if (directory) { command += ` ${directory}`; } const output = executeGitCommand(command); let response = output; if (branch) { const targetDir = directory || repository.split('/').pop()?.replace('.git', '') || ''; const checkoutOutput = executeGitCommand(`cd ${targetDir} && git checkout ${branch}`); response += '\n' + checkoutOutput; } return { content: [{ type: "text", text: response }] }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { content: [{ type: "text", text: `Error: ${errorMessage}` }], isError: true }; } } );
  • The handler function for git_clone that executes the git clone command, optionally checks out a specified branch, and returns the output or error.
    async ({ repository, directory, branch }) => { try { let command = `git clone ${repository}`; if (directory) { command += ` ${directory}`; } const output = executeGitCommand(command); let response = output; if (branch) { const targetDir = directory || repository.split('/').pop()?.replace('.git', '') || ''; const checkoutOutput = executeGitCommand(`cd ${targetDir} && git checkout ${branch}`); response += '\n' + checkoutOutput; } return { content: [{ type: "text", text: response }] }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { content: [{ type: "text", text: `Error: ${errorMessage}` }], isError: true }; } }
  • Input schema for git_clone tool using Zod schemas for repository URL, optional directory, and optional branch.
    { repository: z.string().describe('Git repository URL to clone'), directory: z.string().optional().describe('Target directory for the repository'), branch: z.string().optional().describe('Branch to checkout') },
  • Helper function executeGitCommand that safely runs git commands via execSync, logs output, and processes errors for clean reporting.
    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}`); } }

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/markheramis/mcp-git'

If you have feedback or need assistance with the MCP directory API, please join our Discord server