📆

AIを使った日報記述の省力化と集計

に公開

はじめに

こんにちは!4月に入社させていただき半年ほど経過した大場です。
カンリーエンジニア部には日報を書く文化があり、数十年ぶりに日報を書く日々を送っております。
カンリーは全社的にAIを使った生産性向上を強く推進しておりますので、今回はAIを使った日報記述の省力化と、日報データを元に各業務にどれだけ時間を使っているか集計する作業を行ってみたいと思います。

日報記述の省力化

日報のフォーマット

普段は以下のようなフォーマットで日報を書いています。

・日付:YYYY/MM/DD
・コンディション:☀️
・稼働時間: 8h(09:00〜18:00/休憩1h)
▼今日やったこと
・[MTG] 製品A 朝会 0.5h
・[MTG] 製品B 昼会 0.5h
・[MTG] 製品A モブ設計 1h
・製品A 運用 (作業内容) 1h
・製品A 開発 (作業内容) 1h
・製品B 運用 (作業内容) 1h
・製品B 開発 (作業内容) 2h
・CANLY-RENEWAL-xxxx 1h <-- Backlogのチケット対応の場合
・その他 (内容) 0h
▼気になっていること・困っていること  
・あれば記載
▼その他・報告・共有事項  
・あれば記載

日々のスケジュール管理は Google Calendar, 開発タスク管理は Backlog で行なっておりますので、MCPを使ってそれぞれのデータを取得してみます。

Cursor の MCP 設定

Google Calendar のデータ取得のためにこちらの MCP サーバを利用します。

https://github.com/nspady/google-calendar-mcp

READMEに従って設定を行います。Calendarを連携する Google アカウントでの作業が必要でしたが、会社ドメインのアカウントでの利用許可は得ていなかったので、新規のGoogleアカウントに 自分の Calendar の閲覧権限を与えて、 Calendar API を有効化して連携設定しました。

Backlog MCP も README に従って設定します。

https://github.com/nulab/backlog-mcp-server

Cursor からそれぞれの MCP と連携するには、Cursor のメニューから Cursor > 基本設定 > Cursor Settings を選択し、表示された設定画面のサイドメニューで "MCP & Integrations" を選択します。その後 "MCP Tools" のリストにある "New MCP Server" をクリックすると、エディタに mcp.json が表示されるので以下のように記述します。

{
  "mcpServers": {
    "google-calendar": {
      "command": "npx",
      "args": ["@cocal/google-calendar-mcp"],
      "env": {
        "GOOGLE_OAUTH_CREDENTIALS": "{credentialを記述したjsonへのパス}"
      }
    },
    "backlog": {
      "command": "docker",
      "args": [
        "run",
        "--pull", "always",
        "-i",
        "--rm",
        "-e", "BACKLOG_DOMAIN",
        "-e", "BACKLOG_API_KEY",
        "ghcr.io/nulab/backlog-mcp-server"
      ],
      "env": {
        "BACKLOG_DOMAIN": "{使用しているbacklog.comのドメイン名}",
        "BACKLOG_API_KEY": "{Backlogで作成したAPIキー}"
      }
    }
  }
}

mcp.json 保存後に一度 Cursor を再起動した方が良さそうです。連携が完了すると以下のように "MCP Tools" の各アイコンがグリーンで表示されます。
Cursor MCP Tools

Google Calendar と Backlog のデータ取得

連携が完了したら Cursor のチャットでデータ取得を指示します。

  • Google Calendar データの取得プロンプト
Google Calendar から xxxx アカウントの今日の予定を取得してください。
予定のタイトルで【】で囲まれていて Meet または Discord が含まれている部分は [MTG] に変換してください。(社内のMTGスケジュールのタイトル設定ルールに基づいた変換)
また各予定ごとの消化時間を計算してください。
消化時間は午前11時00分〜午前11時30分の予定であれば 0.5h のように "時間単位での計算結果" + "h" という表記でお願いします。
結果の出力フォーマットは "- 予定のタイトル 消化時間" としてください。
  • Google Calendar データの取得結果例
- [MTG] AIナレッジ共有会 1h
- [MTG] デイリースクラム1部 0.5h
- [MTG] 製品B 昼会 0.5h
  • Backlog データの取得プロンプト
Backlogの xxxx プロジェクトから担当者が大場でマイルストーンが"スプリントxx"のものを取得してください。
結果の出力フォーマットは "- 課題キー 件名" としてください。
  • Backlog データの取得結果例
- CANLY_RENEWAL-xxxx 課題タイトル A
- CANLY_RENEWAL-xxxx 課題タイトル B

現状は取得したデータを日報フォーマットに貼り付けての利用を想定しており、それぞれのツールから個々のスケジュール・タスクをコピペするよりは正確さが向上すると思いますが、省力化という意味では正直まだ微妙です。一括で日報フォーマットに落とし込むところまでの自動化を今後検討したいです。

日報データの集計

日報は日別にファイル化して月別のフォルダに格納しています。AIと相談しながら作業種別ごとの集計を行う計画を以下のようにまとめました。

- 対象ファイルの収集
  - ディレクトリ `{日報データを保存した月別ディレクトリのパス}` から拡張子が `.md` のファイルを全て列挙

- 各ファイルの読み込み
  - 文字コードは UTF-8 前提で読み込み

- 集計範囲の特定
  - 最初に出現する `▼今日やったこと` を開始位置とする
  - その後に出現する `▼気になっていること・困っていること` を終了位置とする
  - 開始・終了の見出し行は集計対象から除外(開始行の次の行~終了行の直前までを対象)
  - 終了見出しが無い場合はファイル末尾までを対象
  - 開始見出しが無いファイルはスキップ
  - 同一ファイルに複数の `▼今日やったこと` がある場合は「最初の組のみ」対象

- 行の解析ルール
  - 各行をトリムし、空行はスキップ
  - 行を半角スペースで分割し、最後のトークンを取得(連続スペースも区切りとして扱う)
  - 最後のトークンが正規表現 `^(\d+(?:\.\d+)?)h$` に一致する場合のみ採用し、数値部分を小数として取得
  - 一致しない行は無視(チェックボックス、補足テキスト、見出しなどは非対象)

- 合算
  - 作業時間合計 : 全ファイル・全対象行の時間値を合計(単位は時間)
  - MTG時間合計 : 全ファイル・全対象行のうち "MTG" を含む行の時間値を合計(単位は時間)
  - MTG時間(製品A)合計 : 全ファイル・全対象行のうち "MTG" と "製品A" を含む行の時間値を合計(単位は時間)
  - MTG時間(製品B)合計 : 全ファイル・全対象行のうち "MTG" と "製品B" を含む行の時間値を合計(単位は時間)
  - MTG時間(その他)合計 : 全ファイル・全対象行のうち "MTG" を含み "製品A" と "製品B" を含まない行の時間値を合計(単位は時間)
  - 開発時間合計 : 全ファイル・全対象行のうち "開発" または "CANLY_RENEWAL" を含み、"MTG" を含まない行の時間値を合計(単位は時間)
  - 開発時間(製品A)合計 : 全ファイル・全対象行のうち "製品A 開発" または "CANLY_RENEWAL" を含み、"MTG" を含まない行の時間値を合計(単位は時間)
  - 開発時間(製品B)合計 : 全ファイル・全対象行のうち "製品B 開発" を含み、"MTG" を含まない行の時間値を合計(単位は時間)
  - 運用時間合計 : 全ファイル・全対象行のうち "運用" を含み、"MTG" を含まない行の時間値を合計(単位は時間)
  - 運用時間(製品A)合計 : 全ファイル・全対象行のうち "製品A 運用" を含み、"MTG" を含まない行の時間値を合計(単位は時間)
  - 運用時間(製品B)合計 : 全ファイル・全対象行のうち "製品B 運用" を含み、"MTG" を含まない行の時間値を合計(単位は時間)
  - その他時間合計 : 全ファイル・全対象行のうち "MTG", "開発", "CANLY_RENEWAL", "運用" を含まない行の時間値を合計(単位は時間)

- 出力
  - 出力ディレクトリ `{結果を出力するディレクトリのパス}` を作成(未存在なら)
  - ファイル `summary.txt` に次の各行を出力する:
    - `作業時間合計 : {作業時間合計}`
    - `MTG時間合計 : {MTG時間合計}`
    - `MTG時間(製品A)合計 : {MTG時間(製品A)合計}`
    - `MTG時間(製品B)合計 : {MTG時間(製品B)合計}`
    - `開発時間合計 : {開発時間合計}`
    - `開発時間(製品A)合計 : {開発時間(製品A)合計}`
    - `開発時間(製品B)合計 : {開発時間(製品B)合計}`
    - `運用時間合計 : {運用時間合計}`
    - `運用時間(製品A)合計 : {運用時間(製品A)合計}`
    - `運用時間(製品B)合計 : {運用時間(製品B)合計}`
    - `その他時間合計 : {その他時間合計}`
  - 表示形式は「そのまま(例: 12.5)」とし、単位 `h` は付与しない

- 簡易バリデーション(任意)
  - 処理した `.md` ファイル数、対象行数、抽出できた時間トークン数を内部カウントし、異常があれば共有

- エッジケース
  - 例:`1h`, `0.5h`, `2.0h` は有効。`1.5 H` や `1.5hours` などは無効
  - タスク行末尾の時間トークンのみを対象とし、それ以外の位置の数値は無視

この内容をファイル (仮に summry.md とします) に保存しておき Cursor のチャットで集計指示を出します。

summary.md に記述されている作業を実行してください

特に指示はしていなかったのですが Python で集計用のコードを作成してくれたので、それを実行することで作業種別ごとの累積時間を得ることができました!

  • 集計結果の例
作業時間合計 : 144.5
MTG時間合計 : 64.25
MTG時間(製品A)合計 : 36.25
MTG時間(製品B)合計 : 12.75
MTG時間(その他)合計 : 15.25
開発時間合計 : 29.5
開発時間(製品A)合計 : 19.5
開発時間(製品B)合計 : 10.0
運用時間合計 : 42.0
運用時間(製品A)合計 : 6.0
運用時間(製品B)合計 : 36.0
その他時間合計 : 8.75

製品別の作業割合は四半期の目標としても利用しているので、この集計結果を期末の振り返り等に利用していきたいと思います。

以上です!

カンリーテックブログ

Discussion