
    i                       U d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
  ej                  ej                  ej                          ej                  e      Zej"                  j%                  ej"                  j'                  ej"                  j)                  e            dd      Zeej"                  vrej"                  j/                  de       dd	lmZ dd
lmZmZ ddlmZ dade d<   ddZ!ddZ" ed      Z#e#jI                         ddd       Z%e#jI                         dd       Z&e#jI                         dd       Z'edk(  re#jQ                  d       yy)u   
mcp_server.py

MCP(Model Context Protocol) 서버.
아누 시스템의 지식 베이스를 Claude Desktop/Cursor에서 직접 사용할 수 있게 합니다.

통신 방식: stdio (stdout은 MCP 프로토콜 전용 - print/logging은 stderr로만)
    )annotationsN)Counter)Anycast)streamlevelz..libshybrid_search)Clientcreate_client)FastMCPzClient | Nonesupabase_clientc                 8   t         j                  j                  d      xs t         j                  j                  d      } t         j                  j                  d      xs t         j                  j                  d      }| r|st        d      t	        | |      S )uT   환경변수에서 Supabase 접속 정보를 읽어 클라이언트를 반환한다.INSURO_SUPABASE_URLINSURO_NEW_SUPABASE_URLINSURO_NEW_SERVICE_ROLE_KEY INSURO_SUPABASE_SERVICE_ROLE_KEYzGSupabase URL and service role key must be set via environment variables)osenvironget
ValueErrorr   )urlkeys     D/home/jay/workspace/.worktrees/task-2116-dev1/services/mcp_server.py_get_supabase_clientr   '   sl    
**...
/
\2::>>B[3\C
**..6
7
m2::>>Jl;mCcbccc""    c                 .    t         
t               a t         S )u9   supabase_client가 None이면 초기화 후 반환한다.)r   r    r   r   _ensure_clientr    0   s     .0r   zanu-knowledgec                j    t        | ||      }|D cg c]  }|d   |d   |d   |d   d c}S c c}w )u}  아누 지식 베이스에서 관련 문서를 검색합니다.

    Args:
        query: 검색할 질문 또는 키워드
        source: 특정 소스로 검색 범위 제한 (예: 'insurance_docs'). None이면 전체 검색
        limit: 반환할 최대 결과 수 (기본값: 5)

    Returns:
        검색 결과 목록. 각 항목: content, title, source, similarity
    )querylimitsource_filtercontenttitlesource
similarity)r%   r&   r'   r(   r
   )r"   r'   r#   resultsrs        r   search_knowledger+   D   sT     %uFKG   |wZkL/		
  s   0c                   t               }|j                  d      j                  d      j                  d|       j	                         }t        t        t        t        t        f      |j                  xs g       }|sy|d   }|d   |j                  dd      |j                  dd      |j                  d	d      |j                  d
i       dS )u   특정 문서의 전체 내용을 조회합니다.

    Args:
        document_id: 조회할 문서의 ID

    Returns:
        문서 상세 정보: id, title, content, source, metadata. 존재하지 않으면 None
    knowledge_documents*idNr   r&    r%   r'   metadata)r/   r&   r%   r'   r1   )r    tableselecteqexecuter   listdictstrr   datar   )document_idclientresponserowsdocs        r   get_documentr?   a   s     F||1299#>AA$T\\^HT#s(^$hmm&9r:D
q'C$i"%779b)''(B'GGJ+ r   c                    t               } | j                  d      j                  d      j                         }t	        t
        t        t        t        f      |j                  xs g       }|sg S |d   }d|v r%t        |d       D cg c]  }|d   |d   d c}S t        d |D              }t        |j                               D cg c]
  \  }}||d c}}S c c}w c c}}w )	u   지식 베이스에 등록된 소스 목록과 각 소스의 문서 수를 조회합니다.

    Returns:
        소스 목록. 각 항목: source (소스명), document_count (문서 수)
    r-   r'   r   document_countc                    t        | d         S )Nr'   r8   )xs    r   <lambda>zlist_sources.<locals>.<lambda>   s    #ak2B r   )r   )r'   rA   c              3  8   K   | ]  }t        |d            yw)r'   NrC   ).0rows     r   	<genexpr>zlist_sources.<locals>.<genexpr>   s     ?3CH.?s   )r    r2   r3   r5   r   r6   r7   r8   r   r9   sortedr   items)r;   r<   r=   	first_rowrH   source_countsr'   counts           r   list_sourcesrO      s     F||1299(CKKMHT#s(^$hmm&9r:D	 QI9$ d(BC
 8}<L8MN
 	

 ?$??MMSTaTgTgTiMjkMFEv7kk
 ls   CC#__main__stdio)	transport)returnr   )N   )r"   r8   r'   z
str | Noner#   intrS   list[dict[str, Any]])r:   r8   rS   zdict[str, Any] | None)rS   rV   ))__doc__
__future__r   loggingr   syscollectionsr   typingr   r   basicConfigstderrINFO	getLogger__name__loggerpathjoindirnameabspath__file__	libs_pathinsertsearchr   supabaser   r   mcp.server.fastmcpr   r   __annotations__r   r    mcptoolr+   r?   rO   runr   r   r   <module>rq      s4   #  	 
     3::W\\ :			8	$ GGLL)BCT6R	CHHHHOOAy!   * & "& %# o  8  : l l: zGGgG r   