GitHub Appマニフェストを使用したGitHub Appの登録方法の詳細

## GitHub Appマニフェストとは

**GitHub Appマニフェスト**とは、あらかじめ設定済みのGitHub Appの登録情報を共有できる仕組みです ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=GitHub%20App%20%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%E3%81%AF%E3%80%81%E4%BA%8B%E5%89%8D%E6%A7%8B%E6%88%90%E6%B8%88%E3%81%BF%E3%81%AE%20GitHub%20App,%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%20%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%20GitHub%20App%20%E3%82%92%E3%81%99%E3%81%B0%E3%82%84%E3%81%8F%E7%99%BB%E9%8C%B2%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82))。マニフェストにはアプリの権限やイベント、Webhook URLなど必要な設定内容が含まれており、それを使ってユーザーが素早く新しいGitHub Appを作成（登録）できます ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=When%20someone%20registers%20a%20GitHub,to%20another%20person%20on%20GitHub)) ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%80%81GitHub%20App%20%E3%81%AE%E7%99%BB%E9%8C%B2%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%20Webhook%20%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%80%81%E7%A7%98%E5%AF%86%E3%82%AD%E3%83%BC,%E7%99%BB%E9%8C%B2%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AF%E3%80%81%E3%81%9D%E3%81%AE%20GitHub%20App%20%E7%99%BB%E9%8C%B2%E3%82%92%E6%89%80%E6%9C%89%E3%81%97%E3%80%81GitHub%20%E4%B8%8A%E3%81%A7%E7%99%BB%E9%8C%B2%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%97%E3%81%9F%E3%82%8A%E3%80%81%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%82%8A%E3%80%81%E5%88%A5%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E7%A7%BB%E8%AD%B2%E3%81%97%E3%81%9F%E3%82%8A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82))。マニフェスト経由でGitHub Appを登録すると、GitHub側で自動的にそのアプリの**Webhookシークレット**（秘密のトークン）、**プライベートキー**（PEM形式）、**クライアントシークレット**、および**GitHub App ID**が生成されます ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%80%81GitHub%20App%20%E3%81%AE%E7%99%BB%E9%8C%B2%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%20Webhook%20%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%80%81%E7%A7%98%E5%AF%86%E3%82%AD%E3%83%BC,%E7%99%BB%E9%8C%B2%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AF%E3%80%81%E3%81%9D%E3%81%AE%20GitHub%20App%20%E7%99%BB%E9%8C%B2%E3%82%92%E6%89%80%E6%9C%89%E3%81%97%E3%80%81GitHub%20%E4%B8%8A%E3%81%A7%E7%99%BB%E9%8C%B2%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%97%E3%81%9F%E3%82%8A%E3%80%81%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%82%8A%E3%80%81%E5%88%A5%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E7%A7%BB%E8%AD%B2%E3%81%97%E3%81%9F%E3%82%8A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82))。このようにマニフェストを使うことで、ユーザーは複雑な設定を一から入力する手間を省き、決められた構成でアプリを登録できるのが特徴です。

## マニフェストを使ったGitHub App登録フロー

GitHub Appマニフェストを用いた登録フローは、OAuth認証に似た3段階のハンドシェイク手順で行われます ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=GitHub%20App%20%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%20%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A7%E3%81%AF%E3%80%81OAuth%20%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AB%E4%BC%BC%E3%81%9F%E3%83%8F%E3%83%B3%E3%83%89%E3%82%B7%E3%82%A7%E3%82%A4%E3%82%AF,%E3%81%93%E3%81%AE%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A7%E3%81%AF%E3%80%81%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%20GitHub%20App%20%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%97%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E7%A7%98%E5%AF%86%E3%82%AD%E3%83%BC%E3%80%81Webhook%20%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%80%81ID))。以下のステップに従って、新しいGitHub Appをマニフェストから登録します。

1. **GitHubへのリダイレクトとマニフェスト送信** – ユーザーをGitHubのアプリ作成ページにリダイレクトし、そこでマニフェスト（JSON形式の設定情報）を送信します。具体的には、個人アカウントの場合は`https://github.com/settings/apps/new`（Organizationに作成する場合は`https://github.com/organizations/組織名/settings/apps/new`）に対して、HTTP POSTで`manifest`というパラメーターを含めてリクエストします ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=To%20redirect%20people%20to%20register,the%20app%20will%20be%20registered))。`manifest`パラメーターの値はJSONエンコードされた文字列で、これにGitHub Appの設定内容を記述します ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=You%20must%20include%20the%20GitHub,parameter%20for%20additional%20security))。必要に応じて、CSRF対策用の`state`パラメーター（推測困難なランダム文字列）も付与できます ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=You%20must%20include%20the%20GitHub,parameter%20for%20additional%20security)) ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=))。ユーザーがリンクをクリックするとGitHubの「新規GitHub App作成」ページが開き、そこに事前に指定された内容が反映されます（アプリ名はマニフェストで指定していれば編集可能な形で表示され、未指定の場合はユーザーが入力できます ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=The%20person%20registering%20the%20app,the%20app%20in%20this%20field))）。

   - **マニフェストに含める主な設定項目**: マニフェストJSONには以下のようなフィールドを含めます ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=%E5%90%8D%E5%89%8D%20%E7%A8%AE%E9%A1%9E%20%E8%AA%AC%E6%98%8E%20,GitHub%20App%20%E3%81%AE%E8%AA%AC%E6%98%8E%E3%80%82)) ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=,%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81GitHub%20App%20%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%9F%E5%BE%8C%E3%81%AB%E3%80%81GitHub%20App%20%E3%82%92%E6%89%BF%E8%AA%8D%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E8%A6%81%E6%B1%82%E3%81%97%E3%81%BE%E3%81%99%E3%80%82))。
     - `name`: アプリの名称（例: `"My GitHub App"`）。省略するとユーザーが作成時に入力します ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=The%20person%20registering%20the%20app,the%20app%20in%20this%20field))。
     - `url`: アプリのホームページURL（必須） ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=%E5%90%8D%E5%89%8D%20%E7%A8%AE%E9%A1%9E%20%E8%AA%AC%E6%98%8E%20,GitHub%20App%20%E3%81%AE%E8%AA%AC%E6%98%8E%E3%80%82))。
     - `hook_attributes`: Webhookの設定オブジェクトで、少なくとも受信先の`url`（Webhookペイロードを受け取るサーバーのURL）を指定します ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=))。`active`を省略すればデフォルトで`true`（有効）になります ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=))。
     - `redirect_url`: ユーザーがGitHub上でアプリ作成を完了した後にリダイレクトされる先のURLです ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=,%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E6%89%80%E6%9C%89%E8%80%85%E3%81%AE%E3%81%BF%E3%81%8C%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF))。通常これは自分のサービス側のエンドポイントになります。
     - `callback_urls`: ユーザーがアプリをインストールして認可した後にリダイレクトするURLのリストです（最大10個まで指定可） ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=,GitHub%20App%20%E3%81%8B%E3%82%89%E3%82%B5%E3%83%96%E3%82%B9%E3%82%AF%E3%83%A9%E3%82%A4%E3%83%96%E3%81%95%E3%82%8C%E3%82%8B%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%E3%80%82))。OAuth連携を併用する場合などに利用します。
     - `setup_url`: （任意）アプリインストール後に追加のセットアップが必要な場合に誘導するURL ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=,GitHub%20App%20%E3%81%A7%E5%BF%85%E8%A6%81%E3%81%AA%E6%A8%A9%E9%99%90%E3%82%BB%E3%83%83%E3%83%88%E3%80%82%20%E3%81%93%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%BD%A2%E5%BC%8F%E3%81%AF%E3%80%81%E3%82%AD%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A8%B1%E5%8F%AF%E3%81%AE%E5%90%8D%E5%89%8D))。
     - `description`: アプリの説明文 ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=URL%20%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%20,%E3%82%92%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%20%E8%A9%B3%E3%81%97%E3%81%8F%E3%81%AF%E3%80%81%E3%80%8C%2023%E3%80%8D%E3%82%92%E3%81%94%E8%A6%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82))。
     - `public`: アプリを**公開**するかどうかのフラグです。`true`にするとGitHub上で他のユーザーがインストール可能な公開アプリになり、`false`にすると自分（所有者）だけがインストール可能なプライベートアプリとなります ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=,%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81GitHub%20App%20%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%9F%E5%BE%8C%E3%81%AB%E3%80%81GitHub%20App%20%E3%82%92%E6%89%BF%E8%AA%8D%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E8%A6%81%E6%B1%82%E3%81%97%E3%81%BE%E3%81%99%E3%80%82))。
     - `default_permissions`: アプリがリポジトリやOrganizationに対して要求する**権限**（アクセス許可）の設定です ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=,%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%97%E3%81%BE%E3%81%99%E3%80%82))。キーに権限名（例:`issues`）、値にアクセスレベル（`read`または`write`など）を指定したオブジェクトで表します ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=or%20,setup_url))。例えば`"issues": "write"`のように記述します（詳細な権限名は公式ドキュメントを参照 ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=,permissions%20for%20a%20GitHub%20App))）。
     - `default_events`: アプリがサブスクライブする**デフォルトのイベント**の一覧です ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=,%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81GitHub%20App%20%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%9F%E5%BE%8C%E3%81%AB%E3%80%81GitHub%20App%20%E3%82%92%E6%89%BF%E8%AA%8D%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E8%A6%81%E6%B1%82%E3%81%97%E3%81%BE%E3%81%99%E3%80%82))。例えば`["issues", "issue_comment"]`のように、Webhookで受け取りたいイベント種類を配列で指定します。
     - `request_oauth_on_install`: `true`に設定すると、アプリインストール直後にユーザーに対して追加のOAuth認可を要求します ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=%28%E3%81%9F%E3%81%A8%E3%81%88%E3%81%B0%20,%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81GitHub%20App%20%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E5%BE%8C%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92))。通常、アプリがユーザーアカウント権限での操作を必要とする場合に使用します。
     - `setup_on_update`: `true`にすると、ユーザーがアプリのインストール設定を更新した後に、指定した`setup_url`へリダイレクトします ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=,%E3%81%AB%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%97%E3%81%BE%E3%81%99%E3%80%82))。

   ※上記JSON全体を文字列にエンコードして`manifest`パラメータに設定します。必要な項目をあらかじめ指定しておくことで、ユーザーは最小限の入力（主にアプリ名の確認程度）で済むようになります。例えば、次のようなマニフェストJSONを組み立てて送信できます ([Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn](https://runs-on.com/blog/self-serve-github-app-registration-with-manifests/#:~:text=input.value%20%3D%20JSON.stringify%28)) ([Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn](https://runs-on.com/blog/self-serve-github-app-registration-with-manifests/#:~:text=)):

   ```json
   {
     "name": "Octoapp",
     "url": "https://www.example.com",
     "hook_attributes": {
       "url": "https://example.com/github/events"
     },
     "redirect_url": "https://example.com/redirect",
     "callback_urls": ["https://example.com/callback"],
     "public": true,
     "default_permissions": {
       "issues": "write",
       "checks": "write"
     },
     "default_events": ["issues", "issue_comment", "check_suite", "check_run"]
   }
   ```

2. **GitHubからのリダイレクト受信** – ユーザーがGitHub上で「Create GitHub App」（アプリ作成）を実行すると、GitHubは先ほどマニフェストで指定した`redirect_url`にユーザーのブラウザをリダイレクトします ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=2,to%20your%20site))。このリダイレクト先URLには、クエリパラメータとして一時的な`code`（コード）が付与されます ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=When%20the%20person%20clicks%20Create,For%20example))。例えば次のように、`https://example.com/redirect?code=...`という形式でコードが渡されます ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=When%20the%20person%20clicks%20Create,For%20example))。もし先ほど`state`パラメータを付けていれば、それも同様に返ってくるので、リダイレクト先で受け取った`state`値が送信前のものと一致するか確認することでセキュリティ検証を行います ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=If%20you%20provided%20a%20,For%20example))。

   この`code`は**一度きり**かつ**短時間（1時間以内）**のみ有効なコードであり、後述の手順でアプリ情報を取得するために使用します ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=match%20at%20L214%20GitHub%20App,%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%203%20%E3%81%A4%E3%81%AE%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%99%E3%81%B9%E3%81%A6%E3%82%92%201%20%E6%99%82%E9%96%93%E4%BB%A5%E5%86%85%E3%81%AB%E5%AE%8C%E4%BA%86%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)) ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=GitHub%20App%20%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%20%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E3%81%93%E3%81%AE%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%82%92%E3%80%811%20%E6%99%82%E9%96%93%E4%BB%A5%E5%86%85%E3%81%AB%E5%AE%8C%E4%BA%86%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82))。

3. **一時コードの交換とアプリ情報の取得** – サービス（あなたのアプリケーション）のサーバー側では、受け取った`code`を使ってGitHubのAPIエンドポイントにPOSTリクエストを送り、先ほど作成されたGitHub Appの詳細情報を取得します ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=3,to%20retrieve%20the%20app%20configuration))。このAPIは**「Create a GitHub App from a manifest」**と呼ばれるエンドポイントで、URLは次の形式になります ([REST API endpoints for GitHub Apps - GitHub Docs](https://docs.github.com/en/rest/apps/apps#create-a-github-app-from-a-manifest#:~:text=)):

   ```
   POST https://api.github.com/app-manifests/＜コード＞/conversions
   ```

   （`＜コード＞`の部分は受け取った一時コードに置き換えてください。）このリクエストに成功すると、応答(JSON)の中に先ほど作成されたGitHub Appの情報が含まれています。具体的には、**アプリID** (`id`)、**アプリのスラッグ名** (`slug`)、**クライアントID**および**クライアントシークレット**（OAuth用）、**Webhookシークレット**、そして**プライベートキー（pem）**などが返ってきます ([REST API endpoints for GitHub Apps - GitHub Docs](https://docs.github.com/en/rest/apps/apps#create-a-github-app-from-a-manifest#:~:text=%22updated_at%22%3A%20%222017,nMIIEowIBAAKCAQEAuEPzOUE%2BkiEH1WLiMeBytTEF856j0hOVcSUSUkZxKvqczkWM%5Cn9vo1gDyC7%20ZXhdH9fKh32aapba3RSsp4ke%2BgiSmYTk2mGR538ShSDxh0OgpJmjiKP%5CnX0Bj4j5sFqfXuCtl9SkH4iu%20eivv4R53ktqM%2Bn6hk98l6hRwC39GVIblAh2lEM4L%2F%5Cn6WvYwuQXPMM5OG2Ryh2tDZ1WS5RKfgq%2B9ksNJ%205Q9UtqtqHkO%2BE63N5OK9sbzpUUm%5CnoNaOl3udTlZD3A8iqwMPVxH4SxgATBPAc%2Bbmjk6BMJ0qIzDcVGT)) ([REST API endpoints for GitHub Apps - GitHub Docs](https://docs.github.com/en/rest/apps/apps#create-a-github-app-from-a-manifest#:~:text=,nMIIEowIBAAKCAQEAuEPzOUE%2BkiEH1WLiMeBytTEF856j0hOVcSUSUkZxKvqczkWM%5Cn9vo1gDyC7))。GitHubはWebhookシークレットを自動生成し、プライベートキーもこの時点で発行します ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=GitHub%20%E3%81%AF%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%20Webhook%20%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E5%80%A4%E3%81%AF%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AB%E6%A0%BC%E7%B4%8D%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82,%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E6%A0%BC%E7%B4%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82))。これらの値はサーバー側で安全に保管し、後続の処理（例えば環境変数に設定してアプリで利用する等）に使用します ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=To%20complete%20the%20handshake%2C%20send,file)) ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=GitHub%20%E3%81%AF%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%20Webhook%20%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E5%80%A4%E3%81%AF%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AB%E6%A0%BC%E7%B4%8D%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82,%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E6%A0%BC%E7%B4%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82))。なお、この`code`を使った交換（変換）処理は**1時間以内**に完了させる必要があります ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=GitHub%20App%20%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%20%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E3%81%93%E3%81%AE%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%82%92%E3%80%811%20%E6%99%82%E9%96%93%E4%BB%A5%E5%86%85%E3%81%AB%E5%AE%8C%E4%BA%86%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82))。時間が経過するとコードは無効となり、再度最初からやり直す必要があります。

   > ※上記エンドポイントへのアクセスは、GitHubユーザーの適切な認証コンテキストで行う必要があります（通常、GitHubにログイン済みのユーザーが自分のアカウントにアプリを作成するので、そのユーザー権限でのAPI呼び出しとなります）。エンドポイントは乱用防止のためレート制限があります ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=Note))。

以上がマニフェストフローの基本的な流れです。まとめると、**事前定義されたアプリ設定(マニフェスト)**をユーザー経由でGitHubに送り、**一時コード**を受け取り、そのコードを使って**アプリの認証情報**を取得するというプロセスになります。この手順により、ユーザーは自分のアカウント（またはOrganization）に新しいGitHub Appを登録し、そのクレデンシャル情報を開発者側（あなたのサービス）が受け取ることができます。

## 具体的な使用例と実装パターン

上記のマニフェストフローは、実際のWebアプリケーションや統合サービスで広く利用されています。以下に、GitHub APIを活用した実装例や活用シナリオを紹介します。

- **実装例: サーバー側でのコード交換処理** – マニフェストからの登録完了後に受け取るコードを、実際にAPI経由で変換する手順を簡単なスクリプトで示します。例えば、受け取った`code`を使ってcURLコマンドでGitHub APIにリクエストする場合、以下のようになります（必要に応じて認証ヘッダーやAPIバージョンヘッダーを付与）:

   ```bash
   curl -X POST -H "Accept: application/vnd.github+json" \
        https://api.github.com/app-manifests/<取得したコード>/conversions
   ```

   上記のようにリクエストを送信すると、ステータス201（Created）とともにJSON形式の応答が返ってきます ([REST API endpoints for GitHub Apps - GitHub Docs](https://docs.github.com/en/rest/apps/apps#create-a-github-app-from-a-manifest#:~:text=Create%20a%20GitHub%20App%20from,a%20manifest)) ([REST API endpoints for GitHub Apps - GitHub Docs](https://docs.github.com/en/rest/apps/apps#create-a-github-app-from-a-manifest#:~:text=post%2Fapp))。応答には先述の通り、`id`, `slug`, `html_url`（GitHub上のアプリページURL）、`client_id`, `client_secret`, `webhook_secret`, `pem`などのフィールドが含まれます ([REST API endpoints for GitHub Apps - GitHub Docs](https://docs.github.com/en/rest/apps/apps#create-a-github-app-from-a-manifest#:~:text=%22updated_at%22%3A%20%222017,nMIIEowIBAAKCAQEAuEPzOUE%2BkiEH1WLiMeBytTEF856j0hOVcSUSUkZxKvqczkWM%5Cn9vo1gDyC7%20ZXhdH9fKh32aapba3RSsp4ke%2BgiSmYTk2mGR538ShSDxh0OgpJmjiKP%5CnX0Bj4j5sFqfXuCtl9SkH4iu%20eivv4R53ktqM%2Bn6hk98l6hRwC39GVIblAh2lEM4L%2F%5Cn6WvYwuQXPMM5OG2Ryh2tDZ1WS5RKfgq%2B9ksNJ%205Q9UtqtqHkO%2BE63N5OK9sbzpUUm%5CnoNaOl3udTlZD3A8iqwMPVxH4SxgATBPAc%2Bbmjk6BMJ0qIzDcVGT)) ([REST API endpoints for GitHub Apps - GitHub Docs](https://docs.github.com/en/rest/apps/apps#create-a-github-app-from-a-manifest#:~:text=,nMIIEowIBAAKCAQEAuEPzOUE%2BkiEH1WLiMeBytTEF856j0hOVcSUSUkZxKvqczkWM%5Cn9vo1gDyC7))。これらをパースして保存することで、プログラム上でGitHub Appの認証情報を扱えるようになります。例えばNode.js製のフレームワーク**Probot**では、このAPI応答を受け取って`.env`ファイルに`APP_ID`や`PRIVATE_KEY`（pem）、`WEBHOOK_SECRET`を自動で書き込み、アプリがすぐに動作できるようにしています ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=Using%20dotenv%2C%20Probot%20creates%20a,retrieved%20from%20the%20app%20configuration))。

- **使用シナリオ: Probotによる開発と共有** – ProbotはGitHub App開発向けのNode.jsフレームワークで、マニフェストフローを簡単に利用できるようにしています ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=Using%20Probot%20to%20implement%20the,GitHub%20App%20Manifest%20flow))。Probotでアプリを作成すると、プロジェクト内の`app.yml`ファイルに今回説明したマニフェストの内容（権限やイベント等）を記述します ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=1,to%20register%20a%20preconfigured%20app))。Probotが生成するローカルのウェブページには「Register GitHub App」というボタンが用意されており、開発者や利用者はそれをクリックするだけでマニフェストに基づいたGitHub Appを自分のアカウントに登録できます ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=3,to%20register%20a%20preconfigured%20app))。登録後、Probotは自動的に返された`APP_ID`や`PRIVATE_KEY`などを取得し、環境変数経由でアプリケーションにセットします ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=Using%20dotenv%2C%20Probot%20creates%20a,retrieved%20from%20the%20app%20configuration))。これにより、開発者は手動でキーをコピーすることなく、すぐにアプリ開発や動作検証を始められます。

- **使用シナリオ: 社内ツールによる大量アプリ作成** – マニフェストフローは社内向けツールでも活用されています。ある事例では、JenkinsとGitHubを統合するために多数のGitHub Appを作成する必要がありましたが、手作業でアプリを一つひとつ登録するのは煩雑でミスが起こりがちでした ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=Given%20that%20we%20have%20a,use%20to%20create%20the%20App))。そこで社内Webアプリを用意し、GitHub Appマニフェストを利用して必要な設定が事前に施されたアプリを自動作成する仕組みを導入しました ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=we%20have%20created%20a%20manifest,use%20to%20create%20the%20App)) ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=With%20a%20manifest%2C%20we%20can,install%20the%20App%20into%20repositories))。このツールでは、ユーザー（社内管理者）がWeb UI上で必要事項を選ぶと裏側でマニフェストを生成し、GitHubのアプリ作成ページにリダイレクトします。ユーザーがGitHub上で承認すると自社サービスにコードが返り、ツールがそのコードを使って自動的にアプリのIDや秘密鍵を取得・安全な保管まで行います ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=1,the%20App%20information%20it%20just))。このようにして**各チーム専用のGitHub App**を次々と迅速に作成し、権限設定ミスも防止しています ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=Given%20that%20we%20have%20a,use%20to%20create%20the%20App))。

- **使用シナリオ: サードパーティサービスでの簡単インストール** – 外部の統合サービスでも、マニフェストフローによりユーザーにスムーズな設定体験を提供している例があります。例えば、自前のGitHub Actionsランナーを管理するサービス「RunsOn」では、利用者が2〜3回クリックするだけで自分のOrganizationに必要なGitHub Appを登録できるようマニフェストを活用しています ([Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn](https://runs-on.com/blog/self-serve-github-app-registration-with-manifests/#:~:text=Upon%20submission%2C%20GitHub%20will%20redirect,exchange%20for%20the%20app%20secrets))。ユーザーがサービス上で「GitHub Appを設定する」といったボタンを押すと、裏でマニフェストがGitHubに送られ、すぐにコードが返されます。サービス側でそのコードを交換してアプリの秘密鍵などを取得し、自動的に設定を完了してくれるため、ユーザーは複雑な手順を意識せず統合を利用開始できます ([Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn](https://runs-on.com/blog/self-serve-github-app-registration-with-manifests/#:~:text=Upon%20submission%2C%20GitHub%20will%20redirect,exchange%20for%20the%20app%20secrets))。

これらの例から分かるように、GitHub Appマニフェストによる登録は**開発者やサービス提供者にとって非常に便利な手段**であり、ユーザーにとってもシンプルな操作で必要なアプリ連携を行えるメリットがあります。

## マニフェスト利用のメリット

GitHub Appマニフェストを活用することで得られる主なメリットは以下のとおりです。

- **設定の自動化と迅速化**: Webインターフェースで一つひとつ権限やURLを入力してアプリ登録する手間を省けます。クリック数回でアプリ登録と必要情報の取得まで完了するため、セットアップがスピーディーです ([Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn](https://runs-on.com/blog/self-serve-github-app-registration-with-manifests/#:~:text=Clicking%20through%20the%20GitHub%20UI,prone)) ([Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn](https://runs-on.com/blog/self-serve-github-app-registration-with-manifests/#:~:text=Upon%20submission%2C%20GitHub%20will%20redirect,exchange%20for%20the%20app%20secrets))。手動入力に比べてミスも減り、確実に正しい設定でアプリを作成できます ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=Given%20that%20we%20have%20a,use%20to%20create%20the%20App))。

- **一貫性と再利用性**: マニフェスト（JSONまたはYAMLファイル）としてアプリの構成を定義しておくことで、同じ設定を繰り返し再利用できます。例えば開発用・本番用に同じ権限のアプリをそれぞれ作成するといった場合でも、マニフェストを使えば構成のばらつきを防げます ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=them%20to%20configure%20an%20app,to%20a%20GitHub%20App%20configuration))。設定内容をリポジトリで管理し、バージョン管理することも可能です ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=,to%20a%20GitHub%20App%20configuration))。

- **ユーザーへの簡便さ**: エンドユーザー（アプリを自分のGitHubアカウントに導入する人）は、複雑な設定手順を踏む必要がありません。開発者側で用意したリンクを踏み、名前を確認して作成を承認するだけで、必要な権限・Webhookが設定されたアプリが自動生成されます ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=GitHub%20App%20%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%E3%81%AF%E3%80%81%E4%BA%8B%E5%89%8D%E6%A7%8B%E6%88%90%E6%B8%88%E3%81%BF%E3%81%AE%20GitHub%20App,%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%20%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%20GitHub%20App%20%E3%82%92%E3%81%99%E3%81%B0%E3%82%84%E3%81%8F%E7%99%BB%E9%8C%B2%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)) ([Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn](https://runs-on.com/blog/self-serve-github-app-registration-with-manifests/#:~:text=Upon%20submission%2C%20GitHub%20will%20redirect,exchange%20for%20the%20app%20secrets))。特に、GitHubに不慣れなチームメンバーのオンボーディングを助けたり、複雑な統合設定をシンプルにしたりするのに有効です ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=Here%20are%20some%20scenarios%20where,configured%20apps))。

- **秘密情報の安全な受け渡し**: マニフェストフローでは、アプリのクライアントシークレットやプライベートキー（pem）などの秘密情報をAPI経由で直接取得できます ([Registering a GitHub App from a manifest - GitHub Docs](https://docs.github.com/en/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=To%20complete%20the%20handshake%2C%20send,file))。ユーザーが自分で秘密鍵を生成してコピー・貼り付けするといった手間やリスクを避け、開発者側で安全に受け取り処理できます ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=With%20a%20manifest%2C%20we%20can,install%20the%20App%20into%20repositories))。これにより、人為的ミスを減らしつつ自動的に自分のサービス内へ鍵情報を取り込めます。

- **コミュニティや顧客との共有**: マニフェストは他のユーザーと簡単に共有できます ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=GitHub%20App%20%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E4%BA%8B%E5%89%8D%E6%A7%8B%E6%88%90%E6%B8%88%E3%81%BF%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B%E3%82%B7%E3%83%8A%E3%83%AA%E3%82%AA%E3%82%92%E6%AC%A1%E3%81%AB%E3%81%84%E3%81%8F%E3%81%A4%E3%81%8B%E6%8C%99%E3%81%92%E3%81%BE%E3%81%99%E3%80%82))。例えば自社サービスの利用者に対し、必要なGitHub Appをマニフェスト経由で提供すれば、利用者は自分のアカウントにワンクリックでアプリを用意できます ([Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn](https://runs-on.com/blog/self-serve-github-app-registration-with-manifests/#:~:text=Upon%20submission%2C%20GitHub%20will%20redirect,exchange%20for%20the%20app%20secrets))。GitHub公式マーケットプレイスを通さず独自にアプリを配布したい場合や、GitHub Enterprise環境向けにアプリ設定を配布する場合にも役立ちます ([Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs](https://docs.github.com/en/enterprise-server@3.11/apps/sharing-github-apps/registering-a-github-app-using-url-parameters#:~:text=This%20approach%20is%20useful%20for,apps%20from%20the%20GitHub%20Marketplace)) ([Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs](https://docs.github.com/en/enterprise-server@3.11/apps/sharing-github-apps/registering-a-github-app-using-url-parameters#:~:text=their%20personal%20account%20or%20organization,apps%20from%20the%20GitHub%20Marketplace))。

以上のように、マニフェストによる方法は**迅速・確実なセットアップ**と**シームレスなシークレット共有**を実現し、開発・運用上の利点が大きいです。

## 他のGitHub App登録方法との比較

GitHub Appを登録する方法にはマニフェスト以外にもいくつか選択肢があります。それぞれの特徴を比較すると次の通りです。

- **手動での登録（GitHub設定画面で作成）**: GitHubの「Developer settings > GitHub Apps」から新規アプリを作成する従来の方法です。フォームに名称や説明、コールバックURL、Webhook URL、必要な権限・イベント等をすべて自分で入力します ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=have%20to%20create%20the%20App,that%20belong%20to%20those%20permissions))。作成後、プライベートキーの生成やWebhookシークレットのコピーも自分で行う必要があります。メリットはGitHub上で直接設定できる安心感がありますが、**手順が煩雑**で入力ミスの可能性があります。また多数のアプリを一貫した設定で作成するには不向きです ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=Given%20that%20we%20have%20a,use%20to%20create%20the%20App))。

- **URLクエリパラメーターによる事前設定**: マニフェストほどではありませんが、あらかじめ設定を埋め込んだカスタムURLを共有してアプリ登録を簡略化する方法もあります ([Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs](https://docs.github.com/en/enterprise-server@3.11/apps/sharing-github-apps/registering-a-github-app-using-url-parameters#:~:text=You%20can%20use%20URL%20parameters,you%20included%20in%20the%20URL))。例えば、必要なパラメータ（`name`や`description`、`callback_url`、各種権限指定など）をクエリ文字列に含めた専用URLをユーザーに提供すると、そのリンクから開かれるGitHubの登録ページでは値が事前入力された状態になります ([Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs](https://docs.github.com/en/enterprise-server@3.11/apps/sharing-github-apps/registering-a-github-app-using-url-parameters#:~:text=About%20URL%20parameters%20for%20registering,GitHub%20Apps)) ([Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs](https://docs.github.com/en/enterprise-server@3.11/apps/sharing-github-apps/registering-a-github-app-using-url-parameters#:~:text=On%20the%20app%20registration%20page%2C,they%20can%20register%20the%20app))。ユーザーは不足項目を補って送信するだけで済むため多少の手間削減になります。ただし**秘密情報の自動取得はできない**ため、結局ユーザーが作成後に自分で秘密鍵を取得してサービス側に登録する必要があります。また、マニフェストのような**コード交換のステップがない**ため、開発者側が登録完了を自動検知したり情報を直接得たりすることはできません ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=,a%20request%20with%20request%20parameters))。簡易的なリンク共有で済む反面、完全な自動化にはつながらない点がマニフェストとの違いです。

- **マニフェスト（今回紹介した方法）**: 上記の通り、**ユーザー操作の簡略さ**と**開発者側での自動処理**の双方を実現する方法です ([マニフェストから GitHub App を登録する - GitHub Docs](https://docs.github.com/ja/apps/sharing-github-apps/registering-a-github-app-from-a-manifest#:~:text=GitHub%20App%20%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%E3%81%AF%E3%80%81%E4%BA%8B%E5%89%8D%E6%A7%8B%E6%88%90%E6%B8%88%E3%81%BF%E3%81%AE%20GitHub%20App,%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88%20%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%20GitHub%20App%20%E3%82%92%E3%81%99%E3%81%B0%E3%82%84%E3%81%8F%E7%99%BB%E9%8C%B2%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)) ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=With%20a%20manifest%2C%20we%20can,install%20the%20App%20into%20repositories))。リンク先に事前設定を埋め込みつつ、コードハンドシェイクにより秘密情報を安全に取得できる点で他の方法より優れています。唯一の欠点は、完全にプログラムだけでアプリを登録することはできず**ユーザーの関与が必要**なことです（ユーザーがGitHub上で「作成」を承認するステップは省略できません） ([Create a github app programmatically without user interaction? - Stack Overflow](https://stackoverflow.com/questions/61340033/create-a-github-app-programmatically-without-user-interaction#:~:text=%2A%20https%3A%2F%2Fdeveloper.github.com%2Fv3%2Fapps%2F%23create,manifest))。しかしこれはGitHubのセキュリティポリシー上避けられない部分であり、裏を返せばユーザーに明示的な許可を得たうえで安全にアプリを発行できるとも言えます。

まとめると、手動登録は柔軟ですが手間がかかり、URLパラメーター方式は一部自動化できるものの秘密情報取得には対応していません。それに対してマニフェスト方式はユーザー体験と自動化のバランスが良く、他の方法よりも**迅速かつ正確にGitHub Appを展開できる**点で優れています ([Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn](https://runs-on.com/blog/self-serve-github-app-registration-with-manifests/#:~:text=Clicking%20through%20the%20GitHub%20UI,prone)) ([Create a GitHub App from a manifest](https://devopsjournal.io/blog/2021/12/27/GitHub-App-from-manifest#:~:text=Given%20that%20we%20have%20a,use%20to%20create%20the%20App))。用途に応じて使い分けられますが、再現性のある設定や多数展開が求められる場合、マニフェストからの登録が有力な選択肢となるでしょう。 ([Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs](https://docs.github.com/en/enterprise-server@3.11/apps/sharing-github-apps/registering-a-github-app-using-url-parameters#:~:text=Alternatively%2C%20you%20can%20create%20a,GitHub%20App%20from%20a%20manifest))