ux #463: streamline MCP reasoning flow

This commit is contained in:
devmrko
2026-06-25 22:10:21 +09:00
parent 8fddf1033e
commit 1f924f67de
5 changed files with 152 additions and 18 deletions

View File

@@ -13,11 +13,14 @@
<span>Tool: <code th:text="${result.toolName()}">tool</code></span>
<span>ORDS Status: <strong th:text="${result.probeResult().status()}">SUCCESS</strong></span>
<span>Rows: <strong th:text="${result.probeResult().rowCount()}">0</strong></span>
<span th:if="${!#lists.isEmpty(result.probeResult().maskedColumns())}">
Masked: <code th:text="${#strings.listJoin(result.probeResult().maskedColumns(), ', ')}"></code>
</span>
</div>
<section class="ai-answer">
<h3>Answer</h3>
<pre th:text="${result.answer()}">answer</pre>
<h3>요약 및 판단</h3>
<div class="markdown-view" data-markdown-view th:text="${result.answer()}">answer</div>
</section>
<div class="probe-exchange-grid">

View File

@@ -43,23 +43,23 @@
<label class="span-2">
질문
<textarea class="form-control" id="mcp-reasoning-question" name="question" rows="3"
placeholder="비워도 기본 질문으로 실행됩니다."></textarea>
placeholder="비워도 조회 행, NULL 처리, 권한 범위, 다음 조치를 요약합니다."></textarea>
</label>
<div class="question-presets span-2" aria-label="질문 예시">
<button class="btn rw-btn-secondary question-preset" type="button"
data-question="이 토큰으로 조회 가능한 행 수 주요 값을 먼저 요약하고, 어떤 VPD 조건이 적용된 결과인지 추정해줘.">
조회 결과 요약
data-question="요약부터 작성해줘. 이 토큰으로 조회 가능한 행 수, 주요 식별자, NULL 처리 여부, 권한 범위를 표로 정리하고 상세 근거를 이어서 설명해줘.">
기본 분석
</button>
<button class="btn rw-btn-secondary question-preset" type="button"
data-question="반환된 행에서 NULL 처리된 컬럼이 있는지 확인하고, 민감 컬럼 권한 관점에서 설명해줘.">
NULL 처리 확인
data-question="반환된 컬럼과 maskedColumns를 기준으로 민감 컬럼이 NULL 처리 또는 미노출됐는지 먼저 요약하고, role/permission 설정에서 확인할 항목을 정리해줘.">
민감 컬럼 점검
</button>
<button class="btn rw-btn-secondary question-preset" type="button"
data-question="이 토큰이 전체 조회 권한인지, 부서/본인/조건 제한 권한인지 결과 증거를 기준으로 판단해줘.">
data-question="반환된 행 수와 행의 부서/사번 값을 근거로 이 토큰이 전체 조회, 부서 제한, 본인 제한, 조건 제한 중 어디에 가까운지 판단해줘. 추정이면 추정이라고 표시해줘.">
권한 범위 판단
</button>
<button class="btn rw-btn-secondary question-preset" type="button"
data-question="운영자가 확인해야 할 이상 징후나 설정 불일치 가능성을 짧게 정리해줘.">
data-question="운영자가 확인해야 할 이상 징후를 먼저 bullet로 요약하고, ORDS path, VPD policy, permission rule, token 상태 중 어디를 봐야 하는지 제시해줘.">
운영 점검 요약
</button>
</div>
@@ -87,7 +87,7 @@
<td>
<button class="btn btn-sm rw-btn-secondary reasoning-object-preset"
type="button"
th:attr="data-object-id=${tool.objectId()},data-question=${tool.displayName() + '에서 이 토큰으로 조회 가능한 행 NULL 처리 컬럼을 요약해줘.'}">
th:attr="data-object-id=${tool.objectId()},data-question=${tool.displayName() + '에서 이 토큰으로 조회 가능한 행, NULL 처리 컬럼, 권한 범위를 요약 먼저 표로 정리해줘.'}">
선택
</button>
</td>
@@ -104,7 +104,7 @@
</section>
<section id="mcp-result" class="content-band">
<div class="text-muted">Reasoning 결과가 여기에 표시됩니다.</div>
<div class="text-muted">실행하면 ORDS 호출 결과, 모델 요약, request/response 증거가 한 번에 표시됩니다.</div>
</section>
</main>
<script>

View File

@@ -10,6 +10,10 @@
</div>
<section class="content-band">
<div class="section-heading">
<h2>ORDS 호출</h2>
<a class="btn btn-sm rw-btn-secondary" href="/mcp-reasoning">MCP Reasoning으로 해석</a>
</div>
<form hx-post="/probe" hx-target="#probe-result" hx-swap="innerHTML" class="form-grid">
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
<label>