本文へスキップ

GitHub Issues × Claude AI でスライドを自動生成する仕組みを作る

GitHub Issue に内容を書くだけで Claude AI が Marp スライドを自動生成し、PDF・PPTX・HTML を出力する仕組みをゼロから構築する方法を解説します。

読了目安: 約14分

この記事を共有

プレゼンテーションを作るとき、スライド自体の内容よりもデザインの調整に時間を使ってしまいがちです。

特に私の場合、研究室の進捗報告会のような定期的なプレゼンテーションの機会が多く、内容はある程度テンプレート化できるけど、スライド作成の工数が毎回大きいという課題を感じていました。

そこで、GitHub Issue に内容を書くだけで Claude AI がスライドを生成し、PDF・PPTX・HTML・PNG を一括出力する仕組みを作りました。

リポジトリは公開していませんが、この記事ではゼロから構築する手順を解説します。

完成形

完成形は次のような流れです。

試しに「この記事の内容をスライドにして」と Issue に書き、実際に生成したスライドが以下です。

全体フロー

まず、このツールがどのような流れでスライドを生成するのかを見ます。

スライドが完成するまでの流れ
Issue 作成 内容を日本語で書く Claude AI Marp形式に変換・PR作成 GitHub Actions PDF/PPTX/HTMLをビルド PRコメント zipダウンロードリンクが届く

裏側では 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 を作成できる場合があります。意図しないスライド生成が走り、余分なトークンを消費するリスクがあります。

ディレクトリ構成は次のとおりです。

Terminal window
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.json

Step2. Claude Code Actionのセットアップ

リポジトリの準備ができたら、Claude Code Actionをセットアップします。

Claude Code Actionとは?

Claude Code Actionは、GitHub上で@claudeとメンションするだけで、Claude AIが呼び出されるツールです。

claudecode-action

セットアップ方法

  1. ターミナルを立ち上げて、リポジトリのディレクトリへ移動します
  2. 以下のコマンドを入力してclaudeを起動したのちに、/install-github-appを実行します
Terminal window
claude
/install-github-app
  1. GitHub Appをどのリポジトリにインストールするか聞かれるので、先ほど作成したslide-generatorを選択してインストール
Terminal window
> Use current repository: account_name/slide-generator
  1. リポジトリの選択後、GitHub上でClaudeのGitHub Appインストール画面が開くので、"Configure"をクリックして連携完了

  2. ブラウザでインストールが完了したら、ターミナルに戻って各種設定を入力

  3. セットアップが完了すると、ターミナルに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をインストールします。

Terminal window
npm init -y
npm 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を一括でビルドしたりできます。

リアルタイムプレビューするときは、以下のコマンドを打ちます。

Terminal window
npm run dev

output/にビルド成果物を出力するときは、以下のコマンドを打ちます。

Terminal window
npm run build

Step4. 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: true
theme: 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-template

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 作成時にラベルが自動付与されます。

使い方

すべてのファイルをプッシュしたら、さっそく試してみましょう。

  1. Issue フォームに内容を入力してSubmit

Issue

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

claudecode-action

  1. 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の提案をたたき台にして人が整える、という使い方が、質の高いスライドを効率的に作るコツです。

コメント

感想や補足をお寄せください。承認後に公開されます。

コメントを読み込んでいます…