@@ -1871,12 +1871,12 @@ func CreateLabel(getGQLClient GetGQLClientFn, t translations.TranslationHelperFu
18711871 }
18721872}
18731873
1874- // Get label
1874+ // GetLabel handles both listing all labels and getting a specific label
18751875func GetLabel (getGQLClient GetGQLClientFn , t translations.TranslationHelperFunc ) (mcp.Tool , server.ToolHandlerFunc ) {
18761876 return mcp .NewTool ("get_label" ,
1877- mcp .WithDescription (t ("TOOL_GET_LABEL_DESCRIPTION" , "Get a label in a GitHub repository." )),
1877+ mcp .WithDescription (t ("TOOL_GET_LABEL_DESCRIPTION" , "Get a label from a specific repository. If no label name is provided, lists all labels in the repository." )),
18781878 mcp .WithToolAnnotation (mcp.ToolAnnotation {
1879- Title : t ("TOOL_GET_LABEL_TITLE" , "Get label " ),
1879+ Title : t ("TOOL_GET_LABEL_TITLE" , "Get/List labels " ),
18801880 ReadOnlyHint : ToBoolPtr (true ),
18811881 }),
18821882 mcp .WithString ("owner" ,
@@ -1888,8 +1888,7 @@ func GetLabel(getGQLClient GetGQLClientFn, t translations.TranslationHelperFunc)
18881888 mcp .Description ("Repository name" ),
18891889 ),
18901890 mcp .WithString ("name" ,
1891- mcp .Required (),
1892- mcp .Description ("Name of the label to retrieve" ),
1891+ mcp .Description ("Name of the label to retrieve. If not provided, lists all labels in the repository." ),
18931892 ),
18941893 ),
18951894 func (ctx context.Context , request mcp.CallToolRequest ) (* mcp.CallToolResult , error ) {
@@ -1901,7 +1900,7 @@ func GetLabel(getGQLClient GetGQLClientFn, t translations.TranslationHelperFunc)
19011900 if err != nil {
19021901 return mcp .NewToolResultError (err .Error ()), nil
19031902 }
1904- name , err := RequiredParam [string ](request , "name" )
1903+ name , err := OptionalParam [string ](request , "name" )
19051904 if err != nil {
19061905 return mcp .NewToolResultError (err .Error ()), nil
19071906 }
@@ -1911,42 +1910,104 @@ func GetLabel(getGQLClient GetGQLClientFn, t translations.TranslationHelperFunc)
19111910 return nil , fmt .Errorf ("failed to get GitHub client: %w" , err )
19121911 }
19131912
1913+ // If name is provided, get specific label
1914+ if name != "" {
1915+ var query struct {
1916+ Repository struct {
1917+ Label struct {
1918+ ID githubv4.ID
1919+ Name githubv4.String
1920+ Color githubv4.String
1921+ Description githubv4.String
1922+ } `graphql:"label(name: $name)"`
1923+ } `graphql:"repository(owner: $owner, name: $repo)"`
1924+ }
1925+
1926+ vars := map [string ]any {
1927+ "owner" : githubv4 .String (owner ),
1928+ "repo" : githubv4 .String (repo ),
1929+ "name" : githubv4 .String (name ),
1930+ }
1931+
1932+ if err := client .Query (ctx , & query , vars ); err != nil {
1933+ return ghErrors .NewGitHubGraphQLErrorResponse (ctx , "Failed to find label" , err ), nil
1934+ }
1935+
1936+ // If label wasn't found, return a helpful error
1937+ if query .Repository .Label .Name == "" {
1938+ return mcp .NewToolResultError (fmt .Sprintf ("label '%s' not found in %s/%s" , name , owner , repo )), nil
1939+ }
1940+
1941+ label := map [string ]any {
1942+ "id" : fmt .Sprintf ("%v" , query .Repository .Label .ID ),
1943+ "name" : string (query .Repository .Label .Name ),
1944+ "color" : string (query .Repository .Label .Color ),
1945+ "description" : string (query .Repository .Label .Description ),
1946+ }
1947+
1948+ out , err := json .Marshal (label )
1949+ if err != nil {
1950+ return nil , fmt .Errorf ("failed to marshal label: %w" , err )
1951+ }
1952+
1953+ return mcp .NewToolResultText (string (out )), nil
1954+ }
1955+
1956+ // If no name provided, list all labels
19141957 var query struct {
19151958 Repository struct {
1916- Label struct {
1917- ID githubv4.ID
1918- Name githubv4.String
1919- Color githubv4.String
1920- Description githubv4.String
1921- } `graphql:"label(name: $name)"`
1959+ Labels struct {
1960+ Nodes []struct {
1961+ ID githubv4.ID
1962+ Name githubv4.String
1963+ Color githubv4.String
1964+ Description githubv4.String
1965+ }
1966+ PageInfo struct {
1967+ HasNextPage githubv4.Boolean
1968+ HasPreviousPage githubv4.Boolean
1969+ StartCursor githubv4.String
1970+ EndCursor githubv4.String
1971+ }
1972+ TotalCount githubv4.Int
1973+ } `graphql:"labels(first: 100)"`
19221974 } `graphql:"repository(owner: $owner, name: $repo)"`
19231975 }
19241976
19251977 vars := map [string ]any {
19261978 "owner" : githubv4 .String (owner ),
19271979 "repo" : githubv4 .String (repo ),
1928- "name" : githubv4 .String (name ),
19291980 }
19301981
19311982 if err := client .Query (ctx , & query , vars ); err != nil {
1932- return ghErrors .NewGitHubGraphQLErrorResponse (ctx , "Failed to find label " , err ), nil
1983+ return ghErrors .NewGitHubGraphQLErrorResponse (ctx , "Failed to list labels " , err ), nil
19331984 }
19341985
1935- // If label wasn't found, return a helpful error
1936- if query .Repository .Label .Name == "" {
1937- return mcp .NewToolResultError (fmt .Sprintf ("label '%s' not found in %s/%s" , name , owner , repo )), nil
1986+ var labels []map [string ]any
1987+ for _ , label := range query .Repository .Labels .Nodes {
1988+ labels = append (labels , map [string ]any {
1989+ "id" : fmt .Sprintf ("%v" , label .ID ),
1990+ "name" : string (label .Name ),
1991+ "color" : string (label .Color ),
1992+ "description" : string (label .Description ),
1993+ })
19381994 }
19391995
1940- label := map [string ]any {
1941- "id" : fmt .Sprintf ("%v" , query .Repository .Label .ID ),
1942- "name" : string (query .Repository .Label .Name ),
1943- "color" : string (query .Repository .Label .Color ),
1944- "description" : string (query .Repository .Label .Description ),
1996+ response := map [string ]any {
1997+ "labels" : labels ,
1998+ "count" : len (labels ),
1999+ "pageInfo" : map [string ]any {
2000+ "hasNextPage" : bool (query .Repository .Labels .PageInfo .HasNextPage ),
2001+ "hasPreviousPage" : bool (query .Repository .Labels .PageInfo .HasPreviousPage ),
2002+ "startCursor" : string (query .Repository .Labels .PageInfo .StartCursor ),
2003+ "endCursor" : string (query .Repository .Labels .PageInfo .EndCursor ),
2004+ },
2005+ "totalCount" : int (query .Repository .Labels .TotalCount ),
19452006 }
19462007
1947- out , err := json .Marshal (label )
2008+ out , err := json .Marshal (response )
19482009 if err != nil {
1949- return nil , fmt .Errorf ("failed to marshal label : %w" , err )
2010+ return nil , fmt .Errorf ("failed to marshal labels : %w" , err )
19502011 }
19512012
19522013 return mcp .NewToolResultText (string (out )), nil
0 commit comments