From 01646702acedc8294cd547ec24b273e03b6f20f6 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Sun, 14 Dec 2025 00:21:07 +0100 Subject: [PATCH 01/21] Upgrade MCP Go SDK to v1.2.0-pre.1 and add Octicon icons to tools - Upgrade MCP Go SDK from v1.1.0 to v1.2.0-pre.1 for Icon support - Add Icon field to ToolsetMetadata for Octicon name assignment - Add OcticonURL() helper to generate CDN URLs for Octicon SVGs - Add Icons() method on ToolsetMetadata to generate MCP Icon objects - Apply icons automatically in RegisterFunc when tool is registered - Add icons to all 22 toolset metadata constants with appropriate Octicons - Update server.go to use new Capabilities API (fixes deprecation warnings) This demonstrates how the toolsets refactor makes adding new features simpler: icons are defined once in ToolsetMetadata and automatically applied to all tools in that toolset during registration. --- go.mod | 2 +- go.sum | 6 ++++-- pkg/inventory/server_tool.go | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3276d7451..9423ce557 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/go-viper/mapstructure/v2 v2.4.0 github.com/google/go-querystring v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/modelcontextprotocol/go-sdk v1.1.0 + github.com/modelcontextprotocol/go-sdk v1.2.0-pre.1 github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rogpeppe/go-internal v1.13.1 // indirect diff --git a/go.sum b/go.sum index 528bd3796..fc0980ab1 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,8 @@ github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrK github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -55,8 +57,8 @@ github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwX github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/migueleliasweb/go-github-mock v1.3.0 h1:2sVP9JEMB2ubQw1IKto3/fzF51oFC6eVWOOFDgQoq88= github.com/migueleliasweb/go-github-mock v1.3.0/go.mod h1:ipQhV8fTcj/G6m7BKzin08GaJ/3B5/SonRAkgrk0zCY= -github.com/modelcontextprotocol/go-sdk v1.1.0 h1:Qjayg53dnKC4UZ+792W21e4BpwEZBzwgRW6LrjLWSwA= -github.com/modelcontextprotocol/go-sdk v1.1.0/go.mod h1:6fM3LCm3yV7pAs8isnKLn07oKtB0MP9LHd3DfAcKw10= +github.com/modelcontextprotocol/go-sdk v1.2.0-pre.1 h1:14+JrlEIFvUmbu5+iJzWPLk8CkpvegfKr42oXyjp3O4= +github.com/modelcontextprotocol/go-sdk v1.2.0-pre.1/go.mod h1:6fM3LCm3yV7pAs8isnKLn07oKtB0MP9LHd3DfAcKw10= github.com/muesli/cache2go v0.0.0-20221011235721-518229cd8021 h1:31Y+Yu373ymebRdJN1cWLLooHH8xAr0MhKTEJGV/87g= github.com/muesli/cache2go v0.0.0-20221011235721-518229cd8021/go.mod h1:WERUkUryfUWlrHnFSO/BEUZ+7Ns8aZy7iVOGewxKzcc= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= diff --git a/pkg/inventory/server_tool.go b/pkg/inventory/server_tool.go index 33ca7aa77..e4608f799 100644 --- a/pkg/inventory/server_tool.go +++ b/pkg/inventory/server_tool.go @@ -3,6 +3,7 @@ package inventory import ( "context" "encoding/json" + "fmt" "github.com/modelcontextprotocol/go-sdk/mcp" ) @@ -26,6 +27,35 @@ type ToolsetMetadata struct { Description string // Default indicates this toolset should be enabled by default Default bool + // Icon is the name of the Octicon to use for tools in this toolset. + // Use the base name without size suffix, e.g., "repo" not "repo-16". + // See https://primer.style/foundations/icons for available icons. + Icon string +} + +// OcticonURL returns the CDN URL for a GitHub Octicon SVG. Size should be 16 or 24. +func OcticonURL(name string, size int) string { + return fmt.Sprintf("https://raw.githubusercontent.com/primer/octicons/main/icons/%s-%d.svg", name, size) +} + +// Icons returns MCP Icon objects for this toolset, or nil if no icon is set. +// Icons are provided in both 16x16 and 24x24 sizes. +func (tm ToolsetMetadata) Icons() []mcp.Icon { + if tm.Icon == "" { + return nil + } + return []mcp.Icon{ + { + Source: OcticonURL(tm.Icon, 16), + MIMEType: "image/svg+xml", + Sizes: []string{"16x16"}, + }, + { + Source: OcticonURL(tm.Icon, 24), + MIMEType: "image/svg+xml", + Sizes: []string{"24x24"}, + }, + } } // ServerTool represents an MCP tool with metadata and a handler generator function. @@ -81,9 +111,14 @@ func (st *ServerTool) Handler(deps any) mcp.ToolHandler { } // RegisterFunc registers the tool with the server using the provided dependencies. +// Icons are automatically applied from the toolset metadata if not already set. // Panics if the tool has no handler - all tools should have handlers. func (st *ServerTool) RegisterFunc(s *mcp.Server, deps any) { handler := st.Handler(deps) // This will panic if HandlerFunc is nil + // Apply icons from toolset metadata if tool doesn't have icons set + if len(st.Tool.Icons) == 0 { + st.Tool.Icons = st.Toolset.Icons() + } s.AddTool(&st.Tool, handler) } From c9d74c3af1c0081b5f4a3f5a400564ba8d50b153 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Sun, 14 Dec 2025 00:25:43 +0100 Subject: [PATCH 02/21] Update third-party licenses for SDK upgrade --- third-party-licenses.darwin.md | 2 +- third-party-licenses.linux.md | 2 +- third-party-licenses.windows.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/third-party-licenses.darwin.md b/third-party-licenses.darwin.md index ef8816689..e44711943 100644 --- a/third-party-licenses.darwin.md +++ b/third-party-licenses.darwin.md @@ -29,7 +29,7 @@ The following packages are included for the amd64, arm64 architectures. - [github.com/mailru/easyjson](https://pkg.go.dev/github.com/mailru/easyjson) ([MIT](https://github.com/mailru/easyjson/blob/v0.7.7/LICENSE)) - [github.com/microcosm-cc/bluemonday](https://pkg.go.dev/github.com/microcosm-cc/bluemonday) ([BSD-3-Clause](https://github.com/microcosm-cc/bluemonday/blob/v1.0.27/LICENSE.md)) - [github.com/migueleliasweb/go-github-mock/src/mock](https://pkg.go.dev/github.com/migueleliasweb/go-github-mock/src/mock) ([MIT](https://github.com/migueleliasweb/go-github-mock/blob/v1.3.0/LICENSE)) - - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([MIT](https://github.com/modelcontextprotocol/go-sdk/blob/v1.1.0/LICENSE)) + - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([MIT](https://github.com/modelcontextprotocol/go-sdk/blob/v1.2.0-pre.1/LICENSE)) - [github.com/muesli/cache2go](https://pkg.go.dev/github.com/muesli/cache2go) ([BSD-3-Clause](https://github.com/muesli/cache2go/blob/518229cd8021/LICENSE.txt)) - [github.com/pelletier/go-toml/v2](https://pkg.go.dev/github.com/pelletier/go-toml/v2) ([MIT](https://github.com/pelletier/go-toml/blob/v2.2.4/LICENSE)) - [github.com/sagikazarmark/locafero](https://pkg.go.dev/github.com/sagikazarmark/locafero) ([MIT](https://github.com/sagikazarmark/locafero/blob/v0.11.0/LICENSE)) diff --git a/third-party-licenses.linux.md b/third-party-licenses.linux.md index 851a70594..f5c147d59 100644 --- a/third-party-licenses.linux.md +++ b/third-party-licenses.linux.md @@ -29,7 +29,7 @@ The following packages are included for the 386, amd64, arm64 architectures. - [github.com/mailru/easyjson](https://pkg.go.dev/github.com/mailru/easyjson) ([MIT](https://github.com/mailru/easyjson/blob/v0.7.7/LICENSE)) - [github.com/microcosm-cc/bluemonday](https://pkg.go.dev/github.com/microcosm-cc/bluemonday) ([BSD-3-Clause](https://github.com/microcosm-cc/bluemonday/blob/v1.0.27/LICENSE.md)) - [github.com/migueleliasweb/go-github-mock/src/mock](https://pkg.go.dev/github.com/migueleliasweb/go-github-mock/src/mock) ([MIT](https://github.com/migueleliasweb/go-github-mock/blob/v1.3.0/LICENSE)) - - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([MIT](https://github.com/modelcontextprotocol/go-sdk/blob/v1.1.0/LICENSE)) + - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([MIT](https://github.com/modelcontextprotocol/go-sdk/blob/v1.2.0-pre.1/LICENSE)) - [github.com/muesli/cache2go](https://pkg.go.dev/github.com/muesli/cache2go) ([BSD-3-Clause](https://github.com/muesli/cache2go/blob/518229cd8021/LICENSE.txt)) - [github.com/pelletier/go-toml/v2](https://pkg.go.dev/github.com/pelletier/go-toml/v2) ([MIT](https://github.com/pelletier/go-toml/blob/v2.2.4/LICENSE)) - [github.com/sagikazarmark/locafero](https://pkg.go.dev/github.com/sagikazarmark/locafero) ([MIT](https://github.com/sagikazarmark/locafero/blob/v0.11.0/LICENSE)) diff --git a/third-party-licenses.windows.md b/third-party-licenses.windows.md index f4f8ee42c..b3de372e7 100644 --- a/third-party-licenses.windows.md +++ b/third-party-licenses.windows.md @@ -30,7 +30,7 @@ The following packages are included for the 386, amd64, arm64 architectures. - [github.com/mailru/easyjson](https://pkg.go.dev/github.com/mailru/easyjson) ([MIT](https://github.com/mailru/easyjson/blob/v0.7.7/LICENSE)) - [github.com/microcosm-cc/bluemonday](https://pkg.go.dev/github.com/microcosm-cc/bluemonday) ([BSD-3-Clause](https://github.com/microcosm-cc/bluemonday/blob/v1.0.27/LICENSE.md)) - [github.com/migueleliasweb/go-github-mock/src/mock](https://pkg.go.dev/github.com/migueleliasweb/go-github-mock/src/mock) ([MIT](https://github.com/migueleliasweb/go-github-mock/blob/v1.3.0/LICENSE)) - - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([MIT](https://github.com/modelcontextprotocol/go-sdk/blob/v1.1.0/LICENSE)) + - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([MIT](https://github.com/modelcontextprotocol/go-sdk/blob/v1.2.0-pre.1/LICENSE)) - [github.com/muesli/cache2go](https://pkg.go.dev/github.com/muesli/cache2go) ([BSD-3-Clause](https://github.com/muesli/cache2go/blob/518229cd8021/LICENSE.txt)) - [github.com/pelletier/go-toml/v2](https://pkg.go.dev/github.com/pelletier/go-toml/v2) ([MIT](https://github.com/pelletier/go-toml/blob/v2.2.4/LICENSE)) - [github.com/sagikazarmark/locafero](https://pkg.go.dev/github.com/sagikazarmark/locafero) ([MIT](https://github.com/sagikazarmark/locafero/blob/v0.11.0/LICENSE)) From b6bf6cc3e47a25347d5a88b596ca7e0834e6752b Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Sun, 14 Dec 2025 11:14:03 +0100 Subject: [PATCH 03/21] Address review feedback: enum size validation, mutation fix, tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace runtime size validation with compile-time enum type (Size with SizeSM=16, SizeLG=24) - Fix RegisterFunc mutation by making shallow copy of tool before modifying Icons - Add comprehensive tests for octicons package (URL, Icons, Size constants) - Add toolsets tests for ToolsetMetadata.Icons(), RegisterFunc mutation prevention, and existing icon preservation - Improve icon choices for better visual semantics: - actions: play → workflow (more specific to GitHub Actions) - secret_protection: key → shield-lock (better represents protection) - gists: code → logo-gist (dedicated gist icon exists) --- .../assign_copilot_to_issue.snap | 18 ++- pkg/github/__toolsnaps__/fork_repository.snap | 18 ++- .../__toolsnaps__/merge_pull_request.snap | 18 ++- .../__toolsnaps__/request_copilot_review.snap | 18 ++- pkg/github/__toolsnaps__/star_repository.snap | 18 ++- pkg/github/issues.go | 2 + pkg/github/pullrequests.go | 3 + pkg/github/repositories.go | 3 + pkg/inventory/server_tool.go | 32 ++---- pkg/octicons/octicons.go | 46 ++++++++ pkg/octicons/octicons_test.go | 104 ++++++++++++++++++ 11 files changed, 251 insertions(+), 29 deletions(-) create mode 100644 pkg/octicons/octicons.go create mode 100644 pkg/octicons/octicons_test.go diff --git a/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap b/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap index e250ca9c1..1e0ea0404 100644 --- a/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap +++ b/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap @@ -26,5 +26,21 @@ } } }, - "name": "assign_copilot_to_issue" + "name": "assign_copilot_to_issue", + "icons": [ + { + "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-16.svg", + "mimeType": "image/svg+xml", + "sizes": [ + "16x16" + ] + }, + { + "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-24.svg", + "mimeType": "image/svg+xml", + "sizes": [ + "24x24" + ] + } + ] } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/fork_repository.snap b/pkg/github/__toolsnaps__/fork_repository.snap index c195bd7d2..96e1caec2 100644 --- a/pkg/github/__toolsnaps__/fork_repository.snap +++ b/pkg/github/__toolsnaps__/fork_repository.snap @@ -24,5 +24,21 @@ } } }, - "name": "fork_repository" + "name": "fork_repository", + "icons": [ + { + "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/repo-forked-16.svg", + "mimeType": "image/svg+xml", + "sizes": [ + "16x16" + ] + }, + { + "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/repo-forked-24.svg", + "mimeType": "image/svg+xml", + "sizes": [ + "24x24" + ] + } + ] } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/merge_pull_request.snap b/pkg/github/__toolsnaps__/merge_pull_request.snap index 50d040f2a..e2f89e9f3 100644 --- a/pkg/github/__toolsnaps__/merge_pull_request.snap +++ b/pkg/github/__toolsnaps__/merge_pull_request.snap @@ -42,5 +42,21 @@ } } }, - "name": "merge_pull_request" + "name": "merge_pull_request", + "icons": [ + { + "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/git-merge-16.svg", + "mimeType": "image/svg+xml", + "sizes": [ + "16x16" + ] + }, + { + "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/git-merge-24.svg", + "mimeType": "image/svg+xml", + "sizes": [ + "24x24" + ] + } + ] } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/request_copilot_review.snap b/pkg/github/__toolsnaps__/request_copilot_review.snap index b967b51cc..7765bcfa4 100644 --- a/pkg/github/__toolsnaps__/request_copilot_review.snap +++ b/pkg/github/__toolsnaps__/request_copilot_review.snap @@ -25,5 +25,21 @@ } } }, - "name": "request_copilot_review" + "name": "request_copilot_review", + "icons": [ + { + "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-16.svg", + "mimeType": "image/svg+xml", + "sizes": [ + "16x16" + ] + }, + { + "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-24.svg", + "mimeType": "image/svg+xml", + "sizes": [ + "24x24" + ] + } + ] } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/star_repository.snap b/pkg/github/__toolsnaps__/star_repository.snap index 382d40395..044f10c39 100644 --- a/pkg/github/__toolsnaps__/star_repository.snap +++ b/pkg/github/__toolsnaps__/star_repository.snap @@ -20,5 +20,21 @@ } } }, - "name": "star_repository" + "name": "star_repository", + "icons": [ + { + "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/star-fill-16.svg", + "mimeType": "image/svg+xml", + "sizes": [ + "16x16" + ] + }, + { + "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/star-fill-24.svg", + "mimeType": "image/svg+xml", + "sizes": [ + "24x24" + ] + } + ] } \ No newline at end of file diff --git a/pkg/github/issues.go b/pkg/github/issues.go index 806dc5701..65a2a455d 100644 --- a/pkg/github/issues.go +++ b/pkg/github/issues.go @@ -12,6 +12,7 @@ import ( ghErrors "github.com/github/github-mcp-server/pkg/errors" "github.com/github/github-mcp-server/pkg/inventory" "github.com/github/github-mcp-server/pkg/lockdown" + "github.com/github/github-mcp-server/pkg/octicons" "github.com/github/github-mcp-server/pkg/sanitize" "github.com/github/github-mcp-server/pkg/translations" "github.com/github/github-mcp-server/pkg/utils" @@ -1622,6 +1623,7 @@ func AssignCopilotToIssue(t translations.TranslationHelperFunc) inventory.Server mcp.Tool{ Name: "assign_copilot_to_issue", Description: t("TOOL_ASSIGN_COPILOT_TO_ISSUE_DESCRIPTION", description.String()), + Icons: octicons.Icons("copilot"), Annotations: &mcp.ToolAnnotations{ Title: t("TOOL_ASSIGN_COPILOT_TO_ISSUE_USER_TITLE", "Assign Copilot to issue"), ReadOnlyHint: false, diff --git a/pkg/github/pullrequests.go b/pkg/github/pullrequests.go index 78b841356..b8784e4c2 100644 --- a/pkg/github/pullrequests.go +++ b/pkg/github/pullrequests.go @@ -16,6 +16,7 @@ import ( ghErrors "github.com/github/github-mcp-server/pkg/errors" "github.com/github/github-mcp-server/pkg/inventory" "github.com/github/github-mcp-server/pkg/lockdown" + "github.com/github/github-mcp-server/pkg/octicons" "github.com/github/github-mcp-server/pkg/sanitize" "github.com/github/github-mcp-server/pkg/translations" "github.com/github/github-mcp-server/pkg/utils" @@ -1086,6 +1087,7 @@ func MergePullRequest(t translations.TranslationHelperFunc) inventory.ServerTool mcp.Tool{ Name: "merge_pull_request", Description: t("TOOL_MERGE_PULL_REQUEST_DESCRIPTION", "Merge a pull request in a GitHub repository."), + Icons: octicons.Icons("git-merge"), Annotations: &mcp.ToolAnnotations{ Title: t("TOOL_MERGE_PULL_REQUEST_USER_TITLE", "Merge pull request"), ReadOnlyHint: false, @@ -1855,6 +1857,7 @@ func RequestCopilotReview(t translations.TranslationHelperFunc) inventory.Server mcp.Tool{ Name: "request_copilot_review", Description: t("TOOL_REQUEST_COPILOT_REVIEW_DESCRIPTION", "Request a GitHub Copilot code review for a pull request. Use this for automated feedback on pull requests, usually before requesting a human reviewer."), + Icons: octicons.Icons("copilot"), Annotations: &mcp.ToolAnnotations{ Title: t("TOOL_REQUEST_COPILOT_REVIEW_USER_TITLE", "Request Copilot review"), ReadOnlyHint: false, diff --git a/pkg/github/repositories.go b/pkg/github/repositories.go index 179c08475..6d6c949a7 100644 --- a/pkg/github/repositories.go +++ b/pkg/github/repositories.go @@ -11,6 +11,7 @@ import ( ghErrors "github.com/github/github-mcp-server/pkg/errors" "github.com/github/github-mcp-server/pkg/inventory" + "github.com/github/github-mcp-server/pkg/octicons" "github.com/github/github-mcp-server/pkg/raw" "github.com/github/github-mcp-server/pkg/translations" "github.com/github/github-mcp-server/pkg/utils" @@ -810,6 +811,7 @@ func ForkRepository(t translations.TranslationHelperFunc) inventory.ServerTool { mcp.Tool{ Name: "fork_repository", Description: t("TOOL_FORK_REPOSITORY_DESCRIPTION", "Fork a GitHub repository to your account or specified organization"), + Icons: octicons.Icons("repo-forked"), Annotations: &mcp.ToolAnnotations{ Title: t("TOOL_FORK_REPOSITORY_USER_TITLE", "Fork repository"), ReadOnlyHint: false, @@ -2096,6 +2098,7 @@ func StarRepository(t translations.TranslationHelperFunc) inventory.ServerTool { mcp.Tool{ Name: "star_repository", Description: t("TOOL_STAR_REPOSITORY_DESCRIPTION", "Star a GitHub repository"), + Icons: octicons.Icons("star-fill"), Annotations: &mcp.ToolAnnotations{ Title: t("TOOL_STAR_REPOSITORY_USER_TITLE", "Star repository"), ReadOnlyHint: false, diff --git a/pkg/inventory/server_tool.go b/pkg/inventory/server_tool.go index e4608f799..b21df2520 100644 --- a/pkg/inventory/server_tool.go +++ b/pkg/inventory/server_tool.go @@ -3,8 +3,8 @@ package inventory import ( "context" "encoding/json" - "fmt" + "github.com/github/github-mcp-server/pkg/octicons" "github.com/modelcontextprotocol/go-sdk/mcp" ) @@ -33,29 +33,10 @@ type ToolsetMetadata struct { Icon string } -// OcticonURL returns the CDN URL for a GitHub Octicon SVG. Size should be 16 or 24. -func OcticonURL(name string, size int) string { - return fmt.Sprintf("https://raw.githubusercontent.com/primer/octicons/main/icons/%s-%d.svg", name, size) -} - // Icons returns MCP Icon objects for this toolset, or nil if no icon is set. // Icons are provided in both 16x16 and 24x24 sizes. func (tm ToolsetMetadata) Icons() []mcp.Icon { - if tm.Icon == "" { - return nil - } - return []mcp.Icon{ - { - Source: OcticonURL(tm.Icon, 16), - MIMEType: "image/svg+xml", - Sizes: []string{"16x16"}, - }, - { - Source: OcticonURL(tm.Icon, 24), - MIMEType: "image/svg+xml", - Sizes: []string{"24x24"}, - }, - } + return octicons.Icons(tm.Icon) } // ServerTool represents an MCP tool with metadata and a handler generator function. @@ -112,14 +93,17 @@ func (st *ServerTool) Handler(deps any) mcp.ToolHandler { // RegisterFunc registers the tool with the server using the provided dependencies. // Icons are automatically applied from the toolset metadata if not already set. +// A shallow copy of the tool is made to avoid mutating the original ServerTool. // Panics if the tool has no handler - all tools should have handlers. func (st *ServerTool) RegisterFunc(s *mcp.Server, deps any) { handler := st.Handler(deps) // This will panic if HandlerFunc is nil + // Make a shallow copy of the tool to avoid mutating the original + toolCopy := st.Tool // Apply icons from toolset metadata if tool doesn't have icons set - if len(st.Tool.Icons) == 0 { - st.Tool.Icons = st.Toolset.Icons() + if len(toolCopy.Icons) == 0 { + toolCopy.Icons = st.Toolset.Icons() } - s.AddTool(&st.Tool, handler) + s.AddTool(&toolCopy, handler) } // NewServerTool creates a ServerTool from a tool definition, toolset metadata, and a typed handler function. diff --git a/pkg/octicons/octicons.go b/pkg/octicons/octicons.go new file mode 100644 index 000000000..901e62c54 --- /dev/null +++ b/pkg/octicons/octicons.go @@ -0,0 +1,46 @@ +// Package octicons provides helpers for working with GitHub Octicon icons. +// See https://primer.style/foundations/icons for available icons. +package octicons + +import ( + "fmt" + + "github.com/modelcontextprotocol/go-sdk/mcp" +) + +// Size represents the size of an Octicon icon. +type Size int + +const ( + // SizeSM is the small (16x16) icon size. + SizeSM Size = 16 + // SizeLG is the large (24x24) icon size. + SizeLG Size = 24 +) + +// URL returns the CDN URL for a GitHub Octicon SVG. +func URL(name string, size Size) string { + return fmt.Sprintf("https://raw.githubusercontent.com/primer/octicons/main/icons/%s-%d.svg", name, size) +} + +// Icons returns MCP Icon objects for the given octicon name in both 16x16 and 24x24 sizes. +// Use this to set custom icons on individual tools that should override their toolset's default icon. +// The name should be the base octicon name without size suffix (e.g., "copilot" not "copilot-16"). +// See https://primer.style/foundations/icons for available icons. +func Icons(name string) []mcp.Icon { + if name == "" { + return nil + } + return []mcp.Icon{ + { + Source: URL(name, SizeSM), + MIMEType: "image/svg+xml", + Sizes: []string{"16x16"}, + }, + { + Source: URL(name, SizeLG), + MIMEType: "image/svg+xml", + Sizes: []string{"24x24"}, + }, + } +} diff --git a/pkg/octicons/octicons_test.go b/pkg/octicons/octicons_test.go new file mode 100644 index 000000000..204b62c7b --- /dev/null +++ b/pkg/octicons/octicons_test.go @@ -0,0 +1,104 @@ +package octicons + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestURL(t *testing.T) { + tests := []struct { + name string + icon string + size Size + expected string + }{ + { + name: "small size", + icon: "repo", + size: SizeSM, + expected: "https://raw.githubusercontent.com/primer/octicons/main/icons/repo-16.svg", + }, + { + name: "large size", + icon: "repo", + size: SizeLG, + expected: "https://raw.githubusercontent.com/primer/octicons/main/icons/repo-24.svg", + }, + { + name: "copilot icon small", + icon: "copilot", + size: SizeSM, + expected: "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-16.svg", + }, + { + name: "copilot icon large", + icon: "copilot", + size: SizeLG, + expected: "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-24.svg", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + result := URL(tc.icon, tc.size) + assert.Equal(t, tc.expected, result) + }) + } +} + +func TestIcons(t *testing.T) { + tests := []struct { + name string + icon string + wantNil bool + wantCount int + }{ + { + name: "valid icon returns two sizes", + icon: "repo", + wantNil: false, + wantCount: 2, + }, + { + name: "copilot icon returns two sizes", + icon: "copilot", + wantNil: false, + wantCount: 2, + }, + { + name: "empty name returns nil", + icon: "", + wantNil: true, + wantCount: 0, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + result := Icons(tc.icon) + if tc.wantNil { + assert.Nil(t, result) + return + } + assert.NotNil(t, result) + assert.Len(t, result, tc.wantCount) + + // Verify first icon is 16x16 + assert.Equal(t, URL(tc.icon, SizeSM), result[0].Source) + assert.Equal(t, "image/svg+xml", result[0].MIMEType) + assert.Equal(t, []string{"16x16"}, result[0].Sizes) + + // Verify second icon is 24x24 + assert.Equal(t, URL(tc.icon, SizeLG), result[1].Source) + assert.Equal(t, "image/svg+xml", result[1].MIMEType) + assert.Equal(t, []string{"24x24"}, result[1].Sizes) + }) + } +} + +func TestSizeConstants(t *testing.T) { + // Verify size constants have expected values + assert.Equal(t, Size(16), SizeSM) + assert.Equal(t, Size(24), SizeLG) +} From a89bf6eb8682e0ee61dc57cd89328e9f9ef88008 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Mon, 15 Dec 2025 01:17:40 +0100 Subject: [PATCH 04/21] Add GitHub mark icon to server metadata Add the mark-github octicon to the server's Implementation struct so that MCP clients can display the GitHub logo for this server. The icon is provided in both 16x16 and 24x24 SVG sizes. --- pkg/github/server.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/github/server.go b/pkg/github/server.go index a9c9305a2..8248da58f 100644 --- a/pkg/github/server.go +++ b/pkg/github/server.go @@ -8,6 +8,7 @@ import ( "strconv" "strings" + "github.com/github/github-mcp-server/pkg/octicons" "github.com/github/github-mcp-server/pkg/utils" "github.com/google/go-github/v79/github" "github.com/google/jsonschema-go/jsonschema" @@ -26,6 +27,7 @@ func NewServer(version string, opts *mcp.ServerOptions) *mcp.Server { Name: "github-mcp-server", Title: "GitHub MCP Server", Version: version, + Icons: octicons.Icons("mark-github"), }, opts) return s From d750be66f4455af00a2d8c4f53b90ac2630e028a Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Mon, 15 Dec 2025 23:27:05 +0100 Subject: [PATCH 05/21] Fix rebase conflicts: use Registry methods and NullTranslationHelper - Remove duplicate old toolsets functions (AvailableToolsets, GetValidToolsetIDs, GetDefaultToolsetIDs) - Use Registry.AvailableToolsets() and Registry.HasToolset() instead - Replace stubTranslator with translations.NullTranslationHelper - Use new SDK Capabilities struct instead of deprecated HasTools/HasResources/HasPrompts - Add icon-related tests to registry_test.go --- internal/ghmcp/server.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/internal/ghmcp/server.go b/internal/ghmcp/server.go index 0b5e41e3c..4842b2c64 100644 --- a/internal/ghmcp/server.go +++ b/internal/ghmcp/server.go @@ -179,9 +179,11 @@ func NewMCPServer(cfg MCPServerConfig) (*mcp.Server, error) { // In dynamic mode, explicitly advertise capabilities since tools/resources/prompts // may be enabled at runtime even if none are registered initially. if cfg.DynamicToolsets { - serverOpts.HasTools = true - serverOpts.HasResources = true - serverOpts.HasPrompts = true + serverOpts.Capabilities = &mcp.ServerCapabilities{ + Tools: &mcp.ToolCapabilities{}, + Resources: &mcp.ResourceCapabilities{}, + Prompts: &mcp.PromptCapabilities{}, + } } ghServer := github.NewServer(cfg.Version, serverOpts) From 83b24eb617f2327b153665842f109e7afed35958 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Mon, 15 Dec 2025 23:39:14 +0100 Subject: [PATCH 06/21] Use embedded data URIs for Octicon icons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Embed SVG icons using go:embed for offline use and faster loading - Convert icons to base64 data URIs at runtime - Fall back to CDN URL for non-embedded icons - Add test to verify all toolset icons are properly embedded - 44 SVG files (22 icons × 2 sizes) totaling ~27KB --- pkg/octicons/icons/apps-16.svg | 1 + pkg/octicons/icons/apps-24.svg | 1 + pkg/octicons/icons/beaker-16.svg | 1 + pkg/octicons/icons/beaker-24.svg | 1 + pkg/octicons/icons/bell-16.svg | 1 + pkg/octicons/icons/bell-24.svg | 1 + pkg/octicons/icons/check-circle-16.svg | 1 + pkg/octicons/icons/check-circle-24.svg | 1 + pkg/octicons/icons/codescan-16.svg | 1 + pkg/octicons/icons/codescan-24.svg | 1 + pkg/octicons/icons/comment-discussion-16.svg | 1 + pkg/octicons/icons/comment-discussion-24.svg | 1 + pkg/octicons/icons/dependabot-16.svg | 1 + pkg/octicons/icons/dependabot-24.svg | 1 + pkg/octicons/icons/git-branch-16.svg | 1 + pkg/octicons/icons/git-branch-24.svg | 1 + pkg/octicons/icons/git-pull-request-16.svg | 1 + pkg/octicons/icons/git-pull-request-24.svg | 1 + pkg/octicons/icons/issue-opened-16.svg | 1 + pkg/octicons/icons/issue-opened-24.svg | 1 + pkg/octicons/icons/logo-gist-16.svg | 1 + pkg/octicons/icons/logo-gist-24.svg | 1 + pkg/octicons/icons/organization-16.svg | 1 + pkg/octicons/icons/organization-24.svg | 1 + pkg/octicons/icons/people-16.svg | 1 + pkg/octicons/icons/people-24.svg | 1 + pkg/octicons/icons/person-16.svg | 1 + pkg/octicons/icons/person-24.svg | 1 + pkg/octicons/icons/project-16.svg | 1 + pkg/octicons/icons/project-24.svg | 1 + pkg/octicons/icons/repo-16.svg | 1 + pkg/octicons/icons/repo-24.svg | 1 + pkg/octicons/icons/shield-16.svg | 1 + pkg/octicons/icons/shield-24.svg | 1 + pkg/octicons/icons/shield-lock-16.svg | 1 + pkg/octicons/icons/shield-lock-24.svg | 1 + pkg/octicons/icons/star-16.svg | 1 + pkg/octicons/icons/star-24.svg | 1 + pkg/octicons/icons/tag-16.svg | 1 + pkg/octicons/icons/tag-24.svg | 1 + pkg/octicons/icons/tools-16.svg | 1 + pkg/octicons/icons/tools-24.svg | 1 + pkg/octicons/icons/workflow-16.svg | 1 + pkg/octicons/icons/workflow-24.svg | 1 + pkg/octicons/octicons.go | 26 ++++-- pkg/octicons/octicons_test.go | 83 +++++++++++++------- 46 files changed, 117 insertions(+), 36 deletions(-) create mode 100644 pkg/octicons/icons/apps-16.svg create mode 100644 pkg/octicons/icons/apps-24.svg create mode 100644 pkg/octicons/icons/beaker-16.svg create mode 100644 pkg/octicons/icons/beaker-24.svg create mode 100644 pkg/octicons/icons/bell-16.svg create mode 100644 pkg/octicons/icons/bell-24.svg create mode 100644 pkg/octicons/icons/check-circle-16.svg create mode 100644 pkg/octicons/icons/check-circle-24.svg create mode 100644 pkg/octicons/icons/codescan-16.svg create mode 100644 pkg/octicons/icons/codescan-24.svg create mode 100644 pkg/octicons/icons/comment-discussion-16.svg create mode 100644 pkg/octicons/icons/comment-discussion-24.svg create mode 100644 pkg/octicons/icons/dependabot-16.svg create mode 100644 pkg/octicons/icons/dependabot-24.svg create mode 100644 pkg/octicons/icons/git-branch-16.svg create mode 100644 pkg/octicons/icons/git-branch-24.svg create mode 100644 pkg/octicons/icons/git-pull-request-16.svg create mode 100644 pkg/octicons/icons/git-pull-request-24.svg create mode 100644 pkg/octicons/icons/issue-opened-16.svg create mode 100644 pkg/octicons/icons/issue-opened-24.svg create mode 100644 pkg/octicons/icons/logo-gist-16.svg create mode 100644 pkg/octicons/icons/logo-gist-24.svg create mode 100644 pkg/octicons/icons/organization-16.svg create mode 100644 pkg/octicons/icons/organization-24.svg create mode 100644 pkg/octicons/icons/people-16.svg create mode 100644 pkg/octicons/icons/people-24.svg create mode 100644 pkg/octicons/icons/person-16.svg create mode 100644 pkg/octicons/icons/person-24.svg create mode 100644 pkg/octicons/icons/project-16.svg create mode 100644 pkg/octicons/icons/project-24.svg create mode 100644 pkg/octicons/icons/repo-16.svg create mode 100644 pkg/octicons/icons/repo-24.svg create mode 100644 pkg/octicons/icons/shield-16.svg create mode 100644 pkg/octicons/icons/shield-24.svg create mode 100644 pkg/octicons/icons/shield-lock-16.svg create mode 100644 pkg/octicons/icons/shield-lock-24.svg create mode 100644 pkg/octicons/icons/star-16.svg create mode 100644 pkg/octicons/icons/star-24.svg create mode 100644 pkg/octicons/icons/tag-16.svg create mode 100644 pkg/octicons/icons/tag-24.svg create mode 100644 pkg/octicons/icons/tools-16.svg create mode 100644 pkg/octicons/icons/tools-24.svg create mode 100644 pkg/octicons/icons/workflow-16.svg create mode 100644 pkg/octicons/icons/workflow-24.svg diff --git a/pkg/octicons/icons/apps-16.svg b/pkg/octicons/icons/apps-16.svg new file mode 100644 index 000000000..a08866ff7 --- /dev/null +++ b/pkg/octicons/icons/apps-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/apps-24.svg b/pkg/octicons/icons/apps-24.svg new file mode 100644 index 000000000..2514548bc --- /dev/null +++ b/pkg/octicons/icons/apps-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/beaker-16.svg b/pkg/octicons/icons/beaker-16.svg new file mode 100644 index 000000000..b181d024b --- /dev/null +++ b/pkg/octicons/icons/beaker-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/beaker-24.svg b/pkg/octicons/icons/beaker-24.svg new file mode 100644 index 000000000..18c2efae7 --- /dev/null +++ b/pkg/octicons/icons/beaker-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/bell-16.svg b/pkg/octicons/icons/bell-16.svg new file mode 100644 index 000000000..632efe9cb --- /dev/null +++ b/pkg/octicons/icons/bell-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/bell-24.svg b/pkg/octicons/icons/bell-24.svg new file mode 100644 index 000000000..a5fa85a10 --- /dev/null +++ b/pkg/octicons/icons/bell-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/check-circle-16.svg b/pkg/octicons/icons/check-circle-16.svg new file mode 100644 index 000000000..a9b3c5135 --- /dev/null +++ b/pkg/octicons/icons/check-circle-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/check-circle-24.svg b/pkg/octicons/icons/check-circle-24.svg new file mode 100644 index 000000000..f54b14187 --- /dev/null +++ b/pkg/octicons/icons/check-circle-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/codescan-16.svg b/pkg/octicons/icons/codescan-16.svg new file mode 100644 index 000000000..ef1e624d1 --- /dev/null +++ b/pkg/octicons/icons/codescan-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/codescan-24.svg b/pkg/octicons/icons/codescan-24.svg new file mode 100644 index 000000000..e041aa518 --- /dev/null +++ b/pkg/octicons/icons/codescan-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/comment-discussion-16.svg b/pkg/octicons/icons/comment-discussion-16.svg new file mode 100644 index 000000000..e975d6e95 --- /dev/null +++ b/pkg/octicons/icons/comment-discussion-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/comment-discussion-24.svg b/pkg/octicons/icons/comment-discussion-24.svg new file mode 100644 index 000000000..b36b39964 --- /dev/null +++ b/pkg/octicons/icons/comment-discussion-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/dependabot-16.svg b/pkg/octicons/icons/dependabot-16.svg new file mode 100644 index 000000000..69a41b41b --- /dev/null +++ b/pkg/octicons/icons/dependabot-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/dependabot-24.svg b/pkg/octicons/icons/dependabot-24.svg new file mode 100644 index 000000000..7d85fadc2 --- /dev/null +++ b/pkg/octicons/icons/dependabot-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/git-branch-16.svg b/pkg/octicons/icons/git-branch-16.svg new file mode 100644 index 000000000..2d6fa7fc1 --- /dev/null +++ b/pkg/octicons/icons/git-branch-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/git-branch-24.svg b/pkg/octicons/icons/git-branch-24.svg new file mode 100644 index 000000000..6530cb1cd --- /dev/null +++ b/pkg/octicons/icons/git-branch-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/git-pull-request-16.svg b/pkg/octicons/icons/git-pull-request-16.svg new file mode 100644 index 000000000..a1cb1ef9e --- /dev/null +++ b/pkg/octicons/icons/git-pull-request-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/git-pull-request-24.svg b/pkg/octicons/icons/git-pull-request-24.svg new file mode 100644 index 000000000..48c2a2c11 --- /dev/null +++ b/pkg/octicons/icons/git-pull-request-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/issue-opened-16.svg b/pkg/octicons/icons/issue-opened-16.svg new file mode 100644 index 000000000..914e08699 --- /dev/null +++ b/pkg/octicons/icons/issue-opened-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/issue-opened-24.svg b/pkg/octicons/icons/issue-opened-24.svg new file mode 100644 index 000000000..d58fdac4b --- /dev/null +++ b/pkg/octicons/icons/issue-opened-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/logo-gist-16.svg b/pkg/octicons/icons/logo-gist-16.svg new file mode 100644 index 000000000..ad96b20b5 --- /dev/null +++ b/pkg/octicons/icons/logo-gist-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/logo-gist-24.svg b/pkg/octicons/icons/logo-gist-24.svg new file mode 100644 index 000000000..afb311c4b --- /dev/null +++ b/pkg/octicons/icons/logo-gist-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/organization-16.svg b/pkg/octicons/icons/organization-16.svg new file mode 100644 index 000000000..757941253 --- /dev/null +++ b/pkg/octicons/icons/organization-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/organization-24.svg b/pkg/octicons/icons/organization-24.svg new file mode 100644 index 000000000..10326bb4d --- /dev/null +++ b/pkg/octicons/icons/organization-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/people-16.svg b/pkg/octicons/icons/people-16.svg new file mode 100644 index 000000000..0e87dd370 --- /dev/null +++ b/pkg/octicons/icons/people-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/people-24.svg b/pkg/octicons/icons/people-24.svg new file mode 100644 index 000000000..748e901b2 --- /dev/null +++ b/pkg/octicons/icons/people-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/person-16.svg b/pkg/octicons/icons/person-16.svg new file mode 100644 index 000000000..a58e1860b --- /dev/null +++ b/pkg/octicons/icons/person-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/person-24.svg b/pkg/octicons/icons/person-24.svg new file mode 100644 index 000000000..838233596 --- /dev/null +++ b/pkg/octicons/icons/person-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/project-16.svg b/pkg/octicons/icons/project-16.svg new file mode 100644 index 000000000..d3d685a1f --- /dev/null +++ b/pkg/octicons/icons/project-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/project-24.svg b/pkg/octicons/icons/project-24.svg new file mode 100644 index 000000000..f9172e7c7 --- /dev/null +++ b/pkg/octicons/icons/project-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/repo-16.svg b/pkg/octicons/icons/repo-16.svg new file mode 100644 index 000000000..00cc0dd8a --- /dev/null +++ b/pkg/octicons/icons/repo-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/repo-24.svg b/pkg/octicons/icons/repo-24.svg new file mode 100644 index 000000000..384a3a3bd --- /dev/null +++ b/pkg/octicons/icons/repo-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/shield-16.svg b/pkg/octicons/icons/shield-16.svg new file mode 100644 index 000000000..ddd8a6abc --- /dev/null +++ b/pkg/octicons/icons/shield-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/shield-24.svg b/pkg/octicons/icons/shield-24.svg new file mode 100644 index 000000000..44975d9a5 --- /dev/null +++ b/pkg/octicons/icons/shield-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/shield-lock-16.svg b/pkg/octicons/icons/shield-lock-16.svg new file mode 100644 index 000000000..c925971b3 --- /dev/null +++ b/pkg/octicons/icons/shield-lock-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/shield-lock-24.svg b/pkg/octicons/icons/shield-lock-24.svg new file mode 100644 index 000000000..606204be7 --- /dev/null +++ b/pkg/octicons/icons/shield-lock-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/star-16.svg b/pkg/octicons/icons/star-16.svg new file mode 100644 index 000000000..08adb3e77 --- /dev/null +++ b/pkg/octicons/icons/star-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/star-24.svg b/pkg/octicons/icons/star-24.svg new file mode 100644 index 000000000..ddd1e58be --- /dev/null +++ b/pkg/octicons/icons/star-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/tag-16.svg b/pkg/octicons/icons/tag-16.svg new file mode 100644 index 000000000..d74c2b2ef --- /dev/null +++ b/pkg/octicons/icons/tag-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/tag-24.svg b/pkg/octicons/icons/tag-24.svg new file mode 100644 index 000000000..bc619235f --- /dev/null +++ b/pkg/octicons/icons/tag-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/tools-16.svg b/pkg/octicons/icons/tools-16.svg new file mode 100644 index 000000000..038892798 --- /dev/null +++ b/pkg/octicons/icons/tools-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/tools-24.svg b/pkg/octicons/icons/tools-24.svg new file mode 100644 index 000000000..2dd47acbc --- /dev/null +++ b/pkg/octicons/icons/tools-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/workflow-16.svg b/pkg/octicons/icons/workflow-16.svg new file mode 100644 index 000000000..8f758a230 --- /dev/null +++ b/pkg/octicons/icons/workflow-16.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/icons/workflow-24.svg b/pkg/octicons/icons/workflow-24.svg new file mode 100644 index 000000000..55e30dce8 --- /dev/null +++ b/pkg/octicons/icons/workflow-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/octicons/octicons.go b/pkg/octicons/octicons.go index 901e62c54..cc07b8024 100644 --- a/pkg/octicons/octicons.go +++ b/pkg/octicons/octicons.go @@ -3,11 +3,16 @@ package octicons import ( + "embed" + "encoding/base64" "fmt" "github.com/modelcontextprotocol/go-sdk/mcp" ) +//go:embed icons/*.svg +var iconsFS embed.FS + // Size represents the size of an Octicon icon. type Size int @@ -18,14 +23,21 @@ const ( SizeLG Size = 24 ) -// URL returns the CDN URL for a GitHub Octicon SVG. -func URL(name string, size Size) string { - return fmt.Sprintf("https://raw.githubusercontent.com/primer/octicons/main/icons/%s-%d.svg", name, size) +// DataURI returns a data URI for the embedded Octicon SVG. +// If the icon is not found in the embedded filesystem, it falls back to a CDN URL. +func DataURI(name string, size Size) string { + filename := fmt.Sprintf("icons/%s-%d.svg", name, size) + data, err := iconsFS.ReadFile(filename) + if err != nil { + // Fall back to CDN URL if icon is not embedded + return fmt.Sprintf("https://raw.githubusercontent.com/primer/octicons/main/icons/%s-%d.svg", name, size) + } + return "data:image/svg+xml;base64," + base64.StdEncoding.EncodeToString(data) } // Icons returns MCP Icon objects for the given octicon name in both 16x16 and 24x24 sizes. -// Use this to set custom icons on individual tools that should override their toolset's default icon. -// The name should be the base octicon name without size suffix (e.g., "copilot" not "copilot-16"). +// Icons are embedded as data URIs for offline use and faster loading. +// The name should be the base octicon name without size suffix (e.g., "repo" not "repo-16"). // See https://primer.style/foundations/icons for available icons. func Icons(name string) []mcp.Icon { if name == "" { @@ -33,12 +45,12 @@ func Icons(name string) []mcp.Icon { } return []mcp.Icon{ { - Source: URL(name, SizeSM), + Source: DataURI(name, SizeSM), MIMEType: "image/svg+xml", Sizes: []string{"16x16"}, }, { - Source: URL(name, SizeLG), + Source: DataURI(name, SizeLG), MIMEType: "image/svg+xml", Sizes: []string{"24x24"}, }, diff --git a/pkg/octicons/octicons_test.go b/pkg/octicons/octicons_test.go index 204b62c7b..793edcd15 100644 --- a/pkg/octicons/octicons_test.go +++ b/pkg/octicons/octicons_test.go @@ -1,48 +1,54 @@ package octicons import ( + "strings" "testing" "github.com/stretchr/testify/assert" ) -func TestURL(t *testing.T) { +func TestDataURI(t *testing.T) { tests := []struct { - name string - icon string - size Size - expected string + name string + icon string + size Size + wantDataURI bool + wantFallback bool }{ { - name: "small size", - icon: "repo", - size: SizeSM, - expected: "https://raw.githubusercontent.com/primer/octicons/main/icons/repo-16.svg", + name: "embedded icon returns data URI", + icon: "repo", + size: SizeSM, + wantDataURI: true, + wantFallback: false, }, { - name: "large size", - icon: "repo", - size: SizeLG, - expected: "https://raw.githubusercontent.com/primer/octicons/main/icons/repo-24.svg", + name: "embedded icon large returns data URI", + icon: "repo", + size: SizeLG, + wantDataURI: true, + wantFallback: false, }, { - name: "copilot icon small", - icon: "copilot", - size: SizeSM, - expected: "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-16.svg", - }, - { - name: "copilot icon large", - icon: "copilot", - size: SizeLG, - expected: "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-24.svg", + name: "non-embedded icon falls back to CDN", + icon: "nonexistent-icon", + size: SizeSM, + wantDataURI: false, + wantFallback: true, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - result := URL(tc.icon, tc.size) - assert.Equal(t, tc.expected, result) + result := DataURI(tc.icon, tc.size) + if tc.wantDataURI { + assert.True(t, strings.HasPrefix(result, "data:image/svg+xml;base64,"), "expected data URI prefix") + // Verify it's valid base64 by checking it doesn't contain the fallback URL + assert.NotContains(t, result, "https://") + } + if tc.wantFallback { + assert.True(t, strings.HasPrefix(result, "https://"), "expected fallback URL") + } }) } } @@ -55,13 +61,13 @@ func TestIcons(t *testing.T) { wantCount int }{ { - name: "valid icon returns two sizes", + name: "valid embedded icon returns two sizes", icon: "repo", wantNil: false, wantCount: 2, }, { - name: "copilot icon returns two sizes", + name: "non-embedded icon still returns two sizes (fallback)", icon: "copilot", wantNil: false, wantCount: 2, @@ -85,12 +91,12 @@ func TestIcons(t *testing.T) { assert.Len(t, result, tc.wantCount) // Verify first icon is 16x16 - assert.Equal(t, URL(tc.icon, SizeSM), result[0].Source) + assert.Equal(t, DataURI(tc.icon, SizeSM), result[0].Source) assert.Equal(t, "image/svg+xml", result[0].MIMEType) assert.Equal(t, []string{"16x16"}, result[0].Sizes) // Verify second icon is 24x24 - assert.Equal(t, URL(tc.icon, SizeLG), result[1].Source) + assert.Equal(t, DataURI(tc.icon, SizeLG), result[1].Source) assert.Equal(t, "image/svg+xml", result[1].MIMEType) assert.Equal(t, []string{"24x24"}, result[1].Sizes) }) @@ -102,3 +108,22 @@ func TestSizeConstants(t *testing.T) { assert.Equal(t, Size(16), SizeSM) assert.Equal(t, Size(24), SizeLG) } + +func TestEmbeddedIconsExist(t *testing.T) { + // Test that all icons used by toolsets are properly embedded + expectedIcons := []string{ + "apps", "beaker", "bell", "check-circle", "codescan", + "comment-discussion", "dependabot", "git-branch", "git-pull-request", + "issue-opened", "logo-gist", "organization", "people", "person", + "project", "repo", "shield", "shield-lock", "star", "tag", "tools", "workflow", + } + + for _, icon := range expectedIcons { + t.Run(icon, func(t *testing.T) { + uri16 := DataURI(icon, SizeSM) + uri24 := DataURI(icon, SizeLG) + assert.True(t, strings.HasPrefix(uri16, "data:"), "16px icon %s should be embedded", icon) + assert.True(t, strings.HasPrefix(uri24, "data:"), "24px icon %s should be embedded", icon) + }) + } +} From 4c3ab5a9d3236e0f017379881a42f97f54bee360 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Mon, 15 Dec 2025 23:48:27 +0100 Subject: [PATCH 07/21] Convert icons from SVG to PNG for MCP client compatibility MCP clients don't support SVG data URIs, so convert all embedded icons to PNG format using rsvg-convert. Changes: - Convert all 44 SVG icons to PNG format - Add 8 new icons: copilot, git-merge, repo-forked, star-fill - Update octicons.go to use PNG MIME type - Add script/fetch-icons for easy icon management - Update tests and toolsnaps for PNG format --- .../assign_copilot_to_issue.snap | 8 +- pkg/github/__toolsnaps__/fork_repository.snap | 8 +- .../__toolsnaps__/merge_pull_request.snap | 8 +- .../__toolsnaps__/request_copilot_review.snap | 8 +- pkg/github/__toolsnaps__/star_repository.snap | 8 +- pkg/octicons/icons/apps-16.png | Bin 0 -> 210 bytes pkg/octicons/icons/apps-16.svg | 1 - pkg/octicons/icons/apps-24.png | Bin 0 -> 287 bytes pkg/octicons/icons/apps-24.svg | 1 - pkg/octicons/icons/beaker-16.png | Bin 0 -> 298 bytes pkg/octicons/icons/beaker-16.svg | 1 - pkg/octicons/icons/beaker-24.png | Bin 0 -> 377 bytes pkg/octicons/icons/beaker-24.svg | 1 - pkg/octicons/icons/bell-16.png | Bin 0 -> 291 bytes pkg/octicons/icons/bell-16.svg | 1 - pkg/octicons/icons/bell-24.png | Bin 0 -> 399 bytes pkg/octicons/icons/bell-24.svg | 1 - pkg/octicons/icons/check-circle-16.png | Bin 0 -> 346 bytes pkg/octicons/icons/check-circle-16.svg | 1 - pkg/octicons/icons/check-circle-24.png | Bin 0 -> 536 bytes pkg/octicons/icons/check-circle-24.svg | 1 - pkg/octicons/icons/codescan-16.png | Bin 0 -> 398 bytes pkg/octicons/icons/codescan-16.svg | 1 - pkg/octicons/icons/codescan-24.png | Bin 0 -> 521 bytes pkg/octicons/icons/codescan-24.svg | 1 - pkg/octicons/icons/comment-discussion-16.png | Bin 0 -> 295 bytes pkg/octicons/icons/comment-discussion-16.svg | 1 - pkg/octicons/icons/comment-discussion-24.png | Bin 0 -> 339 bytes pkg/octicons/icons/comment-discussion-24.svg | 1 - pkg/octicons/icons/copilot-16.png | Bin 0 -> 408 bytes pkg/octicons/icons/copilot-24.png | Bin 0 -> 554 bytes pkg/octicons/icons/dependabot-16.png | Bin 0 -> 305 bytes pkg/octicons/icons/dependabot-16.svg | 1 - pkg/octicons/icons/dependabot-24.png | Bin 0 -> 323 bytes pkg/octicons/icons/dependabot-24.svg | 1 - pkg/octicons/icons/git-branch-16.png | Bin 0 -> 300 bytes pkg/octicons/icons/git-branch-16.svg | 1 - pkg/octicons/icons/git-branch-24.png | Bin 0 -> 469 bytes pkg/octicons/icons/git-branch-24.svg | 1 - pkg/octicons/icons/git-merge-16.png | Bin 0 -> 285 bytes pkg/octicons/icons/git-merge-24.png | Bin 0 -> 446 bytes pkg/octicons/icons/git-pull-request-16.png | Bin 0 -> 292 bytes pkg/octicons/icons/git-pull-request-16.svg | 1 - pkg/octicons/icons/git-pull-request-24.png | Bin 0 -> 478 bytes pkg/octicons/icons/git-pull-request-24.svg | 1 - pkg/octicons/icons/issue-opened-16.png | Bin 0 -> 335 bytes pkg/octicons/icons/issue-opened-16.svg | 1 - pkg/octicons/icons/issue-opened-24.png | Bin 0 -> 490 bytes pkg/octicons/icons/issue-opened-24.svg | 1 - pkg/octicons/icons/logo-gist-16.png | Bin 0 -> 445 bytes pkg/octicons/icons/logo-gist-16.svg | 1 - pkg/octicons/icons/logo-gist-24.png | Bin 0 -> 665 bytes pkg/octicons/icons/logo-gist-24.svg | 1 - pkg/octicons/icons/organization-16.png | Bin 0 -> 262 bytes pkg/octicons/icons/organization-16.svg | 1 - pkg/octicons/icons/organization-24.png | Bin 0 -> 348 bytes pkg/octicons/icons/organization-24.svg | 1 - pkg/octicons/icons/people-16.png | Bin 0 -> 305 bytes pkg/octicons/icons/people-16.svg | 1 - pkg/octicons/icons/people-24.png | Bin 0 -> 525 bytes pkg/octicons/icons/people-24.svg | 1 - pkg/octicons/icons/person-16.png | Bin 0 -> 287 bytes pkg/octicons/icons/person-16.svg | 1 - pkg/octicons/icons/person-24.png | Bin 0 -> 410 bytes pkg/octicons/icons/person-24.svg | 1 - pkg/octicons/icons/project-16.png | Bin 0 -> 239 bytes pkg/octicons/icons/project-16.svg | 1 - pkg/octicons/icons/project-24.png | Bin 0 -> 267 bytes pkg/octicons/icons/project-24.svg | 1 - pkg/octicons/icons/repo-16.png | Bin 0 -> 248 bytes pkg/octicons/icons/repo-16.svg | 1 - pkg/octicons/icons/repo-24.png | Bin 0 -> 310 bytes pkg/octicons/icons/repo-24.svg | 1 - pkg/octicons/icons/repo-forked-16.png | Bin 0 -> 312 bytes pkg/octicons/icons/repo-forked-24.png | Bin 0 -> 472 bytes pkg/octicons/icons/shield-16.png | Bin 0 -> 364 bytes pkg/octicons/icons/shield-16.svg | 1 - pkg/octicons/icons/shield-24.png | Bin 0 -> 477 bytes pkg/octicons/icons/shield-24.svg | 1 - pkg/octicons/icons/shield-lock-16.png | Bin 0 -> 366 bytes pkg/octicons/icons/shield-lock-16.svg | 1 - pkg/octicons/icons/shield-lock-24.png | Bin 0 -> 503 bytes pkg/octicons/icons/shield-lock-24.svg | 1 - pkg/octicons/icons/star-16.png | Bin 0 -> 345 bytes pkg/octicons/icons/star-16.svg | 1 - pkg/octicons/icons/star-24.png | Bin 0 -> 488 bytes pkg/octicons/icons/star-24.svg | 1 - pkg/octicons/icons/star-fill-16.png | Bin 0 -> 280 bytes pkg/octicons/icons/star-fill-24.png | Bin 0 -> 356 bytes pkg/octicons/icons/tag-16.png | Bin 0 -> 288 bytes pkg/octicons/icons/tag-16.svg | 1 - pkg/octicons/icons/tag-24.png | Bin 0 -> 316 bytes pkg/octicons/icons/tag-24.svg | 1 - pkg/octicons/icons/tools-16.png | Bin 0 -> 364 bytes pkg/octicons/icons/tools-16.svg | 1 - pkg/octicons/icons/tools-24.png | Bin 0 -> 489 bytes pkg/octicons/icons/tools-24.svg | 1 - pkg/octicons/icons/workflow-16.png | Bin 0 -> 249 bytes pkg/octicons/icons/workflow-16.svg | 1 - pkg/octicons/icons/workflow-24.png | Bin 0 -> 351 bytes pkg/octicons/icons/workflow-24.svg | 1 - pkg/octicons/octicons.go | 19 ++-- pkg/octicons/octicons_test.go | 68 +++++++------- script/fetch-icons | 83 ++++++++++++++++++ 104 files changed, 143 insertions(+), 111 deletions(-) create mode 100644 pkg/octicons/icons/apps-16.png delete mode 100644 pkg/octicons/icons/apps-16.svg create mode 100644 pkg/octicons/icons/apps-24.png delete mode 100644 pkg/octicons/icons/apps-24.svg create mode 100644 pkg/octicons/icons/beaker-16.png delete mode 100644 pkg/octicons/icons/beaker-16.svg create mode 100644 pkg/octicons/icons/beaker-24.png delete mode 100644 pkg/octicons/icons/beaker-24.svg create mode 100644 pkg/octicons/icons/bell-16.png delete mode 100644 pkg/octicons/icons/bell-16.svg create mode 100644 pkg/octicons/icons/bell-24.png delete mode 100644 pkg/octicons/icons/bell-24.svg create mode 100644 pkg/octicons/icons/check-circle-16.png delete mode 100644 pkg/octicons/icons/check-circle-16.svg create mode 100644 pkg/octicons/icons/check-circle-24.png delete mode 100644 pkg/octicons/icons/check-circle-24.svg create mode 100644 pkg/octicons/icons/codescan-16.png delete mode 100644 pkg/octicons/icons/codescan-16.svg create mode 100644 pkg/octicons/icons/codescan-24.png delete mode 100644 pkg/octicons/icons/codescan-24.svg create mode 100644 pkg/octicons/icons/comment-discussion-16.png delete mode 100644 pkg/octicons/icons/comment-discussion-16.svg create mode 100644 pkg/octicons/icons/comment-discussion-24.png delete mode 100644 pkg/octicons/icons/comment-discussion-24.svg create mode 100644 pkg/octicons/icons/copilot-16.png create mode 100644 pkg/octicons/icons/copilot-24.png create mode 100644 pkg/octicons/icons/dependabot-16.png delete mode 100644 pkg/octicons/icons/dependabot-16.svg create mode 100644 pkg/octicons/icons/dependabot-24.png delete mode 100644 pkg/octicons/icons/dependabot-24.svg create mode 100644 pkg/octicons/icons/git-branch-16.png delete mode 100644 pkg/octicons/icons/git-branch-16.svg create mode 100644 pkg/octicons/icons/git-branch-24.png delete mode 100644 pkg/octicons/icons/git-branch-24.svg create mode 100644 pkg/octicons/icons/git-merge-16.png create mode 100644 pkg/octicons/icons/git-merge-24.png create mode 100644 pkg/octicons/icons/git-pull-request-16.png delete mode 100644 pkg/octicons/icons/git-pull-request-16.svg create mode 100644 pkg/octicons/icons/git-pull-request-24.png delete mode 100644 pkg/octicons/icons/git-pull-request-24.svg create mode 100644 pkg/octicons/icons/issue-opened-16.png delete mode 100644 pkg/octicons/icons/issue-opened-16.svg create mode 100644 pkg/octicons/icons/issue-opened-24.png delete mode 100644 pkg/octicons/icons/issue-opened-24.svg create mode 100644 pkg/octicons/icons/logo-gist-16.png delete mode 100644 pkg/octicons/icons/logo-gist-16.svg create mode 100644 pkg/octicons/icons/logo-gist-24.png delete mode 100644 pkg/octicons/icons/logo-gist-24.svg create mode 100644 pkg/octicons/icons/organization-16.png delete mode 100644 pkg/octicons/icons/organization-16.svg create mode 100644 pkg/octicons/icons/organization-24.png delete mode 100644 pkg/octicons/icons/organization-24.svg create mode 100644 pkg/octicons/icons/people-16.png delete mode 100644 pkg/octicons/icons/people-16.svg create mode 100644 pkg/octicons/icons/people-24.png delete mode 100644 pkg/octicons/icons/people-24.svg create mode 100644 pkg/octicons/icons/person-16.png delete mode 100644 pkg/octicons/icons/person-16.svg create mode 100644 pkg/octicons/icons/person-24.png delete mode 100644 pkg/octicons/icons/person-24.svg create mode 100644 pkg/octicons/icons/project-16.png delete mode 100644 pkg/octicons/icons/project-16.svg create mode 100644 pkg/octicons/icons/project-24.png delete mode 100644 pkg/octicons/icons/project-24.svg create mode 100644 pkg/octicons/icons/repo-16.png delete mode 100644 pkg/octicons/icons/repo-16.svg create mode 100644 pkg/octicons/icons/repo-24.png delete mode 100644 pkg/octicons/icons/repo-24.svg create mode 100644 pkg/octicons/icons/repo-forked-16.png create mode 100644 pkg/octicons/icons/repo-forked-24.png create mode 100644 pkg/octicons/icons/shield-16.png delete mode 100644 pkg/octicons/icons/shield-16.svg create mode 100644 pkg/octicons/icons/shield-24.png delete mode 100644 pkg/octicons/icons/shield-24.svg create mode 100644 pkg/octicons/icons/shield-lock-16.png delete mode 100644 pkg/octicons/icons/shield-lock-16.svg create mode 100644 pkg/octicons/icons/shield-lock-24.png delete mode 100644 pkg/octicons/icons/shield-lock-24.svg create mode 100644 pkg/octicons/icons/star-16.png delete mode 100644 pkg/octicons/icons/star-16.svg create mode 100644 pkg/octicons/icons/star-24.png delete mode 100644 pkg/octicons/icons/star-24.svg create mode 100644 pkg/octicons/icons/star-fill-16.png create mode 100644 pkg/octicons/icons/star-fill-24.png create mode 100644 pkg/octicons/icons/tag-16.png delete mode 100644 pkg/octicons/icons/tag-16.svg create mode 100644 pkg/octicons/icons/tag-24.png delete mode 100644 pkg/octicons/icons/tag-24.svg create mode 100644 pkg/octicons/icons/tools-16.png delete mode 100644 pkg/octicons/icons/tools-16.svg create mode 100644 pkg/octicons/icons/tools-24.png delete mode 100644 pkg/octicons/icons/tools-24.svg create mode 100644 pkg/octicons/icons/workflow-16.png delete mode 100644 pkg/octicons/icons/workflow-16.svg create mode 100644 pkg/octicons/icons/workflow-24.png delete mode 100644 pkg/octicons/icons/workflow-24.svg create mode 100755 script/fetch-icons diff --git a/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap b/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap index 1e0ea0404..2259514e1 100644 --- a/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap +++ b/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap @@ -29,15 +29,15 @@ "name": "assign_copilot_to_issue", "icons": [ { - "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-16.svg", - "mimeType": "image/svg+xml", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABTUlEQVQ4ja3TP2tUURAF8N8+JEtA1CKCuCAGtFJIrLZJmbBgUkax8RMICmIv5Cuo/VpoodhJshYpDClSSUIaWVdRBBX7YCKua/Hm4fDYCEIOPM78OXPv3Ln3cYRo4RHeYojPuIt7YQ8j9xBnq6JG8HHs4AzWMMAsOpHvRf4CruILZrBXLXQDIyykjpoR+x12hU7Er0MRwfPBG0lYJLuR7NfB01n0M/hEEi6l4sUUP5lrjoUzCH6BdeUsbmI34l3M41twrnEKr+Jcn4K/45nyZlp4HrERPgb3qm4e+zus+nnrqHKj+LpwUFsArmEr+VtYTn61wH6BiTE7XUI7+W1cHqNrFtIwEj7gXfIHeD9G16d8XdvR0hPlCzwMV/A0tG8wXQ1lEiu4FXYfm8p/AM5hDhfxAw9wH/v1HU7jDlaVdz7EL3zFS9zG1D86/H/8AaLBT77Nh5ITAAAAAElFTkSuQmCC", + "mimeType": "image/png", "sizes": [ "16x16" ] }, { - "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-24.svg", - "mimeType": "image/svg+xml", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAB30lEQVRIid3VS29NURQH8J8bTVOvRErqEQNSA/UYCK2ExIhIiCC+QDsRJGVCYlofgDDgSxhIOkAMGo9JE0OkA0xK6lVXQlrkugZ733T32OcejxH/ZGffs/Za/7XOf+11Lv87luAkRvESX/EFk7iJE1j8p+RDeIdmxXqLwd8h3oixXyAurjH0VpGvEKSo4wL60RXXUEI2mNgHom89xna3S3AOjUicwxM8Ljnrj7HnU+PCgtMWPMd4CUm9TXHjeIFd7RKsFppWhg2CRGV4g2WpoVZw6BL6kMNm9GAV+kp8VqKzLHuvoOF3P/egU5iFVpNHM0QD8awhuU0L4n4cVwSJprAUdwVNmziATTgbYy7hKW7F5/XYh4+R4xWGcUMMbiTVrcV1odmz+IT7OJpUewwP4tksnuEa1iQ8DeyHCfMH5m+Rck0UDbkE24TvztYKWy5Bs3iLcjiCw+ZLlLNlURO0qvJJ9zJbDo0aLlY4vY77VIUth5HWj9OYEXQbFgauhRq2m7vSZbZFOBM5ZnCqmK0Pd6LDe2EudqOjTYUd2IOrmI6xt4WZoVBBC3uFgToYCT4LH7JJc9L0YB12Cv9o34Tpvox7KVkuQQvLcSi+xQ5hALtjldMx4SM8jOQf2nD9w/gBIjKNY9qqxzEAAAAASUVORK5CYII=", + "mimeType": "image/png", "sizes": [ "24x24" ] diff --git a/pkg/github/__toolsnaps__/fork_repository.snap b/pkg/github/__toolsnaps__/fork_repository.snap index 96e1caec2..a8742d427 100644 --- a/pkg/github/__toolsnaps__/fork_repository.snap +++ b/pkg/github/__toolsnaps__/fork_repository.snap @@ -27,15 +27,15 @@ "name": "fork_repository", "icons": [ { - "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/repo-forked-16.svg", - "mimeType": "image/svg+xml", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAA7UlEQVQ4ja3RwS5DURAG4K9leZdiResRBI/CgvAInqM79QDdS5q+g6WNWKAvQIhYaIhloxady3Gdi5v4k0nOmf+ff2bO4R+xhUs8o49WwrVxjJfQbOYMrnGLIWbYTridyA1Dc5U6l1jFGXpxX0m48twLTcp9oB9dZnhCN+HWMEn4o5xBG4MQdDJ8J7iB5H3SFd4wjnORMShz4zDKolsZtRqT6nQt39Ex/4Fl7EbuBI8Y4aauew6nEbVY/IErsGQ+eoHXJp0XcOFz93NfH/xXbEThYcQM6zlh3Qr3mGIv7lM8NJkADsLoDvtNi/+Md68dOylWb7mlAAAAAElFTkSuQmCC", + "mimeType": "image/png", "sizes": [ "16x16" ] }, { - "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/repo-forked-24.svg", - "mimeType": "image/svg+xml", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABjUlEQVRIibXUP2sVQRQF8F8ieVWMsREUAj7LiClMpZVYCZaCRT5CLDR22qifINFOGzvBP6B2ok266CdIFREsNJoQJJ2Bp8Xc1SHZN/tW3zsw3N2zZ+65OzN3GDEO1XDzuIpT+ISfDTkO4wouYg9fSuJ76OFXjI/oFvTd0FT6Hu72E8+H4CGO4Dy28Kpg8Do05zCNR5HjbJ34RlQxnXEr2CkY7GA5ez8aOa5XxHj2cTPibMadzvg6bO7Tz2b8AUxK67mF+3gX1SwWDK6F5m3M2cZG5KpFV1rz3RAuYqxgMBYmGzHnJU4W9H/Qk07UoKhO3wGM15H4ijMtDOY0nP9+FS1hqqCbws3Q3mlj0MEzfxuoaTzFRF2i0gbCBanhqr9YiPgk4g+sYbVN9SWstk3Wb5OHhpEbDIpJPMB3fJO6tm+3/gteSHf94xh7eD6s5Ceko3gr424Hd7xp8iB7cCziesat7/v2X+hI6/5eusi6+BBcZxgGcFm6LavO3Q2uEU2dnGMGl+L5DT63mDs6/AYzsl+gNMh4PwAAAABJRU5ErkJggg==", + "mimeType": "image/png", "sizes": [ "24x24" ] diff --git a/pkg/github/__toolsnaps__/merge_pull_request.snap b/pkg/github/__toolsnaps__/merge_pull_request.snap index e2f89e9f3..251e17503 100644 --- a/pkg/github/__toolsnaps__/merge_pull_request.snap +++ b/pkg/github/__toolsnaps__/merge_pull_request.snap @@ -45,15 +45,15 @@ "name": "merge_pull_request", "icons": [ { - "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/git-merge-16.svg", - "mimeType": "image/svg+xml", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAA0klEQVQ4jbXRPVICQRCG4QcCr7FXkMLI2MhQLwIxiQkpYEYV5QHUyMAzGFtwA6oIDPjxAK7B9hZT6x9j6ZdM9Uz329Nf84c6wRyvGKOdC5hjiXuUuDikKO1S4AnDJM7SODqXWP8G0MZNAB5zimq9qTyAc0xw1Mi9xhYLdD8DXsUPJnGuMMMA07i7i0bP3wHgDA94sfemRCcg258ATRXYJKBRMyE18asNFOjjEq3mYz13GZ2y17jDLY4D0jukKF3jEqcqx+s4S13VanYqgz7M+C96B6pDN7hpxxNqAAAAAElFTkSuQmCC", + "mimeType": "image/png", "sizes": [ "16x16" ] }, { - "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/git-merge-24.svg", - "mimeType": "image/svg+xml", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABc0lEQVRIibXVv05UQRQG8B/YLkEThFZIbLRbKnZJeAsTfAQkQkEPVLZrQqM+gBYWu6FBrH0FFBIBS8ISEqAQE1iLMxsnBHaJ9+6X3Mzck5nvm/NnzjBgPLjFNo0XmMIh/pQpuI5rdNK3j8myyKcT+TuMooY2mmUJLItTP8xsDZwWIR3O5kdpfJbZnmf2wqiImLfxFl+FRwtlCRAJbeIqCS1gqEyBLjrYGQRxLnCJsUEKXOGj3iEawiJ2RbW13PPedLCdxk94fMe6xbRmS5R0WxRKJT/BXQLrOMcb0S6+4AfOsnUrIldz6b+Gb3gpvO/pwVqaP8UG9vDbvzbS/T5n+x4l21Iv8psCvdASYakn8g+i3VTLEpgUMe96c43VfhtaIhS/8Er/i1bBPF7rc/IRHAiXGyKpnSRSCuYT4Uxm2xaV89/Iu+l4Gr9nth1MFBHIURVJei8qoo4TJT44ROXkT+ZPPClCeFuFVDGLY2zioojAwPEXb7xhRsU8X9cAAAAASUVORK5CYII=", + "mimeType": "image/png", "sizes": [ "24x24" ] diff --git a/pkg/github/__toolsnaps__/request_copilot_review.snap b/pkg/github/__toolsnaps__/request_copilot_review.snap index 7765bcfa4..e395bac48 100644 --- a/pkg/github/__toolsnaps__/request_copilot_review.snap +++ b/pkg/github/__toolsnaps__/request_copilot_review.snap @@ -28,15 +28,15 @@ "name": "request_copilot_review", "icons": [ { - "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-16.svg", - "mimeType": "image/svg+xml", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABTUlEQVQ4ja3TP2tUURAF8N8+JEtA1CKCuCAGtFJIrLZJmbBgUkax8RMICmIv5Cuo/VpoodhJshYpDClSSUIaWVdRBBX7YCKua/Hm4fDYCEIOPM78OXPv3Ln3cYRo4RHeYojPuIt7YQ8j9xBnq6JG8HHs4AzWMMAsOpHvRf4CruILZrBXLXQDIyykjpoR+x12hU7Er0MRwfPBG0lYJLuR7NfB01n0M/hEEi6l4sUUP5lrjoUzCH6BdeUsbmI34l3M41twrnEKr+Jcn4K/45nyZlp4HrERPgb3qm4e+zus+nnrqHKj+LpwUFsArmEr+VtYTn61wH6BiTE7XUI7+W1cHqNrFtIwEj7gXfIHeD9G16d8XdvR0hPlCzwMV/A0tG8wXQ1lEiu4FXYfm8p/AM5hDhfxAw9wH/v1HU7jDlaVdz7EL3zFS9zG1D86/H/8AaLBT77Nh5ITAAAAAElFTkSuQmCC", + "mimeType": "image/png", "sizes": [ "16x16" ] }, { - "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/copilot-24.svg", - "mimeType": "image/svg+xml", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAB30lEQVRIid3VS29NURQH8J8bTVOvRErqEQNSA/UYCK2ExIhIiCC+QDsRJGVCYlofgDDgSxhIOkAMGo9JE0OkA0xK6lVXQlrkugZ733T32OcejxH/ZGffs/Za/7XOf+11Lv87luAkRvESX/EFk7iJE1j8p+RDeIdmxXqLwd8h3oixXyAurjH0VpGvEKSo4wL60RXXUEI2mNgHom89xna3S3AOjUicwxM8Ljnrj7HnU+PCgtMWPMd4CUm9TXHjeIFd7RKsFppWhg2CRGV4g2WpoVZw6BL6kMNm9GAV+kp8VqKzLHuvoOF3P/egU5iFVpNHM0QD8awhuU0L4n4cVwSJprAUdwVNmziATTgbYy7hKW7F5/XYh4+R4xWGcUMMbiTVrcV1odmz+IT7OJpUewwP4tksnuEa1iQ8DeyHCfMH5m+Rck0UDbkE24TvztYKWy5Bs3iLcjiCw+ZLlLNlURO0qvJJ9zJbDo0aLlY4vY77VIUth5HWj9OYEXQbFgauhRq2m7vSZbZFOBM5ZnCqmK0Pd6LDe2EudqOjTYUd2IOrmI6xt4WZoVBBC3uFgToYCT4LH7JJc9L0YB12Cv9o34Tpvox7KVkuQQvLcSi+xQ5hALtjldMx4SM8jOQf2nD9w/gBIjKNY9qqxzEAAAAASUVORK5CYII=", + "mimeType": "image/png", "sizes": [ "24x24" ] diff --git a/pkg/github/__toolsnaps__/star_repository.snap b/pkg/github/__toolsnaps__/star_repository.snap index 044f10c39..9da449d3d 100644 --- a/pkg/github/__toolsnaps__/star_repository.snap +++ b/pkg/github/__toolsnaps__/star_repository.snap @@ -23,15 +23,15 @@ "name": "star_repository", "icons": [ { - "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/star-fill-16.svg", - "mimeType": "image/svg+xml", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAzUlEQVQ4ja3PT0pCURTH8Q8qjhyHZqCQ8IgMaSSUOWkhbsGxy9AVNGwpzXIuEW7AUZYQ1sAbXMSu70U/OHD+fs85ZWmN0cfTkb6DOsMHNmj9BTDDV7Bp0eE61hHgHc1DjeXIP8E17jHBRVSrhLiKmt1rbz/FIVbRtry2wl0Jy3BuUa3DLGjjpcD2JTr7xBYWOYZfcf7bWbc5AIN4oLQHOE1+vVMjBejmAFzGQSUB+MRD8EdR71WKPscWj8iifBZyWzynADfoJeq90PN/+gYHuUeVIAMmAwAAAABJRU5ErkJggg==", + "mimeType": "image/png", "sizes": [ "16x16" ] }, { - "src": "https://raw.githubusercontent.com/primer/octicons/main/icons/star-fill-24.svg", - "mimeType": "image/svg+xml", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABGUlEQVRIidXVO07DUBSE4c+QgiI94iVCQShCk4oqa2ELrCElBRAIEqSjZQHsgQXQQIPEGiBBgkCRa+kiOcZOHCFGOrKLmX+OLT+WldMRDnBfMldImxjhHduLKLjAV5jzquFreIsKhtiosuAsgqdzWhV8Fa8ZBUOszwtfQT8Dnk4/eKYqCccGWmhiN5otLP2yxBgveIrmEQ94TuHjnC1nnXFgSzBYQMEgukMS9CqEX2Xd2gQnFcAv482z1J0DfpwHnrekWxQOOzMUNLJA057x/TLb5GX+rKA1Q0FmplbC/IGbcH6YkS181TWTP1f8yt9iL/I0cI3PyDfKWfiHmlHoDu0cbzt4Un+zSEHd5LPRKWIO6oRMvUTmn+gbFfKxlxTztakAAAAASUVORK5CYII=", + "mimeType": "image/png", "sizes": [ "24x24" ] diff --git a/pkg/octicons/icons/apps-16.png b/pkg/octicons/icons/apps-16.png new file mode 100644 index 0000000000000000000000000000000000000000..33a32b455dbccf4e7ac30d627b65f29fa196fc8e GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`bo-U3d z7QJsTZsa=TAkgyg{Deb$dY6WUT`U*l*53FzQD@79jLquP1$H`cNsIUG+*v;}IwI|w z((d;gPyG>X=j3_wLCP|>aivm%?5!gqzCU~$R~}xn;JCx(-{I4wc3pVtu$$?(PXXuN z*Viq7r}TW?b|Fc6q5qr$osCx9D+;84X!86w{dC&&+&c66bf;asXZfvxPGazM^>bP0 Hl+XkK0hd;n literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/apps-16.svg b/pkg/octicons/icons/apps-16.svg deleted file mode 100644 index a08866ff7..000000000 --- a/pkg/octicons/icons/apps-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/apps-24.png b/pkg/octicons/icons/apps-24.png new file mode 100644 index 0000000000000000000000000000000000000000..dea712673620a184ae1a59432eb234828b2e2591 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt^vJY5_^ zJUZV_cH}x_AmAGBx+t%T;r#;X@T!J5hgXqTq$|wB7rB36S{oqhC_ZzVnUAXOU6Egk zDl_*?kW`cZwa%fl^?=ZfQ~x+)8kVSrU*z*>TyGqtkasXti=)xHfX(lK`=jIp{xuCd z?|gh1Wd6H1MNo69Ytgp61ETAn85!-L+FhBm=*Yh!W!6_APr2fZq+5;o9-o~mzk`wg zLC4xPclI!E%M8z%Tx$_(`0KlOLoWBaYZ=@LYQK516~5oDEG+fqo3nMAhw!=!51t%6 i**tlzRcX=xugurI+a8>|zn=%_KL$@%KbLh*2~7YPa&_qd literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/apps-24.svg b/pkg/octicons/icons/apps-24.svg deleted file mode 100644 index 2514548bc..000000000 --- a/pkg/octicons/icons/apps-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/beaker-16.png b/pkg/octicons/icons/beaker-16.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1f674d2b8cda7c9fee3159f3b24d2ef9124d0c GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`lJzX3_ zEPA(IGW240lwf_}KUw)khf-5-Rl@_pH*1q0bADmj>AL39vdtSWs?81E)xmk=Hfz&@ z3>AUyxtxjRWt+w9en>vs``@K)xR9x*~)z9!On9c-X+)G z%{?HxAy$1Y*UE-8*Lp{9)|mF<9mjZ!qcr(GHvVoYYxkE4WwklAZNvNvWrl|xwoPTy zoBG~9{%uB=r}c~ny!@fck7TMX4w_7|JyW>rpw5>w&FQ8`&3Boe5#0WxE3IN`?Q1zP u=`+4D5801Tv^gB{*S*H^HNWum$KrFo*wv)`>COjwmBG{1&t;ucLK6UV?tN4M literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/beaker-16.svg b/pkg/octicons/icons/beaker-16.svg deleted file mode 100644 index b181d024b..000000000 --- a/pkg/octicons/icons/beaker-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/beaker-24.png b/pkg/octicons/icons/beaker-24.png new file mode 100644 index 0000000000000000000000000000000000000000..2f42ab65e6ad477cb3c978dd286df112eb0c6dfd GIT binary patch literal 377 zcmV-<0fzpGP)v>hxWwIVX(iywA=sDMBZAhuW!BUeb-;>|M<_CKowspQN?(iNLzwI74MkE zC3ZuOq6I@J;RLm!U-A`18c_{=)@ha)mO3^ zF7SZvA_m*)YdDp_nZzfy@{0H41^XGe2YAC^vtoNpQwhCz!g`9qBYLodwG0CpQGX)R z-k`>)VJwTm5neHng&fd_XB?&xr^7TGIm9DuhTfStLJO{NkFEj+9k|7fn6;h{6RZ>v zkFXjv=Aw(AfAVO^r@t_WdWWNnpKE%C5A5MMob#X!3!(2kj \ No newline at end of file diff --git a/pkg/octicons/icons/bell-16.png b/pkg/octicons/icons/bell-16.png new file mode 100644 index 0000000000000000000000000000000000000000..3e55dda7a8ee90ca65834d09feab3cb320a55d70 GIT binary patch literal 291 zcmV+;0o?wHP)15p&k@t>kFg;t84OUOpl5U_GHVkNi)wNTQz3Qe8D z9jFmS#76K7tYVQHc_fqTm;;xAbI$wU_lA0P(8EW}71}epQ#!&BH#mv84e#);!<{Ie zp(^|e=aKDXfL?5_YO*SBa+v|%ah&9*cq@&?iNXq=6TlNzGr+%92N)*(sjLL-#`i7( z3?{n2S~Gh4HI@^=68d<-Mj3SRjaG7atX6cpun^{JT<@X*0QRtn^|5h)FQcE-WInOq paM}F2FE$S50c_(D57?Sj`T_O)H?>cC?R@|M002ovPDHLkV1lGIez5=m literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/bell-16.svg b/pkg/octicons/icons/bell-16.svg deleted file mode 100644 index 632efe9cb..000000000 --- a/pkg/octicons/icons/bell-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/bell-24.png b/pkg/octicons/icons/bell-24.png new file mode 100644 index 0000000000000000000000000000000000000000..01c88c343b43365b5a5152caff99811568922028 GIT binary patch literal 399 zcmV;A0dW3_P)Iajltmr+|l6nq%qjSKFSktD{z3#e9b}v z9azUx0)xlkcBV0?!bJk{9M0vxr$j3#3IEd|6Zt-c&cmnKFAdrwAEq!kirkijyo5{C zrZA|L{hTa)N9>k;l_M#{a~O%)?m~n*oL~o)MHpnTjZ@U;Bh2B>+Z_~x_RyHi70TW< z&v1;z5)7aZO|l#LfHB#h$#aQu6IzKe6oU=#YK>7FOe0hXEx5&Mm^5N7YRx}k00SYI tTf;5-lMI%9PkBW%y5hXy?e+dHUH}5dQ$!jZDtZ6_002ovPDHLkV1fppuQvby literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/bell-24.svg b/pkg/octicons/icons/bell-24.svg deleted file mode 100644 index a5fa85a10..000000000 --- a/pkg/octicons/icons/bell-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/check-circle-16.png b/pkg/octicons/icons/check-circle-16.png new file mode 100644 index 0000000000000000000000000000000000000000..b555bb3b8e25e12f59777f883d5b36ff98a29766 GIT binary patch literal 346 zcmV-g0j2(lP)_jzjxohKx;6ZN?BfzYnBf{jWHFy%fiW6& z;wLOIK(pq6W|%GUST(tdjgxIH2KvFhCK#!cdt2z8g(!kg91 zWgIG9Vpn>SYy-Itd1%^2VJv-){tn{P;O6CG0}rv0N$*_Ob{?F2>{SU3>3c4ue79ki s#e5!nd7Ze7PKYM>iZPL%tz9Mm0pa6P! \ No newline at end of file diff --git a/pkg/octicons/icons/check-circle-24.png b/pkg/octicons/icons/check-circle-24.png new file mode 100644 index 0000000000000000000000000000000000000000..30d45f4da8f6fb187bb5db6172af356c5eeed281 GIT binary patch literal 536 zcmV+z0_XjSP)Tq5XNQRgkjH*pDlu;1X|kQcs}h}0QoD}kE{jt=BVN@hkUvSfXR;_uFd{l~8~swW zAPUw|ot8Wv7M(APeN%=`a`HnIv{gY)6#1`~znVz;?VUS#JtTS7rkC@VO)(rxWfnD& zt?%)o;Fc)N><-B1MD+7z!iHE>U9q_8;)GZ?FZ5Y;86c+o6b^}$F5n)14eKDo1TLgg_US)Lr(40Z ad-wy*S8L3a^$fxQ0000 \ No newline at end of file diff --git a/pkg/octicons/icons/codescan-16.png b/pkg/octicons/icons/codescan-16.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa286cdc8516184ec5f0e053694b9020521ce9b GIT binary patch literal 398 zcmV;90df9`P)SlT|{MqMua?#2!d`C6hu(B zkr^LCQOI6L5yYQS!Ijy#xGuUH?~K>+z=f_;eY?)7Dtb}FA`Wna7j)6WJn9Bu4F6D| zgFjfoZ=3~xg2qQb-$%8Xiu@4fB7ckVaCk@zy2 zaeqD&2RIFxFc~tpBi@U6vSg=&c7EVaY8ZUOb#PN9+1Ft)a~sl>kVds!s#ajS&---n zyAdzre@=F>(^svmph{Jbf;KL^ElKXd--!1sdT?Iu!9vLUS(5w}qj4UMIO9j$Z)Tz{ zZP*jO8;k}XaHwys8zJ)%zr2k!qlTp@Qb;{`hjD4c3S40eYtla41b>9hIImYdQj<2U s9X~xw6KI9!EPFj3S^dQFK&;~O6@1WHP{DTwN&o-=07*qoM6N<$f)f?2tpET3 literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/codescan-16.svg b/pkg/octicons/icons/codescan-16.svg deleted file mode 100644 index ef1e624d1..000000000 --- a/pkg/octicons/icons/codescan-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/codescan-24.png b/pkg/octicons/icons/codescan-24.png new file mode 100644 index 0000000000000000000000000000000000000000..9497dc1f39bab93a8ea604e7729ff3565be8a40f GIT binary patch literal 521 zcmV+k0`~ohP)~5^dpPKJ%hWGxx+xhn@lG6p7(s*^VO2a67J$Q+PH#4e8F41 z!lxSjEIQc2F@9qkFVKtsHvWXXkHxbXzk?xuVinUF-Za*56yHiy*@gklVi0=E zb;OPo`7Wj!8ZR&vPL8mUBW+1(X&QMMa}nU{D&bA3V5=GBYo&81!@G|WZj=QNrEaMz z=w>)CoOI&6S;3u=y6Zt%@KI{LGI|+fkH+p>CD}W?FB|%X=M9aY=Hw*~%H&_@j-87% z>{UcqpcV3ClQrpvy%Su*cU&I3`y4O0g{K)O-H<;Eeu1m_Q6}eVkV`{d`YLO%E>*ut z7ZojC*F_s;!BQx#RVXnz2Q4WzRVe1*dX=y*jrv?h`82epNq&Tpa8;O*ay|@xU;SWCU_si7BdIHPqzUcCe<$uoQqJc? zujsf&PDopEUFz!tX(4{a2Wdf8b<3HZoCk%ICl~4DG4?Og!3q8W^_73M1o \ No newline at end of file diff --git a/pkg/octicons/icons/comment-discussion-16.png b/pkg/octicons/icons/comment-discussion-16.png new file mode 100644 index 0000000000000000000000000000000000000000..8be8cffab6ac760204adf94010a7bfd2bd680330 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_4JY5_^ zEPB^o+UUpRD8hQ7d6IIcmUtE< z?(ixpYA6ujb?M6aRNi|R+}Ex-DD~fL#Upm!KaXVZU)=3%dpOsFeS53gvP+!XAFoOO zE$>q}|Dvkd`lhqR``qqod(?Ki*R;HpD(>Mv5?|4|Yp!p}EXBDGtvdWIo2}#m4l|is r98Y&VH8 \ No newline at end of file diff --git a/pkg/octicons/icons/comment-discussion-24.png b/pkg/octicons/icons/comment-discussion-24.png new file mode 100644 index 0000000000000000000000000000000000000000..41a8f96c1579624495e14fca79688767e2f13c1f GIT binary patch literal 339 zcmV-Z0j&OsP)N~wcW>DM=U5?a87qvNif@I)C)~H(*boQU zZAwg$v@9;HNt=?kI}~okzd(^k6)qd}C@{rg;dzKzp8~fbauOW2OR%Wu$C@2Zh|!SpcS1~<^?xlypI!^{i9vRcc+yj@7F}U%c8k1h$JF@LS4wu l%tG~N?1f9b${e^kJ^+v;TaR1vYQF#g002ovPDHLkV1l@&lA! \ No newline at end of file diff --git a/pkg/octicons/icons/copilot-16.png b/pkg/octicons/icons/copilot-16.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7135fcf81659b3f5326684089624f8b0cbf80f GIT binary patch literal 408 zcmV;J0cZY+P)?=U{Xf0@e>FN zVlU(?sQp@Kq1Z{X7AXuVQb|G@Syxd675iW!u50n;;qcf9LJmC6{5f;)+`0F0glORr z-eQQ)xQlyX48p{nQM-PGYEcxb>%E>VmIPl%;Q^du5k*l z;#{ACzvG$mW?Fb2u@OE7_o{9l`#Y@qdF!ZhqxiaTP+I`5VJrDtSWbSmzfBXTW!B4);hmsQj0000JbA{1N9gPt%SsgNQfZ5Ksym6 zWkONfSe)158TlRaZh<9kN@vI@aO$*|F z99IO1rmz%u1x=ecfK50XV=mz-ZpG*I*oTji;}wQ+Lkw;t)vd*Kq1m(eg!?#}RC^2$ z;@K>o;TqN?JPquJ3G)Z$Z;^6M6b-oq+l24V)(TrLL9=*^ayWv+=1Y{bWl!~ zqfLb!*n_K>jvcbJFx+9d-);Xy1hCzKnY*SuQ~f%W){a s#SUQryJMBpG2tUTjN~8MaQ(yh0U|PuW7?|6F#rGn07*qoM6N<$f=dMS-2eap literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/dependabot-16.png b/pkg/octicons/icons/dependabot-16.png new file mode 100644 index 0000000000000000000000000000000000000000..9d7d033daac04e5da1e556a914d818b3c0093fdc GIT binary patch literal 305 zcmV-10nYx3P)?@$OCSVXg(gMlxC=BKA{U4R zJ&1}1+&~iv3eS?o@lSZA)p|b7jK8smcCN6-Hy%53zxe@M*|Mt)Z@JD;C7fFNAEp&5d~(_00000NkvXXu0mjf Dr}~F; literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/dependabot-16.svg b/pkg/octicons/icons/dependabot-16.svg deleted file mode 100644 index 69a41b41b..000000000 --- a/pkg/octicons/icons/dependabot-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/dependabot-24.png b/pkg/octicons/icons/dependabot-24.png new file mode 100644 index 0000000000000000000000000000000000000000..43e1e158f87b5974f85f4b320a6a1658aea557ce GIT binary patch literal 323 zcmV-J0lfZ+P)=yR;Qf-{_9uf^vO2Mzi@j#}a_@tonR!?7>7SZA09A!!6eFe1JOj}7{h z$R2bt{YPI0Yh@6>>Bb6_;vb+kCThd7-h&($cn{Wxosc7MTAZmy_9otglb#zKAfH{< VN7t}I>dpWF002ovPDHLkV1kK1ibwze literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/dependabot-24.svg b/pkg/octicons/icons/dependabot-24.svg deleted file mode 100644 index 7d85fadc2..000000000 --- a/pkg/octicons/icons/dependabot-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/git-branch-16.png b/pkg/octicons/icons/git-branch-16.png new file mode 100644 index 0000000000000000000000000000000000000000..76600c2028ec270a4b03624e27cc2000568945d9 GIT binary patch literal 300 zcmV+{0n`48P)2kN8e1|Bx9ndc|Yge^X^X`e~42oQDTN(!u4>4_s|S;1}m(wzz*Yt8^zrs zG|P%85>X#_n8f)o;RdlzLetM>FpF1qc*AkSV3Y8dIfDZ85FBOrL2z?Pf6@{@@Dlsy zj6s$5eHekgTq=0QLFWF+S0lgCX7GTUmf*6B!5G^Xu7;wquj<_I65PbKpD}IJ$Jhxa yZgCPO=Usx*64p4wMRNWXhIoujrs|*R|L_Tyr!uuRf}M&00000 \ No newline at end of file diff --git a/pkg/octicons/icons/git-branch-24.png b/pkg/octicons/icons/git-branch-24.png new file mode 100644 index 0000000000000000000000000000000000000000..9132938310675c923e6360dc6d4904d38fbbd92b GIT binary patch literal 469 zcmV;`0V@89P)U~KGcEUf$iuRoOpqd~L~g&d37S0>4vNv`+a1;cRGS+m#X?AiM;W*jSU zbGU)?_=w+!#5jrTxQajcTod2NE}B^H(W&S=q3P>)vCt--3&BI2#wBcHy<+evH1n9k za>VGC#CIc$sf=61PQ_pc53=X!h;gS+OlB{)VxP&liy2?S);|4A#vi~5>3eQt2~Q)N zTNQ)bq1lWxU(t(LMRcTZ{tKTX_(a8EB20Stfi;|~=>MTnxeW#MZ{Gn-mdO9Wtd{#f ztidVV!!_xO9vKZb@YdeOYg?;0UJBG!z$W%5cv(s0JD%g&Aldf~-VJ)Fgjx+Y#%=Iz z6bAdpbq6a_vs{qI?~73wk>>gbX;dsq1#YBH9SLqm!1;{Z#G7G)<~2AI`|FH*g|ovL z \ No newline at end of file diff --git a/pkg/octicons/icons/git-merge-16.png b/pkg/octicons/icons/git-merge-16.png new file mode 100644 index 0000000000000000000000000000000000000000..372606b00ee8c17070ea50bcab0e2311eb891dec GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_aJY5_^ zEPA(Iv<+f%6li^&yNU1HB1ca&ePaGk+nhRZv4ce|ax&-j3czhdL}WiILp zx92nXir!FJ5NNDu`f)X{$cx89Yo8_CmP^jvbbZHR-9F|^)=M;E9}6wlI{wqquwDJ!XkD>wYA*y-gK~?#!q;B z$GXL|W=oWGTNFwqKfzrB>o~_7(JsE=2hOr}DA!|=cqzQ^>A_l>Kg9<2@Y}yO z()~VX`yM6RQZMqG0=>`@VW}tb52D>v%MzFrG4FbFjn#e|S|Sv`@Jj!SR>3@8>vQrE z90->iBB`AuQVQl1;Y?=R7M1hg$h+xy8oy_@9ZVDv$WawZdM_%XjuRz5I7H>-Pv%cN oDMEN#g;X(%V{GE0h`_+{7jL{_M#Vf|*8l(j07*qoM6N<$f)MPz%m4rY literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/git-pull-request-16.png b/pkg/octicons/icons/git-pull-request-16.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2f9cb73cf14b0a208c0ce0fac4df3a9e48cf56 GIT binary patch literal 292 zcmV+<0o(qGP)`e^P0~K^@vGbA_@)pp_FWJn#nQ#7YvOAon{xL%bPgvsv!>o3V?J>X&YP{k* zAbE3*3GUD<0mfmv2*@h(Z;{WR&l04HrevB$zKi$B!BxDEN>fx(eAaxEq%K~vbB$>_ zoMnZth|BCo*x|Nx<38X|`d@%5;`sq^tEbXzVfu}aEzPZ-`$+aRi?l8Pik>vaBH{xs qHS4^ugPu-|w80#M0^k(S@AU(;i8{tUe8(^V0000 \ No newline at end of file diff --git a/pkg/octicons/icons/git-pull-request-24.png b/pkg/octicons/icons/git-pull-request-24.png new file mode 100644 index 0000000000000000000000000000000000000000..3b952615b4cee5297fd52d3e362acd9734d2c9e9 GIT binary patch literal 478 zcmV<40U`d0P)bul-7J3&(V(A zP3Abm=-?;D3i?6mr+8mxo}nhK`7XYN`9Og)j3vyJ=%0o5SR9~Pg;+o{v^_X;0;9fg z8gLr$Z&5=_ccV=?y3xuofN5+>1+(R76?O^hQmL53TWQlwRS1|4ZX2({V@)bQhnNV` z-P~APDsac)YfLCZBfKW)euJUtJ2~PCu2l#a3T}o@Zu}5+-2>+e?qNsof%7M{q-AM@ z_GNh0i^QhhBXbqkD+JV}HP3YWn9Uv*|B||NdTrqiepLt{eb8}S#YZex)crkv0|h=~ UkNWkrs{jB107*qoM6N<$f-mUX#Q*>R literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/git-pull-request-24.svg b/pkg/octicons/icons/git-pull-request-24.svg deleted file mode 100644 index 48c2a2c11..000000000 --- a/pkg/octicons/icons/git-pull-request-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/issue-opened-16.png b/pkg/octicons/icons/issue-opened-16.png new file mode 100644 index 0000000000000000000000000000000000000000..bc74910a21933b914269d0610a1e52d208ab9247 GIT binary patch literal 335 zcmV-V0kHmwP)RS&^J;6%Q7Apw1n=n0H#e|G*{0=$6U zK!g>7i)qXY4vJPXNvFH2r@CkOjt)wU@E&J`Q?xVuFYMqPADG}8J@g}!EQ90<8iggMHCKyvKT0Wd$vq;!ghB9@e(J}I4#n0CTnc3!ycy6NS<+%A=Sff zfm)`1harq{oFNog#L4ZZhqrnVayR^j8Wvl4MKeRVtT?#J)SGzWe@om~Sz=pylKvkW zl%Y9TCI-^yC^iru1-Gmw8+eF9UwY@9?J_v`*j^ \ No newline at end of file diff --git a/pkg/octicons/icons/issue-opened-24.png b/pkg/octicons/icons/issue-opened-24.png new file mode 100644 index 0000000000000000000000000000000000000000..13a5df55aa6433777e48a66ac4f774b2dec4991b GIT binary patch literal 490 zcmVTZccgSSjo!JSyUoy@4^L^*sd*)omjENF|9rtk; zS8yrW5AhLiv4bB~1t#$X>o|+g*v0qcpTU9t!LyPiYklt&alYF^g-TO z7eB}L2n4eAeZJT6OstCKQ;;`A_3QndHL<8VVsTZ)f><|u1}r<`_775El};Kd=d0pr zJP~P$R-59|24P8@c~?~aANimsvxYUXcF&3Ve}`|$e*rfzD~@y%ukmMCfecf)m%e_F g{+sl5N_fVHe@`r4jLuMi8~^|S07*qoM6N<$g3^87+W-In literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/issue-opened-24.svg b/pkg/octicons/icons/issue-opened-24.svg deleted file mode 100644 index d58fdac4b..000000000 --- a/pkg/octicons/icons/issue-opened-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/logo-gist-16.png b/pkg/octicons/icons/logo-gist-16.png new file mode 100644 index 0000000000000000000000000000000000000000..ce64502d7a8a1306aa5d850d1eb78a334e816ddb GIT binary patch literal 445 zcmV;u0Yd(XP)P000mO1^@s600006VoOIv0RI60 z0RN!9r;`8x0dh%1K~y-6-PFBH)nOC|@Q+vVB?*NrO9%&@8XN>6L<2F0{s~tbTQtbY z$}lbXo!XQhJg;^@I1-m_1^2Ppuqz_IKS^X&-tFW=i#== z9gJcFr`W*)1{0sMe<7&AEIy+R8Qen`Mxsv>4$)CUylOnl1^cm$+8YviiMu6`bmL1d z_(5pZ-$*6OOCeduixL8U$Ni}HVio)Ng%#A`4Zh+`nC}KU;Rx+Xum(I&zPgB?piyYu z4_D{YoK$qJk_uta=Lyz|*HQ0`S \ No newline at end of file diff --git a/pkg/octicons/icons/logo-gist-24.png b/pkg/octicons/icons/logo-gist-24.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6aac82a15b39316b035c250fe26b9dca6e479b GIT binary patch literal 665 zcmV;K0%rY*P)6zq9hxUDP=S4EQCA6 z9sc7V#Z(-?eSE|hyu?*(!^FQuq#|d$89VVE7jPS2F)R_DfhJ5y@>SS~dpP^22(CmM z8ZjnArY6a?V?o;Up&NE*V^!8-HC~_@BTG;^0LM|^4Pp;*C2Mho`138@FiwpKIJO7j+Qd_J`q`*i>bJXPr?&zc!LHJHbX>`HR4B-dzACk5}7qxWLr5H zl#I1wqHxVC?80;O#c<3*Z*h`OaS%K34!d)7+-xV-FD({A9eU->T`uw?bxG&UL@o=5 z(tDFgyhHf{Ric))WhmH-{&{oDix3+nvbz|mE}>FX_E5}*pK((WY1%}IL(rX-NDcz)iL5@7z88zi|1M{53yxuY0eclmXH$}G zE<`FH)uIVk{Z3HfMqRCQaW00wvg_%8{1!g}p5B6buR+sX00000NkvXXu0mjf_=zkF literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/logo-gist-24.svg b/pkg/octicons/icons/logo-gist-24.svg deleted file mode 100644 index afb311c4b..000000000 --- a/pkg/octicons/icons/logo-gist-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/organization-16.png b/pkg/octicons/icons/organization-16.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8dea74b38a13c89a2834fa33dd6c83f19df60c GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_;JzX3_ zEP9V#Hq3Gg6kxp|Traj@YN^)siHCGMzRl8&IA$^_m*b$)>=R-~PMy>JlP@fA*#Du! zlTMqzVml2A-rxDo)^_>;x7L-Js|+SSQ0(E|7i4_UxGH10TW{pE%@x7R&xS3!9ytAr zq@3{Ic^7Xop6;=8zAPH{!(sVLuI>-JO#Bo34%=$J3H(#f^^!s2f#wgf`P=y-7IFM5 zKHDJs>qlQ) \ No newline at end of file diff --git a/pkg/octicons/icons/organization-24.png b/pkg/octicons/icons/organization-24.png new file mode 100644 index 0000000000000000000000000000000000000000..60672d37b1d1d93bdeaba078b8a451899753a45c GIT binary patch literal 348 zcmV-i0i*tjP)r13?r9@L!CTl?M>T+ZgQ@614RUf^Edc8+Zc?J5zWB zt+lffOj@xL5tX&b1SW~I*$E+%4~BhzX5Ke%=FL8qhyx5zW{y5usi2KW?&A%&nH$^3 zCbnlyEYZyjF03h2&b2uLW+6q;!6({5e+=Uyo9cI}~ zC*iA&ID@w7J9tR=y2dlus6&v0nBW-iqKCKWGQGhQE@u(UTc)q*VP|Am$ub?&|Ls?? zFr@BagbsEmY|pq}6u}jm6Skimf>}q@#F=4ZY6N+buo7_w0~GkEvF \ No newline at end of file diff --git a/pkg/octicons/icons/people-16.png b/pkg/octicons/icons/people-16.png new file mode 100644 index 0000000000000000000000000000000000000000..5a387cd0b65fb44e2629346eed0206e9a12883f7 GIT binary patch literal 305 zcmV-10nYx3P)-?Oi7WYosXSt)L`M7dYj%1JMOxBx~}KG{@u^RU#oev@tSk)x8ZkOU=vr-vp)s2 zagO2WI&K1lZ9HQGLsftmto3+%@nH%_*{V?mXr=4X1#U|lbn6(8ReRnjP{X#Zb!V~T> z3TM7P>$|$cX-QAw4UHOV*zE(@!C* \ No newline at end of file diff --git a/pkg/octicons/icons/people-24.png b/pkg/octicons/icons/people-24.png new file mode 100644 index 0000000000000000000000000000000000000000..f5242ef007472db2f18b7be6d095e78fe41f0740 GIT binary patch literal 525 zcmV+o0`mQdP)xb- z7%Yjeh>ReS)S@fsuO$u*3Lv~?V0F!!HNG401sAIboA5A&KHw_Ga*gNSEFNHE$#)wj@gA$% zi4S51(>Ng}qKqz_#9Mq6S4x4q8T?>X<}-MLHC5%cpdZgNNKwg{81oq%Yb7^C$~-V1n6}k$MI2st2LYCdHeD|5uM^XB ziMT(;I}k5$O-xT2H}R;6mEz~pDJI2zRK` \ No newline at end of file diff --git a/pkg/octicons/icons/person-16.png b/pkg/octicons/icons/person-16.png new file mode 100644 index 0000000000000000000000000000000000000000..39e07db377dc9592480d2086a87564fa2a167cee GIT binary patch literal 287 zcmV+)0pR|LP) \ No newline at end of file diff --git a/pkg/octicons/icons/person-24.png b/pkg/octicons/icons/person-24.png new file mode 100644 index 0000000000000000000000000000000000000000..212e2acd20a4c44a18237144f20151d0d875122f GIT binary patch literal 410 zcmV;L0cHM)P)J~A|62W zL`A3(5uzIvja!dm?~`!M>^U=|;7e8}C+oj1S!=K1zpGS`D`Oht@%tLbc>j$iCUJ?6 zoLxj;+sWTh#WH%LE#U^Qm}oV5DRx;!e+_?M^qng{>TjAAMzNe=Rw6S~4=5*svxOce zn1dYKRDq6!FH<&}x@@YzMf{ylFpD|1DV1a3jj+(X25>JdIn`)VQ^HfM3JdLxwi=VS z^-Kvf-uCmzGTSPWpq|FCBOKckj$+qP5q8suGpysbna=0%f(LA%vj)?NO+4aR;udOk z{(>tE7vL+Aea2`bxP()o^CHQ=7J0;p27en1!tyqnNSK+c1RliKbN~PV07*qoM6N<$ Ef@x*1djJ3c literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/person-24.svg b/pkg/octicons/icons/person-24.svg deleted file mode 100644 index 838233596..000000000 --- a/pkg/octicons/icons/person-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/project-16.png b/pkg/octicons/icons/project-16.png new file mode 100644 index 0000000000000000000000000000000000000000..9824d93e1920a663433af417173f1d6095c33c3e GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^jJY5_^ zEP9t-KFi5uDA4xMeWSSOpOps>e_K%gHA&cPp>9N*twu-L#;T7yN<6^y=leABjvbxO!I#GY;+6$>Ri<7EhJy)@ko2x$^-$Pwi#+4E#~+e zcnNQ8%CV9@BBr!`9oufR<{O6&zt`R(#OpVs+%V(us()MKZ@p76dL4C8o_SBegSjhp kuQX>g2mP~{9#PNWc-LUzq0QFSK=(3uy85}Sb4q9e0O(O%5dZ)H literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/project-16.svg b/pkg/octicons/icons/project-16.svg deleted file mode 100644 index d3d685a1f..000000000 --- a/pkg/octicons/icons/project-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/project-24.png b/pkg/octicons/icons/project-24.png new file mode 100644 index 0000000000000000000000000000000000000000..de1c267dc7a2fc492a011c1f5fc1eda2f304db23 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt@!JY5_^ zJUZ`Q_2px96li<`o71x^i&({|qA zxg3+z`p`y*W}p)0#)Q`;U?=qx5QvjVu1K836sl N;OXk;vd$@?2>`8LY!Uzf literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/project-24.svg b/pkg/octicons/icons/project-24.svg deleted file mode 100644 index f9172e7c7..000000000 --- a/pkg/octicons/icons/project-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/repo-16.png b/pkg/octicons/icons/repo-16.png new file mode 100644 index 0000000000000000000000000000000000000000..28a9bfac6eec6ff181a63fe1f0c2d918c98b363e GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^@JzX3_ zEPCHww&h|n6liTz6?bMaT~Sjzr^p}T2~Z`kAW|8D#~ zbYMcw=hQtwX \ No newline at end of file diff --git a/pkg/octicons/icons/repo-24.png b/pkg/octicons/icons/repo-24.png new file mode 100644 index 0000000000000000000000000000000000000000..9203cd0222a9ba0e86693033354d6a87928060e9 GIT binary patch literal 310 zcmV-60m=S}P)!sB_#l?)EHw{cqsGeD zQLqs##Lf^9>|Bc_@v^t(%$iE>gDYm(oo|+b;h1F$Hy9%ne)rXaD~Vu;BV6L$;vArx zsXJwiK|$dOeeo4jR+9sp82v#|BNZ&2R?rGs!G92>1U%wR`MRE2cIjFT_{1$<3L0!& z*8$fBg(vhitm}ZMO8lYz{L@8@so)uVmHbBLPA>N&>q$JoIj(Rr=iUyEGYxi|1Q+6f zc9Z-F9pA&-#~Ic#@`pK%)d;u~|2BGf6$iOA4wHCWoYAlO0{Ck~28nCC)Bpeg07*qo IM6N<$f}}x&-~a#s literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/repo-24.svg b/pkg/octicons/icons/repo-24.svg deleted file mode 100644 index 384a3a3bd..000000000 --- a/pkg/octicons/icons/repo-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/repo-forked-16.png b/pkg/octicons/icons/repo-forked-16.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1b156d786eb395cff56ba6a73e0f1e6008a135 GIT binary patch literal 312 zcmV-80muG{P))P_ng5@EX3pUsv4u-KqmNd?wQ-D>&}`-mu5pVYX4p=+ zoyZMCbCo)mSj8E7abHQe^4tqe%6*_8U1oSfH{sSWN%*6jK^ub*bTWJ=xPjz-(iPq? zj&qSQD0Aa5%A#8twHlM^bS>Y}G5>*O>_+Ycj~L;mu6qur5w%$Sfh(|NK6-)ICY={> z;dA$MUmyHeY((K<#0={>VciP%m|`#PQ#>@801m?F4*N}u|BQF99XlyjZ@Hxa0000< KMNUMnLSTZ17>Dfu literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/repo-forked-24.png b/pkg/octicons/icons/repo-forked-24.png new file mode 100644 index 0000000000000000000000000000000000000000..f35eb9418a711cfcf92258f654c3c246cdd2e56f GIT binary patch literal 472 zcmV;}0Vn>6P)neK#YA1A(gwl>so|=>Scv!};t#B0wN3RUthPiB$NsgN*xd289akfxO57N zQ+osjiARu-Xj~!$h2u^!Yh;^q24Aw0+28uFHEYdm>eY-%tl&6eCA{Va{CCk5ws470 z)UX#(3-2++ZN_XE2?d2XTvosQIBjT;m+0#U#dLdtU|HP{TOI z8&=Vc9;}6Tf}yhFTpieyUGK+;SJ|zs6ydr(67^##o;Tv{b@~D*>OaDt9QoA%0000< KMNUMnLSTZ$;+^XN literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/shield-16.svg b/pkg/octicons/icons/shield-16.svg deleted file mode 100644 index ddd8a6abc..000000000 --- a/pkg/octicons/icons/shield-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/shield-24.png b/pkg/octicons/icons/shield-24.png new file mode 100644 index 0000000000000000000000000000000000000000..3048123f41522e9893035467f7de4e392e49562d GIT binary patch literal 477 zcmV<30V4j1P)K*Knoe-GLSrIT{06JIh0)qMrZF1aRlH6W6qx-B;omVET3|;ec^pS_2>qD`bMZX> zzYO{^>$87RHhK*{W8fcX4&qbyqxTnmQ10A1{AggX7w=OBuW;xOM~l1nij6$tMc;M z-&DMdA?4j$VA-#;8OMXj-NWu&@!l>k;9ZD4j41FH=cQ+tjh(oPClNC-w*B}C=mS=Z TRfS3>00000NkvXXu0mjf;NH*l literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/shield-24.svg b/pkg/octicons/icons/shield-24.svg deleted file mode 100644 index 44975d9a5..000000000 --- a/pkg/octicons/icons/shield-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/shield-lock-16.png b/pkg/octicons/icons/shield-lock-16.png new file mode 100644 index 0000000000000000000000000000000000000000..72318e89cbb8c73fd16b9ea70580db271fc9eb29 GIT binary patch literal 366 zcmV-!0g?WRP)m}4_L#_~^2a&q41Jaf)FGyJ3;8q2ESKF%;U5@6n-v8@&C);4QR+ zX@flGaD_(Xx%4tv$24ZJ_LspshBIeJc*0}kX-34lg(%!%G9$XgS>)H5v&rb`Oi;&) z-Yb1G5ZZd$;1CliXT;|bY04Ono(_FDmF)cMjbk3qIEkJvrX&}3i=~|AWy#(Tq0MDc z^6o#eg;9)QJ8BIq^q3II>)eri-meiYRCWI! \ No newline at end of file diff --git a/pkg/octicons/icons/shield-lock-24.png b/pkg/octicons/icons/shield-lock-24.png new file mode 100644 index 0000000000000000000000000000000000000000..36dd3c4f1108a5e9d2371b575ab08fba0e1b6d0b GIT binary patch literal 503 zcmVLL|LGvsKgWn8r=4p};yGL|c#CT5zUA(>T&u^zkkXzG4xVFj?VFMs6`UMQHlr zQ9HARAb!RG=P=%4w&TGagtowZ9q|Y5qSwN77<%FHy-ZZ6GKRO<_=5r);jyExz(2v* z2;5z`9PvQfNq@D#0?tN!8t2=Hs!OyfzhtwO_*8@E&$|}-V{F7b-cp8 zjBuy4$BT%EVF@qGkLnCw;AlqpZAkn(j^KG+fk)VnLm6=s4r3o4*L6-w_sZ>z!INR) zKp$UZ{^cEM`Ue_DT8D$7y_F;F#Roh^cLeh;p5ZP|up0s4; t+g!fI*R^<@wvAAzi!%{FRC%>>_yq?oUZAP#j5`1T002ovPDHLkV1lf&=yCu6 literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/shield-lock-24.svg b/pkg/octicons/icons/shield-lock-24.svg deleted file mode 100644 index 606204be7..000000000 --- a/pkg/octicons/icons/shield-lock-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/star-16.png b/pkg/octicons/icons/star-16.png new file mode 100644 index 0000000000000000000000000000000000000000..2c01a88e3fcd121536124e45e661a035f8b8d244 GIT binary patch literal 345 zcmV-f0jByz@~;eG%BabP@^9r9Y`6)Vxd+x(n z;0Ekiupoa@vq44{m?p#Gd(~#4CNVnl6@a0F@aUA#2GGdgacg0`To0c8FhRn)xc&Fz7<^RsbdL> zsG)@_#!$$)Z6UO3cx#f6Tf{Y \ No newline at end of file diff --git a/pkg/octicons/icons/star-24.png b/pkg/octicons/icons/star-24.png new file mode 100644 index 0000000000000000000000000000000000000000..9a05584dc948925c563d0361093b6a6cb90f7da0 GIT binary patch literal 488 zcmVP)bC5ld*`ayHIm3NLYep!Nl>;Sis(lZ_8(W3Q6-bvHBnIzZgP z8+;ouIDxCtNZ#1V$oE29C7p~O*2gWk5bL3}nKiA#!$>^I6E#rbo# zZ}9O^4Xy^URcKO$Xb*QwJL;RU!X4>C?n$TYOyoNF6ipRl3$HPY+aYowovc=TcOo|% z+^tgaY3ZeG literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/star-24.svg b/pkg/octicons/icons/star-24.svg deleted file mode 100644 index ddd1e58be..000000000 --- a/pkg/octicons/icons/star-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/star-fill-16.png b/pkg/octicons/icons/star-fill-16.png new file mode 100644 index 0000000000000000000000000000000000000000..7a29d4b874069030c0f7f24860bb7c347856bd99 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^o74r^mJbgjbBuDdXk)B}Qfxu}3*A7U> z99j3?)!w4uU)_1j)Xd(C$1hLZ*KBo|-7MoTtHI&$4Vf1oT3r)-AbZxi_vs1ygQo8c z54wh|ZrRZ_>uz?w{ZYlRi`({WI~2=#x*#ub?O~ma$4d`eiL`=-GExz#I?a1wx z49yh_wy<0H*6j^eW_|IDA?BE)D&vnM&L7+Z--mYD9T)3Av8YC@DB5N@gZT^9S9>pf buK&fxzSDiG0<#)3&|?gqu6{1-oD!M<#!hvR literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/star-fill-24.png b/pkg/octicons/icons/star-fill-24.png new file mode 100644 index 0000000000000000000000000000000000000000..352cf03180f4e95cad08f1e33ac52c6c30472305 GIT binary patch literal 356 zcmV-q0h|7bP)ALEP|(VS`~a1uNehHtj`NyK|ceYPCt02DhbC1T4-W7nk_8-vcwoK zc#7r`4|q=D5YCl$ai-e39vm#!X9_DmFAYygA6!RO(T6QA^0i<3M!L8P$w;oQqgjw9jol zyJ3EsB7a-!&x-ncvu8e?Z*q|Dc#iA_Cqc>em&)7ub)=s4-*_xHo1^52$&9-XrQ>&; zZNDzKaap;|g2_Vvnp_&fb&OANm{$Z^Pv$5HxVGxGuIkHWDz14ITnRhbejJqAn^ip3 zj9phD`pjys}$7X k&esa!FFs=;BQb~J*c>aP^+mHU0X@jz>FVdQ&MBb@0L)}|RR910 literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/tag-16.svg b/pkg/octicons/icons/tag-16.svg deleted file mode 100644 index d74c2b2ef..000000000 --- a/pkg/octicons/icons/tag-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/tag-24.png b/pkg/octicons/icons/tag-24.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff8994e84e57f04d29e7080636d9819aeeeb4a2 GIT binary patch literal 316 zcmV-C0mJ@@P)Yq|jJ6+sMr9%jje<@KIRzSmCLq|01ksc&!l~ za8=NEf(_nqS^_?mENxRW?U|B`P+7+cS1wNbeM O0000 \ No newline at end of file diff --git a/pkg/octicons/icons/tools-16.png b/pkg/octicons/icons/tools-16.png new file mode 100644 index 0000000000000000000000000000000000000000..e17b1b2a2e50d8871425cf93c5e80ac4165454d3 GIT binary patch literal 364 zcmV-y0h9iTP)R9ZS35}k%ZJODZ*;tlpGcmceD zib_<1_}h5{I>Fk6)mX)yo19!H8((rWbH8uycW2HS{-Pff8Ga(Po*2VDx;RMq!{F|t zCW|3FpoKGZ60H+lD@+E{c1vtw8ml \ No newline at end of file diff --git a/pkg/octicons/icons/tools-24.png b/pkg/octicons/icons/tools-24.png new file mode 100644 index 0000000000000000000000000000000000000000..31292ede5671487a78ff7191226dafdb82aab649 GIT binary patch literal 489 zcmVy@FjD zF*YKIglH*(L97L_PW}b06twUaUs5F}5`*z9_P4SuvvY5VPcwJF=R3b=c5Y^my!K-x zm#$$8YdDthkB7GvY)`s_HXg<}mtf|?TZ-{^x6RMvHx}Z18}kWnKD;5^jX5)& znh)U(o@2Pn0KvY%>*(=U+iH`};t+0Pv(suS+Qcm!#+h8e41VBg56w$G!G>as8w1Ai zF2GW&IES%HZ7gcvDzy!~#ldRB9kqbH_+G1B!2`U+^{Cyzc3i5lE$oreV|-22C-6-1 zqqgJoM1otzqg=q%XmF&#pT<;!cQoc+&IKI6FD&Mu2HjH}kkL-y5`N-T56w?2j_Unx z;C=Xr51O~5s%d-*zT@gkP2r2;kuPMpi@|)xWVg*rjblaewmgyWPlmS~Y+ssGoQ&Co zHyd7d<@K9f*RB{_39r16I|m8aoe5~wn7#tazsvQ6w_alg3dlXdKmq@Ji{2~VqNy!f f!z;xF`+xca-_u>(g8fJp00000NkvXXu0mjf``F|; literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/tools-24.svg b/pkg/octicons/icons/tools-24.svg deleted file mode 100644 index 2dd47acbc..000000000 --- a/pkg/octicons/icons/tools-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/workflow-16.png b/pkg/octicons/icons/workflow-16.png new file mode 100644 index 0000000000000000000000000000000000000000..d89bd913d31233460c25bb016cac2a20839f24b4 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`ZJY5_^ zEPD4|S}1tPL4@T3`(&mUjEx5t8g@jehzdj~Fmhy-nrPf(xK9~zj;WMZ^y$sQl$nr3R;D@a}07{ ueye3$toWTlRL_F#j@0K9zyGFIGtGTsQsBGe#A~3-89ZJ6T-G@yGywn}pkU+x literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/workflow-16.svg b/pkg/octicons/icons/workflow-16.svg deleted file mode 100644 index 8f758a230..000000000 --- a/pkg/octicons/icons/workflow-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/icons/workflow-24.png b/pkg/octicons/icons/workflow-24.png new file mode 100644 index 0000000000000000000000000000000000000000..c41654a3009a3be20367589afc4cae5e69762f39 GIT binary patch literal 351 zcmV-l0igbgP)6+9b3&c-HZaTeLYp|>lEMiBg97?$}m-z+n;gkQoY9x;qqfeU1H6L*5| z;RQDl-W(3FkF&ZWlvU^7OA^^m-)yx}-I#TM}~ zeG7hiOsslQ`-vj@m`MrT1%DV3`8GPZk{;U>@`@8{)DSz$MlEA@Bvy@ZYsl5OLF;c( xlRfAKe}bn7XM2QK8=3M4pb#H`2W9`-$2%IdMY*J83labT002ovPDHLkV1iZplW70| literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/workflow-24.svg b/pkg/octicons/icons/workflow-24.svg deleted file mode 100644 index 55e30dce8..000000000 --- a/pkg/octicons/icons/workflow-24.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pkg/octicons/octicons.go b/pkg/octicons/octicons.go index cc07b8024..804a23b47 100644 --- a/pkg/octicons/octicons.go +++ b/pkg/octicons/octicons.go @@ -10,7 +10,7 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" ) -//go:embed icons/*.svg +//go:embed icons/*.png var iconsFS embed.FS // Size represents the size of an Octicon icon. @@ -23,20 +23,19 @@ const ( SizeLG Size = 24 ) -// DataURI returns a data URI for the embedded Octicon SVG. -// If the icon is not found in the embedded filesystem, it falls back to a CDN URL. +// DataURI returns a data URI for the embedded Octicon PNG. +// If the icon is not found in the embedded filesystem, it returns an empty string. func DataURI(name string, size Size) string { - filename := fmt.Sprintf("icons/%s-%d.svg", name, size) + filename := fmt.Sprintf("icons/%s-%d.png", name, size) data, err := iconsFS.ReadFile(filename) if err != nil { - // Fall back to CDN URL if icon is not embedded - return fmt.Sprintf("https://raw.githubusercontent.com/primer/octicons/main/icons/%s-%d.svg", name, size) + return "" } - return "data:image/svg+xml;base64," + base64.StdEncoding.EncodeToString(data) + return "data:image/png;base64," + base64.StdEncoding.EncodeToString(data) } // Icons returns MCP Icon objects for the given octicon name in both 16x16 and 24x24 sizes. -// Icons are embedded as data URIs for offline use and faster loading. +// Icons are embedded as PNG data URIs for offline use and faster loading. // The name should be the base octicon name without size suffix (e.g., "repo" not "repo-16"). // See https://primer.style/foundations/icons for available icons. func Icons(name string) []mcp.Icon { @@ -46,12 +45,12 @@ func Icons(name string) []mcp.Icon { return []mcp.Icon{ { Source: DataURI(name, SizeSM), - MIMEType: "image/svg+xml", + MIMEType: "image/png", Sizes: []string{"16x16"}, }, { Source: DataURI(name, SizeLG), - MIMEType: "image/svg+xml", + MIMEType: "image/png", Sizes: []string{"24x24"}, }, } diff --git a/pkg/octicons/octicons_test.go b/pkg/octicons/octicons_test.go index 793edcd15..13128ab10 100644 --- a/pkg/octicons/octicons_test.go +++ b/pkg/octicons/octicons_test.go @@ -9,32 +9,32 @@ import ( func TestDataURI(t *testing.T) { tests := []struct { - name string - icon string - size Size - wantDataURI bool - wantFallback bool + name string + icon string + size Size + wantDataURI bool + wantEmpty bool }{ { - name: "embedded icon returns data URI", - icon: "repo", - size: SizeSM, - wantDataURI: true, - wantFallback: false, + name: "embedded icon returns data URI", + icon: "repo", + size: SizeSM, + wantDataURI: true, + wantEmpty: false, }, { - name: "embedded icon large returns data URI", - icon: "repo", - size: SizeLG, - wantDataURI: true, - wantFallback: false, + name: "embedded icon large returns data URI", + icon: "repo", + size: SizeLG, + wantDataURI: true, + wantEmpty: false, }, { - name: "non-embedded icon falls back to CDN", - icon: "nonexistent-icon", - size: SizeSM, - wantDataURI: false, - wantFallback: true, + name: "non-embedded icon returns empty string", + icon: "nonexistent-icon", + size: SizeSM, + wantDataURI: false, + wantEmpty: true, }, } @@ -42,12 +42,11 @@ func TestDataURI(t *testing.T) { t.Run(tc.name, func(t *testing.T) { result := DataURI(tc.icon, tc.size) if tc.wantDataURI { - assert.True(t, strings.HasPrefix(result, "data:image/svg+xml;base64,"), "expected data URI prefix") - // Verify it's valid base64 by checking it doesn't contain the fallback URL + assert.True(t, strings.HasPrefix(result, "data:image/png;base64,"), "expected data URI prefix") assert.NotContains(t, result, "https://") } - if tc.wantFallback { - assert.True(t, strings.HasPrefix(result, "https://"), "expected fallback URL") + if tc.wantEmpty { + assert.Empty(t, result, "expected empty string for non-embedded icon") } }) } @@ -66,12 +65,6 @@ func TestIcons(t *testing.T) { wantNil: false, wantCount: 2, }, - { - name: "non-embedded icon still returns two sizes (fallback)", - icon: "copilot", - wantNil: false, - wantCount: 2, - }, { name: "empty name returns nil", icon: "", @@ -92,12 +85,12 @@ func TestIcons(t *testing.T) { // Verify first icon is 16x16 assert.Equal(t, DataURI(tc.icon, SizeSM), result[0].Source) - assert.Equal(t, "image/svg+xml", result[0].MIMEType) + assert.Equal(t, "image/png", result[0].MIMEType) assert.Equal(t, []string{"16x16"}, result[0].Sizes) // Verify second icon is 24x24 assert.Equal(t, DataURI(tc.icon, SizeLG), result[1].Source) - assert.Equal(t, "image/svg+xml", result[1].MIMEType) + assert.Equal(t, "image/png", result[1].MIMEType) assert.Equal(t, []string{"24x24"}, result[1].Sizes) }) } @@ -113,17 +106,18 @@ func TestEmbeddedIconsExist(t *testing.T) { // Test that all icons used by toolsets are properly embedded expectedIcons := []string{ "apps", "beaker", "bell", "check-circle", "codescan", - "comment-discussion", "dependabot", "git-branch", "git-pull-request", - "issue-opened", "logo-gist", "organization", "people", "person", - "project", "repo", "shield", "shield-lock", "star", "tag", "tools", "workflow", + "comment-discussion", "copilot", "dependabot", "git-branch", "git-merge", + "git-pull-request", "issue-opened", "logo-gist", "organization", "people", + "person", "project", "repo", "repo-forked", "shield", "shield-lock", + "star", "star-fill", "tag", "tools", "workflow", } for _, icon := range expectedIcons { t.Run(icon, func(t *testing.T) { uri16 := DataURI(icon, SizeSM) uri24 := DataURI(icon, SizeLG) - assert.True(t, strings.HasPrefix(uri16, "data:"), "16px icon %s should be embedded", icon) - assert.True(t, strings.HasPrefix(uri24, "data:"), "24px icon %s should be embedded", icon) + assert.True(t, strings.HasPrefix(uri16, "data:image/png;base64,"), "16px icon %s should be embedded", icon) + assert.True(t, strings.HasPrefix(uri24, "data:image/png;base64,"), "24px icon %s should be embedded", icon) }) } } diff --git a/script/fetch-icons b/script/fetch-icons new file mode 100755 index 000000000..326356b1a --- /dev/null +++ b/script/fetch-icons @@ -0,0 +1,83 @@ +#!/bin/bash +# Fetch Octicon icons and convert them to PNG for embedding in the MCP server. +# Requires: rsvg-convert (from librsvg2-bin on Ubuntu/Debian) +# +# Usage: +# script/fetch-icons # Fetch all default icons +# script/fetch-icons icon1 icon2 # Fetch specific icons + +set -e + +ICONS_DIR="pkg/octicons/icons" +OCTICONS_BASE="https://raw.githubusercontent.com/primer/octicons/main/icons" + +# Default icons used by toolsets - add new icons here as needed +DEFAULT_ICONS=( + apps + beaker + bell + check-circle + codescan + comment-discussion + copilot + dependabot + git-branch + git-merge + git-pull-request + issue-opened + logo-gist + organization + people + person + project + repo + repo-forked + shield + shield-lock + star + star-fill + tag + tools + workflow +) + +# Check for rsvg-convert +if ! command -v rsvg-convert &> /dev/null; then + echo "Error: rsvg-convert not found. Install with:" + echo " Ubuntu/Debian: sudo apt-get install librsvg2-bin" + echo " macOS: brew install librsvg" + exit 1 +fi + +# Use provided icons or defaults +if [ $# -gt 0 ]; then + ICONS=("$@") +else + ICONS=("${DEFAULT_ICONS[@]}") +fi + +# Ensure icons directory exists +mkdir -p "$ICONS_DIR" + +echo "Fetching ${#ICONS[@]} icons..." + +for icon in "${ICONS[@]}"; do + for size in 16 24; do + svg_url="${OCTICONS_BASE}/${icon}-${size}.svg" + png_file="${ICONS_DIR}/${icon}-${size}.png" + + echo " ${icon}-${size}.png" + + # Download SVG and convert to PNG in one pipeline + if ! curl -sfL "$svg_url" | rsvg-convert -o "$png_file" 2>/dev/null; then + echo " Warning: Failed to fetch ${icon}-${size}.svg (may not exist)" + rm -f "$png_file" + fi + done +done + +echo "Done. Icons saved to $ICONS_DIR" +echo "" +echo "Remember to:" +echo " 1. Update pkg/octicons/octicons_test.go if adding new icons" +echo " 2. Run 'UPDATE_TOOLSNAPS=true go test ./...' to update snapshots" From b0080e1de1c48b304f25a0162c5fc415e5385798 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Mon, 15 Dec 2025 23:53:20 +0100 Subject: [PATCH 08/21] Add mark-github icon for server metadata --- pkg/octicons/icons/mark-github-16.png | Bin 0 -> 371 bytes pkg/octicons/icons/mark-github-24.png | Bin 0 -> 524 bytes pkg/octicons/octicons_test.go | 4 ++-- script/fetch-icons | 1 + 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 pkg/octicons/icons/mark-github-16.png create mode 100644 pkg/octicons/icons/mark-github-24.png diff --git a/pkg/octicons/icons/mark-github-16.png b/pkg/octicons/icons/mark-github-16.png new file mode 100644 index 0000000000000000000000000000000000000000..4edacddc68d4208cfda061d1f00bb01a73d43e3e GIT binary patch literal 371 zcmV-(0gV2MP)B zWG-ssIVtdx#JRRNysneIO%@NQ1mlVR5?&)|bz#o&5T4gcv_f_heO;I<7|P=c?jxyU zrHcYf7>xLi>^ky2-D2t=^8{`Z{Wi?WPJI&xc*hYI6XQG%@uqVsr*pw>kPEU|XksiW zFzWX-HWL14l+Uq>W%LxW>G8YpcY&Qz5&DmVAI#B RG$Q~2002ovPDHLkV1g%ZpdtVO literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/mark-github-24.png b/pkg/octicons/icons/mark-github-24.png new file mode 100644 index 0000000000000000000000000000000000000000..e3a0bbb13bca1b586d76d6f14ebf1d7a9a57a687 GIT binary patch literal 524 zcmV+n0`vWeP)TppyCD8x;Lbh2^F8;@kS_sad5t-}Byh_`2o}wmB$A$%+>w2RPc&SSX<53)Zn*{d{ zP+(`mSdD|NB-rz%N%SLPv}o@^Ju!|B0B>MxG_S=4J|*VE0~9!t%s<8jmXhGb0Scr! zOKC8@p|}0HbUD>h7M O0000 Date: Mon, 15 Dec 2025 23:59:12 +0100 Subject: [PATCH 09/21] Add light/dark theme icons for tools, resources, and prompts - Switch from size-based (16/24px) to theme-based (light/dark) icons - Use only 16x16 icons for smaller bundle size - Generate white (inverted) icons for dark theme backgrounds - Add icons to resources and prompts (auto-applied from toolset metadata) - Add 'file' icon for repository content resources - Update fetch-icons script to generate both theme variants --- .../assign_copilot_to_issue.snap | 10 ++-- pkg/github/__toolsnaps__/fork_repository.snap | 10 ++-- .../__toolsnaps__/merge_pull_request.snap | 10 ++-- .../__toolsnaps__/request_copilot_review.snap | 10 ++-- pkg/github/__toolsnaps__/star_repository.snap | 10 ++-- pkg/octicons/icons/apps-24.png | Bin 287 -> 0 bytes pkg/octicons/icons/apps-dark.png | Bin 0 -> 245 bytes .../icons/{apps-16.png => apps-light.png} | Bin pkg/octicons/icons/beaker-24.png | Bin 377 -> 0 bytes pkg/octicons/icons/beaker-dark.png | Bin 0 -> 328 bytes .../icons/{beaker-16.png => beaker-light.png} | Bin pkg/octicons/icons/bell-24.png | Bin 399 -> 0 bytes pkg/octicons/icons/bell-dark.png | Bin 0 -> 329 bytes .../icons/{bell-16.png => bell-light.png} | Bin pkg/octicons/icons/check-circle-24.png | Bin 536 -> 0 bytes pkg/octicons/icons/check-circle-dark.png | Bin 0 -> 370 bytes ...k-circle-16.png => check-circle-light.png} | Bin pkg/octicons/icons/codescan-24.png | Bin 521 -> 0 bytes pkg/octicons/icons/codescan-dark.png | Bin 0 -> 415 bytes .../{codescan-16.png => codescan-light.png} | Bin pkg/octicons/icons/comment-discussion-24.png | Bin 339 -> 0 bytes .../icons/comment-discussion-dark.png | Bin 0 -> 322 bytes ...on-16.png => comment-discussion-light.png} | Bin pkg/octicons/icons/copilot-24.png | Bin 554 -> 0 bytes pkg/octicons/icons/copilot-dark.png | Bin 0 -> 417 bytes .../{copilot-16.png => copilot-light.png} | Bin pkg/octicons/icons/dependabot-24.png | Bin 323 -> 0 bytes pkg/octicons/icons/dependabot-dark.png | Bin 0 -> 329 bytes ...dependabot-16.png => dependabot-light.png} | Bin pkg/octicons/icons/file-dark.png | Bin 0 -> 269 bytes pkg/octicons/icons/file-light.png | Bin 0 -> 234 bytes pkg/octicons/icons/git-branch-24.png | Bin 469 -> 0 bytes pkg/octicons/icons/git-branch-dark.png | Bin 0 -> 338 bytes ...git-branch-16.png => git-branch-light.png} | Bin pkg/octicons/icons/git-merge-24.png | Bin 446 -> 0 bytes pkg/octicons/icons/git-merge-dark.png | Bin 0 -> 334 bytes .../{git-merge-16.png => git-merge-light.png} | Bin pkg/octicons/icons/git-pull-request-24.png | Bin 478 -> 0 bytes pkg/octicons/icons/git-pull-request-dark.png | Bin 0 -> 323 bytes ...uest-16.png => git-pull-request-light.png} | Bin pkg/octicons/icons/issue-opened-24.png | Bin 490 -> 0 bytes pkg/octicons/icons/issue-opened-dark.png | Bin 0 -> 363 bytes ...e-opened-16.png => issue-opened-light.png} | Bin pkg/octicons/icons/logo-gist-24.png | Bin 665 -> 0 bytes pkg/octicons/icons/logo-gist-dark.png | Bin 0 -> 480 bytes .../{logo-gist-16.png => logo-gist-light.png} | Bin pkg/octicons/icons/mark-github-24.png | Bin 524 -> 0 bytes pkg/octicons/icons/mark-github-dark.png | Bin 0 -> 393 bytes ...rk-github-16.png => mark-github-light.png} | Bin pkg/octicons/icons/organization-24.png | Bin 348 -> 0 bytes pkg/octicons/icons/organization-dark.png | Bin 0 -> 296 bytes ...nization-16.png => organization-light.png} | Bin pkg/octicons/icons/people-24.png | Bin 525 -> 0 bytes pkg/octicons/icons/people-dark.png | Bin 0 -> 353 bytes .../icons/{people-16.png => people-light.png} | Bin pkg/octicons/icons/person-24.png | Bin 410 -> 0 bytes pkg/octicons/icons/person-dark.png | Bin 0 -> 324 bytes .../icons/{person-16.png => person-light.png} | Bin pkg/octicons/icons/project-24.png | Bin 267 -> 0 bytes pkg/octicons/icons/project-dark.png | Bin 0 -> 273 bytes .../{project-16.png => project-light.png} | Bin pkg/octicons/icons/repo-24.png | Bin 310 -> 0 bytes pkg/octicons/icons/repo-dark.png | Bin 0 -> 288 bytes pkg/octicons/icons/repo-forked-24.png | Bin 472 -> 0 bytes pkg/octicons/icons/repo-forked-dark.png | Bin 0 -> 353 bytes ...po-forked-16.png => repo-forked-light.png} | Bin .../icons/{repo-16.png => repo-light.png} | Bin pkg/octicons/icons/shield-24.png | Bin 477 -> 0 bytes pkg/octicons/icons/shield-dark.png | Bin 0 -> 401 bytes .../icons/{shield-16.png => shield-light.png} | Bin pkg/octicons/icons/shield-lock-24.png | Bin 503 -> 0 bytes pkg/octicons/icons/shield-lock-dark.png | Bin 0 -> 402 bytes ...ield-lock-16.png => shield-lock-light.png} | Bin pkg/octicons/icons/star-24.png | Bin 488 -> 0 bytes pkg/octicons/icons/star-dark.png | Bin 0 -> 383 bytes pkg/octicons/icons/star-fill-24.png | Bin 356 -> 0 bytes pkg/octicons/icons/star-fill-dark.png | Bin 0 -> 329 bytes .../{star-fill-16.png => star-fill-light.png} | Bin .../icons/{star-16.png => star-light.png} | Bin pkg/octicons/icons/tag-24.png | Bin 316 -> 0 bytes pkg/octicons/icons/tag-dark.png | Bin 0 -> 333 bytes .../icons/{tag-16.png => tag-light.png} | Bin pkg/octicons/icons/tools-24.png | Bin 489 -> 0 bytes pkg/octicons/icons/tools-dark.png | Bin 0 -> 383 bytes .../icons/{tools-16.png => tools-light.png} | Bin pkg/octicons/icons/workflow-24.png | Bin 351 -> 0 bytes pkg/octicons/icons/workflow-dark.png | Bin 0 -> 291 bytes .../{workflow-16.png => workflow-light.png} | Bin pkg/octicons/octicons.go | 31 ++++++----- pkg/octicons/octicons_test.go | 51 +++++++++--------- script/fetch-icons | 41 +++++++++----- 91 files changed, 101 insertions(+), 72 deletions(-) delete mode 100644 pkg/octicons/icons/apps-24.png create mode 100644 pkg/octicons/icons/apps-dark.png rename pkg/octicons/icons/{apps-16.png => apps-light.png} (100%) delete mode 100644 pkg/octicons/icons/beaker-24.png create mode 100644 pkg/octicons/icons/beaker-dark.png rename pkg/octicons/icons/{beaker-16.png => beaker-light.png} (100%) delete mode 100644 pkg/octicons/icons/bell-24.png create mode 100644 pkg/octicons/icons/bell-dark.png rename pkg/octicons/icons/{bell-16.png => bell-light.png} (100%) delete mode 100644 pkg/octicons/icons/check-circle-24.png create mode 100644 pkg/octicons/icons/check-circle-dark.png rename pkg/octicons/icons/{check-circle-16.png => check-circle-light.png} (100%) delete mode 100644 pkg/octicons/icons/codescan-24.png create mode 100644 pkg/octicons/icons/codescan-dark.png rename pkg/octicons/icons/{codescan-16.png => codescan-light.png} (100%) delete mode 100644 pkg/octicons/icons/comment-discussion-24.png create mode 100644 pkg/octicons/icons/comment-discussion-dark.png rename pkg/octicons/icons/{comment-discussion-16.png => comment-discussion-light.png} (100%) delete mode 100644 pkg/octicons/icons/copilot-24.png create mode 100644 pkg/octicons/icons/copilot-dark.png rename pkg/octicons/icons/{copilot-16.png => copilot-light.png} (100%) delete mode 100644 pkg/octicons/icons/dependabot-24.png create mode 100644 pkg/octicons/icons/dependabot-dark.png rename pkg/octicons/icons/{dependabot-16.png => dependabot-light.png} (100%) create mode 100644 pkg/octicons/icons/file-dark.png create mode 100644 pkg/octicons/icons/file-light.png delete mode 100644 pkg/octicons/icons/git-branch-24.png create mode 100644 pkg/octicons/icons/git-branch-dark.png rename pkg/octicons/icons/{git-branch-16.png => git-branch-light.png} (100%) delete mode 100644 pkg/octicons/icons/git-merge-24.png create mode 100644 pkg/octicons/icons/git-merge-dark.png rename pkg/octicons/icons/{git-merge-16.png => git-merge-light.png} (100%) delete mode 100644 pkg/octicons/icons/git-pull-request-24.png create mode 100644 pkg/octicons/icons/git-pull-request-dark.png rename pkg/octicons/icons/{git-pull-request-16.png => git-pull-request-light.png} (100%) delete mode 100644 pkg/octicons/icons/issue-opened-24.png create mode 100644 pkg/octicons/icons/issue-opened-dark.png rename pkg/octicons/icons/{issue-opened-16.png => issue-opened-light.png} (100%) delete mode 100644 pkg/octicons/icons/logo-gist-24.png create mode 100644 pkg/octicons/icons/logo-gist-dark.png rename pkg/octicons/icons/{logo-gist-16.png => logo-gist-light.png} (100%) delete mode 100644 pkg/octicons/icons/mark-github-24.png create mode 100644 pkg/octicons/icons/mark-github-dark.png rename pkg/octicons/icons/{mark-github-16.png => mark-github-light.png} (100%) delete mode 100644 pkg/octicons/icons/organization-24.png create mode 100644 pkg/octicons/icons/organization-dark.png rename pkg/octicons/icons/{organization-16.png => organization-light.png} (100%) delete mode 100644 pkg/octicons/icons/people-24.png create mode 100644 pkg/octicons/icons/people-dark.png rename pkg/octicons/icons/{people-16.png => people-light.png} (100%) delete mode 100644 pkg/octicons/icons/person-24.png create mode 100644 pkg/octicons/icons/person-dark.png rename pkg/octicons/icons/{person-16.png => person-light.png} (100%) delete mode 100644 pkg/octicons/icons/project-24.png create mode 100644 pkg/octicons/icons/project-dark.png rename pkg/octicons/icons/{project-16.png => project-light.png} (100%) delete mode 100644 pkg/octicons/icons/repo-24.png create mode 100644 pkg/octicons/icons/repo-dark.png delete mode 100644 pkg/octicons/icons/repo-forked-24.png create mode 100644 pkg/octicons/icons/repo-forked-dark.png rename pkg/octicons/icons/{repo-forked-16.png => repo-forked-light.png} (100%) rename pkg/octicons/icons/{repo-16.png => repo-light.png} (100%) delete mode 100644 pkg/octicons/icons/shield-24.png create mode 100644 pkg/octicons/icons/shield-dark.png rename pkg/octicons/icons/{shield-16.png => shield-light.png} (100%) delete mode 100644 pkg/octicons/icons/shield-lock-24.png create mode 100644 pkg/octicons/icons/shield-lock-dark.png rename pkg/octicons/icons/{shield-lock-16.png => shield-lock-light.png} (100%) delete mode 100644 pkg/octicons/icons/star-24.png create mode 100644 pkg/octicons/icons/star-dark.png delete mode 100644 pkg/octicons/icons/star-fill-24.png create mode 100644 pkg/octicons/icons/star-fill-dark.png rename pkg/octicons/icons/{star-fill-16.png => star-fill-light.png} (100%) rename pkg/octicons/icons/{star-16.png => star-light.png} (100%) delete mode 100644 pkg/octicons/icons/tag-24.png create mode 100644 pkg/octicons/icons/tag-dark.png rename pkg/octicons/icons/{tag-16.png => tag-light.png} (100%) delete mode 100644 pkg/octicons/icons/tools-24.png create mode 100644 pkg/octicons/icons/tools-dark.png rename pkg/octicons/icons/{tools-16.png => tools-light.png} (100%) delete mode 100644 pkg/octicons/icons/workflow-24.png create mode 100644 pkg/octicons/icons/workflow-dark.png rename pkg/octicons/icons/{workflow-16.png => workflow-light.png} (100%) diff --git a/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap b/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap index 2259514e1..3fe4c8e59 100644 --- a/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap +++ b/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap @@ -33,14 +33,16 @@ "mimeType": "image/png", "sizes": [ "16x16" - ] + ], + "theme": "light" }, { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAB30lEQVRIid3VS29NURQH8J8bTVOvRErqEQNSA/UYCK2ExIhIiCC+QDsRJGVCYlofgDDgSxhIOkAMGo9JE0OkA0xK6lVXQlrkugZ733T32OcejxH/ZGffs/Za/7XOf+11Lv87luAkRvESX/EFk7iJE1j8p+RDeIdmxXqLwd8h3oixXyAurjH0VpGvEKSo4wL60RXXUEI2mNgHom89xna3S3AOjUicwxM8Ljnrj7HnU+PCgtMWPMd4CUm9TXHjeIFd7RKsFppWhg2CRGV4g2WpoVZw6BL6kMNm9GAV+kp8VqKzLHuvoOF3P/egU5iFVpNHM0QD8awhuU0L4n4cVwSJprAUdwVNmziATTgbYy7hKW7F5/XYh4+R4xWGcUMMbiTVrcV1odmz+IT7OJpUewwP4tksnuEa1iQ8DeyHCfMH5m+Rck0UDbkE24TvztYKWy5Bs3iLcjiCw+ZLlLNlURO0qvJJ9zJbDo0aLlY4vY77VIUth5HWj9OYEXQbFgauhRq2m7vSZbZFOBM5ZnCqmK0Pd6LDe2EudqOjTYUd2IOrmI6xt4WZoVBBC3uFgToYCT4LH7JJc9L0YB12Cv9o34Tpvox7KVkuQQvLcSi+xQ5hALtjldMx4SM8jOQf2nD9w/gBIjKNY9qqxzEAAAAASUVORK5CYII=", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAd0SU1FB+kMDxY4IrpYP2AAAAEbSURBVCjPhZG/K4QBGMc/75tcV8JAXa7k6kwUJovxpDAii79AUbIr/wL2MzCQTZzBQIabRBadl+iKyy4/cj6GO29n4Xmm5/P9Pj1PzxPI3xECkGaDa6qUWWKZMlWuWacLIBBauCTFIRGDjAEFLskyziMDvCDOqqMiJtQvEyKOqTMSAj3AacPAAIATIFNDH0ArAJNAwAQAbTWlCYiAPY5JMccVkCdHhVxdsd0j9UF9dse0aXd9Vu/Vgm24qX6JgTRkIKrm8b1uwGmLIhadkrrhLaQ5PlofwwAM0x+zREgUF3fcABBxG7MSZr1Qtxz8tcOQ2+q5mUBIsso8SUqcUQa6GaGXV9ZY4e2no9NFD6xY9dMn912wo6YE/737G+cbs16mFGdfAAAAAElFTkSuQmCC", "mimeType": "image/png", "sizes": [ - "24x24" - ] + "16x16" + ], + "theme": "dark" } ] } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/fork_repository.snap b/pkg/github/__toolsnaps__/fork_repository.snap index a8742d427..a44d89e0a 100644 --- a/pkg/github/__toolsnaps__/fork_repository.snap +++ b/pkg/github/__toolsnaps__/fork_repository.snap @@ -31,14 +31,16 @@ "mimeType": "image/png", "sizes": [ "16x16" - ] + ], + "theme": "light" }, { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABjUlEQVRIibXUP2sVQRQF8F8ieVWMsREUAj7LiClMpZVYCZaCRT5CLDR22qifINFOGzvBP6B2ok266CdIFREsNJoQJJ2Bp8Xc1SHZN/tW3zsw3N2zZ+65OzN3GDEO1XDzuIpT+ISfDTkO4wouYg9fSuJ76OFXjI/oFvTd0FT6Hu72E8+H4CGO4Dy28Kpg8Do05zCNR5HjbJ34RlQxnXEr2CkY7GA5ez8aOa5XxHj2cTPibMadzvg6bO7Tz2b8AUxK67mF+3gX1SwWDK6F5m3M2cZG5KpFV1rz3RAuYqxgMBYmGzHnJU4W9H/Qk07UoKhO3wGM15H4ijMtDOY0nP9+FS1hqqCbws3Q3mlj0MEzfxuoaTzFRF2i0gbCBanhqr9YiPgk4g+sYbVN9SWstk3Wb5OHhpEbDIpJPMB3fJO6tm+3/gteSHf94xh7eD6s5Ceko3gr424Hd7xp8iB7cCziesat7/v2X+hI6/5eusi6+BBcZxgGcFm6LavO3Q2uEU2dnGMGl+L5DT63mDs6/AYzsl+gNMh4PwAAAABJRU5ErkJggg==", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAd0SU1FB+kMDxY4JSQ8qsMAAADbSURBVCjPhZExToJBEEbf/lL+JaHSH49glAtwByw0cgTOQScegN6EeAdLGmMBcgGJxFhAMJbEZ+HCrsbITLLJvJ1832QmyP9RANBiwpoBIbIb3plwBoCIT84dqR0Rz9WRc6diVDhiTB84hPj2GcdKxIGqS5siHrtS9VqMDYVDtZKYlTo0JItPZkC5G70EZpgssBllt7Ha6oXdHio6NLgAbnnjjudvHH4t6h5o56D247ukjpR8ZMyUBz6q+mCRaN5wqvbsqSeJ5hYLNlwCG17/tsCuC1+8ylnYd+4vzDGuPOWJUq8AAAAASUVORK5CYII=", "mimeType": "image/png", "sizes": [ - "24x24" - ] + "16x16" + ], + "theme": "dark" } ] } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/merge_pull_request.snap b/pkg/github/__toolsnaps__/merge_pull_request.snap index 251e17503..57526fca6 100644 --- a/pkg/github/__toolsnaps__/merge_pull_request.snap +++ b/pkg/github/__toolsnaps__/merge_pull_request.snap @@ -49,14 +49,16 @@ "mimeType": "image/png", "sizes": [ "16x16" - ] + ], + "theme": "light" }, { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABc0lEQVRIibXVv05UQRQG8B/YLkEThFZIbLRbKnZJeAsTfAQkQkEPVLZrQqM+gBYWu6FBrH0FFBIBS8ISEqAQE1iLMxsnBHaJ9+6X3Mzck5nvm/NnzjBgPLjFNo0XmMIh/pQpuI5rdNK3j8myyKcT+TuMooY2mmUJLItTP8xsDZwWIR3O5kdpfJbZnmf2wqiImLfxFl+FRwtlCRAJbeIqCS1gqEyBLjrYGQRxLnCJsUEKXOGj3iEawiJ2RbW13PPedLCdxk94fMe6xbRmS5R0WxRKJT/BXQLrOMcb0S6+4AfOsnUrIldz6b+Gb3gpvO/pwVqaP8UG9vDbvzbS/T5n+x4l21Iv8psCvdASYakn8g+i3VTLEpgUMe96c43VfhtaIhS/8Er/i1bBPF7rc/IRHAiXGyKpnSRSCuYT4Uxm2xaV89/Iu+l4Gr9nth1MFBHIURVJei8qoo4TJT44ROXkT+ZPPClCeFuFVDGLY2zioojAwPEXb7xhRsU8X9cAAAAASUVORK5CYII=", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAd0SU1FB+kMDxY4I81fD/YAAADISURBVCjPhZE9bsJAEIU/o4hboL2CI6ioqSg5SXo3adKC00VCHACQIqXgDKkRuYCzUooU/B0gXwrbBViGN8VotTPvzZtJ5DY6AAzYcWZWvS4h4s7oWp3IdZQ9gU9egNDGMFN1b2gylKnjQt00v2uJPyIwJqdbjf7KkS/6tQQ+q7n649zMN3VldOtFAY788NcSj648XhfUETyoOpWHSrMHBIrKWkHKhG/e6xlyVQ/tNk8uTdWnNpuRIRkQ2zbZd+vJqUmTIbl37n/ducqf5eIFHgAAAABJRU5ErkJggg==", "mimeType": "image/png", "sizes": [ - "24x24" - ] + "16x16" + ], + "theme": "dark" } ] } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/request_copilot_review.snap b/pkg/github/__toolsnaps__/request_copilot_review.snap index e395bac48..11a9cfc57 100644 --- a/pkg/github/__toolsnaps__/request_copilot_review.snap +++ b/pkg/github/__toolsnaps__/request_copilot_review.snap @@ -32,14 +32,16 @@ "mimeType": "image/png", "sizes": [ "16x16" - ] + ], + "theme": "light" }, { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAB30lEQVRIid3VS29NURQH8J8bTVOvRErqEQNSA/UYCK2ExIhIiCC+QDsRJGVCYlofgDDgSxhIOkAMGo9JE0OkA0xK6lVXQlrkugZ733T32OcejxH/ZGffs/Za/7XOf+11Lv87luAkRvESX/EFk7iJE1j8p+RDeIdmxXqLwd8h3oixXyAurjH0VpGvEKSo4wL60RXXUEI2mNgHom89xna3S3AOjUicwxM8Ljnrj7HnU+PCgtMWPMd4CUm9TXHjeIFd7RKsFppWhg2CRGV4g2WpoVZw6BL6kMNm9GAV+kp8VqKzLHuvoOF3P/egU5iFVpNHM0QD8awhuU0L4n4cVwSJprAUdwVNmziATTgbYy7hKW7F5/XYh4+R4xWGcUMMbiTVrcV1odmz+IT7OJpUewwP4tksnuEa1iQ8DeyHCfMH5m+Rck0UDbkE24TvztYKWy5Bs3iLcjiCw+ZLlLNlURO0qvJJ9zJbDo0aLlY4vY77VIUth5HWj9OYEXQbFgauhRq2m7vSZbZFOBM5ZnCqmK0Pd6LDe2EudqOjTYUd2IOrmI6xt4WZoVBBC3uFgToYCT4LH7JJc9L0YB12Cv9o34Tpvox7KVkuQQvLcSi+xQ5hALtjldMx4SM8jOQf2nD9w/gBIjKNY9qqxzEAAAAASUVORK5CYII=", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAd0SU1FB+kMDxY4IrpYP2AAAAEbSURBVCjPhZG/K4QBGMc/75tcV8JAXa7k6kwUJovxpDAii79AUbIr/wL2MzCQTZzBQIabRBadl+iKyy4/cj6GO29n4Xmm5/P9Pj1PzxPI3xECkGaDa6qUWWKZMlWuWacLIBBauCTFIRGDjAEFLskyziMDvCDOqqMiJtQvEyKOqTMSAj3AacPAAIATIFNDH0ArAJNAwAQAbTWlCYiAPY5JMccVkCdHhVxdsd0j9UF9dse0aXd9Vu/Vgm24qX6JgTRkIKrm8b1uwGmLIhadkrrhLaQ5PlofwwAM0x+zREgUF3fcABBxG7MSZr1Qtxz8tcOQ2+q5mUBIsso8SUqcUQa6GaGXV9ZY4e2no9NFD6xY9dMn912wo6YE/737G+cbs16mFGdfAAAAAElFTkSuQmCC", "mimeType": "image/png", "sizes": [ - "24x24" - ] + "16x16" + ], + "theme": "dark" } ] } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/star_repository.snap b/pkg/github/__toolsnaps__/star_repository.snap index 9da449d3d..39bbced3c 100644 --- a/pkg/github/__toolsnaps__/star_repository.snap +++ b/pkg/github/__toolsnaps__/star_repository.snap @@ -27,14 +27,16 @@ "mimeType": "image/png", "sizes": [ "16x16" - ] + ], + "theme": "light" }, { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABGUlEQVRIidXVO07DUBSE4c+QgiI94iVCQShCk4oqa2ELrCElBRAIEqSjZQHsgQXQQIPEGiBBgkCRa+kiOcZOHCFGOrKLmX+OLT+WldMRDnBfMldImxjhHduLKLjAV5jzquFreIsKhtiosuAsgqdzWhV8Fa8ZBUOszwtfQT8Dnk4/eKYqCccGWmhiN5otLP2yxBgveIrmEQ94TuHjnC1nnXFgSzBYQMEgukMS9CqEX2Xd2gQnFcAv482z1J0DfpwHnrekWxQOOzMUNLJA057x/TLb5GX+rKA1Q0FmplbC/IGbcH6YkS181TWTP1f8yt9iL/I0cI3PyDfKWfiHmlHoDu0cbzt4Un+zSEHd5LPRKWIO6oRMvUTmn+gbFfKxlxTztakAAAAASUVORK5CYII=", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAd0SU1FB+kMDxY4Jr01+3kAAADDSURBVCjPfZE9TsNAEEZfLBdwgYg/KZEguACU3gFukTpX4CpAmYrS4jKkDQghlzTuTJBQHoVjxSvH+baY1TdvNTM7PQn0gDwGjs1z5spfB00vBJ5VfeoCjixV/fF068YA9LlkxJRDAA6Y88o7S74B7y3sUuFdRE5Jl0pyxKGfO9/nXtRNDvxopb88b04xaQG3VSbaVDtp1T+uQg1ct4CrKsQB8McLMCMGbsJdLFybmYiYmLn2Lfzq1HGwlbFpdevJfv0Diova5gStEDYAAAAASUVORK5CYII=", "mimeType": "image/png", "sizes": [ - "24x24" - ] + "16x16" + ], + "theme": "dark" } ] } \ No newline at end of file diff --git a/pkg/octicons/icons/apps-24.png b/pkg/octicons/icons/apps-24.png deleted file mode 100644 index dea712673620a184ae1a59432eb234828b2e2591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt^vJY5_^ zJUZV_cH}x_AmAGBx+t%T;r#;X@T!J5hgXqTq$|wB7rB36S{oqhC_ZzVnUAXOU6Egk zDl_*?kW`cZwa%fl^?=ZfQ~x+)8kVSrU*z*>TyGqtkasXti=)xHfX(lK`=jIp{xuCd z?|gh1Wd6H1MNo69Ytgp61ETAn85!-L+FhBm=*Yh!W!6_APr2fZq+5;o9-o~mzk`wg zLC4xPclI!E%M8z%Tx$_(`0KlOLoWBaYZ=@LYQK516~5oDEG+fqo3nMAhw!=!51t%6 i**tlzRcX=xugurI+a8>|zn=%_KL$@%KbLh*2~7YPa&_qd diff --git a/pkg/octicons/icons/apps-dark.png b/pkg/octicons/icons/apps-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4af9802a0bc620336e6fcff18d5127b54d202ad9 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJ0<-ojK zK%sn37sn8d^LH;AavgFIV7;*Yu-G%RX;G1`?`3p?I_I`;yx_D+OwYqipxVBs?fO}R zl@b1I>d^(pIw4b%e=f^c+2E}Haznm~@`p9N&$xVUT=DBoiTSv~JN}4IP~$zvZ$?(z nf6bA6SE~0_JbhXG`#R=jTxqkF3{NfrTFv0;>gTe~DWM4fcj;3c literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/apps-16.png b/pkg/octicons/icons/apps-light.png similarity index 100% rename from pkg/octicons/icons/apps-16.png rename to pkg/octicons/icons/apps-light.png diff --git a/pkg/octicons/icons/beaker-24.png b/pkg/octicons/icons/beaker-24.png deleted file mode 100644 index 2f42ab65e6ad477cb3c978dd286df112eb0c6dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377 zcmV-<0fzpGP)v>hxWwIVX(iywA=sDMBZAhuW!BUeb-;>|M<_CKowspQN?(iNLzwI74MkE zC3ZuOq6I@J;RLm!U-A`18c_{=)@ha)mO3^ zF7SZvA_m*)YdDp_nZzfy@{0H41^XGe2YAC^vtoNpQwhCz!g`9qBYLodwG0CpQGX)R z-k`>)VJwTm5neHng&fd_XB?&xr^7TGIm9DuhTfStLJO{NkFEj+9k|7fn6;h{6RZ>v zkFXjv=Aw(AfAVO^r@t_WdWWNnpKE%C5A5MMob#X!3!(2kjI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJ0<-ojK zK%qmPE{-7@=X?7MvzP)!T+jDxW|=L}?J(;FlZy8VDVE$#OyvnL`L@hby>TNWId!_< z1&1nYM;2G!L!JxkN~b7(Klr@(f9?Ny9-lXnVTxBIT%y175@^0W@! zy*mv5r+MW4d17~gW#5Amv&|Fq*S&3jHcvV}U$K3iPV0fm-tKPG9S*y%>UMFOnE#B& z=!d*ba9ZPxUE7sruH0cR+H>dT&T6+eyKKY$1SmY6u+rnllj-J1%G3E3mxuM+KY7LP Y6m%%-+x~oipl=vFUHx3vIVCg!0Im>%ApigX literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/beaker-16.png b/pkg/octicons/icons/beaker-light.png similarity index 100% rename from pkg/octicons/icons/beaker-16.png rename to pkg/octicons/icons/beaker-light.png diff --git a/pkg/octicons/icons/bell-24.png b/pkg/octicons/icons/bell-24.png deleted file mode 100644 index 01c88c343b43365b5a5152caff99811568922028..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 399 zcmV;A0dW3_P)Iajltmr+|l6nq%qjSKFSktD{z3#e9b}v z9azUx0)xlkcBV0?!bJk{9M0vxr$j3#3IEd|6Zt-c&cmnKFAdrwAEq!kirkijyo5{C zrZA|L{hTa)N9>k;l_M#{a~O%)?m~n*oL~o)MHpnTjZ@U;Bh2B>+Z_~x_RyHi70TW< z&v1;z5)7aZO|l#LfHB#h$#aQu6IzKe6oU=#YK>7FOe0hXEx5&Mm^5N7YRx}k00SYI tTf;5-lMI%9PkBW%y5hXy?e+dHUH}5dQ$!jZDtZ6_002ovPDHLkV1fppuQvby diff --git a/pkg/octicons/icons/bell-dark.png b/pkg/octicons/icons/bell-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4927458c3f3815cf0b517efad484c3e2c43c0fb5 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJ0<-ojK zK%v8)E{-7@=X?7Nvz!72T>XzUxUS)OxrxPGNc7;Tvn;C}rU~fslts2iMekt#+O3qN zyh3nI-_gl`{<|2I&w6<8uz~o`*}I(iao4S_3P}g^w@NWP zt53I32>xxj;k)){-m*Kby6zW*vo}Qr@_6@Idoe2Cm&jn)%;BM@*P(j7ueN928SA3Q z-WeA^r&x9go}TySWb+2qhtH4I`^HteTq5XNQRgkjH*pDlu;1X|kQcs}h}0QoD}kE{jt=BVN@hkUvSfXR;_uFd{l~8~swW zAPUw|ot8Wv7M(APeN%=`a`HnIv{gY)6#1`~znVz;?VUS#JtTS7rkC@VO)(rxWfnD& zt?%)o;Fc)N><-B1MD+7z!iHE>U9q_8;)GZ?FZ5Y;86c+o6b^}$F5n)14eKDo1TLgg_US)Lr(40Z ad-wy*S8L3a^$fxQ0000004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBDz>VU;qFB>`6pHR4C7F(YsCpVGsr2X}}hI1S^8@F7_JV#{_=ZK=e6K zJ1?ydfF>sP+RLR{_OsYsF2S5)k~wG2ng5><75XyomX_X)_3D0EPTbm9nHfrER&rC# zT5#f3VW72jYe@<(nx)`Q;c`pXxKfyi(6=!-qC*(Torkg2o_UEIZ$jHz3Lox|Cb<#9 zqj~tP0xp~hAz@TWhkkd0Pv1HRbS0=GI)1DV=qh5jWXD&PUE;J{vL~1ReP$-t4PmNq zbwpn)WaUpbJu4*bJ@ZWANuxei(?o9VL6SUJ%Viq7Yld(xnOj(x8|v2mKUOPI(iACO Qy#N3J07*qoM6N<$f?f-eCIA2c literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/check-circle-16.png b/pkg/octicons/icons/check-circle-light.png similarity index 100% rename from pkg/octicons/icons/check-circle-16.png rename to pkg/octicons/icons/check-circle-light.png diff --git a/pkg/octicons/icons/codescan-24.png b/pkg/octicons/icons/codescan-24.png deleted file mode 100644 index 9497dc1f39bab93a8ea604e7729ff3565be8a40f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 521 zcmV+k0`~ohP)~5^dpPKJ%hWGxx+xhn@lG6p7(s*^VO2a67J$Q+PH#4e8F41 z!lxSjEIQc2F@9qkFVKtsHvWXXkHxbXzk?xuVinUF-Za*56yHiy*@gklVi0=E zb;OPo`7Wj!8ZR&vPL8mUBW+1(X&QMMa}nU{D&bA3V5=GBYo&81!@G|WZj=QNrEaMz z=w>)CoOI&6S;3u=y6Zt%@KI{LGI|+fkH+p>CD}W?FB|%X=M9aY=Hw*~%H&_@j-87% z>{UcqpcV3ClQrpvy%Su*cU&I3`y4O0g{K)O-H<;Eeu1m_Q6}eVkV`{d`YLO%E>*ut z7ZojC*F_s;!BQx#RVXnz2Q4WzRVe1*dX=y*jrv?h`82epNq&Tpa8;O*ay|@xU;SWCU_si7BdIHPqzUcCe<$uoQqJc? zujsf&PDopEUFz!tX(4{a2Wdf8b<3HZoCk%ICl~4DG4?Og!3q8W^_73M1o004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBDz>VU;qFC8A(JzR4C7V(XmQg0Tcw#dHa4qf{oaz7{L_&gC8JKRyGmA zudxxd76lQaT~J)x^bwWxK}C?=^_jp{Nn>#=-qT15nQAU~<_>csB3f3Q>U&f<(NQ+@ z6p~~jUo)5Me9JH+na@-%)5%qmL`-;4`S`3+SW+376p7LgRZU)D+Jkc~i4`o0cxOb6 z8Wqt-N8;2^g_tq0FAfdNh{Bbw#Jz3tUeCQ*F|DUED|YlH9<7T*EHw8Qa3I$Gm8g7a zbhX1jug0P4M%iRI62~tYuImh+@L9x|aWQU8#4_4-4;O|${MW;jU%o4)CIi2%DPI1v zYKWb>$%skkxU*-|zCOK`vhO$NFXq0*K7a)002ov JPDHLkV1kw4r{e$s literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/codescan-16.png b/pkg/octicons/icons/codescan-light.png similarity index 100% rename from pkg/octicons/icons/codescan-16.png rename to pkg/octicons/icons/codescan-light.png diff --git a/pkg/octicons/icons/comment-discussion-24.png b/pkg/octicons/icons/comment-discussion-24.png deleted file mode 100644 index 41a8f96c1579624495e14fca79688767e2f13c1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 339 zcmV-Z0j&OsP)N~wcW>DM=U5?a87qvNif@I)C)~H(*boQU zZAwg$v@9;HNt=?kI}~okzd(^k6)qd}C@{rg;dzKzp8~fbauOW2OR%Wu$C@2Zh|!SpcS1~<^?xlypI!^{i9vRcc+yj@7F}U%c8k1h$JF@LS4wu l%tG~N?1f9b${e^kJ^+v;TaR1vYQF#g002ovPDHLkV1l@&lA!I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZKBT@m&` z#SD8qT^vI+&bLmq&O78F;@U4*`@;FWRnUg+DTQSY&krr@5=kkWsMBZ^YBu4NsZ-v9 z4+@H>CMV^jSa$8aeCGKc>*D9CM(a4&v&i%~++yr(>{{=5Q_?hssNmZg^W_R5b-OFK83Y!BJKcSUh{ z-R&bsukI?}Q?8tLQ8RC?ZPcAC^Q@b7V)eHa-eza5|IZvz(KYYn-m?Ep3-@i<&F^&r P6gCW=u6{1-oD!M<1MquW literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/comment-discussion-16.png b/pkg/octicons/icons/comment-discussion-light.png similarity index 100% rename from pkg/octicons/icons/comment-discussion-16.png rename to pkg/octicons/icons/comment-discussion-light.png diff --git a/pkg/octicons/icons/copilot-24.png b/pkg/octicons/icons/copilot-24.png deleted file mode 100644 index d25a1e2d9a665fe212e47fd003208bbd5daf81a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmV+_0@eMAP)JbA{1N9gPt%SsgNQfZ5Ksym6 zWkONfSe)158TlRaZh<9kN@vI@aO$*|F z99IO1rmz%u1x=ecfK50XV=mz-ZpG*I*oTji;}wQ+Lkw;t)vd*Kq1m(eg!?#}RC^2$ z;@K>o;TqN?JPquJ3G)Z$Z;^6M6b-oq+l24V)(TrLL9=*^ayWv+=1Y{bWl!~ zqfLb!*n_K>jvcbJFx+9d-);Xy1hCzKnY*SuQ~f%W){a s#SUQryJMBpG2tUTjN~8MaQ(yh0U|PuW7?|6F#rGn07*qoM6N<$f=dMS-2eap diff --git a/pkg/octicons/icons/copilot-dark.png b/pkg/octicons/icons/copilot-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..cce1bfeebe863ff268c1a1fe06b2f4b3d96bd339 GIT binary patch literal 417 zcmV;S0bc%zP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBDz>VU;qFC8%ab#R4C7dk-sa10T{8Tw=!(lOKXN{XJ8x&D*%%~zyttoHKhrNfIW^$F~=2z@~r=!zF53E@A(`u%o5~|GoPg=Nq$LrW9vi00000 LNkvXXu0mjf5T&3~ literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/copilot-16.png b/pkg/octicons/icons/copilot-light.png similarity index 100% rename from pkg/octicons/icons/copilot-16.png rename to pkg/octicons/icons/copilot-light.png diff --git a/pkg/octicons/icons/dependabot-24.png b/pkg/octicons/icons/dependabot-24.png deleted file mode 100644 index 43e1e158f87b5974f85f4b320a6a1658aea557ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmV-J0lfZ+P)=yR;Qf-{_9uf^vO2Mzi@j#}a_@tonR!?7>7SZA09A!!6eFe1JOj}7{h z$R2bt{YPI0Yh@6>>Bb6_;vb+kCThd7-h&($cn{Wxosc7MTAZmy_9otglb#zKAfH{< VN7t}I>dpWF002ovPDHLkV1kK1ibwze diff --git a/pkg/octicons/icons/dependabot-dark.png b/pkg/octicons/icons/dependabot-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2bc0a539d29cf3958eae42772871ffa14062e7 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZK>v+?}j zfI^2oT^vI+&evWr^gHYz((+JWj5T(}iZwg@`wplEh!l&?5)ll2=Op#cK~JFbi(`mM zW7n}u0Y@5A4gPC~S?8PFlKp6Fo;k^;ROI5`DLYRm8|4T@e&tPHQ1n(N=Al?kMS;VT zQ_=q(&CudH(|fk3%D6buuhH<^uQ&d)7b#!$3Rq>GRp$BoliKMHoy#sNo@K3D*D7wi zc6a}E&D)2>au2;)-7ft7?a!po%3>AAzl8tUa@S>*413qCBN_%93vPN>Z2h>#^v_{+ Y`P_BKPM%&Y3G@zwr>mdKI;Vst0QCKW8~^|S literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/dependabot-16.png b/pkg/octicons/icons/dependabot-light.png similarity index 100% rename from pkg/octicons/icons/dependabot-16.png rename to pkg/octicons/icons/dependabot-light.png diff --git a/pkg/octicons/icons/file-dark.png b/pkg/octicons/icons/file-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..cb702f4f445449722e19ef8ac2c6fd949f761e8b GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZK>v+?}j zfI{t_E{-7@=kHF?<~!sd;(C4pm&zpGQuT&51t}5vW|s3wH`urxLdv9so;Xg?R6WCG z;lKCJZ@ZlxI}EIzJapW}#pIF~;~8?r$8s~%i<({D!tdX$n8y<|A^q?SRo&ZxZaJDO zSM1z;ZvKqhU*1o;U6AOcuz`J3oBqGU0bg#~)^C|KW0FkT_l1RO`f>XT*}v$wb_1Qn N;OXk;vd$@?2>@3FUaSBB literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/file-light.png b/pkg/octicons/icons/file-light.png new file mode 100644 index 0000000000000000000000000000000000000000..1267091ad04300f451e9eeed6d2b398e7bcb1a9e GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`hJzX3_ zEPCHww&gnHAi(-SKPfTuWowb})-atTr{*6Es^))eYSYk~D#UU+;>d&*yC+;a#Lmo| ze{c58)M;$NPc)PZkDp_o6gKa1)8}--X*&{Il%F+9shTM+I{G&L=fb>u{TxXVi4Brm zYpP{iS%c1Mh3h0Gw;4D-`<+-i_d(0TtoJOpXT8W0IC}qqIM1!+G4Zz-H|vGg?lV8K fPFFU~KGcEUf$iuRoOpqd~L~g&d37S0>4vNv`+a1;cRGS+m#X?AiM;W*jSU zbGU)?_=w+!#5jrTxQajcTod2NE}B^H(W&S=q3P>)vCt--3&BI2#wBcHy<+evH1n9k za>VGC#CIc$sf=61PQ_pc53=X!h;gS+OlB{)VxP&liy2?S);|4A#vi~5>3eQt2~Q)N zTNQ)bq1lWxU(t(LMRcTZ{tKTX_(a8EB20Stfi;|~=>MTnxeW#MZ{Gn-mdO9Wtd{#f ztidVV!!_xO9vKZb@YdeOYg?;0UJBG!z$W%5cv(s0JD%g&Aldf~-VJ)Fgjx+Y#%=Iz z6bAdpbq6a_vs{qI?~73wk>>gbX;dsq1#YBH9SLqm!1;{Z#G7G)<~2AI`|FH*g|ovL zI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZK>v+?}j zfI??HT^vI+&bLmq%{!DJ;Br6xsX(BJusmaD$WAv44qNsGTrKnTME7xcHMdNi#x_~3 zz;p8SL(_7P-1pn4{Wc@L-0Z~L4u%TV#R*Of3Lj23_Q)|P{hKj+RjuItt5@#$tWi6n zBf)r{LFGUPYoT%CqF3j{1%Z^L^IBWZ^_jGkM9`6q8vIs4WpIg~vBzo@cs^(%R&556n37lB(`6VXO hLT|05>yGd5>J<)7373(4{}Jdf22WQ%mvv4FO#sQKf9e1L literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/git-branch-16.png b/pkg/octicons/icons/git-branch-light.png similarity index 100% rename from pkg/octicons/icons/git-branch-16.png rename to pkg/octicons/icons/git-branch-light.png diff --git a/pkg/octicons/icons/git-merge-24.png b/pkg/octicons/icons/git-merge-24.png deleted file mode 100644 index 750f3d44e94c7d5f3f013f03cc11993aa701eaba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446 zcmV;v0YUzWP)qquwDJ!XkD>wYA*y-gK~?#!q;B z$GXL|W=oWGTNFwqKfzrB>o~_7(JsE=2hOr}DA!|=cqzQ^>A_l>Kg9<2@Y}yO z()~VX`yM6RQZMqG0=>`@VW}tb52D>v%MzFrG4FbFjn#e|S|Sv`@Jj!SR>3@8>vQrE z90->iBB`AuQVQl1;Y?=R7M1hg$h+xy8oy_@9ZVDv$WawZdM_%XjuRz5I7H>-Pv%cN oDMEN#g;X(%V{GE0h`_+{7jL{_M#Vf|*8l(j07*qoM6N<$f)MPz%m4rY diff --git a/pkg/octicons/icons/git-merge-dark.png b/pkg/octicons/icons/git-merge-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6f9966efff8555ee600b654512fe923e3fb9c7 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZK>v+?}j zfI=rcT^vI+&bLmq%{$~E&}zT9BYMH!Cgl|?R%%#!R+(pBYP#&|B*QR4Y3T!=m4Z7P zHV1Wy{E=0N=eo@r(Pn-$W2^D|v$H*)m{~FK+$c;7+pDMe=-i8_xhG1e*f#pdHC#Am z5L}v{VKimsW2d_&`?EXkl?>FDNB90aHBtZ9Ru;R}JAXaCbH=bul-7J3&(V(A zP3Abm=-?;D3i?6mr+8mxo}nhK`7XYN`9Og)j3vyJ=%0o5SR9~Pg;+o{v^_X;0;9fg z8gLr$Z&5=_ccV=?y3xuofN5+>1+(R76?O^hQmL53TWQlwRS1|4ZX2({V@)bQhnNV` z-P~APDsac)YfLCZBfKW)euJUtJ2~PCu2l#a3T}o@Zu}5+-2>+e?qNsof%7M{q-AM@ z_GNh0i^QhhBXbqkD+JV}HP3YWn9Uv*|B||NdTrqiepLt{eb8}S#YZex)crkv0|h=~ UkNWkrs{jB107*qoM6N<$f-mUX#Q*>R diff --git a/pkg/octicons/icons/git-pull-request-dark.png b/pkg/octicons/icons/git-pull-request-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..045554a4c82caca2555bd83254640545206fd2d3 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZK>v+?}j zfI@pcT^vI+&ab_&(U&<;!1dyGY0Je--qB5lf|Ixv%AJ@47+9utWH8KR(qPbKy}(w~ z*J7}9I>#pGgzCSI2RiS&{6BZK=b8Jzt1D_;L*A8&`MJ#b`Agg9VpLSlturxJw>Ym` zT#M>dzrAPO)Q)3ZcRCx>kFbbGD@xg{aN)7(dJwk6Z_*yspB*YE%g+TbIX6$nD`OH* z{Yh&jDcKp{|A$ZL(C*o?D^9~>?i1USzJ8nEh);0|d1kj);=3?c(9Pnb{L_D&Hp^Z2 Ri4o`#22WQ%mvv4FO#r7|cmMzZ literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/git-pull-request-16.png b/pkg/octicons/icons/git-pull-request-light.png similarity index 100% rename from pkg/octicons/icons/git-pull-request-16.png rename to pkg/octicons/icons/git-pull-request-light.png diff --git a/pkg/octicons/icons/issue-opened-24.png b/pkg/octicons/icons/issue-opened-24.png deleted file mode 100644 index 13a5df55aa6433777e48a66ac4f774b2dec4991b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490 zcmVTZccgSSjo!JSyUoy@4^L^*sd*)omjENF|9rtk; zS8yrW5AhLiv4bB~1t#$X>o|+g*v0qcpTU9t!LyPiYklt&alYF^g-TO z7eB}L2n4eAeZJT6OstCKQ;;`A_3QndHL<8VVsTZ)f><|u1}r<`_775El};Kd=d0pr zJP~P$R-59|24P8@c~?~aANimsvxYUXcF&3Ve}`|$e*rfzD~@y%ukmMCfecf)m%e_F g{+sl5N_fVHe@`r4jLuMi8~^|S07*qoM6N<$g3^87+W-In diff --git a/pkg/octicons/icons/issue-opened-dark.png b/pkg/octicons/icons/issue-opened-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0fee48d7c6dee43341bb9030132ef63bafbb0014 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJ`VCz|- zK%u9eE{-7@=W8eW`W-e9X;ByT-LBjIVv)VN(yP`CpS58HOhLs$AqgJryi z72lrBeaLq{RD_w!CR^p%oQQcRo$frC(Ix6DG%v}eTQJ|oZI!#Dqu6tGt-#{Bd$?6< zz3i%;X8yC9x#L3nv57mxo%jpoUjN-cX?pBQNxsjk4?dc~vGHK=oRi!(+kT&%BW}|c zD3tfn<}&~3Q<0A|ZYCPM$taBYWq(^FscYe)Wy=<&2>sA^?^R#q)YbML=wSv=S3j3^ HP66zq9hxUDP=S4EQCA6 z9sc7V#Z(-?eSE|hyu?*(!^FQuq#|d$89VVE7jPS2F)R_DfhJ5y@>SS~dpP^22(CmM z8ZjnArY6a?V?o;Up&NE*V^!8-HC~_@BTG;^0LM|^4Pp;*C2Mho`138@FiwpKIJO7j+Qd_J`q`*i>bJXPr?&zc!LHJHbX>`HR4B-dzACk5}7qxWLr5H zl#I1wqHxVC?80;O#c<3*Z*h`OaS%K34!d)7+-xV-FD({A9eU->T`uw?bxG&UL@o=5 z(tDFgyhHf{Ric))WhmH-{&{oDix3+nvbz|mE}>FX_E5}*pK((WY1%}IL(rX-NDcz)iL5@7z88zi|1M{53yxuY0eclmXH$}G zE<`FH)uIVk{Z3HfMqRCQaW00wvg_%8{1!g}p5B6buR+sX00000NkvXXu0mjf_=zkF diff --git a/pkg/octicons/icons/logo-gist-dark.png b/pkg/octicons/icons/logo-gist-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..25818059a5f7af15c5e03d0524f9794e49e1b15e GIT binary patch literal 480 zcmV<60U!Q}P)P000mO1ONa4N$(sW0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBvU(@RR911T1iAfR4C7tlD|uvQ5c1veEG0Rs@S1wBZz}e;#5cp0SjU> zbnMbGtBz7o!Tte`odie0Lg~<5!26DJkUM;U4aL z&->$?8N&@_VpNHIf+3l8|k1OT!BQ$oJ*jF%)C z$83w-AP%`*MIoRfO532kOQ6outEXYsYfcjXPsp> z`NUpSc-r5}m9u5T$&i$b$x?eHMAcSB7sJ957FX5A*<#CJDd=DPr{1X3Vk$ zl_``Rm#kYPoaMe?PTXwuA{iMI#kbhnzBhJKYXX1`yDTy`z`Tqg{ WD#i3C#!y870000a literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/logo-gist-16.png b/pkg/octicons/icons/logo-gist-light.png similarity index 100% rename from pkg/octicons/icons/logo-gist-16.png rename to pkg/octicons/icons/logo-gist-light.png diff --git a/pkg/octicons/icons/mark-github-24.png b/pkg/octicons/icons/mark-github-24.png deleted file mode 100644 index e3a0bbb13bca1b586d76d6f14ebf1d7a9a57a687..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmV+n0`vWeP)TppyCD8x;Lbh2^F8;@kS_sad5t-}Byh_`2o}wmB$A$%+>w2RPc&SSX<53)Zn*{d{ zP+(`mSdD|NB-rz%N%SLPv}o@^Ju!|B0B>MxG_S=4J|*VE0~9!t%s<8jmXhGb0Scr! zOKC8@p|}0HbUD>h7M O0000004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBvU(@RR91114%?dR4C7FkufhraTLXWUZ1{%fq~6RB2^2qip1t)bl_uj zv8%jR`XMA@F1rcQ#$sR<5}Hos?`L@LwWxE4o1A-cZ|*rrUR4`*9XPP-k!uB?wZxXe zp9nTB7lOn~|HFmlOmL!JyYH>~>WkX*z$-NstQyp|SaM#(Ib*S*ep-pC5dkp}cmv=a zfCwm2!=9=uqi>2@QuPk|>R@7w_^kFLNn;GB{Q&k^a{k4AC zdsUBd-Qc08et7Pdh#Q_c%>Aq&wj8=?+m4GOE{wcP$5!9C=Z;hPfh?Df$vCX0L5*|4 nm%-FzoMskxeYBx&wcx)2zZEbN5@(7600000NkvXXu0mjfB59v> literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/mark-github-16.png b/pkg/octicons/icons/mark-github-light.png similarity index 100% rename from pkg/octicons/icons/mark-github-16.png rename to pkg/octicons/icons/mark-github-light.png diff --git a/pkg/octicons/icons/organization-24.png b/pkg/octicons/icons/organization-24.png deleted file mode 100644 index 60672d37b1d1d93bdeaba078b8a451899753a45c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348 zcmV-i0i*tjP)r13?r9@L!CTl?M>T+ZgQ@614RUf^Edc8+Zc?J5zWB zt+lffOj@xL5tX&b1SW~I*$E+%4~BhzX5Ke%=FL8qhyx5zW{y5usi2KW?&A%&nH$^3 zCbnlyEYZyjF03h2&b2uLW+6q;!6({5e+=Uyo9cI}~ zC*iA&ID@w7J9tR=y2dlus6&v0nBW-iqKCKWGQGhQE@u(UTc)q*VP|Am$ub?&|Ls?? zFr@BagbsEmY|pq}6u}jm6Skimf>}q@#F=4ZY6N+buo7_w0~GkEvFI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJ`VCz|- zK%qsRE{-7@=a)`2Eh?DKJ%#19_%+?1ZT~KvF~b{tpUIIVHXw=+m8` qGI+ZBxvXxb- z7%Yjeh>ReS)S@fsuO$u*3Lv~?V0F!!HNG401sAIboA5A&KHw_Ga*gNSEFNHE$#)wj@gA$% zi4S51(>Ng}qKqz_#9Mq6S4x4q8T?>X<}-MLHC5%cpdZgNNKwg{81oq%Yb7^C$~-V1n6}k$MI2st2LYCdHeD|5uM^XB ziMT(;I}k5$O-xT2H}R;6mEz~pDJI2zRK`004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBvU(@RR910+et)0R4C7_(Z4PP0T2h^*%NLPr3X;xFVT4g6|N@n3dAd@ zxVQ)j5)GB^-hkF6YZH;UD0TjH7mZ~1Q|xhv5QX0q(|l9ROd@_yE&d3ak;hBqvGh#{ zp{bPFajmo{MyqPMOA|uftxVYUY}@z{^lc6%4)ldNCrYg$=<2Eqsh(^=PdyI7ywa7n z8>NL0@bC^&ZG|d@wp3VC+NwaJqj0EUQp1r#N8$`!Ga{^DePpo>EK99=a&IbJ=zZSY zopT|~dey2$E%v|MZZF0nA|j9Dm`?ufSwH3t(ErSrHP&sV00000NkvXXu0mjf(AbK< literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/people-16.png b/pkg/octicons/icons/people-light.png similarity index 100% rename from pkg/octicons/icons/people-16.png rename to pkg/octicons/icons/people-light.png diff --git a/pkg/octicons/icons/person-24.png b/pkg/octicons/icons/person-24.png deleted file mode 100644 index 212e2acd20a4c44a18237144f20151d0d875122f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)J~A|62W zL`A3(5uzIvja!dm?~`!M>^U=|;7e8}C+oj1S!=K1zpGS`D`Oht@%tLbc>j$iCUJ?6 zoLxj;+sWTh#WH%LE#U^Qm}oV5DRx;!e+_?M^qng{>TjAAMzNe=Rw6S~4=5*svxOce zn1dYKRDq6!FH<&}x@@YzMf{ylFpD|1DV1a3jj+(X25>JdIn`)VQ^HfM3JdLxwi=VS z^-Kvf-uCmzGTSPWpq|FCBOKckj$+qP5q8suGpysbna=0%f(LA%vj)?NO+4aR;udOk z{(>tE7vL+Aea2`bxP()o^CHQ=7J0;p27en1!tyqnNSK+c1RliKbN~PV07*qoM6N<$ Ef@x*1djJ3c diff --git a/pkg/octicons/icons/person-dark.png b/pkg/octicons/icons/person-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1767ceb0d6f65497951846503f95b63629cef8 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJG6`NIu zfkOK{T^vI+&QG0a%XP>>pf$c}Zfo4Z`65;P8?Oexm}tVG)TC0uq|N3SR;@!B9 zn+;DM>v%Bxnc-(c<1;KTwmY47_exEfvg&o}Nu@&xGmVcIE}i_8TjA&>rw+5eC0uuA zJheNPV)rGDbtnIqHSZ=QWh%R{A75s*sQaLx@MDAgEi64dC%ioLLU;xfJKL3&#!onW zY8IStZi%|L_SiJ*y-X2BiyQZ3Bt?oGm>IfK=g6$!LiW|MPra)ZJrCO7|FcTG;lkx( U9Q)f20)4{Z>FVdQ&MBb@0HLOR9smFU literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/person-16.png b/pkg/octicons/icons/person-light.png similarity index 100% rename from pkg/octicons/icons/person-16.png rename to pkg/octicons/icons/person-light.png diff --git a/pkg/octicons/icons/project-24.png b/pkg/octicons/icons/project-24.png deleted file mode 100644 index de1c267dc7a2fc492a011c1f5fc1eda2f304db23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt@!JY5_^ zJUZ`Q_2px96li<`o71x^i&({|qA zxg3+z`p`y*W}p)0#)Q`;U?=qx5QvjVu1K836sl N;OXk;vd$@?2>`8LY!Uzf diff --git a/pkg/octicons/icons/project-dark.png b/pkg/octicons/icons/project-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..15b496de7237d8f3c9621f3ac8b63515d25d67d0 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJG6`NIu zfkNG$E{-7@=ci8G%iA0v(7a!vjB&}IGY$v&7V?`!HmOb$HF7Is;GC#iVWK(r(O#2| z%fkDf=|o#aw?|n<7G&`i`Ruvr=GnHyPvWwt=Z9-w7;GvT3<|zFN%2UkGjtv3e^Te! zp^)VfUehD_?pmjRMq*k;;Z5!sB_#l?)EHw{cqsGeD zQLqs##Lf^9>|Bc_@v^t(%$iE>gDYm(oo|+b;h1F$Hy9%ne)rXaD~Vu;BV6L$;vArx zsXJwiK|$dOeeo4jR+9sp82v#|BNZ&2R?rGs!G92>1U%wR`MRE2cIjFT_{1$<3L0!& z*8$fBg(vhitm}ZMO8lYz{L@8@so)uVmHbBLPA>N&>q$JoIj(Rr=iUyEGYxi|1Q+6f zc9Z-F9pA&-#~Ic#@`pK%)d;u~|2BGf6$iOA4wHCWoYAlO0{Ck~28nCC)Bpeg07*qo IM6N<$f}}x&-~a#s diff --git a/pkg/octicons/icons/repo-dark.png b/pkg/octicons/icons/repo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..eba66aa1475a6a50b0c485d39abd0639530ab722 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJG6`NIu zfkLx9T^vI+&YzuV$aN?{z$M}{y+P&lvT zI9dPTwVP?vWpCV+bcu<$E%iuAh%;dGqa%|Qxr&q=j$GTzvNd?3M8gzz;f|k;^$I0+ zC+14N{4O?WpRWbmda)-T3||?fhM0%kJK}cL?aq#^QbNzxJ(U%jcX-2#^|6hr7d=it h$jVGhv%L0+>FS!kO@do`6o9T|@O1TaS?83{1OSc)X7~UA literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/repo-forked-24.png b/pkg/octicons/icons/repo-forked-24.png deleted file mode 100644 index f35eb9418a711cfcf92258f654c3c246cdd2e56f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmV;}0Vn>6P)neK#YA1A(gwl>so|=>Scv!};t#B0wN3RUthPI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJG6`NIu zfkL-ET^vI+&bLl9^lNeyaJ&C6=%4DsOY;2*Q@9J*bxev_&N-^fHQZ~dVE2|vW-Mat zJQCqxFzrbC!$a$io$%Roa?jkF`zdNC{s%H#NIEo&QE`*>y_p4U4ITdHWLL@xp1(S= zczIHYMUs!aMaz$GlE=M{G_LZVtt7WQ=xbCDZ>#gxNi(KenW%L8r#bAD-pi6ULuZ3z z>h_JdUbWtp)3P$z!H`$^xbJzsOr7p4xs2xvzCGT(q;E=1%9$zbcB_6ROw71fuxb922WQ%mvv4FO#l_LiDdu) literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/repo-forked-16.png b/pkg/octicons/icons/repo-forked-light.png similarity index 100% rename from pkg/octicons/icons/repo-forked-16.png rename to pkg/octicons/icons/repo-forked-light.png diff --git a/pkg/octicons/icons/repo-16.png b/pkg/octicons/icons/repo-light.png similarity index 100% rename from pkg/octicons/icons/repo-16.png rename to pkg/octicons/icons/repo-light.png diff --git a/pkg/octicons/icons/shield-24.png b/pkg/octicons/icons/shield-24.png deleted file mode 100644 index 3048123f41522e9893035467f7de4e392e49562d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 477 zcmV<30V4j1P)K*Knoe-GLSrIT{06JIh0)qMrZF1aRlH6W6qx-B;omVET3|;ec^pS_2>qD`bMZX> zzYO{^>$87RHhK*{W8fcX4&qbyqxTnmQ10A1{AggX7w=OBuW;xOM~l1nij6$tMc;M z-&DMdA?4j$VA-#;8OMXj-NWu&@!l>k;9ZD4j41FH=cQ+tjh(oPClNC-w*B}C=mS=Z TRfS3>00000NkvXXu0mjf;NH*l diff --git a/pkg/octicons/icons/shield-dark.png b/pkg/octicons/icons/shield-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..82a0d5ad37c1eddd210a0ab05069778c5f649cdb GIT binary patch literal 401 zcmV;C0dD?@P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKCcQQLc>n+b3rR#lR4C7dk-sj3Q5c7xek$qGS|m(O69iX)uy!CwEZw*O z*We-;l&u3pH%a3PBuLytC0(>4gbrj>dEejrBq!%N2?-Uk&K}#qHCNp7 z6LK*!@3{@NZN-Xhwc)vWBSE}Wo0ct@7BOwXvQ70O2D+9^$=FF*@=GEhNsUgpvB+uY zI@FkiB!6ppY$oELN&=r`2J`pGZi-F})X5IQqY)rWJq8}wAPQop>6@Eijhk51uDTx{ z_u+f!4%D64L&AGsofmP-O%WG-^Ug#JV9pnxTp37OweGVy=>xdrqdkwEan=)iR$YuY vL$w*t?Ao$r*JAh;B;lx)ISzp$)nW7tpHac{085jh00000NkvXXu0mjf^2MG2 literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/shield-16.png b/pkg/octicons/icons/shield-light.png similarity index 100% rename from pkg/octicons/icons/shield-16.png rename to pkg/octicons/icons/shield-light.png diff --git a/pkg/octicons/icons/shield-lock-24.png b/pkg/octicons/icons/shield-lock-24.png deleted file mode 100644 index 36dd3c4f1108a5e9d2371b575ab08fba0e1b6d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 503 zcmVLL|LGvsKgWn8r=4p};yGL|c#CT5zUA(>T&u^zkkXzG4xVFj?VFMs6`UMQHlr zQ9HARAb!RG=P=%4w&TGagtowZ9q|Y5qSwN77<%FHy-ZZ6GKRO<_=5r);jyExz(2v* z2;5z`9PvQfNq@D#0?tN!8t2=Hs!OyfzhtwO_*8@E&$|}-V{F7b-cp8 zjBuy4$BT%EVF@qGkLnCw;AlqpZAkn(j^KG+fk)VnLm6=s4r3o4*L6-w_sZ>z!INR) zKp$UZ{^cEM`Ue_DT8D$7y_F;F#Roh^cLeh;p5ZP|up0s4; t+g!fI*R^<@wvAAzi!%{FRC%>>_yq?oUZAP#j5`1T002ovPDHLkV1lf&=yCu6 diff --git a/pkg/octicons/icons/shield-lock-dark.png b/pkg/octicons/icons/shield-lock-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f57ac5d0c48d6501b448aa7dd0bc17a2c05937 GIT binary patch literal 402 zcmV;D0d4+?P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKCcQQLc>n+b3`s;mR4C6~k-JVpK@>&Ty=p=OmOcuCiqSt%V@;<84UK=` z*Jy)u6ly|8V*CX)p*67*B8^}O78HnLTo!kf$C+mKIy>h~_CyjY=8z&sz%6y|_z7H$ zEm*Ouet6@JA8OZ%1!FES+RRgM+zM01F(@NDSAk za}w|qPvLgL8rMmZkq`FG&!n*JyZ1&(P?)plt9$?LeLKFHlRpFQ+Va~oS6ubnZ=3EU woypLQ7mgh|bZj~N3KBW}@-0q*GR+D41&C#{=Gi;OumAu607*qoM6N<$f^sCGIsgCw literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/shield-lock-16.png b/pkg/octicons/icons/shield-lock-light.png similarity index 100% rename from pkg/octicons/icons/shield-lock-16.png rename to pkg/octicons/icons/shield-lock-light.png diff --git a/pkg/octicons/icons/star-24.png b/pkg/octicons/icons/star-24.png deleted file mode 100644 index 9a05584dc948925c563d0361093b6a6cb90f7da0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488 zcmVP)bC5ld*`ayHIm3NLYep!Nl>;Sis(lZ_8(W3Q6-bvHBnIzZgP z8+;ouIDxCtNZ#1V$oE29C7p~O*2gWk5bL3}nKiA#!$>^I6E#rbo# zZ}9O^4Xy^URcKO$Xb*QwJL;RU!X4>C?n$TYOyoNF6ipRl3$HPY+aYowovc=TcOo|% z+^tgaY3ZeG diff --git a/pkg/octicons/icons/star-dark.png b/pkg/octicons/icons/star-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..12560e9e3588b26ed416ee915ebc752ed7de6926 GIT binary patch literal 383 zcmV-_0f7FAP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKCcQQLc>n+a`AI}UR4C7Vki9NLaU6!9s>Kb6BI!qH6D5tsP#=?9Fko{9 z28~;&(O8?YaSJYjL5GSGNf*R1;S4>G;k3s&1Mh!(-zUHP-!~^29V6!%$MjqD+t6a# zo669q*M^2CgJ=-M~l7V$xz$JxG8ALEP|(VS`~a1uNehHtj`NyK|ceYPCt02DhbC1T4-W7nk_8-vcwoK zc#7r`4|q=D5YCl$aiI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZKRy{5k_ zfkKBpT^vI+&eu+~^*ih!;1;hVUeMTKuQ^d+2g8(mjCm8S!XIck%KhvIaT zcRmvWHHf()oi=Ul}XZO`-nHO67im6X0^zX-#*T)#X z>`XZ_#hHO`#^+Pk-uoEe>%Iwk80+HaIo+%1$in&7_n*gI@#XuIv2?#pzMo+xFVdQ&MBb@06Cm|iU0rr literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/star-fill-16.png b/pkg/octicons/icons/star-fill-light.png similarity index 100% rename from pkg/octicons/icons/star-fill-16.png rename to pkg/octicons/icons/star-fill-light.png diff --git a/pkg/octicons/icons/star-16.png b/pkg/octicons/icons/star-light.png similarity index 100% rename from pkg/octicons/icons/star-16.png rename to pkg/octicons/icons/star-light.png diff --git a/pkg/octicons/icons/tag-24.png b/pkg/octicons/icons/tag-24.png deleted file mode 100644 index 2ff8994e84e57f04d29e7080636d9819aeeeb4a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmV-C0mJ@@P)Yq|jJ6+sMr9%jje<@KIRzSmCLq|01ksc&!l~ za8=NEf(_nqS^_?mENxRW?U|B`P+7+cS1wNbeM O0000I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZL6Q%0xX z1BH%zx;TbtoUfg*G51h_K%4y?wp8ZD>S_mAnO&5u4H%O8I${&Jl*BcJVuO}-&iUdf z#`B<`$^K7A;Ja1UwdLRM+fVqf%sfqIA8tNld&SmzJm51PSR$NriW|&1hxUEDqS*skynS9eek$f0`FF cyL_&(fX?Z~QFVdQ&MBb@05TtbNdN!< literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/tag-16.png b/pkg/octicons/icons/tag-light.png similarity index 100% rename from pkg/octicons/icons/tag-16.png rename to pkg/octicons/icons/tag-light.png diff --git a/pkg/octicons/icons/tools-24.png b/pkg/octicons/icons/tools-24.png deleted file mode 100644 index 31292ede5671487a78ff7191226dafdb82aab649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 zcmVy@FjD zF*YKIglH*(L97L_PW}b06twUaUs5F}5`*z9_P4SuvvY5VPcwJF=R3b=c5Y^my!K-x zm#$$8YdDthkB7GvY)`s_HXg<}mtf|?TZ-{^x6RMvHx}Z18}kWnKD;5^jX5)& znh)U(o@2Pn0KvY%>*(=U+iH`};t+0Pv(suS+Qcm!#+h8e41VBg56w$G!G>as8w1Ai zF2GW&IES%HZ7gcvDzy!~#ldRB9kqbH_+G1B!2`U+^{Cyzc3i5lE$oreV|-22C-6-1 zqqgJoM1otzqg=q%XmF&#pT<;!cQoc+&IKI6FD&Mu2HjH}kkL-y5`N-T56w?2j_Unx z;C=Xr51O~5s%d-*zT@gkP2r2;kuPMpi@|)xWVg*rjblaewmgyWPlmS~Y+ssGoQ&Co zHyd7d<@K9f*RB{_39r16I|m8aoe5~wn7#tazsvQ6w_alg3dlXdKmq@Ji{2~VqNy!f f!z;xF`+xca-_u>(g8fJp00000NkvXXu0mjf``F|; diff --git a/pkg/octicons/icons/tools-dark.png b/pkg/octicons/icons/tools-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a0991b257d7f7dddd9d000753aa08ae3bb6942d1 GIT binary patch literal 383 zcmV-_0f7FAP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKC(1I*?*IS*`AI}UR4C77kTFUFK^R6~mepV&gp{#LtDQCx?9yl<9zfF> zMMMvf!>CnmpygIU#l*Gr8oCO)X?zyWZdRNhhL1Oof$vAcM0U&EH7as}I;QHCh}UXr zrz$M_Y-VCEVs2t)>XJwVz%d&fFrf}Woe76*G6aG!V9G7kbHj|mLRjMtcm?|OL%L@j zAO=8cz?c&f;DvFZKuv%LB6>iBBjA!x;E6fggcfJ&UbzLtef6|jbLN{n<@2tYkH0kw zwCdEkJrTE@JN>&T#I`yTaiq2j9+k}nz5vL9?*cD`Ch!5_ZvGcmO5q)7RDKQ6+9b3&c-HZaTeLYp|>lEMiBg97?$}m-z+n;gkQoY9x;qqfeU1H6L*5| z;RQDl-W(3FkF&ZWlvU^7OA^^m-)yx}-I#TM}~ zeG7hiOsslQ`-vj@m`MrT1%DV3`8GPZk{;U>@`@8{)DSz$MlEA@Bvy@ZYsl5OLF;c( xlRfAKe}bn7XM2QK8=3M4pb#H`2W9`-$2%IdMY*J83labT002ovPDHLkV1iZplW70| diff --git a/pkg/octicons/icons/workflow-dark.png b/pkg/octicons/icons/workflow-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d14097483db823bdc5ddb8b61a5f1e8605304905 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZL6Q%0xX z1BK>#x;TbtoL@R&q39t45!ZZ6*#=nw4jHND6|P2%C%JC?%4LCUQM-Iqy+@Uft$9o=!>+i}SeLy^&ZfUxu*>4nk>=OoH8+?Y63)(Z-DUl)(Q9XO j;bWcyeW97(9ZT~sOHJd`i;j&4I+VfF)z4*}Q$iB}A=zl` literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/workflow-16.png b/pkg/octicons/icons/workflow-light.png similarity index 100% rename from pkg/octicons/icons/workflow-16.png rename to pkg/octicons/icons/workflow-light.png diff --git a/pkg/octicons/octicons.go b/pkg/octicons/octicons.go index 804a23b47..8cd644375 100644 --- a/pkg/octicons/octicons.go +++ b/pkg/octicons/octicons.go @@ -13,20 +13,23 @@ import ( //go:embed icons/*.png var iconsFS embed.FS -// Size represents the size of an Octicon icon. -type Size int +// Theme represents the color theme of an icon. +type Theme string const ( - // SizeSM is the small (16x16) icon size. - SizeSM Size = 16 - // SizeLG is the large (24x24) icon size. - SizeLG Size = 24 + // ThemeLight is for light backgrounds (dark/black icons). + ThemeLight Theme = "light" + // ThemeDark is for dark backgrounds (light/white icons). + ThemeDark Theme = "dark" ) // DataURI returns a data URI for the embedded Octicon PNG. +// The theme parameter specifies which variant to use: +// - ThemeLight: dark icons for light backgrounds +// - ThemeDark: light icons for dark backgrounds // If the icon is not found in the embedded filesystem, it returns an empty string. -func DataURI(name string, size Size) string { - filename := fmt.Sprintf("icons/%s-%d.png", name, size) +func DataURI(name string, theme Theme) string { + filename := fmt.Sprintf("icons/%s-%s.png", name, theme) data, err := iconsFS.ReadFile(filename) if err != nil { return "" @@ -34,8 +37,8 @@ func DataURI(name string, size Size) string { return "data:image/png;base64," + base64.StdEncoding.EncodeToString(data) } -// Icons returns MCP Icon objects for the given octicon name in both 16x16 and 24x24 sizes. -// Icons are embedded as PNG data URIs for offline use and faster loading. +// Icons returns MCP Icon objects for the given octicon name in light and dark themes. +// Icons are embedded as 16x16 PNG data URIs for offline use and faster loading. // The name should be the base octicon name without size suffix (e.g., "repo" not "repo-16"). // See https://primer.style/foundations/icons for available icons. func Icons(name string) []mcp.Icon { @@ -44,14 +47,16 @@ func Icons(name string) []mcp.Icon { } return []mcp.Icon{ { - Source: DataURI(name, SizeSM), + Source: DataURI(name, ThemeLight), MIMEType: "image/png", Sizes: []string{"16x16"}, + Theme: string(ThemeLight), }, { - Source: DataURI(name, SizeLG), + Source: DataURI(name, ThemeDark), MIMEType: "image/png", - Sizes: []string{"24x24"}, + Sizes: []string{"16x16"}, + Theme: string(ThemeDark), }, } } diff --git a/pkg/octicons/octicons_test.go b/pkg/octicons/octicons_test.go index 20f752a37..bd8b79b57 100644 --- a/pkg/octicons/octicons_test.go +++ b/pkg/octicons/octicons_test.go @@ -11,28 +11,28 @@ func TestDataURI(t *testing.T) { tests := []struct { name string icon string - size Size + theme Theme wantDataURI bool wantEmpty bool }{ { - name: "embedded icon returns data URI", + name: "light theme icon returns data URI", icon: "repo", - size: SizeSM, + theme: ThemeLight, wantDataURI: true, wantEmpty: false, }, { - name: "embedded icon large returns data URI", + name: "dark theme icon returns data URI", icon: "repo", - size: SizeLG, + theme: ThemeDark, wantDataURI: true, wantEmpty: false, }, { name: "non-embedded icon returns empty string", icon: "nonexistent-icon", - size: SizeSM, + theme: ThemeLight, wantDataURI: false, wantEmpty: true, }, @@ -40,7 +40,7 @@ func TestDataURI(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - result := DataURI(tc.icon, tc.size) + result := DataURI(tc.icon, tc.theme) if tc.wantDataURI { assert.True(t, strings.HasPrefix(result, "data:image/png;base64,"), "expected data URI prefix") assert.NotContains(t, result, "https://") @@ -60,7 +60,7 @@ func TestIcons(t *testing.T) { wantCount int }{ { - name: "valid embedded icon returns two sizes", + name: "valid embedded icon returns light and dark variants", icon: "repo", wantNil: false, wantCount: 2, @@ -83,41 +83,42 @@ func TestIcons(t *testing.T) { assert.NotNil(t, result) assert.Len(t, result, tc.wantCount) - // Verify first icon is 16x16 - assert.Equal(t, DataURI(tc.icon, SizeSM), result[0].Source) + // Verify first icon is light theme + assert.Equal(t, DataURI(tc.icon, ThemeLight), result[0].Source) assert.Equal(t, "image/png", result[0].MIMEType) assert.Equal(t, []string{"16x16"}, result[0].Sizes) + assert.Equal(t, "light", result[0].Theme) - // Verify second icon is 24x24 - assert.Equal(t, DataURI(tc.icon, SizeLG), result[1].Source) + // Verify second icon is dark theme + assert.Equal(t, DataURI(tc.icon, ThemeDark), result[1].Source) assert.Equal(t, "image/png", result[1].MIMEType) - assert.Equal(t, []string{"24x24"}, result[1].Sizes) + assert.Equal(t, []string{"16x16"}, result[1].Sizes) + assert.Equal(t, "dark", result[1].Theme) }) } } -func TestSizeConstants(t *testing.T) { - // Verify size constants have expected values - assert.Equal(t, Size(16), SizeSM) - assert.Equal(t, Size(24), SizeLG) +func TestThemeConstants(t *testing.T) { + assert.Equal(t, Theme("light"), ThemeLight) + assert.Equal(t, Theme("dark"), ThemeDark) } func TestEmbeddedIconsExist(t *testing.T) { // Test that all icons used by toolsets are properly embedded expectedIcons := []string{ "apps", "beaker", "bell", "check-circle", "codescan", - "comment-discussion", "copilot", "dependabot", "git-branch", "git-merge", - "git-pull-request", "issue-opened", "logo-gist", "mark-github", "organization", - "people", "person", "project", "repo", "repo-forked", "shield", "shield-lock", - "star", "star-fill", "tag", "tools", "workflow", + "comment-discussion", "copilot", "dependabot", "file", "git-branch", + "git-merge", "git-pull-request", "issue-opened", "logo-gist", "mark-github", + "organization", "people", "person", "project", "repo", "repo-forked", + "shield", "shield-lock", "star", "star-fill", "tag", "tools", "workflow", } for _, icon := range expectedIcons { t.Run(icon, func(t *testing.T) { - uri16 := DataURI(icon, SizeSM) - uri24 := DataURI(icon, SizeLG) - assert.True(t, strings.HasPrefix(uri16, "data:image/png;base64,"), "16px icon %s should be embedded", icon) - assert.True(t, strings.HasPrefix(uri24, "data:image/png;base64,"), "24px icon %s should be embedded", icon) + lightURI := DataURI(icon, ThemeLight) + darkURI := DataURI(icon, ThemeDark) + assert.True(t, strings.HasPrefix(lightURI, "data:image/png;base64,"), "light theme icon %s should be embedded", icon) + assert.True(t, strings.HasPrefix(darkURI, "data:image/png;base64,"), "dark theme icon %s should be embedded", icon) }) } } diff --git a/script/fetch-icons b/script/fetch-icons index fe7e254f7..bfd3970fe 100755 --- a/script/fetch-icons +++ b/script/fetch-icons @@ -1,6 +1,7 @@ #!/bin/bash # Fetch Octicon icons and convert them to PNG for embedding in the MCP server. -# Requires: rsvg-convert (from librsvg2-bin on Ubuntu/Debian) +# Generates both light theme (dark icons) and dark theme (white icons) variants. +# Requires: rsvg-convert (from librsvg2-bin on Ubuntu/Debian), ImageMagick (convert) # # Usage: # script/fetch-icons # Fetch all default icons @@ -21,6 +22,7 @@ DEFAULT_ICONS=( comment-discussion copilot dependabot + file git-branch git-merge git-pull-request @@ -50,6 +52,14 @@ if ! command -v rsvg-convert &> /dev/null; then exit 1 fi +# Check for ImageMagick convert +if ! command -v convert &> /dev/null; then + echo "Error: ImageMagick convert not found. Install with:" + echo " Ubuntu/Debian: sudo apt-get install imagemagick" + echo " macOS: brew install imagemagick" + exit 1 +fi + # Use provided icons or defaults if [ $# -gt 0 ]; then ICONS=("$@") @@ -60,21 +70,24 @@ fi # Ensure icons directory exists mkdir -p "$ICONS_DIR" -echo "Fetching ${#ICONS[@]} icons..." +echo "Fetching ${#ICONS[@]} icons (light + dark themes)..." for icon in "${ICONS[@]}"; do - for size in 16 24; do - svg_url="${OCTICONS_BASE}/${icon}-${size}.svg" - png_file="${ICONS_DIR}/${icon}-${size}.png" - - echo " ${icon}-${size}.png" - - # Download SVG and convert to PNG in one pipeline - if ! curl -sfL "$svg_url" | rsvg-convert -o "$png_file" 2>/dev/null; then - echo " Warning: Failed to fetch ${icon}-${size}.svg (may not exist)" - rm -f "$png_file" - fi - done + svg_url="${OCTICONS_BASE}/${icon}-16.svg" + light_file="${ICONS_DIR}/${icon}-light.png" + dark_file="${ICONS_DIR}/${icon}-dark.png" + + echo " ${icon} (light + dark)" + + # Download SVG and convert to PNG (light theme - dark icons for light backgrounds) + if curl -sfL "$svg_url" | rsvg-convert -o "$light_file" 2>/dev/null; then + # Create dark theme variant (invert colors for dark backgrounds) + # -channel RGB inverts only color channels, preserving alpha + convert "$light_file" -channel RGB -negate "$dark_file" + else + echo " Warning: Failed to fetch ${icon}-16.svg (may not exist)" + rm -f "$light_file" "$dark_file" + fi done echo "Done. Icons saved to $ICONS_DIR" From a8cc23113364d7801e1fcce041a9465d93f8456a Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Tue, 16 Dec 2025 00:03:17 +0100 Subject: [PATCH 10/21] Use 24px icons with SVG fill modification for themes - Switch from 16px to 24px icons for better visibility - Use SVG fill attribute (#24292f for light, #ffffff for dark) instead of ImageMagick color inversion for cleaner theme variants - Remove ImageMagick dependency from fetch-icons script --- .../assign_copilot_to_issue.snap | 8 ++-- pkg/github/__toolsnaps__/fork_repository.snap | 8 ++-- .../__toolsnaps__/merge_pull_request.snap | 8 ++-- .../__toolsnaps__/request_copilot_review.snap | 8 ++-- pkg/github/__toolsnaps__/star_repository.snap | 8 ++-- pkg/octicons/icons/apps-dark.png | Bin 245 -> 295 bytes pkg/octicons/icons/apps-light.png | Bin 210 -> 397 bytes pkg/octicons/icons/beaker-dark.png | Bin 328 -> 391 bytes pkg/octicons/icons/beaker-light.png | Bin 298 -> 590 bytes pkg/octicons/icons/bell-dark.png | Bin 329 -> 429 bytes pkg/octicons/icons/bell-light.png | Bin 291 -> 642 bytes pkg/octicons/icons/check-circle-dark.png | Bin 370 -> 590 bytes pkg/octicons/icons/check-circle-light.png | Bin 346 -> 918 bytes pkg/octicons/icons/codescan-dark.png | Bin 415 -> 561 bytes pkg/octicons/icons/codescan-light.png | Bin 398 -> 941 bytes .../icons/comment-discussion-dark.png | Bin 322 -> 359 bytes .../icons/comment-discussion-light.png | Bin 295 -> 488 bytes pkg/octicons/icons/copilot-dark.png | Bin 417 -> 595 bytes pkg/octicons/icons/copilot-light.png | Bin 408 -> 806 bytes pkg/octicons/icons/dependabot-dark.png | Bin 329 -> 345 bytes pkg/octicons/icons/dependabot-light.png | Bin 305 -> 417 bytes pkg/octicons/icons/file-dark.png | Bin 269 -> 312 bytes pkg/octicons/icons/file-light.png | Bin 234 -> 393 bytes pkg/octicons/icons/git-branch-dark.png | Bin 338 -> 476 bytes pkg/octicons/icons/git-branch-light.png | Bin 300 -> 728 bytes pkg/octicons/icons/git-merge-dark.png | Bin 334 -> 471 bytes pkg/octicons/icons/git-merge-light.png | Bin 285 -> 707 bytes pkg/octicons/icons/git-pull-request-dark.png | Bin 323 -> 490 bytes pkg/octicons/icons/git-pull-request-light.png | Bin 292 -> 780 bytes pkg/octicons/icons/issue-opened-dark.png | Bin 363 -> 527 bytes pkg/octicons/icons/issue-opened-light.png | Bin 335 -> 804 bytes pkg/octicons/icons/logo-gist-dark.png | Bin 480 -> 747 bytes pkg/octicons/icons/logo-gist-light.png | Bin 445 -> 1059 bytes pkg/octicons/icons/mark-github-dark.png | Bin 393 -> 571 bytes pkg/octicons/icons/mark-github-light.png | Bin 371 -> 886 bytes pkg/octicons/icons/organization-dark.png | Bin 296 -> 377 bytes pkg/octicons/icons/organization-light.png | Bin 262 -> 499 bytes pkg/octicons/icons/people-dark.png | Bin 353 -> 550 bytes pkg/octicons/icons/people-light.png | Bin 305 -> 933 bytes pkg/octicons/icons/person-dark.png | Bin 324 -> 435 bytes pkg/octicons/icons/person-light.png | Bin 287 -> 660 bytes pkg/octicons/icons/project-dark.png | Bin 273 -> 281 bytes pkg/octicons/icons/project-light.png | Bin 239 -> 338 bytes pkg/octicons/icons/repo-dark.png | Bin 288 -> 323 bytes pkg/octicons/icons/repo-forked-dark.png | Bin 353 -> 492 bytes pkg/octicons/icons/repo-forked-light.png | Bin 312 -> 771 bytes pkg/octicons/icons/repo-light.png | Bin 248 -> 409 bytes pkg/octicons/icons/shield-dark.png | Bin 401 -> 501 bytes pkg/octicons/icons/shield-light.png | Bin 364 -> 766 bytes pkg/octicons/icons/shield-lock-dark.png | Bin 402 -> 536 bytes pkg/octicons/icons/shield-lock-light.png | Bin 366 -> 814 bytes pkg/octicons/icons/star-dark.png | Bin 383 -> 509 bytes pkg/octicons/icons/star-fill-dark.png | Bin 329 -> 375 bytes pkg/octicons/icons/star-fill-light.png | Bin 280 -> 614 bytes pkg/octicons/icons/star-light.png | Bin 345 -> 785 bytes pkg/octicons/icons/tag-dark.png | Bin 333 -> 329 bytes pkg/octicons/icons/tag-light.png | Bin 288 -> 461 bytes pkg/octicons/icons/tools-dark.png | Bin 383 -> 521 bytes pkg/octicons/icons/tools-light.png | Bin 364 -> 809 bytes pkg/octicons/icons/workflow-dark.png | Bin 291 -> 375 bytes pkg/octicons/icons/workflow-light.png | Bin 249 -> 500 bytes pkg/octicons/octicons.go | 6 +-- pkg/octicons/octicons_test.go | 4 +- script/fetch-icons | 38 +++++++++--------- 64 files changed, 43 insertions(+), 45 deletions(-) diff --git a/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap b/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap index 3fe4c8e59..aff4aa597 100644 --- a/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap +++ b/pkg/github/__toolsnaps__/assign_copilot_to_issue.snap @@ -29,18 +29,18 @@ "name": "assign_copilot_to_issue", "icons": [ { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABTUlEQVQ4ja3TP2tUURAF8N8+JEtA1CKCuCAGtFJIrLZJmbBgUkax8RMICmIv5Cuo/VpoodhJshYpDClSSUIaWVdRBBX7YCKua/Hm4fDYCEIOPM78OXPv3Ln3cYRo4RHeYojPuIt7YQ8j9xBnq6JG8HHs4AzWMMAsOpHvRf4CruILZrBXLXQDIyykjpoR+x12hU7Er0MRwfPBG0lYJLuR7NfB01n0M/hEEi6l4sUUP5lrjoUzCH6BdeUsbmI34l3M41twrnEKr+Jcn4K/45nyZlp4HrERPgb3qm4e+zus+nnrqHKj+LpwUFsArmEr+VtYTn61wH6BiTE7XUI7+W1cHqNrFtIwEj7gXfIHeD9G16d8XdvR0hPlCzwMV/A0tG8wXQ1lEiu4FXYfm8p/AM5hDhfxAw9wH/v1HU7jDlaVdz7EL3zFS9zG1D86/H/8AaLBT77Nh5ITAAAAAElFTkSuQmCC", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAC20lEQVRIidWUS4wMURSGv3O7kWmPEMRrSMzcbl1dpqtmGuOxsCKECCKxEBusSJhIWEhsWLFAbC1sWFiISBARCyQ2kzSZGaMxHokgXvGIiMH0PRZjpJqqHpb+TeX+59z//H/q5sD/DqlX9H1/zFeX2qzIKoFWYDKgwBtUymL0UkNaT3V3d3/+5wG2EGxB9TDIxGFMvhVhb9/drpN/NaDJC7MGdwJk6TDCv0Gvq0lve9R762GUNdFDLleaZNBrICGq+4yhvf9TJtP/KZNB2PrLlbBliBfRhajuAwnFVa/n8/nkxFkv3GO9oJrzgwVxdesV71ov6I2r5fxggfWCatYL9yYmUJgLPH7Q29WZ4OED6Me4wuAdeQK6MMqna9t0GuibBHFAmgZ9JMG9BhkXZWoSCDSATIq7aguBD0wBplq/tZBgYDIwKnZAs99mFRYD9vd/YK0dpcqhobM6d9haWyOULRTbAauwuNlvsxHTYP3iBnVyXGAa8BIYC3oVeAKioCtAPEE7FCOgR0ErIJdBBZgNskzh40+NF6K6s+9e91lp9osrxMnFoTSmSmPVsF+E5cB0YEDgtoMjjypd5wCy+WC9GnajhEAa4bkqV9LOHKwa9/yneYeyUqwX3AdyQ5EeVrrqro/hYL0g+ggemKh4HGbPmVu0+fB8U76lpR6XgJwZpoGUpNYiusZg1tXjkmCAav0OMTXfJC4eVYPqwbot6l4BCPqyLhd7lwMAWC/cYb3gi/UCzRaKOxsbFzVEM1iv2Ebt5v2Dm14qZbJecZf1Ah3UCrcTbbB+awHnjgHLgHeinHYqZ8aPSXWWy+XvcQZLpdKI9/0D7UbZiLIJmABckVSqo+/OrUrNgF+D8q1LEdcBrAJGAJ8ROlGeicorABWdAswE5gOjge8CF8Ad66v03IjqJb75WS0tE0YOmNWqLBGReaAzgIkMLrt3oM9UpSzCzW9pd+FpT8/7JK3/Gz8Ao5X6wtwP7N4AAAAASUVORK5CYII=", "mimeType": "image/png", "sizes": [ - "16x16" + "24x24" ], "theme": "light" }, { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAd0SU1FB+kMDxY4IrpYP2AAAAEbSURBVCjPhZG/K4QBGMc/75tcV8JAXa7k6kwUJovxpDAii79AUbIr/wL2MzCQTZzBQIabRBadl+iKyy4/cj6GO29n4Xmm5/P9Pj1PzxPI3xECkGaDa6qUWWKZMlWuWacLIBBauCTFIRGDjAEFLskyziMDvCDOqqMiJtQvEyKOqTMSAj3AacPAAIATIFNDH0ArAJNAwAQAbTWlCYiAPY5JMccVkCdHhVxdsd0j9UF9dse0aXd9Vu/Vgm24qX6JgTRkIKrm8b1uwGmLIhadkrrhLaQ5PlofwwAM0x+zREgUF3fcABBxG7MSZr1Qtxz8tcOQ2+q5mUBIsso8SUqcUQa6GaGXV9ZY4e2no9NFD6xY9dMn912wo6YE/737G+cbs16mFGdfAAAAAElFTkSuQmCC", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACCElEQVRIid2UPWsUYRSFn3dxWWJUkESiBgslFokfhehGiGClBBQx4h9IGlEh2ijYxh+gxEL/hIWwhYpF8KNZsFRJYdJEiUbjCkqisj4W+y6Mk5nd1U4PDMOce+45L3fmDvzXUDeo59WK+kb9rn5TF9R76jm1+2/NJ9QPtseSOv4nxrvVmQ6M05hRB9qZ98ZR1NRralntitdEwmw8wQ9HbS329rQKuKLW1XJO/aX6IqdWjr1Xk/y6lG4vMBdCqOacoZZ3uBBCVZ0HDrcK2AYs5ZkAuwBb1N8Dm5JEISXoAnqzOtU9QB+wVR3KCdgClDIr6kCc4c/0O1BLNnahiYpaSmmGY62e/JpCLJ4FpmmMaBHYCDwC5mmMZBQYBC7HnhvAK+B+fN4JHAM+R4+3wGQI4S7qaExtol+9o86pq+oX9Yk6ljjtGfVprK2qr9Xb6vaET109jjqb3Jac2XaM1PLNpok1Aep+G/+dfa24nADTX1EWTgOngLE2XCYKQL0DTfKex2WhXgCutxG9i/fFNlwWpgBQL6orcWyTaldToRbUA2pow61XL0WPFfXCb1HqkPowCj6q0+qIWsw7nlpUj6i31OXY+0AdbGpCRtNRGgt1AigCX4EqsJAYTR+wAzgEdAM/gApwM4TwOOm3JiARtBk4CYwAB4F+oIfGZi/HwOfAM6ASQviU5/Vv4xcBzmW2eT1nrQAAAABJRU5ErkJggg==", "mimeType": "image/png", "sizes": [ - "16x16" + "24x24" ], "theme": "dark" } diff --git a/pkg/github/__toolsnaps__/fork_repository.snap b/pkg/github/__toolsnaps__/fork_repository.snap index a44d89e0a..ad48688b1 100644 --- a/pkg/github/__toolsnaps__/fork_repository.snap +++ b/pkg/github/__toolsnaps__/fork_repository.snap @@ -27,18 +27,18 @@ "name": "fork_repository", "icons": [ { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAA7UlEQVQ4ja3RwS5DURAG4K9leZdiResRBI/CgvAInqM79QDdS5q+g6WNWKAvQIhYaIhloxady3Gdi5v4k0nOmf+ff2bO4R+xhUs8o49WwrVxjJfQbOYMrnGLIWbYTridyA1Dc5U6l1jFGXpxX0m48twLTcp9oB9dZnhCN+HWMEn4o5xBG4MQdDJ8J7iB5H3SFd4wjnORMShz4zDKolsZtRqT6nQt39Ex/4Fl7EbuBI8Y4aauew6nEbVY/IErsGQ+eoHXJp0XcOFz93NfH/xXbEThYcQM6zlh3Qr3mGIv7lM8NJkADsLoDvtNi/+Md68dOylWb7mlAAAAAElFTkSuQmCC", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACuElEQVRIibWTTUhUYRiFn/fOdYyoydQxk4LEGzN3RudaLYL+qRaBQYsIItoHCW37ISNbRwUFLWoRZBEt+4EIooKoTdZQ6TWaNIgouzJkuGhG731b6JTojDNBntX3ne+c97zfH8wzZCbREm9bZ4hsQvkeDvl3+/r6xuYqEIvFFgdSvRuDqCrPMu6bVyUDrITTjdI1jR8KBbrj/fs3Q8WLp5p9Qx4BzVOUInIm058+XdAY0ztH6RLhSpAza1RlI2jENzhfqntfjAugEdTYMFEtS0GvonrKslNrZwWIhDYDMh6Wo4ODvaMfB9LPFaMHZGvJ8xHdAlzPDLx+8Smd/pE39SggAptnB2gwDBD6ReJvhSCpMFyq/uSa/NFX5UMJgGCaxywMwiH/bi4wh0SCOy1x5waiCUF2gnSW3AByEfSSZTsPVXFF9CDC4ALx7xU0ocLA87x8tG7ZHRUShsheVMKInMy46culArIj317WRpd7KB2GsAl4bKoccN2330t5ALBsJ7ASTvecoun6hNNt2U5QbM0oRip8E6Wt0gCUFPC12FKoGFnX0BgBDtVGG3/W1qzqz2a/5IrpLGt9pLahvhPhCKrnsiPDT2dqZv1kgGQyGc4FZg+wr8I93F6y0DzY29s7XlHAnw7j7dswgg2oRCYZPTBluzk51VEwXmQG0k8qbGRuWHbqiWWn/qlY0Uv+n5j3gKKvaCaSyeSimrqms4hsB4kurW9c0bSs/pnneflyXrOcACCn5jWEPSr0AAgczvlVTVT+ykojFlvTZNmOWvHU8QJnJVInLNtR2163vJy/7B0EpjYAqBhugVMVF8A3goZy/rJHFGa8P4fpCXosHm9PqwbiwzHAqyLvlvPP+dEKWG23dyh6C1g0RY0Jsv+Dm77/XwIAWlpbVzJh7gLAnHjw8d27z5V65xW/AVGM6Ekx9nZCAAAAAElFTkSuQmCC", "mimeType": "image/png", "sizes": [ - "16x16" + "24x24" ], "theme": "light" }, { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAd0SU1FB+kMDxY4JSQ8qsMAAADbSURBVCjPhZExToJBEEbf/lL+JaHSH49glAtwByw0cgTOQScegN6EeAdLGmMBcgGJxFhAMJbEZ+HCrsbITLLJvJ1832QmyP9RANBiwpoBIbIb3plwBoCIT84dqR0Rz9WRc6diVDhiTB84hPj2GcdKxIGqS5siHrtS9VqMDYVDtZKYlTo0JItPZkC5G70EZpgssBllt7Ha6oXdHio6NLgAbnnjjudvHH4t6h5o56D247ukjpR8ZMyUBz6q+mCRaN5wqvbsqSeJ5hYLNlwCG17/tsCuC1+8ylnYd+4vzDGuPOWJUq8AAAAASUVORK5CYII=", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABoUlEQVRIibWUPS+EQRSFz0hsxaIgIZHYllDYiiiUEn6Bn0Dho6Nhf4GPjkYn8ZEgGqFRSNBoVTQKdhEROsk+mrt2svvu7Gutk7yZzJlz77nzztyR/hmulADSkkYk5SQdO+c+QwmAZkkTktolXTjnbkLiDJCniHsgFdCnTFNAHliuJE6bYANoAYaBF+AwYHBkmiGgFdi0HINR4lmrotXjVoG3gMEbsOLN2yzHTIFr8PRZG3s9rs/jo5At0fd6fFk1TfY/X4A14MyqmQrsYNo0pxbzCtwBTZUCUsAh8GHCKaDspnl6ZyZ3FnMA9AR2/BOYBzJVhUV9BshHrTVEkZKeJPXHNZA0IOkxttrrhzkgGdAlgXnTLv3GIAHsEh87QGNUrooHaEajkoYlFXYxaeO2je+SLp1z57Grr2J4DvwqWaVDrhv+3SAWrMvXgWcgZ10b3a01GuwDX8CWfV/AXr2Sd9lVXPC4ReM6q8XHOYMOG2897rZkrXZY0+WAK6DHHsRr4xJ/NjCTcXstC/gAxuPEBju5xKRb0phNT5xzD7UUW3d8A4p92DZKdSwEAAAAAElFTkSuQmCC", "mimeType": "image/png", "sizes": [ - "16x16" + "24x24" ], "theme": "dark" } diff --git a/pkg/github/__toolsnaps__/merge_pull_request.snap b/pkg/github/__toolsnaps__/merge_pull_request.snap index 57526fca6..2801b6a53 100644 --- a/pkg/github/__toolsnaps__/merge_pull_request.snap +++ b/pkg/github/__toolsnaps__/merge_pull_request.snap @@ -45,18 +45,18 @@ "name": "merge_pull_request", "icons": [ { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAA0klEQVQ4jbXRPVICQRCG4QcCr7FXkMLI2MhQLwIxiQkpYEYV5QHUyMAzGFtwA6oIDPjxAK7B9hZT6x9j6ZdM9Uz329Nf84c6wRyvGKOdC5hjiXuUuDikKO1S4AnDJM7SODqXWP8G0MZNAB5zimq9qTyAc0xw1Mi9xhYLdD8DXsUPJnGuMMMA07i7i0bP3wHgDA94sfemRCcg258ATRXYJKBRMyE18asNFOjjEq3mYz13GZ2y17jDLY4D0jukKF3jEqcqx+s4S13VanYqgz7M+C96B6pDN7hpxxNqAAAAAElFTkSuQmCC", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACeElEQVRIibWVTUhUYRSGn/e74+iiQih1F9Vcmj9sptylUVBYkO4jcNeuJBdFKxe1CYQokGrRKjCEdtmqwEVmtqomQWeiUdc2EBUtUufe0yLHn1KLGXtX5zvn4zz3vd8f/Gfp90Qs0drmpA6MT1EveDo1NfV92wB+KnMdo39Nfs4L7eSHD5Nz1QJcJYglWtsw+iUehAuRRjO1g+0KHLerbb4OIHnHAC1FdW129s3XmUJuwnBDoOPbA7BwHsD7QWq1HKYN5msBRCpB1AueLoSROSkciSUyj5ClhE6BLtYC8CpBqVRabNrdMmIiJdQjuUbQ1WI+d78WwIbykxnzU9np7ejlNq2YxQ4ebNtTKyCyWcEgYl55EDj/a7ihFEtkLkr0As2YxjwL+9aem00dCEYNzvnJzLDvH27aaM5y80HEnKGHKGwPnEbT6fSOvzpAmrDQnkncpC7siiUzz2QqIPu25iOuGBorTufO/AJmH0v2ajHwuoHhrQHATOH9rQPJ7IjDLgs6kZ0F6it1AzArVcZLdUE+WnYgmv/uYFmz+dxH4NJGNT+RfYLCE7F4tn0pGkxHy94AmBm8/GfAVvIs7AukUTkbj5YdYIbZ9WJh8m1lzrrbNB4/tD+QuyPsdCibF26gmM/dY/NdRDqd3rEYeN04mswYL+ZXm68DxOPxnWXXMClsp+GGhCWBTtClYj53t1qXK78oVH2XYB/mHZ0pvHsN4Cczzw3rBaoGrJ6D5ZUvN1i+kjI0LWiptjmscbC88hZZCAf2trZeq1v0UsJ6wF7UAlhxUMxPvkW6AboQLbvPcjaO+BIx11cL4I9H308eOiLRQUhpOx79/66fNKzrOCYNDm0AAAAASUVORK5CYII=", "mimeType": "image/png", "sizes": [ - "16x16" + "24x24" ], "theme": "light" }, { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAd0SU1FB+kMDxY4I81fD/YAAADISURBVCjPhZE9bsJAEIU/o4hboL2CI6ioqSg5SXo3adKC00VCHACQIqXgDKkRuYCzUooU/B0gXwrbBViGN8VotTPvzZtJ5DY6AAzYcWZWvS4h4s7oWp3IdZQ9gU9egNDGMFN1b2gylKnjQt00v2uJPyIwJqdbjf7KkS/6tQQ+q7n649zMN3VldOtFAY788NcSj648XhfUETyoOpWHSrMHBIrKWkHKhG/e6xlyVQ/tNk8uTdWnNpuRIRkQ2zbZd+vJqUmTIbl37n/ducqf5eIFHgAAAABJRU5ErkJggg==", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABjElEQVRIibWVPS/DURTGnysSC0HiZdWVrZ28JDaLT8BHaBsMdjqZJDXiAzC2LF5mX6GtATGiIsGARH+Gnj9X8a/kf3uWe3Py3Oc559xz75E6bK7VAWQkzUi6lXTonHsOpgYUgAZfdgmkQpFnjHwb6AemgDpQCiWwYlEPeL4i8JCEt8vb39g67vkmPH8yA3qt5nVgCzi1jLJBBEwkBZSAdxPKAj86LYQQQCU4cYvAKzDUSYF3YC+uRIAD8sA58ACU//VuTODE1n1g+A9c3jBH1tJ1a5TeCPNrdACSCpKeJG1IepN0LKkm6dGDrkqqOOdm7dyUpDNJi865PUnqjsvEObcJHEhaljQnaV5STwvszttXbR2J441KtB4LauLKVpZpYBDYte8mHUogZTWPrAGstTtQBl6AayDX7qHZD7AALMVGDvQBV5ZyETi2qHLtMvmXWRQAk57vBKgl4fV/0+jmq56vImk0icCnAWm7pB3riGngnlADx0TW+T4yL4CxJJy/Df20mkP/TqGHfifsA7INs3X5i3+yAAAAAElFTkSuQmCC", "mimeType": "image/png", "sizes": [ - "16x16" + "24x24" ], "theme": "dark" } diff --git a/pkg/github/__toolsnaps__/request_copilot_review.snap b/pkg/github/__toolsnaps__/request_copilot_review.snap index 11a9cfc57..06828776c 100644 --- a/pkg/github/__toolsnaps__/request_copilot_review.snap +++ b/pkg/github/__toolsnaps__/request_copilot_review.snap @@ -28,18 +28,18 @@ "name": "request_copilot_review", "icons": [ { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAABTUlEQVQ4ja3TP2tUURAF8N8+JEtA1CKCuCAGtFJIrLZJmbBgUkax8RMICmIv5Cuo/VpoodhJshYpDClSSUIaWVdRBBX7YCKua/Hm4fDYCEIOPM78OXPv3Ln3cYRo4RHeYojPuIt7YQ8j9xBnq6JG8HHs4AzWMMAsOpHvRf4CruILZrBXLXQDIyykjpoR+x12hU7Er0MRwfPBG0lYJLuR7NfB01n0M/hEEi6l4sUUP5lrjoUzCH6BdeUsbmI34l3M41twrnEKr+Jcn4K/45nyZlp4HrERPgb3qm4e+zus+nnrqHKj+LpwUFsArmEr+VtYTn61wH6BiTE7XUI7+W1cHqNrFtIwEj7gXfIHeD9G16d8XdvR0hPlCzwMV/A0tG8wXQ1lEiu4FXYfm8p/AM5hDhfxAw9wH/v1HU7jDlaVdz7EL3zFS9zG1D86/H/8AaLBT77Nh5ITAAAAAElFTkSuQmCC", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAC20lEQVRIidWUS4wMURSGv3O7kWmPEMRrSMzcbl1dpqtmGuOxsCKECCKxEBusSJhIWEhsWLFAbC1sWFiISBARCyQ2kzSZGaMxHokgXvGIiMH0PRZjpJqqHpb+TeX+59z//H/q5sD/DqlX9H1/zFeX2qzIKoFWYDKgwBtUymL0UkNaT3V3d3/+5wG2EGxB9TDIxGFMvhVhb9/drpN/NaDJC7MGdwJk6TDCv0Gvq0lve9R762GUNdFDLleaZNBrICGq+4yhvf9TJtP/KZNB2PrLlbBliBfRhajuAwnFVa/n8/nkxFkv3GO9oJrzgwVxdesV71ov6I2r5fxggfWCatYL9yYmUJgLPH7Q29WZ4OED6Me4wuAdeQK6MMqna9t0GuibBHFAmgZ9JMG9BhkXZWoSCDSATIq7aguBD0wBplq/tZBgYDIwKnZAs99mFRYD9vd/YK0dpcqhobM6d9haWyOULRTbAauwuNlvsxHTYP3iBnVyXGAa8BIYC3oVeAKioCtAPEE7FCOgR0ErIJdBBZgNskzh40+NF6K6s+9e91lp9osrxMnFoTSmSmPVsF+E5cB0YEDgtoMjjypd5wCy+WC9GnajhEAa4bkqV9LOHKwa9/yneYeyUqwX3AdyQ5EeVrrqro/hYL0g+ggemKh4HGbPmVu0+fB8U76lpR6XgJwZpoGUpNYiusZg1tXjkmCAav0OMTXfJC4eVYPqwbot6l4BCPqyLhd7lwMAWC/cYb3gi/UCzRaKOxsbFzVEM1iv2Ebt5v2Dm14qZbJecZf1Ah3UCrcTbbB+awHnjgHLgHeinHYqZ8aPSXWWy+XvcQZLpdKI9/0D7UbZiLIJmABckVSqo+/OrUrNgF+D8q1LEdcBrAJGAJ8ROlGeicorABWdAswE5gOjge8CF8Ad66v03IjqJb75WS0tE0YOmNWqLBGReaAzgIkMLrt3oM9UpSzCzW9pd+FpT8/7JK3/Gz8Ao5X6wtwP7N4AAAAASUVORK5CYII=", "mimeType": "image/png", "sizes": [ - "16x16" + "24x24" ], "theme": "light" }, { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAd0SU1FB+kMDxY4IrpYP2AAAAEbSURBVCjPhZG/K4QBGMc/75tcV8JAXa7k6kwUJovxpDAii79AUbIr/wL2MzCQTZzBQIabRBadl+iKyy4/cj6GO29n4Xmm5/P9Pj1PzxPI3xECkGaDa6qUWWKZMlWuWacLIBBauCTFIRGDjAEFLskyziMDvCDOqqMiJtQvEyKOqTMSAj3AacPAAIATIFNDH0ArAJNAwAQAbTWlCYiAPY5JMccVkCdHhVxdsd0j9UF9dse0aXd9Vu/Vgm24qX6JgTRkIKrm8b1uwGmLIhadkrrhLaQ5PlofwwAM0x+zREgUF3fcABBxG7MSZr1Qtxz8tcOQ2+q5mUBIsso8SUqcUQa6GaGXV9ZY4e2no9NFD6xY9dMn912wo6YE/737G+cbs16mFGdfAAAAAElFTkSuQmCC", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACCElEQVRIid2UPWsUYRSFn3dxWWJUkESiBgslFokfhehGiGClBBQx4h9IGlEh2ijYxh+gxEL/hIWwhYpF8KNZsFRJYdJEiUbjCkqisj4W+y6Mk5nd1U4PDMOce+45L3fmDvzXUDeo59WK+kb9rn5TF9R76jm1+2/NJ9QPtseSOv4nxrvVmQ6M05hRB9qZ98ZR1NRralntitdEwmw8wQ9HbS329rQKuKLW1XJO/aX6IqdWjr1Xk/y6lG4vMBdCqOacoZZ3uBBCVZ0HDrcK2AYs5ZkAuwBb1N8Dm5JEISXoAnqzOtU9QB+wVR3KCdgClDIr6kCc4c/0O1BLNnahiYpaSmmGY62e/JpCLJ4FpmmMaBHYCDwC5mmMZBQYBC7HnhvAK+B+fN4JHAM+R4+3wGQI4S7qaExtol+9o86pq+oX9Yk6ljjtGfVprK2qr9Xb6vaET109jjqb3Jac2XaM1PLNpok1Aep+G/+dfa24nADTX1EWTgOngLE2XCYKQL0DTfKex2WhXgCutxG9i/fFNlwWpgBQL6orcWyTaldToRbUA2pow61XL0WPFfXCb1HqkPowCj6q0+qIWsw7nlpUj6i31OXY+0AdbGpCRtNRGgt1AigCX4EqsJAYTR+wAzgEdAM/gApwM4TwOOm3JiARtBk4CYwAB4F+oIfGZi/HwOfAM6ASQviU5/Vv4xcBzmW2eT1nrQAAAABJRU5ErkJggg==", "mimeType": "image/png", "sizes": [ - "16x16" + "24x24" ], "theme": "dark" } diff --git a/pkg/github/__toolsnaps__/star_repository.snap b/pkg/github/__toolsnaps__/star_repository.snap index 39bbced3c..165a011bd 100644 --- a/pkg/github/__toolsnaps__/star_repository.snap +++ b/pkg/github/__toolsnaps__/star_repository.snap @@ -23,18 +23,18 @@ "name": "star_repository", "icons": [ { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAzUlEQVQ4ja3PT0pCURTH8Q8qjhyHZqCQ8IgMaSSUOWkhbsGxy9AVNGwpzXIuEW7AUZYQ1sAbXMSu70U/OHD+fs85ZWmN0cfTkb6DOsMHNmj9BTDDV7Bp0eE61hHgHc1DjeXIP8E17jHBRVSrhLiKmt1rbz/FIVbRtry2wl0Jy3BuUa3DLGjjpcD2JTr7xBYWOYZfcf7bWbc5AIN4oLQHOE1+vVMjBejmAFzGQSUB+MRD8EdR71WKPscWj8iifBZyWzynADfoJeq90PN/+gYHuUeVIAMmAwAAAABJRU5ErkJggg==", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACG0lEQVRIidWVMWgTYRiGn+/+a21EClGrERRiTWLShrbiUETErDq7u3QRF0WhoKN06uYgKEVx1lGQLjo4OTUJ2FzSpBrEQiCkGYPm7nMwlZBe2rvaxXf6eb//fd//u/+7O0MIJDJz905MnJpvNRufg2oksHli5iwjUgXExUp9La3Vg+isoAGMyiJwBBi11XsQVBaog0zm8plfdGtApEd1LJdEpVL4sZ82UAc/cRf7zAHGPKMPg2j37eB8NnvauGYTODpQ6hjPulAur23tpTd7FePx+JhtIkvAVZ+yraJj48ciH9rtdneYhwCk03NxV5hWNAWSVLykIEngHPs/Rg/4ruiGYG2AbghSMcoXx8l/k3R6Lt4V3STEyAaE2iqTluPk66Arh2wO6Irj5OsGoNVsvIuejEVFmD8Ua+V5zSneAfTvJW83G6vHJ2LjwJV/tH9Wc4p3AYWBKWo1G6vRiZgRuH4ga3S5Vire7+d2jel2s/HxICEKT2ql4qNB3ncEbU9fhTEHGFF56cf7BrhCNmyAi/pqhr1EoQN0iGZIgEyHDUDw1dghNneB1731bR9tsA5yuZwNZPooBd4YT7PVUmGhWios2CpJEV7w5zu0g0xPO3DWAUymZ1OWUO6V3yP6uLpeWPM7XWJq9hIqS6A3ADzl4qZTqPTv2ZUYMd2tjms/NZa+rawXPvkZ76AXfDM1NXPN9eRWxHT3/Df8n/gNrfGxihYBZk0AAAAASUVORK5CYII=", "mimeType": "image/png", "sizes": [ - "16x16" + "24x24" ], "theme": "light" }, { - "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAd0SU1FB+kMDxY4Jr01+3kAAADDSURBVCjPfZE9TsNAEEZfLBdwgYg/KZEguACU3gFukTpX4CpAmYrS4jKkDQghlzTuTJBQHoVjxSvH+baY1TdvNTM7PQn0gDwGjs1z5spfB00vBJ5VfeoCjixV/fF068YA9LlkxJRDAA6Y88o7S74B7y3sUuFdRE5Jl0pyxKGfO9/nXtRNDvxopb88b04xaQG3VSbaVDtp1T+uQg1ct4CrKsQB8McLMCMGbsJdLFybmYiYmLn2Lfzq1HGwlbFpdevJfv0Diova5gStEDYAAAAASUVORK5CYII=", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABLElEQVRIidWVTUrDQBiG3ylddNG9+IdRMC7qpgfoWTyCnqFLF/62UMGNWw/gTdwoiMUzaCtoHxeZ4BQn6SQdEV8IZPG9zzMzCYlUIcARcFilUwW+AUyBd2DrNwSXfOciNnwVeHMEE2A9puCMnzmNBV8BXj2CCbC2LLwFDDzwPAOgVcYwFpRI6khKJe0616akxoJ1zCS9SHp0rgdJ98aYZ2PhT7ksYpC005A0lnQdGS7LHGcqMMB5yVlXzQiYP1orOYkAHwLFxw30l4AfBx1eTUk/+OkA2zUEiY9V9I7vB69mQefPBJ0aAm+nWWH4Q9KNvT/wdMN2DTTJ/lx5ZsAtsOfMJMAV8OnMTYGiBc8JUqd0B3RLZrt2Jk8aImiTfTZ6QVvOOj3baYd2/k++AC+3Yx0GcXS0AAAAAElFTkSuQmCC", "mimeType": "image/png", "sizes": [ - "16x16" + "24x24" ], "theme": "dark" } diff --git a/pkg/octicons/icons/apps-dark.png b/pkg/octicons/icons/apps-dark.png index 4af9802a0bc620336e6fcff18d5127b54d202ad9..607468c85c9f59919ed94ec2942511cff46c1508 100644 GIT binary patch literal 295 zcmV+?0oeYDP)8eU{mEI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJ0<-ojK zK%sn37sn8d^LH;AavgFIV7;*Yu-G%RX;G1`?`3p?I_I`;yx_D+OwYqipxVBs?fO}R zl@b1I>d^(pIw4b%e=f^c+2E}Haznm~@`p9N&$xVUT=DBoiTSv~JN}4IP~$zvZ$?(z nf6bA6SE~0_JbhXG`#R=jTxqkF3{NfrTFv0;>gTe~DWM4fcj;3c diff --git a/pkg/octicons/icons/apps-light.png b/pkg/octicons/icons/apps-light.png index 33a32b455dbccf4e7ac30d627b65f29fa196fc8e..c6328612b70a28faf8dd0862bf09065552392114 100644 GIT binary patch delta 388 zcmV-~0ek+^0gVG8iBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*r>C zL_t(YiS3h5O2c3fN8co0|0tz&?ba-$)>d%QljvSgpLVC>ky3Cn)3cl-7qE+g>j ztv!@8pfcedAac-qyuX-*%LqKLe_f>zyaIRX=&5VnF+k)*Ml6RQJFX4ZqNpa*aNTaV z4`333ny?{IK{Z$VEn=fR-fF`<+WVP9BMz~Kg2`+llyvhTH5c`w|7xJ zC%=AuQQd!j@-JuMasv2VS9QZJ*O3)~$m-BA^pmxlmHTnXYE;s76xDJMnU-5#^74|C iEH61Nne!ztem(%5mSt62=;OZt00008R#wq>77Ht}^IO0000&rk zzI~UHnwffC(wx=fzuW{Ma-2s1K7CK=2kW8cDUS{FSWM2+FL~0|v$6px?RavK9@BG4Uy=@hQ`?82Drwnt7fuGS l3dAKwG(ilk1UB~1@dJ6!e+)>+?l}Me002ovPDHLkV1ml`sLcQX literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJ0<-ojK zK%qmPE{-7@=X?7MvzP)!T+jDxW|=L}?J(;FlZy8VDVE$#OyvnL`L@hby>TNWId!_< z1&1nYM;2G!L!JxkN~b7(Klr@(f9?Ny9-lXnVTxBIT%y175@^0W@! zy*mv5r+MW4d17~gW#5Amv&|Fq*S&3jHcvV}U$K3iPV0fm-tKPG9S*y%>UMFOnE#B& z=!d*ba9ZPxUE7sruH0cR+H>dT&T6+eyKKY$1SmY6u+rnllj-J1%G3E3mxuM+KY7LP Y6m%%-+x~oipl=vFUHx3vIVCg!0Im>%ApigX diff --git a/pkg/octicons/icons/beaker-light.png b/pkg/octicons/icons/beaker-light.png index 8d1f674d2b8cda7c9fee3159f3b24d2ef9124d0c..576d170bde9abfdddc86b245fd3700391f39d579 100644 GIT binary patch delta 583 zcmV-N0=WIE0?q^>iBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*yzZ zL_t(YiQSXUYZFlv#eerrBKFIbE`%1;PSVauIw^t@6c;M)LUXWn&VLTozu=t@1ybM8Iooq6-%Ux&mA`zA9P zBjyD#*u|r!=%M#3rNzy}MBLW!e>VA03$=hs0pU5y{Dz|)K{j(2Fdk2%6E|p5_eKi;usa*latYKy|^WQaQfZgjq&E>utf4J`SE|Ru_ z@T9W5a4v2cVB8BH37iZ~n5r%t2h6IQUc0Gw^r{V2`es1N z%bozqsmk@WVzJh5K($(}i<+Cj!L&Dhye+_rP6DXo%=K&DY#}lSV9|7gYhJQi`&7h4 z#)c1Ff9f$RQD5$&4r)&Ukz$`U>DC$7&t6c~TLOEw(mjGUBiM){f{l8B;1TStW8(?*1i3}5(x$Vq(I%Z$x`+wb+XaH4 zXe1Deoe5!gcC!{f_!;KC|2=-@AN~O&EK6#XZ*C+4-f@8^^uxJ@1Ki-b&J;^@*6y9a z6|h|=tqQ4tW<`HNO9fnqbGXJ0c5_-O4)KBegm#Bd990E8%C@kd&~`DyK(>_vE|u>; zU+rj$NjsR}4G&c#;v9Q8!8DRR%yGKGEcDESXEnt)x;4xZxA=-?c$IzY9u^zSOU<bA~- zO<=s6;3TjHG=XPe4_L9a54>1!6-dMZ?C_;^V9=*O1ZO*-nw2!_oJ+UUOZGGAR&}5hW!sB3 znDNv`thUhQZY5w0XaEO5#=;M+mhBo~ka-JisR7J|nRUUIZ%9_slwBS<=V~$TwfFi2 Xc`lq4S`!SR00000NkvXXu0mjf-%Yv4 literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJ0<-ojK zK%v8)E{-7@=X?7Nvz!72T>XzUxUS)OxrxPGNc7;Tvn;C}rU~fslts2iMekt#+O3qN zyh3nI-_gl`{<|2I&w6<8uz~o`*}I(iao4S_3P}g^w@NWP zt53I32>xxj;k)){-m*Kby6zW*vo}Qr@_6@Idoe2Cm&jn)%;BM@*P(j7ueN928SA3Q z-WeA^r&x9go}TySWb+2qhtH4I`^Hte0)+je0)ho0iBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*!m2 zL_t(YiQSdYOH@%5$3N%2F$Wjv6q-R6G0%L@AMZ{50WnZ3sYOVupn^z5sEvyv2&5n~ zA!=p0%60p&QgCmg8I5BZ%|fD@NTsNOnR%y0PK=EDo}imP%X827e7Ichy|BYbP=nR# zwE;b-o&Y(tTF!_vuBP#5;q7#4f3v)~(Lyqrj6`Z`2T?|VHsF=0@m!Ee5JBid_3EC6 z#@*ku$HyV1>&=O5Bv|~s^aSCYA`gqz^k-&XFPE<$?C6M9<&A!UKFfL6urSB@&33W| zt2J@fay+$K-5Wu@&5n1|ay)Ie-LCc4jdfG1y$I=r)a>0L!TY%*cNFFof9VY`fTO66 z0)CJHo)$qy5sqy|P>UEV!NdO|!ZJ{|6~VUg9}1GmWCTE!eApqPS}4zMDp>rw)B#{9 zAHxb%$N+rGuCxUTP_6?%cA5Fnu!3qSJOh6EzF%=M*Stk>$2%i%OOf02sW&ge3bNVk z?^ykQL*PoRzHxTx+n033e-3Qh-YYN!OxM+z_reY@(X_8_K$J;=$8pzfs1Ot+dLM}S z>R*_enhJfuB_<{&3Pt=&K&|AB!BV~K)b%uwGQ{Y#9Itb$f-+K|rz!=?1B7cp-~$)H zFO-4M-Elk7Z8@G=mV4k|t-Za;ay*UOiOWIx4L_U`re7TMO(RE@Q88>;Zns8#k%Bpl zkc+547L*VClL4CT#6=Yy0-~#>oT~JENY9LHivXad#XVdQ<0L>8yiBKOGGVhj${%-F VvaFItWbpt1002ovPDHLkV1h4*D~tdD delta 281 zcmV+!0p|XK1)~BXiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyee*oA? zL_t(Ijh)avN&`_8#qpn_Fojl%olD3@)DW<8Gh!vU1hr7oxe864!X2m)MZ`w%3#?+1 z8+jy?>zD(VfpgCL-}i=kbGvB5H~o9xef2|ufv@vo}nuI3g?mSWPo05 zu4=L>ZgQCc-f^7dr+6!k#ficSZ=Mst6IL_8zf}hqCjF_b1nkE5E&&WCy1!a8diyn& z6TlMsc)>;)bn%T=a(Jv(bi1$+=4)Kxb5{->$ghZ&c!f0dgL2KpX7Z?jd z^amJih@HPcD-i6}PBg^Qs4)>#6s@?o(b%vo81!&C+y{o8oZ{^HX3fk#v**AruV`dc zdw_A^A}|2-r)e2@3p@d4BVx6!0BRR-6PN(@0*k;r@FOJ$fK$LBpa$FnrXu23(~{JF z^|iXDPOHNWw8QF*>uW)+v;tpNtLnL?+5GbxOP?>>22r~*^QwBhRd~UFFnt%)&N9L6 zJeHO-FJYX|v2}nUEI8$kx#S<8&Kb?XR~m{nKR{q=@h zIV#5f1AZa1pC~hS=Af#ogFAo^<+yoOI_y$Z$&p)Yr;^OPrhZoYnu#k}iP>Ev4YVV9 z=4R$w;M@H&JAoU(B(M+o1iS#gr=%A+2^<8fz#ZUzMEq_kKp{{!a4Da%pZ**$7ZKG) coLyai0O5<+004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBDz>VU;qFB>`6pHR4C7F(YsCpVGsr2X}}hI1S^8@F7_JV#{_=ZK=e6K zJ1?ydfF>sP+RLR{_OsYsF2S5)k~wG2ng5><75XyomX_X)_3D0EPTbm9nHfrER&rC# zT5#f3VW72jYe@<(nx)`Q;c`pXxKfyi(6=!-qC*(Torkg2o_UEIZ$jHz3Lox|Cb<#9 zqj~tP0xp~hAz@TWhkkd0Pv1HRbS0=GI)1DV=qh5jWXD&PUE;J{vL~1ReP$-t4PmNq zbwpn)WaUpbJu4*bJ@ZWANuxei(?o9VL6SUJ%Viq7Yld(xnOj(x8|v2mKUOPI(iACO Qy#N3J07*qoM6N<$f?f-eCIA2c diff --git a/pkg/octicons/icons/check-circle-light.png b/pkg/octicons/icons/check-circle-light.png index b555bb3b8e25e12f59777f883d5b36ff98a29766..75916ed24f98bc3c91ad54b1f41f82bf5fc0ea78 100644 GIT binary patch delta 913 zcmV;C18)4<0+t6MiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*;TN zL_t(YiN%${b5m6m#((F&Xv1jRk&Odnq|nzkkC@j&Sx`r3V06dOrn>5ke?(;=ID@-7 z%yc2@%0EDKNz;uRkp+xp7_lU=NgGlcm{N5kZE;9r^4@XLB)*okGz-UXdG0yicfNDq zeFy$y$Zm(RSZse;LkU!e6^RN&e*hGg1#%)xmo0zlQ6}@GC4op}XkS}<>AavH10BE; zqBE%cv00_BtIAsfUBDWmlN;-=Tv=Y8DZNm@w%rIXNfJ1&a81z93c2(z%^I;C_k(buZ*~9F4}~M$Apn`_DNe+bk^q&f^N6|$+>R>*zJ+yFW(&r8?ii}RVgz(Yib{}n(S zMQ-nvysyvg^DT275QO*g`OJghxxkDM#{vQzG|HCm*Kr09^hDjUW}R1!+yIR6{L_VO zYHoXu3M&GKf&!?~EpMW#mD4Knt?js1g5;iMeiRVn`DgO^%zRUee~JJ;K&Td4QI&(i zocr_X@9bm!E-Dvo$Hnsb+B0%pz#zQ4BYABi3cm#%WI>0vXBD!kPe8u_8TX9L?lzWf zI0ei#1Voq?=&~L6#B(CK^hXMlz~f!VQbTt%J_sB}Wg2QDdReN;vWC_Kxdgnwy=XC) zx&T~wLDy_HE1v?Ze_ohm!@=C#+@FX}DkOTGfwOxdY6d&%o&y;X{;|SS)TBPZB6kjhI`lII*MdIm=i#fi=rF zqxC;2G+8*kz5R!LOQ%3i0#mB~MD6)Mhwf;6aC7D|0^G5DXEVC6FuM}WX}U7Iy1K%l zaOXI}MW7RSsK`%({$49OpfCg+237^Rtd+mMEEEdm?OeMq{Ws$A*V-!9h>DINMA6Nq nkFYFC&R0o#VUqO={a^48W71J%5_9#)00000NkvXXu0mjfx-hdZ delta 337 zcmV-X0j~a*2igK5iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyee*q6k zL_t(Ijg8VvP69y~1mJHYZqXySB0TQmUgCXBU~nSQbNJZ#*m?jkF>$YZ6;_BY`X4h4 z1EG>my8o`K{;RuLM-Mrs_>M8fIl49cf9&HDKbYYfLu4_ZVSzCkb>b&1F+j8CfM%F2 z@mMvvij9+PEe86*y(kL3XnU}Of4IO%iqj!o&TK>5Wt`zT<_DNdk-Xq$hZBFpq`(~} z@M*REV;q&%S%^m!(_v`W3|{e$))w)KK{Y}PA5z9m;*|(>m)OFa)y!oaDqUh%dXj7d zxej?~+C^b3eUAPP;?v;fwCmwrwow$rn jh$i@oF_E6FT_yhk;p0-nm!^u600000NkvXXu0mjfEh>|= diff --git a/pkg/octicons/icons/codescan-dark.png b/pkg/octicons/icons/codescan-dark.png index 72cf34da16e95c19bdf80c7181f96685f3e12b8d..7bedddfe4036114e8f919cb99498ddd1a81ea4ff 100644 GIT binary patch literal 561 zcmV-10?z%3P)|WK~zYIwUj+i6j2n0pKGk>K&^m8Lfle5YD*iiu=2ME+WCPSHDYP} z3kEc_7Gh!0uoSk~m>8mk3Y55p$70ST<2ZMBB;h2J&AsP+&wKWK+(gFIS>Oh66_^Ch z1K)u!z-!<|O6g;cUs`Gi+yNc}*MUCp4%h|ufl;6XTmjAkFM*pWrBB0z%HY@3Lv>$W zQb#kmQFU28h;OlN@ZajTI^Hs&akUq`g+ahhWWKGAvHoiQv9_C zQTzD}uH1vmP0n?TRi9`g4>NVrVv{#=fJ-6J^JH()PVg@d0xnv-ioLe~Br-3@b-fK? zAu>5sZ>eJ$+*s87F!1Yx7PC&CR@b6oeRVT7v>U&haeu6Clx3+*+;EW~%)|(9se2X= z;#c*(#RK`zwEVZoNvtCB_%uZxsh>|xplW{r=y9*upKdQ!00000NkvXXu0mjfMSKGM literal 415 zcmV;Q0bu@#P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBDz>VU;qFC8A(JzR4C7V(XmQg0Tcw#dHa4qf{oaz7{L_&gC8JKRyGmA zudxxd76lQaT~J)x^bwWxK}C?=^_jp{Nn>#=-qT15nQAU~<_>csB3f3Q>U&f<(NQ+@ z6p~~jUo)5Me9JH+na@-%)5%qmL`-;4`S`3+SW+376p7LgRZU)D+Jkc~i4`o0cxOb6 z8Wqt-N8;2^g_tq0FAfdNh{Bbw#Jz3tUeCQ*F|DUED|YlH9<7T*EHw8Qa3I$Gm8g7a zbhX1jug0P4M%iRI62~tYuImh+@L9x|aWQU8#4_4-4;O|${MW;jU%o4)CIi2%DPI1v zYKWb>$%skkxU*-|zCOK`vhO$NFXq0*K7a)002ov JPDHLkV1kw4r{e$s diff --git a/pkg/octicons/icons/codescan-light.png b/pkg/octicons/icons/codescan-light.png index 4aa286cdc8516184ec5f0e053694b9020521ce9b..cb3fb7545dfd2f654716e17b0581d4398309c123 100644 GIT binary patch delta 936 zcmV;Z16TZx1FZ)kiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*;>2&)nUP5^BJ-}uO6IiFcM5Fi>)y{hPEfI+$Nu-#nzePLlUnA9^g6h2gyGl)zA z802(0pZV@T0rldSL2p{VjFn2+KlU3x7ITjpTP}m9RLpC)mKUz<3aH7#e|6AOCDi`X zz4`gde#INsolb{B75^HjgYBoi#l>6AehZ+cImYs3>`{sX+?$`TP&H$KsBcdP{gyM} z4uhOTxv-loeSOL2o8No;-B>Wj^Ky3;nHCt2C5GMB35=Wqst?=E#bBZnPtN$3lpBz` zltm|=oC(GrwyK{1zHiJMf2{z~QD82(El%8>0+|4vEf#aP0m_AJ31JFkq7Kd&`(Fn$HCw8h5`|c$umW zdS32sFnK>aJ~((xe|&op;b(6-`+Ca+06w)_k#_4+cRC$oyN ztnz_7YO1exYNN1=3PW(f<}ZqjR=Bn6BI;Hw~-kiLQ%+GM-jxI zQNfkjxVSF58t;tP@xXP6sVaI=!y*oFgBNts!aV8*U=06Ipo2eH!Ec-ee}cwG zKi@~SnTq@n<|2QK@p7^rmAn0ke+o=Qp<~G|lIH@mrHjM(66cZlGMaIJJ`)Ex4Vf?* zGPfh%i+HkRr-OEW;7)27e8Y8cQzhBgVKH+X(v*-!wOp!JV7kxybnv?oFXMkscCph} zt*oF*RgZ!;F1#&C?!n)P_bYmEUhcs{$opB6{1u~d9*sETN8E2_qAqRNTNAz;j0PTX zsBf(sA@dQxyp1%YhNUP{NIiImacRQ}Twx1q(mvb-e}v6AuU9=%lQyg!KRrtmXocr2 jdp#am{lxM>tm5(&e9&1?!FL8q00000NkvXXu0mjfdjY9n diff --git a/pkg/octicons/icons/comment-discussion-dark.png b/pkg/octicons/icons/comment-discussion-dark.png index 862c57bb7f88c4237556430c8a5b486953e3f09c..6b7eeb6ef05bc4a480f4848577f00f7cb4e9c1ee 100644 GIT binary patch literal 359 zcmV-t0hs=YP)q-Ea0w<+?ADDF}5D^PtQS5VPp8lO0)S(Bw z0|Rvpd;s?m@dBV;0Eabq2SC=SpbphlsrsY*eBLmNR_f(1ygxg=7#r#|U(Z|oLXyB* zU2aQW7N{0^2J8cqh`25VKdNWj2sUMtJaLN`v~9Gq)2eulh`XHh2sr1<{_R|rU#vQ< zig_M4YU{GrP;U#7jn3%;rJh;Vd}AjfH|m=@*@-|MJ^?`rbd#jdsMY`g002ovPDHLk FV1k~XncDyW literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZKBT@m&` z#SD8qT^vI+&bLmq&O78F;@U4*`@;FWRnUg+DTQSY&krr@5=kkWsMBZ^YBu4NsZ-v9 z4+@H>CMV^jSa$8aeCGKc>*D9CM(a4&v&i%~++yr(>{{=5Q_?hssNmZg^W_R5b-OFK83Y!BJKcSUh{ z-R&bsukI?}Q?8tLQ8RC?ZPcAC^Q@b7V)eHa-eza5|IZvz(KYYn-m?Ep3-@i<&F^&r P6gCW=u6{1-oD!M<1MquW diff --git a/pkg/octicons/icons/comment-discussion-light.png b/pkg/octicons/icons/comment-discussion-light.png index 8be8cffab6ac760204adf94010a7bfd2bd680330..64ee5f0cabe858375f39d8b5c915f1d571a799bb 100644 GIT binary patch delta 480 zcmV<60U!RS0_X!FiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*v9I zL_t(YiQSaHYZOrwg}*yw)igm%(Jl{?*~FQEpkS9G|ACE=B30@v3}}^K3JO~!y{*K? z-qO}`XNt^%FI~iXwowS=q}dIV?6RB5j)k7?y?gKZc-+H-zbu2^Mj1-LLSfG+T@B48C*@OgTFe_YcHFo)S!f85!v;_jL&yGYL_^#xT-Z=-)7FjJS2 z3*!uUQo8C%med9?*$0`T($%V&+O+|GbUR1D(cnBt+5fTR9@3f%+Jlq_t`0c zYsTw{Mk;MK*=P4l@BhAh1nj`e?8ze=+Ng` zYm&(*^_RSJJw<;cZ5lkB#=NX6OBS>Z8W{U!a~H$Rp WubNJCH`Sp40000~+eo#8r&PdS4+9#F#qH#o;EOQC~F?8m_$N=H1HbY^?d00000NkvXXu0mjfl(u>V diff --git a/pkg/octicons/icons/copilot-dark.png b/pkg/octicons/icons/copilot-dark.png index cce1bfeebe863ff268c1a1fe06b2f4b3d96bd339..2188a1bcaff0eb36512b58687bbab36f27f50d73 100644 GIT binary patch literal 595 zcmV-Z0<8UsP){wKz})tL^A)0j~Q+L`ypQPk9H zYFX`y*F?f>Ji!k~Z7ufpveBKEh13pKOx4>iw z;V$ZEOl_iHy`#>ltLhi^i8_`z?HToHtgWiA)!XX!gil>Pjyjv%mYmskjMVbYrinEH z>V6yloqesioB-2bQ5H@Er+~3GTqX)Yy#r11p2uaOUI4DQ5xtA|#Wq|PrT|bcsw;79 zlWJE}p%&BwYG}i)S1(1674^bzQR9-~z5wsaN35);-fqtNe#%3?az~{g- hpb|p(l;`zt;}-$WWwv=eXRQDL002ovPDHLkV1hlw3L^jj literal 417 zcmV;S0bc%zP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBDz>VU;qFC8%ab#R4C7dk-sa10T{8Tw=!(lOKXN{XJ8x&D*%%~zyttoHKhrNfIW^$F~=2z@~r=!zF53E@A(`u%o5~|GoPg=Nq$LrW9vi00000 LNkvXXu0mjf5T&3~ diff --git a/pkg/octicons/icons/copilot-light.png b/pkg/octicons/icons/copilot-light.png index 2e7135fcf81659b3f5326684089624f8b0cbf80f..4e83af015e0dad5b363c50f9357efaacdc20d4a3 100644 GIT binary patch delta 800 zcmV+*1K<3Z1EvNciBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*)V{ zL_t(YiPe-#j0{l}hQD*Wk!g<*#A`^*+-_Z6rmJQegK@z4yjl4 zeSgeXm)fkzDuGsDGN8a4RLWxXe^NtQPjz>9fBxqIwh(MV^)Sf9VNAXiVQ=5vu9JT? zpveof26qBv=`g~-L9eSxZ+p~x>tU2N(L*j*nq<&xAR(&zjG?{%Qzp~@DU(6i`pcED zWr!Eig{bZW3B^^f=kxjG#91%gW4)l7^MeI(b?X)HS}*90tL6M)f%SrFf7T24CMHmr z3p{?%+tr!i;REQ$xWeEac>=mH%BO4FbQwu2*&DqZIQviV@W8g`?EKpNq>Dp%6Z9IP7m{HJ+` zvQn%U+y`<)ksemM>aLIBV7(yv2p*WIcpPTWnOn5^@O)FgrKKL1e}J4Brh$~C)*`yb zVAj>+l3;*p{SGlT-y|*`RfFomx-IHn0SNlCE*E>30{~br++n@oi}eD{7K%F?8y7W1 zGgz0G|;$QJ#s)D*zRp0?Y*F z1EYcO0vEs?>#OwKi0UQ2`B^P36Gjf0)v7EJk$IpqfQbw)yLX_^RHZD!&2MRU;b~9L e`y{RZ8$SS}mHNWm5A5Cm0000h>q`yF`~jlDPrl8Ek`n*`002ovPDHLkV1jfxtm*&& diff --git a/pkg/octicons/icons/dependabot-dark.png b/pkg/octicons/icons/dependabot-dark.png index fc2bc0a539d29cf3958eae42772871ffa14062e7..39d41c7d1f21e533cc46e0ef9b21ff444d97d401 100644 GIT binary patch literal 345 zcmV-f0jB`tMk>UgaiB7+pz2j)Q0G3Nl70Pi7$)1PmUtFw;6vCd4*W5@V8 z|J~A>Jl5U#khgE3X6j8zeWEVv`V;jUIH)*t3>=lz4}p`4V7I_q0^C&{{09%fA_*ak zR*tP!KppFS)nv#S@KREL1?p$eAj#;D`kc?dzLM>KrhOU|z_16+A;12Quc~JSSmJl5e00000NkvXXu0mjf$V`=0 literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZK>v+?}j zfI^2oT^vI+&evWr^gHYz((+JWj5T(}iZwg@`wplEh!l&?5)ll2=Op#cK~JFbi(`mM zW7n}u0Y@5A4gPC~S?8PFlKp6Fo;k^;ROI5`DLYRm8|4T@e&tPHQ1n(N=Al?kMS;VT zQ_=q(&CudH(|fk3%D6buuhH<^uQ&d)7b#!$3Rq>GRp$BoliKMHoy#sNo@K3D*D7wi zc6a}E&D)2>au2;)-7ft7?a!po%3>AAzl8tUa@S>*413qCBN_%93vPN>Z2h>#^v_{+ Y`P_BKPM%&Y3G@zwr>mdKI;Vst0QCKW8~^|S diff --git a/pkg/octicons/icons/dependabot-light.png b/pkg/octicons/icons/dependabot-light.png index 9d7d033daac04e5da1e556a914d818b3c0093fdc..5dfa5b920c47d3f840980596d268feac78f08a53 100644 GIT binary patch delta 408 zcmV;J0cZZP0-*yTiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*soW zL_t(YiOrS4N&;aNg}?hJJwR^|j^tR*NZaZ)B6sFX1W{0%Xwjl4u%++OqGjL+jgirF zBs8Z*DrTnRnAq9f%f06uI6wD?CBxDT<^Ay9;GkbVb>r4{T7g`eAt!ESJYei2_R^Bi z4X;$W@cdBo?6_r_8DN-!=Lfrnf4dVZlQNqL5F)}<@5a$1jAkHf2yMu8V_1@r-5FLz z)&MHs1&p%b>NSqeGr9*L?}zUOr-OPl17~I*i;x5KIflGT4|(+ho*%aJesDD2FBF5S z=ZDd({hU_{4-uPFW_HY6al9$#wvftGjGbV-3S@ z%OG9IZ7J!DH!Vq?4V#@o3Mav&{!1rn0?k?btAD0{DUe87Ta>WRF+7$d*OazFt>A|} zK`#rr!Ma2ZX#W&2)xS38F7W^W0000q&5XaXhjy;8#y1{2a=?CvUf~mCoZzOfNgs=F(aAV_E^&r~OgoMHI@7-J zfaknXiH~^OF6TXJjH1Cg3e2!KeQ;(tjGEsDMchw)^EPsdyg`#oOtN?qS}QA?*%E8a zvv?j_BIU0}xW#hV`4-El#rFSh8{wkiV8P!#$hm98uefhZOdqj|`?%BahLls~VyRw^ t|18p!dNC4H^_)io4&Kz`yzJn1m>);)J$MlXX3_uv002ovPDHLkV1m;^gWCWA diff --git a/pkg/octicons/icons/file-dark.png b/pkg/octicons/icons/file-dark.png index cb702f4f445449722e19ef8ac2c6fd949f761e8b..213069bc9e241f8398bd475c522b1f9b6034f217 100644 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt^{JzX3_ zJUZV_we~ygAmDI+K}bLmL!X1Flm)~7fF-AMYuNo7R%8l_vbt)i>|nA;RpAN{V0wAc z;>4z&T(b_QpIeQs^WBYaweEMZ4N5P2?kH<|wWmvgeO|-qX}jMr?mnQqf!9ar(IRj5 zRgvv`)|`k9Uw@UqG-&$nYgxGpN@52L3z+9z_Y4!7qN094#A5Y1mCz4t3-ZJ!i9Zn7 z!R}Y@T)?`A`SVjN#`6aRZfL3V1+8*FGItkqPeX4|#?IKUC3hFKeU7|%R$QBZXK&mE z?y7_J0wMCdB@M#jgI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZK>v+?}j zfI{t_E{-7@=kHF?<~!sd;(C4pm&zpGQuT&51t}5vW|s3wH`urxLdv9so;Xg?R6WCG z;lKCJZ@ZlxI}EIzJapW}#pIF~;~8?r$8s~%i<({D!tdX$n8y<|A^q?SRo&ZxZaJDO zSM1z;ZvKqhU*1o;U6AOcuz`J3oBqGU0bg#~)^C|KW0FkT_l1RO`f>XT*}v$wb_1Qn N;OXk;vd$@?2>@3FUaSBB diff --git a/pkg/octicons/icons/file-light.png b/pkg/octicons/icons/file-light.png index 1267091ad04300f451e9eeed6d2b398e7bcb1a9e..8a00ffc258869e5d927f1f23eeff4af16172b0b0 100644 GIT binary patch delta 384 zcmV-`0e}AL0f_@4iBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*r#8 zL_t(YiS5)eOT$nQ!14cuLbV+oT~kOZG?`o!KY&_?ZXH}Z`5kOGcPHJ%!O2MxX9p*X zv5-<|CsUjR7ilSkoRg(3*px&U>22@5yZ1Y|$Ado(nOqcXcTdqXV12Q2eMLFyby_zI z0jA{y2p_;*Ok3M1TcA%Mj;L0htb5i*6m&<3TQy&ke&{lpRq$ z>~>mLv$@9HPGjP&*&Ga3Gy4b+Dsow{O4VNlzLBhi2MUiWa$#Dfa(W<&MgW#&tpWJH z|G8p>yP|lAoKB`@5&?$XqclRvzMHlKz$jv7qA7r0`{lW?;cgOXSs_0@Rv5polmI~2 z_dLLx+%t=A9drsvJ>i4YVQJ}wauc;yEX2y6#!`C^<25{hg=G>1%UHyasJoET!UqEb zZ{C}kWtIk0 z9fbu_%_>(cVq=CdLFW5mb)DdZHlb?o1lyYEY7oWW;1>+qr(9p#qk}G0eZDuut}PT9 a#_$Ac1u#f24tUf60000^4 diff --git a/pkg/octicons/icons/git-branch-dark.png b/pkg/octicons/icons/git-branch-dark.png index 5d9d8defe981bfc402a813db201d86101faebd51..3c4756dfde41b8644419322b47f8bbf01eb277c4 100644 GIT binary patch literal 476 zcmV<20VDp2P)LZv~`wCKMd;)m_v6MHk zQe$EQHWns!#>$^WG*-r6VzjX0v+#-|?oL1;o@RE>o_o)oow+kopW#{wASY>7(!Hcz z=iFN;0g#k5CuvmDp>ysyBrXCCzHtSl1NyXSzR&Yr~#LHGi%Hv8vJz!7=*1Y!-%dzyuB|QC|jTw)d^!O;;wdgY*|Eroo`=5`%IcX)W)U%@Av?Zuf&pm S9r(cj0000I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZK>v+?}j zfI??HT^vI+&bLmq%{!DJ;Br6xsX(BJusmaD$WAv44qNsGTrKnTME7xcHMdNi#x_~3 zz;p8SL(_7P-1pn4{Wc@L-0Z~L4u%TV#R*Of3Lj23_Q)|P{hKj+RjuItt5@#$tWi6n zBf)r{LFGUPYoT%CqF3j{1%Z^L^IBWZ^_jGkM9`6q8vIs4WpIg~vBzo@cs^(%R&556n37lB(`6VXO hLT|05>yGd5>J<)7373(4{}Jdf22WQ%mvv4FO#sQKf9e1L diff --git a/pkg/octicons/icons/git-branch-light.png b/pkg/octicons/icons/git-branch-light.png index 76600c2028ec270a4b03624e27cc2000568945d9..42eb954deff2077a9431f76778205fa2812c840a 100644 GIT binary patch delta 722 zcmV;@0xkWl0@wv1iBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*%q3 zL_t(YiN%#oNK{c2$A9O(=LdvV$|SQ1#V6yua3%~2Olwh#BB56!8I z;i>$^BUKqA?|`a5Aw{GsF&gX0YE16VQQAd#0(~vHb zgP@O5z3GG_^&0>pRudpAh0-=T`E6lhEcRJ3&p}T6o{#7$;8|j9sQ*VSe>T5tYa1W} zO&bB~%>Y=7xa$?XBMLKq^;dJUrY~5wTmUa;jh%H0txV67XHSWE-PN_x7l^uooCUe& z+W>M8^u800_No#W(JKg(#gciQ)mT|4nM^JR$}756a1C-v#S{y2BN2~1^aG^krU%Lb z!6eEBBQyfDI&;ix+9(T+_;xq3I+>4c+RzMRPy+_otZ;Ag&+oiDgm zbDR^U*o!T|MN~Vt1yJR<6ON7pHRSo?S8XxtyxhO9;MTSPf}Tfsi}K1(gX#j9{=``9 zgP+9zh(sn5qp@?o`7N67kQI5e+v1x71WoM)z{-6Hg(6i41Hq>Pf0c^Xlm~(AI#BoosJ-OfK3rGVRHl~84flc~i!er%C7594Heez4E`UnVp3X`(Vr)z#v^JuxI3HUc&Woh4;`5a|SD{vA_=Fgd4@(A~eg2C=yX0cbLTa zFyRKVPD0bqWiX3Zc6h^a!(fx}c$YbY0`m|YW%xmGb4h>F5fJ(ztLv!fSZ=!vWvkO+ZL{dqOq^)-0u?H#I>I>ZPdru2_(eg3=P! oIKxG9{uPFJj7+BLpXvYb374lbwKjsCiU0rr07*qoM6N<$g8v_ZAOHXW diff --git a/pkg/octicons/icons/git-merge-dark.png b/pkg/octicons/icons/git-merge-dark.png index 3b6f9966efff8555ee600b654512fe923e3fb9c7..283ee665c7335bc2eb0a05e68c0e422755e7ca95 100644 GIT binary patch literal 471 zcmV;|0Vw{7P)fAm93q;BsPmrz(;5s40bx1BsJm# zFt#jSW?!ML0WqQ?!GJ`6hMqrH@vr26dzO21^4#Y+=iGDekveRy)d6HA%}BbHbm*LW z4yFbafCgW738X@iXN-Is=m(~NI#3EFuwqdUc)lX=kc79(+uzta?)fG>e=-Alt>$%L z3pllmvOxq)Bn6a!cN5A2KRPXh5I`k3af`q!Fw{wbcVI8BM1TYGz&Y>$l>hZ^OyI=U zePH+xT;4E8*3xxrl->yQYjgmT3X+~AZAf~PbS$YR>CuC(N~$>LX6@XRq%%p2&bd8F z>W<6AIkyQMNLrROCuv?%PYdkM+gEKJiQ|n*v>pp;;>uQ*X;tk5vvv84f3g4o N002ovPDHLkV1oV)&0qik literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZK>v+?}j zfI=rcT^vI+&bLmq%{$~E&}zT9BYMH!Cgl|?R%%#!R+(pBYP#&|B*QR4Y3T!=m4Z7P zHV1Wy{E=0N=eo@r(Pn-$W2^D|v$H*)m{~FK+$c;7+pDMe=-i8_xhG1e*f#pdHC#Am z5L}v{VKimsW2d_&`?EXkl?>FDNB90aHBtZ9Ru;R}JAXaCbH=cF%iBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*$<( zL_t(YiM5qYNK|1IhM)Jl@rrf1bP*{-eBXHNQBo{?17qtn5D3EH= zDlmk0*{Z-rX11y(L1&^-*ESFpEmG&+(;~;8Qi~aTSLZwD<2?7h-yi&E>Gwn|(c0#u z4vbGxFL*jNHT8Yl0DdZS9ix9ue}2vj?c|3KlXKMqTqTGlTH7%CB_4zekw!DMgY60& zx2tWw4j_5Q04+szZFcs}*O@|Y!f->NL29)erVZw60YoZ6)C-<2gpoNZ z9El||kC3H=PJu4g0`Mw9sZ?5Q+TAi@A|=!#xkk{{Vm^1j7Qlw`lNs|SAhKD(AYxv55IFy9xS^p3weK$@`7o=M!KF6@dWGtXoyAp5rFBd!=4D^BOm`~qel zOZI9p@VbHFtpUJH;r*=xf645K!!8Rtk(~wVD|G`fD^InMXTVnSEbI%UQ8^ormK|V*+4W*!@@-|#y4y4! zKeRuPyCdv$D4Q2q4=2x4q1H|L;f1PF5Fez-O;f91I zflkn+Vm^1bT9+%oC{%ryU?1ikohiI~4d5p;&kgGZss^l{gXNVkH(0)sGBhn{skS++ zaj?Ad7Fh@f_O`ZOt6TI^!g|17)B;#>P|Q!hMY;jH5G}jUayE|m5;50T3*e7O-%lPo jBGExeX*(YM|E`}j6RhhvCJhd400000NkvXXu0mjfLi<53 delta 275 zcmV+u0qp+61)TyRiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyee*n@+ zL_t(IjkVD|QUXB`hT#VSud!E8i3urSMiu1&)X2ay7+Y`yst64D@c^#D z_7+p?A7km4O!Z9n+tXk3hdRL=uNb493z%bxdz831q$urD;0ePd&eAwKmstM>(8f&w z9&?Iny{SBab4+m5$i2oE3v@pNX?wK>+_uVu1&W!ZO=KKvXC}~VmS<;qs z?l}Yi6OzuIbA?z+z#{NU)h>Z#5Hn|I^Kr=sjeHeo1=7GhuvvqA189mXPyx4jzGdLi zp2vu`7hn$#ePQk`C;--}4tFl_d2_+L3hRaWqSslynFTJLgVo-5_B(zXw); zyuIDD7t;+CfhS-nz_$U{!0vZxN&=g9-Hf;24;#fnNe%A_crafb5TfUvXK0 z(BBZ3D6ahr{0sb|S)t{;LYoN-Edu9&3{bX)nG3tHfEM7&TE#N3Z3Q<|hd{<+^T4`s zTmlI{Xv%^{JYOCt)gf>OYt<807*qoM6N<$f+x7y#sB~S literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZK>v+?}j zfI@pcT^vI+&ab_&(U&<;!1dyGY0Je--qB5lf|Ixv%AJ@47+9utWH8KR(qPbKy}(w~ z*J7}9I>#pGgzCSI2RiS&{6BZK=b8Jzt1D_;L*A8&`MJ#b`Agg9VpLSlturxJw>Ym` zT#M>dzrAPO)Q)3ZcRCx>kFbbGD@xg{aN)7(dJwk6Z_*yspB*YE%g+TbIX6$nD`OH* z{Yh&jDcKp{|A$ZL(C*o?D^9~>?i1USzJ8nEh);0|d1kj);=3?c(9Pnb{L_D&Hp^Z2 Ri4o`#22WQ%mvv4FO#r7|cmMzZ diff --git a/pkg/octicons/icons/git-pull-request-light.png b/pkg/octicons/icons/git-pull-request-light.png index aa2f9cb73cf14b0a208c0ce0fac4df3a9e48cf56..616ece21a32b6f8045306deb34c4c5333532edec 100644 GIT binary patch delta 774 zcmV+h1Nr=<0*nSBiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*(ct zL_t(YiS3ooZxm%1$3Ne9rY#U4E!b)kV~V?GcXra<4PH=t&=B<^68`|=MdQH|d+@-8 z1h~Nk5`rF#2NQoBG$zIy9*9zcqM_SOrh{fons}iiO+$Kc+u3~6DcDBT3`#P>Aw z&hvae^S>x1f;5|cy zHvHpG;bIisOqIR@`rR^nf1w-FUe<3x2R7f0cJe{R@}=sDEem`5O4Sqjpklq_?q0emXUL`HD2i5n zfJ{Sg2qrM^#XoP%T?NPom5YWQ1@0@5I0{@$;`!HG!s@4zU0G{-hk&nIdmzRD(rp%Z z8VxN7p6p|Z#=tgCxAlQ$+|Be`FfIc&ux6*9nVdW}u;!J79Rd4sOT6hPWJhwv>euT7 z&3G`?X~5dd)>o9oT=nZnr_6YFFm=mvHj7yC&CP7Z_bi(M-I46dVCt4Z?_hQ^iR;%} z6X{AmDDRh;BIDL(hyJ}1hT+b&rgsR(s2Q^z`2Ujs04%o>T9jfNuK)l507*qoM6N<$ Eg3vv7VgLXD delta 282 zcmV+#0pzL{_SZ?Zd_rv5QQ2Txez1H-I#jqNeO4QjmNJ0N*;jS241D*?t~ zx(LWB@^6vPpU)Dcil$_mMZSyoaLB<`ypKv#R8f4^e3PUuUb1tIX*!%`g|CRq>_*t( zwshk@;7|HrfGXno0dT9Q(rjV+jgKwOt)BZx_BD&NE&z(2G{z$011>e|ysv|vPK>m{ g9D@Sj6wmMV1GI@c#y)(LOh5ahle0U7A@(L01<&Ib{a&(N8t&%3Tv+&$0KdA^K;Ib*}HRL!j=XF)hcig zxC2}SW+Jo=tOM_XR!V7iBm#8`cm^y2CxK0175Et`XMh{P1)vMO0^X*SewDVQ&ZwW% zKWamr8<0DvHtktktqlXdt#;H~rD_i9=A-6YUlMgHly}rC!-8k^vr*etD@6$}Vk|=| zFTl7R<61f#sH$DHaa8aOYdJcZ&Yh2f`PwlM)C225?rf;UKbC8d-E9s^(Kt&JxoxHaJW zzqdGAn`24MEWT4CcRY;Q_T4)pfbSpE`?<3kKS%Qz2wLi{dirqSd8~^0F~Ao>{bEtD z5{s&%&K?2$YOI^J!etjpwOF~`Q923bUG=Nl_cZ1t?Pzsbtq;hp$IK1o|AF_rGAqDS zUI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJ`VCz|- zK%u9eE{-7@=W8eW`W-e9X;ByT-LBjIVv)VN(yP`CpS58HOhLs$AqgJryi z72lrBeaLq{RD_w!CR^p%oQQcRo$frC(Ix6DG%v}eTQJ|oZI!#Dqu6tGt-#{Bd$?6< zz3i%;X8yC9x#L3nv57mxo%jpoUjN-cX?pBQNxsjk4?dc~vGHK=oRi!(+kT&%BW}|c zD3tfn<}&~3Q<0A|ZYCPM$taBYWq(^FscYe)Wy=<&2>sA^?^R#q)YbML=wSv=S3j3^ HP6mzLe*)P_ zL_t(YiN%#MOp|FC$AAB?RZ31I=VFxRC{p!ndaZ&EV$Q+YKuerVZo1(HC*xpl(2a|U z!(BX`oOOoc;9^`fLdbCn6$;u)F&uX;3TP}9_?{a|E8anmN{s*Uec$K*d!F~r^FHvI zrD~heXmnT6{7KBZ47q|JfWeF)e7KXUk#VYe{eI3CB=LMnh@u%kZEfAH=B&}!Is zxyyPZ`|JWkycdYQ9$C$e~`~(aG2Abt@y;?FRW(9lK0zR9{fWOSNw^~w|{Rm70QvNYT1<9g^fqvNQ)$C7U>H^_kmwhL!jX9UCJi=Js~bB4G-K+oe*m^?IR(rMUEC@_ z(j{PSB|xeI7#kaVh3tw!a)0FTsZTWzyYWs?Lg;e-@#DD)0ATsu!Y^RMhTYod#$vUa zw;cR7j&u_kS}M%_R$i|F^7;Itv!W!%8%NHAS}F;<@lK!PyARC!Jg2+-lfpU!=fHtO zO`gyCKu3W-Gp}d0bp8LMRyTH}bmvL{Lq5;xo}7I2QNyk~GDD$Iz#nKlhxiF-1f~r= z6!!OO&>n*hN}W9?blH~PUd?8+#eaKM9s1wIVqe!S`4T2eAY808^bs>MGM*{55+GH6 c&@ZBY0JM}70(q_2HUIzs07*qoM6N<$f**`^p#T5? delta 326 zcmV-M0lEI92G0T^iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyee*pwZ zL_t(Ijh)g>PC`Kt1mF*%xK$6qLf}Nccp(9Ok?0AGYkzkBTmrm+-av#Ef{SU)3l54_ zGD)Yqs;9bV_>K-rjPM?3gj2LL{4ea_93PnA8a?zQo?wOn8aeS3=ICNKbHQ#jo8xh{ z$wd?nf3g@Tf_t`1bi#Ib1Mw0kf6_QD(sCwiY_G!}rqW2Bag!m{!)}3ErhbPZjB%VH z6j;Q`?WTvfdJu9q{DvA9TX;n?L%6IsxXRR1>Vt})oq);6qR;p*eXdBx+|`EC3C zre1_!IB?GUK7T&Xd*1WB2kz_tD791VS1+gw>Obmb^_2R)+HtQ~A_w&@&%b#GC-5vV9uZF^`wDOfI3E#T-xWHw+f3i9k5{p2Rl9S~yOPgeYsmY8`bM?MCUsh! zQ6H-z=)>ygYR?+LepSb+P3}#VzgKU9dbJ!_1Mo_^|MCteZBRF=>+210MxCwG_cyh_ zFxIJ_RIhnUf2b$YwrNp&(|-Oh*urJ9T=~xDrg3pa!?(>7;ptR2225sz@xzP zz&f(GGy!}990jfdALL@5y$SYUnk-w9eZT{S;qM}%S|R&V%;zHF$}$BFr1sDV>C)L69yjvYpujYJb)z8!?OY%jEIi751N{V0N)RYe4$|`J^9Ms9b*qoP((WqAI dr}wp@ZU6P000mO1ONa4N$(sW0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBvU(@RR911T1iAfR4C7tlD|uvQ5c1veEG0Rs@S1wBZz}e;#5cp0SjU> zbnMbGtBz7o!Tte`odie0Lg~<5!26DJkUM;U4aL z&->$?8N&@_VpNHIf+3l8|k1OT!BQ$oJ*jF%)C z$83w-AP%`*MIoRfO532kOQ6outEXYsYfcjXPsp> z`NUpSc-r5}m9u5T$&i$b$x?eHMAcSB7sJ957FX5A*<#CJDd=DPr{1X3Vk$ zl_``Rm#kYPoaMe?PTXwuA{iMI#kbhnzBhJKYXX1`yDTy`z`Tqg{ WD#i3C#!y870000a diff --git a/pkg/octicons/icons/logo-gist-light.png b/pkg/octicons/icons/logo-gist-light.png index ce64502d7a8a1306aa5d850d1eb78a334e816ddb..364ef951a99b189ec8fb3b7b992b87c808495d94 100644 GIT binary patch delta 1055 zcmV+)1mOF<1EUBbiBL{Q4GJ0x0000DNk~Le0000c0000O2nGNE0G3UUbCDqwe*@S_ zL_t(YiS3q4Y*bYk$A91L9VjD2AU+G0rrrT&hH?idDnw(3mAWt(d?f}K#Dzu^je;a> zh>7tP5+WKG62%2Xg@|EA46<_LBT;6C(rL>r4?$4mQHZUyojHFOP|^&Swp8N6_+Q;~ z&iDP#?|e7s0sreiA{*HVGT|aQf1WdADKH!G5xp1@(r#zoX9p|A1OF;mDxF&+^d?X< z*yUiqi6M+zfJMM!utQO$7yuLs1^?J@XIIOtv!_zrdA-4WfFKjDkn}F_a}96#p~~JP z^?`HehO?ZnrNiyxzn?2$yltotm^zWkTeIQ)o|qeTlr~=h)|AgD>94K_f1Pe{4Ua@! zdymJNba$721-1^i-O!{Tl^FQk93q|f8j#oKrOKf(?eX`R09|z|J2&3qqN-znt?+TSrstdjO1{m zHJwW#eT&CQoZb=ManEy8MoFzu~`EuWMb(Lcm;u$LuzI-j|DVI-K{|X*e{iCwv$&}~zy}ON zaoG|Z%`|OfU#)>BxLSp!I}oSFfEt%PpwC?VIaHl&&4a$1Iq18YCLSBp%~Zjd6{K@7 zH0ATjG2=&(4;+=z5;u6bSnM7C4(5k{j%Akg+1Nj%dw>s<{nZcdOozW1v}5*@yy_=C z?d?a$3+4eGz|HgLf9GQ1u0`c?xi6}eAFbiFnDivD1yn;?Yqf@bsRehX$Lr-|>_$9Q zMazK={}c}3(v@}u*Z~lv7cK_-POkPWuzEZmUUiav1)RlrwI!FEem%hI6;;aL0~aJ~ zsvk4Miv>GeEcTk|bzoLvKwoCF*=smxRi*Cf6sJ_W?E#?Ce~j+Bp)(S#`FuW6pW_1@ z=qSG*WWqTTuM9Z9D@cdiz&a$VhNc>JyG#$(C!6e`jC)hrT<*aBVlkCj_>yFI8+2p* z;UM9`0*MvCDF)rgbrxS3Y&iEBN z^s>P=Os9dHMlF9+KA&uEYnxFh6#P*Gfw+shDW6Zyn>TM-Tzs5n&t5Vmo6Sz>UH88L Z{stTJhQ9E%AW#4R002ovPDHLkV1m6$?i~OC delta 437 zcmV;m0ZRU(2)zR#iBL{Q4GJ0x0000DNk~Le0000P0000G2nGNE0ORJ=tC1lTe*tny zL_t(Ijos9}OVwc%2k?(q@g)g`EK3Lnof;ejAw&Z)hyDpy8(TEU$;r{l-60T%hP0+= z5FA7VQ8bWHx@d@n_=bTF;_y7l$qpVS*gX28zMkjI9wsBnoY1!SfB062B!f*n zEtW|h8HkC@-~pEKq!`INVU4T)kZ2pz7{({`B(^ITH-ibG1ygvO*d7TR^IJ}Zm!S+T z3EnDnVlDn>W1Obktm-k2pE!u5TX-AEU<@B)Vv9HyUV$uL<-{ApuCUs9rKXU<^@~?s f#FtR{|B(xFdqm2d)V^r|3jhEBNkvXXu0mjfu*bw8 diff --git a/pkg/octicons/icons/mark-github-dark.png b/pkg/octicons/icons/mark-github-dark.png index a0d9651f4867251e8e67c243dbfc66410be2da58..57f11abfd95557d75e06f5ae880c40497624c09a 100644 GIT binary patch literal 571 zcmV-B0>u4^P)UuhHj``Pgte{U!(d}br_&h#HWB-lwVE8z2JL+_!QNF%dx>^ zQu8o`uvXR}gs=t7CDR?I`Z?LSqh;X{<3Pe#j)To4SnksNZSpH(G@;X?YLYv=3wRCK z6HQfOgYQZH$$kxhQ_1*SZ16q_PVd4Xt?4k;>C6qiUtFNBQY-51O#SsZsjjZ8zYDX4 zBI%=gOTCZ*pH*+#dgM|yi#^#^FjoW@)r0EWsNhM);Bf}r)}7p^4ya2}d-mJ4|8?hSY0ny)Wp$)*n9*0i9B@ePsXu002ov JPDHLkV1lb?3N`=$ literal 393 zcmV;40e1e0P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBvU(@RR91114%?dR4C7FkufhraTLXWUZ1{%fq~6RB2^2qip1t)bl_uj zv8%jR`XMA@F1rcQ#$sR<5}Hos?`L@LwWxE4o1A-cZ|*rrUR4`*9XPP-k!uB?wZxXe zp9nTB7lOn~|HFmlOmL!JyYH>~>WkX*z$-NstQyp|SaM#(Ib*S*ep-pC5dkp}cmv=a zfCwm2!=9=uqi>2@QuPk|>R@7w_^kFLNn;GB{Q&k^a{k4AC zdsUBd-Qc08et7Pdh#Q_c%>Aq&wj8=?+m4GOE{wcP$5!9C=Z;hPfh?Df$vCX0L5*|4 nm%-FzoMskxeYBx&wcx)2zZEbN5@(7600000NkvXXu0mjfB59v> diff --git a/pkg/octicons/icons/mark-github-light.png b/pkg/octicons/icons/mark-github-light.png index 4edacddc68d4208cfda061d1f00bb01a73d43e3e..7d7ffd123369df41e8a9bee2eca230723ce78ad0 100644 GIT binary patch delta 881 zcmV-%1CIRj0`>+WiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*-H? zL_t(YiM5qMXk1kkhQD*)%S^^}5)4IYJBv7sPLq+Q+G>c@jT=`@i#CN8Tu7mdf(x^7 zCD@gg7AdaWDT)X}7tyV{5RtavsA*?v7+%MaP8wQmLZ(S(CYg7Si_A;kOxjKc^xwR9 z&bjyhF87{yANOz@IOjK=7aZ#T_FzgGCUt)=h_%IA$}k9Bl%U|^s-e<-`bOEg}Y z0A6f_YxULgshOFX>T^T;UbV_wU~VWnFM^8dE`^L0zA4_g_9KitslmcAAP#cS?e2XS z_-KPqqg$-|7Y`0}#rtzA4(N9GCbf6?4#HE7aB0o8&&*!GzGwhy>K>)JTbyL_K)deQ zR3?*&AjCqczUaDh1cEbAe;sR@p?a=Z%r0#gkk9AWP|h|bWy7;^$TAqNxtK4uYaYm0 z_sei>VJHM(SGc&m9J|vgpis#E1Jr|9V0Recga`NZRG;h=kV=j866(spI{^G09_+jR z!A=1-QfdA2?`{GFerqbJoaq!Gt#f3<(*P*)Lo3pJg6CZ=L#TWD`*vIwCpv~O zENbemR?qm-RR(@Ff4=?X-o3kvVUzxyPrHbm*s@{D6!n$27Zw(L2;HWh=hb}U90ul4 zo$yU`Jc9F?Z|WCUS9i>}`dCL6TXQHSb^XJh=hcFg3D=AH?5sNeD9W@dpRQBC?OJy} z7Ox!IvPIT5%@yRDy8bISbGcjLyrD%mbGcj8S4L1i0PX{*N9vY8pQ;<=mQg*c>&q{< zns0y~qf~07mq_&(Yu%TELkpBnr{lhf9=ElwOPySd|GEAJg7YqJB1-KI00000NkvXX Hu0mjfFWan2 delta 362 zcmV-w0hRvt2J-?TiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyee*q{- zL_t(Ijg8YkFGNug1@ND>NGK@iv?StBL$o5%`4|d5#x{B@i}(-{Q7^p;K{N_lAwjmn zqImPt1ES=4cbR;(**VWvd?g8}TKjjume8$0MPGoSopEUx2X zk-Z?!u#St!pYRy*H8yY>c_ZC(f8O?feCx$X@`GViBd&+`1JhNkp%P>+YU4R6@RG#2 zwl}=4lf6wA52pmSy4 z@;%*R>L2q2ZW8@A%*jrD69;(55f&5UJPz@ub1J8E!ETTXvRPkD z&#{VS^c31p-$*k&9T<>3lw4RX@Snjo%FHQdQ7h@77F-9u0mK1d)7PmqBLDyZ07*qo IM6N<$g3>XaW&i*H diff --git a/pkg/octicons/icons/organization-dark.png b/pkg/octicons/icons/organization-dark.png index e4ce01479834bd6511cc019fbf7bfe19a0fdef7d..6ad3feaf84a1f2c68c224fddba2166973557ad5b 100644 GIT binary patch literal 377 zcmV-<0fzpGP)4Bx%Ou=?%$^)bx~gb*gcNn#I+VpaUjRna6xJpjHM3am}J??VU|jR*ikpf%4#<@kE_I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJ`VCz|- zK%qsRE{-7@=a)`2Eh?DKJ%#19_%+?1ZT~KvF~b{tpUIIVHXw=+m8` qGI+ZBxvXmzLe*vgT zL_t(YiPe;`ZWBQehQHYu7d!$)AjDGaNw6oS$|C?>B&^ga{0bBx;Ruj;14yKFC_?F= z;SER|8_B*Xizwn2Is`HD4MjLxvDZF)N`&%PJM-_(H+wrexL`@KxZ~1?if#ed7pkE2 z)#S}D-OnFmc5Spz^$o&z;O&Afe?Aa3TfmLE0EA^kc0%`{wMc!Nq`y#oHp@4Q6sw{r zz$U(7oj zN!lvwXzE;&wyg7dy7n8^`5(8FyZ7hcprUH|$$Q{X)V!Vxs5+)umVHCy18{Q$jka=` z#`ORED$Y~!H~1@?_y)?YGfClV=(hLH1%R>(EKTHwz&``ZKG6~)o1xd1&}$1Kn^V9N zjc=gzLD#JFKg$kT=O2&HLFpRsdz3qkkEZ}?@}}fw8(}>2FjUR6B9J^kRFNT^*;A;< h9jno1S(BGXe*ii&yZH(Fp=OPj19h0Gr==@Xs1SvS?05NQ>V>VqSsNE^cfx# z{hra;0n3a&L(>&j_&}%W3XAZ%QZ!Ftj>A1E>{0xG3h4kC;3@bPpSKQJq6q$T&43;H z_>NwIx8Sds2JbtjaH=bgCtCVD+XIFe1;2FOCC0yh0@?kEP)7*p)De$8hTlpq5>^j5&|nCmnf`04Ic4wd+yb)Oa0(CJm-AR_j}%+U&Q}@ zih2&TM#Nx5?2d>^L_Cj(2Sri*T(c?$Fyqhj2K{R#@5eX1!zkMG4r3~P&557|Zt1iOzc29mq_E8&q&2F^5WgyYK^7>jhVGfKz2zU=wB&v#t)u zW8ANoU|=7<=C+Jw&pR^n*<9284dNeRvXMZ6%OyYA(z((gb_c%WT0Ou{JWZm{xP|e& z6KR7d=&Om{i)nnqmNN1|%wrB`Extvym{y#_2YkUmmG5DSAFr4BJYHaH-Tp1(d+;hn z`qDOzh2%M14KA|exz&(Y#cjjK9BPra?YN6yIJE>E%F@oPmb^;je8wKEvbEt(Zd-TY zW)82d34!(5rW-Z(-rT0^Ve$Q#_*?QSvfG$0vERe9N6r_8yEh%lq$~-yNiP-UY$ULI3~&07*qoM6N<$f*ckHGXMYp literal 353 zcmV-n0iOPeP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKBvU(@RR910+et)0R4C7_(Z4PP0T2h^*%NLPr3X;xFVT4g6|N@n3dAd@ zxVQ)j5)GB^-hkF6YZH;UD0TjH7mZ~1Q|xhv5QX0q(|l9ROd@_yE&d3ak;hBqvGh#{ zp{bPFajmo{MyqPMOA|uftxVYUY}@z{^lc6%4)ldNCrYg$=<2Eqsh(^=PdyI7ywa7n z8>NL0@bC^&ZG|d@wp3VC+NwaJqj0EUQp1r#N8$`!Ga{^DePpo>EK99=a&IbJ=zZSY zopT|~dey2$E%v|MZZF0nA|j9Dm`?ufSwH3t(ErSrHP&sV00000NkvXXu0mjf(AbK< diff --git a/pkg/octicons/icons/people-light.png b/pkg/octicons/icons/people-light.png index 5a387cd0b65fb44e2629346eed0206e9a12883f7..5dc0fb62fbb6006204b3151ebdbcd23ef6fda8d6 100644 GIT binary patch delta 928 zcmV;R17G~H0;LBbiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*;=c zL_t(YiPe)&Xk1kk#((F&nMwUab&RRD)_|Q!oXj|x=zvm6F(DDPAfmVsx~Nt}7gEJ; zUApL|intMMq__~&MO}!}zecPr6{4BfOlF>ai6ITBK{^f+oh0ww<04L&OedtNtDfCG z-@V^=zwh1yH+sohKt7+3R_B8Of8YT%YK)q~rBc@!_&ogI0?E{ak0Lq@nrMQ2Bf9_R z3HQ5e6)??>?sV^N#2yEYiRyEXt!;K}ZL=cJD1=t!WOurE_jNhw@9&Sy&Q&~=XqyT8 zipAoUM!YkdjmH900BYOsil;|LMuPPOoW@0D(``e*0a1OaTpIted2@Acf39}NmaVhE ztAEWeoW1hLZ&Qh$-sjspwhqO&bi{L+^z`)fv~4`IDk2fd0T^94vF4Q)+l~WRvAO?F zy#xBLsQGI4_eyC;Dw|zXKw)V;%hm?Vv071p$x>n4%~8Eol&65G5p%LLn~k>?FxCYK z%uR!937Ad6;{cABLcQm@fA0LHa^XvHoF{=hW1)GYjx~Q%lkCZr73@;P?wq-JvC;^p zQmOWUwlRc%{8D#MtC>iqb7!$E_~pVNK%_YVRe3=~PsIXLNT&M^)-xwodm^wLM(9v0 zgKG_(C~8Gl9{Q>|m@JQ-M>z!Ci|S`YYgMAPD$1t_+Yvc5>5YBge~LVjc_^vyu&DW= zWklWG*_3tUBaody1vrIpdD)wEB031ffpd=4{hsG~E99wcUc`I?+8!mEEtN)pT_upX zKQ|zTFHmZVymk96&e74)(N(`HpU+4CoDW|V(YJvZYM%DXKYa_3?8$ut^ea3&St=Y` zzhOZdAbc{RM$D2)i2lp6C7oj0g-E;BJii8zo-D4dKa%af^0000`we>Ci8+h3n{<3cy2exJamjk5YHy z7nxfQbiEuNKr_Spn7~NRgZRzNodn#%co(o3bEWECSk3)HHd(?G?lB5yzCP=_y2EKn tPvQ-Y8fw_>1K7b}Nw;x`u|B!~P@k*wJ0G@XYs~-v002ovPDHLkV1lL6hy4Hm diff --git a/pkg/octicons/icons/person-dark.png b/pkg/octicons/icons/person-dark.png index 8b1767ceb0d6f65497951846503f95b63629cef8..c0fdf6cad29533e02a2670c4ae8ed08751300c63 100644 GIT binary patch literal 435 zcmV;k0ZjghP)K;0;*IEAFhy4lo-N4=i>MWNLL(V9Q!j@o=if z*-YXTJRaddFFl-#2zM-l2~R9U*qTJH&!B1V9S>(O!p#n#U_)*JK}>uO=-QBdg?dfa zZ52B<&>4FUOg#UZnt=mOVva1tahgWr{sJqK8j{MA`jW0BbuC=d*K7hwcan~rbI;>c zz74zrFF*|_#&C*29q0iA-z|((ZsL!?Vg`Q6xC3B0jqHG1t2|XaV$uU{yuS@#*M?Wi zDn683x7_5r0ZxHFFqy+(%G%WMk=nr7xZ*?k=fJmZieBKnq;_5d%U$qQPz90+DFBv$ d!@T)_6Q5nPhS(pN_}%~j002ovPDHLkV1fd3zB2#- literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJG6`NIu zfkOK{T^vI+&QG0a%XP>>pf$c}Zfo4Z`65;P8?Oexm}tVG)TC0uq|N3SR;@!B9 zn+;DM>v%Bxnc-(c<1;KTwmY47_exEfvg&o}Nu@&xGmVcIE}i_8TjA&>rw+5eC0uuA zJheNPV)rGDbtnIqHSZ=QWh%R{A75s*sQaLx@MDAgEi64dC%ioLLU;xfJKL3&#!onW zY8IStZi%|L_SiJ*y-X2BiyQZ3Bt?oGm>IfK=g6$!LiW|MPra)ZJrCO7|FcTG;lkx( U9Q)f20)4{Z>FVdQ&MBb@0HLOR9smFU diff --git a/pkg/octicons/icons/person-light.png b/pkg/octicons/icons/person-light.png index 39e07db377dc9592480d2086a87564fa2a167cee..db1368350c92e2ce1f19eb33cc923a53a8a28f7d 100644 GIT binary patch delta 653 zcmV;80&@MI0+amzLe*#HK zL_t(YiPe?APg7A8$3N%3+G0!);^IIUpx|pw;b8|w3`Q~W$6`!$Vv$yEhm9cSw_cCh2;k z2x$P6CBHQP9y9nAJGR`e$Tf>5 z5Id7h4V>C<0_jV6^NMyROyCuZ#kKlkcP7&r4@@3q%`fGL0BtEj()G?NIv}cd8p#1x z3WaqM@#KuC2w_$A{04fsNe;X>G*2x0| z=HOW9a9eN@z^KiK8jUb$`cmGUMH5>wJG@dTtk)M^*F6%Dm_%w<=qo>>d#fZ?=LMph$ILr^!I06>&P>Z zVPGA2jj&qFCf$gR0iD1Hf5+;?^76uR(*nK62G5D%1xi_w$&N$L^IR^sRo|1%W)E!q ztlkvSDIkuTtA1(j-JSw9=jIczs!sLtm&L`^(ELEp@ocxT!Aqdav3jyGN#ijU>zJn~ zH>4qv>4&eJSq(a9WYcX2|PBRAo}(Oiy~?V|+vcI}U8LIa|}s zlJ7u*AJf2hV`V&4K#>uIH^pMH(yD;(`^l@YqMST-*(?*kqIg` n@`Z|mIMv4*#Fq9u|8L?K@NVO59 z(24CLkPijjRsBD|s+uj~2o>sx3d8@9Ys_&IvA{b9B?48D4_mo@h}@S5eBe5hABD4D z*vmZpK_`>%;Jd^@(?Y+M8%QnOYn2ELC94a`_9)Kvis)KgU?#QFjv3DXB45ShXPlxJ zafX+uU9Kaa;7eLnH&gH80iQU|2~4CF?r(5-APsn&E52d6f!yF0ug#_X59W9*5O|Vi bu_IUl)eQq zo?G*8_T8J#zoZ$X6^_SS3W)Ce#&kk8R%NbDcB~iInVcu<7!be6%#=Nwb5U|ZYmlw{Nw2N8uBtO{?$P`oFaB0dljYsKc?*~95n)wQ_I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJG6`NIu zfkNG$E{-7@=ci8G%iA0v(7a!vjB&}IGY$v&7V?`!HmOb$HF7Is;GC#iVWK(r(O#2| z%fkDf=|o#aw?|n<7G&`i`Ruvr=GnHyPvWwt=Z9-w7;GvT3<|zFN%2UkGjtv3e^Te! zp^)VfUehD_?pmjRMq*k;;Z5mzLe*p(c zL_t(YiQSbkZo)tiMgLf?QSQJZya;Sp6zNiMhj4*3v_1fRYG^nBN1)6Vz?QJ1IEOF| zoqrlEnUF=G1p)ch?tJM#X=YXnJi4ShG`;Xmgzo?vmYEw;qVH@u+XE;a6aX>+AC`a@ z0PQ?oJpq7QGa3+C%Wv(YSy=HUASsn`vHE#P%u|`w%Lvn>n5+89$;wzS^U=R$3m?rT!oKG-H z6S0D9Ivd0mBDbyvyEcQ^!o%+?JG2rFPMCKwXydB>wO`uqATsM(!5;&>P~e@ZE!2Z( fgHrxDmso!QLESK+!m~Sj00000NkvXXu0mjfOT}2E diff --git a/pkg/octicons/icons/repo-dark.png b/pkg/octicons/icons/repo-dark.png index eba66aa1475a6a50b0c485d39abd0639530ab722..81bbeac25fefeac1fc537099e837333fc1e9dc8f 100644 GIT binary patch literal 323 zcmV-J0lfZ+P)+J;=ZeXlfkf(1y;0w-*F%~a8Q>N;0xp3Mx@!WA zBO;2si_T{i!Hs{an%35`Gh4vC7En?S_;dAu9?%2+10bKK0#Cp;Fsu$urfCWA1>6Cz z71>M2wd!?6aN}P(t_7YG!)M{eI_(0@0WZKvZR(o^PpQ_bjch#w&Vei7q|K!60>_00 z$G-w1;zA8zFFQ8}2K-!#ec%jOFYq7R8Y^|GdcXK>9H?*Vbmf2*0EgLnM;&#^_y+QK Vzt0GEJ1YPH002ovPDHLkV1l|7gOmUO literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJG6`NIu zfkLx9T^vI+&YzuV$aN?{z$M}{y+P&lvT zI9dPTwVP?vWpCV+bcu<$E%iuAh%;dGqa%|Qxr&q=j$GTzvNd?3M8gzz;f|k;^$I0+ zC+14N{4O?WpRWbmda)-T3||?fhM0%kJK}cL?aq#^QbNzxJ(U%jcX-2#^|6hr7d=it h$jVGhv%L0+>FS!kO@do`6o9T|@O1TaS?83{1OSc)X7~UA diff --git a/pkg/octicons/icons/repo-forked-dark.png b/pkg/octicons/icons/repo-forked-dark.png index df2e5890de0393edad77b5da1f1aa5b44791a326..434d5d287599b0a43010e8a0bd0c6c69b47327e3 100644 GIT binary patch literal 492 zcmV=q97rW*p^V(iYSy4eu1Ar;iIEre}RvV zMkn!+AR3`jNYH3iGzxYR5jx2}n!9$g`|j*(t&_Z&%$alVx%1B4k^UL3lmOC_MkM7V z9XsbfLkWOpNfVOVC0#h@ZbIS=kf(@yAQjN3OjAG}Sgs^an_vTI0fvDW;4oltWSSwM z71*>KgHhsHtD@E8R)M#G!5gsR&D$);Oo40g^jRBwJ+9B=qmV7p_j-I;HBI(EUw}2> z%&M6R>|ok7rxx=H+yPCM0#d*s@L|F!pzNl3dS@ng7IOgf1a|xrmYvU4sHZYTMdo2t20LJ6Q20OXLq+8OM iO;4P25499qcYFhieb_cibu0t`0000I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZJG6`NIu zfkL-ET^vI+&bLl9^lNeyaJ&C6=%4DsOY;2*Q@9J*bxev_&N-^fHQZ~dVE2|vW-Mat zJQCqxFzrbC!$a$io$%Roa?jkF`zdNC{s%H#NIEo&QE`*>y_p4U4ITdHWLL@xp1(S= zczIHYMUs!aMaz$GlE=M{G_LZVtt7WQ=xbCDZ>#gxNi(KenW%L8r#bAD-pi6ULuZ3z z>h_JdUbWtp)3P$z!H`$^xbJzsOr7p4xs2xvzCGT(q;E=1%9$zbcB_6ROw71fuxb922WQ%mvv4FO#l_LiDdu) diff --git a/pkg/octicons/icons/repo-forked-light.png b/pkg/octicons/icons/repo-forked-light.png index 6d1b156d786eb395cff56ba6a73e0f1e6008a135..bf41f6e27009239f374b815201e1eddc6d4bb037 100644 GIT binary patch delta 765 zcmVmzLe*(Bk zL_t(YiM5kWNK|1Mg`fA%b&ROV)G?ES#2YhrM(0{Bg8r!%fkBH1BH9NDZTlf3TSo;2 zEou>D5iR?H2%>_hP1aE9HJUVtD7!LbxM)W2eOu_1=!`Q#p4IoA@0|C%-yh5~WG2xP zZ(C=GY(n`S4*7Tc`ufJ^DiDjse-;N)y&Hq5D$g?Rn^z?Rtc25z(lw1A3I)33{rfjV z#fzt!eM24r%~O;jawgNCK3&il(>q7$65&daGiy|3BWT1oIA5xJUyKW&5!Bc)Q7ubB zucCU&vQukk1&D+;12P_#ql1IJqaO#-&lRHwWNXRu5#0h@&kVeN@hP4De~~x!C?Eox zX9s973=sN7;%|i@sW4os{^Xkc(O2a|34mal$1DuOA^&bJFo#5fJ1ueN2BHZ;c7k-4 z+yHVB^pa&e4^?qR^dQ3E0`cz^G@-)4^SpetZrL3b5{AfLRKkdy%(&^xr2?`e-(J>6 zmwPB3hOh~EY^oe^-M8OMe|Z3~Y$vc1PWPOm>H37zZP`vxY|SV}Dtr^Atd$7sC9uV^Nc$>gG%x~8*;YzK)ht#4e>w5ZUbCD4AgAUvggq+s z00n-t7F*L~*^XNA)bRpmB~m9W+fmzIx4fLc>>UKAHUOv?Zh=!37r-}y zhI0P0M-*nfKZofFQ+g~OZ%?ZR;=?h(t0M1~^UwLw3RrEocPM%bSTseA39|o#o4)^F v0svZCTURn+?gGG^c<}MvyU&$+=M}#JQHw{d6!~E>k$Nx!h-M!o})YU0NqQPzJsNWSfDRJh*)TdWuq3I z%W<8HoA{GS&YAz8e`e0%AF+i?Jfn|R!nJXXm(XnH46bpDA!gW4xShxiLvxinmsrIa zdU0P#xboZ!P0D?sA6;g6LO0>oe=te-qntq-gAjBwd?&bpp5ZF3ip^|FYZ%3G?@Sn!srhBO^g4Gcds2gDOPW}r2qf`07*qo1w^hwV1fpN Bgh&7Y diff --git a/pkg/octicons/icons/repo-light.png b/pkg/octicons/icons/repo-light.png index 28a9bfac6eec6ff181a63fe1f0c2d918c98b363e..185a05438a2a3a5089b1f03a5db106ee5fb5392f 100644 GIT binary patch delta 400 zcmV;B0dM~J0ht3KiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*sQO zL_t(YiS3jmhVjw}d~dZ=B*QDI zFS$n81MYy=*l1x3r5tV<0#vqDf4O~ZddIQhfSq5ffEofTvL_>!w8nuCN>uRYnFuC= ziQqp7BwW~ztH1*=3uMQI2ENzjCi|@0Kn-|_P5$+{{z)zHy~EgW`ajoEfg(J02ORee zNJn;@1WoU3RH^Zk6`p}osGshgklx;q7+)aBC93E4idzku-ocr&RHs-6Og$N>QwW^YJr$5n*;_eA?>`ZKYiXcdv0 upi!?3n;SWcj=LMKbGh}orF^jzhw%+VQBvn%yK>$D00005Lun@4py}_?q_Khu>b%707*qoM6N<$f;|FaoB#j- diff --git a/pkg/octicons/icons/shield-dark.png b/pkg/octicons/icons/shield-dark.png index 82a0d5ad37c1eddd210a0ab05069778c5f649cdb..cf61060deb5eda1c2e8507bbd125ec0cb388f3de 100644 GIT binary patch literal 501 zcmVv~{i<)ck4xCn7CM59m`M;k$0T-Uo6NCp*i3px>cHc8h@~`k za2;bcp0U()(zBF|eO2N&n8j6$w%Ybj|7dz=@w!R?6K%m2oC)am*R(Y6#;!J=zBb~B zxRJjH{#U@-mil%_w2~?ZEJVbHRbci<#HVhjd_;2*F}#fVdxL<@5%In%;AKSYSjK#< zLBRHic=gw4zW$5oZvd$*Y{XaG?2eV6!Bj-7kBAdBfTK84lW{U4)+MVF(8*T$cf?10 z=rPxaCwSB|9>?>_xZGp@Fb?&YyOQ2xJp)pB8w=Q5EBxKFAD?lniFgRlFxTYX!5+-x zDF&OaXd7PSs?MUQ&=fd_FZuD=+6Z0(3}QOZ^=^4Ld8^*bxhZUF1^;7}XYejz53<2q roUYp4N`eM(0gtnt$G|^>SEGIaB3{=CUYyo&00000NkvXXu0mjff%oX< literal 401 zcmV;C0dD?@P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKCcQQLc>n+b3rR#lR4C7dk-sj3Q5c7xek$qGS|m(O69iX)uy!CwEZw*O z*We-;l&u3pH%a3PBuLytC0(>4gbrj>dEejrBq!%N2?-Uk&K}#qHCNp7 z6LK*!@3{@NZN-Xhwc)vWBSE}Wo0ct@7BOwXvQ70O2D+9^$=FF*@=GEhNsUgpvB+uY zI@FkiB!6ppY$oELN&=r`2J`pGZi-F})X5IQqY)rWJq8}wAPQop>6@Eijhk51uDTx{ z_u+f!4%D64L&AGsofmP-O%WG-^Ug#JV9pnxTp37OweGVy=>xdrqdkwEan=)iR$YuY vL$w*t?Ao$r*JAh;B;lx)ISzp$)nW7tpHac{085jh00000NkvXXu0mjf^2MG2 diff --git a/pkg/octicons/icons/shield-light.png b/pkg/octicons/icons/shield-light.png index dbffbc7e74a0663cf023d746808e9d7310cd62d5..5a11004eece3572c1ce51db83b69c00c72731ded 100644 GIT binary patch delta 760 zcmVmzLe*&{f zL_t(YiM^G*ZxmM)#eZk^gJ9ACqKQZfJPR|scy@>zAb?y%i6y9PA>s-VDRM`sTu~t0 zApQcmSyWTL`DPvgjh75}U1Dkf9#%8Oxr&bvFVfhb(hK%o=e>5>$tNhX_ zzISU|7#BRVVH2Y=vi1A7KVBJ4ST?^HpXx?5t^8tq$`8x7)O%f#gI#<4FxuS>C)>@i z4_!v|Z)&;0D>GaFUj@xv4=}&fFOTTCU~?z3pt-7pw8f04Ed~a2 z!ipWY!%nWMZ-ijKF7>i?*}zo#9!UQ4FywPd;-UMiJ71U?l^wHSD~D?on3 z>o-T*2^50zp+XoRY={5tGG75X=e#Q|1`qEgH-r*QC*W}EaWrwkunTF}z`#HjbONZ% zJgD4kF#s^njT;vE;ltx;A`Xq1+(;Vs=<&;Mfs(=Lc5euPAHwSd8^n8^=`t|e$hxmrHK+gpDm7Q9szVM{;Kk z_F-Io^MOX@DwV&|PINln$$$z$eAHxTfi1wT#pio5o){XNxnDUCSX+Tr3;>9tXv2I% q$0SAY z1cl>HF>7R-a|U0slG)$-uQhAUZ0gmFNvz;FVkNxh2K;x?6t-}QPt>p%Q48-fn5km3 z-2fg?#XKrWz7k$Fm{07a4PLR0fA+Ew6SW8Xl8+9pIKxu`-oSdndkVHKFZ@j-e~nZ6 zRsXAef@gFz$iJ7=b&7TK1{dgU04|p_=#85121l5Xt@M$AU9w-6ss-cNPtCai7Ygt_ z?h4*wu(PSzghSk5An|7~oty`8i-V~7p*~#W9HYe~#$-QInj+Ctc7=i zp|av!9oUpz@5hK&*{!S;;krE%^SCh3!;1Ls_$ZC4-*OaN=ZInAg6U+t+`?c6XEKsIrvz!XpdE==GW z*ahALJs!5lYP*KPI3?4_gba2JcmlK+;9X;7HA$6Ab6vO(+kd~QL6Vp1~8X)Myu9#KLf=Gt_XZF>~bn`kNnYE_z5r> z7=I0%0(D@iEpbm|+zbFJz@$ADs~rPl9f^A;1>3UL*^K2YX%45vTZLzomv^gh&edc1 aR@?(P0l>*{Dj9PC0000004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKCcQQLc>n+b3`s;mR4C6~k-JVpK@>&Ty=p=OmOcuCiqSt%V@;<84UK=` z*Jy)u6ly|8V*CX)p*67*B8^}O78HnLTo!kf$C+mKIy>h~_CyjY=8z&sz%6y|_z7H$ zEm*Ouet6@JA8OZ%1!FES+RRgM+zM01F(@NDSAk za}w|qPvLgL8rMmZkq`FG&!n*JyZ1&(P?)plt9$?LeLKFHlRpFQ+Va~oS6ubnZ=3EU woypLQ7mgh|bZj~N3KBW}@-0q*GR+D41&C#{=Gi;OumAu607*qoM6N<$f^sCGIsgCw diff --git a/pkg/octicons/icons/shield-lock-light.png b/pkg/octicons/icons/shield-lock-light.png index 72318e89cbb8c73fd16b9ea70580db271fc9eb29..ae6e8cc1bef4914ef88f5805ac16ef34841e96f5 100644 GIT binary patch delta 808 zcmV+@1K0fS0mzLe*)u4 zL_t(YiM5u=Yg17a#((D~9kdqF8nn@seKn1-CMe>ta95nVP@{s=(uD(bp)SRLKyV=_ zq6NWWp+-gOgexa>Q?!NJMqZ^9DQdJ*YSOe#-f>|oG0jV(=(jrW-tTH_c9iy;bZ1N=Z5;V}S86Ho~Z0Jqg4 z)*D~)6mDdT85pY}+=OTpWGmnUQmEV)oLfdm+v4%~FhC#>sCJ~HSuxuY-3-hG5}+rZ`C=3eRg+8Ie^L8_hO{~Z^Z#@+aAS8KTtNg zW{U9t3B08e7cE*lqp~`=7a%=cb@juCmm~kwpt3r3ZDP8ps7`GHqNU{Jw#ZS{VlCS+ z83=52BTZ=hIuE&mgCfjve@hg2nDg+U2yZU%t$=|hfLgc2@sXiDlW`_Bw6BPPANV}g zKzNO^#x1e0uPohC=@E!Z1y5B%($F%HR$c^{EWyUly#$yw>5v?1t#s3T>{o(^q_6OPULQS z^4WulPhB;>+7aMrjc>v7+WGVDB@&4-m&#|&u330pM0coiytlivHJ>xZ0ATRT#}{*b zwF#glt7g|cpTFnpewUB$b2;_FNK;15U4&I49I?AQ&J@xrdMDQh8`mr5072fI_*YLZjI`a4{R2rBfi;PU0d+wv{Nv3XP8l zg~DPbtC(XmJI3-)PI7YI=R9-HJ2U*GAFHU~BBBzt{v3U$sf1nJqm3qxBbrgW4^1g+ zb`XLW)UbhK>bw}WT4>tXPaCwbe}|#pMocjj+K=zip@18_{lnlbw1a7bJmzqPM&!Bl zGFZnnX0Y~`!8?XCXGeI#W8`T@#JYtj++i{!y2M%J*O{})=;=&Q$BN!7eKQc+dfMO+ z6DViI=Mibj7>}L~eK?iu{OgTl9?v+5o-U>&7j}!KoaSZ8-VdS8Wl{3(J3q07QH)_b zY7H#(m=MY9+>w0VuMsU&b^jma?U7;@n~_)J=|A`ai$Fo8sHjC=00000NkvXXu0mjf D0dk^j diff --git a/pkg/octicons/icons/star-dark.png b/pkg/octicons/icons/star-dark.png index 12560e9e3588b26ed416ee915ebc752ed7de6926..9156c9b28502645ce9e654f5af04603e05158d24 100644 GIT binary patch literal 509 zcmVQQ+xvLdG2k;1N0$acn(Dj!B%fKs;0($+Jmi~&o4R`=@vD~)rqVu=p z4Zte!2K2}B{hnI|8me)aH}pvwl9ZM-5L-Pe55m5gjaP{8Ng9(>l5``f5L@Sx@@95v zKuXeuJ}2a^0$7lAWM=mj0!@-e-ALS6O9YXW5@0?V02?*WtwsPF&b0+tlr&()3+o?+ zWW)w6Mn-|UYJklzfZF7d!L_OefjI}}LPVT=&3hI?9YrD&0oX~$&V5(^$>FYlUjzI^ zn4Kg78ULOJ2t=67cg3FshE$&8vv|@Uy^acO-m!@UGLo*$tmwq8z`V*A^3tcQU6LGg z?WV#4H~|iUW*`d`{q4#5dh=Y?F^9lOD0#iVlzHG5C;004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKCcQQLc>n+a`AI}UR4C7Vki9NLaU6!9s>Kb6BI!qH6D5tsP#=?9Fko{9 z28~;&(O8?YaSJYjL5GSGNf*R1;S4>G;k3s&1Mh!(-zUHP-!~^29V6!%$MjqD+t6a# zo669q*M^2CgJ=-M~l7V$xz$JxG8|5nl*o@x9M8GYN@QA;1xESfx`1z5z^ucVO!`1ebj0 zA~t*#cyk03U_GYbjGsA;1z!PPJ%S0awk*5_3_S2W1E5vLFcy?Z>PSi@?K;<{q{f1E z%p|=?dUUP_N%zK>XJg?{xh!Ikw9}9@mUJB%F3TKeDlou#$yry;2$(-wD>;b(9|Fb4 z4fL0Q9|s*?O-Voa=>Xd`1c{GT^p5WbuVz8#&jg(s0&k~TVfaJRjlDncbi;NHG|B#4 zd1k;Zu;I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZKRy{5k_ zfkKBpT^vI+&eu+~^*ih!;1;hVUeMTKuQ^d+2g8(mjCm8S!XIck%KhvIaT zcRmvWHHf()oi=Ul}XZO`-nHO67im6X0^zX-#*T)#X z>`XZ_#hHO`#^+Pk-uoEe>%Iwk80+HaIo+%1$in&7_n*gI@#XuIv2?#pzMo+xFVdQ&MBb@06Cm|iU0rr diff --git a/pkg/octicons/icons/star-fill-light.png b/pkg/octicons/icons/star-fill-light.png index 7a29d4b874069030c0f7f24860bb7c347856bd99..fd3621016ee88c2080359e9d3a4942367f50b485 100644 GIT binary patch delta 607 zcmV-l0-*hv0_FrEiBL{Q4GJ0x0000DNk~Le0000O0000O2nGNE0N{5$_>mzLe*zmx zL_t(YiPe=cXcJ)=hM({LYi&ddQL7OYVohSwhPL8RM8vE*ySsD|7e%37uz6zUEF)3{#KlT|e=V)mgXpZF0gTEba0D2&)q4`9uWjw6H+vQ1 z@%Wf+B1^zkpR%o@W8=pnAKLA9cbJC&q|!2%#Y!2v(`1BV&lM-f3$yAbBcEXg@Gw*H5;qZiI@?%ejsafxmGIP@8@=n z>2|a6@gN}zPim#&qe0$xe*|q$UxhIT7*ToY$NL7jLN;uGi~4GYy+ok{bckk1fJ}!C zK=9SrAvSk`*S+;^A8oJ>a=DxhWcnxt-WX4_)ly-hS}H8qDoGJu@aH?UgG^65aMl4# zre{-@Q0|rABl@_yURd)xU1DnX5-LleHvl~4;-*um^zYe~7%|XAo{5Slc_zkV`v5FP}W=#M9002ovPDHLkV1gPN87u$* delta 270 zcmV+p0rCFk1egLLiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyee*n!% zL_t(Ijjhj5NmzLe*(ry zL_t(YiPe)&XcTu8$3JgojLE@*N{tZ<8+UeRe!I)eN)DccT-#pjp@&it1kp>21wpZg zfUOj&C@3n@s_m`4iq}9-o-`qencc*HZG}LIP%kl=-@G1nHCtSFCwTI~z>j&~_x&%l|Ch%{wExf64u5H=ASu5Q|fO^x)o;JabN70S4s6D?_ei-{c+3 zmB5&>ku}mq5q?os0r|qQ_>IQY-~DEDC0NCt06fR)S&MrHa57hOrRXa#TB{8UdKkEs zB-4-DyZ;sBND%DZ^-cnXLSfLg?rC5E*M9%H;o9#2&pO%3LZL9&i$egyf3RM#LRHZ+ zNJ+^`f|P)d07uZ9%?Hy5I|oZ9x}nIIKnDD&Xj5>SpiMy}|O?0ipG*S%Xe+#Wf{W2T)0Xs^36QAoa`o{gf29zrC)oy@Zd?#d=hi7(?I)nhD!?X{ zpK=RWq1Ham^b-(d2Ed}VZvD6HSgL@sHZ<4y)|jyoW5!1Q2TccNe*sn4hyXQ(CkqRA z{{;xcaJz5fvumV_Yow1$mH29*THOiI#ymx+b|dn-2cQbf`u@HT7+5);DqjObz)f0q z4|(c+?pNaTtPcLDtjx$;61?%fj*pLfe=R+K0Xzg92H6Ju=4SeBl1wK6K@bJjkqO`c z=rYI>uxI!1)-98hVUuZ3fjwbdc7&wezJutgg}JGF-Q4+=crPkvKtBe^l;Gj~RHNsL zhTQboiuEqKj{e@5oBE?0@vCYJe^RbQ`)wwl4Y}#FUikO3{sU@^_`|J%7bE}x002ov JPDHLkV1iP*cSQgI delta 336 zcmV-W0k8g%2H653iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyee*q3j zL_t(IjjhtpDuhuO2Jjzq5Av@JValkSg;^}QnNuu z7MLc(;(OI;`esC)dOPPl&+|T=^Sxg|cWht|$3OUTF^qRKF!Gmx?PzYq{#WS7D|WDp zHw@(&dy;)0CNY6kti%~EaD)R~f5!R#yKxzHd?wYvW)i*?TX^!DE{Ap#-drrm-nW*ct%tUllD%!F!C22@ z9f*RngzFeEjSoD^rf`K@+5hkyTDjBp;ZQcN7c{XK)eNo?o{l(`jc6aGCWJ2q*TPA+ ifO%B9=#}vNAHDzs7DLDL8bZ(j0000GG=gs%++c$5eUj#4!uH?rCsKv026;cfT&rhCnxjpfHqLrkx zq?s!rxRTIYI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZL6Q%0xX z1BH%zx;TbtoUfg*G51h_K%4y?wp8ZD>S_mAnO&5u4H%O8I${&Jl*BcJVuO}-&iUdf z#`B<`$^K7A;Ja1UwdLRM+fVqf%sfqIA8tNld&SmzJm51PSR$NriW|&1hxUEDqS*skynS9eek$f0`FF cyL_&(fX?Z~QFVdQ&MBb@05TtbNdN!< diff --git a/pkg/octicons/icons/tag-light.png b/pkg/octicons/icons/tag-light.png index 9b000b5c2b1a7c6b1fed8b63a815c121691ec0bc..cead91700ea0e81d4155a84d2df476bea6b62789 100644 GIT binary patch delta 453 zcmV;$0XqJm0?h*mzLe*uC? zL_t(YiN(~-F2qn6#_|6-O@tMfFrk_;lQCjr>*Eqwij~a93LC80uw>y?9~L z(=@{sxB-iEUK^cEhPJ0O#ItPQKEF17TlnKB0KYPGh{!fDlr!Jd#xBS4b5snNs(+xk zL%7Wv7FYxDj9qj^5`%>XOjf4n20>B*Z+LVaiV;2F8r>`cevwjEAf5xsPCw>D_ zFs7{8?Et;{Ac*yJ0~itEp#vm{2=fZWdiuuYEA5S6sUHEGASbU;cnV)z)SZ6*H=S}} z2jryPdfH5me*^kK(#lhTB1l$wCg6hPmFEIkh)cN>@Dl>8x|BNu06|bI8&6*;7z0Lt v<8~|D%Dc`P0GO!G`pTF+8-e>|&;LE2ntta?B-Y?g^p=sE3_} z&9I+lArFRy`FMZco0;XGG{FwXY#p#d5gD)2cZUxw8s?AK;~tv`bi_26-QgQwxXp*x z5wWIsJfM>j{(?k+S1dEg2se09Y&(+(a8TB&>n$berX)pfcnV;-2Kd1my=rrnHU}*r zTgfjuL+L@m!QV(;? cG#nV50LGj;GOu!*(f|Me07*qoM6N<$f=dT-#{d8T diff --git a/pkg/octicons/icons/tools-dark.png b/pkg/octicons/icons/tools-dark.png index a0991b257d7f7dddd9d000753aa08ae3bb6942d1..2cf9080c7b866f28ff7509520fde6cfce49f2b72 100644 GIT binary patch literal 521 zcmV+k0`~ohP)Qq|VE7+w8 z#zq7YQA-gFl3I||`Y&h|K?^mCKT;(tVGYL5!n-;QZ{E(jY92ofu9O&OP%Xi{EmO(apc(qXEv~f$hVt{PpiMwyYZ|#pWw|0 zR;c%*XR4QYp}tjLszXf-Vm+k3Qs1aWnYW|TcL6vG+$@S>v(d;vaBl&}fb%(nDPRM5 z)>OO{Pk|0Foik_w?~9`7lxnNMq<7MAYFB|rz_NNh zYBzwLz~u_J4eYCq_BYf;^=qO&sxJ92mekP%Z&iJgGq@H4$7}Ejb-V^U5xrM(28Y$3 z>b+W0eeVNxLp{)oxS;+}&-NjHPTf==HX$EWKdLKr$5G)=sGowL-+ifRT>TOwU(E0> z1?RIm)=0e6+)`h}*Yb1%KNHwz~IyIfCT>lMyG2Du3aGT8Pb`T#7GKB6_?HL%h{V|(K_k-wm`7Q+=B00000 LNkvXXu0mjf(!T3r literal 383 zcmV-_0f7FAP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0RM-N%)bBt00(qQ zO+^Rk3=bAKC(1I*?*IS*`AI}UR4C77kTFUFK^R6~mepV&gp{#LtDQCx?9yl<9zfF> zMMMvf!>CnmpygIU#l*Gr8oCO)X?zyWZdRNhhL1Oof$vAcM0U&EH7as}I;QHCh}UXr zrz$M_Y-VCEVs2t)>XJwVz%d&fFrf}Woe76*G6aG!V9G7kbHj|mLRjMtcm?|OL%L@j zAO=8cz?c&f;DvFZKuv%LB6>iBBjA!x;E6fggcfJ&UbzLtef6|jbLN{n<@2tYkH0kw zwCdEkJrTE@JN>&T#I`yTaiq2j9+k}nz5vL9?*cD`Ch!5_ZvGcmO5q)7RDKQmzLe*)e~ zL_t(YiM5r%YaDeH$3O2kTMgPQC?XU=4ZEA!*^RrK7OZ#>gdW<`de>9&qV!Oa7TQZG z_8@{-gq%IK6-z7|o|$d^T;Ol(MJ1{ux0QMP&|$ye$T6@&VPWKllB@Jx9B zi2;>|COnt90b=V0uMA4de^K)rPi@BF25&l)4knFLc_s zn`xeDd=mI;kN*92CZH3|-vhZS!iUA6_C{JzS{2HTH!(f{x!P*AfBwh>0I(@%fOSl+ zPx&*o?ZT(4vvm=>j`3U0dgq4y5x~;Y{CceMQG`97^KO>PwRf|^OXbFUs`>-q6g@gT zefkDKr+vGrF84a{qlsK8RU3`ro?=kjZ(^4bZmP>2Txl&Xre$URu2;fat7>`*aKu^| z_QjY2oT`4b65d+PdCJKIBxY_efFTcuJtO%boyfD}Gsc$YAGf6e63ryPdw^%jb?NlM zh$o3ASmu?wEkH~r0aS7$8z|mm&Fvn5SstM8Hbwx?Y-vt+e?*F`f<>!~<&h%_!^(Yx hmYV!JcF6y`{sB)88Yjqv9LWFx002ovPDHLkV1jdefc^jg delta 355 zcmV-p0i6D+2J8YMiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyee*qy$ zL_t(Ijg8X3E<{lf2Jjz(*hI0(HdI%^>002ovPDHLkV1gNI BomBt; diff --git a/pkg/octicons/icons/workflow-dark.png b/pkg/octicons/icons/workflow-dark.png index d14097483db823bdc5ddb8b61a5f1e8605304905..f1339416fc75f8d603ef7f44a35f9f79e6f12fb2 100644 GIT binary patch literal 375 zcmV--0f_#IP)UF2#j z7z}`S;6B1z0ZxEpN&PlEui|w1lkkuI3UeDF8 z2dw~(fVJ>`3+Mvp;rRo&ll0WepkYTPa3(2M-vG9O`H1cta3!f)$W0W)AAm_~d%$6v zF4_s=9Yp|K0(%f|)6bB0v7uG~NE#+W41uMT!DG0dMogxIZP~s}_3VW8WzA_kC`q<` z!1qCI0?T9Nx`k(h@pM1o%=}xFJqN%5!1e|38sY5MylmJm!Vf@|=z(Y3y;cUf_yRr@ V|08>sv={&Y002ovPDHLkV1jO)qv!wt literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf66p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>dx@v7EBi|xelZL6Q%0xX z1BK>#x;TbtoL@R&q39t45!ZZ6*#=nw4jHND6|P2%C%JC?%4LCUQM-Iqy+@Uft$9o=!>+i}SeLy^&ZfUxu*>4nk>=OoH8+?Y63)(Z-DUl)(Q9XO j;bWcyeW97(9ZT~sOHJd`i;j&4I+VfF)z4*}Q$iB}A=zl` diff --git a/pkg/octicons/icons/workflow-light.png b/pkg/octicons/icons/workflow-light.png index d89bd913d31233460c25bb016cac2a20839f24b4..6930f846d22c0ec7845844496bd6d7b15f080ee6 100644 GIT binary patch delta 492 zcmVmzLe*vjU zL_t(YiS3jzOIuMC$A9PMsniMu9kr9sk{8ey40O@SrGajxopiQB$!9QY2Rk^`AzNk# z1>;xf6obS-dF_%(kbs~8lgB$9B31Cd(i_Pjc$UjO=YP)ca{1p2BMt#r2=eb0-2-M* zbUjoKh_5!HD7tY0cmS&U9ianMe{CX#S0cK_*yJ%#aRwmFAySFXPReOQKM1!F^V(%N zfN^bj20UFrPZFI@6J@j6832;R=?%c0O%D}Heh`*yqIj_MO(t_R9H4i-&iKnClsC7) zRg@Lr>tM^37<2fuS#P)k#Fq4P`7)~8QLACE2TRK;tcgm-K2|U2cdJnpf8BVlC-Q@( zWso1D{G(UEn<@gIoB=5B5WEQ!&orCOj!m+V4R=-aGo;v5l|DeBP#AkqG-d)IZ8(4$ z=>X&D0H_08UdJUX#38I#^t*LZn-9W$5q2)S@s1ya_vrd~0HD8GjgRxW#iAtg7LgZ! zD|Z%t6kq^3JFNk=`$<2SLN9~YxD!q9uCm&R`I5ah<@SL iik4`r(M{*s!^9sr4TiRKupPnx0000L?J`z z{TE7Xznvx*8C;0Jh1grRB+{VJMP0U{{Ys5xhe2=I!W9m<;oKT^FxYT~5({iFZRz%X p2BRVO02MAc2HYC+$ou_edjg&0G;mG0$m;+A002ovPDHLkV1kT`U9JEC diff --git a/pkg/octicons/octicons.go b/pkg/octicons/octicons.go index 8cd644375..5353b81f9 100644 --- a/pkg/octicons/octicons.go +++ b/pkg/octicons/octicons.go @@ -38,7 +38,7 @@ func DataURI(name string, theme Theme) string { } // Icons returns MCP Icon objects for the given octicon name in light and dark themes. -// Icons are embedded as 16x16 PNG data URIs for offline use and faster loading. +// Icons are embedded as 24x24 PNG data URIs for offline use and faster loading. // The name should be the base octicon name without size suffix (e.g., "repo" not "repo-16"). // See https://primer.style/foundations/icons for available icons. func Icons(name string) []mcp.Icon { @@ -49,13 +49,13 @@ func Icons(name string) []mcp.Icon { { Source: DataURI(name, ThemeLight), MIMEType: "image/png", - Sizes: []string{"16x16"}, + Sizes: []string{"24x24"}, Theme: string(ThemeLight), }, { Source: DataURI(name, ThemeDark), MIMEType: "image/png", - Sizes: []string{"16x16"}, + Sizes: []string{"24x24"}, Theme: string(ThemeDark), }, } diff --git a/pkg/octicons/octicons_test.go b/pkg/octicons/octicons_test.go index bd8b79b57..ede2a2e6e 100644 --- a/pkg/octicons/octicons_test.go +++ b/pkg/octicons/octicons_test.go @@ -86,13 +86,13 @@ func TestIcons(t *testing.T) { // Verify first icon is light theme assert.Equal(t, DataURI(tc.icon, ThemeLight), result[0].Source) assert.Equal(t, "image/png", result[0].MIMEType) - assert.Equal(t, []string{"16x16"}, result[0].Sizes) + assert.Equal(t, []string{"24x24"}, result[0].Sizes) assert.Equal(t, "light", result[0].Theme) // Verify second icon is dark theme assert.Equal(t, DataURI(tc.icon, ThemeDark), result[1].Source) assert.Equal(t, "image/png", result[1].MIMEType) - assert.Equal(t, []string{"16x16"}, result[1].Sizes) + assert.Equal(t, []string{"24x24"}, result[1].Sizes) assert.Equal(t, "dark", result[1].Theme) }) } diff --git a/script/fetch-icons b/script/fetch-icons index bfd3970fe..1639d766b 100755 --- a/script/fetch-icons +++ b/script/fetch-icons @@ -1,7 +1,8 @@ #!/bin/bash # Fetch Octicon icons and convert them to PNG for embedding in the MCP server. # Generates both light theme (dark icons) and dark theme (white icons) variants. -# Requires: rsvg-convert (from librsvg2-bin on Ubuntu/Debian), ImageMagick (convert) +# Uses sed to modify SVG fill color before converting to PNG. +# Requires: rsvg-convert (from librsvg2-bin on Ubuntu/Debian) # # Usage: # script/fetch-icons # Fetch all default icons @@ -52,14 +53,6 @@ if ! command -v rsvg-convert &> /dev/null; then exit 1 fi -# Check for ImageMagick convert -if ! command -v convert &> /dev/null; then - echo "Error: ImageMagick convert not found. Install with:" - echo " Ubuntu/Debian: sudo apt-get install imagemagick" - echo " macOS: brew install imagemagick" - exit 1 -fi - # Use provided icons or defaults if [ $# -gt 0 ]; then ICONS=("$@") @@ -70,24 +63,29 @@ fi # Ensure icons directory exists mkdir -p "$ICONS_DIR" -echo "Fetching ${#ICONS[@]} icons (light + dark themes)..." +echo "Fetching ${#ICONS[@]} icons (24px, light + dark themes)..." for icon in "${ICONS[@]}"; do - svg_url="${OCTICONS_BASE}/${icon}-16.svg" + svg_url="${OCTICONS_BASE}/${icon}-24.svg" light_file="${ICONS_DIR}/${icon}-light.png" dark_file="${ICONS_DIR}/${icon}-dark.png" echo " ${icon} (light + dark)" - # Download SVG and convert to PNG (light theme - dark icons for light backgrounds) - if curl -sfL "$svg_url" | rsvg-convert -o "$light_file" 2>/dev/null; then - # Create dark theme variant (invert colors for dark backgrounds) - # -channel RGB inverts only color channels, preserving alpha - convert "$light_file" -channel RGB -negate "$dark_file" - else - echo " Warning: Failed to fetch ${icon}-16.svg (may not exist)" - rm -f "$light_file" "$dark_file" - fi + # Download SVG + svg_content=$(curl -sfL "$svg_url" 2>/dev/null) || { + echo " Warning: Failed to fetch ${icon}-24.svg (may not exist)" + continue + } + + # Light theme: dark icons (#24292f) for light backgrounds + # Add fill attribute to the svg tag + light_svg=$(echo "$svg_content" | sed 's/ Date: Tue, 16 Dec 2025 00:06:37 +0100 Subject: [PATCH 11/21] Add specific icons for each repository resource type - repository_content: repo icon - repository_content_branch: git-branch icon - repository_content_commit: git-commit icon (new) - repository_content_tag: tag icon - repository_content_pr: git-pull-request icon Resources now have explicit icons set rather than relying on toolset fallback. --- pkg/github/repository_resource.go | 6 ++++++ pkg/inventory/registry.go | 18 ++++++++++++++++-- pkg/octicons/icons/git-commit-dark.png | Bin 0 -> 324 bytes pkg/octicons/icons/git-commit-light.png | Bin 0 -> 448 bytes pkg/octicons/octicons_test.go | 2 +- script/fetch-icons | 1 + 6 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 pkg/octicons/icons/git-commit-dark.png create mode 100644 pkg/octicons/icons/git-commit-light.png diff --git a/pkg/github/repository_resource.go b/pkg/github/repository_resource.go index 9a937a8ca..ee43e9d04 100644 --- a/pkg/github/repository_resource.go +++ b/pkg/github/repository_resource.go @@ -14,6 +14,7 @@ import ( "strings" "github.com/github/github-mcp-server/pkg/inventory" + "github.com/github/github-mcp-server/pkg/octicons" "github.com/github/github-mcp-server/pkg/raw" "github.com/github/github-mcp-server/pkg/translations" "github.com/google/go-github/v79/github" @@ -37,6 +38,7 @@ func GetRepositoryResourceContent(t translations.TranslationHelperFunc) inventor Name: "repository_content", URITemplate: repositoryResourceContentURITemplate.Raw(), Description: t("RESOURCE_REPOSITORY_CONTENT_DESCRIPTION", "Repository Content"), + Icons: octicons.Icons("repo"), }, repositoryResourceContentsHandlerFunc(repositoryResourceContentURITemplate), ) @@ -50,6 +52,7 @@ func GetRepositoryResourceBranchContent(t translations.TranslationHelperFunc) in Name: "repository_content_branch", URITemplate: repositoryResourceBranchContentURITemplate.Raw(), Description: t("RESOURCE_REPOSITORY_CONTENT_BRANCH_DESCRIPTION", "Repository Content for specific branch"), + Icons: octicons.Icons("git-branch"), }, repositoryResourceContentsHandlerFunc(repositoryResourceBranchContentURITemplate), ) @@ -63,6 +66,7 @@ func GetRepositoryResourceCommitContent(t translations.TranslationHelperFunc) in Name: "repository_content_commit", URITemplate: repositoryResourceCommitContentURITemplate.Raw(), Description: t("RESOURCE_REPOSITORY_CONTENT_COMMIT_DESCRIPTION", "Repository Content for specific commit"), + Icons: octicons.Icons("git-commit"), }, repositoryResourceContentsHandlerFunc(repositoryResourceCommitContentURITemplate), ) @@ -76,6 +80,7 @@ func GetRepositoryResourceTagContent(t translations.TranslationHelperFunc) inven Name: "repository_content_tag", URITemplate: repositoryResourceTagContentURITemplate.Raw(), Description: t("RESOURCE_REPOSITORY_CONTENT_TAG_DESCRIPTION", "Repository Content for specific tag"), + Icons: octicons.Icons("tag"), }, repositoryResourceContentsHandlerFunc(repositoryResourceTagContentURITemplate), ) @@ -89,6 +94,7 @@ func GetRepositoryResourcePrContent(t translations.TranslationHelperFunc) invent Name: "repository_content_pr", URITemplate: repositoryResourcePrContentURITemplate.Raw(), Description: t("RESOURCE_REPOSITORY_CONTENT_PR_DESCRIPTION", "Repository Content for specific pull request"), + Icons: octicons.Icons("git-pull-request"), }, repositoryResourceContentsHandlerFunc(repositoryResourcePrContentURITemplate), ) diff --git a/pkg/inventory/registry.go b/pkg/inventory/registry.go index 204a92d9c..f3691e38a 100644 --- a/pkg/inventory/registry.go +++ b/pkg/inventory/registry.go @@ -178,17 +178,31 @@ func (r *Inventory) RegisterTools(ctx context.Context, s *mcp.Server, deps any) // RegisterResourceTemplates registers all available resource templates with the server. // The context is used for feature flag evaluation. +// Icons are automatically applied from the toolset metadata if not already set. func (r *Inventory) RegisterResourceTemplates(ctx context.Context, s *mcp.Server, deps any) { for _, res := range r.AvailableResourceTemplates(ctx) { - s.AddResourceTemplate(&res.Template, res.Handler(deps)) + // Make a shallow copy to avoid mutating the original + templateCopy := res.Template + // Apply icons from toolset metadata if not already set + if len(templateCopy.Icons) == 0 { + templateCopy.Icons = res.Toolset.Icons() + } + s.AddResourceTemplate(&templateCopy, res.Handler(deps)) } } // RegisterPrompts registers all available prompts with the server. // The context is used for feature flag evaluation. +// Icons are automatically applied from the toolset metadata if not already set. func (r *Inventory) RegisterPrompts(ctx context.Context, s *mcp.Server) { for _, prompt := range r.AvailablePrompts(ctx) { - s.AddPrompt(&prompt.Prompt, prompt.Handler) + // Make a shallow copy to avoid mutating the original + promptCopy := prompt.Prompt + // Apply icons from toolset metadata if not already set + if len(promptCopy.Icons) == 0 { + promptCopy.Icons = prompt.Toolset.Icons() + } + s.AddPrompt(&promptCopy, prompt.Handler) } } diff --git a/pkg/octicons/icons/git-commit-dark.png b/pkg/octicons/icons/git-commit-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..69f72a47b9cc717c48a5feb87d8b9d2302c1c769 GIT binary patch literal 324 zcmV-K0lWT*P)Wp&6qmOVIFr<{=c{vWbCeB$ zD$oT!_~sqx0M(-672w%KdqB&gXSpG8TEyVqgl;lww^q9=Vh{r(Pkju`d>SVyu^&hZ zBt@S2NK%-d1LCiS-TOUA3R41YNi~l_P0~uzV=5nK^zH);fF*FAQM&-%fPOBqUkn1^ z6LviLNDGT52Nc$vL<9`|2en|AsBq W&g{A*eS}Q_0000(zw#5lvH`gg|rmHgH#6xe$&nQ&i8%y4i~0O zxh*p3;)3Tz!<}v#;CCzXx!FAabteU}*h(Zk`*Rbd07QD@Ho|u2d-UD7qQC;r^JZG@ ztB)Y7i0+Bc0f0I@L*)g+QS9+tzEmn*Px6`}Ov-K;*Xom0?$w|cU$O<`S~YI&?SF*> z7}r*eYd;0(Cvi7d4$64Y9|mNGSM>cTvm(c!Z;WeoKsx_gD`)>H5S1+z%?>QSR-E}! z1r9o|&;qvm=b}>ia~@>|Fs}UoTh@^<%ie@9;#3b${70(Ogj4 Date: Wed, 17 Dec 2025 10:26:35 +0100 Subject: [PATCH 12/21] fix: restore Icon fields to toolset metadata and add icons to docs - Add Icon field to all ToolsetMetadata definitions (lost during rebase conflict resolution) - Update doc generator to include Octicon icons in toolsets table - Update doc generator to include icons in tool section headers - Use Primer Octicons CDN for GitHub markdown compatibility --- README.md | 76 +++++++++++++------------- cmd/github-mcp-server/generate_docs.go | 31 +++++++++-- pkg/github/tools.go | 23 ++++++++ 3 files changed, 86 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 0e96526f7..ede2e14bc 100644 --- a/README.md +++ b/README.md @@ -453,26 +453,26 @@ GITHUB_TOOLSETS="default,stargazers" ./github-mcp-server The following sets of tools are available: -| Toolset | Description | -| ----------------------- | ------------------------------------------------------------- | -| `context` | **Strongly recommended**: Tools that provide context about the current user and GitHub context you are operating in | -| `actions` | GitHub Actions workflows and CI/CD operations | -| `code_security` | Code security related tools, such as GitHub Code Scanning | -| `dependabot` | Dependabot tools | -| `discussions` | GitHub Discussions related tools | -| `gists` | GitHub Gist related tools | -| `git` | GitHub Git API related tools for low-level Git operations | -| `issues` | GitHub Issues related tools | -| `labels` | GitHub Labels related tools | -| `notifications` | GitHub Notifications related tools | -| `orgs` | GitHub Organization related tools | -| `projects` | GitHub Projects related tools | -| `pull_requests` | GitHub Pull Request related tools | -| `repos` | GitHub Repository related tools | -| `secret_protection` | Secret protection related tools, such as GitHub Secret Scanning | -| `security_advisories` | Security advisories related tools | -| `stargazers` | GitHub Stargazers related tools | -| `users` | GitHub User related tools | +| | Toolset | Description | +| --- | ----------------------- | ------------------------------------------------------------- | +| person | `context` | **Strongly recommended**: Tools that provide context about the current user and GitHub context you are operating in | +| workflow | `actions` | GitHub Actions workflows and CI/CD operations | +| codescan | `code_security` | Code security related tools, such as GitHub Code Scanning | +| dependabot | `dependabot` | Dependabot tools | +| comment-discussion | `discussions` | GitHub Discussions related tools | +| logo-gist | `gists` | GitHub Gist related tools | +| git-branch | `git` | GitHub Git API related tools for low-level Git operations | +| issue-opened | `issues` | GitHub Issues related tools | +| tag | `labels` | GitHub Labels related tools | +| bell | `notifications` | GitHub Notifications related tools | +| organization | `orgs` | GitHub Organization related tools | +| project | `projects` | GitHub Projects related tools | +| git-pull-request | `pull_requests` | GitHub Pull Request related tools | +| repo | `repos` | GitHub Repository related tools | +| shield-lock | `secret_protection` | Secret protection related tools, such as GitHub Secret Scanning | +| shield | `security_advisories` | Security advisories related tools | +| star | `stargazers` | GitHub Stargazers related tools | +| people | `users` | GitHub User related tools | ### Additional Toolsets in Remote GitHub MCP Server @@ -488,7 +488,7 @@ The following sets of tools are available:
-Actions +workflow Actions - **cancel_workflow_run** - Cancel workflow run - `owner`: Repository owner (string, required) @@ -582,7 +582,7 @@ The following sets of tools are available:
-Code Security +codescan Code Security - **get_code_scanning_alert** - Get code scanning alert - `alertNumber`: The number of the alert. (number, required) @@ -601,7 +601,7 @@ The following sets of tools are available:
-Context +person Context - **get_me** - Get my user profile - No parameters required @@ -617,7 +617,7 @@ The following sets of tools are available:
-Dependabot +dependabot Dependabot - **get_dependabot_alert** - Get dependabot alert - `alertNumber`: The number of the alert. (number, required) @@ -634,7 +634,7 @@ The following sets of tools are available:
-Discussions +comment-discussion Discussions - **get_discussion** - Get discussion - `discussionNumber`: Discussion Number (number, required) @@ -665,7 +665,7 @@ The following sets of tools are available:
-Gists +logo-gist Gists - **create_gist** - Create Gist - `content`: Content for simple single-file gist creation (string, required) @@ -692,7 +692,7 @@ The following sets of tools are available:
-Git +git-branch Git - **get_repository_tree** - Get repository tree - `owner`: Repository owner (username or organization) (string, required) @@ -705,7 +705,7 @@ The following sets of tools are available:
-Issues +issue-opened Issues - **add_issue_comment** - Add comment to issue - `body`: Comment content (string, required) @@ -798,7 +798,7 @@ The following sets of tools are available:
-Labels +tag Labels - **get_label** - Get a specific label from a repository. - `name`: Label name. (string, required) @@ -822,7 +822,7 @@ The following sets of tools are available:
-Notifications +bell Notifications - **dismiss_notification** - Dismiss notification - `state`: The new state of the notification (read/done) (string, required) @@ -858,7 +858,7 @@ The following sets of tools are available:
-Organizations +organization Organizations - **search_orgs** - Search organizations - `order`: Sort order (string, optional) @@ -871,7 +871,7 @@ The following sets of tools are available:
-Projects +project Projects - **add_project_item** - Add project item - `item_id`: The numeric ID of the issue or pull request to add to the project. (number, required) @@ -941,7 +941,7 @@ The following sets of tools are available:
-Pull Requests +git-pull-request Pull Requests - **add_comment_to_pending_review** - Add review comment to the requester's latest pending pull request review - `body`: The text of the review comment (string, required) @@ -1046,7 +1046,7 @@ The following sets of tools are available:
-Repositories +repo Repositories - **create_branch** - Create branch - `branch`: Name for new branch (string, required) @@ -1163,7 +1163,7 @@ The following sets of tools are available:
-Secret Protection +shield-lock Secret Protection - **get_secret_scanning_alert** - Get secret scanning alert - `alertNumber`: The number of the alert. (number, required) @@ -1181,7 +1181,7 @@ The following sets of tools are available:
-Security Advisories +shield Security Advisories - **get_global_security_advisory** - Get a global security advisory - `ghsaId`: GitHub Security Advisory ID (format: GHSA-xxxx-xxxx-xxxx). (string, required) @@ -1216,7 +1216,7 @@ The following sets of tools are available:
-Stargazers +star Stargazers - **list_starred_repositories** - List starred repositories - `direction`: The direction to sort the results by. (string, optional) @@ -1237,7 +1237,7 @@ The following sets of tools are available:
-Users +people Users - **search_users** - Search users - `order`: Sort order (string, optional) diff --git a/cmd/github-mcp-server/generate_docs.go b/cmd/github-mcp-server/generate_docs.go index a206c9c7e..c20f45752 100644 --- a/cmd/github-mcp-server/generate_docs.go +++ b/cmd/github-mcp-server/generate_docs.go @@ -104,20 +104,33 @@ func generateRemoteServerDocs(docsPath string) error { return os.WriteFile(docsPath, []byte(updatedContent), 0600) //#nosec G306 } +// octiconImg returns an img tag for an Octicon that works with GitHub's light/dark theme. +// Uses the official Primer Octicons CDN. +func octiconImg(name string) string { + if name == "" { + return "" + } + // Use GitHub's Octicon CDN with 16px size + return fmt.Sprintf(`%s`, name, name) +} + func generateToolsetsDoc(i *inventory.Inventory) string { var buf strings.Builder - // Add table header and separator - buf.WriteString("| Toolset | Description |\n") - buf.WriteString("| ----------------------- | ------------------------------------------------------------- |\n") + // Add table header and separator (with icon column) + buf.WriteString("| | Toolset | Description |\n") + buf.WriteString("| --- | ----------------------- | ------------------------------------------------------------- |\n") // Add the context toolset row with custom description (strongly recommended) - buf.WriteString("| `context` | **Strongly recommended**: Tools that provide context about the current user and GitHub context you are operating in |\n") + // Get context toolset for its icon + contextIcon := octiconImg("person") + fmt.Fprintf(&buf, "| %s | `context` | **Strongly recommended**: Tools that provide context about the current user and GitHub context you are operating in |\n", contextIcon) // AvailableToolsets() returns toolsets that have tools, sorted by ID // Exclude context (custom description above) and dynamic (internal only) for _, ts := range i.AvailableToolsets("context", "dynamic") { - fmt.Fprintf(&buf, "| `%s` | %s |\n", ts.ID, ts.Description) + icon := octiconImg(ts.Icon) + fmt.Fprintf(&buf, "| %s | `%s` | %s |\n", icon, ts.ID, ts.Description) } return strings.TrimSuffix(buf.String(), "\n") @@ -134,6 +147,7 @@ func generateToolsDoc(r *inventory.Inventory) string { var buf strings.Builder var toolBuf strings.Builder var currentToolsetID inventory.ToolsetID + var currentToolsetIcon string firstSection := true writeSection := func() { @@ -145,7 +159,11 @@ func generateToolsDoc(r *inventory.Inventory) string { } firstSection = false sectionName := formatToolsetName(string(currentToolsetID)) - fmt.Fprintf(&buf, "
\n\n%s\n\n%s\n\n
", sectionName, strings.TrimSuffix(toolBuf.String(), "\n\n")) + icon := octiconImg(currentToolsetIcon) + if icon != "" { + icon += " " + } + fmt.Fprintf(&buf, "
\n\n%s%s\n\n%s\n\n
", icon, sectionName, strings.TrimSuffix(toolBuf.String(), "\n\n")) toolBuf.Reset() } @@ -154,6 +172,7 @@ func generateToolsDoc(r *inventory.Inventory) string { if tool.Toolset.ID != currentToolsetID { writeSection() currentToolsetID = tool.Toolset.ID + currentToolsetIcon = tool.Toolset.Icon } writeToolDoc(&toolBuf, tool.Tool) toolBuf.WriteString("\n\n") diff --git a/pkg/github/tools.go b/pkg/github/tools.go index 62d2d8664..48298afbd 100644 --- a/pkg/github/tools.go +++ b/pkg/github/tools.go @@ -15,99 +15,122 @@ type GetGQLClientFn func(context.Context) (*githubv4.Client, error) // Toolset metadata constants - these define all available toolsets and their descriptions. // Tools use these constants to declare which toolset they belong to. +// Icons are Octicon names from https://primer.style/foundations/icons var ( ToolsetMetadataAll = inventory.ToolsetMetadata{ ID: "all", Description: "Special toolset that enables all available toolsets", + Icon: "apps", } ToolsetMetadataDefault = inventory.ToolsetMetadata{ ID: "default", Description: "Special toolset that enables the default toolset configuration. When no toolsets are specified, this is the set that is enabled", + Icon: "check-circle", } ToolsetMetadataContext = inventory.ToolsetMetadata{ ID: "context", Description: "Tools that provide context about the current user and GitHub context you are operating in", Default: true, + Icon: "person", } ToolsetMetadataRepos = inventory.ToolsetMetadata{ ID: "repos", Description: "GitHub Repository related tools", Default: true, + Icon: "repo", } ToolsetMetadataGit = inventory.ToolsetMetadata{ ID: "git", Description: "GitHub Git API related tools for low-level Git operations", + Icon: "git-branch", } ToolsetMetadataIssues = inventory.ToolsetMetadata{ ID: "issues", Description: "GitHub Issues related tools", Default: true, + Icon: "issue-opened", } ToolsetMetadataPullRequests = inventory.ToolsetMetadata{ ID: "pull_requests", Description: "GitHub Pull Request related tools", Default: true, + Icon: "git-pull-request", } ToolsetMetadataUsers = inventory.ToolsetMetadata{ ID: "users", Description: "GitHub User related tools", Default: true, + Icon: "people", } ToolsetMetadataOrgs = inventory.ToolsetMetadata{ ID: "orgs", Description: "GitHub Organization related tools", + Icon: "organization", } ToolsetMetadataActions = inventory.ToolsetMetadata{ ID: "actions", Description: "GitHub Actions workflows and CI/CD operations", + Icon: "workflow", } ToolsetMetadataCodeSecurity = inventory.ToolsetMetadata{ ID: "code_security", Description: "Code security related tools, such as GitHub Code Scanning", + Icon: "codescan", } ToolsetMetadataSecretProtection = inventory.ToolsetMetadata{ ID: "secret_protection", Description: "Secret protection related tools, such as GitHub Secret Scanning", + Icon: "shield-lock", } ToolsetMetadataDependabot = inventory.ToolsetMetadata{ ID: "dependabot", Description: "Dependabot tools", + Icon: "dependabot", } ToolsetMetadataNotifications = inventory.ToolsetMetadata{ ID: "notifications", Description: "GitHub Notifications related tools", + Icon: "bell", } ToolsetMetadataExperiments = inventory.ToolsetMetadata{ ID: "experiments", Description: "Experimental features that are not considered stable yet", + Icon: "beaker", } ToolsetMetadataDiscussions = inventory.ToolsetMetadata{ ID: "discussions", Description: "GitHub Discussions related tools", + Icon: "comment-discussion", } ToolsetMetadataGists = inventory.ToolsetMetadata{ ID: "gists", Description: "GitHub Gist related tools", + Icon: "logo-gist", } ToolsetMetadataSecurityAdvisories = inventory.ToolsetMetadata{ ID: "security_advisories", Description: "Security advisories related tools", + Icon: "shield", } ToolsetMetadataProjects = inventory.ToolsetMetadata{ ID: "projects", Description: "GitHub Projects related tools", + Icon: "project", } ToolsetMetadataStargazers = inventory.ToolsetMetadata{ ID: "stargazers", Description: "GitHub Stargazers related tools", + Icon: "star", } ToolsetMetadataDynamic = inventory.ToolsetMetadata{ ID: "dynamic", Description: "Discover GitHub MCP tools that can help achieve tasks by enabling additional sets of tools, you can control the enablement of any toolset to access its tools when this toolset is enabled.", + Icon: "tools", } ToolsetLabels = inventory.ToolsetMetadata{ ID: "labels", Description: "GitHub Labels related tools", + Icon: "tag", } ) From 6f1f609837c3199bcb44400264627f4c36c23c4c Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Wed, 17 Dec 2025 10:28:12 +0100 Subject: [PATCH 13/21] feat: add icons to individual tools in documentation --- README.md | 190 ++++++++++++------------- cmd/github-mcp-server/generate_docs.go | 12 +- 2 files changed, 103 insertions(+), 99 deletions(-) diff --git a/README.md b/README.md index ede2e14bc..4ba28a7d7 100644 --- a/README.md +++ b/README.md @@ -490,22 +490,22 @@ The following sets of tools are available: workflow Actions -- **cancel_workflow_run** - Cancel workflow run +- workflow **cancel_workflow_run** - Cancel workflow run - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- **delete_workflow_run_logs** - Delete workflow logs +- workflow **delete_workflow_run_logs** - Delete workflow logs - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- **download_workflow_run_artifact** - Download workflow artifact +- workflow **download_workflow_run_artifact** - Download workflow artifact - `artifact_id`: The unique identifier of the artifact (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- **get_job_logs** - Get job logs +- workflow **get_job_logs** - Get job logs - `failed_only`: When true, gets logs for all failed jobs in run_id (boolean, optional) - `job_id`: The unique identifier of the workflow job (required for single job logs) (number, optional) - `owner`: Repository owner (string, required) @@ -514,22 +514,22 @@ The following sets of tools are available: - `run_id`: Workflow run ID (required when using failed_only) (number, optional) - `tail_lines`: Number of lines to return from the end of the log (number, optional) -- **get_workflow_run** - Get workflow run +- workflow **get_workflow_run** - Get workflow run - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- **get_workflow_run_logs** - Get workflow run logs +- workflow **get_workflow_run_logs** - Get workflow run logs - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- **get_workflow_run_usage** - Get workflow usage +- workflow **get_workflow_run_usage** - Get workflow usage - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- **list_workflow_jobs** - List workflow jobs +- workflow **list_workflow_jobs** - List workflow jobs - `filter`: Filters jobs by their completed_at timestamp (string, optional) - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) @@ -537,14 +537,14 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- **list_workflow_run_artifacts** - List workflow artifacts +- workflow **list_workflow_run_artifacts** - List workflow artifacts - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- **list_workflow_runs** - List workflow runs +- workflow **list_workflow_runs** - List workflow runs - `actor`: Returns someone's workflow runs. Use the login for the user who created the workflow run. (string, optional) - `branch`: Returns workflow runs associated with a branch. Use the name of the branch. (string, optional) - `event`: Returns workflow runs for a specific event type (string, optional) @@ -555,23 +555,23 @@ The following sets of tools are available: - `status`: Returns workflow runs with the check run status (string, optional) - `workflow_id`: The workflow ID or workflow file name (string, required) -- **list_workflows** - List workflows +- workflow **list_workflows** - List workflows - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- **rerun_failed_jobs** - Rerun failed jobs +- workflow **rerun_failed_jobs** - Rerun failed jobs - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- **rerun_workflow_run** - Rerun workflow run +- workflow **rerun_workflow_run** - Rerun workflow run - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- **run_workflow** - Run workflow +- workflow **run_workflow** - Run workflow - `inputs`: Inputs the workflow accepts (object, optional) - `owner`: Repository owner (string, required) - `ref`: The git reference for the workflow. The reference can be a branch or tag name. (string, required) @@ -584,12 +584,12 @@ The following sets of tools are available: codescan Code Security -- **get_code_scanning_alert** - Get code scanning alert +- codescan **get_code_scanning_alert** - Get code scanning alert - `alertNumber`: The number of the alert. (number, required) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- **list_code_scanning_alerts** - List code scanning alerts +- codescan **list_code_scanning_alerts** - List code scanning alerts - `owner`: The owner of the repository. (string, required) - `ref`: The Git reference for the results you want to list. (string, optional) - `repo`: The name of the repository. (string, required) @@ -603,14 +603,14 @@ The following sets of tools are available: person Context -- **get_me** - Get my user profile +- person **get_me** - Get my user profile - No parameters required -- **get_team_members** - Get team members +- person **get_team_members** - Get team members - `org`: Organization login (owner) that contains the team. (string, required) - `team_slug`: Team slug (string, required) -- **get_teams** - Get teams +- person **get_teams** - Get teams - `user`: Username to get teams for. If not provided, uses the authenticated user. (string, optional)
@@ -619,12 +619,12 @@ The following sets of tools are available: dependabot Dependabot -- **get_dependabot_alert** - Get dependabot alert +- dependabot **get_dependabot_alert** - Get dependabot alert - `alertNumber`: The number of the alert. (number, required) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- **list_dependabot_alerts** - List dependabot alerts +- dependabot **list_dependabot_alerts** - List dependabot alerts - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) - `severity`: Filter dependabot alerts by severity (string, optional) @@ -636,23 +636,23 @@ The following sets of tools are available: comment-discussion Discussions -- **get_discussion** - Get discussion +- comment-discussion **get_discussion** - Get discussion - `discussionNumber`: Discussion Number (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- **get_discussion_comments** - Get discussion comments +- comment-discussion **get_discussion_comments** - Get discussion comments - `after`: Cursor for pagination. Use the endCursor from the previous page's PageInfo for GraphQL APIs. (string, optional) - `discussionNumber`: Discussion Number (number, required) - `owner`: Repository owner (string, required) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- **list_discussion_categories** - List discussion categories +- comment-discussion **list_discussion_categories** - List discussion categories - `owner`: Repository owner (string, required) - `repo`: Repository name. If not provided, discussion categories will be queried at the organisation level. (string, optional) -- **list_discussions** - List discussions +- comment-discussion **list_discussions** - List discussions - `after`: Cursor for pagination. Use the endCursor from the previous page's PageInfo for GraphQL APIs. (string, optional) - `category`: Optional filter by discussion category ID. If provided, only discussions with this category are listed. (string, optional) - `direction`: Order direction. (string, optional) @@ -667,22 +667,22 @@ The following sets of tools are available: logo-gist Gists -- **create_gist** - Create Gist +- logo-gist **create_gist** - Create Gist - `content`: Content for simple single-file gist creation (string, required) - `description`: Description of the gist (string, optional) - `filename`: Filename for simple single-file gist creation (string, required) - `public`: Whether the gist is public (boolean, optional) -- **get_gist** - Get Gist Content +- logo-gist **get_gist** - Get Gist Content - `gist_id`: The ID of the gist (string, required) -- **list_gists** - List Gists +- logo-gist **list_gists** - List Gists - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `since`: Only gists updated after this time (ISO 8601 timestamp) (string, optional) - `username`: GitHub username (omit for authenticated user's gists) (string, optional) -- **update_gist** - Update Gist +- logo-gist **update_gist** - Update Gist - `content`: Content for the file (string, required) - `description`: Updated description of the gist (string, optional) - `filename`: Filename to update or create (string, required) @@ -694,7 +694,7 @@ The following sets of tools are available: git-branch Git -- **get_repository_tree** - Get repository tree +- git-branch **get_repository_tree** - Get repository tree - `owner`: Repository owner (username or organization) (string, required) - `path_filter`: Optional path prefix to filter the tree results (e.g., 'src/' to only show files in the src directory) (string, optional) - `recursive`: Setting this parameter to true returns the objects or subtrees referenced by the tree. Default is false (boolean, optional) @@ -707,23 +707,23 @@ The following sets of tools are available: issue-opened Issues -- **add_issue_comment** - Add comment to issue +- issue-opened **add_issue_comment** - Add comment to issue - `body`: Comment content (string, required) - `issue_number`: Issue number to comment on (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- **assign_copilot_to_issue** - Assign Copilot to issue +- issue-opened **assign_copilot_to_issue** - Assign Copilot to issue - `issueNumber`: Issue number (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- **get_label** - Get a specific label from a repository. +- issue-opened **get_label** - Get a specific label from a repository. - `name`: Label name. (string, required) - `owner`: Repository owner (username or organization name) (string, required) - `repo`: Repository name (string, required) -- **issue_read** - Get issue details +- issue-opened **issue_read** - Get issue details - `issue_number`: The number of the issue (number, required) - `method`: The read operation to perform on a single issue. Options are: @@ -737,7 +737,7 @@ The following sets of tools are available: - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: The name of the repository (string, required) -- **issue_write** - Create or update issue. +- issue-opened **issue_write** - Create or update issue. - `assignees`: Usernames to assign to this issue (string[], optional) - `body`: Issue body content (string, optional) - `duplicate_of`: Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'. (number, optional) @@ -756,10 +756,10 @@ The following sets of tools are available: - `title`: Issue title (string, optional) - `type`: Type of this issue. Only use if the repository has issue types configured. Use list_issue_types tool to get valid type values for the organization. If the repository doesn't support issue types, omit this parameter. (string, optional) -- **list_issue_types** - List available issue types +- issue-opened **list_issue_types** - List available issue types - `owner`: The organization owner of the repository (string, required) -- **list_issues** - List issues +- issue-opened **list_issues** - List issues - `after`: Cursor for pagination. Use the endCursor from the previous page's PageInfo for GraphQL APIs. (string, optional) - `direction`: Order direction. If provided, the 'orderBy' also needs to be provided. (string, optional) - `labels`: Filter by labels (string[], optional) @@ -770,7 +770,7 @@ The following sets of tools are available: - `since`: Filter by date (ISO 8601 timestamp) (string, optional) - `state`: Filter by state, by default both open and closed issues are returned when not provided (string, optional) -- **search_issues** - Search issues +- issue-opened **search_issues** - Search issues - `order`: Sort order (string, optional) - `owner`: Optional repository owner. If provided with repo, only issues for this repository are listed. (string, optional) - `page`: Page number for pagination (min 1) (number, optional) @@ -779,7 +779,7 @@ The following sets of tools are available: - `repo`: Optional repository name. If provided with owner, only issues for this repository are listed. (string, optional) - `sort`: Sort field by number of matches of categories, defaults to best match (string, optional) -- **sub_issue_write** - Change sub-issue +- issue-opened **sub_issue_write** - Change sub-issue - `after_id`: The ID of the sub-issue to be prioritized after (either after_id OR before_id should be specified) (number, optional) - `before_id`: The ID of the sub-issue to be prioritized before (either after_id OR before_id should be specified) (number, optional) - `issue_number`: The number of the parent issue (number, required) @@ -800,12 +800,12 @@ The following sets of tools are available: tag Labels -- **get_label** - Get a specific label from a repository. +- tag **get_label** - Get a specific label from a repository. - `name`: Label name. (string, required) - `owner`: Repository owner (username or organization name) (string, required) - `repo`: Repository name (string, required) -- **label_write** - Write operations on repository labels. +- tag **label_write** - Write operations on repository labels. - `color`: Label color as 6-character hex code without '#' prefix (e.g., 'f29513'). Required for 'create', optional for 'update'. (string, optional) - `description`: Label description text. Optional for 'create' and 'update'. (string, optional) - `method`: Operation to perform: 'create', 'update', or 'delete' (string, required) @@ -814,7 +814,7 @@ The following sets of tools are available: - `owner`: Repository owner (username or organization name) (string, required) - `repo`: Repository name (string, required) -- **list_label** - List labels from a repository +- tag **list_label** - List labels from a repository - `owner`: Repository owner (username or organization name) - required for all operations (string, required) - `repo`: Repository name - required for all operations (string, required) @@ -824,14 +824,14 @@ The following sets of tools are available: bell Notifications -- **dismiss_notification** - Dismiss notification +- bell **dismiss_notification** - Dismiss notification - `state`: The new state of the notification (read/done) (string, required) - `threadID`: The ID of the notification thread (string, required) -- **get_notification_details** - Get notification details +- bell **get_notification_details** - Get notification details - `notificationID`: The ID of the notification (string, required) -- **list_notifications** - List notifications +- bell **list_notifications** - List notifications - `before`: Only show notifications updated before the given time (ISO 8601 format) (string, optional) - `filter`: Filter notifications to, use default unless specified. Read notifications are ones that have already been acknowledged by the user. Participating notifications are those that the user is directly involved in, such as issues or pull requests they have commented on or created. (string, optional) - `owner`: Optional repository owner. If provided with repo, only notifications for this repository are listed. (string, optional) @@ -840,16 +840,16 @@ The following sets of tools are available: - `repo`: Optional repository name. If provided with owner, only notifications for this repository are listed. (string, optional) - `since`: Only show notifications updated after the given time (ISO 8601 format) (string, optional) -- **manage_notification_subscription** - Manage notification subscription +- bell **manage_notification_subscription** - Manage notification subscription - `action`: Action to perform: ignore, watch, or delete the notification subscription. (string, required) - `notificationID`: The ID of the notification thread. (string, required) -- **manage_repository_notification_subscription** - Manage repository notification subscription +- bell **manage_repository_notification_subscription** - Manage repository notification subscription - `action`: Action to perform: ignore, watch, or delete the repository notification subscription. (string, required) - `owner`: The account owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- **mark_all_notifications_read** - Mark all notifications as read +- bell **mark_all_notifications_read** - Mark all notifications as read - `lastReadAt`: Describes the last point that notifications were checked (optional). Default: Now (string, optional) - `owner`: Optional repository owner. If provided with repo, only notifications for this repository are marked as read. (string, optional) - `repo`: Optional repository name. If provided with owner, only notifications for this repository are marked as read. (string, optional) @@ -860,7 +860,7 @@ The following sets of tools are available: organization Organizations -- **search_orgs** - Search organizations +- organization **search_orgs** - Search organizations - `order`: Sort order (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) @@ -873,38 +873,38 @@ The following sets of tools are available: project Projects -- **add_project_item** - Add project item +- project **add_project_item** - Add project item - `item_id`: The numeric ID of the issue or pull request to add to the project. (number, required) - `item_type`: The item's type, either issue or pull_request. (string, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- **delete_project_item** - Delete project item +- project **delete_project_item** - Delete project item - `item_id`: The internal project item ID to delete from the project (not the issue or pull request ID). (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- **get_project** - Get project +- project **get_project** - Get project - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number (number, required) -- **get_project_field** - Get project field +- project **get_project_field** - Get project field - `field_id`: The field's id. (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- **get_project_item** - Get project item +- project **get_project_item** - Get project item - `fields`: Specific list of field IDs to include in the response (e.g. ["102589", "985201", "169875"]). If not provided, only the title field is included. (string[], optional) - `item_id`: The item's ID. (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- **list_project_fields** - List project fields +- project **list_project_fields** - List project fields - `after`: Forward pagination cursor from previous pageInfo.nextCursor. (string, optional) - `before`: Backward pagination cursor from previous pageInfo.prevCursor (rare). (string, optional) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) @@ -912,7 +912,7 @@ The following sets of tools are available: - `per_page`: Results per page (max 50) (number, optional) - `project_number`: The project's number. (number, required) -- **list_project_items** - List project items +- project **list_project_items** - List project items - `after`: Forward pagination cursor from previous pageInfo.nextCursor. (string, optional) - `before`: Backward pagination cursor from previous pageInfo.prevCursor (rare). (string, optional) - `fields`: Field IDs to include (e.g. ["102589", "985201"]). CRITICAL: Always provide to get field values. Without this, only titles returned. (string[], optional) @@ -922,7 +922,7 @@ The following sets of tools are available: - `project_number`: The project's number. (number, required) - `query`: Query string for advanced filtering of project items using GitHub's project filtering syntax. (string, optional) -- **list_projects** - List projects +- project **list_projects** - List projects - `after`: Forward pagination cursor from previous pageInfo.nextCursor. (string, optional) - `before`: Backward pagination cursor from previous pageInfo.prevCursor (rare). (string, optional) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) @@ -930,7 +930,7 @@ The following sets of tools are available: - `per_page`: Results per page (max 50) (number, optional) - `query`: Filter projects by title text and open/closed state; permitted qualifiers: is:open, is:closed; examples: "roadmap is:open", "is:open feature planning". (string, optional) -- **update_project_item** - Update project item +- project **update_project_item** - Update project item - `item_id`: The unique identifier of the project item. This is not the issue or pull request ID. (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) @@ -943,7 +943,7 @@ The following sets of tools are available: git-pull-request Pull Requests -- **add_comment_to_pending_review** - Add review comment to the requester's latest pending pull request review +- git-pull-request **add_comment_to_pending_review** - Add review comment to the requester's latest pending pull request review - `body`: The text of the review comment (string, required) - `line`: The line of the blob in the pull request diff that the comment applies to. For multi-line comments, the last line of the range (number, optional) - `owner`: Repository owner (string, required) @@ -955,7 +955,7 @@ The following sets of tools are available: - `startSide`: For multi-line comments, the starting side of the diff that the comment applies to. LEFT indicates the previous state, RIGHT indicates the new state (string, optional) - `subjectType`: The level at which the comment is targeted (string, required) -- **create_pull_request** - Open new pull request +- git-pull-request **create_pull_request** - Open new pull request - `base`: Branch to merge into (string, required) - `body`: PR description (string, optional) - `draft`: Create as draft PR (boolean, optional) @@ -965,7 +965,7 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `title`: PR title (string, required) -- **list_pull_requests** - List pull requests +- git-pull-request **list_pull_requests** - List pull requests - `base`: Filter by base branch (string, optional) - `direction`: Sort direction (string, optional) - `head`: Filter by head user/org and branch (string, optional) @@ -976,7 +976,7 @@ The following sets of tools are available: - `sort`: Sort by (string, optional) - `state`: Filter by state (string, optional) -- **merge_pull_request** - Merge pull request +- git-pull-request **merge_pull_request** - Merge pull request - `commit_message`: Extra detail for merge commit (string, optional) - `commit_title`: Title for merge commit (string, optional) - `merge_method`: Merge method (string, optional) @@ -984,7 +984,7 @@ The following sets of tools are available: - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- **pull_request_read** - Get details for a single pull request +- git-pull-request **pull_request_read** - Get details for a single pull request - `method`: Action to specify what pull request data needs to be retrieved from GitHub. Possible options: 1. get - Get details of a specific pull request. @@ -1001,7 +1001,7 @@ The following sets of tools are available: - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- **pull_request_review_write** - Write operations (create, submit, delete) on pull request reviews. +- git-pull-request **pull_request_review_write** - Write operations (create, submit, delete) on pull request reviews. - `body`: Review comment text (string, optional) - `commitID`: SHA of commit to review (string, optional) - `event`: Review action to perform. (string, optional) @@ -1010,12 +1010,12 @@ The following sets of tools are available: - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- **request_copilot_review** - Request Copilot review +- git-pull-request **request_copilot_review** - Request Copilot review - `owner`: Repository owner (string, required) - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- **search_pull_requests** - Search pull requests +- git-pull-request **search_pull_requests** - Search pull requests - `order`: Sort order (string, optional) - `owner`: Optional repository owner. If provided with repo, only pull requests for this repository are listed. (string, optional) - `page`: Page number for pagination (min 1) (number, optional) @@ -1024,7 +1024,7 @@ The following sets of tools are available: - `repo`: Optional repository name. If provided with owner, only pull requests for this repository are listed. (string, optional) - `sort`: Sort field by number of matches of categories, defaults to best match (string, optional) -- **update_pull_request** - Edit pull request +- git-pull-request **update_pull_request** - Edit pull request - `base`: New base branch name (string, optional) - `body`: New description (string, optional) - `draft`: Mark pull request as draft (true) or ready for review (false) (boolean, optional) @@ -1036,7 +1036,7 @@ The following sets of tools are available: - `state`: New state (string, optional) - `title`: New title (string, optional) -- **update_pull_request_branch** - Update pull request branch +- git-pull-request **update_pull_request_branch** - Update pull request branch - `expectedHeadSha`: The expected SHA of the pull request's HEAD ref (string, optional) - `owner`: Repository owner (string, required) - `pullNumber`: Pull request number (number, required) @@ -1048,13 +1048,13 @@ The following sets of tools are available: repo Repositories -- **create_branch** - Create branch +- repo **create_branch** - Create branch - `branch`: Name for new branch (string, required) - `from_branch`: Source branch (defaults to repo default) (string, optional) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- **create_or_update_file** - Create or update file +- repo **create_or_update_file** - Create or update file - `branch`: Branch to create/update the file in (string, required) - `content`: Content of the file (string, required) - `message`: Commit message (string, required) @@ -1063,26 +1063,26 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `sha`: The blob SHA of the file being replaced. (string, optional) -- **create_repository** - Create repository +- repo **create_repository** - Create repository - `autoInit`: Initialize with README (boolean, optional) - `description`: Repository description (string, optional) - `name`: Repository name (string, required) - `organization`: Organization to create the repository in (omit to create in your personal account) (string, optional) - `private`: Whether repo should be private (boolean, optional) -- **delete_file** - Delete file +- repo **delete_file** - Delete file - `branch`: Branch to delete the file from (string, required) - `message`: Commit message (string, required) - `owner`: Repository owner (username or organization) (string, required) - `path`: Path to the file to delete (string, required) - `repo`: Repository name (string, required) -- **fork_repository** - Fork repository +- repo **fork_repository** - Fork repository - `organization`: Organization to fork to (string, optional) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- **get_commit** - Get commit details +- repo **get_commit** - Get commit details - `include_diff`: Whether to include file diffs and stats in the response. Default is true. (boolean, optional) - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) @@ -1090,34 +1090,34 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `sha`: Commit SHA, branch name, or tag name (string, required) -- **get_file_contents** - Get file or directory contents +- repo **get_file_contents** - Get file or directory contents - `owner`: Repository owner (username or organization) (string, required) - `path`: Path to file/directory (string, optional) - `ref`: Accepts optional git refs such as `refs/tags/{tag}`, `refs/heads/{branch}` or `refs/pull/{pr_number}/head` (string, optional) - `repo`: Repository name (string, required) - `sha`: Accepts optional commit SHA. If specified, it will be used instead of ref (string, optional) -- **get_latest_release** - Get latest release +- repo **get_latest_release** - Get latest release - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- **get_release_by_tag** - Get a release by tag name +- repo **get_release_by_tag** - Get a release by tag name - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `tag`: Tag name (e.g., 'v1.0.0') (string, required) -- **get_tag** - Get tag details +- repo **get_tag** - Get tag details - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `tag`: Tag name (string, required) -- **list_branches** - List branches +- repo **list_branches** - List branches - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- **list_commits** - List commits +- repo **list_commits** - List commits - `author`: Author username or email address to filter commits by (string, optional) - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) @@ -1125,33 +1125,33 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `sha`: Commit SHA, branch or tag name to list commits of. If not provided, uses the default branch of the repository. If a commit SHA is provided, will list commits up to that SHA. (string, optional) -- **list_releases** - List releases +- repo **list_releases** - List releases - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- **list_tags** - List tags +- repo **list_tags** - List tags - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- **push_files** - Push files to repository +- repo **push_files** - Push files to repository - `branch`: Branch to push to (string, required) - `files`: Array of file objects to push, each object with path (string) and content (string) (object[], required) - `message`: Commit message (string, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- **search_code** - Search code +- repo **search_code** - Search code - `order`: Sort order for results (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `query`: Search query using GitHub's powerful code search syntax. Examples: 'content:Skill language:Java org:github', 'NOT is:archived language:Python OR language:go', 'repo:github/github-mcp-server'. Supports exact matching, language filters, path filters, and more. (string, required) - `sort`: Sort field ('indexed' only) (string, optional) -- **search_repositories** - Search repositories +- repo **search_repositories** - Search repositories - `minimal_output`: Return minimal repository information (default: true). When false, returns full GitHub API repository objects. (boolean, optional) - `order`: Sort order (string, optional) - `page`: Page number for pagination (min 1) (number, optional) @@ -1165,12 +1165,12 @@ The following sets of tools are available: shield-lock Secret Protection -- **get_secret_scanning_alert** - Get secret scanning alert +- shield-lock **get_secret_scanning_alert** - Get secret scanning alert - `alertNumber`: The number of the alert. (number, required) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- **list_secret_scanning_alerts** - List secret scanning alerts +- shield-lock **list_secret_scanning_alerts** - List secret scanning alerts - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) - `resolution`: Filter by resolution (string, optional) @@ -1183,10 +1183,10 @@ The following sets of tools are available: shield Security Advisories -- **get_global_security_advisory** - Get a global security advisory +- shield **get_global_security_advisory** - Get a global security advisory - `ghsaId`: GitHub Security Advisory ID (format: GHSA-xxxx-xxxx-xxxx). (string, required) -- **list_global_security_advisories** - List global security advisories +- shield **list_global_security_advisories** - List global security advisories - `affects`: Filter advisories by affected package or version (e.g. "package1,package2@1.0.0"). (string, optional) - `cveId`: Filter by CVE ID. (string, optional) - `cwes`: Filter by Common Weakness Enumeration IDs (e.g. ["79", "284", "22"]). (string[], optional) @@ -1199,13 +1199,13 @@ The following sets of tools are available: - `type`: Advisory type. (string, optional) - `updated`: Filter by update date or date range (ISO 8601 date or range). (string, optional) -- **list_org_repository_security_advisories** - List org repository security advisories +- shield **list_org_repository_security_advisories** - List org repository security advisories - `direction`: Sort direction. (string, optional) - `org`: The organization login. (string, required) - `sort`: Sort field. (string, optional) - `state`: Filter by advisory state. (string, optional) -- **list_repository_security_advisories** - List repository security advisories +- shield **list_repository_security_advisories** - List repository security advisories - `direction`: Sort direction. (string, optional) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) @@ -1218,18 +1218,18 @@ The following sets of tools are available: star Stargazers -- **list_starred_repositories** - List starred repositories +- star **list_starred_repositories** - List starred repositories - `direction`: The direction to sort the results by. (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `sort`: How to sort the results. Can be either 'created' (when the repository was starred) or 'updated' (when the repository was last pushed to). (string, optional) - `username`: Username to list starred repositories for. Defaults to the authenticated user. (string, optional) -- **star_repository** - Star repository +- star **star_repository** - Star repository - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- **unstar_repository** - Unstar repository +- star **unstar_repository** - Unstar repository - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) @@ -1239,7 +1239,7 @@ The following sets of tools are available: people Users -- **search_users** - Search users +- people **search_users** - Search users - `order`: Sort order (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) diff --git a/cmd/github-mcp-server/generate_docs.go b/cmd/github-mcp-server/generate_docs.go index c20f45752..177d43ff3 100644 --- a/cmd/github-mcp-server/generate_docs.go +++ b/cmd/github-mcp-server/generate_docs.go @@ -174,7 +174,7 @@ func generateToolsDoc(r *inventory.Inventory) string { currentToolsetID = tool.Toolset.ID currentToolsetIcon = tool.Toolset.Icon } - writeToolDoc(&toolBuf, tool.Tool) + writeToolDoc(&toolBuf, tool.Tool, tool.Toolset.Icon) toolBuf.WriteString("\n\n") } @@ -208,9 +208,13 @@ func formatToolsetName(name string) string { } } -func writeToolDoc(buf *strings.Builder, tool mcp.Tool) { - // Tool name only (using annotation name instead of verbose description) - fmt.Fprintf(buf, "- **%s** - %s\n", tool.Name, tool.Annotations.Title) +func writeToolDoc(buf *strings.Builder, tool mcp.Tool, icon string) { + // Tool name with icon (using annotation name instead of verbose description) + iconImg := octiconImg(icon) + if iconImg != "" { + iconImg += " " + } + fmt.Fprintf(buf, "- %s**%s** - %s\n", iconImg, tool.Name, tool.Annotations.Title) // Parameters if tool.InputSchema == nil { From 8e2583b73ee7c5b845c94e2664f13b69d77678b9 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Wed, 17 Dec 2025 10:30:23 +0100 Subject: [PATCH 14/21] fix: use repo-local icons with picture element for GitHub theme support - Reference icons from pkg/octicons/icons/ instead of external CDN - Use picture element with prefers-color-scheme for light/dark mode - GitHub markdown renderer will display these correctly --- README.md | 262 ++++++++++++------------- cmd/github-mcp-server/generate_docs.go | 10 +- 2 files changed, 138 insertions(+), 134 deletions(-) diff --git a/README.md b/README.md index 4ba28a7d7..6042cae79 100644 --- a/README.md +++ b/README.md @@ -455,24 +455,24 @@ The following sets of tools are available: | | Toolset | Description | | --- | ----------------------- | ------------------------------------------------------------- | -| person | `context` | **Strongly recommended**: Tools that provide context about the current user and GitHub context you are operating in | -| workflow | `actions` | GitHub Actions workflows and CI/CD operations | -| codescan | `code_security` | Code security related tools, such as GitHub Code Scanning | -| dependabot | `dependabot` | Dependabot tools | -| comment-discussion | `discussions` | GitHub Discussions related tools | -| logo-gist | `gists` | GitHub Gist related tools | -| git-branch | `git` | GitHub Git API related tools for low-level Git operations | -| issue-opened | `issues` | GitHub Issues related tools | -| tag | `labels` | GitHub Labels related tools | -| bell | `notifications` | GitHub Notifications related tools | -| organization | `orgs` | GitHub Organization related tools | -| project | `projects` | GitHub Projects related tools | -| git-pull-request | `pull_requests` | GitHub Pull Request related tools | -| repo | `repos` | GitHub Repository related tools | -| shield-lock | `secret_protection` | Secret protection related tools, such as GitHub Secret Scanning | -| shield | `security_advisories` | Security advisories related tools | -| star | `stargazers` | GitHub Stargazers related tools | -| people | `users` | GitHub User related tools | +| person | `context` | **Strongly recommended**: Tools that provide context about the current user and GitHub context you are operating in | +| workflow | `actions` | GitHub Actions workflows and CI/CD operations | +| codescan | `code_security` | Code security related tools, such as GitHub Code Scanning | +| dependabot | `dependabot` | Dependabot tools | +| comment-discussion | `discussions` | GitHub Discussions related tools | +| logo-gist | `gists` | GitHub Gist related tools | +| git-branch | `git` | GitHub Git API related tools for low-level Git operations | +| issue-opened | `issues` | GitHub Issues related tools | +| tag | `labels` | GitHub Labels related tools | +| bell | `notifications` | GitHub Notifications related tools | +| organization | `orgs` | GitHub Organization related tools | +| project | `projects` | GitHub Projects related tools | +| git-pull-request | `pull_requests` | GitHub Pull Request related tools | +| repo | `repos` | GitHub Repository related tools | +| shield-lock | `secret_protection` | Secret protection related tools, such as GitHub Secret Scanning | +| shield | `security_advisories` | Security advisories related tools | +| star | `stargazers` | GitHub Stargazers related tools | +| people | `users` | GitHub User related tools | ### Additional Toolsets in Remote GitHub MCP Server @@ -488,24 +488,24 @@ The following sets of tools are available:
-workflow Actions +workflow Actions -- workflow **cancel_workflow_run** - Cancel workflow run +- workflow **cancel_workflow_run** - Cancel workflow run - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **delete_workflow_run_logs** - Delete workflow logs +- workflow **delete_workflow_run_logs** - Delete workflow logs - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **download_workflow_run_artifact** - Download workflow artifact +- workflow **download_workflow_run_artifact** - Download workflow artifact - `artifact_id`: The unique identifier of the artifact (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- workflow **get_job_logs** - Get job logs +- workflow **get_job_logs** - Get job logs - `failed_only`: When true, gets logs for all failed jobs in run_id (boolean, optional) - `job_id`: The unique identifier of the workflow job (required for single job logs) (number, optional) - `owner`: Repository owner (string, required) @@ -514,22 +514,22 @@ The following sets of tools are available: - `run_id`: Workflow run ID (required when using failed_only) (number, optional) - `tail_lines`: Number of lines to return from the end of the log (number, optional) -- workflow **get_workflow_run** - Get workflow run +- workflow **get_workflow_run** - Get workflow run - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **get_workflow_run_logs** - Get workflow run logs +- workflow **get_workflow_run_logs** - Get workflow run logs - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **get_workflow_run_usage** - Get workflow usage +- workflow **get_workflow_run_usage** - Get workflow usage - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **list_workflow_jobs** - List workflow jobs +- workflow **list_workflow_jobs** - List workflow jobs - `filter`: Filters jobs by their completed_at timestamp (string, optional) - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) @@ -537,14 +537,14 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **list_workflow_run_artifacts** - List workflow artifacts +- workflow **list_workflow_run_artifacts** - List workflow artifacts - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **list_workflow_runs** - List workflow runs +- workflow **list_workflow_runs** - List workflow runs - `actor`: Returns someone's workflow runs. Use the login for the user who created the workflow run. (string, optional) - `branch`: Returns workflow runs associated with a branch. Use the name of the branch. (string, optional) - `event`: Returns workflow runs for a specific event type (string, optional) @@ -555,23 +555,23 @@ The following sets of tools are available: - `status`: Returns workflow runs with the check run status (string, optional) - `workflow_id`: The workflow ID or workflow file name (string, required) -- workflow **list_workflows** - List workflows +- workflow **list_workflows** - List workflows - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- workflow **rerun_failed_jobs** - Rerun failed jobs +- workflow **rerun_failed_jobs** - Rerun failed jobs - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **rerun_workflow_run** - Rerun workflow run +- workflow **rerun_workflow_run** - Rerun workflow run - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **run_workflow** - Run workflow +- workflow **run_workflow** - Run workflow - `inputs`: Inputs the workflow accepts (object, optional) - `owner`: Repository owner (string, required) - `ref`: The git reference for the workflow. The reference can be a branch or tag name. (string, required) @@ -582,14 +582,14 @@ The following sets of tools are available:
-codescan Code Security +codescan Code Security -- codescan **get_code_scanning_alert** - Get code scanning alert +- codescan **get_code_scanning_alert** - Get code scanning alert - `alertNumber`: The number of the alert. (number, required) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- codescan **list_code_scanning_alerts** - List code scanning alerts +- codescan **list_code_scanning_alerts** - List code scanning alerts - `owner`: The owner of the repository. (string, required) - `ref`: The Git reference for the results you want to list. (string, optional) - `repo`: The name of the repository. (string, required) @@ -601,30 +601,30 @@ The following sets of tools are available:
-person Context +person Context -- person **get_me** - Get my user profile +- person **get_me** - Get my user profile - No parameters required -- person **get_team_members** - Get team members +- person **get_team_members** - Get team members - `org`: Organization login (owner) that contains the team. (string, required) - `team_slug`: Team slug (string, required) -- person **get_teams** - Get teams +- person **get_teams** - Get teams - `user`: Username to get teams for. If not provided, uses the authenticated user. (string, optional)
-dependabot Dependabot +dependabot Dependabot -- dependabot **get_dependabot_alert** - Get dependabot alert +- dependabot **get_dependabot_alert** - Get dependabot alert - `alertNumber`: The number of the alert. (number, required) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- dependabot **list_dependabot_alerts** - List dependabot alerts +- dependabot **list_dependabot_alerts** - List dependabot alerts - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) - `severity`: Filter dependabot alerts by severity (string, optional) @@ -634,25 +634,25 @@ The following sets of tools are available:
-comment-discussion Discussions +comment-discussion Discussions -- comment-discussion **get_discussion** - Get discussion +- comment-discussion **get_discussion** - Get discussion - `discussionNumber`: Discussion Number (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- comment-discussion **get_discussion_comments** - Get discussion comments +- comment-discussion **get_discussion_comments** - Get discussion comments - `after`: Cursor for pagination. Use the endCursor from the previous page's PageInfo for GraphQL APIs. (string, optional) - `discussionNumber`: Discussion Number (number, required) - `owner`: Repository owner (string, required) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- comment-discussion **list_discussion_categories** - List discussion categories +- comment-discussion **list_discussion_categories** - List discussion categories - `owner`: Repository owner (string, required) - `repo`: Repository name. If not provided, discussion categories will be queried at the organisation level. (string, optional) -- comment-discussion **list_discussions** - List discussions +- comment-discussion **list_discussions** - List discussions - `after`: Cursor for pagination. Use the endCursor from the previous page's PageInfo for GraphQL APIs. (string, optional) - `category`: Optional filter by discussion category ID. If provided, only discussions with this category are listed. (string, optional) - `direction`: Order direction. (string, optional) @@ -665,24 +665,24 @@ The following sets of tools are available:
-logo-gist Gists +logo-gist Gists -- logo-gist **create_gist** - Create Gist +- logo-gist **create_gist** - Create Gist - `content`: Content for simple single-file gist creation (string, required) - `description`: Description of the gist (string, optional) - `filename`: Filename for simple single-file gist creation (string, required) - `public`: Whether the gist is public (boolean, optional) -- logo-gist **get_gist** - Get Gist Content +- logo-gist **get_gist** - Get Gist Content - `gist_id`: The ID of the gist (string, required) -- logo-gist **list_gists** - List Gists +- logo-gist **list_gists** - List Gists - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `since`: Only gists updated after this time (ISO 8601 timestamp) (string, optional) - `username`: GitHub username (omit for authenticated user's gists) (string, optional) -- logo-gist **update_gist** - Update Gist +- logo-gist **update_gist** - Update Gist - `content`: Content for the file (string, required) - `description`: Updated description of the gist (string, optional) - `filename`: Filename to update or create (string, required) @@ -692,9 +692,9 @@ The following sets of tools are available:
-git-branch Git +git-branch Git -- git-branch **get_repository_tree** - Get repository tree +- git-branch **get_repository_tree** - Get repository tree - `owner`: Repository owner (username or organization) (string, required) - `path_filter`: Optional path prefix to filter the tree results (e.g., 'src/' to only show files in the src directory) (string, optional) - `recursive`: Setting this parameter to true returns the objects or subtrees referenced by the tree. Default is false (boolean, optional) @@ -705,25 +705,25 @@ The following sets of tools are available:
-issue-opened Issues +issue-opened Issues -- issue-opened **add_issue_comment** - Add comment to issue +- issue-opened **add_issue_comment** - Add comment to issue - `body`: Comment content (string, required) - `issue_number`: Issue number to comment on (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- issue-opened **assign_copilot_to_issue** - Assign Copilot to issue +- issue-opened **assign_copilot_to_issue** - Assign Copilot to issue - `issueNumber`: Issue number (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- issue-opened **get_label** - Get a specific label from a repository. +- issue-opened **get_label** - Get a specific label from a repository. - `name`: Label name. (string, required) - `owner`: Repository owner (username or organization name) (string, required) - `repo`: Repository name (string, required) -- issue-opened **issue_read** - Get issue details +- issue-opened **issue_read** - Get issue details - `issue_number`: The number of the issue (number, required) - `method`: The read operation to perform on a single issue. Options are: @@ -737,7 +737,7 @@ The following sets of tools are available: - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: The name of the repository (string, required) -- issue-opened **issue_write** - Create or update issue. +- issue-opened **issue_write** - Create or update issue. - `assignees`: Usernames to assign to this issue (string[], optional) - `body`: Issue body content (string, optional) - `duplicate_of`: Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'. (number, optional) @@ -756,10 +756,10 @@ The following sets of tools are available: - `title`: Issue title (string, optional) - `type`: Type of this issue. Only use if the repository has issue types configured. Use list_issue_types tool to get valid type values for the organization. If the repository doesn't support issue types, omit this parameter. (string, optional) -- issue-opened **list_issue_types** - List available issue types +- issue-opened **list_issue_types** - List available issue types - `owner`: The organization owner of the repository (string, required) -- issue-opened **list_issues** - List issues +- issue-opened **list_issues** - List issues - `after`: Cursor for pagination. Use the endCursor from the previous page's PageInfo for GraphQL APIs. (string, optional) - `direction`: Order direction. If provided, the 'orderBy' also needs to be provided. (string, optional) - `labels`: Filter by labels (string[], optional) @@ -770,7 +770,7 @@ The following sets of tools are available: - `since`: Filter by date (ISO 8601 timestamp) (string, optional) - `state`: Filter by state, by default both open and closed issues are returned when not provided (string, optional) -- issue-opened **search_issues** - Search issues +- issue-opened **search_issues** - Search issues - `order`: Sort order (string, optional) - `owner`: Optional repository owner. If provided with repo, only issues for this repository are listed. (string, optional) - `page`: Page number for pagination (min 1) (number, optional) @@ -779,7 +779,7 @@ The following sets of tools are available: - `repo`: Optional repository name. If provided with owner, only issues for this repository are listed. (string, optional) - `sort`: Sort field by number of matches of categories, defaults to best match (string, optional) -- issue-opened **sub_issue_write** - Change sub-issue +- issue-opened **sub_issue_write** - Change sub-issue - `after_id`: The ID of the sub-issue to be prioritized after (either after_id OR before_id should be specified) (number, optional) - `before_id`: The ID of the sub-issue to be prioritized before (either after_id OR before_id should be specified) (number, optional) - `issue_number`: The number of the parent issue (number, required) @@ -798,14 +798,14 @@ The following sets of tools are available:
-tag Labels +tag Labels -- tag **get_label** - Get a specific label from a repository. +- tag **get_label** - Get a specific label from a repository. - `name`: Label name. (string, required) - `owner`: Repository owner (username or organization name) (string, required) - `repo`: Repository name (string, required) -- tag **label_write** - Write operations on repository labels. +- tag **label_write** - Write operations on repository labels. - `color`: Label color as 6-character hex code without '#' prefix (e.g., 'f29513'). Required for 'create', optional for 'update'. (string, optional) - `description`: Label description text. Optional for 'create' and 'update'. (string, optional) - `method`: Operation to perform: 'create', 'update', or 'delete' (string, required) @@ -814,7 +814,7 @@ The following sets of tools are available: - `owner`: Repository owner (username or organization name) (string, required) - `repo`: Repository name (string, required) -- tag **list_label** - List labels from a repository +- tag **list_label** - List labels from a repository - `owner`: Repository owner (username or organization name) - required for all operations (string, required) - `repo`: Repository name - required for all operations (string, required) @@ -822,16 +822,16 @@ The following sets of tools are available:
-bell Notifications +bell Notifications -- bell **dismiss_notification** - Dismiss notification +- bell **dismiss_notification** - Dismiss notification - `state`: The new state of the notification (read/done) (string, required) - `threadID`: The ID of the notification thread (string, required) -- bell **get_notification_details** - Get notification details +- bell **get_notification_details** - Get notification details - `notificationID`: The ID of the notification (string, required) -- bell **list_notifications** - List notifications +- bell **list_notifications** - List notifications - `before`: Only show notifications updated before the given time (ISO 8601 format) (string, optional) - `filter`: Filter notifications to, use default unless specified. Read notifications are ones that have already been acknowledged by the user. Participating notifications are those that the user is directly involved in, such as issues or pull requests they have commented on or created. (string, optional) - `owner`: Optional repository owner. If provided with repo, only notifications for this repository are listed. (string, optional) @@ -840,16 +840,16 @@ The following sets of tools are available: - `repo`: Optional repository name. If provided with owner, only notifications for this repository are listed. (string, optional) - `since`: Only show notifications updated after the given time (ISO 8601 format) (string, optional) -- bell **manage_notification_subscription** - Manage notification subscription +- bell **manage_notification_subscription** - Manage notification subscription - `action`: Action to perform: ignore, watch, or delete the notification subscription. (string, required) - `notificationID`: The ID of the notification thread. (string, required) -- bell **manage_repository_notification_subscription** - Manage repository notification subscription +- bell **manage_repository_notification_subscription** - Manage repository notification subscription - `action`: Action to perform: ignore, watch, or delete the repository notification subscription. (string, required) - `owner`: The account owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- bell **mark_all_notifications_read** - Mark all notifications as read +- bell **mark_all_notifications_read** - Mark all notifications as read - `lastReadAt`: Describes the last point that notifications were checked (optional). Default: Now (string, optional) - `owner`: Optional repository owner. If provided with repo, only notifications for this repository are marked as read. (string, optional) - `repo`: Optional repository name. If provided with owner, only notifications for this repository are marked as read. (string, optional) @@ -858,9 +858,9 @@ The following sets of tools are available:
-organization Organizations +organization Organizations -- organization **search_orgs** - Search organizations +- organization **search_orgs** - Search organizations - `order`: Sort order (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) @@ -871,40 +871,40 @@ The following sets of tools are available:
-project Projects +project Projects -- project **add_project_item** - Add project item +- project **add_project_item** - Add project item - `item_id`: The numeric ID of the issue or pull request to add to the project. (number, required) - `item_type`: The item's type, either issue or pull_request. (string, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- project **delete_project_item** - Delete project item +- project **delete_project_item** - Delete project item - `item_id`: The internal project item ID to delete from the project (not the issue or pull request ID). (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- project **get_project** - Get project +- project **get_project** - Get project - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number (number, required) -- project **get_project_field** - Get project field +- project **get_project_field** - Get project field - `field_id`: The field's id. (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- project **get_project_item** - Get project item +- project **get_project_item** - Get project item - `fields`: Specific list of field IDs to include in the response (e.g. ["102589", "985201", "169875"]). If not provided, only the title field is included. (string[], optional) - `item_id`: The item's ID. (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- project **list_project_fields** - List project fields +- project **list_project_fields** - List project fields - `after`: Forward pagination cursor from previous pageInfo.nextCursor. (string, optional) - `before`: Backward pagination cursor from previous pageInfo.prevCursor (rare). (string, optional) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) @@ -912,7 +912,7 @@ The following sets of tools are available: - `per_page`: Results per page (max 50) (number, optional) - `project_number`: The project's number. (number, required) -- project **list_project_items** - List project items +- project **list_project_items** - List project items - `after`: Forward pagination cursor from previous pageInfo.nextCursor. (string, optional) - `before`: Backward pagination cursor from previous pageInfo.prevCursor (rare). (string, optional) - `fields`: Field IDs to include (e.g. ["102589", "985201"]). CRITICAL: Always provide to get field values. Without this, only titles returned. (string[], optional) @@ -922,7 +922,7 @@ The following sets of tools are available: - `project_number`: The project's number. (number, required) - `query`: Query string for advanced filtering of project items using GitHub's project filtering syntax. (string, optional) -- project **list_projects** - List projects +- project **list_projects** - List projects - `after`: Forward pagination cursor from previous pageInfo.nextCursor. (string, optional) - `before`: Backward pagination cursor from previous pageInfo.prevCursor (rare). (string, optional) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) @@ -930,7 +930,7 @@ The following sets of tools are available: - `per_page`: Results per page (max 50) (number, optional) - `query`: Filter projects by title text and open/closed state; permitted qualifiers: is:open, is:closed; examples: "roadmap is:open", "is:open feature planning". (string, optional) -- project **update_project_item** - Update project item +- project **update_project_item** - Update project item - `item_id`: The unique identifier of the project item. This is not the issue or pull request ID. (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) @@ -941,9 +941,9 @@ The following sets of tools are available:
-git-pull-request Pull Requests +git-pull-request Pull Requests -- git-pull-request **add_comment_to_pending_review** - Add review comment to the requester's latest pending pull request review +- git-pull-request **add_comment_to_pending_review** - Add review comment to the requester's latest pending pull request review - `body`: The text of the review comment (string, required) - `line`: The line of the blob in the pull request diff that the comment applies to. For multi-line comments, the last line of the range (number, optional) - `owner`: Repository owner (string, required) @@ -955,7 +955,7 @@ The following sets of tools are available: - `startSide`: For multi-line comments, the starting side of the diff that the comment applies to. LEFT indicates the previous state, RIGHT indicates the new state (string, optional) - `subjectType`: The level at which the comment is targeted (string, required) -- git-pull-request **create_pull_request** - Open new pull request +- git-pull-request **create_pull_request** - Open new pull request - `base`: Branch to merge into (string, required) - `body`: PR description (string, optional) - `draft`: Create as draft PR (boolean, optional) @@ -965,7 +965,7 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `title`: PR title (string, required) -- git-pull-request **list_pull_requests** - List pull requests +- git-pull-request **list_pull_requests** - List pull requests - `base`: Filter by base branch (string, optional) - `direction`: Sort direction (string, optional) - `head`: Filter by head user/org and branch (string, optional) @@ -976,7 +976,7 @@ The following sets of tools are available: - `sort`: Sort by (string, optional) - `state`: Filter by state (string, optional) -- git-pull-request **merge_pull_request** - Merge pull request +- git-pull-request **merge_pull_request** - Merge pull request - `commit_message`: Extra detail for merge commit (string, optional) - `commit_title`: Title for merge commit (string, optional) - `merge_method`: Merge method (string, optional) @@ -984,7 +984,7 @@ The following sets of tools are available: - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- git-pull-request **pull_request_read** - Get details for a single pull request +- git-pull-request **pull_request_read** - Get details for a single pull request - `method`: Action to specify what pull request data needs to be retrieved from GitHub. Possible options: 1. get - Get details of a specific pull request. @@ -1001,7 +1001,7 @@ The following sets of tools are available: - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- git-pull-request **pull_request_review_write** - Write operations (create, submit, delete) on pull request reviews. +- git-pull-request **pull_request_review_write** - Write operations (create, submit, delete) on pull request reviews. - `body`: Review comment text (string, optional) - `commitID`: SHA of commit to review (string, optional) - `event`: Review action to perform. (string, optional) @@ -1010,12 +1010,12 @@ The following sets of tools are available: - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- git-pull-request **request_copilot_review** - Request Copilot review +- git-pull-request **request_copilot_review** - Request Copilot review - `owner`: Repository owner (string, required) - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- git-pull-request **search_pull_requests** - Search pull requests +- git-pull-request **search_pull_requests** - Search pull requests - `order`: Sort order (string, optional) - `owner`: Optional repository owner. If provided with repo, only pull requests for this repository are listed. (string, optional) - `page`: Page number for pagination (min 1) (number, optional) @@ -1024,7 +1024,7 @@ The following sets of tools are available: - `repo`: Optional repository name. If provided with owner, only pull requests for this repository are listed. (string, optional) - `sort`: Sort field by number of matches of categories, defaults to best match (string, optional) -- git-pull-request **update_pull_request** - Edit pull request +- git-pull-request **update_pull_request** - Edit pull request - `base`: New base branch name (string, optional) - `body`: New description (string, optional) - `draft`: Mark pull request as draft (true) or ready for review (false) (boolean, optional) @@ -1036,7 +1036,7 @@ The following sets of tools are available: - `state`: New state (string, optional) - `title`: New title (string, optional) -- git-pull-request **update_pull_request_branch** - Update pull request branch +- git-pull-request **update_pull_request_branch** - Update pull request branch - `expectedHeadSha`: The expected SHA of the pull request's HEAD ref (string, optional) - `owner`: Repository owner (string, required) - `pullNumber`: Pull request number (number, required) @@ -1046,15 +1046,15 @@ The following sets of tools are available:
-repo Repositories +repo Repositories -- repo **create_branch** - Create branch +- repo **create_branch** - Create branch - `branch`: Name for new branch (string, required) - `from_branch`: Source branch (defaults to repo default) (string, optional) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- repo **create_or_update_file** - Create or update file +- repo **create_or_update_file** - Create or update file - `branch`: Branch to create/update the file in (string, required) - `content`: Content of the file (string, required) - `message`: Commit message (string, required) @@ -1063,26 +1063,26 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `sha`: The blob SHA of the file being replaced. (string, optional) -- repo **create_repository** - Create repository +- repo **create_repository** - Create repository - `autoInit`: Initialize with README (boolean, optional) - `description`: Repository description (string, optional) - `name`: Repository name (string, required) - `organization`: Organization to create the repository in (omit to create in your personal account) (string, optional) - `private`: Whether repo should be private (boolean, optional) -- repo **delete_file** - Delete file +- repo **delete_file** - Delete file - `branch`: Branch to delete the file from (string, required) - `message`: Commit message (string, required) - `owner`: Repository owner (username or organization) (string, required) - `path`: Path to the file to delete (string, required) - `repo`: Repository name (string, required) -- repo **fork_repository** - Fork repository +- repo **fork_repository** - Fork repository - `organization`: Organization to fork to (string, optional) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- repo **get_commit** - Get commit details +- repo **get_commit** - Get commit details - `include_diff`: Whether to include file diffs and stats in the response. Default is true. (boolean, optional) - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) @@ -1090,34 +1090,34 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `sha`: Commit SHA, branch name, or tag name (string, required) -- repo **get_file_contents** - Get file or directory contents +- repo **get_file_contents** - Get file or directory contents - `owner`: Repository owner (username or organization) (string, required) - `path`: Path to file/directory (string, optional) - `ref`: Accepts optional git refs such as `refs/tags/{tag}`, `refs/heads/{branch}` or `refs/pull/{pr_number}/head` (string, optional) - `repo`: Repository name (string, required) - `sha`: Accepts optional commit SHA. If specified, it will be used instead of ref (string, optional) -- repo **get_latest_release** - Get latest release +- repo **get_latest_release** - Get latest release - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- repo **get_release_by_tag** - Get a release by tag name +- repo **get_release_by_tag** - Get a release by tag name - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `tag`: Tag name (e.g., 'v1.0.0') (string, required) -- repo **get_tag** - Get tag details +- repo **get_tag** - Get tag details - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `tag`: Tag name (string, required) -- repo **list_branches** - List branches +- repo **list_branches** - List branches - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- repo **list_commits** - List commits +- repo **list_commits** - List commits - `author`: Author username or email address to filter commits by (string, optional) - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) @@ -1125,33 +1125,33 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `sha`: Commit SHA, branch or tag name to list commits of. If not provided, uses the default branch of the repository. If a commit SHA is provided, will list commits up to that SHA. (string, optional) -- repo **list_releases** - List releases +- repo **list_releases** - List releases - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- repo **list_tags** - List tags +- repo **list_tags** - List tags - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- repo **push_files** - Push files to repository +- repo **push_files** - Push files to repository - `branch`: Branch to push to (string, required) - `files`: Array of file objects to push, each object with path (string) and content (string) (object[], required) - `message`: Commit message (string, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- repo **search_code** - Search code +- repo **search_code** - Search code - `order`: Sort order for results (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `query`: Search query using GitHub's powerful code search syntax. Examples: 'content:Skill language:Java org:github', 'NOT is:archived language:Python OR language:go', 'repo:github/github-mcp-server'. Supports exact matching, language filters, path filters, and more. (string, required) - `sort`: Sort field ('indexed' only) (string, optional) -- repo **search_repositories** - Search repositories +- repo **search_repositories** - Search repositories - `minimal_output`: Return minimal repository information (default: true). When false, returns full GitHub API repository objects. (boolean, optional) - `order`: Sort order (string, optional) - `page`: Page number for pagination (min 1) (number, optional) @@ -1163,14 +1163,14 @@ The following sets of tools are available:
-shield-lock Secret Protection +shield-lock Secret Protection -- shield-lock **get_secret_scanning_alert** - Get secret scanning alert +- shield-lock **get_secret_scanning_alert** - Get secret scanning alert - `alertNumber`: The number of the alert. (number, required) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- shield-lock **list_secret_scanning_alerts** - List secret scanning alerts +- shield-lock **list_secret_scanning_alerts** - List secret scanning alerts - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) - `resolution`: Filter by resolution (string, optional) @@ -1181,12 +1181,12 @@ The following sets of tools are available:
-shield Security Advisories +shield Security Advisories -- shield **get_global_security_advisory** - Get a global security advisory +- shield **get_global_security_advisory** - Get a global security advisory - `ghsaId`: GitHub Security Advisory ID (format: GHSA-xxxx-xxxx-xxxx). (string, required) -- shield **list_global_security_advisories** - List global security advisories +- shield **list_global_security_advisories** - List global security advisories - `affects`: Filter advisories by affected package or version (e.g. "package1,package2@1.0.0"). (string, optional) - `cveId`: Filter by CVE ID. (string, optional) - `cwes`: Filter by Common Weakness Enumeration IDs (e.g. ["79", "284", "22"]). (string[], optional) @@ -1199,13 +1199,13 @@ The following sets of tools are available: - `type`: Advisory type. (string, optional) - `updated`: Filter by update date or date range (ISO 8601 date or range). (string, optional) -- shield **list_org_repository_security_advisories** - List org repository security advisories +- shield **list_org_repository_security_advisories** - List org repository security advisories - `direction`: Sort direction. (string, optional) - `org`: The organization login. (string, required) - `sort`: Sort field. (string, optional) - `state`: Filter by advisory state. (string, optional) -- shield **list_repository_security_advisories** - List repository security advisories +- shield **list_repository_security_advisories** - List repository security advisories - `direction`: Sort direction. (string, optional) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) @@ -1216,20 +1216,20 @@ The following sets of tools are available:
-star Stargazers +star Stargazers -- star **list_starred_repositories** - List starred repositories +- star **list_starred_repositories** - List starred repositories - `direction`: The direction to sort the results by. (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `sort`: How to sort the results. Can be either 'created' (when the repository was starred) or 'updated' (when the repository was last pushed to). (string, optional) - `username`: Username to list starred repositories for. Defaults to the authenticated user. (string, optional) -- star **star_repository** - Star repository +- star **star_repository** - Star repository - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- star **unstar_repository** - Unstar repository +- star **unstar_repository** - Unstar repository - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) @@ -1237,9 +1237,9 @@ The following sets of tools are available:
-people Users +people Users -- people **search_users** - Search users +- people **search_users** - Search users - `order`: Sort order (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) diff --git a/cmd/github-mcp-server/generate_docs.go b/cmd/github-mcp-server/generate_docs.go index 177d43ff3..93988d1df 100644 --- a/cmd/github-mcp-server/generate_docs.go +++ b/cmd/github-mcp-server/generate_docs.go @@ -105,13 +105,17 @@ func generateRemoteServerDocs(docsPath string) error { } // octiconImg returns an img tag for an Octicon that works with GitHub's light/dark theme. -// Uses the official Primer Octicons CDN. +// Uses picture element with prefers-color-scheme for automatic theme switching. +// References icons from the repo's pkg/octicons/icons directory. func octiconImg(name string) string { if name == "" { return "" } - // Use GitHub's Octicon CDN with 16px size - return fmt.Sprintf(`%s`, name, name) + // Use picture element with media queries for light/dark mode support + // GitHub renders these correctly in markdown + lightIcon := fmt.Sprintf("pkg/octicons/icons/%s-light.png", name) + darkIcon := fmt.Sprintf("pkg/octicons/icons/%s-dark.png", name) + return fmt.Sprintf(`%s`, darkIcon, lightIcon, lightIcon, name) } func generateToolsetsDoc(i *inventory.Inventory) string { From f4a8d471fdc16a7ec08bffe291aa64cd06b59384 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Wed, 17 Dec 2025 10:33:49 +0100 Subject: [PATCH 15/21] fix: remove redundant icons from individual tools Icons are kept on section headers and toolsets table only - having the same icon on every tool within a section was visually noisy and redundant. --- README.md | 190 ++++++++++++------------- cmd/github-mcp-server/generate_docs.go | 8 +- 2 files changed, 97 insertions(+), 101 deletions(-) diff --git a/README.md b/README.md index 6042cae79..4071874bd 100644 --- a/README.md +++ b/README.md @@ -490,22 +490,22 @@ The following sets of tools are available: workflow Actions -- workflow **cancel_workflow_run** - Cancel workflow run +- **cancel_workflow_run** - Cancel workflow run - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **delete_workflow_run_logs** - Delete workflow logs +- **delete_workflow_run_logs** - Delete workflow logs - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **download_workflow_run_artifact** - Download workflow artifact +- **download_workflow_run_artifact** - Download workflow artifact - `artifact_id`: The unique identifier of the artifact (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- workflow **get_job_logs** - Get job logs +- **get_job_logs** - Get job logs - `failed_only`: When true, gets logs for all failed jobs in run_id (boolean, optional) - `job_id`: The unique identifier of the workflow job (required for single job logs) (number, optional) - `owner`: Repository owner (string, required) @@ -514,22 +514,22 @@ The following sets of tools are available: - `run_id`: Workflow run ID (required when using failed_only) (number, optional) - `tail_lines`: Number of lines to return from the end of the log (number, optional) -- workflow **get_workflow_run** - Get workflow run +- **get_workflow_run** - Get workflow run - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **get_workflow_run_logs** - Get workflow run logs +- **get_workflow_run_logs** - Get workflow run logs - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **get_workflow_run_usage** - Get workflow usage +- **get_workflow_run_usage** - Get workflow usage - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **list_workflow_jobs** - List workflow jobs +- **list_workflow_jobs** - List workflow jobs - `filter`: Filters jobs by their completed_at timestamp (string, optional) - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) @@ -537,14 +537,14 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **list_workflow_run_artifacts** - List workflow artifacts +- **list_workflow_run_artifacts** - List workflow artifacts - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **list_workflow_runs** - List workflow runs +- **list_workflow_runs** - List workflow runs - `actor`: Returns someone's workflow runs. Use the login for the user who created the workflow run. (string, optional) - `branch`: Returns workflow runs associated with a branch. Use the name of the branch. (string, optional) - `event`: Returns workflow runs for a specific event type (string, optional) @@ -555,23 +555,23 @@ The following sets of tools are available: - `status`: Returns workflow runs with the check run status (string, optional) - `workflow_id`: The workflow ID or workflow file name (string, required) -- workflow **list_workflows** - List workflows +- **list_workflows** - List workflows - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- workflow **rerun_failed_jobs** - Rerun failed jobs +- **rerun_failed_jobs** - Rerun failed jobs - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **rerun_workflow_run** - Rerun workflow run +- **rerun_workflow_run** - Rerun workflow run - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `run_id`: The unique identifier of the workflow run (number, required) -- workflow **run_workflow** - Run workflow +- **run_workflow** - Run workflow - `inputs`: Inputs the workflow accepts (object, optional) - `owner`: Repository owner (string, required) - `ref`: The git reference for the workflow. The reference can be a branch or tag name. (string, required) @@ -584,12 +584,12 @@ The following sets of tools are available: codescan Code Security -- codescan **get_code_scanning_alert** - Get code scanning alert +- **get_code_scanning_alert** - Get code scanning alert - `alertNumber`: The number of the alert. (number, required) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- codescan **list_code_scanning_alerts** - List code scanning alerts +- **list_code_scanning_alerts** - List code scanning alerts - `owner`: The owner of the repository. (string, required) - `ref`: The Git reference for the results you want to list. (string, optional) - `repo`: The name of the repository. (string, required) @@ -603,14 +603,14 @@ The following sets of tools are available: person Context -- person **get_me** - Get my user profile +- **get_me** - Get my user profile - No parameters required -- person **get_team_members** - Get team members +- **get_team_members** - Get team members - `org`: Organization login (owner) that contains the team. (string, required) - `team_slug`: Team slug (string, required) -- person **get_teams** - Get teams +- **get_teams** - Get teams - `user`: Username to get teams for. If not provided, uses the authenticated user. (string, optional)
@@ -619,12 +619,12 @@ The following sets of tools are available: dependabot Dependabot -- dependabot **get_dependabot_alert** - Get dependabot alert +- **get_dependabot_alert** - Get dependabot alert - `alertNumber`: The number of the alert. (number, required) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- dependabot **list_dependabot_alerts** - List dependabot alerts +- **list_dependabot_alerts** - List dependabot alerts - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) - `severity`: Filter dependabot alerts by severity (string, optional) @@ -636,23 +636,23 @@ The following sets of tools are available: comment-discussion Discussions -- comment-discussion **get_discussion** - Get discussion +- **get_discussion** - Get discussion - `discussionNumber`: Discussion Number (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- comment-discussion **get_discussion_comments** - Get discussion comments +- **get_discussion_comments** - Get discussion comments - `after`: Cursor for pagination. Use the endCursor from the previous page's PageInfo for GraphQL APIs. (string, optional) - `discussionNumber`: Discussion Number (number, required) - `owner`: Repository owner (string, required) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- comment-discussion **list_discussion_categories** - List discussion categories +- **list_discussion_categories** - List discussion categories - `owner`: Repository owner (string, required) - `repo`: Repository name. If not provided, discussion categories will be queried at the organisation level. (string, optional) -- comment-discussion **list_discussions** - List discussions +- **list_discussions** - List discussions - `after`: Cursor for pagination. Use the endCursor from the previous page's PageInfo for GraphQL APIs. (string, optional) - `category`: Optional filter by discussion category ID. If provided, only discussions with this category are listed. (string, optional) - `direction`: Order direction. (string, optional) @@ -667,22 +667,22 @@ The following sets of tools are available: logo-gist Gists -- logo-gist **create_gist** - Create Gist +- **create_gist** - Create Gist - `content`: Content for simple single-file gist creation (string, required) - `description`: Description of the gist (string, optional) - `filename`: Filename for simple single-file gist creation (string, required) - `public`: Whether the gist is public (boolean, optional) -- logo-gist **get_gist** - Get Gist Content +- **get_gist** - Get Gist Content - `gist_id`: The ID of the gist (string, required) -- logo-gist **list_gists** - List Gists +- **list_gists** - List Gists - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `since`: Only gists updated after this time (ISO 8601 timestamp) (string, optional) - `username`: GitHub username (omit for authenticated user's gists) (string, optional) -- logo-gist **update_gist** - Update Gist +- **update_gist** - Update Gist - `content`: Content for the file (string, required) - `description`: Updated description of the gist (string, optional) - `filename`: Filename to update or create (string, required) @@ -694,7 +694,7 @@ The following sets of tools are available: git-branch Git -- git-branch **get_repository_tree** - Get repository tree +- **get_repository_tree** - Get repository tree - `owner`: Repository owner (username or organization) (string, required) - `path_filter`: Optional path prefix to filter the tree results (e.g., 'src/' to only show files in the src directory) (string, optional) - `recursive`: Setting this parameter to true returns the objects or subtrees referenced by the tree. Default is false (boolean, optional) @@ -707,23 +707,23 @@ The following sets of tools are available: issue-opened Issues -- issue-opened **add_issue_comment** - Add comment to issue +- **add_issue_comment** - Add comment to issue - `body`: Comment content (string, required) - `issue_number`: Issue number to comment on (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- issue-opened **assign_copilot_to_issue** - Assign Copilot to issue +- **assign_copilot_to_issue** - Assign Copilot to issue - `issueNumber`: Issue number (number, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- issue-opened **get_label** - Get a specific label from a repository. +- **get_label** - Get a specific label from a repository. - `name`: Label name. (string, required) - `owner`: Repository owner (username or organization name) (string, required) - `repo`: Repository name (string, required) -- issue-opened **issue_read** - Get issue details +- **issue_read** - Get issue details - `issue_number`: The number of the issue (number, required) - `method`: The read operation to perform on a single issue. Options are: @@ -737,7 +737,7 @@ The following sets of tools are available: - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: The name of the repository (string, required) -- issue-opened **issue_write** - Create or update issue. +- **issue_write** - Create or update issue. - `assignees`: Usernames to assign to this issue (string[], optional) - `body`: Issue body content (string, optional) - `duplicate_of`: Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'. (number, optional) @@ -756,10 +756,10 @@ The following sets of tools are available: - `title`: Issue title (string, optional) - `type`: Type of this issue. Only use if the repository has issue types configured. Use list_issue_types tool to get valid type values for the organization. If the repository doesn't support issue types, omit this parameter. (string, optional) -- issue-opened **list_issue_types** - List available issue types +- **list_issue_types** - List available issue types - `owner`: The organization owner of the repository (string, required) -- issue-opened **list_issues** - List issues +- **list_issues** - List issues - `after`: Cursor for pagination. Use the endCursor from the previous page's PageInfo for GraphQL APIs. (string, optional) - `direction`: Order direction. If provided, the 'orderBy' also needs to be provided. (string, optional) - `labels`: Filter by labels (string[], optional) @@ -770,7 +770,7 @@ The following sets of tools are available: - `since`: Filter by date (ISO 8601 timestamp) (string, optional) - `state`: Filter by state, by default both open and closed issues are returned when not provided (string, optional) -- issue-opened **search_issues** - Search issues +- **search_issues** - Search issues - `order`: Sort order (string, optional) - `owner`: Optional repository owner. If provided with repo, only issues for this repository are listed. (string, optional) - `page`: Page number for pagination (min 1) (number, optional) @@ -779,7 +779,7 @@ The following sets of tools are available: - `repo`: Optional repository name. If provided with owner, only issues for this repository are listed. (string, optional) - `sort`: Sort field by number of matches of categories, defaults to best match (string, optional) -- issue-opened **sub_issue_write** - Change sub-issue +- **sub_issue_write** - Change sub-issue - `after_id`: The ID of the sub-issue to be prioritized after (either after_id OR before_id should be specified) (number, optional) - `before_id`: The ID of the sub-issue to be prioritized before (either after_id OR before_id should be specified) (number, optional) - `issue_number`: The number of the parent issue (number, required) @@ -800,12 +800,12 @@ The following sets of tools are available: tag Labels -- tag **get_label** - Get a specific label from a repository. +- **get_label** - Get a specific label from a repository. - `name`: Label name. (string, required) - `owner`: Repository owner (username or organization name) (string, required) - `repo`: Repository name (string, required) -- tag **label_write** - Write operations on repository labels. +- **label_write** - Write operations on repository labels. - `color`: Label color as 6-character hex code without '#' prefix (e.g., 'f29513'). Required for 'create', optional for 'update'. (string, optional) - `description`: Label description text. Optional for 'create' and 'update'. (string, optional) - `method`: Operation to perform: 'create', 'update', or 'delete' (string, required) @@ -814,7 +814,7 @@ The following sets of tools are available: - `owner`: Repository owner (username or organization name) (string, required) - `repo`: Repository name (string, required) -- tag **list_label** - List labels from a repository +- **list_label** - List labels from a repository - `owner`: Repository owner (username or organization name) - required for all operations (string, required) - `repo`: Repository name - required for all operations (string, required) @@ -824,14 +824,14 @@ The following sets of tools are available: bell Notifications -- bell **dismiss_notification** - Dismiss notification +- **dismiss_notification** - Dismiss notification - `state`: The new state of the notification (read/done) (string, required) - `threadID`: The ID of the notification thread (string, required) -- bell **get_notification_details** - Get notification details +- **get_notification_details** - Get notification details - `notificationID`: The ID of the notification (string, required) -- bell **list_notifications** - List notifications +- **list_notifications** - List notifications - `before`: Only show notifications updated before the given time (ISO 8601 format) (string, optional) - `filter`: Filter notifications to, use default unless specified. Read notifications are ones that have already been acknowledged by the user. Participating notifications are those that the user is directly involved in, such as issues or pull requests they have commented on or created. (string, optional) - `owner`: Optional repository owner. If provided with repo, only notifications for this repository are listed. (string, optional) @@ -840,16 +840,16 @@ The following sets of tools are available: - `repo`: Optional repository name. If provided with owner, only notifications for this repository are listed. (string, optional) - `since`: Only show notifications updated after the given time (ISO 8601 format) (string, optional) -- bell **manage_notification_subscription** - Manage notification subscription +- **manage_notification_subscription** - Manage notification subscription - `action`: Action to perform: ignore, watch, or delete the notification subscription. (string, required) - `notificationID`: The ID of the notification thread. (string, required) -- bell **manage_repository_notification_subscription** - Manage repository notification subscription +- **manage_repository_notification_subscription** - Manage repository notification subscription - `action`: Action to perform: ignore, watch, or delete the repository notification subscription. (string, required) - `owner`: The account owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- bell **mark_all_notifications_read** - Mark all notifications as read +- **mark_all_notifications_read** - Mark all notifications as read - `lastReadAt`: Describes the last point that notifications were checked (optional). Default: Now (string, optional) - `owner`: Optional repository owner. If provided with repo, only notifications for this repository are marked as read. (string, optional) - `repo`: Optional repository name. If provided with owner, only notifications for this repository are marked as read. (string, optional) @@ -860,7 +860,7 @@ The following sets of tools are available: organization Organizations -- organization **search_orgs** - Search organizations +- **search_orgs** - Search organizations - `order`: Sort order (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) @@ -873,38 +873,38 @@ The following sets of tools are available: project Projects -- project **add_project_item** - Add project item +- **add_project_item** - Add project item - `item_id`: The numeric ID of the issue or pull request to add to the project. (number, required) - `item_type`: The item's type, either issue or pull_request. (string, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- project **delete_project_item** - Delete project item +- **delete_project_item** - Delete project item - `item_id`: The internal project item ID to delete from the project (not the issue or pull request ID). (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- project **get_project** - Get project +- **get_project** - Get project - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number (number, required) -- project **get_project_field** - Get project field +- **get_project_field** - Get project field - `field_id`: The field's id. (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- project **get_project_item** - Get project item +- **get_project_item** - Get project item - `fields`: Specific list of field IDs to include in the response (e.g. ["102589", "985201", "169875"]). If not provided, only the title field is included. (string[], optional) - `item_id`: The item's ID. (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) - `project_number`: The project's number. (number, required) -- project **list_project_fields** - List project fields +- **list_project_fields** - List project fields - `after`: Forward pagination cursor from previous pageInfo.nextCursor. (string, optional) - `before`: Backward pagination cursor from previous pageInfo.prevCursor (rare). (string, optional) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) @@ -912,7 +912,7 @@ The following sets of tools are available: - `per_page`: Results per page (max 50) (number, optional) - `project_number`: The project's number. (number, required) -- project **list_project_items** - List project items +- **list_project_items** - List project items - `after`: Forward pagination cursor from previous pageInfo.nextCursor. (string, optional) - `before`: Backward pagination cursor from previous pageInfo.prevCursor (rare). (string, optional) - `fields`: Field IDs to include (e.g. ["102589", "985201"]). CRITICAL: Always provide to get field values. Without this, only titles returned. (string[], optional) @@ -922,7 +922,7 @@ The following sets of tools are available: - `project_number`: The project's number. (number, required) - `query`: Query string for advanced filtering of project items using GitHub's project filtering syntax. (string, optional) -- project **list_projects** - List projects +- **list_projects** - List projects - `after`: Forward pagination cursor from previous pageInfo.nextCursor. (string, optional) - `before`: Backward pagination cursor from previous pageInfo.prevCursor (rare). (string, optional) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) @@ -930,7 +930,7 @@ The following sets of tools are available: - `per_page`: Results per page (max 50) (number, optional) - `query`: Filter projects by title text and open/closed state; permitted qualifiers: is:open, is:closed; examples: "roadmap is:open", "is:open feature planning". (string, optional) -- project **update_project_item** - Update project item +- **update_project_item** - Update project item - `item_id`: The unique identifier of the project item. This is not the issue or pull request ID. (number, required) - `owner`: If owner_type == user it is the handle for the GitHub user account. If owner_type == org it is the name of the organization. The name is not case sensitive. (string, required) - `owner_type`: Owner type (string, required) @@ -943,7 +943,7 @@ The following sets of tools are available: git-pull-request Pull Requests -- git-pull-request **add_comment_to_pending_review** - Add review comment to the requester's latest pending pull request review +- **add_comment_to_pending_review** - Add review comment to the requester's latest pending pull request review - `body`: The text of the review comment (string, required) - `line`: The line of the blob in the pull request diff that the comment applies to. For multi-line comments, the last line of the range (number, optional) - `owner`: Repository owner (string, required) @@ -955,7 +955,7 @@ The following sets of tools are available: - `startSide`: For multi-line comments, the starting side of the diff that the comment applies to. LEFT indicates the previous state, RIGHT indicates the new state (string, optional) - `subjectType`: The level at which the comment is targeted (string, required) -- git-pull-request **create_pull_request** - Open new pull request +- **create_pull_request** - Open new pull request - `base`: Branch to merge into (string, required) - `body`: PR description (string, optional) - `draft`: Create as draft PR (boolean, optional) @@ -965,7 +965,7 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `title`: PR title (string, required) -- git-pull-request **list_pull_requests** - List pull requests +- **list_pull_requests** - List pull requests - `base`: Filter by base branch (string, optional) - `direction`: Sort direction (string, optional) - `head`: Filter by head user/org and branch (string, optional) @@ -976,7 +976,7 @@ The following sets of tools are available: - `sort`: Sort by (string, optional) - `state`: Filter by state (string, optional) -- git-pull-request **merge_pull_request** - Merge pull request +- **merge_pull_request** - Merge pull request - `commit_message`: Extra detail for merge commit (string, optional) - `commit_title`: Title for merge commit (string, optional) - `merge_method`: Merge method (string, optional) @@ -984,7 +984,7 @@ The following sets of tools are available: - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- git-pull-request **pull_request_read** - Get details for a single pull request +- **pull_request_read** - Get details for a single pull request - `method`: Action to specify what pull request data needs to be retrieved from GitHub. Possible options: 1. get - Get details of a specific pull request. @@ -1001,7 +1001,7 @@ The following sets of tools are available: - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- git-pull-request **pull_request_review_write** - Write operations (create, submit, delete) on pull request reviews. +- **pull_request_review_write** - Write operations (create, submit, delete) on pull request reviews. - `body`: Review comment text (string, optional) - `commitID`: SHA of commit to review (string, optional) - `event`: Review action to perform. (string, optional) @@ -1010,12 +1010,12 @@ The following sets of tools are available: - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- git-pull-request **request_copilot_review** - Request Copilot review +- **request_copilot_review** - Request Copilot review - `owner`: Repository owner (string, required) - `pullNumber`: Pull request number (number, required) - `repo`: Repository name (string, required) -- git-pull-request **search_pull_requests** - Search pull requests +- **search_pull_requests** - Search pull requests - `order`: Sort order (string, optional) - `owner`: Optional repository owner. If provided with repo, only pull requests for this repository are listed. (string, optional) - `page`: Page number for pagination (min 1) (number, optional) @@ -1024,7 +1024,7 @@ The following sets of tools are available: - `repo`: Optional repository name. If provided with owner, only pull requests for this repository are listed. (string, optional) - `sort`: Sort field by number of matches of categories, defaults to best match (string, optional) -- git-pull-request **update_pull_request** - Edit pull request +- **update_pull_request** - Edit pull request - `base`: New base branch name (string, optional) - `body`: New description (string, optional) - `draft`: Mark pull request as draft (true) or ready for review (false) (boolean, optional) @@ -1036,7 +1036,7 @@ The following sets of tools are available: - `state`: New state (string, optional) - `title`: New title (string, optional) -- git-pull-request **update_pull_request_branch** - Update pull request branch +- **update_pull_request_branch** - Update pull request branch - `expectedHeadSha`: The expected SHA of the pull request's HEAD ref (string, optional) - `owner`: Repository owner (string, required) - `pullNumber`: Pull request number (number, required) @@ -1048,13 +1048,13 @@ The following sets of tools are available: repo Repositories -- repo **create_branch** - Create branch +- **create_branch** - Create branch - `branch`: Name for new branch (string, required) - `from_branch`: Source branch (defaults to repo default) (string, optional) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- repo **create_or_update_file** - Create or update file +- **create_or_update_file** - Create or update file - `branch`: Branch to create/update the file in (string, required) - `content`: Content of the file (string, required) - `message`: Commit message (string, required) @@ -1063,26 +1063,26 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `sha`: The blob SHA of the file being replaced. (string, optional) -- repo **create_repository** - Create repository +- **create_repository** - Create repository - `autoInit`: Initialize with README (boolean, optional) - `description`: Repository description (string, optional) - `name`: Repository name (string, required) - `organization`: Organization to create the repository in (omit to create in your personal account) (string, optional) - `private`: Whether repo should be private (boolean, optional) -- repo **delete_file** - Delete file +- **delete_file** - Delete file - `branch`: Branch to delete the file from (string, required) - `message`: Commit message (string, required) - `owner`: Repository owner (username or organization) (string, required) - `path`: Path to the file to delete (string, required) - `repo`: Repository name (string, required) -- repo **fork_repository** - Fork repository +- **fork_repository** - Fork repository - `organization`: Organization to fork to (string, optional) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- repo **get_commit** - Get commit details +- **get_commit** - Get commit details - `include_diff`: Whether to include file diffs and stats in the response. Default is true. (boolean, optional) - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) @@ -1090,34 +1090,34 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `sha`: Commit SHA, branch name, or tag name (string, required) -- repo **get_file_contents** - Get file or directory contents +- **get_file_contents** - Get file or directory contents - `owner`: Repository owner (username or organization) (string, required) - `path`: Path to file/directory (string, optional) - `ref`: Accepts optional git refs such as `refs/tags/{tag}`, `refs/heads/{branch}` or `refs/pull/{pr_number}/head` (string, optional) - `repo`: Repository name (string, required) - `sha`: Accepts optional commit SHA. If specified, it will be used instead of ref (string, optional) -- repo **get_latest_release** - Get latest release +- **get_latest_release** - Get latest release - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- repo **get_release_by_tag** - Get a release by tag name +- **get_release_by_tag** - Get a release by tag name - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `tag`: Tag name (e.g., 'v1.0.0') (string, required) -- repo **get_tag** - Get tag details +- **get_tag** - Get tag details - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) - `tag`: Tag name (string, required) -- repo **list_branches** - List branches +- **list_branches** - List branches - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- repo **list_commits** - List commits +- **list_commits** - List commits - `author`: Author username or email address to filter commits by (string, optional) - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) @@ -1125,33 +1125,33 @@ The following sets of tools are available: - `repo`: Repository name (string, required) - `sha`: Commit SHA, branch or tag name to list commits of. If not provided, uses the default branch of the repository. If a commit SHA is provided, will list commits up to that SHA. (string, optional) -- repo **list_releases** - List releases +- **list_releases** - List releases - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- repo **list_tags** - List tags +- **list_tags** - List tags - `owner`: Repository owner (string, required) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `repo`: Repository name (string, required) -- repo **push_files** - Push files to repository +- **push_files** - Push files to repository - `branch`: Branch to push to (string, required) - `files`: Array of file objects to push, each object with path (string) and content (string) (object[], required) - `message`: Commit message (string, required) - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- repo **search_code** - Search code +- **search_code** - Search code - `order`: Sort order for results (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `query`: Search query using GitHub's powerful code search syntax. Examples: 'content:Skill language:Java org:github', 'NOT is:archived language:Python OR language:go', 'repo:github/github-mcp-server'. Supports exact matching, language filters, path filters, and more. (string, required) - `sort`: Sort field ('indexed' only) (string, optional) -- repo **search_repositories** - Search repositories +- **search_repositories** - Search repositories - `minimal_output`: Return minimal repository information (default: true). When false, returns full GitHub API repository objects. (boolean, optional) - `order`: Sort order (string, optional) - `page`: Page number for pagination (min 1) (number, optional) @@ -1165,12 +1165,12 @@ The following sets of tools are available: shield-lock Secret Protection -- shield-lock **get_secret_scanning_alert** - Get secret scanning alert +- **get_secret_scanning_alert** - Get secret scanning alert - `alertNumber`: The number of the alert. (number, required) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) -- shield-lock **list_secret_scanning_alerts** - List secret scanning alerts +- **list_secret_scanning_alerts** - List secret scanning alerts - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) - `resolution`: Filter by resolution (string, optional) @@ -1183,10 +1183,10 @@ The following sets of tools are available: shield Security Advisories -- shield **get_global_security_advisory** - Get a global security advisory +- **get_global_security_advisory** - Get a global security advisory - `ghsaId`: GitHub Security Advisory ID (format: GHSA-xxxx-xxxx-xxxx). (string, required) -- shield **list_global_security_advisories** - List global security advisories +- **list_global_security_advisories** - List global security advisories - `affects`: Filter advisories by affected package or version (e.g. "package1,package2@1.0.0"). (string, optional) - `cveId`: Filter by CVE ID. (string, optional) - `cwes`: Filter by Common Weakness Enumeration IDs (e.g. ["79", "284", "22"]). (string[], optional) @@ -1199,13 +1199,13 @@ The following sets of tools are available: - `type`: Advisory type. (string, optional) - `updated`: Filter by update date or date range (ISO 8601 date or range). (string, optional) -- shield **list_org_repository_security_advisories** - List org repository security advisories +- **list_org_repository_security_advisories** - List org repository security advisories - `direction`: Sort direction. (string, optional) - `org`: The organization login. (string, required) - `sort`: Sort field. (string, optional) - `state`: Filter by advisory state. (string, optional) -- shield **list_repository_security_advisories** - List repository security advisories +- **list_repository_security_advisories** - List repository security advisories - `direction`: Sort direction. (string, optional) - `owner`: The owner of the repository. (string, required) - `repo`: The name of the repository. (string, required) @@ -1218,18 +1218,18 @@ The following sets of tools are available: star Stargazers -- star **list_starred_repositories** - List starred repositories +- **list_starred_repositories** - List starred repositories - `direction`: The direction to sort the results by. (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `sort`: How to sort the results. Can be either 'created' (when the repository was starred) or 'updated' (when the repository was last pushed to). (string, optional) - `username`: Username to list starred repositories for. Defaults to the authenticated user. (string, optional) -- star **star_repository** - Star repository +- **star_repository** - Star repository - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) -- star **unstar_repository** - Unstar repository +- **unstar_repository** - Unstar repository - `owner`: Repository owner (string, required) - `repo`: Repository name (string, required) @@ -1239,7 +1239,7 @@ The following sets of tools are available: people Users -- people **search_users** - Search users +- **search_users** - Search users - `order`: Sort order (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) diff --git a/cmd/github-mcp-server/generate_docs.go b/cmd/github-mcp-server/generate_docs.go index 93988d1df..34d53d3f0 100644 --- a/cmd/github-mcp-server/generate_docs.go +++ b/cmd/github-mcp-server/generate_docs.go @@ -213,12 +213,8 @@ func formatToolsetName(name string) string { } func writeToolDoc(buf *strings.Builder, tool mcp.Tool, icon string) { - // Tool name with icon (using annotation name instead of verbose description) - iconImg := octiconImg(icon) - if iconImg != "" { - iconImg += " " - } - fmt.Fprintf(buf, "- %s**%s** - %s\n", iconImg, tool.Name, tool.Annotations.Title) + // Tool name (no icon - section header already has the toolset icon) + fmt.Fprintf(buf, "- **%s** - %s\n", tool.Name, tool.Annotations.Title) // Parameters if tool.InputSchema == nil { From 6e7948c9a21adc50ee61a455af722c9455469a5f Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Wed, 17 Dec 2025 10:40:03 +0100 Subject: [PATCH 16/21] Add icons to remote server toolsets documentation --- cmd/github-mcp-server/generate_docs.go | 15 ++++++---- docs/remote-server.md | 40 +++++++++++++------------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/cmd/github-mcp-server/generate_docs.go b/cmd/github-mcp-server/generate_docs.go index 34d53d3f0..fa20888be 100644 --- a/cmd/github-mcp-server/generate_docs.go +++ b/cmd/github-mcp-server/generate_docs.go @@ -325,12 +325,13 @@ func generateRemoteToolsetsDoc() string { // Build inventory - stateless r := github.NewInventory(t).Build() - // Generate table header - buf.WriteString("| Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) |\n") - buf.WriteString("|----------------|--------------------------------------------------|-------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n") + // Generate table header (with icon column) + buf.WriteString("| | Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) |\n") + buf.WriteString("| --- | ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- |\n") // Add "all" toolset first (special case) - buf.WriteString("| all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2F%22%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Freadonly%22%7D) |\n") + allIcon := octiconImg("apps") + fmt.Fprintf(&buf, "| %s | all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%%7B%%22type%%22%%3A%%20%%22http%%22%%2C%%22url%%22%%3A%%20%%22https%%3A%%2F%%2Fapi.githubcopilot.com%%2Fmcp%%2F%%22%%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%%7B%%22type%%22%%3A%%20%%22http%%22%%2C%%22url%%22%%3A%%20%%22https%%3A%%2F%%2Fapi.githubcopilot.com%%2Fmcp%%2Freadonly%%22%%7D) |\n", allIcon) // AvailableToolsets() returns toolsets that have tools, sorted by ID // Exclude context (handled separately) and dynamic (internal only) @@ -352,12 +353,14 @@ func generateRemoteToolsetsDoc() string { installLink := fmt.Sprintf("[Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-%s&config=%s)", idStr, installConfig) readonlyInstallLink := fmt.Sprintf("[Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-%s&config=%s)", idStr, readonlyConfig) - fmt.Fprintf(&buf, "| %-14s | %-48s | %-53s | %-218s | %-110s | %-288s |\n", + icon := octiconImg(ts.Icon) + fmt.Fprintf(&buf, "| %s | %s | %s | %s | %s | [read-only](%s) | %s |\n", + icon, formattedName, ts.Description, apiURL, installLink, - fmt.Sprintf("[read-only](%s)", readonlyURL), + readonlyURL, readonlyInstallLink, ) } diff --git a/docs/remote-server.md b/docs/remote-server.md index 53fe36127..4f2a9c4c3 100644 --- a/docs/remote-server.md +++ b/docs/remote-server.md @@ -17,26 +17,26 @@ The remote server has [additional tools](#toolsets-only-available-in-the-remote- Below is a table of available toolsets for the remote GitHub MCP Server. Each toolset is provided as a distinct URL so you can mix and match to create the perfect combination of tools for your use-case. Add `/readonly` to the end of any URL to restrict the tools in the toolset to only those that enable read access. We also provide the option to use [headers](#headers) instead. -| Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) | -|----------------|--------------------------------------------------|-------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2F%22%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Freadonly%22%7D) | -| Actions | GitHub Actions workflows and CI/CD operations | https://api.githubcopilot.com/mcp/x/actions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/actions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%2Freadonly%22%7D) | -| Code Security | Code security related tools, such as GitHub Code Scanning | https://api.githubcopilot.com/mcp/x/code_security | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/code_security/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%2Freadonly%22%7D) | -| Dependabot | Dependabot tools | https://api.githubcopilot.com/mcp/x/dependabot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/dependabot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%2Freadonly%22%7D) | -| Discussions | GitHub Discussions related tools | https://api.githubcopilot.com/mcp/x/discussions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/discussions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%2Freadonly%22%7D) | -| Gists | GitHub Gist related tools | https://api.githubcopilot.com/mcp/x/gists | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/gists/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%2Freadonly%22%7D) | -| Git | GitHub Git API related tools for low-level Git operations | https://api.githubcopilot.com/mcp/x/git | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/git/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%2Freadonly%22%7D) | -| Issues | GitHub Issues related tools | https://api.githubcopilot.com/mcp/x/issues | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/issues/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%2Freadonly%22%7D) | -| Labels | GitHub Labels related tools | https://api.githubcopilot.com/mcp/x/labels | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/labels/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%2Freadonly%22%7D) | -| Notifications | GitHub Notifications related tools | https://api.githubcopilot.com/mcp/x/notifications | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/notifications/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%2Freadonly%22%7D) | -| Organizations | GitHub Organization related tools | https://api.githubcopilot.com/mcp/x/orgs | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/orgs/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%2Freadonly%22%7D) | -| Projects | GitHub Projects related tools | https://api.githubcopilot.com/mcp/x/projects | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/projects/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%2Freadonly%22%7D) | -| Pull Requests | GitHub Pull Request related tools | https://api.githubcopilot.com/mcp/x/pull_requests | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/pull_requests/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%2Freadonly%22%7D) | -| Repositories | GitHub Repository related tools | https://api.githubcopilot.com/mcp/x/repos | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/repos/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%2Freadonly%22%7D) | -| Secret Protection | Secret protection related tools, such as GitHub Secret Scanning | https://api.githubcopilot.com/mcp/x/secret_protection | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/secret_protection/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%2Freadonly%22%7D) | -| Security Advisories | Security advisories related tools | https://api.githubcopilot.com/mcp/x/security_advisories | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/security_advisories/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%2Freadonly%22%7D) | -| Stargazers | GitHub Stargazers related tools | https://api.githubcopilot.com/mcp/x/stargazers | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/stargazers/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%2Freadonly%22%7D) | -| Users | GitHub User related tools | https://api.githubcopilot.com/mcp/x/users | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/users/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%2Freadonly%22%7D) | +| | Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) | +| --- | ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- | +| apps | all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2F%22%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Freadonly%22%7D) | +| workflow | Actions | GitHub Actions workflows and CI/CD operations | https://api.githubcopilot.com/mcp/x/actions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/actions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%2Freadonly%22%7D) | +| codescan | Code Security | Code security related tools, such as GitHub Code Scanning | https://api.githubcopilot.com/mcp/x/code_security | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/code_security/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%2Freadonly%22%7D) | +| dependabot | Dependabot | Dependabot tools | https://api.githubcopilot.com/mcp/x/dependabot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/dependabot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%2Freadonly%22%7D) | +| comment-discussion | Discussions | GitHub Discussions related tools | https://api.githubcopilot.com/mcp/x/discussions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/discussions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%2Freadonly%22%7D) | +| logo-gist | Gists | GitHub Gist related tools | https://api.githubcopilot.com/mcp/x/gists | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/gists/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%2Freadonly%22%7D) | +| git-branch | Git | GitHub Git API related tools for low-level Git operations | https://api.githubcopilot.com/mcp/x/git | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/git/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%2Freadonly%22%7D) | +| issue-opened | Issues | GitHub Issues related tools | https://api.githubcopilot.com/mcp/x/issues | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/issues/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%2Freadonly%22%7D) | +| tag | Labels | GitHub Labels related tools | https://api.githubcopilot.com/mcp/x/labels | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/labels/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%2Freadonly%22%7D) | +| bell | Notifications | GitHub Notifications related tools | https://api.githubcopilot.com/mcp/x/notifications | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/notifications/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%2Freadonly%22%7D) | +| organization | Organizations | GitHub Organization related tools | https://api.githubcopilot.com/mcp/x/orgs | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/orgs/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%2Freadonly%22%7D) | +| project | Projects | GitHub Projects related tools | https://api.githubcopilot.com/mcp/x/projects | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/projects/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%2Freadonly%22%7D) | +| git-pull-request | Pull Requests | GitHub Pull Request related tools | https://api.githubcopilot.com/mcp/x/pull_requests | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/pull_requests/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%2Freadonly%22%7D) | +| repo | Repositories | GitHub Repository related tools | https://api.githubcopilot.com/mcp/x/repos | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/repos/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%2Freadonly%22%7D) | +| shield-lock | Secret Protection | Secret protection related tools, such as GitHub Secret Scanning | https://api.githubcopilot.com/mcp/x/secret_protection | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/secret_protection/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%2Freadonly%22%7D) | +| shield | Security Advisories | Security advisories related tools | https://api.githubcopilot.com/mcp/x/security_advisories | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/security_advisories/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%2Freadonly%22%7D) | +| star | Stargazers | GitHub Stargazers related tools | https://api.githubcopilot.com/mcp/x/stargazers | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/stargazers/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%2Freadonly%22%7D) | +| people | Users | GitHub User related tools | https://api.githubcopilot.com/mcp/x/users | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/users/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%2Freadonly%22%7D) | ### Additional _Remote_ Server Toolsets From 3df07ae62722b84cdf1812c89cfc99a3d806a4f7 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Wed, 17 Dec 2025 10:47:24 +0100 Subject: [PATCH 17/21] Fix icon paths for docs/remote-server.md --- cmd/github-mcp-server/generate_docs.go | 15 +++++++---- docs/remote-server.md | 36 +++++++++++++------------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/cmd/github-mcp-server/generate_docs.go b/cmd/github-mcp-server/generate_docs.go index fa20888be..7c8eff590 100644 --- a/cmd/github-mcp-server/generate_docs.go +++ b/cmd/github-mcp-server/generate_docs.go @@ -107,14 +107,19 @@ func generateRemoteServerDocs(docsPath string) error { // octiconImg returns an img tag for an Octicon that works with GitHub's light/dark theme. // Uses picture element with prefers-color-scheme for automatic theme switching. // References icons from the repo's pkg/octicons/icons directory. -func octiconImg(name string) string { +// Optional pathPrefix for files in subdirectories (e.g., "../" for docs/). +func octiconImg(name string, pathPrefix ...string) string { if name == "" { return "" } + prefix := "" + if len(pathPrefix) > 0 { + prefix = pathPrefix[0] + } // Use picture element with media queries for light/dark mode support // GitHub renders these correctly in markdown - lightIcon := fmt.Sprintf("pkg/octicons/icons/%s-light.png", name) - darkIcon := fmt.Sprintf("pkg/octicons/icons/%s-dark.png", name) + lightIcon := fmt.Sprintf("%spkg/octicons/icons/%s-light.png", prefix, name) + darkIcon := fmt.Sprintf("%spkg/octicons/icons/%s-dark.png", prefix, name) return fmt.Sprintf(`%s`, darkIcon, lightIcon, lightIcon, name) } @@ -330,7 +335,7 @@ func generateRemoteToolsetsDoc() string { buf.WriteString("| --- | ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- |\n") // Add "all" toolset first (special case) - allIcon := octiconImg("apps") + allIcon := octiconImg("apps", "../") fmt.Fprintf(&buf, "| %s | all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%%7B%%22type%%22%%3A%%20%%22http%%22%%2C%%22url%%22%%3A%%20%%22https%%3A%%2F%%2Fapi.githubcopilot.com%%2Fmcp%%2F%%22%%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%%7B%%22type%%22%%3A%%20%%22http%%22%%2C%%22url%%22%%3A%%20%%22https%%3A%%2F%%2Fapi.githubcopilot.com%%2Fmcp%%2Freadonly%%22%%7D) |\n", allIcon) // AvailableToolsets() returns toolsets that have tools, sorted by ID @@ -353,7 +358,7 @@ func generateRemoteToolsetsDoc() string { installLink := fmt.Sprintf("[Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-%s&config=%s)", idStr, installConfig) readonlyInstallLink := fmt.Sprintf("[Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-%s&config=%s)", idStr, readonlyConfig) - icon := octiconImg(ts.Icon) + icon := octiconImg(ts.Icon, "../") fmt.Fprintf(&buf, "| %s | %s | %s | %s | %s | [read-only](%s) | %s |\n", icon, formattedName, diff --git a/docs/remote-server.md b/docs/remote-server.md index 4f2a9c4c3..f4521bf8d 100644 --- a/docs/remote-server.md +++ b/docs/remote-server.md @@ -19,24 +19,24 @@ Below is a table of available toolsets for the remote GitHub MCP Server. Each to | | Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) | | --- | ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- | -| apps | all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2F%22%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Freadonly%22%7D) | -| workflow | Actions | GitHub Actions workflows and CI/CD operations | https://api.githubcopilot.com/mcp/x/actions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/actions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%2Freadonly%22%7D) | -| codescan | Code Security | Code security related tools, such as GitHub Code Scanning | https://api.githubcopilot.com/mcp/x/code_security | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/code_security/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%2Freadonly%22%7D) | -| dependabot | Dependabot | Dependabot tools | https://api.githubcopilot.com/mcp/x/dependabot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/dependabot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%2Freadonly%22%7D) | -| comment-discussion | Discussions | GitHub Discussions related tools | https://api.githubcopilot.com/mcp/x/discussions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/discussions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%2Freadonly%22%7D) | -| logo-gist | Gists | GitHub Gist related tools | https://api.githubcopilot.com/mcp/x/gists | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/gists/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%2Freadonly%22%7D) | -| git-branch | Git | GitHub Git API related tools for low-level Git operations | https://api.githubcopilot.com/mcp/x/git | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/git/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%2Freadonly%22%7D) | -| issue-opened | Issues | GitHub Issues related tools | https://api.githubcopilot.com/mcp/x/issues | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/issues/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%2Freadonly%22%7D) | -| tag | Labels | GitHub Labels related tools | https://api.githubcopilot.com/mcp/x/labels | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/labels/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%2Freadonly%22%7D) | -| bell | Notifications | GitHub Notifications related tools | https://api.githubcopilot.com/mcp/x/notifications | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/notifications/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%2Freadonly%22%7D) | -| organization | Organizations | GitHub Organization related tools | https://api.githubcopilot.com/mcp/x/orgs | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/orgs/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%2Freadonly%22%7D) | -| project | Projects | GitHub Projects related tools | https://api.githubcopilot.com/mcp/x/projects | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/projects/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%2Freadonly%22%7D) | -| git-pull-request | Pull Requests | GitHub Pull Request related tools | https://api.githubcopilot.com/mcp/x/pull_requests | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/pull_requests/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%2Freadonly%22%7D) | -| repo | Repositories | GitHub Repository related tools | https://api.githubcopilot.com/mcp/x/repos | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/repos/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%2Freadonly%22%7D) | -| shield-lock | Secret Protection | Secret protection related tools, such as GitHub Secret Scanning | https://api.githubcopilot.com/mcp/x/secret_protection | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/secret_protection/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%2Freadonly%22%7D) | -| shield | Security Advisories | Security advisories related tools | https://api.githubcopilot.com/mcp/x/security_advisories | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/security_advisories/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%2Freadonly%22%7D) | -| star | Stargazers | GitHub Stargazers related tools | https://api.githubcopilot.com/mcp/x/stargazers | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/stargazers/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%2Freadonly%22%7D) | -| people | Users | GitHub User related tools | https://api.githubcopilot.com/mcp/x/users | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/users/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%2Freadonly%22%7D) | +| apps | all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2F%22%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Freadonly%22%7D) | +| workflow | Actions | GitHub Actions workflows and CI/CD operations | https://api.githubcopilot.com/mcp/x/actions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/actions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%2Freadonly%22%7D) | +| codescan | Code Security | Code security related tools, such as GitHub Code Scanning | https://api.githubcopilot.com/mcp/x/code_security | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/code_security/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%2Freadonly%22%7D) | +| dependabot | Dependabot | Dependabot tools | https://api.githubcopilot.com/mcp/x/dependabot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/dependabot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%2Freadonly%22%7D) | +| comment-discussion | Discussions | GitHub Discussions related tools | https://api.githubcopilot.com/mcp/x/discussions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/discussions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%2Freadonly%22%7D) | +| logo-gist | Gists | GitHub Gist related tools | https://api.githubcopilot.com/mcp/x/gists | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/gists/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%2Freadonly%22%7D) | +| git-branch | Git | GitHub Git API related tools for low-level Git operations | https://api.githubcopilot.com/mcp/x/git | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/git/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%2Freadonly%22%7D) | +| issue-opened | Issues | GitHub Issues related tools | https://api.githubcopilot.com/mcp/x/issues | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/issues/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%2Freadonly%22%7D) | +| tag | Labels | GitHub Labels related tools | https://api.githubcopilot.com/mcp/x/labels | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/labels/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%2Freadonly%22%7D) | +| bell | Notifications | GitHub Notifications related tools | https://api.githubcopilot.com/mcp/x/notifications | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/notifications/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%2Freadonly%22%7D) | +| organization | Organizations | GitHub Organization related tools | https://api.githubcopilot.com/mcp/x/orgs | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/orgs/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%2Freadonly%22%7D) | +| project | Projects | GitHub Projects related tools | https://api.githubcopilot.com/mcp/x/projects | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/projects/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%2Freadonly%22%7D) | +| git-pull-request | Pull Requests | GitHub Pull Request related tools | https://api.githubcopilot.com/mcp/x/pull_requests | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/pull_requests/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%2Freadonly%22%7D) | +| repo | Repositories | GitHub Repository related tools | https://api.githubcopilot.com/mcp/x/repos | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/repos/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%2Freadonly%22%7D) | +| shield-lock | Secret Protection | Secret protection related tools, such as GitHub Secret Scanning | https://api.githubcopilot.com/mcp/x/secret_protection | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/secret_protection/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%2Freadonly%22%7D) | +| shield | Security Advisories | Security advisories related tools | https://api.githubcopilot.com/mcp/x/security_advisories | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/security_advisories/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%2Freadonly%22%7D) | +| star | Stargazers | GitHub Stargazers related tools | https://api.githubcopilot.com/mcp/x/stargazers | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/stargazers/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%2Freadonly%22%7D) | +| people | Users | GitHub User related tools | https://api.githubcopilot.com/mcp/x/users | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/users/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%2Freadonly%22%7D) | ### Additional _Remote_ Server Toolsets From 54fac0041941e17bcbc8eddc940badf595421531 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Wed, 17 Dec 2025 11:03:03 +0100 Subject: [PATCH 18/21] Add remote-only toolsets with auto-generated documentation and icons guide - Add ToolsetMetadataCopilot, ToolsetMetadataCopilotSpaces, ToolsetMetadataSupportSearch - Add RemoteOnlyToolsets() function to return remote-only toolset metadata - Update doc generator to auto-generate remote-only toolsets table with icons - Create docs/toolsets-and-icons.md explaining how to add icons to toolsets - Add link to icons guide in CONTRIBUTING.md --- CONTRIBUTING.md | 1 + cmd/github-mcp-server/generate_docs.go | 47 ++++++++ docs/remote-server.md | 12 +- docs/toolsets-and-icons.md | 160 +++++++++++++++++++++++++ pkg/github/tools.go | 29 +++++ 5 files changed, 244 insertions(+), 5 deletions(-) create mode 100644 docs/toolsets-and-icons.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9bbf555e1..6c16cd27d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,6 +40,7 @@ These are one time installations required to be able to test your changes locall - Update snapshots and run tests: `UPDATE_TOOLSNAPS=true go test ./...` - Update readme documentation: `script/generate-docs` - If renaming a tool, add a deprecation alias (see [Tool Renaming Guide](docs/tool-renaming.md)) + - For toolset and icon configuration, see [Toolsets and Icons Guide](docs/toolsets-and-icons.md) 6. Push to your fork and [submit a pull request][pr] targeting the `main` branch 7. Pat yourself on the back and wait for your pull request to be reviewed and merged. diff --git a/cmd/github-mcp-server/generate_docs.go b/cmd/github-mcp-server/generate_docs.go index 7c8eff590..3ee60476d 100644 --- a/cmd/github-mcp-server/generate_docs.go +++ b/cmd/github-mcp-server/generate_docs.go @@ -101,6 +101,13 @@ func generateRemoteServerDocs(docsPath string) error { return err } + // Also generate remote-only toolsets section + remoteOnlyDoc := generateRemoteOnlyToolsetsDoc() + updatedContent, err = replaceSection(updatedContent, "START AUTOMATED REMOTE TOOLSETS", "END AUTOMATED REMOTE TOOLSETS", remoteOnlyDoc) + if err != nil { + return err + } + return os.WriteFile(docsPath, []byte(updatedContent), 0600) //#nosec G306 } @@ -373,6 +380,46 @@ func generateRemoteToolsetsDoc() string { return strings.TrimSuffix(buf.String(), "\n") } +func generateRemoteOnlyToolsetsDoc() string { + var buf strings.Builder + + // Generate table header (with icon column) + buf.WriteString("| | Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) |\n") + buf.WriteString("| --- | ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- |\n") + + // Use RemoteOnlyToolsets from github package + for _, ts := range github.RemoteOnlyToolsets() { + idStr := string(ts.ID) + + formattedName := formatToolsetName(idStr) + apiURL := fmt.Sprintf("https://api.githubcopilot.com/mcp/x/%s", idStr) + readonlyURL := fmt.Sprintf("https://api.githubcopilot.com/mcp/x/%s/readonly", idStr) + + // Create install config JSON (URL encoded) + installConfig := url.QueryEscape(fmt.Sprintf(`{"type": "http","url": "%s"}`, apiURL)) + readonlyConfig := url.QueryEscape(fmt.Sprintf(`{"type": "http","url": "%s"}`, readonlyURL)) + + // Fix URL encoding to use %20 instead of + for spaces + installConfig = strings.ReplaceAll(installConfig, "+", "%20") + readonlyConfig = strings.ReplaceAll(readonlyConfig, "+", "%20") + + installLink := fmt.Sprintf("[Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-%s&config=%s)", idStr, installConfig) + readonlyInstallLink := fmt.Sprintf("[Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-%s&config=%s)", idStr, readonlyConfig) + + icon := octiconImg(ts.Icon, "../") + fmt.Fprintf(&buf, "| %s | %s | %s | %s | %s | [read-only](%s) | %s |\n", + icon, + formattedName, + ts.Description, + apiURL, + installLink, + readonlyURL, + readonlyInstallLink, + ) + } + + return strings.TrimSuffix(buf.String(), "\n") +} func generateDeprecatedAliasesDocs(docsPath string) error { // Read the current file content, err := os.ReadFile(docsPath) //#nosec G304 diff --git a/docs/remote-server.md b/docs/remote-server.md index f4521bf8d..5e768dbc8 100644 --- a/docs/remote-server.md +++ b/docs/remote-server.md @@ -43,11 +43,13 @@ Below is a table of available toolsets for the remote GitHub MCP Server. Each to These toolsets are only available in the remote GitHub MCP Server and are not included in the local MCP server. -| Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) | -| -------------------- | --------------------------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Copilot | Copilot related tools | https://api.githubcopilot.com/mcp/x/copilot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/copilot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot%2Freadonly%22%7D) | -| Copilot Spaces | Copilot Spaces tools | https://api.githubcopilot.com/mcp/x/copilot_spaces | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot_spaces&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot_spaces%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/copilot_spaces/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot_spaces&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot_spaces%2Freadonly%22%7D) | -| GitHub support docs search | Retrieve documentation to answer GitHub product and support questions. Topics include: GitHub Actions Workflows, Authentication, ... | https://api.githubcopilot.com/mcp/x/github_support_docs_search | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-support&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgithub_support_docs_search%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/github_support_docs_search/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-support&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgithub_support_docs_search%2Freadonly%22%7D) | + +| | Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) | +| --- | ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- | +| copilot | Copilot | Copilot related tools | https://api.githubcopilot.com/mcp/x/copilot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/copilot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot%2Freadonly%22%7D) | +| copilot | Copilot Spaces | Copilot Spaces tools | https://api.githubcopilot.com/mcp/x/copilot_spaces | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot_spaces&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot_spaces%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/copilot_spaces/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot_spaces&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot_spaces%2Freadonly%22%7D) | +| book | Github Support Docs Search | Retrieve documentation to answer GitHub product and support questions. Topics include: GitHub Actions Workflows, Authentication, ... | https://api.githubcopilot.com/mcp/x/github_support_docs_search | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-github_support_docs_search&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgithub_support_docs_search%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/github_support_docs_search/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-github_support_docs_search&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgithub_support_docs_search%2Freadonly%22%7D) | + ### Optional Headers diff --git a/docs/toolsets-and-icons.md b/docs/toolsets-and-icons.md new file mode 100644 index 000000000..7328a4207 --- /dev/null +++ b/docs/toolsets-and-icons.md @@ -0,0 +1,160 @@ +# Toolsets and Icons + +This document explains how to work with toolsets and icons in the GitHub MCP Server. + +## Toolset Overview + +Toolsets are logical groupings of related tools. Each toolset has metadata defined in `pkg/github/tools.go`: + +```go +ToolsetMetadataRepos = inventory.ToolsetMetadata{ + ID: "repos", + Description: "GitHub Repository related tools", + Default: true, + Icon: "repo", +} +``` + +### Toolset Fields + +| Field | Type | Description | +|-------|------|-------------| +| `ID` | `ToolsetID` | Unique identifier used in URLs and CLI flags (e.g., `repos`, `issues`) | +| `Description` | `string` | Human-readable description shown in documentation | +| `Default` | `bool` | Whether this toolset is enabled by default | +| `Icon` | `string` | Octicon name for visual representation in MCP clients | + +## Adding Icons to Toolsets + +Icons help users quickly identify toolsets in MCP-compatible clients. We use [Primer Octicons](https://primer.style/foundations/icons) for all icons. + +### Step 1: Choose an Octicon + +Browse the [Octicon gallery](https://primer.style/foundations/icons) and select an appropriate icon. Use the base name without size suffix (e.g., `repo` not `repo-16`). + +### Step 2: Add the Icon Files + +Icons are stored as PNG files in `pkg/octicons/icons/` with light and dark theme variants: + +``` +pkg/octicons/icons/ +├── repo-light.png # For light theme +├── repo-dark.png # For dark theme +├── issue-opened-light.png +├── issue-opened-dark.png +└── ... +``` + +Icon files should be 20x20 pixels in size. + +### Step 3: Update the Toolset Metadata + +Add or update the `Icon` field in the toolset definition: + +```go +// In pkg/github/tools.go +ToolsetMetadataRepos = inventory.ToolsetMetadata{ + ID: "repos", + Description: "GitHub Repository related tools", + Default: true, + Icon: "repo", // Add this line +} +``` + +### Step 4: Regenerate Documentation + +Run the documentation generator to update all markdown files: + +```bash +go run ./cmd/github-mcp-server generate-docs +``` + +This updates icons in: +- `README.md` - Toolsets table and tool section headers +- `docs/remote-server.md` - Remote toolsets table + +## Remote-Only Toolsets + +Some toolsets are only available in the remote GitHub MCP Server (hosted at `api.githubcopilot.com`). These are defined in `pkg/github/tools.go` with their icons, but are not registered with the local server: + +```go +// Remote-only toolsets +ToolsetMetadataCopilot = inventory.ToolsetMetadata{ + ID: "copilot", + Description: "Copilot related tools", + Icon: "copilot", +} +``` + +The `RemoteOnlyToolsets()` function returns the list of these toolsets for documentation generation. + +To add a new remote-only toolset: + +1. Add the metadata definition in `pkg/github/tools.go` +2. Add it to the slice returned by `RemoteOnlyToolsets()` +3. Regenerate documentation + +## Tool Icon Inheritance + +Individual tools inherit icons from their parent toolset. When a tool is registered with a toolset, its icons are automatically set: + +```go +// In pkg/inventory/server_tool.go +toolCopy.Icons = tool.Toolset.Icons() +``` + +This means you only need to set the icon once on the toolset, and all tools in that toolset will display the same icon. + +## How Icons Work in MCP + +The MCP protocol supports tool icons via the `icons` field. We provide icons in two formats: + +1. **Data URIs** - Base64-encoded PNG images embedded in the tool definition +2. **Light/Dark variants** - Both theme variants are provided for proper display + +The `octicons.Icons()` function generates the MCP-compatible icon objects: + +```go +// Returns []mcp.Icon with both light and dark variants +icons := octicons.Icons("repo") +``` + +## Existing Toolset Icons + +| Toolset | Octicon Name | +|---------|--------------| +| Context | `person` | +| Repositories | `repo` | +| Issues | `issue-opened` | +| Pull Requests | `git-pull-request` | +| Git | `git-branch` | +| Users | `people` | +| Organizations | `organization` | +| Actions | `workflow` | +| Code Security | `codescan` | +| Secret Protection | `shield-lock` | +| Dependabot | `dependabot` | +| Discussions | `comment-discussion` | +| Gists | `logo-gist` | +| Security Advisories | `shield` | +| Projects | `project` | +| Labels | `tag` | +| Stargazers | `star` | +| Notifications | `bell` | +| Dynamic | `tools` | +| Copilot | `copilot` | +| Support Search | `book` | + +## Troubleshooting + +### Icons not appearing in documentation + +1. Ensure PNG files exist in `pkg/octicons/icons/` with `-light.png` and `-dark.png` suffixes +2. Run `go run ./cmd/github-mcp-server generate-docs` to regenerate +3. Check that the `Icon` field is set on the toolset metadata + +### Icons not appearing in MCP clients + +1. Verify the client supports MCP tool icons +2. Check that the octicons package is properly generating base64 data URIs +3. Ensure the icon name matches a file in `pkg/octicons/icons/` diff --git a/pkg/github/tools.go b/pkg/github/tools.go index 48298afbd..10877adf2 100644 --- a/pkg/github/tools.go +++ b/pkg/github/tools.go @@ -132,6 +132,24 @@ var ( Description: "GitHub Labels related tools", Icon: "tag", } + + // Remote-only toolsets - these are only available in the remote MCP server + // but are documented here for consistency and to enable automated documentation. + ToolsetMetadataCopilot = inventory.ToolsetMetadata{ + ID: "copilot", + Description: "Copilot related tools", + Icon: "copilot", + } + ToolsetMetadataCopilotSpaces = inventory.ToolsetMetadata{ + ID: "copilot_spaces", + Description: "Copilot Spaces tools", + Icon: "copilot", + } + ToolsetMetadataSupportSearch = inventory.ToolsetMetadata{ + ID: "github_support_docs_search", + Description: "Retrieve documentation to answer GitHub product and support questions. Topics include: GitHub Actions Workflows, Authentication, ...", + Icon: "book", + } ) // AllTools returns all tools with their embedded toolset metadata. @@ -428,3 +446,14 @@ func GetDefaultToolsetIDs() []string { } return result } + +// RemoteOnlyToolsets returns toolset metadata for toolsets that are only +// available in the remote MCP server. These are documented but not registered +// in the local server. +func RemoteOnlyToolsets() []inventory.ToolsetMetadata { + return []inventory.ToolsetMetadata{ + ToolsetMetadataCopilot, + ToolsetMetadataCopilotSpaces, + ToolsetMetadataSupportSearch, + } +} From 03d2f16ddd541d472fec80d99f817859fc42424b Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Wed, 17 Dec 2025 11:13:14 +0100 Subject: [PATCH 19/21] Add icon validation tests and single source of truth for required icons - Add pkg/octicons/required_icons.txt as single source of truth for icons - Add RequiredIcons() function to read the required icons list - Update script/fetch-icons to read from required_icons.txt - Update octicons_test.go to use RequiredIcons() instead of hardcoded list - Add pkg/github/toolset_icons_test.go with: - TestAllToolsetIconsExist: validates all toolset icons are embedded - TestToolsetMetadataHasIcons: ensures all toolsets have icons set - Add 'book' icon for SupportSearch toolset - Update docs/toolsets-and-icons.md with fetch-icons and CI validation docs --- docs/toolsets-and-icons.md | 63 ++++++++++++++++++---- pkg/github/toolset_icons_test.go | 86 ++++++++++++++++++++++++++++++ pkg/octicons/icons/book-dark.png | Bin 0 -> 318 bytes pkg/octicons/icons/book-light.png | Bin 0 -> 395 bytes pkg/octicons/octicons.go | 21 ++++++++ pkg/octicons/octicons_test.go | 12 ++--- pkg/octicons/required_icons.txt | 45 ++++++++++++++++ script/fetch-icons | 56 ++++++------------- 8 files changed, 223 insertions(+), 60 deletions(-) create mode 100644 pkg/github/toolset_icons_test.go create mode 100644 pkg/octicons/icons/book-dark.png create mode 100644 pkg/octicons/icons/book-light.png create mode 100644 pkg/octicons/required_icons.txt diff --git a/docs/toolsets-and-icons.md b/docs/toolsets-and-icons.md index 7328a4207..9c26b4aa1 100644 --- a/docs/toolsets-and-icons.md +++ b/docs/toolsets-and-icons.md @@ -32,22 +32,42 @@ Icons help users quickly identify toolsets in MCP-compatible clients. We use [Pr Browse the [Octicon gallery](https://primer.style/foundations/icons) and select an appropriate icon. Use the base name without size suffix (e.g., `repo` not `repo-16`). -### Step 2: Add the Icon Files +### Step 2: Add Icon to Required Icons List -Icons are stored as PNG files in `pkg/octicons/icons/` with light and dark theme variants: +Icons are defined in `pkg/octicons/required_icons.txt`, which is the single source of truth for which icons should be embedded: ``` -pkg/octicons/icons/ -├── repo-light.png # For light theme -├── repo-dark.png # For dark theme -├── issue-opened-light.png -├── issue-opened-dark.png -└── ... +# Required icons for the GitHub MCP Server +# Add new icons below (one per line) +repo +issue-opened +git-pull-request +your-new-icon # Add your icon here ``` -Icon files should be 20x20 pixels in size. +### Step 3: Fetch the Icon Files -### Step 3: Update the Toolset Metadata +Run the fetch-icons script to download and convert the icon: + +```bash +# Fetch a specific icon +script/fetch-icons your-new-icon + +# Or fetch all required icons +script/fetch-icons +``` + +This script: +- Downloads the 24px SVG from [Primer Octicons](https://github.com/primer/octicons) +- Converts to PNG with light theme (dark icons for light backgrounds) +- Converts to PNG with dark theme (white icons for dark backgrounds) +- Saves both variants to `pkg/octicons/icons/` + +**Requirements:** The script requires `rsvg-convert`: +- Ubuntu/Debian: `sudo apt-get install librsvg2-bin` +- macOS: `brew install librsvg` + +### Step 4: Update the Toolset Metadata Add or update the `Icon` field in the toolset definition: @@ -61,7 +81,7 @@ ToolsetMetadataRepos = inventory.ToolsetMetadata{ } ``` -### Step 4: Regenerate Documentation +### Step 5: Regenerate Documentation Run the documentation generator to update all markdown files: @@ -158,3 +178,24 @@ icons := octicons.Icons("repo") 1. Verify the client supports MCP tool icons 2. Check that the octicons package is properly generating base64 data URIs 3. Ensure the icon name matches a file in `pkg/octicons/icons/` + +## CI Validation + +The following tests run in CI to catch icon issues early: + +### `pkg/octicons.TestEmbeddedIconsExist` + +Verifies that all icons listed in `pkg/octicons/required_icons.txt` have corresponding PNG files embedded. + +### `pkg/github.TestAllToolsetIconsExist` + +Verifies that all toolset `Icon` fields reference icons that are properly embedded. + +### `pkg/github.TestToolsetMetadataHasIcons` + +Ensures all toolsets have an `Icon` field set. + +If any of these tests fail: +1. Add the missing icon to `pkg/octicons/required_icons.txt` +2. Run `script/fetch-icons` to download the icon +3. Commit the new icon files diff --git a/pkg/github/toolset_icons_test.go b/pkg/github/toolset_icons_test.go new file mode 100644 index 000000000..fd9cec462 --- /dev/null +++ b/pkg/github/toolset_icons_test.go @@ -0,0 +1,86 @@ +package github + +import ( + "testing" + + "github.com/github/github-mcp-server/pkg/octicons" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestAllToolsetIconsExist validates that every toolset with an Icon field +// references an icon that actually exists in the embedded octicons. +// This prevents broken icon references from being merged. +func TestAllToolsetIconsExist(t *testing.T) { + // Get all available toolsets from the inventory + inv := NewInventory(stubTranslator).Build() + toolsets := inv.AvailableToolsets() + + // Also test remote-only toolsets + remoteToolsets := RemoteOnlyToolsets() + + // Combine both lists + allToolsets := make([]struct { + name string + icon string + }, 0) + + for _, ts := range toolsets { + if ts.Icon != "" { + allToolsets = append(allToolsets, struct { + name string + icon string + }{name: string(ts.ID), icon: ts.Icon}) + } + } + + for _, ts := range remoteToolsets { + if ts.Icon != "" { + allToolsets = append(allToolsets, struct { + name string + icon string + }{name: string(ts.ID), icon: ts.Icon}) + } + } + + require.NotEmpty(t, allToolsets, "expected at least one toolset with an icon") + + for _, ts := range allToolsets { + t.Run(ts.name, func(t *testing.T) { + // Check that icons return valid data URIs (not empty) + icons := octicons.Icons(ts.icon) + require.NotNil(t, icons, "toolset %s references icon %q which does not exist", ts.name, ts.icon) + assert.Len(t, icons, 2, "expected light and dark icon variants for toolset %s", ts.name) + + // Verify both variants have valid data URIs + for _, icon := range icons { + assert.NotEmpty(t, icon.Source, "icon source should not be empty for toolset %s", ts.name) + assert.Contains(t, icon.Source, "data:image/png;base64,", + "icon %s for toolset %s should be a valid data URI", ts.icon, ts.name) + } + }) + } +} + +// TestToolsetMetadataHasIcons ensures all toolsets have icons defined. +// This is a policy test - if you want to allow toolsets without icons, +// you can remove or modify this test. +func TestToolsetMetadataHasIcons(t *testing.T) { + // These toolsets are expected to NOT have icons (internal/special purpose) + exceptionsWithoutIcons := map[string]bool{ + "all": true, // Meta-toolset + "default": true, // Meta-toolset + } + + inv := NewInventory(stubTranslator).Build() + toolsets := inv.AvailableToolsets() + + for _, ts := range toolsets { + if exceptionsWithoutIcons[string(ts.ID)] { + continue + } + t.Run(string(ts.ID), func(t *testing.T) { + assert.NotEmpty(t, ts.Icon, "toolset %s should have an icon defined", ts.ID) + }) + } +} diff --git a/pkg/octicons/icons/book-dark.png b/pkg/octicons/icons/book-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9658b4f8e74f1b27986a9487b479f3a735207a58 GIT binary patch literal 318 zcmV-E0m1%>P)xD@>N?cCf8FownSvm*jk5vhyUp7R_mrtTi>wDW!bk1TT2TsMcEP zcWJ67lO$uLl=9kD*V&-*hWtd(>4|>B%3x)%GN2^+FiXf~yyFoU*srxq9Agt3wf13_ zRdWVdFE!_f4F-K|nML*@*SN>DLHpFO_nrF5OzS%8Ec^*cc9ZP>$>IN&FG7a5zSQ!J Q_5c6?07*qoM6N<$g8z7rq5uE@ literal 0 HcmV?d00001 diff --git a/pkg/octicons/icons/book-light.png b/pkg/octicons/icons/book-light.png new file mode 100644 index 0000000000000000000000000000000000000000..8be91a4346a85ba47bef280b7945beef6fd38834 GIT binary patch literal 395 zcmV;60d)R}P)056u9m zne61bS-k*o;;B8L03?Am5AUNn@su#`5Vy+|5|I_Nyin3)$1;V0qG7d(bZtg|d3ClB z+3@Ui)oN5r?nSmk8}X-8Oh*8MvsNQofXdj-;Uv-}P8q=mD?e{!7v8 z@p*g(K(~9}2kM}Dr_&ku^@aTkr)UVKpE!I^@LPg_ARq{suImvH^3c2))`Uq}*bac1 zE+yLsVtlRZ5z}4uNd#E6Xe_-eQ_{TxVZ+fA^Ju=n?2{=22pzN= pwR68--#D>M&WUAmfBx{l<^wE1Wpq&RZTbKJ002ovPDHLkV1ldYug?Gg literal 0 HcmV?d00001 diff --git a/pkg/octicons/octicons.go b/pkg/octicons/octicons.go index 5353b81f9..c6b92c47b 100644 --- a/pkg/octicons/octicons.go +++ b/pkg/octicons/octicons.go @@ -3,9 +3,11 @@ package octicons import ( + "bufio" "embed" "encoding/base64" "fmt" + "strings" "github.com/modelcontextprotocol/go-sdk/mcp" ) @@ -13,6 +15,25 @@ import ( //go:embed icons/*.png var iconsFS embed.FS +//go:embed required_icons.txt +var requiredIconsTxt string + +// RequiredIcons returns the list of icon names from required_icons.txt. +// This is the single source of truth for which icons should be embedded. +func RequiredIcons() []string { + var icons []string + scanner := bufio.NewScanner(strings.NewReader(requiredIconsTxt)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + // Skip empty lines and comments + if line == "" || strings.HasPrefix(line, "#") { + continue + } + icons = append(icons, line) + } + return icons +} + // Theme represents the color theme of an icon. type Theme string diff --git a/pkg/octicons/octicons_test.go b/pkg/octicons/octicons_test.go index 19106e74a..dd0542e9d 100644 --- a/pkg/octicons/octicons_test.go +++ b/pkg/octicons/octicons_test.go @@ -104,15 +104,9 @@ func TestThemeConstants(t *testing.T) { } func TestEmbeddedIconsExist(t *testing.T) { - // Test that all icons used by toolsets are properly embedded - expectedIcons := []string{ - "apps", "beaker", "bell", "check-circle", "codescan", - "comment-discussion", "copilot", "dependabot", "file", "git-branch", - "git-commit", "git-merge", "git-pull-request", "issue-opened", "logo-gist", "mark-github", - "organization", "people", "person", "project", "repo", "repo-forked", - "shield", "shield-lock", "star", "star-fill", "tag", "tools", "workflow", - } - + // Test that all required icons from required_icons.txt are properly embedded + // This is the single source of truth for which icons should be available + expectedIcons := RequiredIcons() for _, icon := range expectedIcons { t.Run(icon, func(t *testing.T) { lightURI := DataURI(icon, ThemeLight) diff --git a/pkg/octicons/required_icons.txt b/pkg/octicons/required_icons.txt new file mode 100644 index 000000000..7911b46eb --- /dev/null +++ b/pkg/octicons/required_icons.txt @@ -0,0 +1,45 @@ +# Required Octicons for the GitHub MCP Server +# This file is the source of truth for icon requirements. +# Used by: +# - script/fetch-icons (to download icons) +# - pkg/octicons/octicons_test.go (to validate icons are embedded) +# - pkg/github/toolset_icons_test.go (to validate toolset icons exist) +# +# Add new icons here when: +# - Adding a new toolset with an icon +# - Adding a new tool that needs a custom icon +# +# Format: one icon name per line (without -24.svg suffix) +# Lines starting with # are comments +# Empty lines are ignored + +apps +beaker +bell +book +check-circle +codescan +comment-discussion +copilot +dependabot +file +git-branch +git-commit +git-merge +git-pull-request +issue-opened +logo-gist +mark-github +organization +people +person +project +repo +repo-forked +shield +shield-lock +star +star-fill +tag +tools +workflow diff --git a/script/fetch-icons b/script/fetch-icons index 054ab6dc6..21de625f1 100755 --- a/script/fetch-icons +++ b/script/fetch-icons @@ -5,47 +5,17 @@ # Requires: rsvg-convert (from librsvg2-bin on Ubuntu/Debian) # # Usage: -# script/fetch-icons # Fetch all default icons +# script/fetch-icons # Fetch all required icons # script/fetch-icons icon1 icon2 # Fetch specific icons set -e -ICONS_DIR="pkg/octicons/icons" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +ICONS_DIR="$REPO_ROOT/pkg/octicons/icons" +REQUIRED_ICONS_FILE="$REPO_ROOT/pkg/octicons/required_icons.txt" OCTICONS_BASE="https://raw.githubusercontent.com/primer/octicons/main/icons" -# Default icons used by toolsets - add new icons here as needed -DEFAULT_ICONS=( - apps - beaker - bell - check-circle - codescan - comment-discussion - copilot - dependabot - file - git-branch - git-commit - git-merge - git-pull-request - issue-opened - logo-gist - mark-github - organization - people - person - project - repo - repo-forked - shield - shield-lock - star - star-fill - tag - tools - workflow -) - # Check for rsvg-convert if ! command -v rsvg-convert &> /dev/null; then echo "Error: rsvg-convert not found. Install with:" @@ -54,11 +24,16 @@ if ! command -v rsvg-convert &> /dev/null; then exit 1 fi -# Use provided icons or defaults +# Load icons from required_icons.txt or use command-line arguments if [ $# -gt 0 ]; then ICONS=("$@") else - ICONS=("${DEFAULT_ICONS[@]}") + if [ ! -f "$REQUIRED_ICONS_FILE" ]; then + echo "Error: Required icons file not found: $REQUIRED_ICONS_FILE" + exit 1 + fi + # Read icons from file, skipping comments and empty lines + mapfile -t ICONS < <(grep -v '^#' "$REQUIRED_ICONS_FILE" | grep -v '^$') fi # Ensure icons directory exists @@ -91,6 +66,7 @@ done echo "Done. Icons saved to $ICONS_DIR" echo "" -echo "Remember to:" -echo " 1. Update pkg/octicons/octicons_test.go if adding new icons" -echo " 2. Run 'UPDATE_TOOLSNAPS=true go test ./...' to update snapshots" +echo "Next steps:" +echo " 1. Run 'go test ./pkg/octicons/...' to verify icons are embedded" +echo " 2. Run 'go test ./pkg/github/...' to verify toolset icons are valid" +echo " 3. Commit the new icon files" From cb1ccd41699fb06e6b6a0b6bd9fc0fd07d2c4767 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Wed, 17 Dec 2025 11:31:20 +0100 Subject: [PATCH 20/21] fix: remove unused icon parameter from writeToolDoc - Remove unused 'icon' parameter from writeToolDoc function signature - Fix whitespace inconsistency in octicons_test.go - Fixes lint failure: unused-parameter revive error --- cmd/github-mcp-server/generate_docs.go | 4 ++-- pkg/octicons/octicons_test.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/github-mcp-server/generate_docs.go b/cmd/github-mcp-server/generate_docs.go index 3ee60476d..6ada5e5a6 100644 --- a/cmd/github-mcp-server/generate_docs.go +++ b/cmd/github-mcp-server/generate_docs.go @@ -190,7 +190,7 @@ func generateToolsDoc(r *inventory.Inventory) string { currentToolsetID = tool.Toolset.ID currentToolsetIcon = tool.Toolset.Icon } - writeToolDoc(&toolBuf, tool.Tool, tool.Toolset.Icon) + writeToolDoc(&toolBuf, tool.Tool) toolBuf.WriteString("\n\n") } @@ -224,7 +224,7 @@ func formatToolsetName(name string) string { } } -func writeToolDoc(buf *strings.Builder, tool mcp.Tool, icon string) { +func writeToolDoc(buf *strings.Builder, tool mcp.Tool) { // Tool name (no icon - section header already has the toolset icon) fmt.Fprintf(buf, "- **%s** - %s\n", tool.Name, tool.Annotations.Title) diff --git a/pkg/octicons/octicons_test.go b/pkg/octicons/octicons_test.go index dd0542e9d..f60f7192e 100644 --- a/pkg/octicons/octicons_test.go +++ b/pkg/octicons/octicons_test.go @@ -104,9 +104,9 @@ func TestThemeConstants(t *testing.T) { } func TestEmbeddedIconsExist(t *testing.T) { - // Test that all required icons from required_icons.txt are properly embedded - // This is the single source of truth for which icons should be available - expectedIcons := RequiredIcons() + // Test that all required icons from required_icons.txt are properly embedded + // This is the single source of truth for which icons should be available + expectedIcons := RequiredIcons() for _, icon := range expectedIcons { t.Run(icon, func(t *testing.T) { lightURI := DataURI(icon, ThemeLight) From 238263b97b1a05fa82ff485a29c69c3002ce8293 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Wed, 17 Dec 2025 11:49:44 +0100 Subject: [PATCH 21/21] fix: combine icon with name column in remote docs for proper table rendering - Move icon from separate column to Name column with
separator - Keep element for light/dark theme support - Remove empty icon column that was collapsing to zero width - Remove unused octiconSimpleImg function --- cmd/github-mcp-server/generate_docs.go | 18 +++++----- docs/remote-server.md | 50 +++++++++++++------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/cmd/github-mcp-server/generate_docs.go b/cmd/github-mcp-server/generate_docs.go index 6ada5e5a6..f822d69f2 100644 --- a/cmd/github-mcp-server/generate_docs.go +++ b/cmd/github-mcp-server/generate_docs.go @@ -337,13 +337,13 @@ func generateRemoteToolsetsDoc() string { // Build inventory - stateless r := github.NewInventory(t).Build() - // Generate table header (with icon column) - buf.WriteString("| | Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) |\n") - buf.WriteString("| --- | ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- |\n") + // Generate table header (icon is combined with Name column) + buf.WriteString("| Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) |\n") + buf.WriteString("| ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- |\n") // Add "all" toolset first (special case) allIcon := octiconImg("apps", "../") - fmt.Fprintf(&buf, "| %s | all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%%7B%%22type%%22%%3A%%20%%22http%%22%%2C%%22url%%22%%3A%%20%%22https%%3A%%2F%%2Fapi.githubcopilot.com%%2Fmcp%%2F%%22%%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%%7B%%22type%%22%%3A%%20%%22http%%22%%2C%%22url%%22%%3A%%20%%22https%%3A%%2F%%2Fapi.githubcopilot.com%%2Fmcp%%2Freadonly%%22%%7D) |\n", allIcon) + fmt.Fprintf(&buf, "| %s
all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%%7B%%22type%%22%%3A%%20%%22http%%22%%2C%%22url%%22%%3A%%20%%22https%%3A%%2F%%2Fapi.githubcopilot.com%%2Fmcp%%2F%%22%%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%%7B%%22type%%22%%3A%%20%%22http%%22%%2C%%22url%%22%%3A%%20%%22https%%3A%%2F%%2Fapi.githubcopilot.com%%2Fmcp%%2Freadonly%%22%%7D) |\n", allIcon) // AvailableToolsets() returns toolsets that have tools, sorted by ID // Exclude context (handled separately) and dynamic (internal only) @@ -366,7 +366,7 @@ func generateRemoteToolsetsDoc() string { readonlyInstallLink := fmt.Sprintf("[Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-%s&config=%s)", idStr, readonlyConfig) icon := octiconImg(ts.Icon, "../") - fmt.Fprintf(&buf, "| %s | %s | %s | %s | %s | [read-only](%s) | %s |\n", + fmt.Fprintf(&buf, "| %s
%s | %s | %s | %s | [read-only](%s) | %s |\n", icon, formattedName, ts.Description, @@ -383,9 +383,9 @@ func generateRemoteToolsetsDoc() string { func generateRemoteOnlyToolsetsDoc() string { var buf strings.Builder - // Generate table header (with icon column) - buf.WriteString("| | Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) |\n") - buf.WriteString("| --- | ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- |\n") + // Generate table header (icon is combined with Name column) + buf.WriteString("| Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) |\n") + buf.WriteString("| ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- |\n") // Use RemoteOnlyToolsets from github package for _, ts := range github.RemoteOnlyToolsets() { @@ -407,7 +407,7 @@ func generateRemoteOnlyToolsetsDoc() string { readonlyInstallLink := fmt.Sprintf("[Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-%s&config=%s)", idStr, readonlyConfig) icon := octiconImg(ts.Icon, "../") - fmt.Fprintf(&buf, "| %s | %s | %s | %s | %s | [read-only](%s) | %s |\n", + fmt.Fprintf(&buf, "| %s
%s | %s | %s | %s | [read-only](%s) | %s |\n", icon, formattedName, ts.Description, diff --git a/docs/remote-server.md b/docs/remote-server.md index 5e768dbc8..d7d0f72b1 100644 --- a/docs/remote-server.md +++ b/docs/remote-server.md @@ -17,26 +17,26 @@ The remote server has [additional tools](#toolsets-only-available-in-the-remote- Below is a table of available toolsets for the remote GitHub MCP Server. Each toolset is provided as a distinct URL so you can mix and match to create the perfect combination of tools for your use-case. Add `/readonly` to the end of any URL to restrict the tools in the toolset to only those that enable read access. We also provide the option to use [headers](#headers) instead. -| | Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) | -| --- | ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- | -| apps | all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2F%22%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Freadonly%22%7D) | -| workflow | Actions | GitHub Actions workflows and CI/CD operations | https://api.githubcopilot.com/mcp/x/actions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/actions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%2Freadonly%22%7D) | -| codescan | Code Security | Code security related tools, such as GitHub Code Scanning | https://api.githubcopilot.com/mcp/x/code_security | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/code_security/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%2Freadonly%22%7D) | -| dependabot | Dependabot | Dependabot tools | https://api.githubcopilot.com/mcp/x/dependabot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/dependabot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%2Freadonly%22%7D) | -| comment-discussion | Discussions | GitHub Discussions related tools | https://api.githubcopilot.com/mcp/x/discussions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/discussions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%2Freadonly%22%7D) | -| logo-gist | Gists | GitHub Gist related tools | https://api.githubcopilot.com/mcp/x/gists | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/gists/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%2Freadonly%22%7D) | -| git-branch | Git | GitHub Git API related tools for low-level Git operations | https://api.githubcopilot.com/mcp/x/git | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/git/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%2Freadonly%22%7D) | -| issue-opened | Issues | GitHub Issues related tools | https://api.githubcopilot.com/mcp/x/issues | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/issues/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%2Freadonly%22%7D) | -| tag | Labels | GitHub Labels related tools | https://api.githubcopilot.com/mcp/x/labels | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/labels/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%2Freadonly%22%7D) | -| bell | Notifications | GitHub Notifications related tools | https://api.githubcopilot.com/mcp/x/notifications | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/notifications/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%2Freadonly%22%7D) | -| organization | Organizations | GitHub Organization related tools | https://api.githubcopilot.com/mcp/x/orgs | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/orgs/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%2Freadonly%22%7D) | -| project | Projects | GitHub Projects related tools | https://api.githubcopilot.com/mcp/x/projects | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/projects/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%2Freadonly%22%7D) | -| git-pull-request | Pull Requests | GitHub Pull Request related tools | https://api.githubcopilot.com/mcp/x/pull_requests | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/pull_requests/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%2Freadonly%22%7D) | -| repo | Repositories | GitHub Repository related tools | https://api.githubcopilot.com/mcp/x/repos | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/repos/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%2Freadonly%22%7D) | -| shield-lock | Secret Protection | Secret protection related tools, such as GitHub Secret Scanning | https://api.githubcopilot.com/mcp/x/secret_protection | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/secret_protection/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%2Freadonly%22%7D) | -| shield | Security Advisories | Security advisories related tools | https://api.githubcopilot.com/mcp/x/security_advisories | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/security_advisories/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%2Freadonly%22%7D) | -| star | Stargazers | GitHub Stargazers related tools | https://api.githubcopilot.com/mcp/x/stargazers | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/stargazers/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%2Freadonly%22%7D) | -| people | Users | GitHub User related tools | https://api.githubcopilot.com/mcp/x/users | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/users/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%2Freadonly%22%7D) | +| Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) | +| ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- | +| apps
all | All available GitHub MCP tools | https://api.githubcopilot.com/mcp/ | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2F%22%7D) | [read-only](https://api.githubcopilot.com/mcp/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=github&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Freadonly%22%7D) | +| workflow
Actions | GitHub Actions workflows and CI/CD operations | https://api.githubcopilot.com/mcp/x/actions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/actions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-actions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Factions%2Freadonly%22%7D) | +| codescan
Code Security | Code security related tools, such as GitHub Code Scanning | https://api.githubcopilot.com/mcp/x/code_security | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/code_security/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-code_security&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcode_security%2Freadonly%22%7D) | +| dependabot
Dependabot | Dependabot tools | https://api.githubcopilot.com/mcp/x/dependabot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/dependabot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-dependabot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdependabot%2Freadonly%22%7D) | +| comment-discussion
Discussions | GitHub Discussions related tools | https://api.githubcopilot.com/mcp/x/discussions | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/discussions/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-discussions&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fdiscussions%2Freadonly%22%7D) | +| logo-gist
Gists | GitHub Gist related tools | https://api.githubcopilot.com/mcp/x/gists | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/gists/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-gists&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgists%2Freadonly%22%7D) | +| git-branch
Git | GitHub Git API related tools for low-level Git operations | https://api.githubcopilot.com/mcp/x/git | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/git/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-git&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgit%2Freadonly%22%7D) | +| issue-opened
Issues | GitHub Issues related tools | https://api.githubcopilot.com/mcp/x/issues | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/issues/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-issues&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fissues%2Freadonly%22%7D) | +| tag
Labels | GitHub Labels related tools | https://api.githubcopilot.com/mcp/x/labels | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/labels/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-labels&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Flabels%2Freadonly%22%7D) | +| bell
Notifications | GitHub Notifications related tools | https://api.githubcopilot.com/mcp/x/notifications | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/notifications/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-notifications&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fnotifications%2Freadonly%22%7D) | +| organization
Organizations | GitHub Organization related tools | https://api.githubcopilot.com/mcp/x/orgs | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/orgs/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-orgs&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Forgs%2Freadonly%22%7D) | +| project
Projects | GitHub Projects related tools | https://api.githubcopilot.com/mcp/x/projects | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/projects/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-projects&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fprojects%2Freadonly%22%7D) | +| git-pull-request
Pull Requests | GitHub Pull Request related tools | https://api.githubcopilot.com/mcp/x/pull_requests | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/pull_requests/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-pull_requests&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fpull_requests%2Freadonly%22%7D) | +| repo
Repositories | GitHub Repository related tools | https://api.githubcopilot.com/mcp/x/repos | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/repos/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-repos&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Frepos%2Freadonly%22%7D) | +| shield-lock
Secret Protection | Secret protection related tools, such as GitHub Secret Scanning | https://api.githubcopilot.com/mcp/x/secret_protection | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/secret_protection/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-secret_protection&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecret_protection%2Freadonly%22%7D) | +| shield
Security Advisories | Security advisories related tools | https://api.githubcopilot.com/mcp/x/security_advisories | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/security_advisories/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-security_advisories&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fsecurity_advisories%2Freadonly%22%7D) | +| star
Stargazers | GitHub Stargazers related tools | https://api.githubcopilot.com/mcp/x/stargazers | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/stargazers/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-stargazers&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fstargazers%2Freadonly%22%7D) | +| people
Users | GitHub User related tools | https://api.githubcopilot.com/mcp/x/users | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/users/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-users&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fusers%2Freadonly%22%7D) | ### Additional _Remote_ Server Toolsets @@ -44,11 +44,11 @@ Below is a table of available toolsets for the remote GitHub MCP Server. Each to These toolsets are only available in the remote GitHub MCP Server and are not included in the local MCP server. -| | Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) | -| --- | ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- | -| copilot | Copilot | Copilot related tools | https://api.githubcopilot.com/mcp/x/copilot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/copilot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot%2Freadonly%22%7D) | -| copilot | Copilot Spaces | Copilot Spaces tools | https://api.githubcopilot.com/mcp/x/copilot_spaces | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot_spaces&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot_spaces%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/copilot_spaces/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot_spaces&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot_spaces%2Freadonly%22%7D) | -| book | Github Support Docs Search | Retrieve documentation to answer GitHub product and support questions. Topics include: GitHub Actions Workflows, Authentication, ... | https://api.githubcopilot.com/mcp/x/github_support_docs_search | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-github_support_docs_search&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgithub_support_docs_search%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/github_support_docs_search/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-github_support_docs_search&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgithub_support_docs_search%2Freadonly%22%7D) | +| Name | Description | API URL | 1-Click Install (VS Code) | Read-only Link | 1-Click Read-only Install (VS Code) | +| ---- | ----------- | ------- | ------------------------- | -------------- | ----------------------------------- | +| copilot
Copilot | Copilot related tools | https://api.githubcopilot.com/mcp/x/copilot | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/copilot/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot%2Freadonly%22%7D) | +| copilot
Copilot Spaces | Copilot Spaces tools | https://api.githubcopilot.com/mcp/x/copilot_spaces | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot_spaces&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot_spaces%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/copilot_spaces/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-copilot_spaces&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fcopilot_spaces%2Freadonly%22%7D) | +| book
Github Support Docs Search | Retrieve documentation to answer GitHub product and support questions. Topics include: GitHub Actions Workflows, Authentication, ... | https://api.githubcopilot.com/mcp/x/github_support_docs_search | [Install](https://insiders.vscode.dev/redirect/mcp/install?name=gh-github_support_docs_search&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgithub_support_docs_search%22%7D) | [read-only](https://api.githubcopilot.com/mcp/x/github_support_docs_search/readonly) | [Install read-only](https://insiders.vscode.dev/redirect/mcp/install?name=gh-github_support_docs_search&config=%7B%22type%22%3A%20%22http%22%2C%22url%22%3A%20%22https%3A%2F%2Fapi.githubcopilot.com%2Fmcp%2Fx%2Fgithub_support_docs_search%2Freadonly%22%7D) | ### Optional Headers