はじめに
エンジニア歴10年。現在はグリームハブ合同会社でテクニカルマネージャーをしている鈴木です。
弊社では複数のWeb制作案件を並行して受託しています。ありがたいことに案件数は増えているのですが、ずっと頭を悩ませていたのが プロジェクト管理のコストと運用 でした。
ツール遍歴 — Notion → Google Workspace → GitHub
最初は Notion や JIRA を使って管理していました。機能的には申し分ないのですが、案件が増えるにつれて ツールコストが無視できなくなってきた。少人数のWeb制作チームにとって、管理ツールだけで月数万円の固定費は重い。
そこで目を付けたのが Google Workspace です。弊社では Google Workspace を事業運営の基盤として使っており、メール・カレンダー・ドライブ・Chat すべてがここに集約されています。この すでに課金しているプラットフォーム に案件管理も乗せられないか? と考えました。
実際にスプレッドシートでタスク管理表を作り、AppSheet で簡易的なダッシュボードも構築してみました。しかし、正直 しっくりこなかった。スプレッドシートはデータの入力・更新が手作業になりがちで、AppSheet は柔軟性はあるもののプロジェクト管理に特化した UI ではない。結局「管理のための管理」から抜け出せませんでした。
本当の課題 — 業務委託メンバーの横断管理
ツール選定以上に深刻だったのが、業務委託メンバーの案件横断的な管理 です。
弊社ではデザイナーやコーダーに業務委託で入っていただくことが多いのですが、複数案件にまたがって稼働しているメンバーが「今どの案件のどのタスクを持っていて、何が着手中なのか」を一覧で把握する手段がありませんでした。結果として、気づかないうちにオーバーワークをさせてしまうこともありました。
要するに、ツールにコストをかけても、かけなくても、メンバーの稼働状況を正しく把握できていない — これが最大の課題でした。
解決策 — GitHub Projects × Google Chat × Claude Code
最終的にたどり着いたのが GitHub Projects です。GitHub 自体は開発で使っており追加コストゼロ。Projects v2 のボード機能は Notion や JIRA に引けを取らず、Organization Project を使えば 全案件の Issue を1つの画面で横断管理 できる。そして日常のコミュニケーションは Google Chat にそのまま残す。
この「GitHub Projects × Google Chat」の連携基盤を、Claude Code を使って1日で構築 しました。本記事ではその全体像と、実際にどう作ったかを共有します。
何を作ったのか — システム全体像
構築したのは GitHub Projects × Google Chat を連携する案件管理システム です。
ポイントは、案件ごとにリポジトリと Issue を分けつつ、GitHub Organization Project で全案件の Issue を1つの画面に集約 していること。これにより「Aさんは案件Xのデザインと案件Yのコーディングを抱えていて、どちらも着手中」といった状況が一目で分かるようになりました。
GitHub Organization Project(全案件を横断して一覧表示)
│
├── 案件A リポジトリ ─── Issues ──┐
├── 案件B リポジトリ ─── Issues ──┼── 自動追加(GitHub Actions)
└── 案件C リポジトリ ─── Issues ──┘
Google Chat(クライアントとのやりとり)
│
├── Chat Bot(GAS)
│ /create → GitHub Issue 作成
│ /close → Issue クローズ
│ /status → 進捗一覧表示
│
├── 自動通知(GitHub Actions)
│ Issue 作成・完了時に Chat へ通知
│
└── Bot 投稿
WBS 展開・日報生成の結果を Chat に投稿
主要な機能は以下の6つです。
- Organization Project による一元管理 — 全案件の Issue が1つのボードに集約。担当者×案件の横断ビューで稼働状況を把握
- 案件セットアップの自動化 — 案件名を伝えるだけで、リポジトリ・ラベル・Projects・通知ワークフローを一括作成。Issue は自動で Org Project に追加される
- Chat Bot — Google Chat 上で
/create デザインカンプ作成 @伊藤と打てば GitHub Issue が作られる - 自動通知 — Issue の作成・完了時に Google Chat へリアルタイム通知
- WBS 展開 — Markdown の WBS を GitHub Issues に一括変換(15タスクを1コマンドで Issue 化)
- 日報生成 — GitHub Issues の当日変更を自動集計してレポート生成
Claude Code の「エージェント」とは
Claude Code には、特定の業務に特化した カスタムエージェント を定義できる機能があります。.claude/agents/ にマークダウンファイルを置くだけで、そのタスク専用の AI アシスタントが使えるようになります。
今回は3つのエージェントを定義しました。
.claude/agents/
├── project-setup.md # 案件セットアップ
├── report-generator.md # 日報生成
└── space-migrator.md # 既存スペース移行
たとえば案件セットアップエージェントの定義はこれだけです。
---
name: project-setup
description: 新規案件のセットアップを実行するエージェント
tools:
- Bash
- Read
- Write
---
# 案件セットアップエージェント
新規Web制作案件の GitHub 環境を構築する。
## 実行手順
1. 案件名を受け取る
2. `agents/setup/create_project.py` を実行し、以下を自動化:
- GitHub リポジトリ作成
- 標準ラベル作成
- GitHub Projects (v2) 作成
- `config/space_project_map.json` に対応情報を追加
3. 結果を報告する
これで、Claude Code に「案件名『ThemeX コーポレートサイト』でセットアップして」と伝えるだけで、GitHub の環境構築が完了します。手作業でやると10〜15分かかる作業が、数秒です。
しかも、新しく作った案件リポジトリの Issue は GitHub Actions によって自動的に Organization Project に追加 されます。案件ごとに個別設定する必要はなく、Claude Code がセットアップ時にワークフローも含めて全部やってくれます。
実装の進め方 — 8ステップを1日で
このシステムは、事前に書いた設計書を Claude Code に渡し、8つのステップ に分けて段階的に実装しました。
| Step | 内容 | 主な成果物 |
|---|---|---|
| 1 | 環境整備 | ディレクトリ構成、pyproject.toml、CLAUDE.md |
| 2 | GitHub API 実装 | REST + GraphQL クライアント |
| 3 | Google Chat API 実装 | Service Account 認証クライアント |
| 4 | Chat Bot(GAS) | /create, /close, /status コマンド |
| 5 | 自動通知 | GitHub Actions → Chat Webhook |
| 6 | 日報生成 | Issues 集計 → Markdown レポート |
| 7 | 既存スペース移行 | Chat スペース → GitHub 環境の紐付け |
| 8 | WBS 展開 | Markdown WBS → Issues 一括変換 |
実際のコミット履歴がこちらです。
592220e fix: Chat 通知を curl 方式に変更
7456d4f feat: WBS 展開スクリプト実装(Step 8)
92040c2 feat: 既存スペース移行スクリプト実装(Step 7)
b2d92ae feat: Chat API クライアント・GAS Bot・通知連携・日報生成を実装(Step 3〜6)
6ef13ec feat: 初期構築(環境整備 + GitHub API クライアント実装)
各ステップで「dry-run → 動作確認 → 承認 → 本実行」のサイクルを回しました。Claude Code が勝手に本番環境を触ることがないよう、CLAUDE.md に安全ルール を明記しています。
## 安全ルール
- `.env` と `credentials/` を絶対にコミットしない
- 破壊的 API 操作(リポジトリ削除等)は実装しない
- 本番デプロイ・費用が発生する API・公開投稿は人間の承認を必須とする
技術的なポイント
GitHub REST API + GraphQL の使い分け
GitHub Projects v2 の操作には GraphQL API が必須 です。Issue やリポジトリは REST API で操作できますが、Projects v2 のボード管理(アイテム追加、ステータス更新)は GraphQL でしか実現できません。
今回は1つのクライアントクラスに両方を統合しました。
class GitHubClient:
"""GitHub API クライアント"""
# REST API — Issue・リポジトリ操作
def _rest(self, method: str, path: str, *, json: dict | None = None):
url = f"{REST_BASE}{path}"
resp = requests.request(method, url, headers=self.headers, json=json, timeout=30)
resp.raise_for_status()
return resp.json()
# GraphQL API — Projects v2 操作
def _graphql(self, query: str, variables: dict | None = None):
resp = requests.post(GRAPHQL_URL, headers=self.headers, json={"query": query, "variables": variables}, timeout=30)
data = resp.json()
if "errors" in data:
raise RuntimeError(f"GraphQL エラー: {data['errors']}")
return data["data"]
Projects v2 への Issue 追加は、こんな GraphQL mutation で実現しています。
def add_item_to_project(self, project_id: str, content_id: str) -> dict:
mutation = """
mutation($projectId: ID!, $contentId: ID!) {
addProjectV2ItemById(input: { projectId: $projectId, contentId: $contentId }) {
item { id }
}
}
"""
data = self._graphql(mutation, {"projectId": project_id, "contentId": content_id})
return data["addProjectV2ItemById"]["item"]
なお、GraphQL API を使うには Personal Access Token に project スコープの追加が必要です。最初はスコープ不足で INSUFFICIENT_SCOPES エラーが出ましたが、Claude Code がエラーメッセージを読み取り、スコープ追加のコマンド(gh auth refresh -s project)を提案してくれました。
Google Chat API の2つの認証モード
Google Chat API には ユーザー委任モード と App モード の2種類があります。
class ChatClient:
def _get_user_service(self):
"""ユーザー委任モード(管理ユーザーとしてスペース一覧・メッセージ取得)"""
creds = service_account.Credentials.from_service_account_file(
str(self._sa_file), scopes=CHAT_SCOPES
)
creds = creds.with_subject(self._delegated_user) # ← ユーザーに成り代わる
return build("chat", "v1", credentials=creds)
def _get_app_service(self):
"""App モード(Bot 自身としてメッセージ投稿)"""
creds = service_account.Credentials.from_service_account_file(
str(self._sa_file), scopes=CHAT_SCOPES
)
# with_subject なし → Bot として動作
return build("chat", "v1", credentials=creds)
with_subject() の有無だけで切り替わるシンプルな設計ですが、これを知らずにハマるケースは多いと思います。スペースの一覧取得やメッセージの読み取りにはユーザー権限が必要で、Bot としての投稿には App 権限が必要 — この使い分けがポイントです。
WBS → GitHub Issues の一括変換
Web制作では、WBS(作業分解構成図)をもとにタスクを管理するのが一般的です。今回はこんな Markdown フォーマットの WBS を書くだけで、GitHub Issues に一括変換できるようにしました。
## フェーズ1: デザイン
### トップページ
- [ ] ワイヤーフレーム作成 @伊藤 #期限2026-03-10
- [ ] デザインカンプ作成 @伊藤 #期限2026-03-15
- [ ] デザインレビュー・修正 @鈴木
### 下層ページ
- [ ] サービスページ デザイン @伊藤
- [ ] 会社概要ページ デザイン @伊藤
## フェーズ2: コーディング
...
パーサーの設計はシンプルです。
@dataclass
class WbsTask:
title: str # タスク名
milestone: str = "" # ## → マイルストーン
section: str = "" # ### → 工程
assignees: list[str] = field(default_factory=list) # @名前
due_date: str = "" # #期限YYYY-MM-DD
##見出し → マイルストーン(フェーズ)###見出し → 工程(Issue 本文に記載)- [ ]→ Issue(タスク)@名前→ 担当者ラベル#期限YYYY-MM-DD→ 期限
このフォーマットなら非エンジニアのディレクターでも書けますし、普通のチェックリストとしても読めます。実際にテスト用の WBS(15タスク)を実行したところ、全 Issue が Projects に追加され、Chat にも通知が飛びました。
Claude Code と開発して気づいたこと
エラーを自分で解決する「エージェント力」
Claude Code の強みは、単にコードを書くだけでなく、実行して、エラーを読んで、自分で修正する サイクルを回せることです。
今回の開発中にも、GitHub API のスコープ不足、GAS のデプロイ設定漏れ、空リポジトリへの API 呼び出し失敗など、様々なエラーが発生しました。そのほとんどを Claude Code がエラーメッセージから原因を特定し、修正案を提示 → 実行してくれました。
たとえば、新規作成したリポジトリにワークフローファイルを追加する際、リポジトリの初期化が完了する前に API を叩いて 404 エラーが出ました。Claude Code はこれを受けて、リトライロジックを自主的に追加してくれました。
CLAUDE.md が「チームのルールブック」になる
CLAUDE.md に書いたルール(安全ルール、コーディング規約、ディレクトリ構造)は、Claude Code にとっての行動指針になります。これは人間のチームメンバーに対するオンボーディング資料と同じ役割を果たします。
面白いのは、Claude Code と一緒に開発を進める中で CLAUDE.md 自体も進化していくことです。新しいモジュールを追加するたびに構造の記述を更新し、安全ルールも実際の運用で気づいた点を追記していく。コードと一緒にルールも育っていく 感覚があります。
dry-run パターンの重要性
外部 API を叩くスクリプトでは、必ず dry-run モードを実装 しました。Claude Code に「まず dry-run で確認して」と指示すると、実際に API を叩かずに処理内容だけを表示してくれます。
# dry-run(Issue は作成しない)
uv run python agents/setup/expand_wbs.py --repo my-project --wbs wbs.md
# 実行(承認後)
uv run python agents/setup/expand_wbs.py --repo my-project --wbs wbs.md --execute
AI に外部リソースを操作させる場合、この「確認してから実行」のフローは必須だと感じました。
まとめ
Notion → スプレッドシート → AppSheet と試行錯誤してきたプロジェクト管理ですが、最終的に GitHub Projects × Google Chat × Claude Code という組み合わせに落ち着きました。
振り返ると、これまでのツール選定で見落としていたのは「ツールの機能」ではなく 「運用の自動化」 でした。どんなに優秀なツールでも、セットアップが手作業で、データの入力が手作業で、集計が手作業なら、結局「管理のための管理」から逃れられない。
Claude Code は「コードを書く AI」ではなく、「開発プロセスを一緒に設計・構築するパートナー」 です。設計書を渡してから実働するシステムが動くまで1日で到達しました。GitHub API の REST / GraphQL の使い分け、Google Chat API の認証設計、GAS Bot の実装、GitHub Actions の通知連携 — これらを横断的に扱う開発を、1人 + Claude Code で完走できたのは大きな収穫です。
そして個人的に一番インパクトが大きかったのは、Organization Project による案件横断の一元管理 です。全案件の Issue が1つの画面に集約されることで、業務委託メンバーが「どの案件のどのタスクを持っていて、何が着手中なのか」を一目で把握できるようになりました。これまで見えなかった稼働状況が可視化されたことで、無意識のオーバーワークを防げるようになったのは、管理者として本当に大きい変化です。
しかもこの仕組み、案件が増えるたびに Claude Code にセットアップを任せるだけで、ワークフローの設定も含めて全自動で整います。案件が10件、20件と増えても管理コストが増えない。これがスケールする仕組みの力だと実感しています。
コスト面でも、Notion や JIRA の月額課金がなくなり、すでに使っている GitHub と Google Workspace だけで完結する。少人数のWeb制作チームにとって、追加コストゼロで本格的なプロジェクト管理基盤が手に入った のは大きなメリットです。
特にWeb制作の受託チームのような 少人数で複数案件を回す現場 では、こうした管理業務の自動化が直接的に生産性に効きます。「管理のための管理」をなくし、クリエイティブな作業に集中できる環境を作ること。それが今回の自動化の本質的な価値だと思っています。
本記事のコード例は実際のプロジェクトをもとにしていますが、案件名・クライアント名等は変更しています。
AI を活用した業務効率化に取り組んでいます
グリームハブ合同会社では、本記事で紹介したような AI を活用した開発プロセスの最適化 をはじめ、 AI ツール導入支援、開発ワークフローの設計など、幅広くお手伝いしています。
お気軽にご相談ください。
お問い合わせはこちら → グリームハブ合同会社 お問い合わせ