> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devin.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 通話のたびにPRを作成

export const UseCaseHero = ({title, description, prompt, category, features, devinUrl, agent, intent, playbookId, type}) => {
  const encodedPrompt = encodeURIComponent(prompt || '');
  const tag = 'docs-use-case-gallery';
  const utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=hero-cta';
  const agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  const devinHref = type === 'schedule' ? 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + (prompt ? '&prompt=' + encodedPrompt : '') : type === 'review' ? 'https://app.devin.ai/review?' + utm : agent === 'ada' ? 'https://app.devin.ai/search?' + utm + '&noSubmit=true' + (prompt ? '&prompt=' + encodedPrompt : '') : devinUrl ? devinUrl.includes('?') ? devinUrl + '&' + utm + agentParams : devinUrl + '?' + utm + agentParams : prompt ? 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encodedPrompt : 'https://app.devin.ai/?' + utm + agentParams;
  const buttonLabel = type === 'schedule' ? 'Schedule in Devin ↗' : type === 'review' ? 'Set Up Devin Review ↗' : agent === 'advanced' ? 'Try in Devin ↗' : agent === 'dana' ? 'Try in Dana ↗' : agent === 'ada' ? 'Try in Ask Devin ↗' : 'Try in Devin ↗';
  const featureList = features ? features.split(',').map(f => f.trim()) : [];
  return <div className="uc-hero">
      <div className="uc-hero-inner">
        <div className="uc-hero-left">
          <h1 className="uc-hero-title">{title}</h1>
          <p className="uc-hero-desc">{description}</p>
          <div>
            <a href={devinHref} target="_blank" rel="noopener noreferrer" className="try-in-devin-btn">
              {buttonLabel}
            </a>
          </div>
        </div>
        <div className="uc-hero-meta">
          <div className="uc-meta-item">
            <span className="uc-meta-label">Author</span>
            <span className="uc-meta-value">Cognition</span>
          </div>
          <div className="uc-meta-item">
            <span className="uc-meta-label">Category</span>
            <span className="uc-meta-value">{category}</span>
          </div>
          {featureList.length > 0 && <div className="uc-meta-item">
              <span className="uc-meta-label">Features</span>
              <span className="uc-meta-value">{featureList.join(', ')}</span>
            </div>}
        </div>
      </div>
    </div>;
};

export const PromptBlock = ({children, type, agent, intent, playbookId}) => {
  var utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=prompt-block';
  var tag = 'docs-use-case-gallery';
  var agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  var label = type === 'schedule' ? 'Schedule in Devin' : type === 'playbook' ? 'Create Playbook' : type === 'knowledge' ? 'Add to Knowledge' : agent === 'advanced' ? 'Try in Devin' : agent === 'dana' ? 'Try in Dana' : agent === 'ada' ? 'Try in Ask Devin' : 'Try in Devin';
  var buildUrl = function (text) {
    var encoded = encodeURIComponent(text);
    if (type === 'schedule') return 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + '&prompt=' + encoded;
    if (type === 'playbook') return 'https://app.devin.ai/settings/playbooks/create?' + utm + '&body=' + encoded;
    if (type === 'knowledge') return 'https://app.devin.ai/knowledge?' + utm + '&body=' + encoded;
    if (agent === 'ada') return 'https://app.devin.ai/search?' + utm + '&noSubmit=true&prompt=' + encoded;
    return 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encoded;
  };
  const ref = React.useRef(null);
  const [href, setHref] = React.useState('#');
  React.useEffect(() => {
    if (!ref.current) return;
    var codeEl = ref.current.querySelector('pre code');
    if (codeEl) {
      var text = codeEl.textContent.trim();
      if (text) setHref(buildUrl(text));
    }
    var header = ref.current.querySelector('[data-component-part="code-block-header"]');
    if (header && !header.querySelector('.prompt-block-devin-link')) {
      var link = document.createElement('a');
      link.href = href;
      link.target = '_blank';
      link.rel = 'noopener noreferrer';
      link.className = 'prompt-block-devin-link';
      link.style.cssText = 'display:inline-flex;align-items:center;gap:6px;text-decoration:none;color:#fff;font-size:11px;font-weight:500;padding:4px 10px;border-radius:6px;white-space:nowrap;background:#317CFF;transition:background 0.2s;margin-left:8px;';
      link.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> ' + label;
      link.onmouseenter = function () {
        link.style.background = '#2968D9';
      };
      link.onmouseleave = function () {
        link.style.background = '#317CFF';
      };
      header.appendChild(link);
    }
    var existingLink = ref.current.querySelector('.prompt-block-devin-link');
    if (existingLink && href !== '#') existingLink.href = href;
  });
  return <div className="prompt-block" ref={ref}>{children}</div>;
};

<UseCaseHero title="通話ごとにPRを作成" description="1時間ごとに実行されるDevinのスケジュールがGranolaをポーリングして新しい会議を確認し、文字起こしからエンジニアリングタスクを抽出して、PRを作成する子セッションを開始します。" prompt="Granola MCP server経由でGranolaをポーリングし、新しい会議を確認する1時間ごとのDevinスケジュールを設定します。文字起こしの準備ができた各会議からエンジニアリングタスクを抽出し、PRを作成する子Devinセッションを開始します。処理済みの会議を記録するには、Knowledgeノートを利用します。" category="自動化" features="スケジュール, MCP, プレイブック, 詳細" type="schedule" agent="devin" />

<div className="uc-detail-wrapper">
  <Tip>手動でセットアップしたくないですか？このページへのリンクをDevinのセッションに貼り付けて、すべて設定してもらってください。</Tip>

  Granolaは会議を録音し、メモ・要約・文字起こしとして保存します。Granola MCPを接続すると、Devinはチームメンバーと同じように会議の成果物を利用できます。議論された内容を確認し、具体的なエンジニアリングのフォローアップ事項を洗い出して、作業を開始します。

  これを1時間ごとのスケジュールとして実行すると、通話が終わった直後にタスクを開始できます。ループ全体は、スケジュール、Granola MCP、Knowledge、およびチャイルドセッションを使用して、お使いのDevinインスタンス内で実行されます。

  ```
  Devinのスケジュールされたセッション（毎時）
    → MCP経由で最近のGranolaミーティングを一覧表示
    → 新しいミーティングごとに（古い順から新しい順へ）：
        → メタデータ、メモ、AIサマリー、トランスクリプトを取得
        → 議論からエンジニアリングタスクを特定
        → 具体的なタスクに対してDevinの子セッションを開始
        → 処理済みのミーティングをKnowledgeに記録
  ```

  <Steps>
    <Step title="Granola MCPを接続する">
      Devin が文字起こしとメモを読むには、Granola の会議へのアクセスが必要です。

      1. **Settings > Connections > MCP servers** に移動して、**Granola** を検索します
      2. **Enable** をクリックして認証します — これにより、Devin に会議、文字起こし、メモへの読み取り権限が付与されます
      3. **Test listing tools** をクリックして、接続が正しく機能していることを確認します

      接続すると、Devin はセッション中に `list_meetings`、`get_meetings`、`get_meeting_transcript` を呼び出して、会議データを取得できます。詳しくは、[MCP サーバーの設定](/ja/work-with-devin/mcp)を参照してください。
    </Step>

    <Step title="processed-meetingsのKnowledgeノートを作成">
      Devin は、すでに処理済みの会議を記録するために、1 つの [Knowledge](/ja/product-guides/knowledge) ノートを利用します。これにより、毎時間の実行で重複して処理されるのを防げます。

      **Settings > Knowledge** に移動し、新しいノートを作成します。

      * **Name**: `Granola Post-call Processor Meeting Log`
      * **Trigger**: `Granola の通話後プロセッサのスケジュールされたセッションを実行する際は、このノートを利用して、すでに処理済みの会議を追跡します。`
      * **Body**:

      ```json Granola Post-call Processor Meeting Log theme={null}
      {
        "last_processed_meeting_id": null,
        "last_processed_meeting_time": null,
        "last_processed_title": null,
        "updated_at": null
      }
      ```

      スケジュールされたセッションでは、正常に処理された各会議がこのノートに記録されるため、次回の実行は前回の続きから開始されます。
    </Step>

    <Step title="Post-call Operatorの運用手順書を作成する">
      各ミーティングの処理方法を Devin に指示する[プレイブック](/ja/product-guides/creating-playbooks)を作成します。[**Settings > Playbooks**](https://app.devin.ai/settings/playbooks/create?utm_source=docs\&utm_medium=use-case-gallery)に移動し、新しいプレイブックを作成します。

      <PromptBlock type="playbook">
        ```txt Post-call Operator theme={null}
        完了した Granola ミーティングを、具体的なエンジニアリング作業に変換します。
        文字起こしを読み、実行可能なコード関連タスクをすべて特定し、
        PR を作成するための Devin の子セッションを開始します。徹底して実行を優先し、
        PR にできるものはすべて着手してください。

        各ミーティングについて:
        1. 文字起こし、AI 要約、非公開メモを読む
        2. 言及または示唆されたエンジニアリングタスクをすべて特定する:
           - 話し合われたバグ修正
           - 仕様化できるだけの詳細がある機能リクエスト
           - 合意されたリファクタリングや改善
           - 調査タスク
           - ドキュメントの更新
           - インフラストラクチャや DevOps の変更
        3. 各タスクについて、具体的な仕様を書く:
           - 作業対象のリポジトリ
           - 変更で実現すべき内容
           - 受け入れ基準
           - ミーティングから得られた重要な前提情報（引用は最小限にする）
        4. PR を作成できるほど具体的な各タスクについて、
           子 Devin セッションを開始する。プロンプトには仕様全文を含める。
        5. PR にするには曖昧すぎるタスクは、推奨アクションとして
           不足している前提情報を明記して列挙する。
        6. 開始したセッションと推奨事項の
           構造化された要約を返す。

        曖昧なアイデアに対してセッションを開始してはいけません。タスクに
        明確化が必要な場合は、代わりに推奨事項として列挙してください。
        ```
      </PromptBlock>

      保存後、プレイブック ID を控えておいてください。スケジュール用のプロンプトで参照します。
    </Step>

    <Step title="時間単位のスケジュールを作成">
      [**Settings > Schedules**](/ja/product-guides/scheduled-sessions) に移動し、**Create schedule** をクリックします。

      * **Name**: `Granola post-call processor`
      * **Frequency**: 毎時 (`0 * * * *`)
      * **Agent**: Devin — これにより、Devin は各タスクごとに子セッションを生成できるため、修正を並列で実行できます
      * **Slack channel** (任意) : チャンネルを選択すると、ミーティングが処理されてPRが作成された際にチームへ通知されます
      * **Prompt**:

      <PromptBlock type="schedule" agent="devin">
        ```txt Granola post-call processor theme={null}
        Granola post-call processor を実行します。

        Granola MCP server と、次の名前の Knowledgeノートを利用します
        "Granola Post-call Processor Meeting Log"。

        1. ミーティングログを確認し、最後に処理されたミーティング ID / 時刻を特定します。
        2. 過去24時間の Granola ミーティングを一覧表示します。
        3. ログ内の最新のミーティングより新しいミーティングを選択します。古い順に並べ替えます。
        4. 各ミーティングについて:
           a. MCP 経由でメタデータ、非公開メモ、AI 要約を取得します
           b. MCP 経由で完全な文字起こしを取得します
           c. 文字起こしが利用できない場合は、このバッチの処理をここで停止します
              — 先に進めたりスキップしたりしないでください。次回の実行で再試行されます。
           d. このミーティングに対して Post-call Operator playbook を実行します
           e. 具体的なエンジニアリングタスクのために子 Devin セッションを開始します
           f. この処理済みミーティングを Knowledgeノートに記録します
        5. Slack に要約を投稿します: 処理したミーティング、開始したセッション、
           および文字起こしがないためにスキップされたミーティング。

        ログ内の最新のミーティング以降に新しいミーティングがない場合は、何もせず終了します。
        ```
      </PromptBlock>

      完全自律で運用したい場合は、**bypass approval** を `true` に設定します — MCP ツール、Knowledge の更新、子セッションの作成に手動承認は不要です。
    </Step>

    <Step title="一般的な実行で生成される内容">
      1時間ごとに、Devin は新しいミーティングを処理し、関連するPRを作成します。実際のセッション出力は以下のようになります。

      ```
      最新のミーティングログエントリ以降、Granolaのミーティングを1件処理しました：

      ミーティング：「Backend API planning」（2026-04-29 午後2:00）

      開始した子セッション（3件）：
      1. /api/invoices エンドポイントのN+1クエリを修正
         Repo: acme/api-server
         PR: Eager-load invoice line items to fix timeout
         Session: https://app.devin.ai/sessions/abc123

      2. webhookエンドポイントにレート制限を追加
         Repo: acme/api-server
         PR: Per-key rate limits on /webhooks/*
         Session: https://app.devin.ai/sessions/def456

      3. 新しいBillingエンドポイントのAPIドキュメントを更新
         Repo: acme/docs
         PR: Add billing endpoint reference docs
         Session: https://app.devin.ai/sessions/ghi789

      推奨アクション（1件）：
      - auth tokenのリフレッシュフローを調査する — 「ときどき不安定」と言及されているが、具体的なエラーやrepoは特定されていない。チームからの追加の前提情報が必要。

      KnowledgeのミーティングログをBackend API planning（2026-04-29）に更新しました。
      ```

      各子セッションはそれぞれ独立して実行され、会議の前提情報があらかじめ説明に盛り込まれた独自のPRを作成します。
    </Step>

    <Step title="調整と改善を繰り返す">
      数日間運用したら、何がうまく機能しているかを見直して調整します。

      **文字起こしの遅延に対処する。** 文字起こしの準備ができていない会議に当たると、スケジュールは処理を停止します。これは、処理が遅れている会議を誤ってスキップしないためです。文字起こしの準備に毎回時間がかかる場合は、スケジュールの実行間隔を長くするか、プロンプトに待機時間のバッファを追加してください。

      **会議の種類で絞り込む。** すべての会議がエンジニアリング作業につながるわけではありません。特定の会議タイプをスキップするフィルターをプロンプトに追加します。

      <PromptBlock agent="advanced">
        ```txt 会議を種類で絞り込む theme={null}
        スケジュールのプロンプトを更新してください: タイトルに
        "1:1"、"standup"、または "social" を含む会議はスキップします。処理対象は、
        エンジニアリングに関する議論が含まれる可能性が高い会議 —
        計画セッション、バグのトリアージ、設計レビュー、顧客との通話 —
        のみにしてください。
        ```
      </PromptBlock>

      **結果から学ぶ。** 2週間ほど経ったら、どの子セッションがマージされた PR につながり、どれがマージされないままクローズされたかを分析するよう Devin に依頼します。そのフィードバックを使って、プレイブックのタスク抽出基準を改善します。

      <PromptBlock agent="advanced">
        ```txt 通話後の結果を分析してプレイブックを更新する theme={null}
        直近 2 週間に Granola の通話後プロセッサによって開始された
        すべての子セッションを確認してください。各セッションについて、
        PR がマージされたか、クローズされたかを確認します。

        パターンを特定してください — どの種類のタスクが一貫して
        マージ可能な PR につながるのか、どれが曖昧すぎるのか、そしてプレイブックの
        どこにより多くの前提情報が必要なのか。そのうえで、これらの学びに基づいて
        Post-call Operator プレイブックの更新案を提案してください。
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
