diff --git a/mcp/tools.go b/mcp/tools.go index 51145337..5ee9fedb 100644 --- a/mcp/tools.go +++ b/mcp/tools.go @@ -504,7 +504,9 @@ func (r *CallToolResult) UnmarshalJSON(data []byte) error { // Unmarshal Meta if meta, ok := raw["_meta"]; ok { if metaMap, ok := meta.(map[string]any); ok { - r.Meta = metaMap + r.Meta = &Meta{ + AdditionalFields: metaMap, + } } } diff --git a/server/stdio.go b/server/stdio.go index 4d567d8c..3fdb09fd 100644 --- a/server/stdio.go +++ b/server/stdio.go @@ -2,6 +2,7 @@ package server import ( "bufio" + "bytes" "context" "encoding/json" "fmt" @@ -457,11 +458,18 @@ func (s *StdioServer) writeResponse( response mcp.JSONRPCMessage, writer io.Writer, ) error { - responseBytes, err := json.Marshal(response) - if err != nil { + // Create a buffer to write JSON with custom encoding settings + var buf bytes.Buffer + encoder := json.NewEncoder(&buf) + encoder.SetEscapeHTML(false) // Disable HTML escaping, which also prevents Unicode escaping + + if err := encoder.Encode(response); err != nil { return err } + // Remove the trailing newline added by Encode() and add our own + responseBytes := bytes.TrimSuffix(buf.Bytes(), []byte("\n")) + // Write response followed by newline if _, err := fmt.Fprintf(writer, "%s\n", responseBytes); err != nil { return err