Skip to main content
Glama
markheramis

GIT MCP Server

by markheramis

git_pull

Fetch and integrate changes from a remote Git repository into the specified branch using the GIT MCP Server. Input repository path, remote, and branch for synchronization.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
branchNoBranch name
remoteNoRemote name
repository_pathYesPath to the git repository

Implementation Reference

  • The handler function for the 'git_pull' tool. Constructs and executes a 'git pull' command in the specified repository, handling optional remote and branch parameters, and returns the command output or an error response.
    async ({ repository_path, remote, branch }) => { try { let command = `cd ${repository_path} && git pull ${remote || 'origin'}`; if (branch) { command += ` ${branch}`; } 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 }; } }
  • Inline input schema definition for the 'git_pull' tool within its registration.
    { repository_path: z.string().describe('Path to the git repository'), remote: z.string().optional().describe('Remote name'), branch: z.string().optional().describe('Branch name') },
  • index.ts:206-232 (registration)
    Registration of the 'git_pull' tool using server.tool(), including the tool name, input schema, and handler function.
    server.tool( "git_pull", { repository_path: z.string().describe('Path to the git repository'), remote: z.string().optional().describe('Remote name'), branch: z.string().optional().describe('Branch name') }, async ({ repository_path, remote, branch }) => { try { let command = `cd ${repository_path} && git pull ${remote || 'origin'}`; if (branch) { command += ` ${branch}`; } 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 }; } } );
  • Shared helper function used by all git tools, including git_pull, to execute git commands safely with execSync, logging, and enhanced error handling for git-specific errors.
    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}`); } }
  • Pre-defined Zod schema for GitPull arguments, matching the inline schema used in git_pull tool registration (though not directly used).
    const GitPullArgsSchema = z.object({ repository_path: z.string().describe('Path to the git repository'), remote: z.string().optional().describe('Remote name'), branch: z.string().optional().describe('Branch name'), });

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