72hours security check について
72hours security checkは、公開GitHubリポジトリのセキュリティ検査結果、指摘、修正プロンプト、レポート、再検査をMCP経由で提供します。リモートHTTP利用と既存結果の読み取り専用の引き渡しに対応し、コード修正と検証はユーザー側のワークフローで行います。
主な機能
- 01公開GitHubリポジトリを検査
- 02指摘と修正プロンプトを取得
- 03公開済みデフォルトブランチを再検査
- 04検査・インシデントレポートを作成
- 05既存結果を読み取り専用で連携
活用シーン
- 01リポジトリ検査の指摘を確認
- 02条件を満たす修正案をコーディングエージェントに渡す
- 03再検査結果を以前の結果と比較
- 04セキュリティインシデント報告書を作成
MCP 対応
サービスは、ワークスペース作成、検査、分析、修正プロンプト、レポート、再検査のリモートMCPツールを提供します。別のローカルまたはリモートMCP連携では既存の指摘や修正案を読み取り専用で公開し、コードは変更しません。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://oboe-handiness-enroll.ngrok-free.dev/mcp/service/rpcclaude mcp add --transport http maebsy-72hours https://oboe-handiness-enroll.ngrok-free.dev/mcp/service/rpc{"mcpServers":{"maebsy-72hours":{"type":"http","url":"https://oboe-handiness-enroll.ngrok-free.dev/mcp/service/rpc"}}}Cursor で開く{"servers":{"maebsy-72hours":{"type":"http","url":"https://oboe-handiness-enroll.ngrok-free.dev/mcp/service/rpc"}}}VS Code で開く{"mcpServers":{"maebsy-72hours":{"type":"http","url":"https://oboe-handiness-enroll.ngrok-free.dev/mcp/service/rpc"}}}{"mcpServers":{"maebsy-72hours":{"serverUrl":"https://oboe-handiness-enroll.ngrok-free.dev/mcp/service/rpc"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
72hours MCP — AI との会話でサービスを利用
稼働中のサービスの /mcp/service からサーバー URL をコピーし、Claude の custom connector、
ChatGPT の custom MCP server、またはその他の AI のリモート MCP 設定に登録します。現在のデモ認証は None です。
Cursor・VS Code では、同じ画面の接続ボタンも使用できます。登録後、service_info を呼び出して接続を確認します。
ウェブチャットではリポジトリ URL を使ってサービスを利用し、コードを直接変更する作業はファイルアクセス権を持つコーディングエージェントで行います。
リモートアドレスは /mcp/service/rpc、エージェント向けの案内は /mcp/service/agent.txt です。
Python・CMD・結果ファイルのインストールなしで、リモート HTTP MCP に対応するクライアントで利用します。
クライアント自体で接続の承認・再接続が必要な場合があります。また、stdio 専用アプリには別途ブリッジが必要です。
create_workspace → start_scan → get_scan → start_analysis → get_analysis → get_fix_prompt
start_analysis が受け取るのは workspace_token・scan_id・fingerprint のみです。解釈 API はユーザーの OS・ホスティング情報を入力せずに 3 つの OS コマンドをすべて生成し、パッケージマネージャーは自動判定します。
の順に実際のサーバー API を呼び出します。修正はユーザーの AI の作業コピーで行います。
rescan は同じリポジトリの公開済みデフォルトブランチを以前の結果と比較します。公開されていないローカルの変更や
PR ブランチは確認できないため、コミットが同じ場合に修正の検証が完了したと表示してはいけません。
generate_report と incident_report は、既存サービスの点検レポート・インシデント評価・申告書の草案を
提供します。申告の自動送信・アカウント管理・課金・任意のシェル実行・デプロイツールは提供しません。
既存の /mcp/connect は、ウェブで検査済みの結果専用の接続機能として維持されます。
サービス全体の MCP は、ブラウザーの結果を信頼したりアップロードを受け付けたりせず、自ら受け付けたサーバー作業の
実際のリポジトリ・コミット・FindingInput を関連付けます。GPU キーは受け取りません。
運用時の起動には、既存の live_server.py --database /absolute/private/links.sqlite3 --public-origin https://HOST
コマンドを使用します。--public-origin は複数のアドレスをカンマ区切りで受け取り、最初のアドレス(代表アドレス、固定アドレス)を使って接続先と案内文を作成し、残りのアドレスからのリクエストも受け付けます。同じディレクトリの workspaces.sqlite3 に有効期限・capability ハッシュ・受付 ID のみを
保存し、元のコード・分析の全文・秘密鍵は保存しません。backend は固定の loopback 127.0.0.1:8000 を
呼び出し、既存の認証・allowlist・queue ポリシーにそのまま従います。認証が必要な環境ではポリシーエラーを
返し、回避はしません。この構成は、認証なしの公開デモ API がすでに許可されているデプロイ向けです。
capability の有効期間は 24 時間、作業スペース数は最大 128、全受付件数は 256 件、スペースごとの受付件数は 16 件です
(WorkspaceStore の運用設定)。同じ scan request_id と同じ分析入力は重複して受け付けません。
応答が不明な POST は not_confirmed のままにし、自動での再受付を防ぎます。サーバーが受け付けている可能性が
あるため、運用担当者が確認する前に新しい request_id でむやみに繰り返さないでください。
破棄すると MCP へのアクセスは削除されますが、すでにバックエンドで受け付けられた作業はキャンセルされません。
DB を維持したままプロセスを再起動しても ID は保持されますが、バックエンドの結果保管期間を過ぎた場合は新たな検査が必要です。
検証:python -m unittest discover -s integrations/mcp-handoff/tests -v。
HTTP MCP の初期化・全 API 契約・2 つの作業スペースの分離・同時重複リクエスト・有効期限切れ/破棄・認証/エラー・Red ゲートを
合成テストで確認し、デプロイ後は公開 HTTPS 上で実際の検査→GPU 分析→レポート→再検査を別途確認します。
既存のローカル結果引き継ぎモード
既存サービスの隣で別プロセスとして実行する読み取り専用 MCP サーバーです。ローカル LLM がすでに作成した ai_fix_prompt に、リポジトリの確認・最小限の修正・テスト・再検査の手順を追加して、ユーザーの AI コーディングエージェントに提供します。バックエンドを import せず、API・DB・GPU・compose・サービスの依存関係を変更しません。
기존 로컬 LLM → 결과 JSON 저장 → 이 MCP 서버 (stdio)
↑ 사용자 AI 에이전트가 조회
↓ 수정 제안 + 실제 검증 지침
사용자 저장소에서 수정·테스트·재검사
MCP がユーザーのエージェントに先に push したり、自動で修正させたりすることはありません。ユーザーが MCP を接続して作業を依頼すると、エージェントがツールを呼び出します。公式 SDK ドキュメントの tools と prompts を提供し、対応クライアントのユーザーメニューから fix_finding プロンプトを直接選択することもできます。SDK v1 のメンテナンス API を使用し、mcp==1.30.0 に固定しています。
インストールと確認
リポジトリのルートで PowerShell を使って実行します。既存の backend/.venv にはインストールしません。
python -m venv integrations/mcp-handoff/.venv
integrations/mcp-handoff/.venv/Scripts/python.exe -m pip install -r integrations/mcp-handoff/requirements.txt
integrations/mcp-handoff/.venv/Scripts/python.exe -m unittest discover -s integrations/mcp-handoff/tests -v
macOS/Linux では .venv/Scripts/python.exe を .venv/bin/python に変更します。テストは GPU・ネットワーク・サービスの起動なしで、合成結果と実際の stdio クライアントを使って実行します。ブロックされたプロンプト要求のエラーログは、意図した拒否経路です。
結果の接続
入力は、進行中の #16 における次の 2 つの出力契約に対応しています。該当機能が main にマージされていなくても、MCP 自体のインストールと合成データのテストは独立して実施できます。
| 入力 | 構造 | 実行引数 |
|---|---|---|
/api/llm/explain の応答を保存した JSON | {"mode":"red_blue","results":[...]} | --results |
python -m app.llm.check が保存した JSON | {"model":"...","runs":[{"mode":"red_blue","results":[...]}]} | --results と明示的な --run-index |
--run-index は 0 から始まります。Blue と Red–Blue の両方が含まれる実測レポートでは、実際の runs を確認して選択してください。最新のファイルや以前の pass 結果を自動選択しません。一度に 1~50 件、ファイルサイズは最大 2 MiB です。運用担当者が指定したファイルのみを起動時に一度読み込み、必要なフィールドだけをメモリに保持するため、新しい結果を接続するには MCP プロセスを再起動する必要があります。ファイルの書き込み完了後に接続してください。
integrations/mcp-handoff/.venv/Scripts/python.exe integrations/mcp-handoff/server.py `
--results C:/private/scan-results.json `
--repository owner/scanned-app `
--revision <검사한_사용자_저장소의_40자리_SHA>
repository と revision は72hours サービスのリポジトリではなく、検査対象のユーザーリポジトリです。現在の上位出力にはこの情報がないため、運用担当者が指定します。MCP は、この関連付けやファイルの真正性を認証しません。LLM の実測 fixture は実際のユーザーリポジトリの検査結果ではないため、運用結果として関連付けないでください。
直接実行した場合、入力待ちになるのは正常です。stdout は MCP JSON-RPC 専用です。通常はクライアントがサーバープロセスを起動します。
ウェブの自動保存で最新の結果を読み込む(#65)
ウェブ(ダッシュボード)で検査すると、結果ファイルを自動的に上書きし、MCP は --revision を指定せずに起動して、呼び出しのたびに最新のファイルを読み込みます。再検査でコミットが変わっても、設定の修正や MCP の再起動は不要です。
- ウェブの「④ MCP 連携」欄で自動保存を有効にするを押し、結果ファイル(
72hours-mcp-<owner>-<repo>.json)の保存先を一度選びます。以後、検査と解析が終わるたびに同じファイルに保存されます(Chrome・Edge)。ほかのブラウザーでは、MCP 用の結果をダウンロードから同じファイル名で保存します。 - MCP 設定をコピーで取得した設定を、クライアントに最初の一度だけ貼り付けます。形式は以下のとおりです。
server.py --results <결과 파일 절대 경로> --repository <owner/repo>
--repositoryは省略できますが、**併せて指定することを推奨します。**省略すると、そのパスにどのリポジトリの結果ファイルが保存されても、そのまま渡します。ウェブの設定コピーでは常に--repositoryを指定します。
| 動作 | 内容 |
|---|---|
| 最新の結果 | 呼び出し時にファイルの内容(sha256)が変わっていれば、再度読み込みます。同じ時刻・同じサイズで上書きされても反映されます |
| リポジトリ・コミット | ファイル内のsource.repository・source.revision・source.generated_atを使用します。list_findingsのsourceに表示されます |
| リポジトリの固定 | --repositoryとファイルのリポジトリが異なる場合、そのファイルは読み込まず、直前の結果を維持します |
| ファイルの破損 | 保存中または形式エラーの場合、直前の正常な結果を維持し、noticeで通知します |
| ファイルがない場合 | サーバーは起動し、list_findingsは空の一覧と「自動保存を有効にしてください」という案内を返します |
| ファイルの削除 | 一度読み込んだ後にファイルがなくなった場合、直前の結果を維持し、noticeで通知します |
--revisionを指定すると、従来どおり起動時に一度だけ読み込む固定方式になります。この場合、ファイルのsource.revisionが異なると拒否します。
ユーザーエージェントに接続する
実際のウェブ検査に接続する(#71)
live_server.pyのデプロイでは、/mcp/connectが同じブラウザーの実際の検査結果を読み込みます。
ユーザーが確認後に専用の接続を作成し、修正依頼をコピーの文を自身のAIエージェントに渡します。
ファイルをインストールせず、その検査のみに接続でき、有効期限は24時間で、いつでも直接無効化できます。
公開サンプルは自動的に置き換えません。ブラウザーからのエクスポートであることを明示し、エージェントがリポジトリ・コミット・コードの根拠を確認します。
データの境界・デプロイ・検証の詳細は、実際の検査 MCP ガイドを参照してください。
インストール不要のリモート接続(#68)
公開が許可された結果を運用担当者がhttp_server.pyでデプロイすると、ユーザーはZIPやPythonをインストールせずに、
https://<公開ホスト>/mcp/connectの文をAIエージェントに渡します。
エージェントは/mcp/agent.txtを読み込み、ホストがサポートする方法で/mcpを登録します。
ホストが設定変更の権限を付与しない場合、ユーザーはMCP追加画面でURLを登録する必要があります。
実行権限・接続の承認や、クライアントの再接続を回避するものではありません。
- 標準のStreamable HTTP、ステートレスJSON応答を使用します。Quick TunnelがサポートしていないSSEには依存しません。
- Claude Code、Codex、Cursor、VS Code、およびリモートHTTPに対応するホスト向けの案内を提供します。
- 既存の
list_findings、get_fix_prompt、fix_findingの受け渡し条件は同じです。 - 127.0.0.1にのみバインドし、明示した公開Host/Originのみを許可します。本文は64 KiBに制限します。
- 認証なしで公開する、固定スナップショット専用です。個人の検査ファイルをこのエンドポイントにアップロードしてはいけません。
デプロイ時には
--publish-approved-snapshotで公開の許可を明示する必要があります。 - 新しいウェブ検査の自動取得、個人プロジェクト、スキャンの開始、アップロードには対応していません。複数ユーザー向けサービスとの連携には、ユーザー/プロジェクトの権限と結果IDの紐付けを別途実装する必要があります。
一般的なサーバーのデプロイについては、リモート MCP デプロイガイドに従ってください。 実際の公開結果はリポジトリにコミットしません。テストには合成結果のみを使用します。
ローカル stdio 接続(従来方式)
client.example.jsonは、mcpServers形式を使用するクライアント向けのWindows設定例です。実行ファイル・サーバーファイル・結果ファイルのパスをすべて絶対パスに変更し、検査対象のリポジトリとコミットを入力してください。実測レポートでは、argsに"--run-index", "0"などを追加します。このファイルは自動適用されず、既存のクライアント設定や実行中のClaudeセッションも変更しません。ほかの設定形式のホストでも、同じcommandとargsを登録すれば使えます。
接続後、ユーザーエージェントに依頼する文:
72hours-handoffのlist_findingsで、現在接続されている検査結果を確認してください。ready=trueの項目についてget_fix_promptを取得し、対象のリポジトリと検査コミットが現在の作業対象であることを確認してください。既存の変更を維持しながら、関連する脆弱性のみを修正し、正常な機能テストとセキュリティ再検査の結果を教えてください。ブロックされた項目は勝手に修正せず、確認が必要な理由を教えてください。
| MCP 機能 | 入力 | 出力 |
|---|---|---|
tool list_findings | なし | リポジトリ・コミット・ファイルのSHA-256・run index、fingerprintごとのready状態とブロック理由 |
tool get_fix_prompt | fingerprint | 提案と検証手順を含むテキスト。ブロックされた項目や存在しない項目はtool error |
prompt fix_finding | fingerprint | 同じ内容をuserメッセージとして提供。同じブロック規則を適用 |
전달 조건과 경계
status=done,variant=D,red_verdict=pass, 마지막red_rounds의 판정도 pass이며 issues가 비어 있어야 합니다.needs_manual_review=false,false_positive_suspect=false가 명시적 boolean이어야 합니다. 누락·문자열·실패·오탐 의심 결과의 수정 지시는 전달하지 않습니다.- fingerprint 일치, 비어 있지 않은 ai_fix_prompt, 모델과 프롬프트 버전을 확인합니다. 중복 fingerprint·중복 JSON 키는 거부합니다.
- 소스 코드 조각, context, 모델의 원본 오류, 공격 시나리오는 전달하지 않습니다. 허용 필드만 사용하고 알려진 키 패턴을 다시 가립니다. 임의 형식의 비밀값까지 완전하게 탐지하지는 못하므로 생산 단계에서도 비밀값과 코드 원문을 제거해야 합니다.
- 프롬프트의 LLM 결과는 이스케이프한 JSON 데이터입니다. 이는 주입 방어의 한 층이지 모델이 악성 제안을 절대 따르지 않는다는 보장은 아닙니다. 수신 에이전트가 사용자 권한·코드 근거·작업 범위를 확인해야 합니다.
- Red pass는 LLM의 제안 검토이며 실제 공격 실행, 코드 수정 성공, 취약점 해결 확인이 아닙니다. 완료 판정은 사용자 측 테스트와 원래 탐지기의 재검사가 필요합니다.
- 기본 실행은 읽기 전용 로컬 stdio입니다. 별도
http_server.py는 공개 허용된 고정 스냅샷만 원격으로 제공합니다. 파일 내용은 연결한 AI 클라이언트에 전달되므로 클라우드 모델을 쓰는 호스트에서는 외부로 전달될 수 있습니다. 결과 파일 접근 권한은 운영자가 관리합니다.
이후 서비스 연동 시 필요한 작업
현재 범위는 파일 기반 전달입니다. 실시간 대시보드/DB 조회나 다중 사용자 원격 MCP는 구현하지 않았습니다. 그 단계에서는 기존 인증 경계 안에서 사용자·프로젝트별 읽기 전용 조회, 검사 대상 커밋·scan ID의 서버 측 결합, 최신 상태 및 재검사 이력 확인을 먼저 추가해야 합니다. 지금 서버를 그대로 공개 HTTP 서비스로 노출하면 안 됩니다.
새 검사 결과에는 사용자 저장소·검사 커밋·검사 시각을 상위 시스템에서 함께 기록하는 것이 좋습니다. 이 PR은 그 계약을 강제로 바꾸지 않고 운영자 인자로 연결합니다. 외부 자원은 저장소 규칙에 따라 docs/external-resources.md에 기록합니다.
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。