はじめに

最近は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/