마비노기 모바일 CLI skills .Docs

마비노기 모바일 PC 클라이언트를 자연어 / 명령줄로 제어하기 위한 CLI 도구 상세 문서

2026.09.20

#MabinogiMobile_CLI

마비노기 모바일 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 전제 조건 (둘 다 필요)

  1. 마비노기 모바일 PC 클라이언트가 실행 중일 것
  2. 게임 설정에서 "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_offAI 에이전트 옵션이 꺼짐 (미동의 또는 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_bodybody 형식/필수값 오류

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)

사용 가능한 명령은 게임 클라이언트가 동적으로 제공합니다.

  1. 조회: MabinogiMobile_CLI capabilities
  2. 저장: 출력 JSON을 %LOCALAPPDATA%\MabinogiMobileCLI\CAPABILITIES.json에 저장
  3. 참조: 명령 실행 전 항상 로컬 파일에서 Command / Description / BodyExample / Metadata 확인
  4. 갱신: 종료 코드 4(unknown_command) 발생 시 재조회 후 1회 재시도

각 명령 엔트리 구조:

json{
  "Command": "execute_crafting",
  "Description": "...",
  "BodyExample": "{\"displayName\":\"...\",\"craftCount\":1}",
  "OutputExample": "...",
  "Note": "... 동작 상세, 오류 코드, 비용, 연관 명령 ...",
  "Metadata": { "requiresConfirm": "true" }
}

8. 전체 명령 목록 (28개)

8.1 한눈에 보기

#명령분류body비용확인필요
1capabilities메타없음——
2get_current_environment상태 조회없음——
3get_my_info상태 조회없음——
4get_activity상태 조회없음——
5get_inventory상태 조회없음——
6get_currencies상태 조회없음——
7get_items아이템JSON(선택)——
8get_near_npcs주변 정보없음——
9get_near_pcs주변 정보없음——
10get_quests퀘스트없음——
11get_daily_missions미션없음——
12get_weekly_missions미션없음——
13write_chat소통원시 문자열—✅
14get_social_actions소통원시 문자열(필터)——
15get_music_scores음악원시 문자열(필터)——
16play_music_score음악JSON——
17get_instruments음악원시 문자열(필터)——
18change_instrument음악JSON——
19get_gatherable_items채집원시 문자열(필터)——
20execute_gathering채집JSON정령의 날개 5—
21get_alterable_items개조원시 문자열(필터)——
22execute_altering개조JSON정령의 날개 5—
23get_altering_works개조없음——
24complete_altering_work개조JSON——
25get_craftable_items제작원시 문자열(필터)——
26execute_crafting제작JSON정령의 날개 5—
27stop_action행동 제어없음——
28stand_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 — 자동사냥 / 이동 / 전투 / 행동 상태

가장 정보량이 많은 조회 명령으로, 현재 캐릭터가 "무엇을 하고 있는지"를 종합적으로 반환합니다.

섹션필드
autoPlayIsAutoPlaying, CanStartAutoPlay, AutoPlayTarget, AutoPlayTargetDisplayName
autoTravelIsAutoTraveling, AutoTravelRemainingPositionCount
combatStateIsDead, IsReviving, IsInCombat
dialogueIsDialoguePlaying, IsDialogueNextAvailable, IsWaitingForSelection
DungeonState(NotInDungeon/Entering/InProgress/Cleared), IsBossBattleInProgress
BattlefieldIsInBattleField
Tutorial / ScenarioIsPlaying / IsInScenario, IsSequencePlaying
PerformanceIsPlaying, InstrumentName, MusicTitle, IsCopyingAllowed, IsLoop, StartAt, TotalDurationSeconds, ElapsedSeconds, RemainingSeconds, ChannelCount
InteractionHasTarget, IsTargetAttackable, AvailableInteractionType, LastRunningInteractionType, TargetKind
ModeMainButtonState, MountPartState, SitState, IsPlayingMiniGame, IsHousingEditMode
  • AutoPlayTarget: none, quest, goddess_mission, shortcut, division_objective, recommended_activity, guide_mission
  • TargetKind: DungeonEntrance, Elevator, Fountain, CutscenePlayProp, Gimmick, Prop, Actor, None
  • MainButtonState: Hide, Stop, Combat, Interaction, Compass, ScenarioQTE, Fishing, FishingPull, Housing
  • MountPartState: None, Mounted, Dismounted, Spawned
  • SitState: 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_storage
  • Category 예시: 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: 사용

허용되는 입력

  1. 일반 채팅 메시지
  2. get_social_actions의 ChatCommands에 정확히 있는 행동 명령 (예: /전통댄스, /손인사1)
    • /춤, /인사 같은 표시 이름은 명령이 아님
  3. 표정(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는 0
  • FacilityName이 같은 작업들은 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이면:

  1. 즉시 실행하지 않습니다.
  2. 수행할 동작의 상세를 사용자에게 제시하고 명시적 승인을 요청합니다.
  3. 승인 후 동일한 파라미터로 재호출합니다.

현재 스키마 기준 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_countcraftCount 상한 초과 (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 에이전트 OFFreason 확인 → 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