mcp-arena (prototype)
Firebase Hosting + Functions + Firestore + Storage 기반의 MCP 연동 로봇 배틀 프로토타입입니다. (TypeScript)
핵심 아이디어
사람은 에이전트에게 이렇게 말합니다.
"mcp arena에 ai 로봇 만들어서 업로드해줘"
그러면 에이전트가 MCP 툴 체인을 사용해 다음 순서로 진행합니다.
- 상담 플로우 확인 (
get_build_flow) - 전략/스크립트 초안 생성 (
coach_robot_design) - 사용자에게 부족한 정보 질문 (playStyle/risk/objective)
- 스크립트 검증 (
validate_robot_script) - 프리뷰 대전 (
preview_robot_duel) - 사용자 승인 후 최종 업로드 (
upload_robot_script)
즉, 단순 업로드가 아니라 전술 상담 -> 검증 -> 시뮬레이션 -> 업로드를 MCP 안에서 지원합니다.
에이전트 응답 매너 메모
- 기본적으로 존댓말로 응답합니다.
- 사용자가 승인/허락/협업 제안을 해주면 감사 인사를 명시합니다. (
감사합니다.) - 말투는 간결하게 유지하되, 실행 결과와 근거는 분명하게 전달합니다.
구성
- 모노레포(
yarn workspaces) apps/web: Next.js 프론트엔드(로봇 업로드, 배틀 실행, 캔버스 리플레이)apps/functions: Firebase Functions API + MCP(JSON-RPC)apps/mcp-bridge: stdio MCP 브리지(에이전트 연결용)- Firestore: 로봇/배틀 메타데이터 저장
- Storage: 로봇 원본 스크립트 저장
디렉터리
.
├─ apps/
│ ├─ functions/
│ │ └─ src/
│ │ ├─ index.ts # REST + MCP endpoint (consultative tools 포함)
│ │ ├─ parser.ts # 로봇 스크립트 DSL parser
│ │ └─ battleEngine.ts # 전투 엔진 + replay timeline 생성
│ ├─ web/
│ │ ├─ app/
│ │ │ ├─ page.tsx
│ │ │ └─ globals.css
│ │ ├─ components/
│ │ │ └─ ArenaReplay.tsx # 캔버스 리플레이
│ │ └─ .env.local # 로컬 API base
│ └─ mcp-bridge/
│ ├─ index.ts # stdio MCP bridge source
│ └─ index.js # 실행 엔트리 (dist 로더)
├─ .mcp.json
├─ firebase.json
├─ firestore.rules
└─ storage.rulesparser.js DSL
한 줄에 한 규칙(매 틱 전체 규칙을 위에서 아래로 평가):
SET THROTTLE: 전/후진 입력 (+전진,-후진)SET STRAFE: 좌/우 횡이동 입력 (+우,-좌)SET TURN: 좌/우 회전 입력 (+우회전,-좌회전)FIRE또는FIRE ON|OFF: 사격 트리거 (에너지 소모)BOOST LEFT|RIGHT: 에너지를 소모해 좌/우 횡부스터 대시IF ENEMY_VISIBLE THENIF NOT ENEMY_VISIBLE THENIF THENIF () AND () THENIF () OR () THENIF NOT () THEN
- 센서: ARENA_SIZE, SHOT_RANGE, SHOT_HIT_RADIUS, SELF_X, SELF_Y, SELF_HEADING, SELF_ENERGY, BOOST_COOLDOWN, TICKS_SINCE_ENEMY_SEEN, ENEMY_X, ENEMY_Y, ENEMY_HEADING, ENEMY_DX, ENEMY_DY, ENEMY_DISTANCE, ENEMY_FORWARD_DISTANCE, ENEMY_LATERAL_OFFSET, PREV_ENEMY_X, PREV_ENEMY_Y, PREV_ENEMY_HEADING, PREV_ENEMY_DX, PREV_ENEMY_DY, PREV_ENEMY_DISTANCE, ENEMY_DX_DELTA, ENEMY_DY_DELTA, ENEMY_DISTANCE_DELTA, WALL_AHEAD_DISTANCE, WALL_LEFT_DISTANCE, WALL_RIGHT_DISTANCE, WALL_BACK_DISTANCE, WALL_NEAREST_DISTANCE - 수식: +, -, *, /, (), 상수 PI, TAU - 함수: ATAN2(y, x), ANGLE_DIFF(targetDeg, currentDeg), NORMALIZE_ANGLE(angleDeg), ABS(x), MIN(a,b), MAX(a,b), CLAMP(x,min,max) - 비교 연산자: >, >=, ` 4 THEN SET TURN 1 IF ANGLE_DIFF(ATAN2(ENEMY_DY, ENEMY_DX), SELF_HEADING) 횡이동(중간) > 후진(느림)
FIRE ON상태에서는 이동 속도와 회전 속도가 각각 절반으로 감소합니다.- 사격은 쿨다운 1틱 개념이며(실질적으로 매 틱 발사 가능), 에너지(
SELF_ENERGY)를 소모합니다. - 발사체는 즉시 명중하지 않고 비행 시간을 가집니다(현재
2틱/칸, 사거리 5칸이면 최대 약 10틱 비행). - 사이드 부스터(
BOOST LEFT|RIGHT)는 발동 후 5틱 동안5→4→3→2→1강제 횡이동(총 15틱 분량)을 수행합니다. - 사이드 부스터는 에너지(
SELF_ENERGY)를 소모하고 쿨다운(BOOST_COOLDOWN, 10틱)을 사용합니다.
API
기본 경로: /api
GET /api/healthGET /api/robotsPOST /api/robotsGET /api/robots/:robotId/avatar(업로드된 SVG 로봇 이미지)POST /api/battlesGET /api/battles/:battleIdPOST /api/mcp(JSON-RPC)
배틀 결과에는 리플레이용 데이터가 포함됩니다.
maxTickstickDurationMsprojectileTimingmovementTiminginitialStatetimeline(액션별before/after, 탄환 궤적)ticks(turns는 하위호환 alias)finalState
MCP 툴 목록 (상담형)
get_build_flow
- 에이전트가 사람과 어떤 순서로 상담할지 안내
coach_robot_design
- 사람의 의도/성향을 받아 로봇 초안(규칙+스크립트) 생성 - 부족 정보가 있으면 followUpQuestions 반환
validate_robot_script
- DSL 문법 + 전술 품질 체크(경고/추천)
preview_robot_duel
- 후보 스크립트를 프리뷰 배틀로 점검 - 서버 모드에서는 opponentScript를 직접 넣어야 하며 preset 상대는 제공되지 않음
upload_robot_script
- 최종 로봇 업로드 - collaboratorAgents는 최소 1개 이상이며 각 항목은 {name, version, role?} 형식을 권장 - robotImageSvg(SVG 문자열)는 필수이며, 로봇 전용 이미지를 저장 - userApprovalConfirmed=true가 아니면 업로드가 차단됨(최종 사용자 승인 강제)
로컬 실행 (Emulator)
현재 기본 로컬 ID:
.firebaserc->mcp-arena-local
웹 API:
apps/web/.env.local
- NEXT_PUBLIC_API_BASE_URL=http://127.0.0.1:5001/mcp-arena-local/us-central1/api
실행:
yarn install
yarn emulators로컬 테스트용 preset 상대:
preview_robot_duel의 preset 상대는 로컬 에뮬레이터(FUNCTIONS_EMULATOR=true)에서만 허용됩니다.- 필요하면
MCP_ARENA_ENABLE_PRESETS=1로 명시 활성화할 수 있습니다.
별도 터미널:
yarn dev:web브라우저 http://localhost:3000:
- 로봇 2개 이상 업로드
- 배틀 실행
- Replay 재생/프레임 이동
Agent 연결용 MCP 브리지 (stdio)
에이전트는 stdio MCP 서버를 사용하므로 브리지를 연결합니다.
yarn dev:mcp-bridge기본 포워딩 대상:
http://127.0.0.1:5001/mcp-arena-local/us-central1/api/mcp
원격 배포 API로 전환:
MCP_ARENA_API_BASE_URL=https://-
.cloudfunctions.net/api yarn dev:mcp-bridgeClaude / Codex 등록 예시
Claude Code
claude mcp add mcp-arena node /ABSOLUTE/PATH/mcp-arena/apps/mcp-bridge/index.jsCodex CLI
codex mcp add mcp-arena --env MCP_ARENA_API_BASE_URL=http://127.0.0.1:5001/mcp-arena-local/us-central1/api -- node /ABSOLUTE/PATH/mcp-arena/apps/mcp-bridge/index.js에이전트에게 줄 사용자 프롬프트 예시
mcp arena에 ai 로봇을 만들어 업로드해줘.
내 성향은 공격적이지만 너무 운빨은 싫어.
최종 업로드 전에 스크립트 검증하고 프리뷰 대전 결과도 보여줘.이렇게 요청하면 에이전트는 보통 아래 방식으로 진행합니다.
get_build_flow확인coach_robot_design으로 초안 생성- 사용자에게 follow-up 질문
validate_robot_scriptpreview_robot_duel- 사용자 승인 후
upload_robot_script
배포 가이드
1) 실제 Firebase 프로젝트로 전환
.firebaserc의default를 실제 프로젝트 ID로 변경apps/web/.env.local의 API URL을 배포 URL로 변경
예시:
NEXT_PUBLIC_API_BASE_URL=https://-
.cloudfunctions.net/api2) 웹 빌드 + 배포
yarn build:web
firebase deploy --only hosting,functions,firestore,storage배포 후 MCP 브리지도 같은 URL로 연결해 사용합니다.
라이선스
이 프로젝트는 PolyForm Noncommercial 1.0.0 라이선스를 따릅니다.
- 코드 다운로드/실행/수정/비상업적 배포: 허용
- 상업적 이용: 금지
자세한 내용은 루트 LICENSE 파일을 확인하세요.
현재 규칙
- 정사각형 아레나
- 로봇 2대
- 시작 위치
(0,0)vs(N-1,N-1) - 실시간 틱 단위로 명령 실행
- 전방 8칸 자동 시야 갱신
- 총 사거리 5칸
- 이동 속도: 전진(
THROTTLE>0) >STRAFE> 후진(THROTTLE<0) - 사격: 쿨다운 1틱 개념(실질 매틱 발사 가능) + 공용 에너지 소모
- 투사체: 발사 후 틱 단위 비행(즉시 명중 아님, 회피 가능)
- 사이드 부스터:
BOOST LEFT|RIGHT(5틱 강제 횡이동 + 에너지/10틱 쿨다운) - 조건 분기(
IF ... THEN) + 수식 비교 + 논리 연산(AND/OR/NOT) + 관측 메모리 센서 지원 FIRE적중 시 즉시 사망- 승자 없으면
draw
주의
현재 firestore.rules, storage.rules는 프로토타입용 전체 허용입니다. 실제 서비스 전에는 인증/권한 규칙을 반드시 강화해야 합니다.
