Skip to content

yunhalee05/github-mcp

Repository files navigation

GitHub MCP Server

λŒ€ν™”ν˜• GitHub Pull Request 생성을 μœ„ν•œ Model Context Protocol (MCP) μ„œλ²„μž…λ‹ˆλ‹€.

Git 변경사항 뢄석, PR λ‚΄μš© μžλ™ 생성, GitHub API 연동 λ“±μ˜ κΈ°λŠ₯을 단계별 μ›Œν¬ν”Œλ‘œμš°λ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.

πŸš€ μ£Όμš” κΈ°λŠ₯

  • 단계별 PR 생성 μ›Œν¬ν”Œλ‘œμš°: 브랜치 선택 β†’ 변경사항 뢄석 β†’ PR λ‚΄μš© 생성 β†’ GitHub PR 생성
  • λΉ λ₯Έ PR 생성: ν•œ 번의 λͺ…λ ΉμœΌλ‘œ 전체 μ›Œν¬ν”Œλ‘œμš° μ‹€ν–‰ (pr_smart)
  • Git 변경사항 뢄석: 컀밋 νžˆμŠ€ν† λ¦¬, λ³€κ²½λœ 파일, 파일 νƒ€μž…λ³„ λΆ„λ₯˜
  • μ§€λŠ₯적인 PR λ‚΄μš© 생성: 컀밋 λ©”μ‹œμ§€μ™€ 변경사항을 기반으둜 μžλ™ 생성
  • 동적 PR ν…œν”Œλ¦Ώ 지원: μ €μž₯μ†Œλ³„ μ»€μŠ€ν…€ ν…œν”Œλ¦Ώ μžλ™ 감지
  • JIRA ν‹°μΌ“ 연동: PR 제λͺ©κ³Ό 본문에 JIRA ν‹°μΌ“ 번호 μžλ™ 포함
  • GitHub API 톡합: PR 생성, 브랜치 push μžλ™ν™”
  • μž‘μ—… 디렉토리 μžλ™ 감지: μ–΄λŠ ν”„λ‘œμ νŠΈμ—μ„œλ“  λ°”λ‘œ μ‚¬μš© κ°€λŠ₯

πŸ“‹ μš”κ΅¬μ‚¬ν•­

  • Java 21+
  • Gradle 9.2+
  • Git
  • GitHub Personal Access Token (repo κΆŒν•œ ν•„μš”)
  • Claude Code λ˜λŠ” Claude Desktop

πŸ› οΈ μ„€μΉ˜

방법 1: Claude Codeμ—μ„œ claude mcp add μ‚¬μš© (ꢌμž₯)

claude mcp add github-mcp -s user \
  -e GITHUB_TOKEN=ghp_your_token_here \
  -e PR_BASE_BRANCH=develop \
  -e PR_JIRA_PREFIX=PROJ \
  -- java -jar https://github.com/yunhalee05/github-mcp/releases/download/v1.0.0/github_mcp-0.0.1-SNAPSHOT.jar

방법 2: μ„€μ • 파일 직접 μˆ˜μ •

Claude Code μ„€μ •

μ„€μ • 파일 μœ„μΉ˜: ~/.claude/settings.json

{
  "mcpServers": {
    "github-mcp": {
      "command": "java",
      "args": [
        "-jar",
        "/path/to/github-mcp/build/libs/github-mcp-1.0-SNAPSHOT.jar"
      ],
      "env": {
        "GITHUB_TOKEN": "ghp_your_token_here",
        "PR_BASE_BRANCH": "develop",
        "PR_JIRA_PREFIX": "PROJ",
        "PR_TEMPLATE_PATH": "/path/to/custom/template.md"
      }
    }
  }
}

Claude Desktop μ„€μ •

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "github-mcp": {
      "command": "java",
      "args": [
        "-jar",
        "/path/to/github-mcp/build/libs/github-mcp-1.0-SNAPSHOT.jar"
      ],
      "env": {
        "GITHUB_TOKEN": "ghp_your_token_here",
        "PR_BASE_BRANCH": "develop",
        "PR_JIRA_PREFIX": "PROJ",
        "PR_TEMPLATE_PATH": "/path/to/custom/template.md"
      }
    }
  }
}

ν™˜κ²½λ³€μˆ˜ μ„€λͺ…

ν™˜κ²½λ³€μˆ˜ ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
GITHUB_TOKEN βœ… - GitHub Personal Access Token (repo κΆŒν•œ ν•„μš”)
PR_BASE_BRANCH ❌ develop 기본 Base 브랜치
PR_JIRA_PREFIX ❌ PROJ JIRA ν‹°μΌ“ ν”„λ¦¬ν”½μŠ€
PR_TEMPLATE_PATH ❌ μžλ™ 감지 μ»€μŠ€ν…€ PR ν…œν”Œλ¦Ώ 파일 경둜

⚠️ μ€‘μš”μ‚¬ν•­:

  • μž‘μ—… λ””λ ‰ν† λ¦¬λŠ” μžλ™μœΌλ‘œ κ°μ§€λ©λ‹ˆλ‹€ - ν™˜κ²½λ³€μˆ˜ μ„€μ • λΆˆν•„μš”
  • Claude Code/Desktop이 μ‹€ν–‰λ˜λŠ” 디렉토리가 μžλ™μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€
  • AIκ°€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ—μ„œ μž‘μ—… 디렉토리λ₯Ό μžλ™μœΌλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€

GitHub Token 생성

  1. https://github.com/settings/tokens 접속
  2. "Generate new token (classic)" 클릭
  3. ν•„μš”ν•œ κΆŒν•œ 선택:
    • repo (전체)
    • workflow (선택사항)
  4. μƒμ„±λœ 토큰을 λ³΅μ‚¬ν•˜μ—¬ μ„€μ • νŒŒμΌμ— μΆ”κ°€

λΉŒλ“œ

# ν”„λ‘œμ νŠΈ 클둠
git clone https://github.com/YOUR_USERNAME/github-mcp.git
cd github-mcp

# λΉŒλ“œ
./gradlew clean build

# JAR 파일 확인
ls -la build/libs/github-mcp-1.0-SNAPSHOT.jar

πŸ—οΈ μ•„ν‚€ν…μ²˜

ν”„λ‘œμ νŠΈ ꡬ쑰

src/main/kotlin/com/yunhalee/github_mcp/
β”œβ”€β”€ McpServer.kt                     # MCP μ„œλ²„ 메인 μ—”νŠΈλ¦¬ν¬μΈνŠΈ
β”œβ”€β”€ component/
β”‚   └── TemplateLoader.kt           # PR ν…œν”Œλ¦Ώ λ‘œλ”
β”œβ”€β”€ service/
β”‚   β”œβ”€β”€ GitService.kt               # Git λͺ…λ Ήμ–΄ μ‹€ν–‰ μ„œλΉ„μŠ€ (싱글톀)
β”‚   └── GitHubService.kt            # GitHub API 호좜 μ„œλΉ„μŠ€
└── tool/
    β”œβ”€β”€ ToolContext.kt              # Tool 곡유 μ»¨ν…μŠ€νŠΈ
    β”œβ”€β”€ ToolRegistry.kt             # Tool 등둝 κ΄€λ¦¬μž
    β”œβ”€β”€ StartPrWorkflowTool.kt      # PR μ›Œν¬ν”Œλ‘œμš° μ‹œμž‘
    β”œβ”€β”€ SelectBaseBranchTool.kt     # Base 브랜치 선택 및 뢄석
    β”œβ”€β”€ GeneratePrContentTool.kt    # PR λ‚΄μš© 생성
    β”œβ”€β”€ CreatePrConfirmedTool.kt    # PR 생성 μ‹€ν–‰
    β”œβ”€β”€ GetCurrentBranchTool.kt     # ν˜„μž¬ 브랜치 확인
    └── PrSmartTool.kt              # λΉ λ₯Έ PR 생성 (μ›Œν¬ν”Œλ‘œμš° 톡합)

핡심 μ»΄ν¬λ„ŒνŠΈ

1. RegisteredTool νŒ¨ν„΄

Kotlin MCP SDK의 곡식 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ—¬ Tool을 μ •μ˜ν•©λ‹ˆλ‹€:

fun createStartPrWorkflowTool(context: ToolContext) = RegisteredTool(
    Tool(
        name = "start_pr_workflow",
        description = "PR 생성 μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€...",
        inputSchema = ToolSchema(
            properties = buildJsonObject {
                put("working_dir", buildJsonObject {
                    put("type", "string")
                    put("description", "ν˜„μž¬ μž‘μ—… 디렉토리 경둜 - REQUIRED")
                })
            },
            required = listOf("working_dir")
        )
    )
) { request ->
    val workingDir = request.arguments?.get("working_dir")?.jsonPrimitive?.content
        ?: return@RegisteredTool CallToolResult(
            content = listOf(TextContent(text = "❌ working_dir이 ν•„μš”ν•©λ‹ˆλ‹€.")),
            isError = true
        )

    // Tool 둜직 κ΅¬ν˜„
    CallToolResult(content = listOf(TextContent(text = result)))
}

2. ToolContext

λͺ¨λ“  Tool이 κ³΅μœ ν•˜λŠ” μ»¨ν…μŠ€νŠΈ:

data class ToolContext(
    val defaultBaseBranch: String,
    val jiraPrefix: String,
    val githubService: GitHubService?,
    val prTemplatePath: String? = null
) {
    val gitService = GitService()  // 싱글톀 μΈμŠ€ν„΄μŠ€

    private val templateLoader: TemplateLoader by lazy {
        TemplateLoader(customTemplatePath = prTemplatePath)
    }

    fun loadPrTemplate(workingDir: String): String {
        return templateLoader.loadPrTemplate(workingDir)
    }
}

μ£Όμš” 변경사항:

  • defaultWorkingDir 제거 - 더 이상 ν•„μš”ν•˜μ§€ μ•ŠμŒ
  • gitService 싱글톀 μΈμŠ€ν„΄μŠ€ μΆ”κ°€
  • templateLoader μ§€μ—° μ΄ˆκΈ°ν™”λ‘œ PR ν…œν”Œλ¦Ώ λ‘œλ”©

3. GitService (싱글톀 νŒ¨ν„΄)

λͺ¨λ“  Git μž‘μ—…μ„ μ²˜λ¦¬ν•˜λ©°, workingDir을 λ©”μ„œλ“œ νŒŒλΌλ―Έν„°λ‘œ λ°›μŠ΅λ‹ˆλ‹€:

class GitService {
    suspend fun getCurrentBranch(workingDir: String): Result<String>
    suspend fun getBranches(workingDir: String): Result<List<String>>
    suspend fun getDiff(workingDir: String, baseBranch: String, currentBranch: String): Result<String>
    suspend fun getChangedFiles(workingDir: String, baseBranch: String, currentBranch: String): Result<List<String>>
    suspend fun getCommits(workingDir: String, baseBranch: String, currentBranch: String): Result<List<String>>
    suspend fun getCommitCount(workingDir: String, baseBranch: String, currentBranch: String): Result<Int>
    suspend fun pushBranch(workingDir: String, branch: String): Result<String>
    suspend fun fetchBranch(workingDir: String, branch: String): Result<String>
    suspend fun checkRemoteBranchExists(workingDir: String, branch: String): Result<Boolean>
    suspend fun getRepositoryInfo(workingDir: String): Result<Map<String, String>>
}

섀계 νŠΉμ§•:

  • 싱글톀 νŒ¨ν„΄μœΌλ‘œ μΈμŠ€ν„΄μŠ€ μž¬μ‚¬μš©
  • workingDir을 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°€ μ•„λ‹Œ λ©”μ„œλ“œ νŒŒλΌλ―Έν„°λ‘œ λ°›μŒ
  • MCP μ„œλ²„κ°€ μ—¬λŸ¬ ν”„λ‘œμ νŠΈλ₯Ό λ™μ‹œμ— 처리 κ°€λŠ₯

4. TemplateLoader

PR ν…œν”Œλ¦Ώμ„ λ™μ μœΌλ‘œ λ‘œλ“œν•©λ‹ˆλ‹€:

class TemplateLoader(private val customTemplatePath: String? = null) {
    fun loadPrTemplate(workingDir: String): String {
        val templatePaths = listOf(
            "$workingDir/.github/PULL_REQUEST_TEMPLATE.md",
            "$workingDir/.github/pull_request_template.md",
            "$workingDir/docs/pull_request_template.md",
            customTemplatePath
        )

        for (path in templatePaths) {
            path?.let {
                val file = File(it)
                if (file.exists() && file.isFile) {
                    return file.readText()
                }
            }
        }

        return DEFAULT_PR_TEMPLATE
    }
}

5. ToolRegistry

Tool 등둝을 쀑앙 관리:

class ToolRegistry(private val context: ToolContext) {
    fun getAllTools(): List<RegisteredTool> = listOf(
        createStartPrWorkflowTool(context),
        createSelectBaseBranchTool(context),
        createGeneratePrContentTool(context),
        createCreatePrConfirmedTool(context),
        createGetCurrentBranchTool(context),
        createPrSmartTool(context)
    )

    fun registerAll(server: Server) {
        getAllTools().forEach { tool ->
            server.addTool(tool.tool, tool.handler)
        }
    }
}

πŸ“š μ‚¬μš© κ°€λŠ₯ν•œ Tools

1. start_pr_workflow - PR μ›Œν¬ν”Œλ‘œμš° μ‹œμž‘

PR 생성 μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€.

Parameters:

  • working_dir (ν•„μˆ˜): μž‘μ—… 디렉토리 경둜 (AIκ°€ μžλ™ 전달)

λ™μž‘:

  • ν˜„μž¬ Git 브랜치 확인
  • main/master 브랜치 체크
  • μ‚¬μš© κ°€λŠ₯ν•œ base 브랜치 λͺ©λ‘ λ°˜ν™˜

λ‹€μŒ 단계: μ‚¬μš©μžκ°€ base 브랜치λ₯Ό μ„ νƒν•˜λ©΄ select_base_branch 호좜

2. select_base_branch - Base 브랜치 선택

Base 브랜치λ₯Ό μ„ νƒν•˜κ³  변경사항을 λΆ„μ„ν•©λ‹ˆλ‹€.

Parameters:

  • base_branch (ν•„μˆ˜): Base 브랜치 이름
  • working_dir (ν•„μˆ˜): μž‘μ—… 디렉토리 경둜 (AIκ°€ μžλ™ 전달)

λ™μž‘:

  • 브랜치 쑴재 확인 및 fetch
  • λ³€κ²½λœ 파일 λͺ©λ‘ 쑰회
  • 컀밋 νžˆμŠ€ν† λ¦¬ 뢄석
  • 파일 νƒ€μž…λ³„ λΆ„λ₯˜

λ‹€μŒ 단계: μ‚¬μš©μžκ°€ JIRA 티켓을 μž…λ ₯ν•˜λ©΄ generate_pr_content 호좜

3. generate_pr_content - PR λ‚΄μš© 생성

JIRA ν‹°μΌ“κ³Ό 변경사항을 기반으둜 PR 제λͺ©κ³Ό 본문을 μƒμ„±ν•©λ‹ˆλ‹€.

Parameters:

  • base_branch (ν•„μˆ˜): Base 브랜치
  • jira_ticket (ν•„μˆ˜): JIRA ν‹°μΌ“ 번호 (μ—†μœΌλ©΄ "μ—†μŒ")
  • additional_context (선택): μΆ”κ°€ μ»¨ν…μŠ€νŠΈ
  • working_dir (ν•„μˆ˜): μž‘μ—… 디렉토리 경둜 (AIκ°€ μžλ™ 전달)

λ™μž‘:

  • Git diff 뢄석
  • PR 제λͺ© 생성 (JIRA ν‹°μΌ“ 포함)
  • μ €μž₯μ†Œμ˜ PR ν…œν”Œλ¦Ώ μžλ™ 감지 및 λ‘œλ“œ
  • AIμ—κ²Œ 변경사항 μš”μ•½ 및 ν…œν”Œλ¦Ώ μž‘μ„± μš”μ²­

ν…œν”Œλ¦Ώ μš°μ„ μˆœμœ„:

  1. .github/PULL_REQUEST_TEMPLATE.md
  2. .github/pull_request_template.md
  3. docs/pull_request_template.md
  4. PR_TEMPLATE_PATH ν™˜κ²½λ³€μˆ˜ 경둜
  5. κΈ°λ³Έ λ‚΄μž₯ ν…œν”Œλ¦Ώ

λ‹€μŒ 단계: μ‚¬μš©μžκ°€ ν™•μΈν•˜λ©΄ create_pr_confirmed 호좜

4. create_pr_confirmed - PR 생성 μ‹€ν–‰

μ‹€μ œλ‘œ GitHub PR을 μƒμ„±ν•©λ‹ˆλ‹€.

Parameters:

  • title (ν•„μˆ˜): PR 제λͺ©
  • body (ν•„μˆ˜): PR λ³Έλ¬Έ
  • base_branch (ν•„μˆ˜): Base 브랜치
  • working_dir (ν•„μˆ˜): μž‘μ—… 디렉토리 경둜 (AIκ°€ μžλ™ 전달)

λ™μž‘:

  • 브랜치 push (원격에 μ—†λŠ” 경우)
  • Repository 정보 쑰회 (owner/repo μΆ”μΆœ)
  • GitHub API둜 PR 생성
  • μƒμ„±λœ PR URL λ°˜ν™˜

5. get_current_branch - ν˜„μž¬ 브랜치 확인

ν˜„μž¬ Git 브랜치λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

Parameters:

  • working_dir (ν•„μˆ˜): μž‘μ—… 디렉토리 경둜 (AIκ°€ μžλ™ 전달)

λ™μž‘:

  • ν˜„μž¬ 브랜치λͺ… λ°˜ν™˜

6. pr_smart - λΉ λ₯Έ PR 생성

전체 μ›Œν¬ν”Œλ‘œμš°λ₯Ό ν•œ λ²ˆμ— μ‹€ν–‰ν•©λ‹ˆλ‹€.

Parameters:

  • base_branch (ν•„μˆ˜): Base 브랜치
  • jira_ticket (선택): JIRA ν‹°μΌ“ 번호
  • additional_context (선택): μΆ”κ°€ μ»¨ν…μŠ€νŠΈ
  • working_dir (ν•„μˆ˜): μž‘μ—… 디렉토리 경둜 (AIκ°€ μžλ™ 전달)

λ™μž‘:

  • 브랜치 확인 β†’ 변경사항 뢄석 β†’ PR λ‚΄μš© 생성을 ν•œ λ²ˆμ— 처리
  • μƒμ„±λœ PR λ‚΄μš©μ„ μ‚¬μš©μžμ—κ²Œ 보여주고 확인 μš”μ²­
  • 확인 μ‹œ create_pr_confirmed 호좜

πŸ”§ 개발 κ°€μ΄λ“œ

μƒˆλ‘œμš΄ Tool μΆ”κ°€ν•˜κΈ°

1. Tool 파일 생성

src/main/kotlin/com/yunhalee/github_mcp/tool/YourNewTool.kt:

2. ToolRegistry에 등둝

src/main/kotlin/com/yunhalee/github_mcp/tool/ToolRegistry.kt:

fun getAllTools(): List<RegisteredTool> = listOf(
    createStartPrWorkflowTool(context),
    createSelectBaseBranchTool(context),
    // ...
    createYourNewTool(context)  // μΆ”κ°€!
)

3. λΉŒλ“œ 및 ν…ŒμŠ€νŠΈ

./gradlew clean build
java -jar build/libs/github-mcp-1.0-SNAPSHOT.jar

GitService / GithubService μ‚¬μš©ν•˜κΈ°

μ€‘μš”: GitServiceλŠ” μ‹±κΈ€ν†€μœΌλ‘œ μ‚¬μš©λ˜λ©°, workingDir을 λ©”μ„œλ“œ νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.

PR ν…œν”Œλ¦Ώ μ‚¬μš©ν•˜κΈ°

// ToolContextλ₯Ό 톡해 ν…œν”Œλ¦Ώ λ‘œλ“œ
val template = context.loadPrTemplate(workingDir)

// ν…œν”Œλ¦Ώμ€ μ‹€ν–‰ μ €μž₯μ†Œμ˜ .github/PULL_REQUEST_TEMPLATE.md λ˜λŠ”
// PR_TEMPLATE_PATH ν™˜κ²½λ³€μˆ˜ κ²½λ‘œμ—μ„œ μžλ™μœΌλ‘œ λ‘œλ“œλ©λ‹ˆλ‹€

🌟 μž‘λ™ 원리

μž‘μ—… 디렉토리 μžλ™ 감지

이 MCP μ„œλ²„λŠ” μž‘μ—… 디렉토리λ₯Ό μžλ™μœΌλ‘œ κ°μ§€ν•©λ‹ˆλ‹€:

  1. Claude Code/Desktop이 싀행될 λ•Œ ν˜„μž¬ μž‘μ—… 디렉토리λ₯Ό AI μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ‘œ 전달
  2. AIκ°€ <env>Working directory: /path/to/project</env> 정보λ₯Ό 읽음
  3. 각 Tool 호좜 μ‹œ AIκ°€ μžλ™μœΌλ‘œ working_dir νŒŒλΌλ―Έν„°μ— 경둜λ₯Ό 전달
  4. MCP μ„œλ²„κ°€ ν•΄λ‹Ή λ””λ ‰ν† λ¦¬μ—μ„œ Git λͺ…λ Ήμ–΄ μ‹€ν–‰

μž₯점:

  • ν”„λ‘œμ νŠΈλ§ˆλ‹€ 별도 μ„€μ • λΆˆν•„μš”
  • Claude Code/Desktop을 μ–΄λŠ ν”„λ‘œμ νŠΈμ—μ„œ μ‹€ν–‰ν•˜λ“  μžλ™μœΌλ‘œ ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ˜ Git μ €μž₯μ†Œ 인식
  • μ„€μ • 파일 κ°„μ†Œν™” - ν™˜κ²½λ³€μˆ˜λ‘œ WORKING_DIR μ§€μ • λΆˆν•„μš”
  • μ—¬λŸ¬ ν”„λ‘œμ νŠΈμ—μ„œ λ™μ‹œμ— μž‘μ—… κ°€λŠ₯

MCP 톡신 방식

MCP μ„œλ²„λŠ” STDIO(Standard Input/Output)둜 ν†΅μ‹ ν•©λ‹ˆλ‹€:

  • HTTP μ„œλ²„ λΆˆν•„μš”
  • Spring Boot Context λΆˆν•„μš”
  • Dependency Injection λΆˆν•„μš”
  • 순수 Kotlin + MCP SDK둜 μΆ©λΆ„

κ²°κ³Ό:

  • 13MB의 κ°€λ²Όμš΄ JAR (Spring Boot μ‚¬μš© μ‹œ 30-40MB)
  • λΉ λ₯Έ μ‹œμž‘ μ‹œκ°„
  • λͺ…ν™•ν•œ μ˜μ‘΄μ„±

πŸ“¦ μ˜μ‘΄μ„±

dependencies {
    // MCP SDK
    implementation("io.modelcontextprotocol:kotlin-sdk:0.8.0")

    // Ktor Client (HTTP μš”μ²­)
    implementation("io.ktor:ktor-client-cio:3.3.2")
    implementation("io.ktor:ktor-client-content-negotiation:3.3.2")
    implementation("io.ktor:ktor-serialization-kotlinx-json:3.3.2")

    // Kotlin IO (STDIO 톡신)
    implementation("org.jetbrains.kotlinx:kotlinx-io-core:0.5.4")

    // Logging
    implementation("org.slf4j:slf4j-simple:2.0.16")
}

πŸ”— μ°Έκ³  자료

πŸ“ λΉ λ₯Έ μ‹œμž‘

μžμ„Έν•œ μ„€μΉ˜ 및 μ‚¬μš© 방법은 QUICKSTART.mdλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

πŸ“ λΌμ΄μ„ΌμŠ€

이 ν”„λ‘œμ νŠΈλŠ” 개인 ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.

🀝 κΈ°μ—¬

버그 λ¦¬ν¬νŠΈλ‚˜ κΈ°λŠ₯ μ œμ•ˆμ€ 이슈둜 λ“±λ‘ν•΄μ£Όμ„Έμš”.


About

πŸš€ λŒ€ν™”ν˜• GitHub MCP μ„œλ²„ | AI-powered PR automation for Claude Code/Desktop

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors