
    PiY                         d Z ddlZddlZddlZddlZdeddfdZdededdfdZ	defd	Z
d
ededededeeef   f
dZddZddZddZdeddfdZddZedk(  r e        yy)u`   
OpenClaw MCP Server
MCP stdio 프로토콜 (JSON-RPC 2.0, protocolVersion '2024-11-05') 구현
    Nresponsereturnc                     t        j                  | d      }t        j                  j	                  |dz          t        j                  j                          y)u#   stdout으로 JSON-RPC 응답 전송Fensure_ascii
N)jsondumpssysstdoutwriteflush)r   lines     H/home/jay/workspace/.worktrees/task-2117-dev1/mcp/openclaw-mcp-server.pysend_responser      s8    ::hU3DJJTD[!JJ    codemessagec                 (    t        d| ||dd       y)u   JSON-RPC 에러 응답 전송2.0)r   r   )jsonrpciderrorNr   )req_idr   r   s      r   
send_errorr      s    e6TV]<^_`r   c                     t        | t              r=dD ]8  }|| v s| |   }t        |t              r|c S t        j                  |d      c S  t        j                  | d      S )u]   openclaw --json 응답에서 텍스트 추출. 우선순위: response, text, message, content)r   textr   contentFr   )
isinstancedictstrr	   r
   )datakeyvalues      r   extract_textr&      s^    $= 	=Cd{S	eS) Lzz%e<<	= ::d//r   agent_idtimeoutcurrent_depthc                 r   ddd| d|dg}t         j                  j                         }t        |dz         |d<   	 t	        j
                  |dd||	      }|j                  j                         }|j                  d
k7  r4|j                  j                         }|r|n|}	dd|j                   d|	 fS |sy	 t        j                  |      }
t        |
      }d|fS # t        j                  $ r d|fcY S w xY w# t        j                  $ r dd| dfcY S t        $ r Y yt         $ r}dd| fcY d}~S d}~ww xY w)u   
    openclaw agent --agent <id> -m <msg> --json 실행 후 (is_error, text) 반환
    timeout: 초 단위 (subprocess timeout)
    current_depth: 현재 호출 깊이 (subprocess 환경변수에 current_depth+1 로 전달)
    openclawagentz--agentz-mz--json   OPENCLAW_MCP_DEPTHT)capture_outputr   r(   envr   zopenclaw exited with code z: )Tzopenclaw returned empty outputFzopenclaw timed out after z seconds)Tzopenclaw command not foundz#Unexpected error running openclaw: N)osenvironcopyr"   
subprocessrunr   strip
returncodestderrr	   loadsr&   JSONDecodeErrorTimeoutExpiredFileNotFoundError	Exception)r'   r   r(   r)   cmd	child_envresult
raw_output
stderr_msgerror_detailparsedr   excs                r   run_openclawrF   &   s[    w	8T7H
MC 

!I&)-!*;&<I"#ADtWZcd]]((*
 !,,.J)3:L5f6G6G5H<.YYY9	%ZZ
+F'D$;## 	%*$$	% $$ C0	BBB 21 A:3%@@@AsN   A6C6 1C6 5#C C30C6 2C33C6 6D6D6D6%D1+D61D6c                 4    t        d| dddddi idd       y )	Nr   z
2024-11-05zopenclaw-mcp-serverz1.1.0)nameversiontools)protocolVersion
serverInfocapabilitiesr   r   r@   r   r   _paramss     r   handle_initializerQ   P   s,    #/'<Q!("	

r   c                 T    t        d| ddddddddd	dd
ddddgddgid       y )Nr   rJ   openclaw_agentuG   OpenClaw 에이전트에 메시지를 보내고 응답을 받습니다.objectstringu)   에이전트에 보낼 메시지 (필수))typedescriptionu+   에이전트 ID (선택, 기본값: "main")numberu   타임아웃(초, 선택))r   r,   r(   r   )rV   
propertiesrequired)rH   rW   inputSchemarN   r   rO   s     r   handle_tools_listr\   ^   s\     0'p$,4<Mx+y2:Kx)y4<Mh+i+
 *3(	
r   c           
      .   |j                  dd      }|dk7  rt        | dd|        y 	 t        t        j                  j                  dd            }	 t        t        j                  j                  d	d
            }||k\  rt        d| dd| d| ddgddd       y |j                  d      xs |j                  d      xs i }|j                  d      }|st        d| dddgddd       y |j                  dd      }|j                  d      }|	 t        |      dz   }	nd}	t        |||	|      \  }
}t        d| d|dg|
dd       y # t
        t        f$ r d}Y w xY w# t
        t        f$ r d}Y w xY w# t
        t        f$ r d}	Y jw xY w)NrH    rS   駀zUnknown tool: r.   0r   OPENCLAW_MCP_MAX_DEPTH1r-   r   r   z&Error: recursive call detected (depth=z, max=zC). openclaw_agent cannot be called from within an openclaw session.)rV   r   T)r   isErrorrN   	argumentsinputr   z&Error: 'message' parameter is requiredr,   mainr(   g      $@g     H@)
getr   intr1   r2   	TypeError
ValueErrorr   floatrF   )r   params	tool_namer)   	max_depthrd   r   r'   raw_timeoutsubprocess_timeoutis_errorr   s               r   handle_tools_callrr   x   s   

62&I$$66^I;#?@BJJNN+?EF

'?EF	 	!  %+"HW]^g]h ic !c   $	
$ 	 

;'D6::g+>D"I mmI&G )/9a bc#		
 	}}Wf-H --	*K	(!&{!3d!: $!(G5GWNHdY]@^?_lt3uv{ z" 
 z" 	b :& 	(!'	(s5   )E )E) F  E&%E&)E=<E= FFraw_linec                 d   	 t        j                  |       }|j                  d      }|j                  dd      }|y|j                  d      xs i }|dk(  rt	        ||       y|dk(  rt        ||       y|dk(  rt        ||       yt        |d	d
|        y# t         j                  $ r Y yw xY w)u    단일 JSON-RPC 메시지 처리Nr   methodr^   rl   
initializez
tools/listz
tools/callr_   zMethod not found: )r	   r9   r:   rg   rQ   r\   rr   r   )rs   msgr   ru   rl   s        r   process_messagerx      s    jj"
 WWT]FWWXr"F ~WWX$"F&&)	<	&&)	<	&&)66%7x#@A)  s   B B/.B/c                  j    t         j                  D ]   } | j                         }|st        |       " y )N)r   stdinr6   rx   )rs   strippeds     r   rf   rf      s/    II ">>#!	"r   __main__)r   N)__doc__r	   r1   r4   r   r!   r   rh   r"   r   r&   rk   tupleboolrF   rQ   r\   rr   rx   rf   __name__ r   r   <module>r      s   
  	  
D T aS a3 a4 a

0# 
0'A3 'A 'Au 'AS 'AUZ[_ad[dUe 'AT4HVBc Bd B6" zF r   