複数データ源→CIで日次AIサマリー生成→自作PWAへ配信する仕組み
毎朝データ源を横断してLLMに要約・優先順位付けさせ、結果を自作PWAダッシュボードに自動表示。重い取得とLLM呼び出しはシークレットを持つCI側、PWAは結果JSONをingest受信するだけ。CI空変数・本番ビルドstale・dry-run検証の罠つき。
約13万トークンの節約 (API料金換算で約200円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「複数データ源→CIで日次AIサマリー生成→自作PWAへ配信する仕組み」は、業務自動化カテゴリのAI指示書(MDファイル)です。毎朝データ源を横断してLLMに要約・優先順位付けさせ、結果を自作PWAダッシュボードに自動表示。重い取得とLLM呼び出しはシークレットを持つCI側、PWAは結果JSONをingest受信するだけ。CI空変数・本番ビルドstale・dry-run検証の罠つき。この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約13万トークン(API料金換算で約200円)・72%のトークンを節約できます。
- カテゴリ
- 業務自動化
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約18万トークン
- この巻物使用時
- 約5万トークン
- 節約量
- 約13万トークン (約200円)
- 更新日
- 2026-08-20
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/ci-ai-pwa/raw を読み込んで、この指示書どおりに実装して"
中身
複数データ源→CIで日次AIサマリー生成→自作PWAへ配信する仕組み
毎朝、複数のデータ源(スプレッドシート/会計CSV/社内API等)を横断して LLM に要約・優先順位付けさせ、その結果を自分でホストしている PWA ダッシュボードに自動表示する構成。「毎朝ダッシュボードを開くだけで、今日やるべきことTOP3と各データ源の現在地が出ている」状態を作る。
全体構成(5パーツ)
① データ源(Sheets/CSV/API…)
↓ 読む
② CIジョブ(GitHub Actions 等・シークレット保持)
↓ LLMで要約/優先順位付け → JSON生成
↓ HTTPS POST (共有シークレットヘッダ)
③ 自作PWAの ingest エンドポイント (トンネルで公開)
↓ ローカルの state JSON に保存
④ widget が GET して表示
要点: 重いデータ取得と LLM 呼び出しは CI 側(シークレットを持てる場所)で行い、結果 JSON だけを PWA に POST する。PWA 自身は Google 等の資格情報を持たなくてよい。ローカルPCで動く PWA でも、トンネル公開していれば CI から到達できる。
なぜ「CI→POST」なのか(設計判断)
- PWA をローカルPCでホストしている場合、そのプロセスから外部SaaSへ認証付きアクセスするのは資格情報配置が面倒。CI には既にシークレットがある。
- OSのタスクスケジューラでのローカル定時実行が権限/ポリシーで塞がれている環境でも、CI の cron なら確実に回る。
- 生成物は小さな JSON なので、トンネル公開した ingest への POST で十分。
実装(PWA 側 / Next.js App Router 例)
state ヘルパ lib/<name>.ts:
import fs from 'fs'; import os from 'os'; import path from 'path';
const CACHE = path.join(os.homedir(), '.<app>-state', '<name>.json');
export function readCache(){ try{ if(!fs.existsSync(CACHE))return{cache:null,mtime:null};
const st=fs.statSync(CACHE); return {cache:JSON.parse(fs.readFileSync(CACHE,'utf-8')),mtime:st.mtime.toISOString()};}catch{return{cache:null,mtime:null}} }
export function writeCache(c:any){ fs.mkdirSync(path.dirname(CACHE),{recursive:true}); fs.writeFileSync(CACHE,JSON.stringify(c),'utf-8'); }
ingest(POST・共有シークレット認証) app/api/<name>/ingest/route.ts:
export const runtime='nodejs'; export const dynamic='force-dynamic';
export async function POST(req){
const secret=process.env.<NAME>_INGEST_SECRET?.trim();
const given=(req.headers.get('x-<name>-secret')||'').trim();
if(!secret||given!==secret) return new Response('forbidden',{status:403});
let body; try{ body=await req.json(); }catch{ return new Response('bad json',{status:400}); }
if(!body||!Array.isArray(body.items)) return new Response('bad shape',{status:400});
writeCache(body); return Response.json({ok:true});
}
read(GET・鮮度判定つき) app/api/<name>/route.ts: readCache() を返し、generatedAt から N 時間超なら stale:true。
widget: /…/api/<name> を fetch して表示。重要度で色分け(red/orange/yellow)+ 各データ源の現在地行。
実装(CI 側 / Python 例)
対象データ源を読む → LLM に「今日やることTOP3+各源の現在地」を厳密JSONスキーマで出力させる → ingest へ POST。
res = requests.post(os.environ["<NAME>_INGEST_URL"], json=payload,
headers={"x-<name>-secret": os.environ["<NAME>_INGEST_SECRET"]}, timeout=30)
res.raise_for_status()
cron は遅延しうるので複数時刻に仕掛け、「当日すでに成功した実行があればスキップ」する preflight を置く。
必ず踏む罠(実測)
- CIの未設定変数は「空文字」で渡る:
SOME: ${{ vars.SOME }}は変数未設定でも空文字で env に入る。os.environ.get(name, default)は default に落ちず空文字を返す→IDが空→404。空もmissing扱いにする:v=os.environ.get(name,"").strip(); return v or default。JS もprocess.env.X?.trim() || default(??は空文字を通すので不可)。 - 本番ビルドの stale: PWA を dev でなく本番ビルド(例
next start)で動かしている場合、新ルート/新widgetを足しても 再ビルド+プロセス再起動しないと 404(古いビルドが提供される)。.env変更も要再起動。 - 検証は必ず dry-run で実データを一度通す: POST前に「生成JSONをログ出力するだけ」のモードを作り、各データ源が実際に読めているか(空/404でないか)を目視してから本番POSTに切り替える。罠1はこれで気づけた。
- ingest は共有シークレット必須: トンネル公開エンドポイントは誰でも叩けるので、ヘッダの共有シークレットで認証。誤シークレットは 403。
- LLM出力は厳密JSON強制+寛容パーサ: スキーマをプロンプトで固定し、コードブロック混入・制御文字を剥がすフォールバックパーサを噛ませる。
横展開
データ源が増えても「CIで読む源を1つ足す→スキーマに1フィールド足す」だけ。表示先も widget 追加で拡張可能。1つの ingest 方式を決めておけば、別ジョブ(別種の集計)も同じ経路で PWA に相乗りできる。
よくある質問
+「複数データ源→CIで日次AIサマリー生成→自作PWAへ配信する仕組み」とは何ですか?
毎朝データ源を横断してLLMに要約・優先順位付けさせ、結果を自作PWAダッシュボードに自動表示。重い取得とLLM呼び出しはシークレットを持つCI側、PWAは結果JSONをingest受信するだけ。CI空変数・本番ビルドstale・dry-run検証の罠つき。
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約18万トークンかかりますが、この巻物を使えば約5万トークンで済みます。差し引き約13万トークン(API料金換算で約200円)・72%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
Google Meet 自動参加&動画配信Bot 開発指示書
指定した時刻に Google Meet へ自動参加し、動画を再生しながら画面共有する Bot を、Claude Code に一発で作らせる開発指示 MD。朝会の定例動画配信・ウェビナーの自動放送に。
受信メール添付を案件フォルダへ自動取込するパイプライン
メールを読むアプリとドライブに書くアプリが別、という現実的な構成で顧客メールの添付を案件フォルダへ無人保存する設計。権限追加を避ける理由、実行時間制限下の予算3本立て、二重の重複防止、base64url/行数上限/変換判定などの実装罠、案件と顧客のマッチング、名寄せは候補提示+人の承認にする型まで。
Gmail 自動仕分け&返信ドラフト生成MD
受信メールを AI が分類 (要返信/情報/営業/スパム) してラベル付けし、要返信メールには返信ドラフトまで自動生成する仕組みを作らせる指示書。DWD (ドメイン全体委任) 設定手順込み。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア