Skip to content

Commit d2d09b7

Browse files
committed
Add basic html sanitization
1 parent 062c13a commit d2d09b7

File tree

11 files changed

+320
-138
lines changed

11 files changed

+320
-138
lines changed

pkg/github/issues.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,15 @@ func fragmentToIssue(fragment IssueFragment) *github.Issue {
212212

213213
return &github.Issue{
214214
Number: github.Ptr(int(fragment.Number)),
215-
Title: github.Ptr(sanitize.FilterInvisibleCharacters(string(fragment.Title))),
215+
Title: github.Ptr(sanitize.Sanitize(string(fragment.Title))),
216216
CreatedAt: &github.Timestamp{Time: fragment.CreatedAt.Time},
217217
UpdatedAt: &github.Timestamp{Time: fragment.UpdatedAt.Time},
218218
User: &github.User{
219219
Login: github.Ptr(string(fragment.Author.Login)),
220220
},
221221
State: github.Ptr(string(fragment.State)),
222222
ID: github.Ptr(fragment.DatabaseID),
223-
Body: github.Ptr(sanitize.FilterInvisibleCharacters(string(fragment.Body))),
223+
Body: github.Ptr(sanitize.Sanitize(string(fragment.Body))),
224224
Labels: foundLabels,
225225
Comments: github.Ptr(int(fragment.Comments.TotalCount)),
226226
}
@@ -327,10 +327,10 @@ func GetIssue(ctx context.Context, client *github.Client, owner string, repo str
327327
// Sanitize title/body on response
328328
if issue != nil {
329329
if issue.Title != nil {
330-
issue.Title = github.Ptr(sanitize.FilterInvisibleCharacters(*issue.Title))
330+
issue.Title = github.Ptr(sanitize.Sanitize(*issue.Title))
331331
}
332332
if issue.Body != nil {
333-
issue.Body = github.Ptr(sanitize.FilterInvisibleCharacters(*issue.Body))
333+
issue.Body = github.Ptr(sanitize.Sanitize(*issue.Body))
334334
}
335335
}
336336

pkg/github/pullrequests.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,10 @@ func GetPullRequest(ctx context.Context, client *github.Client, owner, repo stri
127127
// sanitize title/body on response
128128
if pr != nil {
129129
if pr.Title != nil {
130-
pr.Title = github.Ptr(sanitize.FilterInvisibleCharacters(*pr.Title))
130+
pr.Title = github.Ptr(sanitize.Sanitize(*pr.Title))
131131
}
132132
if pr.Body != nil {
133-
pr.Body = github.Ptr(sanitize.FilterInvisibleCharacters(*pr.Body))
133+
pr.Body = github.Ptr(sanitize.Sanitize(*pr.Body))
134134
}
135135
}
136136

@@ -821,10 +821,10 @@ func ListPullRequests(getClient GetClientFn, t translations.TranslationHelperFun
821821
continue
822822
}
823823
if pr.Title != nil {
824-
pr.Title = github.Ptr(sanitize.FilterInvisibleCharacters(*pr.Title))
824+
pr.Title = github.Ptr(sanitize.Sanitize(*pr.Title))
825825
}
826826
if pr.Body != nil {
827-
pr.Body = github.Ptr(sanitize.FilterInvisibleCharacters(*pr.Body))
827+
pr.Body = github.Ptr(sanitize.Sanitize(*pr.Body))
828828
}
829829
}
830830

pkg/sanitize/sanitize.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,10 @@ import (
44
"github.com/microcosm-cc/bluemonday"
55
)
66

7-
type ContentFilter struct {
8-
HTMLPolicy *bluemonday.Policy
9-
}
10-
11-
func NewContentFilter() *ContentFilter {
12-
p := bluemonday.NewPolicy()
13-
p.AllowElements("b", "blockquote", "br", "code", "em", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "i", "li", "ol", "p", "pre", "strong", "sub", "sup", "table", "tbody", "td", "th", "thead", "tr", "ul")
14-
p.AllowAttrs("img", "a")
15-
p.AllowAttrs()
16-
p.AllowURLSchemes("https")
7+
var policy *bluemonday.Policy
178

18-
return &ContentFilter{
19-
HTMLPolicy: p,
20-
}
9+
func Sanitize(input string) string {
10+
return FilterHTMLTags(FilterInvisibleCharacters(input))
2111
}
2212

2313
// FilterInvisibleCharacters removes invisible or control characters that should not appear
@@ -40,11 +30,25 @@ func FilterInvisibleCharacters(input string) string {
4030
return string(out)
4131
}
4232

43-
func (cf *ContentFilter) FilterHtmlTags(input string) string {
33+
func FilterHTMLTags(input string) string {
34+
if policy == nil {
35+
policyInit()
36+
}
4437
if input == "" {
4538
return input
4639
}
47-
return cf.HTMLPolicy.Sanitize(input)
40+
return policy.Sanitize(input)
41+
}
42+
43+
func policyInit() {
44+
if policy != nil {
45+
return
46+
}
47+
policy = bluemonday.StrictPolicy()
48+
policy.AllowElements("b", "blockquote", "br", "code", "em", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "i", "li", "ol", "p", "pre", "strong", "sub", "sup", "table", "tbody", "td", "th", "thead", "tr", "ul")
49+
policy.AllowAttrs("img", "a")
50+
policy.AllowURLSchemes("https")
51+
policy.AllowImages()
4852
}
4953

5054
func shouldRemoveRune(r rune) bool {

pkg/sanitize/sanitize_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,64 @@ func TestShouldRemoveRune(t *testing.T) {
186186
})
187187
}
188188
}
189+
190+
func TestFilterHtmlTags(t *testing.T) {
191+
tests := []struct {
192+
name string
193+
input string
194+
expected string
195+
}{
196+
{
197+
name: "empty string",
198+
input: "",
199+
expected: "",
200+
},
201+
{
202+
name: "allowed simple tags preserved",
203+
input: "<b>bold</b>",
204+
expected: "<b>bold</b>",
205+
},
206+
{
207+
name: "multiple allowed tags",
208+
input: "<b>bold</b> and <em>italic</em>",
209+
expected: "<b>bold</b> and <em>italic</em>",
210+
},
211+
{
212+
name: "code tag preserved",
213+
input: "<code>fmt.Println(\"hi\")</code>",
214+
expected: "<code>fmt.Println(&#34;hi&#34;)</code>", // quotes are escaped by sanitizer
215+
},
216+
{
217+
name: "disallowed script removed entirely",
218+
input: "<script>alert(1)</script>",
219+
expected: "", // StrictPolicy should drop script element and contents
220+
},
221+
{
222+
name: "anchor removed but inner text kept",
223+
input: "Click <a href='https://example.com'>here</a> now",
224+
expected: "Click here now",
225+
},
226+
{
227+
name: "image removed (no textual fallback)",
228+
input: "<img src='x' alt='y'>",
229+
expected: "<img src=\"x\" alt=\"y\">", // images are allowed via AllowImages()
230+
},
231+
{
232+
name: "mixed allowed and disallowed",
233+
input: "<b>bold</b> <script>alert(1)</script> <em>italic</em>",
234+
expected: "<b>bold</b> <em>italic</em>",
235+
},
236+
{
237+
name: "idempotent sanitization",
238+
input: FilterHTMLTags("<b>bold</b> and <em>italic</em>"),
239+
expected: "<b>bold</b> and <em>italic</em>",
240+
},
241+
}
242+
243+
for _, tt := range tests {
244+
t.Run(tt.name, func(t *testing.T) {
245+
result := FilterHTMLTags(tt.input)
246+
assert.Equal(t, tt.expected, result)
247+
})
248+
}
249+
}

third-party-licenses.darwin.md

Lines changed: 42 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,48 @@ The following open source dependencies are used to build the [github/github-mcp-
77
Some packages may only be included on certain architectures or operating systems.
88

99

10-
- [github.com/bahlo/generic-list-go](https://pkg.go.dev/github.com/bahlo/generic-list-go) ([BSD-3-Clause](https://github.com/bahlo/generic-list-go/blob/v0.2.0/LICENSE))
11-
- [github.com/buger/jsonparser](https://pkg.go.dev/github.com/buger/jsonparser) ([MIT](https://github.com/buger/jsonparser/blob/v1.1.1/LICENSE))
12-
- [github.com/fsnotify/fsnotify](https://pkg.go.dev/github.com/fsnotify/fsnotify) ([BSD-3-Clause](https://github.com/fsnotify/fsnotify/blob/v1.9.0/LICENSE))
10+
- [github.com/aymerick/douceur](https://pkg.go.dev/github.com/aymerick/douceur) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/aymerick/douceur/LICENSE))
11+
- [github.com/bahlo/generic-list-go](https://pkg.go.dev/github.com/bahlo/generic-list-go) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/bahlo/generic-list-go/LICENSE))
12+
- [github.com/buger/jsonparser](https://pkg.go.dev/github.com/buger/jsonparser) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/buger/jsonparser/LICENSE))
13+
- [github.com/fsnotify/fsnotify](https://pkg.go.dev/github.com/fsnotify/fsnotify) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/fsnotify/fsnotify/LICENSE))
1314
- [github.com/github/github-mcp-server](https://pkg.go.dev/github.com/github/github-mcp-server) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/LICENSE))
14-
- [github.com/go-openapi/jsonpointer](https://pkg.go.dev/github.com/go-openapi/jsonpointer) ([Apache-2.0](https://github.com/go-openapi/jsonpointer/blob/v0.19.5/LICENSE))
15-
- [github.com/go-openapi/swag](https://pkg.go.dev/github.com/go-openapi/swag) ([Apache-2.0](https://github.com/go-openapi/swag/blob/v0.21.1/LICENSE))
16-
- [github.com/go-viper/mapstructure/v2](https://pkg.go.dev/github.com/go-viper/mapstructure/v2) ([MIT](https://github.com/go-viper/mapstructure/blob/v2.4.0/LICENSE))
17-
- [github.com/google/go-github/v71/github](https://pkg.go.dev/github.com/google/go-github/v71/github) ([BSD-3-Clause](https://github.com/google/go-github/blob/v71.0.0/LICENSE))
18-
- [github.com/google/go-github/v76/github](https://pkg.go.dev/github.com/google/go-github/v76/github) ([BSD-3-Clause](https://github.com/google/go-github/blob/v76.0.0/LICENSE))
19-
- [github.com/google/go-querystring/query](https://pkg.go.dev/github.com/google/go-querystring/query) ([BSD-3-Clause](https://github.com/google/go-querystring/blob/v1.1.0/LICENSE))
20-
- [github.com/google/uuid](https://pkg.go.dev/github.com/google/uuid) ([BSD-3-Clause](https://github.com/google/uuid/blob/v1.6.0/LICENSE))
21-
- [github.com/gorilla/mux](https://pkg.go.dev/github.com/gorilla/mux) ([BSD-3-Clause](https://github.com/gorilla/mux/blob/v1.8.0/LICENSE))
22-
- [github.com/invopop/jsonschema](https://pkg.go.dev/github.com/invopop/jsonschema) ([MIT](https://github.com/invopop/jsonschema/blob/v0.13.0/COPYING))
23-
- [github.com/josephburnett/jd/v2](https://pkg.go.dev/github.com/josephburnett/jd/v2) ([MIT](https://github.com/josephburnett/jd/blob/v1.9.2/LICENSE))
24-
- [github.com/josharian/intern](https://pkg.go.dev/github.com/josharian/intern) ([MIT](https://github.com/josharian/intern/blob/v1.0.0/license.md))
25-
- [github.com/mailru/easyjson](https://pkg.go.dev/github.com/mailru/easyjson) ([MIT](https://github.com/mailru/easyjson/blob/v0.7.7/LICENSE))
26-
- [github.com/mark3labs/mcp-go](https://pkg.go.dev/github.com/mark3labs/mcp-go) ([MIT](https://github.com/mark3labs/mcp-go/blob/v0.36.0/LICENSE))
27-
- [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))
28-
- [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))
29-
- [github.com/sagikazarmark/locafero](https://pkg.go.dev/github.com/sagikazarmark/locafero) ([MIT](https://github.com/sagikazarmark/locafero/blob/v0.11.0/LICENSE))
30-
- [github.com/shurcooL/githubv4](https://pkg.go.dev/github.com/shurcooL/githubv4) ([MIT](https://github.com/shurcooL/githubv4/blob/48295856cce7/LICENSE))
31-
- [github.com/shurcooL/graphql](https://pkg.go.dev/github.com/shurcooL/graphql) ([MIT](https://github.com/shurcooL/graphql/blob/ed46e5a46466/LICENSE))
32-
- [github.com/sourcegraph/conc](https://pkg.go.dev/github.com/sourcegraph/conc) ([MIT](https://github.com/sourcegraph/conc/blob/5f936abd7ae8/LICENSE))
33-
- [github.com/spf13/afero](https://pkg.go.dev/github.com/spf13/afero) ([Apache-2.0](https://github.com/spf13/afero/blob/v1.15.0/LICENSE.txt))
34-
- [github.com/spf13/cast](https://pkg.go.dev/github.com/spf13/cast) ([MIT](https://github.com/spf13/cast/blob/v1.10.0/LICENSE))
35-
- [github.com/spf13/cobra](https://pkg.go.dev/github.com/spf13/cobra) ([Apache-2.0](https://github.com/spf13/cobra/blob/v1.10.1/LICENSE.txt))
36-
- [github.com/spf13/pflag](https://pkg.go.dev/github.com/spf13/pflag) ([BSD-3-Clause](https://github.com/spf13/pflag/blob/v1.0.10/LICENSE))
37-
- [github.com/spf13/viper](https://pkg.go.dev/github.com/spf13/viper) ([MIT](https://github.com/spf13/viper/blob/v1.21.0/LICENSE))
38-
- [github.com/subosito/gotenv](https://pkg.go.dev/github.com/subosito/gotenv) ([MIT](https://github.com/subosito/gotenv/blob/v1.6.0/LICENSE))
39-
- [github.com/wk8/go-ordered-map/v2](https://pkg.go.dev/github.com/wk8/go-ordered-map/v2) ([Apache-2.0](https://github.com/wk8/go-ordered-map/blob/v2.1.8/LICENSE))
40-
- [github.com/yosida95/uritemplate/v3](https://pkg.go.dev/github.com/yosida95/uritemplate/v3) ([BSD-3-Clause](https://github.com/yosida95/uritemplate/blob/v3.0.2/LICENSE))
41-
- [github.com/yudai/golcs](https://pkg.go.dev/github.com/yudai/golcs) ([MIT](https://github.com/yudai/golcs/blob/ecda9a501e82/LICENSE))
42-
- [go.yaml.in/yaml/v3](https://pkg.go.dev/go.yaml.in/yaml/v3) ([MIT](https://github.com/yaml/go-yaml/blob/v3.0.4/LICENSE))
43-
- [golang.org/x/exp](https://pkg.go.dev/golang.org/x/exp) ([BSD-3-Clause](https://cs.opensource.google/go/x/exp/+/8a7402ab:LICENSE))
44-
- [golang.org/x/sys/unix](https://pkg.go.dev/golang.org/x/sys/unix) ([BSD-3-Clause](https://cs.opensource.google/go/x/sys/+/v0.31.0:LICENSE))
45-
- [golang.org/x/text](https://pkg.go.dev/golang.org/x/text) ([BSD-3-Clause](https://cs.opensource.google/go/x/text/+/v0.28.0:LICENSE))
46-
- [golang.org/x/time/rate](https://pkg.go.dev/golang.org/x/time/rate) ([BSD-3-Clause](https://cs.opensource.google/go/x/time/+/v0.5.0:LICENSE))
47-
- [gopkg.in/yaml.v2](https://pkg.go.dev/gopkg.in/yaml.v2) ([Apache-2.0](https://github.com/go-yaml/yaml/blob/v2.4.0/LICENSE))
48-
- [gopkg.in/yaml.v3](https://pkg.go.dev/gopkg.in/yaml.v3) ([MIT](https://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE))
15+
- [github.com/go-openapi/jsonpointer](https://pkg.go.dev/github.com/go-openapi/jsonpointer) ([Apache-2.0](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/go-openapi/jsonpointer/LICENSE))
16+
- [github.com/go-openapi/swag](https://pkg.go.dev/github.com/go-openapi/swag) ([Apache-2.0](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/go-openapi/swag/LICENSE))
17+
- [github.com/go-viper/mapstructure/v2](https://pkg.go.dev/github.com/go-viper/mapstructure/v2) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/go-viper/mapstructure/v2/LICENSE))
18+
- [github.com/google/go-github/v71/github](https://pkg.go.dev/github.com/google/go-github/v71/github) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/google/go-github/v71/LICENSE))
19+
- [github.com/google/go-github/v76/github](https://pkg.go.dev/github.com/google/go-github/v76/github) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/google/go-github/v76/LICENSE))
20+
- [github.com/google/go-querystring/query](https://pkg.go.dev/github.com/google/go-querystring/query) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/google/go-querystring/LICENSE))
21+
- [github.com/google/uuid](https://pkg.go.dev/github.com/google/uuid) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/google/uuid/LICENSE))
22+
- [github.com/gorilla/css/scanner](https://pkg.go.dev/github.com/gorilla/css/scanner) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/gorilla/css/LICENSE))
23+
- [github.com/gorilla/mux](https://pkg.go.dev/github.com/gorilla/mux) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/gorilla/mux/LICENSE))
24+
- [github.com/invopop/jsonschema](https://pkg.go.dev/github.com/invopop/jsonschema) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/invopop/jsonschema/COPYING))
25+
- [github.com/josephburnett/jd/v2](https://pkg.go.dev/github.com/josephburnett/jd/v2) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/josephburnett/jd/LICENSE))
26+
- [github.com/josharian/intern](https://pkg.go.dev/github.com/josharian/intern) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/josharian/intern/license.md))
27+
- [github.com/mailru/easyjson](https://pkg.go.dev/github.com/mailru/easyjson) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/mailru/easyjson/LICENSE))
28+
- [github.com/mark3labs/mcp-go](https://pkg.go.dev/github.com/mark3labs/mcp-go) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/mark3labs/mcp-go/LICENSE))
29+
- [github.com/microcosm-cc/bluemonday](https://pkg.go.dev/github.com/microcosm-cc/bluemonday) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/microcosm-cc/bluemonday/LICENSE.md))
30+
- [github.com/migueleliasweb/go-github-mock/src/mock](https://pkg.go.dev/github.com/migueleliasweb/go-github-mock/src/mock) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/migueleliasweb/go-github-mock/LICENSE))
31+
- [github.com/pelletier/go-toml/v2](https://pkg.go.dev/github.com/pelletier/go-toml/v2) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/pelletier/go-toml/v2/LICENSE))
32+
- [github.com/sagikazarmark/locafero](https://pkg.go.dev/github.com/sagikazarmark/locafero) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/sagikazarmark/locafero/LICENSE))
33+
- [github.com/shurcooL/githubv4](https://pkg.go.dev/github.com/shurcooL/githubv4) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/shurcooL/githubv4/LICENSE))
34+
- [github.com/shurcooL/graphql](https://pkg.go.dev/github.com/shurcooL/graphql) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/shurcooL/graphql/LICENSE))
35+
- [github.com/sourcegraph/conc](https://pkg.go.dev/github.com/sourcegraph/conc) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/sourcegraph/conc/LICENSE))
36+
- [github.com/spf13/afero](https://pkg.go.dev/github.com/spf13/afero) ([Apache-2.0](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/spf13/afero/LICENSE.txt))
37+
- [github.com/spf13/cast](https://pkg.go.dev/github.com/spf13/cast) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/spf13/cast/LICENSE))
38+
- [github.com/spf13/cobra](https://pkg.go.dev/github.com/spf13/cobra) ([Apache-2.0](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/spf13/cobra/LICENSE.txt))
39+
- [github.com/spf13/pflag](https://pkg.go.dev/github.com/spf13/pflag) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/spf13/pflag/LICENSE))
40+
- [github.com/spf13/viper](https://pkg.go.dev/github.com/spf13/viper) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/spf13/viper/LICENSE))
41+
- [github.com/subosito/gotenv](https://pkg.go.dev/github.com/subosito/gotenv) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/subosito/gotenv/LICENSE))
42+
- [github.com/wk8/go-ordered-map/v2](https://pkg.go.dev/github.com/wk8/go-ordered-map/v2) ([Apache-2.0](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/wk8/go-ordered-map/v2/LICENSE))
43+
- [github.com/yosida95/uritemplate/v3](https://pkg.go.dev/github.com/yosida95/uritemplate/v3) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/yosida95/uritemplate/v3/LICENSE))
44+
- [github.com/yudai/golcs](https://pkg.go.dev/github.com/yudai/golcs) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/github.com/yudai/golcs/LICENSE))
45+
- [go.yaml.in/yaml/v3](https://pkg.go.dev/go.yaml.in/yaml/v3) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/go.yaml.in/yaml/v3/LICENSE))
46+
- [golang.org/x/exp](https://pkg.go.dev/golang.org/x/exp) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/golang.org/x/exp/LICENSE))
47+
- [golang.org/x/net/html](https://pkg.go.dev/golang.org/x/net/html) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/golang.org/x/net/LICENSE))
48+
- [golang.org/x/sys/unix](https://pkg.go.dev/golang.org/x/sys/unix) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/golang.org/x/sys/LICENSE))
49+
- [golang.org/x/text](https://pkg.go.dev/golang.org/x/text) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/golang.org/x/text/LICENSE))
50+
- [golang.org/x/time/rate](https://pkg.go.dev/golang.org/x/time/rate) ([BSD-3-Clause](https://github.com/github/github-mcp-server/blob/HEAD/vendor/golang.org/x/time/LICENSE))
51+
- [gopkg.in/yaml.v2](https://pkg.go.dev/gopkg.in/yaml.v2) ([Apache-2.0](https://github.com/github/github-mcp-server/blob/HEAD/vendor/gopkg.in/yaml.v2/LICENSE))
52+
- [gopkg.in/yaml.v3](https://pkg.go.dev/gopkg.in/yaml.v3) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/vendor/gopkg.in/yaml.v3/LICENSE))
4953

5054
[github/github-mcp-server]: https://github.com/github/github-mcp-server

0 commit comments

Comments
 (0)