콘텐츠로 이동

MCP 명령어

GeoOmni는 LLM 에이전트(Claude Code, Codex CLI 등)가 앱을 제어할 수 있는 MCP(Model Context Protocol) 서버를 제공합니다.

이 문서는 전량 목록이 아닙니다

앱에 등록된 명령은 약 290개이며 기능 추가와 함께 계속 늘어납니다. 이 문서는 그중 모든 작업의 기반이 되는 공통 명령 23개만 상세히 다룹니다.

전체 목록은 항상 앱에서 직접 조회하세요 — 문서에 박아둔 목록은 반드시 낡습니다.

result = mcp_call("system.listCommands")   # 등록된 전 명령 + 설명 반환

도메인별 담당 영역은 아래 명령 도메인 개관 절을 참고하세요.

연결 정보

항목
프로토콜 TCP 소켓 + JSON-RPC 2.0
포트 9234 (기본값, 설정 > MCP에서 변경 가능)
엔드포인트 localhost:9234
메시지 구분 줄바꿈 (\n)
최대 메시지 크기 64KB
최대 클라이언트 5 (설정 변경 가능)

연결 예시 (Python)

import socket, json

def mcp_call(command, arguments=None):
    sock = socket.create_connection(("localhost", 9234))
    req = {
        "jsonrpc": "2.0", "id": 1,
        "method": "tools/call",
        "params": {"name": command, "arguments": arguments or {}}
    }
    sock.sendall((json.dumps(req) + "\n").encode())
    resp = json.loads(sock.recv(65536).decode())
    sock.close()
    return resp

# 예: 대시보드 페이지로 전환
result = mcp_call("nav.selectPage", {"page": "dashboard"})
print(result)

MCP 표준 메서드

메서드 설명
initialize 세션 초기화
ping 연결 확인 (pong 응답)
tools/list 등록된 명령 목록 반환
tools/call 명령 실행

명령 도메인 개관

등록된 명령은 <도메인>.<동작> 형태입니다. 아래는 도메인별 규모와 담당 영역으로, 개수는 기능 추가에 따라 변합니다 — 정확한 현재값은 system.listCommands 로 확인하세요.

도메인 담당 영역
io 내부표정 — 지표(fiducial) 관측, 일괄 처리, 스케일 검증
multiview 다중 뷰어 — 레이아웃/슬롯/분할/프리셋/자동 배치
model 모델·표정 — 타이포인트, 상호표정, 절대표정, GCP 관측, EOP 직접표정·부점 지상좌표(solveEopDirect/getGroundPoint), 도화점(addPlottedPoint 등), EOP 품질 점검(evaluateEop/evaluateEopGcp/evaluateEopAdjacent/compareEop, 블록 일괄 evaluateEopBlock)
image 이미지 열기·목록·피라미드
view 뷰포트 — 줌/팬/분할/편집 상태
control GCP 관리 — 추가/수정/삭제/가져오기/내보내기/가중치, 그룹(파일) 목록·필터(listGcpGroups/setGcpGroupFilter)
ui 위젯 트리 조회·클릭·값 설정·창 캡처
at 항공삼각측량 — EOP 검출·로드, 스테레오 쌍 탐지, 배치 계획, 교차 스트립 부합 검사(evaluateEopCrossStrip — 횡중복 이음새), GCP 번들조정(collectGcpObservations/solveBundle/getBundleResult — 이미지별 GCP 관측 집계 + EO·지상점 동시 조정, Full=XYZ 고정·Horizontal=Z 조정·Vertical=XY 조정·CheckPoint=검증, includeTiePoints 로 타이포인트 연결점 투입, eoPriorPosSigmaM/eoPriorZSigmaM/eoPriorRotSigmaDeg 로 GNSS/IMU EOP 를 가중 관측 구속 — 평탄 지형 블록의 ω↔Y·φ↔X 준-영공간 데이텀 고정, Z 별도 σ 는 GNSS Z 계통 편의 완화용)
camera 카메라 관리
diagnostics 진단 스냅샷·오버레이·캡처
project · coordinate · app 프로젝트 / 좌표계 / 앱 설정
viewer · nav · dashboard 뷰어 모드 / 네비게이션 / 대시보드
mouse · keyboard 입력 시뮬레이션
minimap · sync · stereo · prefetch · myPreset 미니맵 / 뷰 동기화 / 스테레오 합성 / 프리페치 / 사용자 프리셋
upload · tolerance · settings · indicator · vulkan · system 업로드 / 허용오차 / 설정 / 상태 인디케이터 / GPU / 시스템

자동 검증에 쓸 때

상태 변경 명령(set* / toggle* / add*)에는 대응하는 읽기 명령 (get* / list* / getState)이 함께 제공됩니다. 변경 후 반드시 읽기 명령으로 결과를 확인하는 것이 회귀 테스트의 기본 패턴입니다.


시스템 명령 (3개)

ping

연결 상태를 확인합니다.

항목
메서드 ping (tools/call이 아닌 직접 호출)
파라미터 없음
응답 {"status": "pong"}
{"jsonrpc":"2.0", "id":1, "method":"ping", "params":{}}

system.getVersion

앱 버전 정보를 반환합니다.

항목
파라미터 없음
응답 {"appVersion": "...", "qtVersion": "6.x.x"}

system.listCommands

등록된 모든 MCP 명령 목록을 반환합니다.

항목
파라미터 없음
응답 {"commands": [{"name": "...", "description": "..."}]}

UI 위젯 명령 (6개)

위젯 명령은 Qt 위젯 트리를 직접 조회·조작합니다. 대화상자 자동화, UI 테스트에 활용됩니다.

ui.getWidgetTree

활성 윈도우의 Qt 위젯 트리를 반환합니다.

파라미터 타입 필수 설명
parent string 아니요 특정 위젯 하위만 조회

응답: 재귀적 위젯 트리 (depth 최대 10)

ui.findWidget

name/class/text로 위젯을 검색합니다. 응답에 screenRect(전역 화면 좌표) 포함.

파라미터 타입 필수 설명
name string 하나 이상 objectName 부분 매칭
class string 하나 이상 클래스명 정확 매칭
text string 하나 이상 표시 텍스트 매칭
// 좌표계 스핀박스 찾기
{"jsonrpc":"2.0", "id":1, "method":"tools/call",
 "params":{"name":"ui.findWidget", "arguments":{"name":"coordSpin"}}}

// 응답:
{"name": "coordSpin", "class": "QSpinBox", "visible": true,
 "screenRect": {"x":400, "y":300, "w":120, "h":30}}

ui.getWidgetValue

위젯의 현재 값을 반환합니다. QLineEdit, QCheckBox, QComboBox, QSpinBox, QTabWidget 지원.

파라미터 타입 필수 설명
name string 위젯 objectName

ui.setWidgetValue

위젯에 값을 설정합니다. QLineEdit, QCheckBox, QComboBox, QSpinBox, QTabWidget 지원.

파라미터 타입 필수 설명
name string 위젯 objectName
value any 설정할 값
// 좌표계 스핀박스에 EPSG 5186 설정
{"jsonrpc":"2.0", "id":1, "method":"tools/call",
 "params":{"name":"ui.setWidgetValue", "arguments":{"name":"coordSpin", "value":"5186"}}}

ui.clickWidget

지정한 objectName의 위젯을 클릭합니다.

파라미터 타입 필수 설명
name string 위젯 objectName
button string 아니요 left/right/middle (기본: left)

QAbstractButton은 click() 직접 호출, 그 외는 QMouseEvent 시뮬레이션.

ui.captureWindow

메인 창을 캡처하여 이미지로 저장합니다.

파라미터 없음
응답 {"path": "D:/Devs/Dev/sandbox/capture_YYYYMMDD_HHMMSS.jpg"}
  • JPG 우선, 실패 시 PNG 폴백
  • 최대 50장 누적, 초과 시 오래된 파일 자동 삭제
  • 저장 경로: sandbox/capture_*.jpg

마우스 명령 (3개) — Windows 전용

Win32 SendInput API 기반 마우스 자동화 명령입니다.

mouse.getPosition

현재 마우스 커서의 화면 좌표를 반환합니다.

파라미터 없음
응답 {"x": 500, "y": 300}

mouse.move

마우스 커서를 지정한 화면 좌표로 이동합니다.

파라미터 타입 필수 설명
x int 화면 X 좌표
y int 화면 Y 좌표

mouse.click

지정한 좌표에서 마우스 클릭을 수행합니다.

파라미터 타입 필수 설명
x int 화면 X 좌표
y int 화면 Y 좌표
button string 아니요 left/right/middle (기본: left)

키보드 입력 명령 (2개) — Windows 전용

Win32 SendInput 기반 키보드 자동화 명령입니다.

keyboard.type

유니코드 텍스트를 키보드 입력으로 주입합니다. KEYEVENTF_UNICODE로 IME를 우회하므로 한글도 지원됩니다.

파라미터 타입 필수 설명
text string 입력할 텍스트
delay int 아니요 키 간 지연 ms (기본: 10)
{"jsonrpc":"2.0", "id":1, "method":"tools/call",
 "params":{"name":"keyboard.type", "arguments":{"text":"테스트 프로젝트"}}}

keyboard.sendKey

특수 키를 전송합니다.

파라미터 타입 필수 설명
key string 키 이름

지원 키 목록:

키 이름 설명
enter Enter 키
tab Tab 키
escape / esc Escape 키
backspace Backspace 키
delete Delete 키
up / down / left / right 방향키
home / end Home / End
space 스페이스
pageup / pagedown Page Up / Down
insert Insert 키
f1 ~ f12 기능키
ctrl+a ~ ctrl+z Ctrl 조합키

네비게이션 명령

앱의 메인 페이지를 전환합니다. 용도가 다른 두 계열이 공존하므로 구분해서 쓰세요.

어느 것을 써야 하나

  • nav.select (태그 기반) — 카메라·GCP·이미지·모델·표정 등 모든 페이지에 도달합니다. 새 자동화는 이쪽을 쓰세요.
  • nav.selectPage (인덱스 기반) — 초기 4페이지 시절의 명령으로, dashboard / documents / coordinate / settings 만 받습니다. 표정 계열 페이지로는 갈 수 없습니다.

태그로 네비게이션 항목을 선택하고 콘텐츠 스택까지 전환합니다.

파라미터 타입 필수 설명
tag string 네비게이션 태그

태그 목록:

태그 페이지
dashboard 대시보드
coordinate 좌표계 설정
camera 카메라 관리
gcp GCP 관리
image 이미지 관리
model 모델 목록
orientation 표정 개요
io 내부표정 워크스페이스
relori 상호표정 워크스페이스
absori 절대표정
settings 전역 설정

io / relori / absori표정 부모의 자식 항목이며, 위 태그로 직접 전환할 수도 있습니다.

{"jsonrpc":"2.0", "id":1, "method":"tools/call",
 "params":{"name":"nav.select", "arguments":{"tag":"relori"}}}

부모 카테고리와 자식 태그로 항목을 선택합니다. 실제 클릭 경로를 재현하므로 목록 선택까지 함께 반영됩니다.

파라미터 타입 필수 설명
parent string camera / gcp / image / model / orientation
child string 자식 태그 (예: orientationio / relori / absori)

현재 네비게이션 상태와 선택 가능한 태그 목록을 반환합니다. 태그 목록은 NavigationView 등록분에서 동적으로 산출되므로, 자동화에서 페이지 태그를 하드코딩하는 대신 이 명령으로 조회하는 것을 권장합니다.

파라미터 없음
응답 {"currentStackIndex": 10, "stackCount": 14, "currentPageTag": "relori", "availableTags": [...]}

상호표정과 절대표정 구분

두 작업은 같은 워크스페이스 위젯을 작업 모드만 바꿔 공유하므로 콘텐츠 스택 인덱스가 동일합니다(예: 10). currentPageTag 는 작업 모드까지 반영해 relori / absori 로 구분되므로, 진입 검증에는 인덱스가 아니라 이 값을 사용하세요. model.getViewportStateworkMode (relative / absolute)로 교차 확인할 수도 있습니다.

콘텐츠 스택 인덱스로 페이지를 전환합니다 (구형 경로).

파라미터 타입 필수 설명
page string 페이지 이름
이름 인덱스 페이지
dashboard 0 대시보드
documents / mdi 1 MDI 문서 편집기
coordinate 2 좌표계 설정
settings 3 전역 설정

그 외 이름을 넘기면 알 수 없는 페이지 오류가 반환됩니다.

현재 활성 페이지를 반환합니다.

파라미터 없음
응답 {"page": "dashboard", "index": 0, "totalPages": 14}

앱 설정 명령 (4개)

app.getTheme

현재 테마 상태를 반환합니다.

파라미터 없음
응답 {"dark": true, "themeProgress": 1.0}

themeProgress는 테마 전환 애니메이션 진행도(0.0~1.0)입니다.

app.setTheme

다크/라이트 테마를 전환합니다.

파라미터 타입 필수 설명
dark bool true=다크, false=라이트
// 다크 모드로 전환
{"jsonrpc":"2.0", "id":1, "method":"tools/call",
 "params":{"name":"app.setTheme", "arguments":{"dark": true}}}

app.getEpsgCode

현재 설정된 EPSG 코드를 반환합니다.

파라미터 없음
응답 {"code": 5186}

app.setEpsgCode

좌표계 EPSG 코드를 설정합니다.

파라미터 타입 필수 설명
code int EPSG 코드 (양수)
{"jsonrpc":"2.0", "id":1, "method":"tools/call",
 "params":{"name":"app.setEpsgCode", "arguments":{"code": 5186}}}

위젯 자동화 워크플로우

MCP 명령을 조합하여 UI 자동화 시나리오를 구현할 수 있습니다.

예시: 좌표계 설정 자동화

import socket, json, time

def call(name, args=None):
    sock = socket.create_connection(("localhost", 9234))
    req = {"jsonrpc":"2.0", "id":1, "method":"tools/call",
           "params":{"name":name, "arguments":args or {}}}
    sock.sendall((json.dumps(req) + "\n").encode())
    resp = json.loads(sock.recv(65536).decode())
    sock.close()
    return resp

# 1. 좌표계 페이지로 이동
call("nav.selectPage", {"page": "coordinate"})
time.sleep(0.5)

# 2. EPSG 코드 설정
call("app.setEpsgCode", {"code": 5186})
time.sleep(0.5)

# 3. 화면 캡처
result = call("ui.captureWindow")
print("캡처:", result)

예시: 대화상자 자동화 (findWidget + click + type)

# 1. 위젯 찾기
result = call("ui.findWidget", {"name": "projectNameEdit"})
rect = result["result"]["content"][0]["text"]  # screenRect 포함

# 2. 위젯 클릭
call("ui.clickWidget", {"name": "projectNameEdit"})

# 3. 텍스트 입력
call("keyboard.type", {"text": "새 프로젝트"})

# 4. 확인 버튼 클릭
call("ui.clickWidget", {"name": "btnOk"})

명령 요약 표

# 명령 ID 카테고리 설명
1 ping 시스템 연결 확인
2 system.getVersion 시스템 버전 조회
3 system.listCommands 시스템 명령 목록
4 ui.getWidgetTree UI 위젯 위젯 트리 조회
5 ui.findWidget UI 위젯 위젯 검색
6 ui.getWidgetValue UI 위젯 위젯 값 조회
7 ui.setWidgetValue UI 위젯 위젯 값 설정
8 ui.clickWidget UI 위젯 위젯 클릭
9 ui.captureWindow UI 위젯 화면 캡처
10 mouse.getPosition 마우스 커서 위치 조회
11 mouse.move 마우스 커서 이동
12 mouse.click 마우스 클릭
13 keyboard.type 키보드 텍스트 입력
14 keyboard.sendKey 키보드 특수 키 전송
15 nav.select 네비게이션 태그로 페이지 전환 (전 페이지)
16 nav.selectChild 네비게이션 부모+자식 항목 선택
17 nav.getState 네비게이션 스택 상태 + 태그 목록 조회
18 nav.selectPage 네비게이션 인덱스로 페이지 전환 (구형, 4페이지)
19 nav.getCurrentPage 네비게이션 현재 페이지 조회
20 app.getTheme 앱 설정 테마 조회
21 app.setTheme 앱 설정 테마 변경
22 app.getEpsgCode 앱 설정 EPSG 코드 조회
23 app.setEpsgCode 앱 설정 EPSG 코드 설정

위 23개는 전체의 일부입니다. 표정·내부표정·다중 뷰어 등 도메인 명령은 system.listCommands 로 조회하세요.