Skip to main content
Glama
markheramis

GIT MCP Server

by markheramis

git_push

Push committed changes from a local Git repository to a specified remote branch, enabling version control updates and collaboration through the GIT MCP Server.

Input Schema

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

Implementation Reference

  • Handler function that constructs and executes the 'git push' command in the given repository path, with optional remote and branch parameters. Uses executeGitCommand helper and returns output or formatted error.
    async ({ repository_path, remote, branch }) => { try { let command = `cd ${repository_path} && git push ${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 Zod input schema definition for the git_push tool parameters.
    { 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:234-260 (registration)
    MCP server tool registration for 'git_push', specifying the name, input schema, and handler function.
    server.tool( "git_push", { 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 push ${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 }; } } );
  • Utility function to execute git commands safely, with logging, error capturing, specific error cleaning for git failures, used by git_push and other tools.
    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}`); } }
  • Defined Zod schema for GitPushArgs (unused in registration, but matches inline schema).
    const GitPushArgsSchema = 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'), });

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