[STK6-04] 주문·계좌·보유종목 MCP Tool

작업 내용 (설계 의도)

변경 사항

presentation/ai/OrderMcpTools.kt를 신규 생성한다. Phase 5 주문·계좌·보유 종목 UseCase를 @Tool로 래핑한다. Phase 5 구현 완료 전까지 @ConditionalOnProperty(name = "features.order-tool.enabled", havingValue = "true")로 비활성화한다.

선행 티켓: STK6-01 외부 의존: Phase 5 주문 UseCase 구현 완료 (별도 타임라인)

다이어그램

처리 흐름

sequenceDiagram
    participant LLM as Claude
    participant O as OrderMcpTools
    participant UC as OrderUseCases
    LLM->>O: placeOrder("005930", "BUY", 10, "MARKET", null)
    O->>UC: PlaceOrderUseCase.execute(command)
    UC-->>O: OrderResponse
    LLM->>O: getHoldings(accountId)
    O->>UC: GetHoldingsUseCase.execute(accountId)
    UC-->>O: List<HoldingResponse>

클래스 의존

flowchart LR
    OrderMcpTools -->|delegates| PlaceOrderUseCase
    OrderMcpTools -->|delegates| CancelOrderUseCase
    OrderMcpTools -->|delegates| ModifyOrderUseCase
    OrderMcpTools -->|delegates| GetAccountsUseCase
    OrderMcpTools -->|delegates| GetHoldingsUseCase
    OrderMcpTools -->|delegates| GetTradeHistoryUseCase

테스트 케이스

  • features.order-tool.enabled=falseOrderMcpTools 빈이 컨텍스트에 없다.
  • placeOrder("005930", "BUY", 10, "MARKET", null) 호출 시 PlaceOrderUseCase에 위임한다.
  • placeOrder에 수량 0 전달 시 명확한 오류 메시지를 반환한다.
  • cancelOrder에 존재하지 않는 주문 ID 전달 시 예외를 메시지로 래핑 반환한다.
  • getHoldings 결과가 빈 목록인 경우도 정상 응답한다.