approval-gate-mcp
approval-gate-mcp
장기 실행 자동 프로세스 앞에 인간 승인 게이트를 두는 MCP 서버입니다. 상태, 로그, 재시작, 핫-리로드 파라미터, 그리고 수행한 작업 요약 등 실제로 운영하는 데 필요한 도구도 함께 제공합니다.
FastMCP로 구축되었으며, 모든 MCP 클라이언트에서 작동합니다.
문제
스스로 작동하는 프로세스는 그 행동 중 하나가 중대한 결과를 초래하기 전까지는 유용합니다. 일반적인 해결책은 둘 다 좋지 않습니다. 끄면 잘 수행하던 모든 것을 잃게 됩니다. 그냥 두면 사후에야 알게 됩니다.
게이트는 세 번째 옵션입니다. 프로세스는 무인으로 계속 실행되지만, 중대하다고 표시한 행동을 취하려 할 때는 실행 대신 제안서를 작성하고 다음 단계로 넘어갑니다. 여러분은 시간이 될 때마다 이미 열려 있는 MCP 클라이언트에서 제안서를 검토하고 승인하거나 거부합니다. 프로세스는 다음 주기에 여러분의 결정을 반영합니다.
어느 쪽도 상대를 차단하지 않습니다. 중간에 서비스가 없습니다. 계약은 JSON 파일 두 개입니다.
process you
| |
|-- writes proposal ----> pending.json
| |
| list_pending_approvals
| approve(0) / reject(1)
| |
|<-- reads on next cycle -- approved.json
|
|-- acts, appends to records.json도구
승인 게이트
도구 | 기능 |
| 결정을 기다리는 모든 제안서와 모든 필드 |
| 제안서 하나를 승인 파일로 이동 |
| 제안서 하나를 폐기 |
프로세스 제어
도구 | 기능 |
| 실행 여부, PID, 가동 시간, CPU, 메모리, 디스크, 마지막 로그 줄 |
| 로그 파일 꼬리 보기 |
| 시작 스크립트로 재시작. SSH 세션과 분리되어 실행 |
| 일회성 점검을 위한 탈출구 |
기록
도구 | 기능 |
| 합계, 해결 대 미해결, 유형별 분류, 최근 항목 |
| 더 넓은 테이블 보기와 현재 열린 기록 및 노출 정도 |
파라미터 — PARAMS_SCHEMA가 매니페스트를 가리킬 때만 등록됨
도구 | 기능 |
| 이 배포가 조정 가능하다고 선언한 항목과 현재 재정의된 항목 |
| 매니페스트에 대해 검증된 재정의 하나를 기록 |
| 재정의 하나 또는 전체를 제거 |
체인 — EVM_RPC_URL, WALLET_ADDRESS, TOKEN_CONTRACT가 모두 설정된 경우에만 등록됨
도구 | 기능 |
| 감시 주소에 대한 읽기 전용 ERC-20 및 네이티브 잔액. 서명은 없음 |
설치
git clone https://github.com/WillyV347/approval-gate-mcp
cd approval-gate-mcp
pip install -r requirements.txt
cp .env.example .env # then edit it클라이언트에 연결하기 전에 인스펙터에서 시도해 보세요:
fastmcp dev server.py그런 다음 등록하세요. JSON 구성을 읽는 클라이언트의 경우:
{
"mcpServers": {
"approval-gate": {
"command": "python3",
"args": ["/absolute/path/to/approval-gate-mcp/server.py"],
"env": {
"VPS_HOST": "your.host.or.ip",
"VPS_USER": "your-ssh-user",
"PROCESS_DIR": "/srv/my-process",
"PROCESS_MATCH": "my_process.py",
"PARAMS_SCHEMA": "/absolute/path/to/params.schema.json"
}
}
}
}VPS_HOST, VPS_USER, PROCESS_DIR에는 기본값이 없습니다. 누락되면 서버는 명확한 메시지를 표시하고 종료합니다. 작성자가 하드코딩한 일부 호스트로 조용히 폴백하는 모니터링 도구는 버그이므로, 이 서버는 추측을 거부합니다.
인증은 기존 SSH 설정을 사용합니다. 서버는 시스템 ssh 바이너리를 셸로 호출하므로 에이전트, 하드웨어 키, 에이전트를 노출하는 비밀번호 관리자 모두 변경 없이 작동합니다. 개인 키를 직접 읽지 않습니다.
프로세스가 구현해야 하는 계약
프로세스 쪽에 세 가지가 필요합니다. 라이브러리가 필요하지 않습니다.
1. 기록. JSON 배열에 추가합니다. 존재하면 네 개의 키가 해석되고, 나머지는 그대로 전달됩니다:
[
{
"id": "job-1041",
"record_type": "reindex",
"resolved": true,
"outcome": "win",
"cost": 4.25,
"result": 11.80,
"label": "nightly reindex, shard 3"
}
]2. 제안서. 승인 모드로 실행 중일 때는 실행 대신 여기에 기록합니다:
{
"proposals": [
{
"id": "job-1042",
"label": "reindex shard 7",
"action": "reindex",
"cost": 6.00,
"created_at": "2026-08-18T22:14:07Z"
}
]
}포함하는 모든 필드가 표시됩니다. 서버는 제안서에 대한 스키마가 없고 원하지도 않습니다.
3. 승인 파일을 폴링합니다. 각 주기마다 approved.json을 읽고, 거기에 있는 내용을 실행한 다음 비웁니다. 대략:
approved = read_json(APPROVED_FILE) or {"proposals": []}
for proposal in approved["proposals"]:
execute(proposal)
write_json(APPROVED_FILE, {"proposals": []})서버 쪽에서 순서는 의도적입니다. 결정은 approved.json에 기록하기 전에 pending.json에서 제안서를 제거하므로, 절반 완료된 결정의 실패 모드는 제안서가 삭제되는 것이지 작업이 중복 실행되는 것이 아닙니다.
파라미터, 그리고 이 저장소에 없는 이유
핫-리로드는 서버가 무엇을 조정할 수 있는지 알아야만 유용합니다. 한 배포의 파라미터를 공유 도구에 하드코딩하면 단일 목적이 됩니다. 따라서 매니페스트에 선언하고 PARAMS_SCHEMA가 그것을 가리키게 하세요:
{
"poll_interval_seconds": { "type": "int", "description": "Seconds between work cycles" },
"max_concurrent_jobs": { "type": "int", "description": "Jobs in flight at once" },
"dry_run": { "type": "bool", "description": "Plan work but do not execute" },
"approval_mode": { "type": "bool", "description": "Queue proposals instead of acting" }
}지원되는 유형은 int, float, bool, str, dict, list입니다. set_param은 이에 대해 강제 변환 및 검증하고 변환할 수 없는 것은 거부합니다. 매니페스트가 없으면 파라미터 도구는 등록되지 않습니다. 이는 검증할 것이 없는 쓰기 경로를 노출하는 것보다 낫습니다.
params.schema.json은 gitignore 처리됩니다. 튜닝은 여러분의 것이기 때문입니다. params.schema.example.json이 시작점으로 제공됩니다.
프로세스가 시작 시 오버라이드 파일을 읽게 하고, 재시작 없이 변경 사항을 적용하려면 각 주기마다 읽게 하세요:
overrides = read_json(PARAMS_FILE) or {}
poll_interval = overrides.get("poll_interval_seconds", POLL_INTERVAL_DEFAULT)예제 세션
> is it running?
Process RUNNING
PID: 31882
Uptime: 14h 22m (51720s)
CPU: 0.6%
Memory: 84.3 MB
Disk: 212M
Last log: 2026-08-18 22:03:11 cycle complete, 2 proposals queued
> anything waiting on me?
2 proposal(s) awaiting approval
--- Proposal #0 ------------------------------
id: job-1042
label: reindex shard 7
action: reindex
cost: 6.00
created_at: 2026-08-18T22:14:07Z
--- Proposal #1 ------------------------------
id: job-1043
label: reindex shard 12
action: reindex
cost: 6.00
created_at: 2026-08-18T22:14:07Z
Use approve(index) or reject(index) to decide.
> approve 0, reject 1
Approved and queued for execution: reindex shard 7
Rejected and removed: reindex shard 12위 출력은 예시입니다.
안전에 관한 참고 사항
run_command는 원격 호스트에서 임의의 셸을 실행합니다. 어차피 터미널을 여는 대안이기 때문에 존재하지만, 여기서 가장 위험한 도구입니다. 모든 것을 root로 실행하지 말고 SSH 사용자를 실제로 필요한 범위로 제한하세요.wallet_balance는 읽기 전용이며 키를 건드리지 않습니다. 구성하지 않으면 존재하지 않습니다.이 저장소에는 자격 증명을 저장하는 것이 없습니다. RPC URL은 경로에 공급자 키를 포함하므로
EVM_RPC_URL을 환경에 두고 구성 파일에는 넣지 마세요.StrictHostKeyChecking은accept-new로 설정됩니다. 알 수 없는 호스트는 첫 연결 시 신뢰하지만, 변경된 호스트 키는 여전히 실패합니다. 더 엄격한 동작을 원하면yes로 설정하고known_hosts를 미리 채우세요.
라이선스
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Control plane for autonomous software labor. Agents claim objectives over MCP with audit trail.
A paid remote MCP for CLI tool MCP, built to return verdicts, receipts, usage logs, and audit-ready
A paid remote MCP for hosted MCP server, built to return verdicts, receipts, usage logs, and audit-r
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/WillyV347/approval-gate-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server