0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-06-21

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

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

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

  2. githubかgitlabのissueにllmにお願い事をかく

  3. issueに'''coding agent'''というラベルを付ける

  4. 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形式で行われます。重要なポイントは以下の通りです。

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

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

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

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

✅ 正しくは tools/call を明示

{
  "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を実装予定

コード構成(抜粋)

.
├── 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. cronmain.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を使いたいが課金や情報管理が気になる方にとって、本記事が参考になれば幸いです。


参考リンク


この記事の作成過程

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


0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?