<!doctype html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/layout :: head('MCP 연동')}"></head>
<body>
<nav th:replace="~{fragments/layout :: nav}"></nav>
<main class="container page-shell">
  <section class="page-heading">
    <h1>MCP 연동</h1>
    <details class="explanation-details">
      <summary>도움말</summary>
      <p>사용자 Bearer Token을 검증한 뒤 구성된 Select AI 프로파일의 Text2SQL·SHOWPROMPT와 QA 벡터 예제 SQL 조회·저장 MCP tool을 제공합니다. QA 조회는 SQL 생성 전에 few-shot 후보를 확인하는 용도이며, 저장은 검토된 예제를 축적하는 용도입니다.</p>
    </details>
  </section>

  <section th:if="${runtimeError}" class="alert alert-warning">
    <strong th:text="${runtimeError.title()}">DB 연결 설정이 필요합니다.</strong>
    <div th:text="${runtimeError.message()}">DB 연결을 확인할 수 없습니다.</div>
  </section>

  <section class="content-band">
    <h2>서비스 구성</h2>
    <div class="mcp-service-grid">
      <div class="mcp-service-item">
        <span>기본 서비스</span>
        <strong><code>/mcp/sse</code></strong>
        <small>기존 MCP client 설정과 호환됩니다.</small>
      </div>
      <div class="mcp-service-item">
        <span>Context 서비스</span>
        <strong><code>/mcp/{contextPath}/sse</code></strong>
        <small>업무/환경별 이름으로 같은 ORDS tool set을 분리 노출합니다.</small>
      </div>
      <div class="mcp-service-item">
        <span>예시</span>
        <strong><code>/mcp/vpd-live/sse</code></strong>
        <small>SSE 연결 시 message endpoint가 같은 context로 반환됩니다.</small>
      </div>
    </div>
  </section>

  <section class="content-band">
    <details class="explanation-details">
      <summary>Endpoint 상세 보기</summary>
      <h2>Endpoint</h2>
    <div class="table-responsive">
      <table class="table align-middle">
        <tbody>
        <tr>
          <th>Default SSE</th>
          <td><code>/mcp/sse</code></td>
        </tr>
        <tr>
          <th>Default Message</th>
          <td><code>/mcp/messages?sessionId={sessionId}</code></td>
        </tr>
        <tr>
          <th>Context SSE</th>
          <td><code>/mcp/{contextPath}/sse</code></td>
        </tr>
        <tr>
          <th>Context Message</th>
          <td><code>/mcp/{contextPath}/messages?sessionId={sessionId}</code></td>
        </tr>
        <tr>
          <th>Context Path</th>
          <td>영문/숫자로 시작하고 영문/숫자/<code>_</code>/<code>-</code>만 사용합니다. 예: <code>vpd</code>, <code>ords-prod</code></td>
        </tr>
        <tr>
          <th>Auth</th>
          <td><code>Authorization: Bearer &lt;사용자 Bearer Token&gt;</code> — 이 토큰 하나로 행 접근 컨텍스트를 설정합니다.</td>
        </tr>
        <tr>
          <th>Methods</th>
          <td><code>initialize</code>, <code>tools/list</code>, <code>tools/call</code></td>
        </tr>
        </tbody>
      </table>
      </div>
    </details>
  </section>

  <section class="content-band">
    <h2>Tools</h2>
    <div class="table-responsive">
      <table class="table align-middle">
        <thead>
        <tr>
          <th>Name</th>
          <th>Object</th>
          <th>ORDS Path</th>
          <th>Instruction / parameter mapping</th>
        </tr>
        </thead>
        <tbody>
        <tr th:each="tool : ${tools}">
          <td><code th:text="${tool.name()}">ords.query.admin.board_posts</code></td>
          <td th:text="${tool.displayName()}">ADMIN.BOARD_POSTS</td>
          <td><code th:text="${tool.ordsPath()}">cb-ords/cb-object-query/admin/board_posts</code></td>
          <td>
            <div th:text="${tool.description()}">ORDS 행 접근 조회 도구 설명</div>
            <small class="text-muted">
              HTTP <code>Authorization</code> → 활성 사용자 토큰 검증 · 도구별 <code>prompt</code> 또는 <code>question</code> 입력 · QA 조회 결과는 few-shot 예제 SQL 검토용
            </small>
          </td>
        </tr>
        <tr th:if="${#lists.isEmpty(tools)}">
          <td colspan="4" class="text-muted">등록된 MCP tool이 없습니다.</td>
        </tr>
        </tbody>
      </table>
    </div>
  </section>

  <section class="content-band">
    <details class="explanation-details">
      <summary>tools/call parameter 예시 보기</summary>
      <h2>tools/call Arguments</h2>
      <pre class="code-block">// qa_vector_search
{
  "question": "최신 기준 활성 사용자 수를 조회해줘.",
  "topK": 3
}

// qa_vector_store
{
  "question": "최신 기준 활성 사용자 수를 조회해줘.",
  "answerSql": "SELECT COUNT(*) AS AU_COUNT FROM ...",
  "answer": "AU_COUNT=123"
}</pre>
      <p class="form-hint">Text2SQL·SHOWPROMPT는 <code>prompt</code>를 사용하고, <code th:text="${mcp?.resolvedQaVectorSearchToolName() ?: 'oracle.select_ai.qa_vector_search'}">oracle.select_ai.qa_vector_search</code>는 few-shot 후보를 조회하며 <code th:text="${mcp?.resolvedQaVectorStoreToolName() ?: 'oracle.select_ai.qa_vector_store'}">oracle.select_ai.qa_vector_store</code>는 검토된 읽기 전용 예제 SQL을 저장합니다.</p>
    </details>
  </section>

  <section class="content-band">
    <details class="explanation-details">
      <summary>JSON-RPC 예시 보기</summary>
      <h2>JSON-RPC 예시</h2>
    <div class="probe-exchange-grid">
      <div class="probe-exchange">
        <h3>initialize</h3>
        <pre>{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {}
}</pre>
      </div>
      <div class="probe-exchange">
        <h3>tools/list</h3>
        <pre>{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/list",
  "params": {}
}</pre>
      </div>
      <div class="probe-exchange">
        <h3>tools/call</h3>
        <pre>{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "oracle.select_ai.data_text2sql",
    "arguments": {
      "prompt": "최신 기준 활성 사용자 수를 조회하는 SQL을 만들어줘."
    }
  }
}</pre>
      </div>
      </div>
    </details>
  </section>
</main>
</body>
</html>
