Claude Codeでチケット駆動開発!JiraとMCP連携させて簡単なiOSアプリを作ってみました
はじめに
突然ですが、私はまだClaude Codeを使いこなせておらず、開発させたい機能や処理の内容をClaude Codeにうまく伝えることができていません。一方で普段の業務でのAIエージェントを使わないソフトウェア開発では、開発内容を複数のチケットに分割して記載してから優先度順に開発する、ということには慣れています。
そのようなこともあり、Claude Codeへの指示の出し方には色々とあるとは思いつつも、もしも
- 私はチケット管理システムのJiraに開発させたい内容を複数のチケットに分割して記載する
- Claude Codeにそれらのチケットを読み込ませて、優先度順に開発させる
ということができれば、私でもClaude Codeに開発させたいことを具体化に伝えられるのではないかと思いました。
そこで今回、上記の思い付きが可能かどうかの確認のために、簡単なiOSアプリの開発を題材にして実験してみました。この記事ではこの実験について紹介します。
ちなみにチケット管理システムとしてJiraを選択したのは、私が勤めている会社でJiraを利用しているからというだけの理由です。
結論
できたこと
- MCPで連携させることで、Claude CodeにJiraのチケットをひとつずつ読み込ませること
- Jiraのチケットの詳細欄に記載した内容に従って、Claude Codeにインクリメンタルな開発をさせること
- 開発に着手したチケットのステータスをClaude Code自身に「進行中」に変更させること
- 開発が完了したチケットのステータスをClaude Code自身に「完了」にさせること
できなかったこと・要改善ポイント
- アクティブなスプリントバックログが空の状態のときにClaude Codeに追加開発を中断させること
- 実験ではClaude Codeはプロダクトバックログからチケットを取りに行ってしまいました…。
事前知識
チケット駆動開発
チケット管理システムやバグ管理システムを利用して、ソフトウェア開発におけるタスクや担当者、進捗などを管理する手法です。
より詳細はウィキペディアの記事を参照してください。
Jira
チケット管理システムのWebサービスの一つで、アトラシアン社により運営されています。ソフトウェア開発におけるタスク管理、プロジェクト管理、バグ管理などで利用可能です。
公式サイトのURL:
実験
ここからは今回実施した実験の内容の紹介です。
環境
以下の環境で実験しました。
- macOS:Sequoia 15.6
- Xcode: 16.4
- Claude Code: 1.0.77, Proプラン
- Jira: Freeプラン
準備
空のプロジェクトの作成
まず任意のフォルダ内に実験用の空のフォルダをターミナルで作成しました。今回は『jira0001』というフォルダ名にしました。
> mkdir jira0001
作成後、そのままターミナルのカレントフォルダをその作成したフォルダに変更。
> cd jira0001
その状態でターミナルからClaude Codeを起動し、
claude
Claude Code上で以下のコマンドを実行しました。
/init
完了後、Claude Codeを一度終了しました。
/exit
MCPの設定
Atlassian MCPの設定
Claude CodeとJiraを連携させるためにアトラシアン社の公開しているMCPサーバーを使いました。
ターミナルのカレントフォルダを『jira0001』にしたままの状態で、以下のコマンドを実行しました。今回はMCPの設定のスコープは「プロジェクト」にしました。
> claude mcp add --transport sse atlassian https://mcp.atlassian.com/v1/sse --scope project
続けて、Claude Codeを再度起動。
claude
Atlassian MCPの認証の設定に移るため、以下のコマンドを実行。
/mcp
認証前なのでMCPサーバーとの接続に失敗しているので、Claude Codeのメッセージに従ってAtlassianのアカウントで認証を実施。
認証の完了後、Claude Codeをもう一度終了。
/exit
XcodeBuildMCPの設定
今回はReact Nativeを使わずにSwiftUIとSwiftDataで直接iOSアプリを作りたかったため、過去に別の記事で紹介したXcodeBuildMCPを使いました。
このMCPサーバーの設定のため、ターミナルのカレントフォルダを『jira0001』にしたままの状態で、以下のコマンドを実行しました。こちらもMCPの設定のスコープを「プロジェクト」にしました。
> claude mcp add --scope project XcodeBuildMCP --env SENTRY_DISABLED=true \
-- npx -y xcodebuildmcp@latest
チケットの作成
手動でJiraの画面上で新規にプロジェクト(名前はTest0001)を作成してから、チケットを8個作成しました。チケットの内容としては以下の通りです。
チケット1: ユーザーはToDoリストを確認できる
- メイン画面でToDoアイテムが一覧表示され、各アイテムのタイトルと完了状態が視覚的に分かる
- 完成の定義:
- SwiftUIでToDoアイテムが表示される
- 各アイテムにタイトルテキストが表示される
- 完了/未完了の状態が視覚的に区別できる
- 空の状態でも適切なメッセージが表示される
チケット2: ユーザーは新しいToDoアイテムを追加できる
- プラスボタンをタップして入力画面に遷移し、タイトルを入力して保存できる
- 完成の定義:
- メイン画面に「追加」ボタンが配置されている
- ボタンタップで入力画面に遷移する
- テキストフィールドでタイトルを入力できる
- 保存ボタンでアイテムがリストに追加される
- キャンセル機能が動作する
- 空文字での保存時は適切なエラーハンドリングがある
チケット3: ユーザーはToDoアイテムを完了済みにマークできる
- 各アイテムのチェックボックスをタップして完了/未完了を切り替えられる
- 完成の定義:
- 各アイテムにチェックボックスが表示される
- タップでチェック状態が切り替わる
- 完了済みアイテムは打ち消し線または色の変更で表示される
- 状態変更が即座にリストに反映される
チケット4: ユーザーはToDoアイテムを編集できる
- アイテムをタップまたは長押しして編集画面に遷移し、内容を変更して保存できる
- 完成の定義:
- アイテムタップで編集画面に遷移する
- 既存の内容が入力欄に表示される
- 内容を変更して保存できる
- 変更がリストに反映される
- キャンセル時は元の内容が保持される
チケット5: ユーザーはToDoアイテムを削除できる
- スワイプ操作でアイテムを削除でき、確認ダイアログで誤操作を防げる
- 完成の定義:
- 左スワイプで削除ボタンが表示される
- 削除ボタンタップで確認ダイアログが表示される
- 確認後にアイテムがリストから削除される
- 削除時にアニメーションが表示される
チケット6: ユーザーは完了済みと未完了のアイテムを区別して見ることができる
- フィルターボタンで「すべて」「未完了」「完了済み」を切り替えて表示できる
- 完成の定義:
- フィルターボタン(セグメントコントロール)が配置されている
- 「すべて」「未完了」「完了済み」の3つのフィルターが動作する
- フィルター変更時にリストが即座に更新される
- 現在のフィルター状態が視覚的に分かる
チケット7: ユーザーはアプリを再起動してもデータを保持できる
- アプリを閉じて再起動してもToDoアイテムと完了状態が保持される
- 完成の定義:
- SwiftDataでデータを永続化する
- アイテムの追加・編集・削除がすべて永続化される
- アプリ再起動時にデータが正しく復元される
- 完了状態も正しく保持される
- データ保存エラー時の適切なハンドリングがある
チケット8: ユーザーは直感的で使いやすいインターフェースを利用できる
- 適切な色彩設計、アニメーション、アクセシビリティ対応で快適に操作できる
- 完成の定義:
- アイテム追加・削除時にスムーズなアニメーションがある
- 統一感のある色彩とフォント設計が適用されている
- VoiceOverでの操作が可能(アクセシビリティ対応)
- 異なる画面サイズで適切にレイアウトされる
- ユーザビリティテストで基本操作が直感的に行える
この時点でこのJiraの画面の内容は以下の通りです。
CLAUDE.mdの上書き
準備の最後として、『jira0001』フォルダ内のCLAUDE.mdを以下の内容で上書きしました。作成するアプリ名もこのファイルに記述しました。
# CLAUDE.md
このファイルは、このリポジトリ内のコードを扱う際にClaude Code(claude.ai/code)向けのガイダンスを提供します。
## プロジェクト
- このプロジェクトはiOSアプリの開発のためのものです。
- iOSアプリの名前は「シンプルToDo」としてください。
- XCodeで開発してください。
## 追加で開発する内容の取得方法
- 開発する内容はJiraのTest0001プロジェクトのアクティブなスプリントに登録済みチケットに記載されいてる詳細欄から取得してください。
- アクティブなスプリントのチケットだけから取得してください。
- アクティブなスプリントの先頭のチケットから順番に取得してください。
- アクティブなスプリントバックログ以外のバックログのチケットは参照しないでください。
## チケットのステータスの変更のルール
- チケットの開発を開始したら、そのチケットのステータスを「進行中」に変更してください。
- チケットの開発が完了したら、そのチケットのステータスを「完了」に変更してください。
実施と結果
準備が完了したので、ターミナルからClaude Codeを再度起動しました。
> claude
まずはチケット1の開発をさせたかったので、手動でJira側でチケット1だけをスプリントバックログに登録して、スプリントを開始。
次にClaude Codeに以下の内容で指示。もちろん開発内容は伝えませんでした。
追加で開発して
すると、Claude CodeがJiraからチケット1の情報を取得してコーディングが開始。Xcodeのプロジェクトファイルの作成から、チケット1に記載内の実装、アプリのビルドとシミュレータ上での起動までしてくれました。チケットのステータスも更新してくれました。
チケット1の開発管理のClaude Codeのメッセージは以下の通りでした。
⏺ SCRUM-1チケットの開発が完了しました。
実装した機能:
- ToDoアイテムが一覧表示される画面
- 各アイテムのタイトルが表示される
- 完了/未完了の状態が視覚的に区別できる(チェックマークアイコンと色分け)
- 空の状態での適切なメッセージ表示
達成した完了の定義:
✅ SwiftUIでToDoアイテムが表示される✅
各アイテムにタイトルテキストが表示される✅
完了/未完了の状態が視覚的に区別できる✅
空の状態でも適切なメッセージが表示される
チケットのステータスを「完了」に変更し、開発完了です。
この時点でのアプリのスクリーンショットは以下の通りで、一覧表示はできましたが、アイテムのステータス変更、追加、削除はできませんでした。
また、Jira側の画面は以下の通りで、チケットのステータスが『To Do』から『進行中』へ、そして『完了』へと順に更新されました。
ここでスプリントバックログ内のチケットがすべて完了したので、Jira側の画面で手動でスプリントを完了しました。
この後はチケット2〜8についても同様に、以下を繰り返し実施しました。
- 1〜3個のチケットを1〜3個、スプリントバックログに登録
- スプリントを開始
- Claude Codeに「追加で開発して」と指示
- スプリントを完了
すると、チケットが順々に紹介されていきインクリメンタルに開発が進行して、最終的に当初想定していたiOSアプリが完成しました。
それぞれのチケットの完了時のアプリのスクリーンショットの抜粋は以下の通りです。インクリメンタルに機能が実装されていったことが確認できると思います。
チケット2の完了時:
チケット3の完了時:
チケット4の完了時:
チケット5の完了時:
チケット6の完了時:
チケット7の完了時:
*スクリーンショットだとデータの永続化がされたことが確認できないので省略
チケット8の完了時:
以上で今回の実験は完了です。
おわりに
今回はMCPでJiraと連携させることでClaude Codeでチケット駆動開発を行ってみました。
実は今回の実験で私が操作を少し間違えてしまい、スプリントバックログが空の状態でClaude Codeに「追加で開発して」と依頼したところ、Claude Codeがスプリントバックログではなくプロダクトバックログのチケットを参照して追加の開発を始めようとして、私が慌ててEscキーを押下して開発をキャンセルをしたというアクシデントがありました。今回作成したCLAUDE.mdにはまだまだ改善の余地がありそうです。
今回はAtlassian MCPを使ってClaude CodeにJiraとだけ連携させましたが、このMCPはConflueceとも連携させることができるので、Conflueceとの連携の実験にも挑戦したいと思います。
Discussion