PatchLabs について
PatchLabs は AI で構築されたアプリのデータアクセス漏えいを検査し、テスト済みの修正を提供します。データベースのアクセス規則を検証し、結果を確認して登録済みアプリを監視するチーム向けです。
主な機能
- 01個人データの露出を検査
- 02ラボで検証した修正
- 03検査レポートと修正のダウンロード
- 04アプリ監視とステータスバッジ
- 05ワークスペース、API キー、Webhook の管理
活用シーン
- 01リポジトリのデータベースアクセス規則を検査
- 02検証済みの修正を確認して適用
- 03登録済みアプリのセキュリティ検査を監視
MCP 対応
API は MCP エンドポイントを提供し、RLS 検査、検査の開始・取得、アプリ一覧、検査の実行に使うツールを公開します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://api.patchlabs.dev/mcpclaude mcp add --transport http dev-patchlabs-patchlabs https://api.patchlabs.dev/mcp{"mcpServers":{"dev-patchlabs-patchlabs":{"type":"http","url":"https://api.patchlabs.dev/mcp"}}}Cursor で開く{"servers":{"dev-patchlabs-patchlabs":{"type":"http","url":"https://api.patchlabs.dev/mcp"}}}VS Code で開く{"mcpServers":{"dev-patchlabs-patchlabs":{"type":"http","url":"https://api.patchlabs.dev/mcp"}}}{"mcpServers":{"dev-patchlabs-patchlabs":{"serverUrl":"https://api.patchlabs.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://api.patchlabs.dev/mcp認証が必要ツール
詳細
PatchLabs
AI で構築されたアプリ向けの情報漏えいチェックと検証済みの修正:https://patchlabs.dev
| 構成要素 | 場所 | 実行環境 |
|---|---|---|
docs/ | ウェブサイト:ランディングページ、チェック状況とレポートページ、プライバシー | GitHub Pages (patchlabs.dev) |
api/ | FastAPI:チェック、アカウント、ワークスペース、監視対象アプリ、レシート、無料の RLS ツール、MCP(以下の API を参照) | Azure Container Apps (api.patchlabs.dev) |
db/schema.sql | Postgres スキーマ。冪等かつ追加型で、API の起動時に適用されます | Azure Database for PostgreSQL、データベース patchlabs |
worker/ | 検証済みのチェックを受け取り、ラボのパイプライン(Docker + Claude Code)を実行してレポートを投稿します。30 日より古い実行フォルダーを削除します | Manraj の Mac。launchd で起動状態を維持します |
フロー
- 訪問者が patchlabs.dev で GitHub リポジトリとメールアドレスを入力します →
POST /checks。 - 使い捨てコードを記載した
patchlabs-verify.txtをコミットして、リポジトリの所有者であることを証明します →POST /checks/{id}/verify。 - ワーカーがチェックを取得し(
POST /worker/claim)、ラボでリポジトリのマイグレーションからデータベースを再構築し、許可されていない人が読み取れる個人データを検出します。修正エージェントが修正を作成し(まず Haiku を使用し、ラボでの検証に失敗した場合に限り Sonnet、次に Opus へと切り替えます)、レポートを投稿します(POST /worker/checks/{id}/result)。 - チェックページにはレポート、検証テーブル、修正内容が表示され、修正をダウンロードできます。SMTP を設定すると、各ステップでメールが送信されます。
API
契約:SPEC.md。全て JSON です。エラーは {"detail": "..."} 形式です。サインイン済みの呼び出しでは Authorization: Bearer <session> を、
CI の呼び出しでは X-API-Key: pl_live_... を、ワーカーと管理者の呼び出しではそれぞれのベアラートークンを送信します。
| モジュール | エンドポイント |
|---|---|
app.py | GET /health、POST /checks、GET /checks/{id}、POST /checks/{id}/verify、POST /worker/heartbeat|claim(claim はスケジューラーも実行します)、POST /worker/checks/{id}/result、GET /admin/checks |
accounts.py | POST /workspaces/{wid}/webhook/rotate-secret、POST /auth/start|finish|logout、POST /invites/accept、GET|PATCH|DELETE /me、GET /me/export、GET /me/checks、GET|PATCH /workspaces/{wid}、POST /workspaces/{wid}/webhook/test、POST /workspaces/{wid}/invites、DELETE /workspaces/{wid}/invites/{id}、PATCH|DELETE /workspaces/{wid}/members/{uid}、GET|POST /workspaces/{wid}/api-keys、DELETE /workspaces/{wid}/api-keys/{kid}、POST /workspaces/{wid}/upgrade-request、GET /admin/workspaces、PATCH /admin/workspaces/{wid}、GET /admin/upgrade-requests |
monitor.py | GET|POST /workspaces/{wid}/apps、GET|PATCH|DELETE /apps/{aid}、POST /apps/{aid}/verify、POST /apps/{aid}/checks、GET /badge/{aid}.svg、GET /public/apps/{aid}、GET /stats、POST /v1/apps/{aid}/checks、GET /v1/checks/{cid} |
receipts.py | POST /checks/{id}/decision、POST /checks/{id}/answers、GET /checks/{id}/decisions(メンバー)、GET /receipts/{id}、GET /.well-known/patchlabs-receipt-key |
rls.py | POST /tools/rls-check |
mcp_server.py | POST /mcp(ツール:rls_check、start_check、get_check、list_apps、run_check) |
環境変数:DATABASE_URL、WORKER_TOKEN、ADMIN_TOKEN、SITE_URL、CORS_ORIGINS、SMTP_*、RECEIPT_PRIVATE_KEY(必須:32 バイトの Ed25519 シードを base64 エンコードしたもの。python3 -c "import os,base64;print(base64.b64encode(os.urandom(32)).decode())"。PATCHLABS_DEV=1 を設定しない限り、API はこのキーがないと起動しません)、任意の GITHUB_TOKEN、FOUNDER_EMAIL。テスト用フック:EMAIL_OUTBOX、GITHUB_API、
RAW_GITHUB。セキュリティルール(レート制限、検証、マスキング)については、SPEC.md の「Security rules」を参照してください。
Webhook には署名が付与されます:ワークスペースの whsec_ シークレットと X-PatchLabs-Timestamp を使った X-PatchLabs-Signature: v1=<hex HMAC-SHA256 of "<timestamp>.<raw body>">。検証用スニペットは https://patchlabs.dev/docs/webhooks#security にあります。
レシートを検証します(署名対象のバイト列は、キーをソートし、区切り文字に (",", ":") を使って JSON 化したレシートです):
import base64, json, urllib.request
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
API, CHECK = "https://api.patchlabs.dev", "<check id>"
r = json.load(urllib.request.urlopen(f"{API}/receipts/{CHECK}"))
k = json.load(urllib.request.urlopen(f"{API}/.well-known/patchlabs-receipt-key"))
assert r["key_id"] == k["key_id"], "signed with a different key"
msg = json.dumps(r["receipt"], sort_keys=True, separators=(",", ":")).encode()
pub = Ed25519PublicKey.from_public_bytes(base64.b64decode(k["public_key"]))
pub.verify(base64.b64decode(r["signature"]), msg) # raises InvalidSignature if anything was changed
print("receipt is genuine:", r["receipt"]["status"], r["receipt"]["tables_leaking"])
テスト:tools/test-api.sh は Docker で(使い捨ての postgres:17 と python:3.13-slim を使って)テストスイート全体を実行し、終了後にクリーンアップします。追加の引数は pytest に渡されます。例:tools/test-api.sh -k webhook -x。
API をデプロイする
TAG=$(date +%Y%m%d%H%M)
az acr build -r sponsorjobsregistry -t patchlabs-api:$TAG -f api/Dockerfile .
az containerapp update -g ics-rg -n patchlabs-api --image sponsorjobsregistry.azurecr.io/patchlabs-api:$TAG
初回の v2 デプロイ前に、コンテナーアプリのシークレットとして RECEIPT_PRIVATE_KEY を設定してください。設定しないと、新しいイメージは起動しません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。