Skip to main content
Glama

GitHub MCP Server

by J-nowcow
git_workflow.htmlβ€’10.9 kB
<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>μžμ—°μ–΄ Git Workflow - MCP GitHub</title> <style> body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; background-color: #f5f5f5; } .container { background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } h1 { color: #2c3e50; text-align: center; margin-bottom: 30px; } .input-section { margin-bottom: 25px; padding: 20px; border: 2px solid #3498db; border-radius: 8px; background-color: #f8f9fa; } .input-group { margin-bottom: 15px; } label { display: block; margin-bottom: 8px; font-weight: 600; color: #2c3e50; } input[type="text"], textarea { width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 6px; font-size: 16px; box-sizing: border-box; } textarea { height: 80px; resize: vertical; } .execute-btn { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; padding: 15px 30px; border-radius: 8px; font-size: 18px; font-weight: 600; cursor: pointer; width: 100%; transition: all 0.3s ease; } .execute-btn:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(0,0,0,0.2); } .execute-btn:disabled { background: #ccc; cursor: not-allowed; transform: none; } .result-section { margin-top: 25px; padding: 20px; border: 1px solid #e0e0e0; border-radius: 8px; background-color: #f8f9fa; } .result-content { background: #2c3e50; color: #ecf0f1; padding: 15px; border-radius: 6px; font-family: 'Courier New', monospace; white-space: pre-wrap; max-height: 400px; overflow-y: auto; } .status { padding: 10px; border-radius: 6px; margin-bottom: 15px; font-weight: 600; } .status.success { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .status.error { background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } .status.info { background-color: #d1ecf1; color: #0c5460; border: 1px solid #bee5eb; } .examples { margin-top: 20px; padding: 15px; background-color: #e8f4f8; border-radius: 6px; border-left: 4px solid #3498db; } .examples h4 { margin-top: 0; color: #2c3e50; } .example-item { margin: 8px 0; padding: 8px; background: white; border-radius: 4px; border: 1px solid #ddd; cursor: pointer; transition: background-color 0.2s; } .example-item:hover { background-color: #f0f0f0; } .loading { display: none; text-align: center; padding: 20px; } .spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto 15px; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } </style> </head> <body> <div class="container"> <h1>πŸš€ μžμ—°μ–΄ Git Workflow - MCP GitHub</h1> <div class="input-section"> <div class="input-group"> <label for="query">πŸ’¬ Git μž‘μ—…μ„ μžμ—°μ–΄λ‘œ μž…λ ₯ν•˜μ„Έμš”:</label> <textarea id="query" placeholder="예: ν˜„μž¬ μ €μž₯μ†Œ μƒνƒœλ₯Ό ν™•μΈν•˜κ³  변경사항을 μ»€λ°‹ν•œ ν›„ ν‘Έμ‹œν•΄μ£Όμ„Έμš”"></textarea> </div> <div class="input-group"> <label for="threadId">🧡 μŠ€λ ˆλ“œ ID (선택사항):</label> <input type="text" id="threadId" placeholder="예: git-workflow-001" value="git-workflow-001"> </div> <button class="execute-btn" onclick="executeGitWorkflow()">πŸš€ μ‹€ν–‰ν•˜κΈ°</button> </div> <div class="examples"> <h4>πŸ’‘ μ‚¬μš© μ˜ˆμ‹œ (ν΄λ¦­ν•˜λ©΄ μžλ™ μž…λ ₯):</h4> <div class="example-item" onclick="fillExample('ν˜„μž¬ μ €μž₯μ†Œ μƒνƒœλ₯Ό ν™•μΈν•˜κ³  λ³€κ²½λœ νŒŒμΌλ“€μ„ λ³΄μ—¬μ£Όμ„Έμš”')"> πŸ“Š μ €μž₯μ†Œ μƒνƒœ 확인 </div> <div class="example-item" onclick="fillExample('λ³€κ²½λœ νŒŒμΌλ“€μ„ μŠ€ν…Œμ΄μ§•ν•˜κ³  μ»€λ°‹ν•΄μ£Όμ„Έμš”')"> πŸ“ 변경사항 μŠ€ν…Œμ΄μ§• 및 컀밋 </div> <div class="example-item" onclick="fillExample('ν˜„μž¬ 브랜치λ₯Ό 원격 μ €μž₯μ†Œμ— ν‘Έμ‹œν•΄μ£Όμ„Έμš”')"> πŸš€ 원격 μ €μž₯μ†Œ ν‘Έμ‹œ </div> <div class="example-item" onclick="fillExample('전체 Git μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ‹€ν–‰ν•΄μ£Όμ„Έμš”: μƒνƒœν™•μΈ β†’ μŠ€ν…Œμ΄μ§• β†’ 컀밋 β†’ ν‘Έμ‹œ')"> πŸ”„ 전체 μ›Œν¬ν”Œλ‘œμš° μ‹€ν–‰ </div> <div class="example-item" onclick="fillExample('졜근 컀밋 νžˆμŠ€ν† λ¦¬λ₯Ό λ³΄μ—¬μ£Όμ„Έμš”')"> πŸ“œ 컀밋 νžˆμŠ€ν† λ¦¬ 확인 </div> </div> <div class="loading" id="loading"> <div class="spinner"></div> <p>Git μž‘μ—…μ„ μ‹€ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€...</p> </div> <div class="result-section" id="resultSection" style="display: none;"> <h3>πŸ“‹ μ‹€ν–‰ κ²°κ³Ό</h3> <div id="status" class="status info">쀀비됨</div> <div class="result-content" id="resultContent">κ²°κ³Όκ°€ 여기에 ν‘œμ‹œλ©λ‹ˆλ‹€.</div> </div> </div> <script> const API_BASE = 'http://localhost:8081'; function fillExample(text) { document.getElementById('query').value = text; } async function executeGitWorkflow() { const query = document.getElementById('query').value.trim(); const threadId = document.getElementById('threadId').value.trim() || 'git-workflow-001'; if (!query) { alert('Git μž‘μ—…μ„ μž…λ ₯ν•΄μ£Όμ„Έμš”!'); return; } // UI μƒνƒœ λ³€κ²½ const executeBtn = document.querySelector('.execute-btn'); const loading = document.getElementById('loading'); const resultSection = document.getElementById('resultSection'); const status = document.getElementById('status'); const resultContent = document.getElementById('resultContent'); executeBtn.disabled = true; executeBtn.textContent = 'μ‹€ν–‰ 쀑...'; loading.style.display = 'block'; resultSection.style.display = 'none'; try { // MCP GitHub 도ꡬλ₯Ό 톡해 Git μž‘μ—… μ‹€ν–‰ const response = await fetch(`${API_BASE}/chat`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ query: query, thread_id: threadId }) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const result = await response.json(); // κ²°κ³Ό ν‘œμ‹œ if (result.status === 'success') { status.className = 'status success'; status.textContent = 'βœ… μ„±κ³΅μ μœΌλ‘œ μ‹€ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€!'; } else if (result.status === 'error') { status.className = 'status error'; status.textContent = '❌ μ‹€ν–‰ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.'; } else { status.className = 'status info'; status.textContent = 'ℹ️ μ‹€ν–‰ μ™„λ£Œ'; } // 응닡 λ‚΄μš© ν‘œμ‹œ let displayContent = ''; if (result.response) { displayContent += `πŸ“ 응닡:\n${result.response}\n\n`; } if (result.used_tools && result.used_tools.length > 0) { displayContent += `πŸ› οΈ μ‚¬μš©λœ 도ꡬ듀:\n${result.used_tools.join(', ')}\n\n`; } if (result.trace) { displayContent += `πŸ” μ‹€ν–‰ 좔적:\n${JSON.stringify(result.trace, null, 2)}`; } resultContent.textContent = displayContent || 'κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€.'; resultSection.style.display = 'block'; } catch (error) { console.error('Error:', error); status.className = 'status error'; status.textContent = '❌ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: ' + error.message; resultContent.textContent = `였λ₯˜ 상세:\n${error.stack || error.message}`; resultSection.style.display = 'block'; } finally { // UI μƒνƒœ 볡원 executeBtn.disabled = false; executeBtn.textContent = 'πŸš€ μ‹€ν–‰ν•˜κΈ°'; loading.style.display = 'none'; } } // Enter ν‚€λ‘œ μ‹€ν–‰ document.getElementById('query').addEventListener('keypress', function(e) { if (e.key === 'Enter' && e.ctrlKey) { executeGitWorkflow(); } }); // νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œ 포컀슀 window.addEventListener('load', function() { document.getElementById('query').focus(); }); </script> </body> </html>

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/J-nowcow/github-MCP-practice'

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