GitHub MCP Server가 제공하는 각 툴(명령) 을 내 것으로 만들자
아래 코드는 LangChain MCP 어댑터를 통해 GitHub MCP Server와 연결한 뒤, 서버가 제공하는 모든 툴 목록을 가져오는 예시입니다. 각 구성 요소가 어떤 역할을 하는지 한 줄씩 상세히 설명드리겠습니다.
from langchain_mcp_adapters.client import MultiServerMCPClient
async with MultiServerMCPClient({
"github": { # 서버 식별자
"command": "docker", # MCP 서버를 도커로 즉시 기동
"args": ["run","-i","--rm",
"-e","GITHUB_PERSONAL_ACCESS_TOKEN",
"ghcr.io/github/github-mcp-server"],
"env": {"GITHUB_PERSONAL_ACCESS_TOKEN": "<PAT>"},
"transport": "stdio"
}
}) as client:
tools = {t.name: t for t in client.get_tools()} # 오늘 사용할 Github MCP 도구들
| 항목 | 설명 |
|---|---|
| MultiServerMCPClient | 여러 MCP 서버(github, jira, slack 등)를 한 번에 다룰 수 있는 어댑터입니다. async with 블록이 열리면 내부적으로 서버와 연결을 맺고, 블록을 벗어나면 연결을 정리합니다. |
| 키 | 값 | 의미 |
|---|---|---|
command | "docker" | MCP 서버를 도커 컨테이너로 실행하겠다는 뜻입니다. |
args | ["run", "-i", "--rm", ...] | 실제로 실행할 docker run … 인자 목록입니다. CLI 형식을 배열로 그대로 넣어 주시면 됩니다. |
env | {"GITHUB_PERSONAL_ACCESS_TOKEN": "<PAT>"} | 컨테이너 안에 환경 변수로 전파할 값입니다. 여기서는 GitHub API 인증용 Personal Access Token(PAT)을 넘깁니다. |
transport | "stdio" | MCP 서버와 표준 입출력(stdin/stdout) 으로 통신하겠다는 설정입니다. (다른 옵션: sse, websocket 등) |
tools = {t.name: t for t in client.get_tools()}
client.get_tools() 는 현재 활성화된 MCP 툴 객체 리스트를 반환합니다.
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
owner | str | ✔ | 저장소 소유자 |
repo | str | ✔ | 저장소 이름 |
branch | str | ✔ | 새 브랜치 이름 |
from_branch | str | ✖ | 기준 브랜치 (default_branch 기본) |
await tools["create_branch"].ainvoke({
"owner": "my‑org",
"repo": "demo",
"branch": "feat/auto‑docs",
"from_branch": "main"
})
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
files | List[dict] | ✔ | {path, content, encoding?} |
message | str | ✔ | 커밋 메시지 |
branch | str | ✔ | 대상 브랜치(이미 존재해야 함) |
files = [
{"path": "src/app.py", "content": "print('hi')"},
{"path": "img/logo.png",
"content": base64.b64encode(open("logo.png","rb").read()).decode(),
"encoding": "base64"}
]
await tools["push_files"].ainvoke({
"owner": "my‑org", "repo": "demo",
"branch": "feat/auto‑docs",
"files": files,
"message": "chore: initial commit via MCP"
})
| # | 필드 | 타입 | 필수 | 상세 설명 |
|---|---|---|---|---|
| 1 | owner | str | ✔ | 저장소 소유자 (개인 계정 ID 또는 Organization 이름) |
| 2 | repo | str | ✔ | 저장소 이름 |
| 3 | title | str | ✔ | PR 제목. Conventional Commit(feat: fix: …) 활용 추천 |
| 4 | body | str | ✖ | PR 본문 (Markdown). 이미지 첨부는  로 가능 |
| 5 | head | str | ✔ | 내 브랜치owner:branch 형식도 지원 (포크 간 PR) |
| 6 | base | str | ✔ | 병합 대상 브랜치. 보통 main·dev |
| 7 | draft | bool | ✖ | True → 초안(Draft) PR 로 열림리뷰 전 수정·CI 점검용 |
await tools["create_pull_request"].ainvoke({
"owner": "my‑org",
"repo": "demo",
"title": "feat: auto docs",
"body": "MCP generated docs",
"head": "feat/auto‑docs",
"base": "main",
"draft": False
})
GitHub REST POST /repos/{owner}/{repo}/pulls 와 1:1 대응하므로,
GitHub API 문서에 있는 파라미터(maintainer_can_modify, issue 등)도 동일하게 전달 가능합니다.