はじめに
最近はClaude Code Actionが出てそっちとの組み合わせでも触ろうと思いますが、Docker Desktop MCP toolkitを触ってみたいなと思い設定してみました。
あと体感としてDocker Desktopを経由したGitHubMCPとの接続のやり方が見当たらなかった(経由しないのとほぼ変わらんですが)
ゴールとしては、バイブコーディングやエージェント支援ではなく自律的に開発を進めてもらいGitHub運用してもらうことです。
Docker Desktop MCP Toolkitとは(簡単に)
MCP サーバーをローカルで扱う際には、ツールごとに環境を用意する必要があるかつ、ローカル環境が煩雑になり汚れる懸念があるなか、コンテナでの実行で環境に左右されることを減らします。
また、ホスト上で動かさずに済むのでセキュリティ的にも助かります。
設定手順
GitHubの設定
GitHubのAPIが利用できるように、下記のURLからPATを生成
https://github.com/settings/tokens
Generate new tokenを押下します(動作確認をさっさとしたいのでClassic選択です)
scopeはrepo権限を全てつけてます。
これでPATを発行してコピペしてどこかに保存しておきます。
Docker Desktop Toolkitの設定
Docker Desktopを開き、左のExtentionsタブを選択します。
Browseタブから「Docker MCP Toolkit」を検索しinstallします。(結構長いです)
インストール完了後に左タブにMCP Toolkitタブが出現するので選択
MCP Serversタブで「GitHub Officials」を検索して選択
Configurationタブで先ほど発行したGitHubのPATを入れます。
その後にGitHub OfficialsのトグルボタンをONにします。
MCPClientsタブにてCursorのConnectを押下
Cursorの設定
上部のシステムバーからCursor→基本設定→CursorSettings→MCPタブ で移動します(Macの場合)
Add new global MCP serverをクリックします。
mcp.jsonが開くため、下記の設定を追加する。(公式のREADMEから確認できる)
{ "mcpServers": { "github-official": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "mcp/github-mcp-server" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "GitHubにて発行したPATに置き換える" } } } }
下記のように「github」の左に緑のアイコンがついていれば、問題ないです。
動作確認として適当にGitHubへアクセスさせる指示を送り、エージェントがMCPツールを利用していることを確認できました。
以上でMCPの設定は完了です。
いざ開発してもらう
めんどくさいので一旦DBなどは考えずフロントのみでアプリケーションを作成してもらいます。
モデルはGemini2.5proです。
とりあえずCursorでAuto Applyを有効にして、プロジェクトルールを簡易的な内容で設定しました。
description: 開発におけるルール ### リポジトリ リポジトリはcursor-gitmcp-testというリポジトリを利用します。 該当リポジトリがない場合は、作成してください ### ブランチ main(本番)develop(開発)のブランチを最初に作成してください 開発はdevelopブランチからfeature/機能名 で作業ブランチを切ってください 作業ブランチは1ブランチに1機能です 機能実装後に/docs/specificationsに機能仕様書をマークダウンで追記してください 実装完了後にdevelop向けのPRを作成してください そちらのPRの内容を確認し、問題なければdevelopブランチにマージしてください 最後にdevelopブランチからmainにPRを出してマージしてください 機能ごとに上記をそれを繰り返します。 ### 実装における要件定義書 - /docs/*の要件定義書を確認して実装してください
あとは要件定義も作成してもらいます。
とりあえず猫を飼っているので、猫のクイズアプリでも作ってもらいます。
「猫のクイズアプリの要件定義書を作ってくれ」と言ってできたものが下記になります。
# 猫クイズアプリ 要件定義書 ## 1. 概要 本アプリケーションは、猫に関する様々な知識を問うクイズアプリです。ユーザーはクイズを楽しみながら、猫の種類、生態、歴史、文化などについて学ぶことができます。 ### 1.1. 目的 ユーザーに猫に関する知識を楽しく提供する。 猫への興味・関心を深めるきっかけを作る。 手軽に遊べるエンターテイメントを提供する。 ### 1.2. 対象ユーザー 猫が好きなすべての人。 猫についてもっと知りたいと思っている人。 スキマ時間に手軽に遊べるゲームを探している人。 ## 2. 機能要件 ### 2.1. クイズ機能 **F001: クイズの開始** ユーザーは「クイズスタート」ボタンなどをタップすることでクイズを開始できる。 開始時に問題のカテゴリや難易度を選択できる機能も検討する(v1ではランダム出題でも可)。 **F002: 問題の表示** 画面に猫に関するクイズの問題文と、複数の選択肢(例:3択または4択)を表示する。 問題には関連する画像が表示される場合もある。 **F003: 回答の受付** ユーザーはいずれかの選択肢をタップすることで回答する。 **F004: 正誤判定と結果表示** ユーザーの回答後、即座に正解/不正解を判定し、結果を画面に表示する。 正解の場合は「正解!」などのメッセージと、簡単な解説を表示する。 不正解の場合は「残念!」などのメッセージと、正解の選択肢および簡単な解説を表示する。 **F005: 次の問題へ** ユーザーが「次の問題へ」ボタンなどをタップする、または一定時間経過後に自動で次の問題へ進む。 **F006: クイズの終了とスコア表示** 規定の問題数(例:10問)が終了すると、最終的なスコア(正解数/問題数、正解率など)を表示する。 ### 2.2. 設定機能(任意) **F007: 効果音のON/OFF** (v2以降検討) クイズ中の効果音(正解音、不正解音など)のON/OFFを設定できる。 **F008: BGMのON/OFF** (v2以降検討) アプリ内のBGMのON/OFFを設定できる。 ## 3. 非機能要件 ### 3.1. ユーザビリティ 直感的でわかりやすいユーザーインターフェースを提供する。 誰でも簡単に操作できるように、シンプルな画面構成と操作方法にする。 文字の大きさや配色など、視認性に配慮する。 ### 3.2. パフォーマンス アプリの起動や画面遷移、クイズの表示などがスムーズに行われること。 ストレスなく快適にプレイできること。 ### 3.3. デザイン 猫好きのユーザーが好むような、可愛らしく親しみやすいデザインを採用する。 問題に関連する猫の画像やイラストを効果的に使用し、視覚的にも楽しめるようにする。 ### 3.4. データ管理 クイズの問題文、選択肢、正解、解説、関連画像などのデータはアプリ内に保持する。データベースは使用しない。 将来的に問題を追加・更新しやすいようなデータ構造を検討する(例:JSONファイルなど)。 ## 4. その他 ### 4.1. 開発環境・使用技術(案) プラットフォーム: iOS, Android (クロスプラットフォーム開発フレームワークの利用も検討:React Native, Flutterなど) あるいは Webブラウザ (HTML, CSS, JavaScript) 開発言語: (プラットフォームに応じて Swift, Kotlin, Dart, JavaScriptなど) 画像素材: フリー素材、またはオリジナルで作成。 ### 4.2. 将来的な拡張機能案 問題カテゴリの追加(例:「猫の歴史」「世界の猫種」「猫の行動学」など) 難易度設定機能(初級、中級、上級など) タイムアタックモード 全国ランキング機能 (オンライン機能が必要になるためDBレスの制約と要相談) ユーザーによる問題投稿機能 (同上) 達成度に応じたバッジや称号の獲得機能
ルールに記載したように基本的にこの要件定義を見てエージェントには実装してもらいます。
ちゃんとリポジトリを作成してdevelopから作業ブランチを切って作業してくれてますね。
ちゃんとdevelopに向けてPRを作成してくれたようで、ルールが効いてます。
作成してくれたPRとしては下記でした。なんかリンクも作ってくれてますね。
機能仕様書としては、下記でした。
簡易的なアプリなのでいいんじゃないですかね。
# 猫クイズ機能 機能仕様書 ## 1. 機能概要 ユーザーが猫に関するクイズを解き、知識を深めることができる機能。 スタート画面、クイズ画面、結果画面で構成される。 ## 2. 機能詳細 ### 2.1. スタート画面 (`#start-screen`) **表示内容**: アプリタイトル「猫クイズアプリ」 キャッチコピー「猫博士を目指そう!」 「クイズスタート!」ボタン **動作**: 「クイズスタート!」ボタンクリックでクイズ画面へ遷移し、クイズを開始する。 ### 2.2. クイズ画面 (`#quiz-screen`) **表示内容**: 現在の問題番号 (例: 第1問) 問題文 選択肢ボタン (複数) フィードバックエリア (回答後に表示) 正誤結果テキスト (例: 「正解!」「残念!不正解...」) 解説文 「次の問題へ」ボタン (回答後に表示) **動作**: クイズデータ (`quiz_data.js`) からランダムに問題を選択して表示する。 選択肢ボタンをクリックすると、正誤判定が行われる。 正解の場合: スコアを加算する。 フィードバックエリアに「正解!」と表示し、背景色を変更する。 選択したボタンのスタイルを正解用に変更する。 不正解の場合: フィードバックエリアに「残念!不正解...」と表示し、背景色を変更する。 選択したボタンのスタイルを不正解用に変更する。 正解の選択肢のスタイルを正解用に変更する。 いずれの場合も解説文を表示する。 回答後は全ての選択肢ボタンを無効化する。 「次の問題へ」ボタンが表示され、クリックすると次の問題へ進む。 全ての問題が終了すると結果画面へ遷移する。 ### 2.3. 結果画面 (`#result-screen`) **表示内容**: タイトル「クイズ結果」 労いのメッセージ「お疲れ様でした!」 最終スコア (例: 「あなたのスコアは: 5問中3問正解です!」) スコアに応じたメッセージ (例: 「素晴らしい!全問正解です!あなたは猫博士!」) 「もう一度挑戦する」ボタン **動作**: 「もう一度挑戦する」ボタンクリックでスタート画面へ遷移する。 ## 3. 使用ファイル `index.html`: アプリ全体のHTML構造 `css/style.css`: アプリ全体のスタイリング `js/app.js`: アプリケーション全体の制御、画面遷移 `js/quiz.js`: クイズのロジック(問題表示、正誤判定、スコア計算など) `js/data/quiz_data.js`: クイズの問題、選択肢、正解、解説データ ## 4. データ構造 (quiz_data.js) クイズデータは以下の形式のオブジェクト配列として `quizData` 変数に格納される。 ```javascript const quizData = [ { question: "問題文 (String)", image: null, // 画像は現在使用しない (null固定) choices: ["選択肢1 (String)", "選択肢2 (String)", ...], correctAnswerIndex: 正解の選択肢のインデックス (Number, 0から始まる), explanation: "正解の解説文 (String)" }, // ...他の問題データ ]; ## 5. 主な処理の流れ `index.html` が読み込まれる。 `app.js` が初期化され、スタート画面が表示される。 ユーザーが「クイズスタート!」ボタンをクリック。 `app.js` が `quiz.js` の `initializeQuiz()` を呼び出す。 `quiz.js` がクイズデータをシャッフルし、最初の問題を表示 (`displayQuestion()`)。 ユーザーが選択肢をクリック。 `quiz.js` が `handleAnswer()` を実行し、正誤判定とフィードバック表示。 ユーザーが「次の問題へ」ボタンをクリック。 `quiz.js` が `goToNextQuestion()` を実行し、次の問題を表示。 全問題が終了すると `quiz.js` から `app.js` の `showResultScreen()` が呼び出される。 `app.js` が結果画面を表示。 ユーザーが「もう一度挑戦する」ボタンをクリックすると、スタート画面に戻る。
このあとそのままマージの指示をしてできた画面が下記でした。
簡素すぎるアプリですが、普通に動いてくれました!
まとめ
実は完全自律稼働にはできず、初手でリポジトリ作成していいですか?って聞かれたのでPRレビュー以外聞いくれるな!と言って自律稼働させました。その辺りはルールに記載でどうとにでもなる気はしてます。
また、ローカルブランチの作成を伝えていなかったので、ローカルでファイル生成が見えないかつ、ブランチを確認しようにもローカルでチェックアウトできなかったので、その辺りもルールに記載が必要そうです。
PRテンプレートなんかもちゃんと作れば、しっかり則ってPR作成してくれそうです。
ただ、初手のものとPR確認以外は全てエージェント側作業(マージも)でやってくれたので、本当に待ってるだけでした。
Cursorだと自分で手を加えたい時は、瞬時に切り替えられるのでそれも良いですね。
コンフルに設計書を記載して、コンフルのMCP経由で読み取って開発なんかもやってみたいです。
参照元
https://github.com/docker/labs-ai-tools-for-devs/blob/main/prompts/mcp/readmes/github-official.md
https://docs.docker.com/ai/mcp-catalog-and-toolkit/toolkit/