diff --git a/github-mcp-server b/github-mcp-server new file mode 100755 index 00000000..5caad9f4 Binary files /dev/null and b/github-mcp-server differ diff --git a/pkg/github/issues.go b/pkg/github/issues.go index 07c76078..9efb56ac 100644 --- a/pkg/github/issues.go +++ b/pkg/github/issues.go @@ -442,8 +442,9 @@ func ListIssues(getClient GetClientFn, t translations.TranslationHelperFunc) (to if err != nil { return mcp.NewToolResultError(err.Error()), nil } - if since != "" { - timestamp, err := parseISOTimestamp(since) + // Enhanced validation: handle empty strings, whitespace, and null values + if since != "" && strings.TrimSpace(since) != "" { + timestamp, err := parseISOTimestamp(strings.TrimSpace(since)) if err != nil { return mcp.NewToolResultError(fmt.Sprintf("failed to list issues: %s", err.Error())), nil } @@ -912,6 +913,8 @@ type ReplaceActorsForAssignableInput struct { // Returns the parsed time or an error if parsing fails. // Example formats supported: "2023-01-15T14:30:00Z", "2023-01-15" func parseISOTimestamp(timestamp string) (time.Time, error) { + // Trim whitespace and check for empty string + timestamp = strings.TrimSpace(timestamp) if timestamp == "" { return time.Time{}, fmt.Errorf("empty timestamp") } diff --git a/pkg/github/notifications.go b/pkg/github/notifications.go index ba9c6bc2..f9e4ff86 100644 --- a/pkg/github/notifications.go +++ b/pkg/github/notifications.go @@ -7,6 +7,7 @@ import ( "io" "net/http" "strconv" + "strings" "time" "github.com/github/github-mcp-server/pkg/translations" @@ -93,16 +94,16 @@ func ListNotifications(getClient GetClientFn, t translations.TranslationHelperFu } // Parse time parameters if provided - if since != "" { - sinceTime, err := time.Parse(time.RFC3339, since) + if since != "" && strings.TrimSpace(since) != "" { + sinceTime, err := time.Parse(time.RFC3339, strings.TrimSpace(since)) if err != nil { return mcp.NewToolResultError(fmt.Sprintf("invalid since time format, should be RFC3339/ISO8601: %v", err)), nil } opts.Since = sinceTime } - if before != "" { - beforeTime, err := time.Parse(time.RFC3339, before) + if before != "" && strings.TrimSpace(before) != "" { + beforeTime, err := time.Parse(time.RFC3339, strings.TrimSpace(before)) if err != nil { return mcp.NewToolResultError(fmt.Sprintf("invalid before time format, should be RFC3339/ISO8601: %v", err)), nil } @@ -242,8 +243,8 @@ func MarkAllNotificationsRead(getClient GetClientFn, t translations.TranslationH } var lastReadTime time.Time - if lastReadAt != "" { - lastReadTime, err = time.Parse(time.RFC3339, lastReadAt) + if lastReadAt != "" && strings.TrimSpace(lastReadAt) != "" { + lastReadTime, err = time.Parse(time.RFC3339, strings.TrimSpace(lastReadAt)) if err != nil { return mcp.NewToolResultError(fmt.Sprintf("invalid lastReadAt time format, should be RFC3339/ISO8601: %v", err)), nil }