forked from kimhyungsik/ax_hub_mcp_tool
Fix: remove remaining dap-tool and gateway legacy strings
This commit is contained in:
@@ -58,7 +58,7 @@ public class EaiEimsSender implements EimsSender {
|
||||
log.warn(" 로컬 환경이거나 Ka<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" +
|
||||
"<EaiMessage>\n" +
|
||||
" <Header>\n" +
|
||||
" <ChannelId>MCP_GATEWAY_ASYNC</ChannelId>\n" +
|
||||
" <ChannelId>MCP_WAS_ASYNC</ChannelId>\n" +
|
||||
" <InterfaceId>EAI_BATCH_JOB</InterfaceId>\n" +
|
||||
" <Timestamp>1782705901850</Timestamp>\n" +
|
||||
" <TransferType>ASYNC</TransferType>\n" +
|
||||
@@ -91,7 +91,7 @@ public class EaiEimsSender implements EimsSender {
|
||||
return String.format(
|
||||
"<EaiMessage>" +
|
||||
"<Header>" +
|
||||
"<ChannelId>MCP_GATEWAY_ASYNC</ChannelId>" +
|
||||
"<ChannelId>MCP_WAS_ASYNC</ChannelId>" +
|
||||
"<InterfaceId>%s</InterfaceId>" +
|
||||
"<Timestamp>%d</Timestamp>" +
|
||||
"<TransferType>ASYNC</TransferType>" +
|
||||
|
||||
@@ -31,7 +31,7 @@ public class SwaggerConfig {
|
||||
.info(new Info()
|
||||
.title("Shinhan MCP WAS API 명세서")
|
||||
.version("v1.0")
|
||||
.description("AI Agent와 신한라이프 내부망(EIMS/EAI)을 연결하는 Adapter Gateway API 문서입니다."))
|
||||
.description("AI Agent와 신한라이프 내부망(EIMS/EAI)을 연결하는 Adapter WAS API 문서입니다."))
|
||||
.addServersItem(new io.swagger.v3.oas.models.servers.Server().url("http://localhost:8080").description("Adapter Pod (8080)"))
|
||||
.addServersItem(new io.swagger.v3.oas.models.servers.Server().url("http://localhost:8081").description("WAS Pod"))
|
||||
// 전역적으로 X-API-KEY 보안 설정을 Swagger UI에 추가합니다.
|
||||
|
||||
@@ -43,7 +43,7 @@ public class WebConfig implements WebMvcConfigurer {
|
||||
|
||||
@Override
|
||||
public void addCorsMappings(CorsRegistry registry) {
|
||||
// Swagger UI(8080)에서 Gateway(8081)로 API 호출 시 발생하는 CORS 에러 해결
|
||||
// Swagger UI(8080)에서 WAS로 API 호출 시 발생하는 CORS 에러 해결
|
||||
registry.addMapping("/**")
|
||||
.allowedOriginPatterns("*")
|
||||
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
|
||||
|
||||
@@ -13,7 +13,7 @@ logging:
|
||||
pattern:
|
||||
console: "[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger{36} - %msg%n"
|
||||
|
||||
# 2. Redis 공통 설정 (Gateway 연동 및 캐싱)
|
||||
# 2. Redis 공통 설정 (WAS 연동 및 캐싱)
|
||||
spring:
|
||||
data:
|
||||
redis:
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<div class="flex items-center space-x-5">
|
||||
<a href="/index.html" class="flex items-center group" style="text-decoration:none;">
|
||||
<div class="w-2 h-2 rounded-full mr-2" style="background:#3b82f6; box-shadow: 0 0 8px rgba(59,130,246,0.8);"></div>
|
||||
<span class="font-semibold tracking-tight text-sm" style="color:#f4f4f5;">AXHUB Gateway</span>
|
||||
<span class="font-semibold tracking-tight text-sm" style="color:#f4f4f5;">AXHUB WAS</span>
|
||||
</a>
|
||||
<div class="h-4 w-px" style="background:#27272a;"></div>
|
||||
<nav class="flex space-x-5 text-[13px] font-medium">
|
||||
@@ -80,7 +80,7 @@
|
||||
function requestId() { return crypto.randomUUID ? crypto.randomUUID() : `${Date.now()}-${Math.random().toString(16).slice(2)}`; }
|
||||
function escapeHtml(value) { return String(value).replace(/[&<>]/g, item => ({'&':'&','<':'<','>':'>'}[item])); }
|
||||
|
||||
let isGatewayMode = false;
|
||||
let isWasMode = false;
|
||||
|
||||
async function loadManifest() {
|
||||
$('manifestStatus').textContent = 'Manifest loading';
|
||||
@@ -90,13 +90,13 @@
|
||||
if (!response.ok && response.status === 404) {
|
||||
// Gateway 환경 감지 및 Fallback 처리
|
||||
response = await fetch('/mcp/api/v1/tools/list');
|
||||
if (!response.ok) throw new Error(`Gateway HTTP ${response.status}`);
|
||||
if (!response.ok) throw new Error(`WAS HTTP ${response.status}`);
|
||||
|
||||
const rpcData = await response.json();
|
||||
state.tools = rpcData.result?.tools || [];
|
||||
isGatewayMode = true;
|
||||
isWasMode = true;
|
||||
|
||||
$('manifestStatus').textContent = `${state.tools.length} tools · Gateway Mode`;
|
||||
$('manifestStatus').textContent = `${state.tools.length} tools · WAS Mode`;
|
||||
$('manifestStatus').className = 'badge ok';
|
||||
renderTools();
|
||||
return;
|
||||
@@ -174,7 +174,7 @@
|
||||
$('executeButton').disabled = true; $('httpStatus').textContent = '실행 중'; $('httpStatus').className = 'badge';
|
||||
try {
|
||||
let response;
|
||||
if (isGatewayMode) {
|
||||
if (isWasMode) {
|
||||
const reqPayload = { jsonrpc: "2.0", method: "tools/call", params: { name: tool.name, arguments: payload }, id: Date.now() };
|
||||
response = await fetch('/mcp/api/v1/tools/call', {
|
||||
method: 'POST',
|
||||
@@ -192,7 +192,7 @@
|
||||
|
||||
let isOk = response.ok;
|
||||
let displayStatus = response.status;
|
||||
if (isGatewayMode && isOk && data?.result?.isError) {
|
||||
if (isWasMode && isOk && data?.result?.isError) {
|
||||
isOk = false;
|
||||
displayStatus = "MCP ERR";
|
||||
}
|
||||
@@ -201,7 +201,7 @@
|
||||
$('httpStatus').textContent = `HTTP ${displayStatus}`; $('httpStatus').className = `badge ${isOk ? 'ok' : 'fail'}`;
|
||||
$('latency').textContent = `${elapsed}ms`; $('traceId').textContent = `trace-id: ${response.headers.get('trace-id') || trace}`; $('requestId').textContent = `request-id: ${response.headers.get('request-id') || request}`;
|
||||
let displayData = data;
|
||||
if (isGatewayMode && data && typeof data === 'object') {
|
||||
if (isWasMode && data && typeof data === 'object') {
|
||||
if (data.result && data.result.result) {
|
||||
displayData = data.result.result.data !== undefined ? data.result.result.data : data.result.result;
|
||||
} else if (data.error) {
|
||||
|
||||
@@ -24,14 +24,14 @@ class McpRequestHeaderFilterTest {
|
||||
@Test
|
||||
void capturesOptionalMcpHeadersOnlyForTheCurrentRequest() throws Exception {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("POST", "/mcp");
|
||||
request.addHeader("X-Request-Id", "gateway-request-id");
|
||||
request.addHeader("X-Request-Id", "was-request-id");
|
||||
request.addHeader("trace-id", "trace-001");
|
||||
request.addHeader("request-id", "tool-request-001");
|
||||
request.addHeader("employee-id", "encrypted-employee-id");
|
||||
|
||||
new McpRequestHeaderFilter().doFilter(request, new MockHttpServletResponse(), (req, res) -> {
|
||||
McpRequestHeaders headers = McpRequestHeaderContext.current();
|
||||
assertEquals("gateway-request-id", headers.headerRequestId());
|
||||
assertEquals("was-request-id", headers.headerRequestId());
|
||||
assertEquals("trace-001", headers.traceId());
|
||||
assertEquals("tool-request-001", headers.requestId());
|
||||
assertEquals("encrypted-employee-id", headers.encryptedEmployeeId());
|
||||
@@ -44,7 +44,7 @@ class McpRequestHeaderFilterTest {
|
||||
void forwardsCapturedHeadersToBusinessToolExecution() throws Exception {
|
||||
BusinessToolController controller = mock(BusinessToolController.class);
|
||||
doReturn(ResponseEntity.ok(Map.of("result", "ok")))
|
||||
.when(controller).executeDynamicTool(eq("sampleTool"), eq("gateway-request-id"), eq("trace-001"),
|
||||
.when(controller).executeDynamicTool(eq("sampleTool"), eq("was-request-id"), eq("trace-001"),
|
||||
eq("tool-request-001"), eq("encrypted-employee-id"), eq(Map.of("key", "value")));
|
||||
ToolPodMcpToolSynchronizer synchronizer = new ToolPodMcpToolSynchronizer(
|
||||
mock(McpSyncServer.class), mock(LocalToolScanner.class), controller, new ObjectMapper());
|
||||
@@ -53,10 +53,10 @@ class McpRequestHeaderFilterTest {
|
||||
"invoke", String.class, McpRequestHeaders.class, Map.class);
|
||||
invoke.setAccessible(true);
|
||||
invoke.invoke(synchronizer, "sampleTool",
|
||||
new McpRequestHeaders("gateway-request-id", "trace-001", "tool-request-001", "encrypted-employee-id"),
|
||||
new McpRequestHeaders("was-request-id", "trace-001", "tool-request-001", "encrypted-employee-id"),
|
||||
Map.of("key", "value"));
|
||||
|
||||
verify(controller).executeDynamicTool("sampleTool", "gateway-request-id", "trace-001",
|
||||
verify(controller).executeDynamicTool("sampleTool", "was-request-id", "trace-001",
|
||||
"tool-request-001", "encrypted-employee-id", Map.of("key", "value"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user