CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/API & SDK
API & SDK/2026-04-17上級

Claude API で作る GitHub PR レビューボット — Webhook統合からセキュリティスキャン・品質スコアリングまで実装

Claude API × GitHub Webhook で PR レビューボットを実装します。Tool Use で構造化スコアリング・セキュリティ検査・改善提案を自動化し、署名検証・デバウンス・レート制限・コスト管理まで実運用で得た知見をまとめました。

Claude API115GitHub5PR レビューTool Use5Webhook4TypeScript24自動化68コードレビュー5

プレミアム記事

チームの規模が5人を超えたころから、コードレビューの「ムラ」が気になり始めました。同じようなバグパターンを、あるメンバーは毎回指摘するのに別のメンバーはスルーしてしまう。疲れているときはレビューが甘くなります。そして何より、全員がレビューの「基準」を共有できていません。

Claude API を使えば、このムラを大きく減らせます。ただし「コードを渡してレビューして」と素朴にお願いするだけでは、返ってくる内容がいつも違って運用に耐えません。重要なのは、Tool Use を使って構造化されたレビュー結果を得ることと、GitHub Webhook から一気通貫のパイプラインを設計することです。

ここではGitHub に PR が作成されたときに自動でレビューコメントを投稿するボットを、実際に動くコードで構築します。アーキテクチャ設計から本番デプロイまで、各ステップで「なぜそう実装するのか」の理由も含めてお伝えします。

システム全体のアーキテクチャ

まず全体像を把握しましょう。処理の流れはシンプルです。

GitHub PR 作成/更新
    ↓
Webhook イベント送信(POST /webhook)
    ↓
Express サーバー(署名検証)
    ↓
GitHub API で PR diff 取得
    ↓
Claude API(Tool Use)でレビュー生成
    ↓
GitHub API でレビューコメント投稿

技術スタックは以下の通りです。

  • ランタイム: Node.js 22 + TypeScript
  • Webフレームワーク: Express.js 4.x
  • Claude API: @anthropic-ai/sdk v1.x
  • GitHub API: @octokit/rest v21
  • デプロイ先: Railway / Render(常時起動が前提)

なぜ常時起動サーバーが必要か

GitHub Webhook はリアルタイムで POST リクエストを送ってきます。Cloudflare Workers や Vercel Serverless Functions でも動作しますが、コールドスタートが発生するアーキテクチャは避けたほうが無難です。GitHub は Webhook のタイムアウトを10秒に設定しているため、コールドスタートで応答が遅れると再送ループに入ることがあります。

Railway であれば月$5程度から常時起動できます。個人プロジェクトや小規模チームには十分です。

まず依存関係をインストールします。

npm init -y
npm install express @anthropic-ai/sdk @octokit/rest
npm install -D typescript @types/express @types/node ts-node

Step 1: GitHub Webhook サーバーの実装

Webhook の受信から始めます。最初に詰まりやすいのが署名検証です。GitHub は Webhook リクエストに X-Hub-Signature-256 ヘッダーを付けて送ってきます。これを検証しないと、第三者から偽のリクエストを送られても判別できません。

// src/webhook.ts
import express from 'express';
import crypto from 'crypto';
import { handlePullRequestEvent } from './handlers/pullRequest';
 
const app = express();
 
// ⚠️ 重要: raw body が必要なため express.json() は使わない
app.use(
  express.raw({ type: 'application/json' })
);
 
function verifyWebhookSignature(
  rawBody: Buffer,
  signature: string,
  secret: string
): boolean {
  const hmac = crypto.createHmac('sha256', secret);
  hmac.update(rawBody);
  const expectedSignature = `sha256=${hmac.digest('hex')}`;
 
  // タイミング攻撃を防ぐため timingSafeEqual を使う
  try {
    return crypto.timingSafeEqual(
      Buffer.from(signature),
      Buffer.from(expectedSignature)
    );
  } catch {
    // 長さが違う場合は false(timingSafeEqual は同じ長さ必須)
    return false;
  }
}
 
app.post('/webhook', async (req, res) => {
  const signature = req.headers['x-hub-signature-256'] as string;
  const eventType = req.headers['x-github-event'] as string;
 
  if (!signature) {
    return res.status(401).json({ error: 'Missing signature' });
  }
 
  const isValid = verifyWebhookSignature(
    req.body as Buffer,
    signature,
    process.env.GITHUB_WEBHOOK_SECRET!
  );
 
  if (!isValid) {
    console.error('Invalid webhook signature — possible spoofed request');
    return res.status(401).json({ error: 'Invalid signature' });
  }
 
  // レスポンスを先に返す(GitHub のタイムアウト10秒対策)
  res.status(202).json({ accepted: true });
 
  const payload = JSON.parse((req.body as Buffer).toString());
 
  if (
    eventType === 'pull_request' &&
    ['opened', 'synchronize'].includes(payload.action)
  ) {
    // 非同期で処理(レスポンス後に実行)
    handlePullRequestEvent(payload).catch(err => {
      console.error('[PR handler] Unhandled error:', err);
    });
  }
});
 
app.get('/health', (_req, res) => {
  res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
 
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Webhook server listening on port ${PORT}`);
});

2つの重要なポイントがあります。

express.raw() を使う理由: express.json() は body をパースしてから渡してきます。しかし署名検証は生の bytes に対して HMAC を計算する必要があります。パース後の JSON 文字列では計算結果が一致しません。ここで詰まる方が非常に多いです。

レスポンスを先に返す理由: GitHub の Webhook タイムアウトは10秒です。Claude API の呼び出しには数秒かかることがあるため、202 Accepted を即座に返してから処理を非同期で続けます。レスポンスを待ってから処理すると、タイムアウトで GitHub が再送し、同じ PR が2回レビューされる事態になります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
express.raw() による署名検証と 202 即時応答で、GitHub の 10 秒タイムアウトと再送ループを防ぐ実装
Tool Use(tool_choice: any)で overall_score・security_issues を構造化し、指数バックオフで本番のばらつきを抑える設計
デバウンス 30→90 秒で重複レビュー約7割減、出力トークンは指摘ゼロで 600〜900・critical 含むと 2,500〜3,500 という運用実測
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-05-05
週次レポートの手作業から解放される — Claude API × GitHub × Linear × Slack の自動化実装
毎週のSlack進捗報告をClaude APIで自動化する実装ガイド。GitHub・LinearのデータをClaude APIで整形してSlackに投稿するNode.jsシステムを、実際のコードを交えて解説します。
API & SDK2026-07-09
RAG が自信たっぷりに間違え始めたとき — 検索の取りこぼしを接地率で計測する運用メモ
Claude API の RAG で、回答は流暢なのに事実がずれ始める。多くの場合、原因は検索側で答えを含む文書を取りこぼすサイレントなリコール低下です。接地率と検索ヒット率を計測し、段階的に立て直した運用メモを、動くコードと実数値付きで残します。
API & SDK2026-07-08
MCP コネクタを申請・無人運用に回す前に、各ツールを契約テストで確かめる
手元で動いた MCP コネクタをそのまま無人ジョブに繋ぐと、応答形状の誤読や書き込みの二重発火で静かに壊れます。ツール記述・応答契約・冪等性・レイテンシを機械検証する小さなハーネスの作り方を、実測値とともにまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →