Skip to main content
Glama

my-project-repo_mgit_push

Push changes to the 'my-project-repo' Git repository with a commit message after reviewing recent push history to avoid duplicates.

Instructions

[My Awesome Project] Execute mgit push command for repository "my-project-repo" with a commit message.

IMPORTANT:

  • You MUST call get_push_history tool FIRST to view the last 5 push records before using this tool

  • Confirm that the changes in this push have not been pushed before, otherwise modify the push message and push again

  • The repository name is configured via REPO_NAME environment variable

  • Language setting: en (default: en)

  • Push history check is enabled (CHECK_PUSH_HISTORY=true). You must review push history before pushing.

USAGE:

  1. First call get_push_history to view recent push records

  2. Then call this tool with the commit message parameter. Example: {message: "Update project files"}

Please provide the commit message in English language.

NOTE: If the push result contains a branch merge URL (such as a pull request URL), please output it to the user. If you can open a browser, you may also automatically open the URL.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
messageYesCommit message in English language. Example: {message: "Update project files"}

Implementation Reference

  • The main handler function `mgit_push` that implements the tool logic: validates `message` param, enforces push history check if enabled, calls `executeMgitPush`, logs and records history, returns structured result or throws on error.
    async mgit_push(params) { const { message } = params; if (!message || typeof message !== 'string') { throw new Error('Missing message parameter'); } // Check if push history has been checked (only if CHECK_PUSH_HISTORY is enabled) if (CHECK_PUSH_HISTORY && !this.hasCheckedPushHistory) { // Get the actual tool name (with prefix if REPO_NAME is set) const pushHistoryToolName = REPO_NAME ? `${REPO_NAME}_get_push_history` : 'get_push_history'; const pushToolName = REPO_NAME ? `${REPO_NAME}_mgit_push` : 'mgit_push'; // Return JSON-RPC 2.0 compliant result with multiple prompt messages return { content: [ { type: 'text', text: '⚠️ ERROR: Push history check is required before pushing code.' }, { type: 'text', text: `🔧 REQUIRED ACTION: You must call the "${pushHistoryToolName}" tool first to view recent push records.` }, { type: 'text', text: `📋 TOOL NAME: "${pushHistoryToolName}" - Use this tool to get the last 5 push history records.` }, { type: 'text', text: `📝 TOOL CALL EXAMPLE: Call tools/call with name="${pushHistoryToolName}" and empty arguments: {"name": "${pushHistoryToolName}", "arguments": {}}` }, { type: 'text', text: '🔍 STEP 1: Call get_push_history tool to view the last 5 push records for this repository.' }, { type: 'text', text: '📊 STEP 2: Review the push history records to see what has been pushed recently.' }, { type: 'text', text: '✅ STEP 3: Confirm that the changes you want to push have NOT been pushed before by comparing with the history.' }, { type: 'text', text: '🔄 STEP 4: If the changes have already been pushed, modify the commit message to reflect new changes, then try again.' }, { type: 'text', text: `🚀 STEP 5: After reviewing and confirming, you can then call "${pushToolName}" tool to proceed with the push.` }, { type: 'text', text: `⚠️ IMPORTANT: The "${pushHistoryToolName}" tool must be called before "${pushToolName}" tool, otherwise the push will be rejected.` } ], isError: true, errorCode: 'PUSH_HISTORY_CHECK_REQUIRED' }; } try { const result = await executeMgitPush(message); // Log operation logRequest('mgit_push', { repo_name: REPO_NAME, message }, result); // Record push history recordPushHistory(message, result, null); // Reset the flag after successful push this.hasCheckedPushHistory = false; return { success: true, repo_name: REPO_NAME, message: message, output: result.stdout, error_output: result.stderr, exit_code: result.exitCode }; } catch (err) { // Log operation error logRequest('mgit_push', { repo_name: REPO_NAME, message }, null, err.error || err.message); // Record push history even on error recordPushHistory(message, null, err.error || err.message); // Reset the flag after error this.hasCheckedPushHistory = false; throw new Error(`MGit push failed: ${err.error || err.message}`); } }
  • Helper function `executeMgitPush` that spawns the `mgit push <repo> <message>` subprocess, captures output streams and exit code, resolves success or rejects with error details.
    const executeMgitPush = async (message) => { return new Promise((resolve, reject) => { const command = MGIT_CMD; // Clean the message: remove or escape problematic characters // Remove double quotes from the message to avoid argument parsing issues // Replace double quotes with single quotes or remove them const cleanedMessage = message.replace(/"/g, "'"); // When using spawn with array args, we don't need quotes // The message will be passed as a single argument even if it contains spaces const args = ['push', REPO_NAME, cleanedMessage]; console.error(`Executing: ${command} ${args.map(arg => arg.includes(' ') ? `"${arg}"` : arg).join(' ')}`); // Use shell: false to pass arguments directly without shell interpretation // This ensures the message is passed as a single argument even with spaces const child = spawn(command, args, { stdio: ['inherit', 'pipe', 'pipe'], shell: false }); let stdout = ''; let stderr = ''; child.stdout.on('data', (data) => { const output = data.toString(); stdout += output; console.error(output); }); child.stderr.on('data', (data) => { const output = data.toString(); stderr += output; console.error(output); }); child.on('close', (code) => { if (code === 0) { resolve({ success: true, stdout: stdout, stderr: stderr, exitCode: code }); } else { reject({ success: false, stdout: stdout, stderr: stderr, exitCode: code, error: `Command exited with code ${code}` }); } }); child.on('error', (err) => { reject({ success: false, error: err.message, stdout: stdout, stderr: stderr }); }); }); };
  • Tool registration in `tools/list` method: defines the tool name as `${REPO_NAME}_mgit_push` (e.g., 'my-project-repo_mgit_push'), detailed description, and input schema requiring 'message' string.
    { name: getToolName('mgit_push'), description: getToolDescription(`Execute ${MGIT_CMD} push command for repository "${REPO_NAME}" with a commit message. IMPORTANT: ${CHECK_PUSH_HISTORY ? '- You MUST call get_push_history tool FIRST to view the last 5 push records before using this tool\n- Confirm that the changes in this push have not been pushed before, otherwise modify the push message and push again\n' : ''}- The repository name is configured via REPO_NAME environment variable - Language setting: ${LANGUAGE} (default: en) ${CHECK_PUSH_HISTORY ? '- Push history check is enabled (CHECK_PUSH_HISTORY=true). You must review push history before pushing.\n' : '- Push history check is disabled (CHECK_PUSH_HISTORY=false). You can push directly without checking history.\n'} USAGE: ${CHECK_PUSH_HISTORY ? '1. First call get_push_history to view recent push records\n2. ' : ''}Then call this tool with the commit message parameter. Example: {message: "${LANGUAGE === 'en' ? 'Update project files' : LANGUAGE === 'zh' || LANGUAGE === 'zh-CN' ? '更新项目文件' : LANGUAGE === 'zh-TW' ? '更新專案檔案' : 'Update project files'}"} Please provide the commit message in ${LANGUAGE === 'en' ? 'English' : LANGUAGE === 'zh' || LANGUAGE === 'zh-CN' ? 'Chinese' : LANGUAGE === 'zh-TW' ? 'Traditional Chinese' : LANGUAGE} language. NOTE: If the push result contains a branch merge URL (such as a pull request URL), please output it to the user. If you can open a browser, you may also automatically open the URL.`), inputSchema: { type: 'object', properties: { message: { type: 'string', description: `Commit message in ${LANGUAGE === 'en' ? 'English' : LANGUAGE === 'zh' || LANGUAGE === 'zh-CN' ? 'Chinese' : LANGUAGE === 'zh-TW' ? 'Traditional Chinese' : LANGUAGE} language. Example: {message: "${LANGUAGE === 'en' ? 'Update project files' : LANGUAGE === 'zh' || LANGUAGE === 'zh-CN' ? '更新项目文件' : LANGUAGE === 'zh-TW' ? '更新專案檔案' : 'Update project files'}"}` } }, required: ['message'] } }
  • Input schema definition for the tool: object with required 'message' property of type string, including language-specific description and example.
    inputSchema: { type: 'object', properties: { message: { type: 'string', description: `Commit message in ${LANGUAGE === 'en' ? 'English' : LANGUAGE === 'zh' || LANGUAGE === 'zh-CN' ? 'Chinese' : LANGUAGE === 'zh-TW' ? 'Traditional Chinese' : LANGUAGE} language. Example: {message: "${LANGUAGE === 'en' ? 'Update project files' : LANGUAGE === 'zh' || LANGUAGE === 'zh-CN' ? '更新项目文件' : LANGUAGE === 'zh-TW' ? '更新專案檔案' : 'Update project files'}"}` } }, required: ['message'] }
  • Helper logic in `tools/call` handler that strips the repo prefix (e.g., 'my-project-repo_') from tool name to map to internal `mgit_push` method.
    let actualMethodName = name; if (REPO_NAME && name.startsWith(`${REPO_NAME}_`)) { actualMethodName = name.substring(REPO_NAME.length + 1); }

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/liliangshan/mcp-server-mgit'

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