마비노기 모바일 CLI skills .Docs
마비노기 모바일 PC 클라이언트를 자연어 / 명령줄로 제어하기 위한 CLI 도구 상세 문서
2026.09.20
마비노기 모바일 CLI (MabinogiMobile_CLI) 기능 정리
마비노기 모바일 PC 클라이언트를 자연어 / 명령줄로 제어하기 위한 CLI 도구 상세 문서 기준: 로컬
CAPABILITIES.json(명령 28개) +mabinogi-mobile-cli스킬 정의 작성일: 2026-09-20
1. 개요
MabinogiMobile_CLI.exe는 실행 중인 마비노기 모바일 PC 클라이언트와 통신하며,
게임 상태를 조회하거나 캐릭터의 행동(채집·제작·개조·연주·채팅 등)을 실행시키는 커맨드라인 도구입니다.
AI 에이전트(Claude Code 등)가 게임을 "대신 플레이"할 수 있도록 설계되어 있어,
모든 명령은 JSON 응답과 종료 코드를 반환하고, 사용 가능한 명령 목록 자체를
게임 클라이언트가 동적으로 내려주는 구조(capabilities)를 가집니다.
핵심 특징
| 특징 | 설명 |
|---|---|
| 동적 명령 스키마 | 명령 목록이 게임 클라이언트에서 실시간 제공됨 (capabilities) |
| 블로킹 실행 | 채집/제작 등은 게임 내 행동이 끝날 때까지 반환되지 않음 |
| 자동 이동 포함 | 제작·개조 명령은 해당 시설까지의 이동까지 자동 수행 |
| 비용 기반 | 일부 실행 명령은 게임 내 재화(정령의 날개)를 소모 |
| 안전장치 | requiresConfirm 플래그로 사용자 확인 요구 |
| 자동 설치 | 게임 내 토글 ON 시 CLI와 스킬이 자동 설치됨 |
2. 설치 및 실행 환경
2.1 설치 경로
C:\Nexon\MabinogiMobile\MabinogiMobile_CLI.exe
- 사용자 PATH에
MabinogiMobile_CLI로 등록됩니다. - PATH가 아직 갱신되지 않았다면(토글을 켠 뒤 새 셸을 열지 않은 경우) 절대 경로로 호출하세요.
2.2 데이터 저장 경로
%LOCALAPPDATA%\MabinogiMobileCLI\
├── CAPABILITIES.json # 명령 스키마 캐시 (세션당 1회 조회 후 재사용)
└── last-response.json # 마지막 명령 결과 (진짜 UTF-8, 이스케이프 없음)
2.3 전제 조건 (둘 다 필요)
- 마비노기 모바일 PC 클라이언트가 실행 중일 것
- 게임 설정에서 "MM AI 에이전트 활성화" 토글이 ON일 것
- 이 옵션은 7일 후 만료되므로 주기적으로 재활성화가 필요합니다.
2.4 자동 설치
게임 내 "MM AI 에이전트 활성화" 토글을 켜면 CLI 실행 파일과 AI 스킬 파일이 자동으로 설치됩니다. 별도의 수동 설치 과정은 없습니다.
3. 기본 사용법
3.1 호출 형식
bashMabinogiMobile_CLI <command> [body]
<command>:CAPABILITIES.json의Command값[body]: 명령별 입력값. 원시 문자열 또는 JSON 문자열 (명령마다 다름)- 원시 문자열형:
write_chat,get_gatherable_items필터 등 - JSON형:
play_music_score,execute_crafting,execute_gathering등
- 원시 문자열형:
3.2 최초 진행 순서
bash# 0) 연결 확인
MabinogiMobile_CLI status
# 1) 명령 스키마 확보 (세션당 1회)
MabinogiMobile_CLI capabilities > "%LOCALAPPDATA%\MabinogiMobileCLI\CAPABILITIES.json"
# 2) 스키마를 참고해 명령 실행
MabinogiMobile_CLI get_my_info
capabilities응답에loading: true가 포함되어 있으면 아직 카탈로그가 준비되지 않은 상태입니다. 사용자가 게임에 완전히 진입한 뒤 재조회해야 합니다.
4. 종료 코드 (Exit Code)
명령의 성패는 반드시 종료 코드로 먼저 판정합니다.
| 코드 | 의미 | 조치 |
|---|---|---|
0 | 성공 (게임까지 전달됨) | 정상 플로우 진행. 단, body의 status/error도 확인 |
2 | 사용법 오류 (알 수 없는 옵션) | 명령 문법 수정 |
3 | 취소됨 (대기가 취소됨) | — |
4 | 알 수 없는 명령 | capabilities 재조회 후 1회 재시도 |
5 | 연결 끊김 (게임 미실행 또는 AI 에이전트 비활성) | reason 필드 확인 후 사용자 안내 |
종료 코드 5의 reason 분기
| reason | 의미 | 안내 |
|---|---|---|
game_off | 게임 클라이언트가 실행 중이 아니거나 응답 없음 | 게임 실행/재시작 요청 |
option_off | AI 에이전트 옵션이 꺼짐 (미동의 또는 7일 만료) | 게임 설정에서 "MM AI 에이전트 활성화" ON 요청 |
5. 응답 형식
5.1 정상/거부 응답
명령이 게임 클라이언트까지 도달했다면 status: "rejected"이거나 body에 error가 있어도 종료 코드는 0입니다.
따라서 종료 코드와 JSON body를 모두 확인해야 합니다.
json{ "error": "<error_code>", "message": "<사람이 읽을 수 있는 설명>" }
5.2 주요 status 값
| status | 의미 |
|---|---|
accepted | 명령이 수락되어 실행됨 (body에 result 또는 error가 들어갈 수 있음) |
rejected | 실행 전 단계에서 거부됨 (전제조건 미충족 등) |
invalid_body | body 형식/필수값 오류 |
5.3 result 값 (실행형 명령)
| result | 의미 |
|---|---|
completed | 목표까지 정상 완료 |
started | 시작만 하고 반환 (자동 낚시, 개조 큐 등록 등) |
stopped | 목표 미달 상태로 조기 종료 |
stopped_by_user | 사용자가 게임 내에서 중단함 |
6. 인코딩 규칙 (Windows 필수 사항)
6.1 입력: 비ASCII는 반드시 base64: 접두사
Windows 콘솔은 종종 레거시 코드페이지(CP949)를 사용하므로, 한글/CJK/키릴 등 비ASCII 문자를
명령줄 인자에 그대로 넣으면 CLI에 도달하기 전에 ? / � 로 깨집니다(복구 불가).
규칙: 비ASCII가 하나라도 포함된 body는 UTF-8 바이트를 base64로 인코딩하고
base64:접두사를 붙인다.
bashMabinogiMobile_CLI write_chat base64:7JWI64WV
# 7JWI64WV = "안녕"의 UTF-8 바이트를 base64 인코딩한 값
- JSON body도 동일합니다. JSON 문자열 전체를 base64로 인코딩합니다.
예:
{"displayName":"통나무"}→ 전체를 base64 →base64:eyJkaXNwbGF5... - ASCII만 있는 body는 인코딩 없이 그대로 전달하면 됩니다.
변환 절차: body 문자열 → UTF-8 bytes → base64 → "base64:" 접두사 → 단일 인자로 전달
6.2 출력: \uXXXX 이스케이프 또는 결과 파일
명령 결과는 UTF-8 JSON이지만, 레거시 코드페이지 환경에서 살아남기 위해
비ASCII 문자는 stdout에 \uXXXX 이스케이프로 출력됩니다. 이것은 손상이 아니며 JSON 파서가 자동 복원합니다.
- 항상 stdout을 JSON으로 파싱해서 디코딩된 값을 사용하십시오. 원시
\uXXXX문자열을 최종 텍스트로 쓰면 안 됩니다. - 런타임이
\uXXXX를 안정적으로 못 푼다면, 다음 파일을 UTF-8로 읽으면 이스케이프 없는 원문을 얻습니다.
%LOCALAPPDATA%\MabinogiMobileCLI\last-response.json
7. 명령 디스커버리 (CAPABILITIES.json)
사용 가능한 명령은 게임 클라이언트가 동적으로 제공합니다.
- 조회:
MabinogiMobile_CLI capabilities - 저장: 출력 JSON을
%LOCALAPPDATA%\MabinogiMobileCLI\CAPABILITIES.json에 저장 - 참조: 명령 실행 전 항상 로컬 파일에서
Command/Description/BodyExample/Metadata확인 - 갱신: 종료 코드 4(unknown_command) 발생 시 재조회 후 1회 재시도
각 명령 엔트리 구조:
json{
"Command": "execute_crafting",
"Description": "...",
"BodyExample": "{\"displayName\":\"...\",\"craftCount\":1}",
"OutputExample": "...",
"Note": "... 동작 상세, 오류 코드, 비용, 연관 명령 ...",
"Metadata": { "requiresConfirm": "true" }
}
8. 전체 명령 목록 (28개)
8.1 한눈에 보기
| # | 명령 | 분류 | body | 비용 | 확인필요 |
|---|---|---|---|---|---|
| 1 | capabilities | 메타 | 없음 | — | — |
| 2 | get_current_environment | 상태 조회 | 없음 | — | — |
| 3 | get_my_info | 상태 조회 | 없음 | — | — |
| 4 | get_activity | 상태 조회 | 없음 | — | — |
| 5 | get_inventory | 상태 조회 | 없음 | — | — |
| 6 | get_currencies | 상태 조회 | 없음 | — | — |
| 7 | get_items | 아이템 | JSON(선택) | — | — |
| 8 | get_near_npcs | 주변 정보 | 없음 | — | — |
| 9 | get_near_pcs | 주변 정보 | 없음 | — | — |
| 10 | get_quests | 퀘스트 | 없음 | — | — |
| 11 | get_daily_missions | 미션 | 없음 | — | — |
| 12 | get_weekly_missions | 미션 | 없음 | — | — |
| 13 | write_chat | 소통 | 원시 문자열 | — | ✅ |
| 14 | get_social_actions | 소통 | 원시 문자열(필터) | — | — |
| 15 | get_music_scores | 음악 | 원시 문자열(필터) | — | — |
| 16 | play_music_score | 음악 | JSON | — | — |
| 17 | get_instruments | 음악 | 원시 문자열(필터) | — | — |
| 18 | change_instrument | 음악 | JSON | — | — |
| 19 | get_gatherable_items | 채집 | 원시 문자열(필터) | — | — |
| 20 | execute_gathering | 채집 | JSON | 정령의 날개 5 | — |
| 21 | get_alterable_items | 개조 | 원시 문자열(필터) | — | — |
| 22 | execute_altering | 개조 | JSON | 정령의 날개 5 | — |
| 23 | get_altering_works | 개조 | 없음 | — | — |
| 24 | complete_altering_work | 개조 | JSON | — | — |
| 25 | get_craftable_items | 제작 | 원시 문자열(필터) | — | — |
| 26 | execute_crafting | 제작 | JSON | 정령의 날개 5 | — |
| 27 | stop_action | 행동 제어 | 없음 | — | — |
| 28 | stand_up | 행동 제어 | 없음 | — | — |
비용/확인 여부는 데이터 기반으로 변경될 수 있으므로 항상
CAPABILITIES.json의Note/Metadata를 확인하세요.
8.2 메타
capabilities — 사용 가능한 명령 목록 조회
- body: 없음
- 출력:
{ commands: [...] } - 주의: 응답에
loading: true가 있으면 카탈로그 미완성 상태 → 게임 진입 후 재조회
8.3 상태 조회
get_current_environment — 현재 위치 / 날씨 / 시간
{ ChannelDisplayName, GameSpaceDisplayName, WorldPosition, Weather, ErinnNow,
Housing: { IsInHousing, IsOwnedHousing, CanEnterHousing, CannotEnterHousingReason, CanExitHousing } }
ErinnNow: 게임 내 시간(에린 달력)Housing: 마이홈 내부 여부 / 내 집 여부 / 지금 내 마이홈에 갈 수 있는지 / 나갈 수 있는지
get_my_info — 내 캐릭터 기본 정보·스탯·현재 상태
{ Title, RealmName, Level, EnabledCombatJobDisplayName,
CombatScore, LivingScore, AttractivenessScore, DecorScore,
HealthMax, AttackPower, DefencePower, STR, DEX, INT, LUCK, WILL, ArcaneResistance,
PaladinStats: { PaladinAttackPower, PaladinDefencePower, JusticePower,
JudgementPower, OrderPower, BlessingPower },
Vitals: { HealthCurrent, HealthMax, ShieldAmount, ShieldMax,
SatietyValue, SatietyMax, SatietyRatio,
InventoryWeightCurrent, InventoryWeightMax, ActiveBuffCount } }
- 모든 스탯 필드는
{ DisplayName, Value }객체 →DisplayName을 그대로 스탯 이름으로 사용 - 위치/날씨/하우징은
get_current_environment, 연주 등 실시간 활동은get_activity참조
get_activity — 자동사냥 / 이동 / 전투 / 행동 상태
가장 정보량이 많은 조회 명령으로, 현재 캐릭터가 "무엇을 하고 있는지"를 종합적으로 반환합니다.
| 섹션 | 필드 |
|---|---|
autoPlay | IsAutoPlaying, CanStartAutoPlay, AutoPlayTarget, AutoPlayTargetDisplayName |
autoTravel | IsAutoTraveling, AutoTravelRemainingPositionCount |
combatState | IsDead, IsReviving, IsInCombat |
dialogue | IsDialoguePlaying, IsDialogueNextAvailable, IsWaitingForSelection |
Dungeon | State(NotInDungeon/Entering/InProgress/Cleared), IsBossBattleInProgress |
Battlefield | IsInBattleField |
Tutorial / Scenario | IsPlaying / IsInScenario, IsSequencePlaying |
Performance | IsPlaying, InstrumentName, MusicTitle, IsCopyingAllowed, IsLoop, StartAt, TotalDurationSeconds, ElapsedSeconds, RemainingSeconds, ChannelCount |
Interaction | HasTarget, IsTargetAttackable, AvailableInteractionType, LastRunningInteractionType, TargetKind |
Mode | MainButtonState, MountPartState, SitState, IsPlayingMiniGame, IsHousingEditMode |
AutoPlayTarget:none,quest,goddess_mission,shortcut,division_objective,recommended_activity,guide_missionTargetKind:DungeonEntrance,Elevator,Fountain,CutscenePlayProp,Gimmick,Prop,Actor,NoneMainButtonState:Hide,Stop,Combat,Interaction,Compass,ScenarioQTE,Fishing,FishingPull,HousingMountPartState:None,Mounted,Dismounted,SpawnedSitState:None,Sitting(의자 착석만 해당./앉기는 SitState에 반영되지 않음)InstrumentName은 장착된 악기의 표시 이름이며, 미장착 시 빈 값입니다.
get_inventory — 인벤토리 무게
{ CurrentInventoryWeight, CurrentInventoryWeightAsDecimal,
MaxInventoryWeight, MaxInventoryWeightAsDecimal }
아이템 목록은 get_items 사용.
get_currencies — 주요 재화 보유량
[ { DisplayName, Amount } ]
8.4 아이템
get_items — 보유 아이템 목록 (가방 / 계정창고 / 캐릭터창고)
- body(선택):
{"category":"Ingredient","name":"<이름 일부>"} - 출력:
[ { DisplayName, Category, CategoryDisplayName, Count, Location, IsLocked } ] Location:inventory,account_storage,character_storageCategory예시:Food,Ingredient,Consumable,Consumable_Box,Consumable_Growth,Quest- 범위: 소비 계열 아이템(음식, 재료, 채집물 등). 장비/코스튬/펫은 포함되지 않음
- 필터는 둘 다 부분일치 + 대소문자 무시. body 생략 시 전체 목록
- 카테고리를 말할 때는
CategoryDisplayName을 그대로 사용
8.5 주변 정보 (탐색 반경 30)
get_near_npcs — 주변 대화 가능한 NPC
[ { Name, Title, DisplayName, Distance } ]
대화 가능한 NPC와 NPC 동료만 반환합니다.
get_near_pcs — 주변 플레이어
[ { RealmName, Title, Distance, ClothesCount, CrowdAppearanceColorCount,
IsRobeWeared, IsHoodOn, IsWeaponHidden, Level, EnabledCombatJobDisplayName,
CombatScore, LivingScore, AttractivenessScore,
IsFriend, IsInParty, HasGuild, IsSameGuild, IsCoOwner, IsInCombat,
Performance: { IsPlaying, MusicTitle, IsCopyingAllowed, IsLoop, StartAt,
TotalDurationSeconds, ElapsedSeconds, RemainingSeconds, ChannelCount } } ]
IsCoOwner: 현재 들어와 있는 마이홈의 공동 소유자 여부 (마이홈 밖에서는 항상 false)Performance하위 값들은IsPlaying이 true일 때만 채워지고,RemainingSeconds는TotalDurationSeconds > 0일 때만 설정됩니다.
8.6 퀘스트 / 미션
get_quests — 퀘스트 트래커 목록
[ { QuestTitle, Source, SourceDisplayName,
Objectives: [ { Description, IsCompleted, Count, Goal } ] } ]
- 현재 활성 탭에 보이는, 수행 가능한 항목만 반환
Source:main,pinned_sub,auto_register_sub,auto_register_candidate_sub,event,goddess_mission,shortcut,division_objective,guide_mission,recommended_activity- 카테고리명을 말할 때는
SourceDisplayName을 그대로 사용
get_daily_missions — 일일 미션 (캐릭터 단위)
get_weekly_missions — 주간 미션 (계정 단위)
[ { Title, Description, CurrentCount, GoalCount, IsCompleted, IsRewardReceived, HasShortcut } ]
HasShortcut: 자동사냥 바로가기 지원 여부- 일일 미션은 정령의 날개(명령 실행 재화)를 획득하는 주요 수단입니다.
8.7 소통 / 감정표현
write_chat — 채팅 전송 ⚠️ requiresConfirm: true
- body: 원시 문자열 (JSON 아님), 최대 50자
- 한글 포함 시 반드시
base64:사용
허용되는 입력
- 일반 채팅 메시지
get_social_actions의ChatCommands에 정확히 있는 행동 명령 (예:/전통댄스,/손인사1)/춤,/인사같은 표시 이름은 명령이 아님
- 표정(Facial)의
EmojiText
거부되는 입력
- 채널 전환(
/지역,/파티등), 긴급 탈출, 비밀번호(#...) 등 예약 명령 - 인식되지 않는
/명령 →unsupported_command
오류 처리
| 상황 | status / error |
|---|---|
| 성공 | accepted, body { message } |
| 50자 초과 등 | invalid_body (message_too_long은 length 포함) |
| 예약/미지원 명령 | rejected / unsupported_command |
| 속도 제한 | rejected / rate_limited + retryAfterSeconds → 해당 초 이후 재시도 |
행동·표정 명령은 채팅으로 표시되지 않고 실제 동작으로 실행됩니다.
get_social_actions — 행동(Behaviours) / 표정(Facials) 목록
{ Behaviours: [ { DisplayName, ChatCommands: [] } ],
Facials: [ { DisplayName, EmojiText } ] }
- body(원시 문자열)로 이름/명령어/이모지 텍스트 부분일치 필터 가능 (대소문자 무시)
- 실행은
write_chat으로ChatCommands또는EmojiText를 보내는 방식
8.8 음악 / 연주
get_music_scores — 보유 악보 목록
[ { Location, DisplayTitle, IsCopyingAllowed, IsLocked } ]
Location: inventory, account_storage, character_storage / body로 제목 부분일치 필터
get_instruments — 보유 악기 목록
[ { Name, Durability, IsEquipped } ]
- 연주하려면 악기가 장착(IsEquipped)되어 있어야 합니다. 없으면
play_music_score가no_instrument로 거부됩니다.
change_instrument — 악기 장착/교체
- body:
{"name":"<get_instruments의 Name>"} - 동일 이름 악기가 여러 개면 그중 하나가 장착됩니다.
- 오류:
not_found,is_playing_instrument(연주 중),not_available_on_dead(사망),level_requirement(레벨 부족),invalid_target,failed_unequip,system_error - 이미 장착된 악기를 다시 요청하면
accepted반환
play_music_score — 악보 연주 시작
- body:
{"title":"<get_music_scores의 DisplayTitle>"} - 동일 제목이 여러 개면 그중 하나가 연주됩니다.
- 오류:
not_found,no_instrument,not_available_on_combat(전투 중),not_available_on_riding(탑승 중),not_available_on_dead(사망),system_error - 연주 중단은
stop_action, 진행 상황은get_activity의Performance참조
8.9 채집 / 낚시
get_gatherable_items — 채집 가능 아이템 목록
- body(선택): 아이템 이름 부분일치 필터 (예:
통나무) - 출력:
{ items: [ { DisplayName, ToolOk } ] } - 생활 스킬 레벨 조건을 이미 충족한 아이템만 표시됩니다(잠긴 항목은 숨김).
잠긴 아이템을
execute_gathering에 넣으면insufficient_living_skill_level(필요 레벨 포함)이 반환됩니다. ToolOk = false: 필요한 도구가 없거나 내구도가 0
execute_gathering — 지정 아이템 채집 (또는 자동 낚시 시작) 💰 정령의 날개 5
- body:
{"displayName":"<get_gatherable_items의 DisplayName>"}(이름은 정확히 일치해야 함)
동작 규칙
- 1회 호출당 최대 100개까지 채집 후 정지 → 더 필요하면 재호출
- 시도마다 소모품(예: 빈 병)이 필요한 경우, 보유량만큼으로 상한이 자동 하향되며 적용된 상한이
target으로 반환 - 채집 장소는 도달 가능한 가장 가까운 곳이 자동 선택됩니다.
- 해당 장소의 다른 부산물도 같이 얻지만,
gained/target은 지정한 아이템만 계산합니다. - 낚시 전용 아이템이면: 어장으로 이동 → 자동 낚시 ON → 시작 즉시 반환(
result: started)- 자동 낚시는 목표가 없고 스스로 끝나지 않음 → 충분해지면
stop_action으로 종료 - 종료 후에도 자동 낚시 설정은 켜진 상태로 유지됩니다.
- 낚시는 모든
stopped/에러 응답에서gained/target이 생략됩니다.
- 자동 낚시는 목표가 없고 스스로 끝나지 않음 → 충분해지면
응답
| 상황 | 응답 |
|---|---|
| 채집 완료 | accepted, { result: completed, gained, target } |
| 낚시 시작 | accepted, { result: started } (gained/target 없음) |
| 조기 종료 | accepted, { result: stopped, gained, target, message } |
| 시작 후 중단 | accepted, { error: blocked / overweight / timeout / canceled / tool_broken, message, gained, target } |
| 시작 전 거부 | rejected, { error, message } |
| body 누락 | invalid_body |
시작 전 거부 오류: not_found, no_route, insufficient_living_skill_level,
overweight, tool_missing, tool_broken, required_consumable_missing, not_in_field, blocked
8.10 개조 (Altering) — 큐 기반 비동기
개조는 제작(
crafting)과 별개 시스템입니다. 추출물, 포자, 가루, 비단, 목재 등이 여기서 만들어집니다.
전체 흐름: get_alterable_items → execute_altering(큐 등록) → get_altering_works(진행 확인) → complete_altering_work(수령)
get_alterable_items — 개조 레시피 목록
- body(선택): 레시피명 또는 재료명 부분일치 필터 (예:
버섯) - 출력:
{ items: [ { DisplayName, Alterable, ProducedPerWork, Reason,
MissingIngredients: [ { DisplayName, Required, Owned } ] } ] }
ProducedPerWork: 개조 작업 1회당 산출 개수Reason:insufficient_facility_level,not_enough_ingredient,ingredient_locked,insufficient_transfer_cost
execute_altering — 개조 작업 큐 등록 (시설 이동 포함) 💰 정령의 날개 5
- body:
{"displayName":"<get_alterable_items의 DisplayName>"} - 비동기 큐 방식: 성공해도 즉시 아이템이 생기지 않고 작업 1건이 큐에 등록됩니다.
- 이 호출은 이동 + 큐 등록까지 블로킹되며, 이후 시설 UI는 자동으로 닫힙니다.
- N개를 걸려면
started응답을 받을 때마다 다시 호출합니다. - 주요 오류:
not_found,not_available,requires_user_interaction(이 명령으로 큐 등록 불가 → 게임에서 직접 시작 요청),insufficient_facility_level,not_enough_ingredient,ingredient_locked,insufficient_transfer_cost,blocked,overweight,not_in_field,facility_not_found - 시작 후 오류:
component_not_found,facility_not_found,blocked,timeout,canceled/ 도착 전 이동이 중단되면{ result: stopped_by_user }
get_altering_works — 진행/완료된 개조 작업 조회
{ completedCount,
works: [ { DisplayName, FacilityName, State, IsCompleted, RemainingSeconds } ] }
State:NotStarted,InProgress,Completed/ 완료 시RemainingSeconds는 0FacilityName이 같은 작업들은complete_altering_work한 번으로 함께 수령됩니다.completedCount > 0이면 수령 가능- 모든 시설의 개조 큐를 한 번에 보여줍니다.
complete_altering_work — 한 시설의 완료 작업 일괄 수령 (이동 포함)
- body:
{"displayName":"<get_altering_works의 DisplayName>"} - body의
displayName은 시설을 선택하는 용도입니다. 해당 아이템이 만들어지는 시설의 완료된 모든 작업을 수령합니다. - 지정한 아이템 자체가 아직 진행 중이면
not_completed_yet으로 거부됩니다. - 한 번에 한 시설만 처리 → 여러 시설이면 시설별로 호출
- 이동 → 수령 → 보상 처리까지 블로킹되며, 이후 보상/시설 UI는 자동으로 닫힙니다.
- 성공:
{ collected, rewards, criticalRewards, message } - 오류:
no_altering,no_completed_work,not_found,no_completed_work_at_facility,not_completed_yet,blocked,overweight,not_in_field,facility_not_found,timeout,canceled timeout으로 수령이 확인되지 않으면get_altering_works로 재확인하십시오.
8.11 제작 (Crafting)
get_craftable_items — 제작 레시피 목록
- body(선택): 레시피명 또는 재료명 부분일치 필터
(예:
거미줄→ 거미줄을 재료로 쓰는 레시피도 함께 나옴) - 출력:
{ craftingUnlocked: bool,
items: [ { DisplayName, Craftable, ProducedPerCraft, Reason,
MissingIngredients: [ { DisplayName, Required, Owned } ] } ] }
craftingUnlocked: false→ 제작 시스템 미해금 상태이며items는 비어 있음ProducedPerCraft: 제작 1회(craftCount=1)당 산출 개수Craftable은 생활 스킬 레벨 / 시설 레벨 / 장식 점수 / 재료 수량 / 재료 이전 비용을 모두 반영Reason:insufficient_living_skill_level,insufficient_facility_level,insufficient_decor_score,not_enough_ingredient,ingredient_locked,insufficient_transfer_cost
execute_crafting — 제작 실행 (시설 이동 + 결과 수령 포함) 💰 정령의 날개 5
- body:
{"displayName":"<get_craftable_items의 DisplayName>","craftCount":1} - ⚠️
craftCount는 산출 개수가 아니라 "제작 횟수" 입니다. 실제 획득량 =craftCount × ProducedPerCraft craftCount기본값 1, 시설별 상한 존재 → 초과 시invalid_count(응답에maxCount포함)로 거부- 이 호출은 이동 → 제작 → 결과 수령까지 블로킹되며, 완료 후 결과/시설 UI는 자동으로 닫힙니다.
- 더 만들려면
completed응답 후 재호출
응답
| 상황 | 응답 |
|---|---|
| 완료 | accepted, { result: completed, craftCount, rewards, criticalRewards } |
| 사용자 중단 | accepted, { result: stopped_by_user } (새로 생산된 것 없음) |
| 시작 후 중단/타임아웃 | accepted, { error, message } (blocked는 kind 포함 / timeout=중지됨 / canceled=다른 명령이 행동을 대체) |
| 시작 전 거부 | rejected, { error, message } |
시작 전 거부 오류: crafting_locked, not_found, not_available, invalid_count,
insufficient_living_skill_level, insufficient_facility_level, insufficient_decor_score,
not_enough_ingredient, ingredient_locked, insufficient_transfer_cost,
blocked, overweight, not_in_field, facility_not_found
8.12 행동 제어
stop_action — 진행 중인 중지 가능 행동 정지
- 대상: 악기 연주, 의자 착석, 자동사냥, 나르기, 채집(자동 낚시 포함)
- 게임 내 "중지" 버튼이 떠 있을 때만 동작하며, 아니면
invalid_state로 거부 /앉기에는 중지 버튼이 없으므로stand_up을 사용- 오류:
invalid_state,timeout
stand_up — /앉기 상태에서 일어나기
/앉기상태에서만 동작하며, 아니면not_sitting으로 거부get_activity의SitState는/앉기를 나타내지 않습니다(의자 착석만 표시)- 앉는 모션이 끝나기 전에는 일어설 수 없으므로, 앉은 직후
timeout이 나면 잠시 뒤 재시도 - 오류:
not_sitting,no_control_object,timeout
9. 안전장치 · 확인 · 비용
9.1 사용자 확인 (requiresConfirm)
CAPABILITIES.json의 각 명령 Metadata.requiresConfirm가 true이면:
- 즉시 실행하지 않습니다.
- 수행할 동작의 상세를 사용자에게 제시하고 명시적 승인을 요청합니다.
- 승인 후 동일한 파라미터로 재호출합니다.
현재 스키마 기준
write_chat이requiresConfirm: true입니다. (자원 소모, PvP 지역 진입 등도 확인 대상이 될 수 있습니다.)
9.2 명령 비용
일부 명령은 실행 시 게임 내 재화를 소모합니다.
| 명령 | 비용 |
|---|---|
execute_gathering | 정령의 날개 5 |
execute_altering | 정령의 날개 5 |
execute_crafting | 정령의 날개 5 |
- 비용은 데이터 기반이라 변경될 수 있으므로 금액을 추정하지 말고
CAPABILITIES.json의Note를 읽으십시오. - 성공 시 응답 body의
cost필드에 실제 소모량과 잔액이 담깁니다. - 잔액 부족 시 명령은 실행되지 않고
not_enough_currency를 반환하며, 메시지에 필요량과 보유량이 모두 들어 있으므로 사용자에게 정확한 부족분을 전달하세요. - 결제 실패 시
cost_payment_failed. - 정령의 날개는 일일 미션으로 획득할 수 있습니다 (
get_daily_missions참조).
10. 장시간 실행 명령 (매우 중요)
채집·제작·개조처럼 게임 내 행동을 끝까지 수행하는 명령은 설계상 오래 블로킹되며, 응답 타임아웃이 없습니다.
지켜야 할 규칙
- ❌ 호출을 강제 종료하지 말 것
- ❌ 짧게 잘라 여러 번 호출하지 말 것
- ❌ "fire-and-forget + 폴링 루프"로 대체하지 말 것 → 게임 내에서는 이미 행동이 진행 중이며, 블로킹 호출이 스크립트와 게임의 동기화를 보장합니다.
- ✅ 셸 타임아웃을 허용되는 최대값(보통 10분)으로 설정
타임아웃 구조
| 주체 | 시간 | 동작 |
|---|---|---|
| 게임 클라이언트 | 9분 | 행동을 스스로 중단하고 timeout + 진행 상황을 응답 |
| 셸/도구 | 10분 권장 | 이보다 먼저 죽이면 게임측 정리와 응답을 모두 잃음 |
- 소요 시간은 대부분 이동 거리에 좌우됩니다.
- 행동은 중단 사유(완료 / 사용자 해결이 필요한 차단 / 게임 내 사용자 취소 / 시간 초과)를 스스로 보고하므로 별도로 상태를 폴링할 필요가 없습니다.
blocked 처리
사용자 입력이 필요한 UI나 상태가 뜨면 행동이 멈추고 blocked가 반환되며,
kind 필드에 무엇을 해결해야 하는지가 담깁니다.
→ 사용자에게 해당 내용을 안내하고, 해결 후 재시도하십시오.
11. 오류 코드 모음
공통 / 연결
| 코드 | 의미 |
|---|---|
unknown_command | 게임이 인식하지 못한 명령 (exit 4) → capabilities 갱신 |
disconnected | 게임 미실행 또는 AI 에이전트 비활성 (exit 5) |
not_enough_currency | 재화 부족 (필요량/보유량이 메시지에 포함) |
cost_payment_failed | 비용 결제 실패 |
rate_limited | 속도 제한 (retryAfterSeconds 후 재시도) |
timeout | 시간 초과로 행동 중단 |
canceled | 다른 명령이 해당 행동을 대체함 |
blocked | 사용자 입력이 필요한 UI/상태 발생 (kind 동반) |
system_error | 기타 내부 실패 |
행동 실행 공통
| 코드 | 의미 |
|---|---|
overweight | 인벤토리 무게 초과 |
not_in_field | 필드가 아닌 곳(던전/실내 등)에서 실행 불가 |
no_route | 목적지까지 경로 없음 |
facility_not_found | 시설을 찾을 수 없음 |
not_found | 지정한 이름의 대상 없음 |
not_available | 현재 사용할 수 없는 레시피/대상 |
조건 미충족
| 코드 | 의미 |
|---|---|
insufficient_living_skill_level | 생활 스킬 레벨 부족 (필요 레벨 포함) |
insufficient_facility_level | 시설 레벨 부족 |
insufficient_decor_score | 장식 점수 부족 |
not_enough_ingredient | 재료 부족 |
ingredient_locked | 재료가 잠김 |
insufficient_transfer_cost | 재료 이전 비용 부족 |
tool_missing / tool_broken | 도구 없음 / 내구도 0 |
required_consumable_missing | 필요한 소모품 없음 |
crafting_locked | 제작 시스템 미해금 |
invalid_count | craftCount 상한 초과 (maxCount 포함) |
상태 제약
| 코드 | 의미 |
|---|---|
not_available_on_combat | 전투 중 불가 |
not_available_on_riding | 탑승 중 불가 |
not_available_on_dead | 사망 상태 불가 |
is_playing_instrument | 연주 중 불가 |
no_instrument | 장착된 악기 없음 |
level_requirement | 레벨 부족 |
invalid_state | 중지 가능한 행동이 없음 (stop_action) |
not_sitting | 앉아 있지 않음 (stand_up) |
no_control_object | 조작 대상 없음 |
requires_user_interaction | 이 명령으로 처리 불가, 게임에서 직접 수행 필요 |
개조 전용
| 코드 | 의미 |
|---|---|
no_altering | 개조 작업 자체가 없음 |
no_completed_work | 완료된 작업 없음 |
no_completed_work_at_facility | 해당 시설에 완료된 작업 없음 |
not_completed_yet | 지정한 아이템이 아직 진행 중 |
component_not_found | 필요한 구성요소를 찾지 못함 |
12. 실전 워크플로 예시
아래 예시의
base64:<...>는 해당 body 문자열 전체를 UTF-8 → base64로 변환한 값을 의미합니다.
12.1 채집 루틴
bash# 1) 무엇을 채집할 수 있는지 확인 (도구 상태 포함)
MabinogiMobile_CLI get_gatherable_items
# 2) 도구가 준비된(ToolOk=true) 아이템을 선택해 채집
MabinogiMobile_CLI execute_gathering base64:<{"displayName":"통나무"} 의 base64>
# → 최대 100개 수집 후 { result: completed, gained, target } 반환
# → 셸 타임아웃 10분 권장
# 3) 더 필요하면 재호출 (호출마다 정령의 날개 5 소모)
12.2 낚시
bashMabinogiMobile_CLI execute_gathering base64:<낚시 전용 아이템 JSON 의 base64>
# → { result: started } 즉시 반환, 자동 낚시 ON
MabinogiMobile_CLI get_activity # Mode.MainButtonState 가 Fishing 인지 확인
MabinogiMobile_CLI stop_action # 충분히 잡았으면 종료
12.3 제작
bashMabinogiMobile_CLI get_craftable_items base64:<"거미줄" 의 base64>
# → Craftable / ProducedPerCraft / MissingIngredients 확인
MabinogiMobile_CLI execute_crafting base64:<{"displayName":"...","craftCount":3} 의 base64>
# → craftCount=3 이면 실제 획득량은 3 x ProducedPerCraft
12.4 개조 (비동기 3단계)
bashMabinogiMobile_CLI get_alterable_items base64:<"버섯" 의 base64>
MabinogiMobile_CLI execute_altering base64:<{"displayName":"..."} 의 base64> # started (큐 등록)
MabinogiMobile_CLI get_altering_works # RemainingSeconds 확인
MabinogiMobile_CLI complete_altering_work base64:<{"displayName":"..."} 의 base64> # 시설 완료분 일괄 수령
12.5 연주
bashMabinogiMobile_CLI get_instruments # IsEquipped 확인
MabinogiMobile_CLI change_instrument base64:<{"name":"..."} 의 base64>
MabinogiMobile_CLI get_music_scores
MabinogiMobile_CLI play_music_score base64:<{"title":"..."} 의 base64>
MabinogiMobile_CLI get_activity # Performance.RemainingSeconds
MabinogiMobile_CLI stop_action # 연주 중단
12.6 채팅 / 감정표현
bashMabinogiMobile_CLI get_social_actions base64:<"인사" 의 base64>
# → Behaviours[].ChatCommands 에서 정확한 명령(예: /손인사1) 확인
# (requiresConfirm → 사용자 승인 후 실행)
MabinogiMobile_CLI write_chat base64:<"/손인사1" 의 base64>
13. 트러블슈팅
| 증상 | 원인 | 해결 |
|---|---|---|
종료 코드 4 (unknown_command) | 명령 스키마가 변경됨 | capabilities 재조회 후 1회 재시도 |
| 모든 명령이 종료 코드 5 | 게임 미실행 / AI 에이전트 OFF | reason 확인 → game_off면 게임 실행, option_off면 "MM AI 에이전트 활성화" ON |
| 명령이 매우 오래 걸림 | 설계상 정상 (이동 + 행동 완료까지 블로킹) | 죽이지 말고 대기, 셸 타임아웃 10분 |
MabinogiMobile_CLI를 찾을 수 없음 | PATH 미갱신 | 절대 경로 C:\Nexon\MabinogiMobile\MabinogiMobile_CLI.exe 사용 (또는 새 셸 실행) |
한글이 ? / � 로 깨짐 | 콘솔 코드페이지(CP949) | body를 base64:로 전달 |
출력이 \uXXXX 로 보임 | 정상 동작(이스케이프) | JSON 파서로 디코딩하거나 last-response.json을 UTF-8로 읽기 |
capabilities에 loading: true | 게임 진입 전 | 사용자가 게임에 완전히 진입한 뒤 재조회 |
명령이 blocked 로 중단 | 사용자 입력이 필요한 UI 발생 | kind 값을 사용자에게 안내 → 해결 후 재시도 |
14. 제약사항 요약
- 조회 반경:
get_near_npcs/get_near_pcs는 반경 30 - 채팅: 최대 50자, 예약 명령(채널 전환·긴급 탈출·비밀번호) 사용 불가, 속도 제한 존재
- 아이템 조회: 소비 계열만 (장비·코스튬·펫 제외)
- 채집: 1회 호출당 최대 100개
- 낚시: 목표 없음, 스스로 종료되지 않음 →
stop_action필요 - 제작:
craftCount는 제작 "횟수", 시설별 상한 존재 - 개조: 큐 기반 비동기, 수령은 시설 단위로 1회씩
- 행동 시간 제한: 게임측 9분 자동 중단
- AI 에이전트 옵션: 7일 후 만료 → 재활성화 필요
/앉기:get_activity의SitState에 반영되지 않으며stop_action이 아닌stand_up으로 해제- 표시 이름 규칙:
DisplayName/CategoryDisplayName/SourceDisplayName/AutoPlayTargetDisplayName등은 번역하지 말고 그대로 사용
15. 참고 경로 정리
| 항목 | 경로 |
|---|---|
| 실행 파일 | C:\Nexon\MabinogiMobile\MabinogiMobile_CLI.exe |
| 명령 스키마 | %LOCALAPPDATA%\MabinogiMobileCLI\CAPABILITIES.json |
| 마지막 응답 (UTF-8 원문) | %LOCALAPPDATA%\MabinogiMobileCLI\last-response.json |
| AI 스킬 정의 | %USERPROFILE%\.claude\skills\mabinogi-mobile-cli\SKILL.md |