Skip to content

Commit 5502ad0

Browse files
committed
feat: add streamable support
Signed-off-by: Liam Stanley <[email protected]>
1 parent 7057bb6 commit 5502ad0

File tree

9 files changed

+191
-75
lines changed

9 files changed

+191
-75
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ prepare: fetch
2222
go generate -x ./...
2323

2424
inspect:
25-
@echo "server will be available at: http://localhost:8081/?transport=sse&serverUrl=http://localhost:8080/sse#tools"
25+
@echo "server will be available at: http://localhost:8081/?transport=streamable-http&serverUrl=http://localhost:8080/mcp#tools"
2626
@CLIENT_PORT=8081 pnpm dlx @modelcontextprotocol/inspector
2727

2828
dlv: prepare

README.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,11 @@
6666

6767
## :sparkles: Features
6868

69-
**context7-http** is a MCP server that supports HTTP SSE streaming for the [Context7](https://context7.com) project.
69+
**context7-http** is a MCP server that supports HTTP streaming for the [Context7](https://context7.com) project.
7070
This allows you to utilize the MCP server from anywhere, without installing anything locally.
7171

7272
- Has _current_ feature parity with the existing Context7 MCP Server.
73-
- HTTP SSE streaming for Context7.
74-
- (_future_) Support for HTTP `streamable` functionality once it's supported in the upstream MCP library
75-
we use (or the official MCP library is released by the Go team).
73+
- SSE and HTTP `streamable` support.
7674
- Provides `resolve-library-uri` and `search-library-docs` tools for finding libraries, and searching their documentation.
7775
- Provides multiple resources, including:
7876
- `context7://libraries` - returns high-level information about all libraries.

go.mod

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,58 @@ require (
66
github.com/Code-Hex/go-generics-cache v1.5.1
77
github.com/Masterminds/sprig/v3 v3.3.0
88
github.com/apex/log v1.9.0
9+
github.com/go-chi/chi/v5 v5.2.1
10+
github.com/lrstanley/chix v1.0.6
911
github.com/lrstanley/clix v1.0.8
10-
github.com/mark3labs/mcp-go v0.29.0
12+
github.com/mark3labs/mcp-go v0.29.1-0.20250524074620-e028081f7d26
1113
github.com/sethvargo/go-limiter v1.0.0
1214
)
1315

1416
require (
1517
dario.cat/mergo v1.0.2 // indirect
1618
github.com/Masterminds/goutils v1.1.1 // indirect
1719
github.com/Masterminds/semver/v3 v3.3.1 // indirect
20+
github.com/beorn7/perks v1.0.1 // indirect
21+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1822
github.com/fatih/color v1.18.0 // indirect
23+
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
1924
github.com/go-logfmt/logfmt v0.6.0 // indirect
25+
github.com/go-playground/form/v4 v4.2.1 // indirect
26+
github.com/go-playground/locales v0.14.1 // indirect
27+
github.com/go-playground/universal-translator v0.18.1 // indirect
28+
github.com/go-playground/validator/v10 v10.26.0 // indirect
2029
github.com/google/uuid v1.6.0 // indirect
2130
github.com/gookit/color v1.5.4 // indirect
31+
github.com/gorilla/mux v1.8.1 // indirect
32+
github.com/gorilla/securecookie v1.1.2 // indirect
33+
github.com/gorilla/sessions v1.4.0 // indirect
2234
github.com/huandu/xstrings v1.5.0 // indirect
2335
github.com/jessevdk/go-flags v1.6.1 // indirect
2436
github.com/joho/godotenv v1.5.1 // indirect
37+
github.com/leodido/go-urn v1.4.0 // indirect
38+
github.com/lrstanley/go-bogon v1.0.0 // indirect
39+
github.com/markbates/goth v1.81.0 // indirect
2540
github.com/mattn/go-colorable v0.1.14 // indirect
2641
github.com/mattn/go-isatty v0.0.20 // indirect
2742
github.com/mitchellh/copystructure v1.2.0 // indirect
2843
github.com/mitchellh/reflectwalk v1.0.2 // indirect
44+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
2945
github.com/pkg/errors v0.9.1 // indirect
46+
github.com/prometheus/client_golang v1.22.0 // indirect
47+
github.com/prometheus/client_model v0.6.2 // indirect
48+
github.com/prometheus/common v0.64.0 // indirect
49+
github.com/prometheus/procfs v0.16.1 // indirect
3050
github.com/sethvargo/go-githubactions v1.3.1 // indirect
3151
github.com/shopspring/decimal v1.4.0 // indirect
3252
github.com/spf13/cast v1.8.0 // indirect
3353
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
3454
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
3555
golang.org/x/crypto v0.38.0 // indirect
3656
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
57+
golang.org/x/net v0.40.0 // indirect
58+
golang.org/x/oauth2 v0.30.0 // indirect
3759
golang.org/x/sync v0.14.0 // indirect
3860
golang.org/x/sys v0.33.0 // indirect
61+
golang.org/x/text v0.25.0 // indirect
62+
google.golang.org/protobuf v1.36.6 // indirect
3963
)

go.sum

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy
1515
github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys=
1616
github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
1717
github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
18+
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
19+
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
20+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
21+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
1822
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1923
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2024
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -24,18 +28,41 @@ github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/
2428
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
2529
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
2630
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
31+
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
32+
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
33+
github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8=
34+
github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
2735
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
2836
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
2937
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
38+
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
39+
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
40+
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
41+
github.com/go-playground/form/v4 v4.2.1 h1:HjdRDKO0fftVMU5epjPW2SOREcZ6/wLUzEobqUGJuPw=
42+
github.com/go-playground/form/v4 v4.2.1/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U=
43+
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
44+
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
45+
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
46+
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
47+
github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k=
48+
github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
3049
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
3150
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
32-
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
33-
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
51+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
52+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
53+
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
54+
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
3455
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
3556
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
3657
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
3758
github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
3859
github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
60+
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
61+
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
62+
github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
63+
github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
64+
github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ=
65+
github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik=
3966
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
4067
github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
4168
github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
@@ -53,10 +80,18 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
5380
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
5481
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
5582
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
83+
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
84+
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
85+
github.com/lrstanley/chix v1.0.6 h1:XARqMJxgckBjPf55cqJafJjm6QoHKKWzIJo6Qz2uH7s=
86+
github.com/lrstanley/chix v1.0.6/go.mod h1:aEMGzfIXSyC9mPMoVAJEnOK+hrBGUlVU6wYAYLVE/CM=
5687
github.com/lrstanley/clix v1.0.8 h1:mmNncPt0ZETS8xAAnG6bNf26sjgKbv2B4b/xHL+5maA=
5788
github.com/lrstanley/clix v1.0.8/go.mod h1:t8+YqT94ijWLNvnohkozZu/5jrbuUJTyQR1fU5hfTjg=
58-
github.com/mark3labs/mcp-go v0.29.0 h1:sH1NBcumKskhxqYzhXfGc201D7P76TVXiT0fGVhabeI=
59-
github.com/mark3labs/mcp-go v0.29.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
89+
github.com/lrstanley/go-bogon v1.0.0 h1:EhFN3Bu+59u9g8n+xWCzRlbSfNKqAbhsjzW8lcMrG0g=
90+
github.com/lrstanley/go-bogon v1.0.0/go.mod h1:1H1sGTRZ05IO1sQHKLAQQ34v19KrQeYg2Ix9HgJuFXQ=
91+
github.com/mark3labs/mcp-go v0.29.1-0.20250524074620-e028081f7d26 h1:6ibdzKYFrBSoftHX792Oetq9xG9KTxPPB8LrTJjBx50=
92+
github.com/mark3labs/mcp-go v0.29.1-0.20250524074620-e028081f7d26/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
93+
github.com/markbates/goth v1.81.0 h1:XVcCkeGWokynPV7MXvgb8pd2s3r7DS40P7931w6kdnE=
94+
github.com/markbates/goth v1.81.0/go.mod h1:+6z31QyUms84EHmuBY7iuqYSxyoN3njIgg9iCF/lR1k=
6095
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
6196
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
6297
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
@@ -70,16 +105,26 @@ github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa1
70105
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
71106
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
72107
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
108+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
109+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
73110
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
74111
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
75112
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
76113
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
77114
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
78115
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
79116
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
117+
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
118+
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
119+
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
120+
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
121+
github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
122+
github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
123+
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
124+
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
80125
github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
81-
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
82-
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
126+
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
127+
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
83128
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
84129
github.com/sethvargo/go-githubactions v1.3.1 h1:rlwwLRUaunWLQ1aN2o5Y+3s0xhaTC30YObCnilRx448=
85130
github.com/sethvargo/go-githubactions v1.3.1/go.mod h1:7/4WeHgYfSz9U5vwuToCK9KPnELVHAhGtRwLREOQV80=
@@ -95,8 +140,8 @@ github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cA
95140
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
96141
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
97142
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
98-
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
99-
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
143+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
144+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
100145
github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0=
101146
github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk=
102147
github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk=
@@ -117,6 +162,10 @@ golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aC
117162
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
118163
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
119164
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
165+
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
166+
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
167+
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
168+
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
120169
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
121170
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
122171
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
@@ -129,7 +178,11 @@ golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
129178
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
130179
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
131180
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
181+
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
182+
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
132183
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
184+
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
185+
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
133186
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
134187
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
135188
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=

http.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// Copyright (c) Liam Stanley <[email protected]>. All rights reserved. Use of
2+
// this source code is governed by the MIT license that can be found in
3+
// the LICENSE file.
4+
5+
package main
6+
7+
import (
8+
"context"
9+
"net/http"
10+
"strings"
11+
"time"
12+
13+
"github.com/apex/log"
14+
"github.com/go-chi/chi/v5"
15+
"github.com/go-chi/chi/v5/middleware"
16+
"github.com/lrstanley/chix"
17+
"github.com/mark3labs/mcp-go/server"
18+
)
19+
20+
func httpServer(ctx context.Context) *http.Server {
21+
chix.DefaultAPIPrefix = "/"
22+
r := chi.NewRouter()
23+
24+
if len(cli.Flags.TrustedProxies) > 0 {
25+
r.Use(chix.UseRealIPCLIOpts(cli.Flags.TrustedProxies))
26+
}
27+
28+
// Core middeware.
29+
r.Use(
30+
chix.UseDebug(cli.Debug),
31+
chix.UseContextIP,
32+
chix.UseStructuredLogger(log.FromContext(ctx)),
33+
chix.UseRecoverer,
34+
middleware.Maybe(middleware.StripSlashes, func(r *http.Request) bool {
35+
return !strings.HasPrefix(r.URL.Path, "/debug/")
36+
}),
37+
middleware.Compress(5),
38+
chix.UseSecurityTxt(&chix.SecurityConfig{
39+
ExpiresIn: 182 * 24 * time.Hour,
40+
Contacts: []string{
41+
42+
"https://liam.sh/chat",
43+
"https://github.com/lrstanley",
44+
},
45+
KeyLinks: []string{"https://github.com/lrstanley.gpg"},
46+
Languages: []string{"en"},
47+
}),
48+
)
49+
50+
sseServer := server.NewSSEServer(
51+
srv.MCPServer,
52+
server.WithBaseURL(cli.Flags.BaseURL),
53+
)
54+
r.Handle("/sse", sseServer)
55+
r.Handle("/message", sseServer)
56+
57+
streamableOpts := []server.StreamableHTTPOption{}
58+
if cli.Flags.HeartbeatInterval > 0 {
59+
streamableOpts = append(streamableOpts, server.WithHeartbeatInterval(cli.Flags.HeartbeatInterval))
60+
}
61+
62+
streamableServer := server.NewStreamableHTTPServer(srv.MCPServer, streamableOpts...)
63+
r.Handle("/mcp", streamableServer)
64+
65+
if cli.Debug {
66+
r.With(chix.UsePrivateIP).Mount("/debug", middleware.Profiler())
67+
}
68+
69+
r.With(middleware.ThrottleBacklog(1, 5, 5*time.Second)).Get("/healthy", func(w http.ResponseWriter, r *http.Request) {
70+
chix.JSON(w, r, 200, chix.M{
71+
"status": "ok",
72+
})
73+
})
74+
75+
r.NotFound(func(w http.ResponseWriter, r *http.Request) {
76+
chix.Error(w, r, chix.WrapCode(http.StatusNotFound))
77+
})
78+
79+
return &http.Server{
80+
Addr: cli.Flags.BindAddr,
81+
Handler: r,
82+
// Must explicitly stay set to 0 because long-lived connections.
83+
ReadTimeout: 0,
84+
WriteTimeout: 0,
85+
}
86+
}

internal/api/client.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
cache "github.com/Code-Hex/go-generics-cache"
1515
"github.com/Code-Hex/go-generics-cache/policy/lfu"
16-
"github.com/lrstanley/context7-http/internal/session"
16+
"github.com/lrstanley/chix"
1717
"github.com/sethvargo/go-limiter"
1818
"github.com/sethvargo/go-limiter/memorystore"
1919
)
@@ -66,8 +66,8 @@ func New(ctx context.Context, httpClient *http.Client) (*Client, error) {
6666
}
6767

6868
func (c *Client) checkRateLimit(ctx context.Context, namespace string) (err error) {
69-
sessionID := session.GetIDFromContext(ctx)
70-
_, _, reset, allowed, _ := c.limiter.Take(ctx, namespace+"/"+sessionID)
69+
ip := chix.GetContextIP(ctx)
70+
_, _, reset, allowed, _ := c.limiter.Take(ctx, namespace+"/"+ip.String())
7171
if !allowed {
7272
return fmt.Errorf("rate limit exceeded (reset in %s)", time.Until(time.Unix(0, int64(reset))))
7373
}

internal/api/list_libraries.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package api
66

77
import (
88
"context"
9+
"errors"
910
"fmt"
1011
"net/http"
1112
"slices"
@@ -145,5 +146,5 @@ func (c *Client) GetLibrary(ctx context.Context, resourceURI string) (library *L
145146
return library, nil
146147
}
147148
}
148-
return nil, fmt.Errorf("library not found")
149+
return nil, errors.New("library not found")
149150
}

0 commit comments

Comments
 (0)