mcpField
P
PatchLabs

PatchLabs

リモート
github.com/manra399セキュリティ0今日更新
リポジトリ

PatchLabs について

PatchLabs は AI で構築されたアプリのデータアクセス漏えいを検査し、テスト済みの修正を提供します。データベースのアクセス規則を検証し、結果を確認して登録済みアプリを監視するチーム向けです。

主な機能

  1. 01個人データの露出を検査
  2. 02ラボで検証した修正
  3. 03検査レポートと修正のダウンロード
  4. 04アプリ監視とステータスバッジ
  5. 05ワークスペース、API キー、Webhook の管理

活用シーン

  1. 01リポジトリのデータベースアクセス規則を検査
  2. 02検証済みの修正を確認して適用
  3. 03登録済みアプリのセキュリティ検査を監視

MCP 対応

API は MCP エンドポイントを提供し、RLS 検査、検査の開始・取得、アプリ一覧、検査の実行に使うツールを公開します。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://api.patchlabs.dev/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

すべてのエンドポイント
Streamable HTTPhttps://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.sqlPostgres スキーマ。冪等かつ追加型で、API の起動時に適用されますAzure Database for PostgreSQL、データベース patchlabs
worker/検証済みのチェックを受け取り、ラボのパイプライン(Docker + Claude Code)を実行してレポートを投稿します。30 日より古い実行フォルダーを削除しますManraj の Mac。launchd で起動状態を維持します

フロー

  1. 訪問者が patchlabs.dev で GitHub リポジトリとメールアドレスを入力します → POST /checks。
  2. 使い捨てコードを記載した patchlabs-verify.txt をコミットして、リポジトリの所有者であることを証明します → POST /checks/{id}/verify。
  3. ワーカーがチェックを取得し(POST /worker/claim)、ラボでリポジトリのマイグレーションからデータベースを再構築し、許可されていない人が読み取れる個人データを検出します。修正エージェントが修正を作成し(まず Haiku を使用し、ラボでの検証に失敗した場合に限り Sonnet、次に Opus へと切り替えます)、レポートを投稿します(POST /worker/checks/{id}/result)。
  4. チェックページにはレポート、検証テーブル、修正内容が表示され、修正をダウンロードできます。SMTP を設定すると、各ステップでメールが送信されます。

API

契約:SPEC.md。全て JSON です。エラーは {"detail": "..."} 形式です。サインイン済みの呼び出しでは Authorization: Bearer <session> を、 CI の呼び出しでは X-API-Key: pl_live_... を、ワーカーと管理者の呼び出しではそれぞれのベアラートークンを送信します。

モジュールエンドポイント
app.pyGET /health、POST /checks、GET /checks/{id}、POST /checks/{id}/verify、POST /worker/heartbeat|claim(claim はスケジューラーも実行します)、POST /worker/checks/{id}/result、GET /admin/checks
accounts.pyPOST /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.pyGET|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.pyPOST /checks/{id}/decision、POST /checks/{id}/answers、GET /checks/{id}/decisions(メンバー)、GET /receipts/{id}、GET /.well-known/patchlabs-receipt-key
rls.pyPOST /tools/rls-check
mcp_server.pyPOST /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 を設定してください。設定しないと、新しいイメージは起動しません。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。