GitHub Copilot Coding AgentをローカルLLMで再現してみた（無料・ローカル）

# GitHub Copilot Coding AgentをローカルLLMで再現してみた（無料・ローカル）

## 概要

GitHub CopilotのAgent機能は強力ですが、月額39ドルの費用やデータの外部送信が気になる方も多いはず。
本記事では、GitHub CopilotのCoding Agent相当の仕組みを**ローカルLLMのみ**で実現しました。
issueに書いて欲しい仕様を書いて、labelに```coding agent```を振っておくと、自動でissueを見つけてコードを生成、git上に出力してくれます。
(現状では、試したのはhello world出力のみ。多分もうちょっと複雑なことをするにはプロンプトの改良が必要,ただ、qwen3-30Bが凄いので、結果動きそう)

* issueからタスクを自動取得し
* LLMがコードを提案・改良し
* 必要に応じてMCP (Model Context Protocol) サーバーのツールを使ってGitHub APIにアクセス

という一連の処理を、**無料で・ローカル環境で・プライバシーを守りながら**実行できます。

> ✅ 実装リポジトリはこちら
> [https://github.com/notfolder/coding\_agent](https://github.com/notfolder/coding_agent)

## 使い方(Dockerに対応しました！！)

0. プロジェクト内のsample.envを参考に.envファイルを作成、APIキーを設定

1. githubかgitlabのissueにllmにお願い事をかく
2. issueに'''coding agent'''というラベルを付ける
3. run.shをcronで定期起動するとllmがissueを読んでコーディングしたりREADME.md書いたりしてくれます

---

## 目的と背景

GitHub Copilot ChatやCopilot Workspaceが登場し、"issue からコードを生成する"という開発スタイルが一般化しつつあります。
しかし、商用モデルを前提とするこれらのツールには次のような制約があります。

* 月額費用（Copilot Pro/Enterprise: \$39）
* API利用時の追加課金
* 外部サービスにコードを送信する必要がある

そこで今回は、ローカルで動作するLLM（例：Qwen 30B、Mistralなど）とMCPサーバーを連携し、GitHub Copilot Coding Agentと同様の動作を模倣・拡張できるシステムを構築しました。

---

## システム全体像と仕様（spec.mdより）

以下の仕様に基づき、エージェント全体の処理を構成しています。

### 主なコンポーネント

* **LLM Client**（lmstudio / ollama / openai に対応した抽象クラス）
* **MCPToolClient**：MCPサーバーへの同期呼び出しを抽象化
* **TaskGetterFromGitHub**：GitHub issueを取得し、Taskとして加工
* **TaskGitHubIssue**：GitHub上のissueへのコメント／ラベル操作などを抽象化

### 主な処理フロー

1. MCPサーバーを`config.yaml`に定義された設定で起動
2. GitHubから「coding agent」ラベル付きissueを取得
3. 各issueについて、プロンプトを作成しLLMを呼び出す
4. LLMの応答に含まれる `command` 指示に基づきMCPサーバーを操作
5. 結果を再度LLMに渡して応答を継続
6. `done: true` が返るまで繰り返し、完了したらラベル付与・コメント投稿

---

## JSON-RPCでMCPツールを呼ぶときの注意点

MCPサーバーとの通信はJSON-RPC形式で行われます。重要なポイントは以下の通りです。

```python
req_obj = {
    "jsonrpc": "2.0",
    "id": self._id_counter,
    "method": "tools/call",
    "params": {
        "name": tool,
        "arguments": args
    }
}
```

### ❗️ハマりどころ：tool名をそのままmethodに書くと動かない！

```json
{
  "jsonrpc": "2.0",
  "method": "update_issue",
  ...
}
```

のようにすると `Method not found` しか返ってきません。

### ✅ 正しくは `tools/call` を明示

```json
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "update_issue",
    "arguments": {
      ...
    }
  }
}
```

これに気づかず、MCPサーバーのレスポンスがずっと「Method not found」で悩み、3週間ほど格闘しました。

---

## 特徴と利点

### 💰 完全無料

* ローカルLLM（例: Qwen 30B, Mistral）を使用し、OpenAIのAPI料金なし
* GitHub APIアクセスもトークンベースで制御（Docker経由）

### 🔒 プライバシー保護

* LLMもMCPもすべてローカル実行
* 企業内や個人の閉じた開発環境でも安心

### 🧹 拡張性

* MCPプロトコル準拠のサーバーであれば何でも繋がる
* GitHub操作以外のツール（メール通知、ChatOps等）も追加可能
* Gitlabを実装予定

---

## コード構成（抜粋）

```bash
.
├── config.yaml              # 各種設定
├── main.py                 # エージェント起動スクリプト
├── clients/
│   ├── mcp_tool_client.py  # MCPサーバー呼び出しロジック
│   └── lm_client.py        # LLMプロバイダ別の抽象クライアント
├── handlers/
│   ├── task_handler.py
│   ├── task_getter.py
│   └── task_getter_github.py
```

たとえば `mcp_tool_client.py` では、上述した正しい `tools/call` の形式でMCPにリクエストを送り、レスポンスを受けてLLMへ渡す流れを記述しています。

---

## 実行方法（例）

1. GitHubトークンを環境変数に設定
2. `cron`で `main.py` を一定間隔で実行
3. `config.yaml` で使用するLLMやMCPツールを定義
4. `main.py` を実行してGitHub issueの自動処理開始！

---

## まとめ・所感

本記事では、GitHub Copilot Agent的なタスク駆動型の開発支援を、**ローカルLLM + MCPサーバー + GitHub API**で再現しました。

* ローカルLLMなので **コストゼロ、情報流出なし**
* chatgptと相談して`spec.md`を作って、chatgptにコーディングしてもらいました
* JSON-RPCの仕様落とし穴に注意が必要（特に`tools/call`の部分）

Copilot Agentを使いたいが課金や情報管理が気になる方にとって、本記事が参考になれば幸いです。

---

## 参考リンク

* [Model Context Protocol 公式](https://modelcontextprotocol.io/)
* [GitHub MCP Server](https://github.com/github/github-mcp-server)
* [実装リポジトリ](https://github.com/notfolder/coding_agent)

---

## この記事の作成過程

ChatGPTと複数回の対話を重ねながら、仕様検討・コード設計・エラー対処まで行いました。

* 相談ログ: [https://chatgpt.com/share/6856a615-2220-8009-9917-09e3d2362d81](https://chatgpt.com/share/6856a615-2220-8009-9917-09e3d2362d81)

---