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
| Name | Required | Description | Default |
|---|---|---|---|
| repository_path | Yes | Path to the git repository | |
| remote | No | Remote name | |
| branch | No | Branch name |
Implementation Reference
- index.ts:241-259 (handler)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 }; } }
- index.ts:236-240 (schema)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 }; } } );
- index.ts:89-140 (helper)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}`); } }
- index.ts:35-39 (schema)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'), });