MCP 토큰은 API가 붙은 계정 비밀번호입니다. 에이전트에게 넘기면 지치지 않고, 가리키는 페이지는 무엇이든 읽고, 컨텍스트의 마지막 지시가 시키는 대로 정확히 움직이는 사용자가 하나 생깁니다. 대부분은 그게 원하는 바입니다. 이 페이지는 그렇지 않은 경우에 관한 이야기입니다.
아래 내용은 모두 페이지 상단의 날짜에 운영 서버에서 확인했습니다. 도구 목록은 https://mcp.eqvps.com/mcp의 tools/list에서, 제한은 API 자체에서 가져왔습니다. 처음이라면 먼저 MCP 클라이언트 연결과 API 토큰을 읽고 돌아오세요.
위협 모델: 실제로 무엇이 잘못되나
저희가 자주 보는 순서대로 세 가지입니다.
- 에이전트가 잘못 알아듣는다. "테스트 서버 정리해 줘"가 엉뚱한 서버의 재설치로 바뀝니다. 악의는 없고, 모델이 지시의 빈틈을 스스로 채웠을 뿐입니다.
- 프롬프트 인젝션. 에이전트가 당신이 쓰지 않은 글(README, 고객지원 답변, 스크랩한 웹페이지)을 읽고, 그 글이 무언가를 하라고 시킵니다. 에이전트가 전체 권한 토큰을 들고 있다면, 주입된 지시도 같은 권한을 갖게 됩니다.
- 토큰이 유출된다. 셸 기록, 공개 저장소, 공유된 MCP 설정, 로그 한 줄에 들어가 버립니다.
MCP 서버가 확인하는 것은 토큰이 유효한지, 그리고 서버가 그 계정 소유인지(또는 위임받았는지)뿐입니다. 당신이 원래 무엇을 의도했는지는 모릅니다. 아래 가드레일은 모두 한 가지 질문에 답합니다. 지시가 틀렸을 때 피해는 어디까지 갈 수 있나?
위험 등급별 전체 MCP 도구
고객 토큰에는 도구 45개가 보입니다(MCP 서버 1.6.0). 리셀러 토큰(rk_…)에는 별도의 리셀러 도구 30개가 보이고 여기 있는 도구는 하나도 보이지 않으므로, 엔드포인트 전체로는 75개입니다. 클라이언트는 tools/list로 자기 몫만 받습니다.
이 페이지는 도구를 위험도별로 나눕니다. 각 도구의 파라미터와 호출 예시는 파라미터 레퍼런스에, 리셀러 도구 30개를 포함한 전체 도구의 한 줄 설명은 전체 목록에 있습니다.
MCP 도구 주석(readOnlyHint, destructiveHint)은 아직 제공하지 않으므로 클라이언트가 스스로 분류할 수 없습니다. 아래 등급을 기준으로 승인 설정을 직접 하세요.
0등급 — 공개, 토큰 불필요 (5)
| 도구 | 하는 일 |
|---|---|
get_started | 전체 흐름을 한 번에 반환: 어떤 도구를 어떤 순서로 부를지 |
list_plans | 요금제, 가격, OS 이미지 |
sandbox_pricing | 샌드박스 요금 |
register_account | 새 계정을 만들고 그 토큰을 반환 |
login | 이메일 + 비밀번호 → 토큰 |
1등급 — 계정 읽기, 부작용 없음 (15)
| 도구 | 하는 일 | 주의할 점 |
|---|---|---|
whoami | 계정 ID, 이름, 이메일 | |
get_balance | 선불 잔액 | |
list_vps | 실행 중·생성 중·정지된 서버 | |
get_vps_status | 상태, 사양, 접속 정보 | reveal: true이면 root 비밀번호를 반환 |
get_vps_metrics | 시간에 따른 CPU, 메모리, 네트워크, 디스크 | |
get_upgrade_options | 재설치 없이 바꿀 수 있는 요금제 | |
list_delegations | 누구에게 접근 권한을 줬는지 | |
list_delegated_to_me | 다른 사람이 당신에게 위임한 서버 | |
list_tickets | 내 고객지원 티켓 | |
get_ticket | 티켓 하나와 전체 대화 | 티켓 내용은 에이전트에게 신뢰할 수 없는 입력 |
list_sandboxes | 내 샌드박스 | |
get_sandbox | 샌드박스 하나와 사용량 | |
get_task | 백그라운드 작업의 출력 | |
download_file | 샌드박스에서 작은 파일을 읽음 | |
get_download_url | 샌드박스 파일 하나에 대한 단기 링크 | 만료 전까지 링크를 가진 누구나 다운로드 가능 |
2등급 — 상태를 바꾸지만 돈은 쓰지 않음 (17)
| 도구 | 하는 일 | 주의할 점 |
|---|---|---|
power_vps | start / stop / reboot | stop은 진짜 멈춤: 서비스가 내려감 |
set_hostname | 서버 이름 변경 | confirm이 비교하는 바로 그 값이 바뀜 |
undo_cancel | 기간 말 예약 해지를 취소 | |
refresh_token | 새 토큰 발급, 기존 토큰 즉시 폐기 | 고정 설정은 이후 갱신할 것 |
set_password | 비밀번호가 없는 계정에 비밀번호 설정 | 토큰을 가진 사람이 먼저 설정할 수 있음 |
topup_balance | 충전 인보이스 + 암호화폐 결제 링크 | 결제에는 지갑이 필요 |
pay_invoice | 미결제 인보이스의 결제 링크 | 위와 같음 |
accept_delegation | 위임 초대 수락 | |
revoke_delegation | 위임 종료 | |
create_ticket / reply_ticket / close_ticket | 고객지원 티켓 | 에이전트가 당신 이름으로 고객지원에 글을 씀 |
run_code / exec_command | 샌드박스 안에서 코드 실행 | 샌드박스 안에서만, 당신의 VPS가 아님 |
kill_task | 샌드박스의 백그라운드 작업 중지 | |
upload_file / get_upload_url | 샌드박스에 파일을 넣음 |
3등급 — 돈을 쓰거나, 데이터를 지우거나, 접근 권한을 줌 (8)
| 도구 | 하는 일 | 서버 측 검사 |
|---|---|---|
order_vps | 서버 주문, 잔액에서 결제 | 잔액 부족 → 미결제 인보이스, 차감 없음 |
change_plan | 재설치 없이 요금제 변경, 차액은 잔액에서 | confirm: true; 잔액 부족 → 402 |
create_sandbox | 과금되는 샌드박스 시작 | 잔액 0 → 402 |
reinstall_vps | 디스크를 지우고 새 OS 설치 | confirm = 정확한 호스트 이름 또는 DELETE; 분당 4회 |
reset_password | 새 root 비밀번호, 기존 비밀번호는 무효 | confirm = 호스트 이름 또는 DELETE; 분당 6회 |
cancel_service | end_of_period(기본값, 되돌릴 수 있음) 또는 immediate(서버를 즉시 파기) | immediate는 confirm = 호스트 이름 필요 |
kill_sandbox | 샌드박스와 파일을 삭제 | 없음 |
delegate_service | 다른 사람에게 서버 운영자 권한 부여 | 소유자만; 상대방이 수락해야 함 |
도구 세트 변경 기록
| 날짜 | 서버 버전 | 변경 | 위험에 미치는 영향 |
|---|---|---|---|
| 2026-10-03 | 1.6.0 | refresh_token 추가; 토큰 기본 유효기간 1년 | 2등급 |
| 2026-10-03 | 1.5.0 | undo_cancel, get_upgrade_options, change_plan | change_plan은 잔액을 씀 → 3등급 |
| 2026-10-03 | 1.1.0 | 샌드박스 도구 13개 | create_sandbox는 지출, kill_sandbox는 파기 → 3등급 |
현재 실행 중인 버전은 공개되어 있습니다: curl -s https://mcp.eqvps.com/healthz. 버전이 바뀌면 이 표도 함께 바뀝니다.
잔액이 곧 지출 한도
EQVPS는 선불제입니다. 저장된 카드도, 신용 한도도, 마이너스 잔액도 없으니 에이전트가 쓸 수 있는 최대 금액은 잔액에 있는 만큼입니다. 돈을 쓰는 도구는 order_vps, change_plan, create_sandbox 세 개입니다. 기존 서버의 갱신 요금도 같은 잔액에서 빠집니다.
에이전트는 결제 요청은 만들 수 있지만 결제는 할 수 없습니다. topup_balance와 pay_invoice는 암호화폐 결제 링크를 반환하는데, 뒤에 지갑이 없으면 링크는 아무 일도 하지 않습니다. 출금 엔드포인트도 없습니다. 잔액의 돈은 당신 계정 안에서 서비스를 사는 데만 쓸 수 있고 밖으로 빼낼 수 없습니다. 즉시 해지에 따른 환불도 잔액으로 돌아옵니다.
한 가지 주의할 점이 있고, 이건 진지한 이야기입니다. 에이전트를 묶어 두려고 잔액을 너무 적게 유지하면 당신 서버의 갱신이 실패하기 시작하고, 서버는 유예 기간에 들어갑니다. 저희 기준은 이미 운영 중인 것의 갱신 한 주기분에 에이전트의 현재 작업 예산을 더한 금액입니다. 계산 방법은 에이전트 예산 가이드에 정리해 두었습니다. 그리고 에이전트에게 돈이 든 별도 지갑을 준다면, 그 지갑이 두 번째 한도가 되니 그것도 지켜봐야 합니다.
최소 권한: 읽기 전용 토큰은 (아직) 없다
솔직히 말해, 모든 고객 토큰은 대시보드의 계정과 같은 권한을 가집니다. 토큰 이름과 유효기간은 설정할 수 있지만 스코프는 설정할 수 없습니다.
지금 가장 좁게 줄일 수 있는 방법은 위임입니다. 잔액 0인 별도 계정을 에이전트에게 만들어 주고 서버 한 대를 위임합니다.
delegate_service { "service_id": "EQ-XXXX", "email": "agent@yourdomain.com", "expires_days": 30 }
REST로도 똑같이 할 수 있습니다.
curl -s -X POST "https://api.eqvps.com/api/v1/eqvps/services/EQ-XXXX/delegations" \
-H "Authorization: Bearer $EQVPS_TOKEN" -H "Content-Type: application/json" \
-d '{"email":"agent@yourdomain.com","expires_days":30}'
초대는 해당 이메일로 로그인한 상태에서 수락해야 하며(accept_delegation), expires_days는 1~365입니다. 스크린샷이 있는 단계별 안내: 접근 권한 위임, 문서의 접근 권한 항목.
| 위임받은 계정이 할 수 있는 것 | 위임받은 계정이 할 수 없는 것 |
|---|---|
| 그 서버 한 대의 상태·지표·기록 보기 | 당신의 다른 서버, 잔액, 인보이스 보기 |
| 켜기, 끄기, 재부팅 | 해지, 갱신, 요금제 변경 |
| 호스트 이름과 역방향 DNS 설정 | 부가 서비스나 IP 구매 |
| root 비밀번호 재설정 | 웹 콘솔 열기 |
| OS 재설치 | 서버를 다른 사람에게 다시 위임 |
왼쪽 열의 마지막 두 줄을 보세요. 위임받은 사람은 당신의 돈을 쓸 수 없지만 그 서버를 지울 수는 있습니다. 에이전트가 재설치할 수 있는 서버에는 반드시 백업을 켜 두세요.
토큰 관리
에이전트마다 토큰 하나, 이름을 붙여서. 대시보드 → 설정 → 에이전트용 API 토큰에서 만들거나, 다음처럼 만듭니다.
curl -s -X POST "https://api.eqvps.com/api/v1/eqvps/auth/tokens" \
-H "Authorization: Bearer $EQVPS_TOKEN" -H "Content-Type: application/json" \
-d '{"name":"backup-agent","expires_in_days":90}'
토큰은 한 번만 표시됩니다. 유효기간은 1~1825일이고 지정하지 않으면 365일입니다. 에이전트용이라면 저희는 90일을 고르겠습니다.
나만 읽을 수 있는 파일에 보관하세요. 저장소에도, 프롬프트에도, 여기저기 복사하는 셸 변수에도 두지 마세요.
mkdir -p ~/.config/eqvps && chmod 700 ~/.config/eqvps
( umask 077; read -rsp 'EQVPS token: ' T; echo; printf 'EQVPS_TOKEN=%s\n' "$T" > ~/.config/eqvps/agent.env )
ls -l ~/.config/eqvps/agent.env # 기대값: -rw-------
그런 다음 에이전트 서비스에서 EnvironmentFile=(systemd)나 set -a; . ~/.config/eqvps/agent.env; set +a로 불러옵니다.
만료 전에 교체하세요. refresh_token 도구나 POST /auth/tokens/{id}/refresh는 같은 이름의 새 토큰을 발급하고 기존 토큰을 즉시 폐기합니다. MCP 클라이언트 설정에 토큰을 직접 적어 두었다면 바로 갱신하세요. 그러지 않으면 다음 세션은 401을 받습니다.
누가 무엇을 쓰는지 확인하세요: GET /auth/tokens는 각 토큰의 이름, 만료일, last_used_at을 보여 줍니다. 모르는 토큰이나 에이전트를 끈 뒤에 사용된 토큰이 보이면 그게 경고 신호입니다.
토큰이 유출되면
이 순서로 하세요.
- 폐기합니다. 대시보드 → 설정 → 에이전트용 API 토큰 → 폐기, 또는
curl -s -X DELETE -H "Authorization: Bearer $EQVPS_TOKEN" https://api.eqvps.com/api/v1/eqvps/auth/tokens/<id>. 다음 요청부터 작동하지 않습니다. - 직접 만들지 않은 새 토큰을 찾아 함께 폐기합니다.
- 피해 범위를 점검합니다: 서버별 서비스 기록, 인보이스와 잔액, 그리고
list_delegations에 당신이 주지 않은 접근 권한이 있는지. - root 비밀번호를 바꿉니다. 그 토큰이 볼 수 있던 서버 전부입니다.
reveal: true를 붙인get_vps_status는 root 비밀번호를 내주므로, 토큰 유출은 곧 root 비밀번호 유출입니다. 내친김에~/.ssh/authorized_keys도 확인하세요. - 비밀번호라는 문을 닫습니다. 계정에 비밀번호를 한 번도 설정한 적이 없다면, 토큰을 가진 사람이
set_password로 설정했을 수 있습니다. 이메일 코드로 로그인해서 비밀번호를 바꾸세요.
5단계 예방에는 비용이 들지 않습니다. 지금 직접 계정 비밀번호를 설정해 두면, 이후 누가 set_password를 불러도 409만 돌아갑니다.
사람의 승인
서버가 강제하는 것:
reinstall_vps,reset_password,type: immediate인cancel_service는confirm에 정확한 호스트 이름이 필요합니다(재설치와 재설정은DELETE도 가능).change_plan은confirm: true가 필요합니다.- 기본 해지 방식은
end_of_period입니다. 서버는 결제된 기간이 끝날 때까지 돌아가고,undo_cancel로 되돌릴 수 있습니다. - 계정당 호출 제한: 재설치 분당 4회, 비밀번호 재설정 분당 6회, 전원 분당 20회, 주문 분당 20회. 루프에 빠진 에이전트가 같은 일을 50번 하는 건 막지만, 잘못된 호출 한 번은 막지 못합니다.
confirm이 무엇인지 분명히 해 둡시다. 에이전트가 "거기 정리해"라는 말에 바로 움직이는 걸 막아 줍니다. 공격자는 막지 못합니다. 호스트 이름은 get_vps_status 한 번이면 얻을 수 있으니까요. 진짜 승인은 MCP 클라이언트에 있습니다. 대부분의 클라이언트는 도구를 호출할 때마다 물어볼 수 있습니다. 0·1등급은 자유롭게 두고, 3등급은 항상 묻도록 하세요. 도구별 권한을 지원하는 클라이언트, 예컨대 Claude Code의 settings.json(서버를 eqvps로 등록한 경우)에서는:
{
"permissions": {
"ask": ["mcp__eqvps__order_vps", "mcp__eqvps__change_plan", "mcp__eqvps__create_sandbox", "mcp__eqvps__reset_password", "mcp__eqvps__delegate_service"],
"deny": ["mcp__eqvps__reinstall_vps", "mcp__eqvps__cancel_service", "mcp__eqvps__kill_sandbox"]
}
}
에이전트 지시문에도 한 줄 추가하세요. 그 자체로 보안 장치는 아니지만 "잘못 알아들은" 경우를 줄여 줍니다(영어 그대로 두세요. 모델은 똑같이 이해합니다).
Never call reinstall_vps, reset_password, cancel_service (type=immediate), change_plan,
order_vps, create_sandbox, kill_sandbox or delegate_service unless the human has typed
the target server's hostname in this conversation for that specific action.
에이전트가 장기 토큰 대신 이메일 코드로 로그인한다면 MCP를 통한 에이전트 로그인을 참고하세요.
감사: 나중에 무엇을 볼 수 있나
- 토큰 목록(
GET /auth/tokens, 또는 설정 → 에이전트용 API 토큰): 이름, 생성일, 만료일,last_used_at. 토큰에 에이전트별 이름을 붙여야 하는 이유가 여기 있습니다. - 서비스 기록(대시보드의 서버 페이지): 전원 조작, 재설치, 비밀번호 재설정, 요금제 변경, 결제가 각각 시각과 주체(고객님, 지원팀, 자동)와 함께 남습니다. 어떤 토큰이나 위임받은 사람이 했는지는 알려 주지 않고, 당신 쪽에서 온 동작이라는 것만 보여 줍니다.
- 인보이스와 잔액: 모든 차감과 환불.
list_delegations: 누가 무엇에, 언제까지 접근할 수 있는지.
서비스 기록의 이 빈틈이 현재 서버 측 감사의 솔직한 한계입니다. 어떤 에이전트가 무엇을 했는지 알아야 한다면, 에이전트 쪽에서 모든 도구 호출을 인자와 함께(비밀 정보는 빼고) 기록하세요.
저희라면 쓸 구성
운영 서버 한 대를 관리하는 에이전트라면:
- 에이전트 전용 계정, 잔액 0, 서버는
expires_days: 90으로 위임. - 소유자 토큰은 당신이 보관하고 어떤 에이전트 설정에도 넣지 않음.
- 그 서버에 백업 켜기. 위임받은 사람은 재설치할 수 있으니까.
- 클라이언트에서 3등급 도구는 "ask" 또는 "deny".
- 에이전트 토큰은 권한
600파일에 두고 만료 전에 갱신.
서버를 주문하거나 샌드박스를 돌려야 하는 에이전트에게는 위임만으로 부족합니다. 잔액이 필요하기 때문입니다. 그때는 잔액이 한도입니다. 작업 단위로 충전하고, 토큰에 이름을 붙이고, 일주일에 한 번 last_used_at을 확인하세요. 읽기 전용 토큰이 있으면 에이전트를 운영하는 방식이 달라질 것 같다면 고객지원으로 알려 주세요. 다음에 무엇을 만들지는 바로 그런 의견으로 정해집니다.
댓글
아직 댓글이 없습니다. 첫 번째가 되세요.