@@ -167,32 +167,70 @@ func filterDisabledTools(cfg *config.ConfigStore, mcpName string, tools []*Tool)
167 return filtered
167 return filtered
170−// ensureBase64 checks if data is valid base64 and returns it as-is if so,
170+// ensureBase64 normalizes valid base64 input and guarantees padded
171−// otherwise encodes the raw binary data to base64.
171+// base64.StdEncoding output; otherwise it encodes raw binary data.
172func ensureBase64(data []byte) []byte {
172func ensureBase64(data []byte) []byte {
173− // Check if the data is already valid base64 by attempting to decode it.
173+ if len(data) == 0 {
174− // Valid base64 should only contain ASCII characters (A-Z, a-z, 0-9, +, /, =).
175− if isValidBase64(data) {
176 return data
174 return data
178− // Data is raw binary, encode it to base64.
176+
177+ normalized := normalizeBase64Input(data)
178+ if decoded, ok := decodeBase64(normalized); ok {
179+ encoded := make([]byte, base64.StdEncoding.EncodedLen(len(decoded)))
180+ base64.StdEncoding.Encode(encoded, decoded)
179 encoded := make([]byte, base64.StdEncoding.EncodedLen(len(data)))
184 encoded := make([]byte, base64.StdEncoding.EncodedLen(len(data)))
180 base64.StdEncoding.Encode(encoded, data)
185 base64.StdEncoding.Encode(encoded, data)
181 return encoded
186 return encoded
189+func normalizeBase64Input(data []byte) []byte {
190+ normalized := strings.Join(strings.Fields(string(data)), "")
191+ return []byte(normalized)
194+func decodeBase64(data []byte) ([]byte, bool) {
199+ for _, b := range data {
206+ decoded, err := base64.StdEncoding.DecodeString(s)
208+ return decoded, true
210+ decoded, err = base64.RawStdEncoding.DecodeString(s)
212+ return decoded, true
184// isValidBase64 checks if the data appears to be valid base64-encoded content.
217// isValidBase64 checks if the data appears to be valid base64-encoded content.
185func isValidBase64(data []byte) bool {
218func isValidBase64(data []byte) bool {
186 if len(data) == 0 {
219 if len(data) == 0 {
187 return true
220 return true
189 // Base64 strings should only contain ASCII characters.
223 // Base64 strings should only contain ASCII characters.
190 for _, b := range data {
224 for _, b := range data {
191 if b > 127 {
225 if b > 127 {
192 return false
226 return false
195− // Try to decode to verify it's valid base64.
229+
196− _, err := base64.StdEncoding.DecodeString(string(data))
230+ s := string(data)
231+ if _, err := base64.StdEncoding.DecodeString(s); err == nil {
234+ _, err := base64.RawStdEncoding.DecodeString(s)
197 return err == nil
235 return err == nil