Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions src/mcp-proxy/pkg/infra/proxy/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ func (m *MCPProxy) AddMCPServerFromConfigs(configs []*MCPServerConfig) error {

// register tool
for _, toolConfig := range config.Tools {
toolHandler := genToolHandler(toolConfig, config.Name, config.RawResponseEnabled)
toolHandler := genToolHandler(toolConfig, config.Name, mcpServer.RawResponseEnabled)
mcpServer.AddTool(buildMCPTool(toolConfig, config.Name), toolHandler)
}
m.AddMCPServer(config.Name, mcpServer)
Expand Down Expand Up @@ -285,7 +285,7 @@ func (m *MCPProxy) UpdateMCPServerFromOpenApiSpec(
}
// update tool
for _, toolConfig := range mcpServerConfig.Tools {
toolHandler := genToolHandler(toolConfig, name, rawResponseEnabled)
toolHandler := genToolHandler(toolConfig, name, mcpServer.RawResponseEnabled)
mcpServer.AddTool(buildMCPTool(toolConfig, name), toolHandler)
}
// 更新资源版本号
Expand Down Expand Up @@ -748,7 +748,7 @@ func handleToolCallError(
return result
}

func genToolHandler(toolApiConfig *ToolConfig, serverName string, rawResponseEnabled bool) ToolHandler {
func genToolHandler(toolApiConfig *ToolConfig, serverName string, rawResponseEnabledGetter func() bool) ToolHandler {
// 生成handler
handler := func(ctx context.Context, req *mcp.CallToolRequest) (result *mcp.CallToolResult, err error) {
start := time.Now()
Expand Down Expand Up @@ -919,12 +919,12 @@ func genToolHandler(toolApiConfig *ToolConfig, serverName string, rawResponseEna
}
}

var responseResult any
if rawResponseEnabled {
// raw_response_enabled 模式:直接返回 API 响应结果,不添加 request_id 等额外信息。
// 注意:无论成功或失败(非 2xx)都直接透传原始响应,
// 由 MCP 协议层的 IsError 标记来区分调用方是否为错误场景。
responseResult = res
var responseResult any
if rawResponseEnabledGetter() {
// raw_response_enabled 模式:直接返回 API 响应结果,不添加 request_id 等额外信息。
// 注意:无论成功或失败(非 2xx)都直接透传原始响应,
// 由 MCP 协议层的 IsError 标记来区分调用方是否为错误场景。
responseResult = res
} else {
responseResult = buildToolResponseEnvelope(
response.Code(),
Expand Down
23 changes: 23 additions & 0 deletions src/mcp-proxy/pkg/infra/proxy/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,29 @@ var _ = Describe("MCPServer", func() {
server.SetRawResponseEnabled(false)
Expect(server.RawResponseEnabled()).To(BeFalse())
})

It("should dynamically update value for tool handler getter", func() {
// Simulate the scenario where tool handler uses RawResponseEnabled as a getter
// This tests the hot-reload scenario for raw_response_enabled

// Initial state: false
Expect(server.RawResponseEnabled()).To(BeFalse())

// Simulate getter function (like genToolHandler uses)
getter := server.RawResponseEnabled
Expect(getter()).To(BeFalse())

// Hot update: change raw_response_enabled to true
server.SetRawResponseEnabled(true)

// Getter should return new value without re-registering handler
Expect(getter()).To(BeTrue())
Expect(server.RawResponseEnabled()).To(BeTrue())

// Hot update: change back to false
server.SetRawResponseEnabled(false)
Expect(getter()).To(BeFalse())
})
})

Describe("GetTools", func() {
Expand Down
Loading