BLOG
GitHub Issues × Claude AI でスライドを自動生成する仕組みを作る
GitHub Issue に内容を書くだけで Claude AI が Marp スライドを自動生成し、PDF・PPTX・HTML を出力する仕組みをゼロから構築する方法を解説します。
プレゼンテーションを作るとき、スライド自体の内容よりもデザインの調整に時間を使ってしまいがちです。
特に私の場合、研究室の進捗報告会のような定期的なプレゼンテーションの機会が多く、内容はある程度テンプレート化できるけど、スライド作成の工数が毎回大きいという課題を感じていました。
そこで、GitHub Issue に内容を書くだけで Claude AI がスライドを生成し、PDF・PPTX・HTML・PNG を一括出力する仕組みを作りました。
リポジトリは公開していませんが、この記事ではゼロから構築する手順を解説します。
完成形
完成形は次のような流れです。
試しに「この記事の内容をスライドにして」と Issue に書き、実際に生成したスライドが以下です。
全体フロー
まず、このツールがどのような流れでスライドを生成するのかを見ます。
裏側では 2つのワークフロー が連携しています。
- claude.yml(Claude Code Action が自動生成)— Issue が作成されると Claude AI が起動し、
input/input.mdにスライドを書き込んで PR を作成します - build-slides.yml(手動作成)— PR が作成・更新されるたびに自動起動し、Marp で PDF・PPTX・HTML をビルドして PR にダウンロードリンクをコメントします
では、実際にこの仕組みを作ります。
事前準備
このシステムを構築するために必要なものは次のとおりです。
- GitHub アカウント
- Node.js 20 以上(ローカルプレビューを使う場合)
- Anthropic アカウント(Claude Codeが使える環境、Pro以上に課金する必要あり)
※本記事では、アカウントの作成方法やリポジトリの初期設定などは割愛します。
Step1. リポジトリを作る
GitHub で新しいリポジトリを作成します。名前は何でも構いません。
本記事では、リポジトリ名を slide-generator として説明します。
ここで気を付けたいのは、なるべくプライベートリポジトリにすることです。 公開リポジトリでは、GitHubアカウントを持つ人なら Issue を作成できる場合があります。意図しないスライド生成が走り、余分なトークンを消費するリスクがあります。
ディレクトリ構成は次のとおりです。
slide-generator/├── .github/│ ├── workflows/│ │ ├── claude.yml ← Claude AI を起動するワークフロー│ │ └── build-slides.yml ← Marp でビルドするワークフロー│ └── ISSUE_TEMPLATE/│ └── slide-request.yml ← Issue のフォーム定義├── input/│ └── input.md ← Claude が生成したスライドの保存先├── output/ ← ビルド成果物(.gitignore 推奨)├── theme/│ └── theme.css ← カスタムテーマ├── CLAUDE.md ← Claude への指示書└── package.jsonStep2. Claude Code Actionのセットアップ
リポジトリの準備ができたら、Claude Code Actionをセットアップします。
Claude Code Actionとは?
Claude Code Actionは、GitHub上で@claudeとメンションするだけで、Claude AIが呼び出されるツールです。

セットアップ方法
- ターミナルを立ち上げて、リポジトリのディレクトリへ移動します
- 以下のコマンドを入力してclaudeを起動したのちに、
/install-github-appを実行します
claude/install-github-app- GitHub Appをどのリポジトリにインストールするか聞かれるので、先ほど作成した
slide-generatorを選択してインストール
> Use current repository: account_name/slide-generatorリポジトリの選択後、GitHub上でClaudeのGitHub Appインストール画面が開くので、"Configure"をクリックして連携完了
ブラウザでインストールが完了したら、ターミナルに戻って各種設定を入力
セットアップが完了すると、ターミナルに
Successと表示され、.github/workflows/claude.ymlがリポジトリ内に作成されます
Step3. Marpのセットアップ
続いて、スライド生成に使う Marp CLI をインストールします。
Marpとは?
MarpはMarkdownでスライドを書けるツールです。--- でページを区切るだけでプレゼンテーションになります。
AIはMarkdownによるファイルの読み取り・生成が得意なので、相性が抜群です。また、テキストベースなのでGit管理も容易です。
Marp CLIをインストールする
Marp CLIをローカルで使う場合は、VSCodeのMarp拡張機能もインストールしておくと便利です。
VSCodeの拡張機能からMarp for VS Codeを検索してインストールしてください。
package.jsonにビルドコマンドを追加する
次に、Marp CLIでスライドをビルドするためのコマンドを package.json に追加します。
ターミナルで以下のコマンドを実行して、Marp CLIをインストールします。
npm init -ynpm install --save-dev @marp-team/marp-cli次に package.json を次のように設定します。
{ "scripts": { "dev": "marp input/input.md --watch --preview", "build": "node -e \"require('fs').mkdirSync('output',{recursive:true})\" && marp input/input.md --pdf -o output/slides.pdf && marp input/input.md --pptx -o output/slides.pptx && marp input/input.md -o output/slides.html", "build:pdf": "node -e \"require('fs').mkdirSync('output',{recursive:true})\" && marp input/input.md --pdf -o output/slides.pdf", "build:pptx": "node -e \"require('fs').mkdirSync('output',{recursive:true})\" && marp input/input.md --pptx -o output/slides.pptx", "build:html": "node -e \"require('fs').mkdirSync('output',{recursive:true})\" && marp input/input.md -o output/slides.html" }, "devDependencies": { "@marp-team/marp-cli": "^4.1.1" }}これで、ブラウザでスライドをリアルタイムプレビューしながら編集したり、PDF・PPTX・HTMLを一括でビルドしたりできます。
リアルタイムプレビューするときは、以下のコマンドを打ちます。
npm run devoutput/にビルド成果物を出力するときは、以下のコマンドを打ちます。
npm run buildStep4. build-slides.yml を作る
Claude Code Action(Step2)は claude.yml を自動生成しますが、Marp でビルドするワークフローは別途作成が必要です。
.github/workflows/build-slides.yml を以下の内容で作成してください。
build-slides.yml の内容を見る 折りたたむ
name: Build Slides
on: pull_request: paths: - 'input/**.md' - 'theme/theme.css'
jobs: build: runs-on: ubuntu-latest permissions: contents: read pull-requests: write
steps: - uses: actions/checkout@v4
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20'
- name: Install Japanese fonts run: | sudo apt-get update sudo apt-get install -y fonts-noto-cjk
- name: Install Marp CLI run: npm install -g @marp-team/marp-cli
- name: Create output directory run: mkdir -p output
- name: Build PDF run: marp input/input.md --theme theme/theme.css --pdf --html -o output/slides.pdf --allow-local-files
- name: Build PPTX run: marp input/input.md --theme theme/theme.css --pptx --html -o output/slides.pptx --allow-local-files
- name: Build HTML run: marp input/input.md --theme theme/theme.css --html -o output/slides.html --allow-local-files
- name: Upload Artifacts uses: actions/upload-artifact@v4 with: name: slides path: output/
- name: Comment PR with preview (upsert) uses: actions/github-script@v7 with: script: | const MARKER = '<!-- slides-build-comment -->'; const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; const artifactUrl = `${runUrl}#artifacts`;
const body = [ MARKER, '## スライドビルド完了', '', '| 形式 | ファイル |', '|------|--------|', '| PDF | `slides.pdf` |', '| PPTX | `slides.pptx` |', '| HTML | `slides.html` |', '', `[アーティファクトをダウンロード](${artifactUrl})`, ].join('\n');
const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, });
const existing = comments.find(c => c.body.includes(MARKER));
if (existing) { await github.rest.issues.updateComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: existing.id, body, }); } else { await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, body, }); }このワークフローは、input/input.md または theme/theme.css が変更された PR が作成・更新されるたびに自動起動します。
ポイントは3つです。
- 日本語フォント(
fonts-noto-cjk)のインストール:PDF 化の際に日本語が文字化けしないよう、Ubuntu の実行環境に事前インストールしています - アーティファクトへのアップロード:ビルドした PDF・PPTX・HTML を GitHub のアーティファクトとして保存します。プライベートリポジトリであれば外部からダウンロードリンクにアクセスできません
- PR コメントの upsert:コミットを重ねるたびに新しいコメントを投稿するのではなく、同じコメントを更新するため、PR のスレッドが荒れません
Step5. theme.cssをつくる
Marpはテーマ機能が充実しており、用途に合わせたテーマを作れます。 theme/theme.css を作成します。
ここで、カスタムのデザインを使用する場合、.vscode/settings.json に以下の設定を追加しておきましょう。
{ "markdown.marp.themes": [ "theme/theme.css" ]}この設定を入れると、input.md のフロントマターにテーマを指定したときにスタイルが適用されます。
---marp: truetheme: custom---Step6. CLAUDE.mdを書く
CLAUDE.mdとは?
CLAUDE.mdは、Claudeに対してこのリポジトリで何をすべきかを指示するためのファイルです。
ワークフローが起動すると、Claudeは最初にこのファイルを読み込んで、スライド生成のルールやスタイルを把握します。
私は CLAUDE.md にスライド生成のルールを次のようにまとめました。
CLAUDE.md の内容を見る 折りたたむ
# スライド生成ルール
## 概要このリポジトリはMarpを使ってスライドを自動生成するシステムです。IssueでスライドのストーリーやアイデアをもらったらMarp形式のMarkdownを生成し、`input/input.md`に保存してPRを出してください。
## ルール
### ファイル- スライドの内容は必ず `input/input.md` に保存する- 画像素材は `imgs/` フォルダを参照する- テーマは `theme/theme.css` を使用する
### スライドのクラス- タイトルスライドのみ `<!-- _class: title -->` を使う- それ以外のスライドにはclassを付けない
### 数式
- 数式は必ずKaTeX記法で書く(プレーンテキストやコードブロックに入れない)- インライン数式:`$E = mc^2$`- ブロック数式:`$$\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V$$`
### 図・ダイアグラム
- フロー図・アーキテクチャ図はMermaidではなく **HTML/CSS** で描く- `div` の `display:flex` / `display:grid` とインラインスタイルで構成する- カラートークン(`var(--color-primary)` 等)を使って統一感を保つ- 詳細は `.claude/skills/theme-guide.md` を参照
### スライドの区切り(`---`)
- 「話題のまとまり」が完結するところで区切る- 段落の途中、箇条書きの途中、説明の途中では区切らない- 区切りの直前の内容が中途半端に見えないか必ず確認する- 1枚のスライドが長くなりすぎる場合は、**セクションのまとまりごと**に分割する
### コンポーネント- 重要なポイントは `<div class="callout">` を使う- 警告・注意は `<div class="callout warning">` を使う- 2カラムレイアウトは `<div class="cols">` を使う- 3カラムレイアウトは `<div class="cols3">` を使う- ラベル+値の情報(プロフィール、スペック等)は `<div class="kv">` を使う- 解決済み/注意/補足をボックスで囲む場合は `<div class="card ok|warn|info">` を使う(乱用しない)
詳細な使い方は `.claude/skills/theme-guide.md` を参照。
### スライドの構成1. タイトルスライド2. アジェンダ3. 本編(内容に応じて)4. まとめ
### 文体ルール
#### タイトル・見出しの記法
- **コロン(:)を使用しない** - ❌ 悪い例: `原則❶:自律性の最大化` - ✅ 良い例: `原則❶ 自律性の最大化`
#### 理知的な文体の維持
- **感嘆符(!)や疑問符(?)を避ける** - ❌ 悪い例: `AIで開発が10倍速に!` - ✅ 良い例: `AIで開発が10倍速に`- **装飾的な絵文字を避ける** - ❌ 悪い例: `🧩 問題領域の複雑さ` - ✅ 良い例: `問題領域の複雑さ`- **色による強調は控えめに** — 赤・緑などの強い色は避け、`--color-muted`・`--color-text` を基調にする
## スキル
- `.claude/skills/marp-convert.md` : Marp変換の詳細ルール- `.claude/skills/theme-guide.md` : テーマの使い方・レイアウトパターン集Step7. Skillsを作る
Skills とは、Claude がタスクを実行するときに参照する専用の手順書・スタイルガイドです。 CLAUDE.md からファイルパスで参照することで、指示書を役割ごとに分割して管理できます。
私の場合、2つのSkills を作成しました。
marp-convert.md:Marp 形式への変換ルール(ページ区切りの考え方・数式の書き方など)theme-guide.md:テーマのコンポーネント一覧・レイアウトパターン集
Skills を充実させるほど Claude の出力精度が上がります。最初はシンプルな内容から始めて、意図しない出力が出たら都度ルールを追記していくのが効率的です。
Step8. Issue テンプレートを作る
最後に.github/ISSUE_TEMPLATE/slide-request.yml を作成します。
Issueテンプレートを用意しておくと、スライド生成に必要な情報を漏れなく集めやすくなります。 テンプレートがなくてもClaudeはスライドを生成できますが、必要な情報が抜けると意図しない結果になりやすいため導入しました。
このフォームが Issue 作成時に表示されます。

Issue テンプレートの YAML を見る 折りたたむ
name: スライド生成依頼description: Claudeにスライドを自動生成してもらうための依頼テンプレートtitle: "[Slide] "labels: ["slide-request"]body: - type: markdown attributes: value: | このIssueを作成すると、Claudeが自動的にMarpスライドを生成してPRを作ります。 内容をできるだけ詳しく記入してください。
- type: input id: title attributes: label: スライドタイトル description: スライドのメインタイトルを入力してください placeholder: 例:2026年度 プロジェクト計画 validations: required: true
- type: textarea id: purpose attributes: label: 目的・背景 description: このスライドは何のために作りますか?誰に向けて発表しますか? placeholder: | 例: - 対象:チームメンバー(10名) - 目的:Q2の振り返りと次四半期の計画共有 - 発表時間:15分程度 validations: required: true
- type: textarea id: content attributes: label: スライドに含めたい内容 description: 伝えたいポイントや構成案を書いてください。箇条書きでもOK。 placeholder: | 例: - Q1の実績(目標 vs 実績) - 課題だった点と対応策 - Q2の目標と施策 - チームへのお願い validations: required: true
- type: input id: slide_count attributes: label: 希望スライド枚数(目安) description: 枚数の目安があれば入力してください placeholder: 例:10〜15枚
- type: textarea id: style attributes: label: スタイル・トーンの要望 description: デザインや文体に希望があれば記入してください placeholder: | 例: - ビジネスライクにまとめてほしい - 図表(cols レイアウト)を多めに使いたい - 数字を強調したい
- type: textarea id: extra attributes: label: その他・補足 description: 追加情報があれば何でもlabels: ["slide-request"] を指定しておくと、Issue 作成時にラベルが自動付与されます。
使い方
すべてのファイルをプッシュしたら、さっそく試してみましょう。
- Issue フォームに内容を入力してSubmit

- 数分待つと自動でPRが作成される

- PRの
input/input.mdにスライドが生成される
手動で修正したいとき
生成されたスライドに手を加えたい場合は、PR の input/input.md を直接編集してコミットします。コミットのたびに自動で再ビルドが走り、コメントが更新されます。
ローカルで細かく調整するならnpm run devでリアルタイムプレビューが使えます。
まとめ
今回使用した技術は次のとおりです。
| やること | 使う技術 |
|---|---|
| スライドの内容を指定する | GitHub Issues(フォームテンプレート) |
| スライドを自動生成する | Claude Code Action + CLAUDE.md |
| 複数形式に変換する | Marp CLI + GitHub Actions |
| 結果を通知する | GitHub Script でコメント |
特に CLAUDE.md や Skills の書き方でスライドの品質が大きく変わります。 意図に沿った結果が得られない場合は、CLAUDE.mdのルールやSkillsの内容を見直してみましょう。
この仕組みを作ってみて、AIを活用しても最後は人の手で仕上げることが重要だと感じました。
AIはあくまでツールであり、スライドの内容や構成を考えるのは人です。AIの提案をたたき台にして人が整える、という使い方が、質の高いスライドを効率的に作るコツです。
RELATED POSTS
コメント
GitHub Discussions のコメント欄は、開いたときだけ読み込みます。