关于 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。 - Worker 领取检查(
POST /worker/claim),在实验环境中根据仓库的迁移文件重建数据库,找出会被不该访问的人读取的个人数据,让修复 Agent 编写修复方案(先使用 Haiku;仅当实验环境中的验证失败时,才升级到 Sonnet,然后是 Opus),并发布报告(POST /worker/checks/{id}/result)。 - 检查页面会显示报告、证明表和修复方案,并提供修复方案下载。配置 SMTP 后,每个步骤完成时都会发送电子邮件。
API
合约:SPEC.md。所有内容均为 JSON;错误格式为 {"detail": "..."}。已登录的调用发送 Authorization: Bearer <session>,
CI 调用发送 X-API-Key: pl_live_...,工作器和管理员调用发送各自的 bearer 令牌。
| 模块 | 端点 |
|---|---|
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 中的“安全规则”。
Webhook 使用签名:X-PatchLabs-Signature: v1=<hex HMAC-SHA256 of "<timestamp>.<raw body>">,使用工作区的
whsec_ 密钥和 X-PatchLabs-Timestamp;验证代码片段见 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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。