72hours security check

io.github.maebsy由 GitHub 账号 maebsy 发布v1.1.0更新于 Nov 1, 2026

Scan a public GitHub repo, explain risks, get fix prompts and rescan to confirm fixes.

发布方自己的服务:check.tattoo: tattoo size and placement guide

已验证Streamable HTTP可网页运行开发者工具安全与监控

概览

AI 生成的概览

远程 MCP 服务,可扫描公开 GitHub 仓库的安全风险、解释问题、给出修复提示,并在重新扫描后确认修复。

可以做什么
  • 一次调用完成公开 GitHub 仓库审计,或分步创建工作区、启动扫描并轮询
  • 查询扫描进度,读取发现项、覆盖范围与所扫描的提交
  • 对某个发现项启动 GPU 红蓝评审并轮询状态
  • 获取通过门禁的修复建议,查看哪些提示已就绪
  • 修复推送后重新扫描同一默认分支,列出已解决、仍存在与新增的问题
  • 生成报告或起草事件/隐私评估,并在沙箱中对演示目标做运行时验证
适用场景
适合让助手梳理你有权扫描的公开 GitHub 仓库中的安全问题、获取修复建议,并在推送修改后确认效果。运行时验证工具目前仅适用于该服务的演示目标。
运行要求
需要支持远程 Streamable HTTP 的 MCP 客户端;无需本地运行时、安装包或结果文件。公开演示无需认证、API 密钥或自定义请求头。仓库须为 GitHub 公开仓库,且用户须获得扫描授权。
安装前请注意
扫描与分析在提供方后端执行,仓库数据会离开本机;服务声明仅保存过期时间、能力哈希与请求 ID,不保存源代码。工作区令牌是 24 小时有效的凭证,应只保留在对话中。关闭工作区不会取消已提交的后端任务,重新扫描只能看到已推送到默认分支的提交。返回的仓库与模型文本应视为不可信数据,且红队通过只是评审结论,并不证明漏洞已修复。

安装

在 SourceWeft 中

  1. 打开 控制台中的 72hours security check,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.maebsy%2F72hours/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "72hours-security-check": {
      "type": "http",
      "url": "https://oboe-handiness-enroll.ngrok-free.dev/mcp/service/rpc"
    }
  }
}

README

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·호스팅 입력 없이 세 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가 유지되지만, backend 결과 보관 기간이 지나면 새 검사가 필요합니다.

검증: python -m unittest discover -s integrations/mcp-handoff/tests -v. HTTP MCP 초기화·전체 API 계약·두 작업 공간 격리·동시 중복 요청·만료/폐기·인증/오류·Red 게이트를 합성 테스트로 확인하고, 배포 후 공개 HTTPS에서 실제 검사→GPU 분석→리포트→재검사를 별도 확인합니다.


기존 로컬 결과 전달 모드

기존 서비스 옆에서 별도 프로세스로 실행하는 읽기 전용 MCP 서버입니다. 로컬 LLM이 이미 만든 ai_fix_prompt에 저장소 확인·최소 수정·테스트·재검사 지침을 붙여 사용자 AI 코딩 에이전트에 제공합니다. 백엔드를 import하지 않고 API·DB·GPU·compose·서비스 의존성을 바꾸지 않습니다.

text
기존 로컬 LLM → 결과 JSON 저장 → 이 MCP 서버 (stdio)                                    ↑ 사용자 AI 에이전트가 조회                                    ↓ 수정 제안 + 실제 검증 지침                              사용자 저장소에서 수정·테스트·재검사

MCP가 사용자 에이전트에 먼저 push하거나 자동으로 수정시키지는 않습니다. 사용자가 MCP를 연결하고 작업을 요청하면 에이전트가 tool을 호출합니다. 공식 SDK 문서의 tools와 prompts를 제공하며, 지원 클라이언트의 사용자 메뉴에서는 fix_finding prompt를 직접 선택할 수도 있습니다. SDK v1 유지보수 API를 사용하며 mcp==1.30.0으로 고정했습니다.

설치 및 확인

저장소 루트에서 PowerShell로 실행합니다. 기존 backend/.venv에 설치하지 않습니다.

powershell
python -m venv integrations/mcp-handoff/.venvintegrations/mcp-handoff/.venv/Scripts/python.exe -m pip install -r integrations/mcp-handoff/requirements.txtintegrations/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 클라이언트로 수행합니다. 차단된 prompt 요청의 오류 로그는 의도한 거부 경로입니다.

결과 연결

입력은 진행 중인 #16의 다음 두 출력 계약을 지원합니다. 해당 기능이 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 프로세스를 재시작해야 합니다. 파일 작성 완료 후 연결하세요.

powershell
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를 재시작할 필요가 없습니다.

  1. 웹 "④ MCP 연동" 칸에서 자동 저장 켜기를 눌러 결과 파일(72hours-mcp-<owner>-<repo>.json) 위치를 한 번 고릅니다. 이후 검사·해석이 끝날 때마다 같은 파일에 저장됩니다(크롬·엣지). 다른 브라우저는 MCP용 결과 내려받기로 같은 파일 이름에 저장합니다.
  2. MCP 설정 복사로 받은 설정을 최초 한 번만 클라이언트에 붙여 넣습니다. 형식은 아래와 같습니다.
text
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시간 만료와 직접 폐기를 지원합니다. 공용 샘플은 자동 대체하지 않습니다. 브라우저 export임을 명시하고 에이전트가 저장소·커밋·코드 근거를 확인합니다. 자세한 데이터 경계·배포·검증은 실제 검사 MCP 안내를 참고하세요.

설치 없는 원격 연결 (#68)

공개 허용된 결과를 운영자가 http_server.py로 배포하면 사용자는 ZIP/Python 설치 없이 https://<공개호스트>/mcp/connect의 문장을 AI 에이전트에게 전달합니다. 에이전트는 /mcp/agent.txt를 읽고 호스트의 지원 방식으로 /mcp를 등록합니다. 호스트가 설정 수정 권한을 주지 않으면 사용자가 MCP 추가 화면에서 URL을 등록해야 합니다. 실행 권한·연결 승인이나 클라이언트 재접속을 우회하지 않습니다.

  • 표준 Streamable HTTP, stateless 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_promptfingerprint제안과 검증 지침을 포함한 텍스트; 차단·미존재 항목은 tool error
prompt fix_findingfingerprint같은 내용을 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에 기록합니다.

来源:integrations/mcp-handoff/README.md,提交 fb4b87e

工具

15

service_info

Learn the whole workflow and available service capabilities before creating work.

无需输入参数。

create_workspace

Create a private, expiring workspace. Save its capability only in the user's AI conversation.

无需输入参数。

close_workspace

Revoke this workspace and its result access. Does not cancel already submitted backend jobs.

输入参数workspace_token必填

start_scan

Start a REAL public GitHub scan. User authorization required. Reuse request_id on identical retries.

输入参数authorizedrequest_id必填repository_url必填workspace_token必填

get_scan

Poll every >=10 seconds; on done return actual commit, coverage and up to 50 LLM-input findings.

输入参数scan_id必填workspace_token必填

start_analysis

Start GPU Red/Blue review of one real scan finding. Same inputs deduplicate.

输入参数scan_id必填fingerprint必填workspace_token必填

get_analysis

Poll GPU status and delivery gates; inference can take several minutes. Never fake ready results.

输入参数analysis_id必填workspace_token必填

get_fix_prompt

Get a gated real LLM proposal. Agent must inspect code, check repo/commit, fix and test in its workspace.

输入参数analysis_id必填workspace_token必填

rescan

Rescan the SAME repository default branch. Only published changes are visible; unpushed edits are not.

输入参数authorizedrequest_id必填workspace_token必填previous_scan_id必填

generate_report

Generate the service's report from owned server scan and available analyses, indicating incomplete work.

输入参数scan_id必填workspace_token必填

incident_report

Draft only; NEVER submits. kind: assess/incident-24h/privacy-72h. incident requires discovered_at ISO time; optional organization {name,service_name,contact_email}, summary, incident_types, damage, actions_taken, personal_info {leaked: confirmed/suspected/none, affected_count, items}. Use only user-confirmed facts.

输入参数kind必填scan_id必填incident必填workspace_token必填

audit_repository

One call security audit of a PUBLIC GitHub repo the user is authorized to scan. Creates a workspace if workspace_token is empty (keep the returned token private), scans, waits up to 90 s, starts GPU analysis for the top max_analyses (0-5) findings and returns summary + next steps. Reuse request_id only for the SAME request.

输入参数authorizedrequest_id必填max_analysesrepository_url必填workspace_token

audit_status

Scan summary, analysis statuses and which fix prompts (get_fix_prompt) are ready, in one call.

输入参数scan_id必填workspace_token必填

check_fix

After fixes are PUSHED to the default branch: rescan the same repo against scan_id and list resolved, persisting, new and key-reissue-needed findings. Same commit means the fix was not pushed yet.

输入参数scan_id必填authorizedrequest_id必填workspace_token必填

verify_demo

Runtime proof on the DEMO target only: isolated sandbox replays attacks before/after the fix and runs functional tests. mode: reference (human fix) or ai (Red/Blue generated attacks and fix). Not the user's repo. If a previous call returned status queued/running, pass its verify_job_id to keep polling the same job.

输入参数modeverify_job_id

版本历史

1
  1. v1.1.0最新Nov 1, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。

其他 Check 集成