From 93257b1bc6ffcf45ad1133f6e515677ea404824c Mon Sep 17 00:00:00 2001 From: jade Date: Thu, 13 Aug 2026 17:56:37 +0900 Subject: [PATCH] feat: add module filter to tester UI and moduleName to ToolMetadata --- .../src/main/resources/static/tester.html | 30 ++++++++++++++----- .../lib/mcp/ToolRegistryHeartbeatSender.java | 4 +++ .../shinhanlife/dap/mcc/dto/ToolMetadata.java | 3 ++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/dap-gateway/src/main/resources/static/tester.html b/dap-gateway/src/main/resources/static/tester.html index db00f667..137af8f4 100644 --- a/dap-gateway/src/main/resources/static/tester.html +++ b/dap-gateway/src/main/resources/static/tester.html @@ -112,6 +112,9 @@
+ @@ -151,6 +154,7 @@ + @@ -285,6 +289,7 @@ const savedPayloads = JSON.parse(localStorage.getItem('mcp_tester_payloads') || '{}'); const categories = new Set(); + const modules = new Set(); allTools.forEach(t => { t._customPayload = savedPayloads[t.name] || null; t._lastStatus = 'NOT RUN'; @@ -292,19 +297,26 @@ t._latency = 0; t._responseData = null; categories.add(t.categoryKey || 'oth'); + if (t.moduleName) { + modules.add(t.moduleName.replace('dap-was-', '')); + } }); const catSelect = document.getElementById('categoryFilter'); + catSelect.innerHTML = ''; Array.from(categories).sort().forEach(cat => { - const opt = document.createElement('option'); - opt.value = cat; - opt.textContent = cat.toUpperCase(); - catSelect.appendChild(opt); + catSelect.innerHTML += ``; + }); + + const modSelect = document.getElementById('moduleFilter'); + modSelect.innerHTML = ''; + Array.from(modules).sort().forEach(mod => { + modSelect.innerHTML += ``; }); applyFilters(); } catch (error) { - document.getElementById('toolsTbody').innerHTML = ''; + document.getElementById('toolsTbody').innerHTML = ''; } } @@ -341,11 +353,14 @@ function applyFilters() { const search = document.getElementById('searchInput').value.toLowerCase(); const category = document.getElementById('categoryFilter').value; + const moduleFlt = document.getElementById('moduleFilter').value; filteredTools = allTools.filter(t => { const matchSearch = t.name.toLowerCase().includes(search) || (t.description || '').toLowerCase().includes(search); const matchCategory = !category || (t.categoryKey || 'oth') === category; - return matchSearch && matchCategory; + const toolMod = t.moduleName ? t.moduleName.replace('dap-was-', '') : ''; + const matchModule = !moduleFlt || toolMod === moduleFlt; + return matchSearch && matchCategory && matchModule; }); document.getElementById('visibleCount').textContent = `(${filteredTools.length} tools)`; @@ -356,7 +371,7 @@ function renderTable() { const tbody = document.getElementById('toolsTbody'); if (filteredTools.length === 0) { - tbody.innerHTML = ''; + tbody.innerHTML = ''; return; } @@ -380,6 +395,7 @@ html += ` +
Module Category Tool Name Payload
Failed to load tools.
Failed to load tools.
No tools match the filter.
No tools match the filter.
${tool.moduleName ? tool.moduleName.replace('dap-was-', '') : 'unknown'} ${tool.categoryKey || 'oth'} ${tool.name} diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java index 2ce4dffc..10a3fcb9 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/mcp/ToolRegistryHeartbeatSender.java @@ -87,6 +87,9 @@ public class ToolRegistryHeartbeatSender { @Value("${axhub.tool.url:http://localhost:8080}") private String podUrl; + @Value("${spring.application.name:}") + private String applicationName; + private List registeredTools = new ArrayList<>(); @Getter @@ -136,6 +139,7 @@ public class ToolRegistryHeartbeatSender { meta.setIntegrationType("REST"); meta.setMciServiceId(hintAnnotation != null ? hintAnnotation.mappingId() : ""); meta.setPodUrl(podUrl); + meta.setModuleName(applicationName); meta.setEndpoint(podUrl.replaceAll("/+$", "") + "/mcp/" + subToolName); meta.setVisible(true); diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/dto/ToolMetadata.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/dto/ToolMetadata.java index 3e228913..d329d77b 100644 --- a/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/dto/ToolMetadata.java +++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/mcc/dto/ToolMetadata.java @@ -64,6 +64,9 @@ public class ToolMetadata { // 2-1. 도메인 부서 그룹명 (category_key, 슬러그 형식) private String categoryKey; + // 2-1-1. 어플리케이션(모듈) 이름 (예: dap-was-cus) + private String moduleName; + // 2-2. 툴 처리 엔드포인트 URI 경로 (예: /api/tool/customer-info) private String endpoint;