MCP 명령어
GeoOmni는 LLM 에이전트(Claude Code, Codex CLI 등)가 앱을 제어할 수 있는 MCP(Model Context Protocol) 서버를 제공합니다.
이 문서는 전량 목록이 아닙니다
앱에 등록된 명령은 약 290개이며 기능 추가와 함께 계속 늘어납니다. 이 문서는 그중 모든 작업의 기반이 되는 공통 명령 23개만 상세히 다룹니다.
전체 목록은 항상 앱에서 직접 조회하세요 — 문서에 박아둔 목록은 반드시 낡습니다.
도메인별 담당 영역은 아래 명령 도메인 개관 절을 참고하세요.
연결 정보
| 항목 | 값 |
|---|---|
| 프로토콜 | 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"} |
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만 받습니다. 표정 계열 페이지로는 갈 수 없습니다.
nav.select
태그로 네비게이션 항목을 선택하고 콘텐츠 스택까지 전환합니다.
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
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"}}}
nav.selectChild
부모 카테고리와 자식 태그로 항목을 선택합니다. 실제 클릭 경로를 재현하므로 목록 선택까지 함께 반영됩니다.
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
parent |
string | 예 | camera / gcp / image / model / orientation |
child |
string | 예 | 자식 태그 (예: orientation → io / relori / absori) |
nav.getState
현재 네비게이션 상태와 선택 가능한 태그 목록을 반환합니다. 태그 목록은 NavigationView 등록분에서 동적으로 산출되므로, 자동화에서 페이지 태그를 하드코딩하는 대신 이 명령으로 조회하는 것을 권장합니다.
| 파라미터 | 없음 |
|---|---|
| 응답 | {"currentStackIndex": 10, "stackCount": 14, "currentPageTag": "relori", "availableTags": [...]} |
상호표정과 절대표정 구분
두 작업은 같은 워크스페이스 위젯을 작업 모드만 바꿔 공유하므로
콘텐츠 스택 인덱스가 동일합니다(예: 10). currentPageTag 는 작업 모드까지
반영해 relori / absori 로 구분되므로, 진입 검증에는 인덱스가 아니라
이 값을 사용하세요. model.getViewportState 의 workMode
(relative / absolute)로 교차 확인할 수도 있습니다.
nav.selectPage
콘텐츠 스택 인덱스로 페이지를 전환합니다 (구형 경로).
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
page |
string | 예 | 페이지 이름 |
| 이름 | 인덱스 | 페이지 |
|---|---|---|
dashboard |
0 | 대시보드 |
documents / mdi |
1 | MDI 문서 편집기 |
coordinate |
2 | 좌표계 설정 |
settings |
3 | 전역 설정 |
그 외 이름을 넘기면 알 수 없는 페이지 오류가 반환됩니다.
nav.getCurrentPage
현재 활성 페이지를 반환합니다.
| 파라미터 | 없음 |
|---|---|
| 응답 | {"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 로 조회하세요.