@@ -3,34 +3,41 @@ package http
33import (
44 "log/slog"
55 "net/http"
6+ "strings"
67
78 "github.com/github/github-mcp-server/pkg/github"
89 "github.com/github/github-mcp-server/pkg/http/middleware"
10+ "github.com/github/github-mcp-server/pkg/inventory"
911 "github.com/github/github-mcp-server/pkg/lockdown"
1012 "github.com/github/github-mcp-server/pkg/translations"
1113 "github.com/github/github-mcp-server/pkg/utils"
1214 "github.com/modelcontextprotocol/go-sdk/mcp"
1315)
1416
17+ type InventoryFactoryFunc func (r * http.Request ) * inventory.Inventory
18+
1519type HttpMcpHandler struct {
16- config * HTTPServerConfig
17- apiHosts utils.ApiHost
18- logger * slog.Logger
19- t translations.TranslationHelperFunc
20- repoAccessOpts []lockdown.RepoAccessOption
20+ config * HTTPServerConfig
21+ apiHosts utils.ApiHost
22+ logger * slog.Logger
23+ t translations.TranslationHelperFunc
24+ repoAccessOpts []lockdown.RepoAccessOption
25+ inventoryFactoryFunc InventoryFactoryFunc
2126}
2227
2328func NewHttpMcpHandler (cfg * HTTPServerConfig ,
2429 t translations.TranslationHelperFunc ,
2530 apiHosts * utils.ApiHost ,
2631 repoAccessOptions []lockdown.RepoAccessOption ,
27- logger * slog.Logger ) * HttpMcpHandler {
32+ logger * slog.Logger ,
33+ inventoryFactory InventoryFactoryFunc ) * HttpMcpHandler {
2834 return & HttpMcpHandler {
29- config : cfg ,
30- apiHosts : * apiHosts ,
31- logger : logger ,
32- t : t ,
33- repoAccessOpts : repoAccessOptions ,
35+ config : cfg ,
36+ apiHosts : * apiHosts ,
37+ logger : logger ,
38+ t : t ,
39+ repoAccessOpts : repoAccessOptions ,
40+ inventoryFactoryFunc : inventoryFactory ,
3441 }
3542}
3643
@@ -48,6 +55,8 @@ func (s *HttpMcpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
4855 s .config .ContentWindowSize ,
4956 )
5057
58+ inventory := s .inventoryFactoryFunc (r )
59+
5160 ghServer , err := github .NewMCPServer (& github.MCPServerConfig {
5261 Version : s .config .Version ,
5362 Host : s .config .Host ,
@@ -60,7 +69,7 @@ func (s *HttpMcpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
6069 ContentWindowSize : s .config .ContentWindowSize ,
6170 Logger : s .logger ,
6271 RepoAccessTTL : s .config .RepoAccessCacheTTL ,
63- }, deps )
72+ }, deps , inventory )
6473 if err != nil {
6574 w .WriteHeader (http .StatusInternalServerError )
6675 }
@@ -73,3 +82,29 @@ func (s *HttpMcpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
7382
7483 middleware .ExtractUserToken ()(mcpHandler ).ServeHTTP (w , r )
7584}
85+
86+ func DefaultInventoryFactory (cfg * HTTPServerConfig , t translations.TranslationHelperFunc ) InventoryFactoryFunc {
87+ return func (r * http.Request ) * inventory.Inventory {
88+ b := github .NewInventory (t ).WithDeprecatedAliases (github .DeprecatedToolAliases )
89+ b = InventoryFiltersForRequestHeaders (r , b )
90+ return b .Build ()
91+ }
92+ }
93+
94+ func InventoryFiltersForRequestHeaders (r * http.Request , builder * inventory.Builder ) * inventory.Builder {
95+ if r .Header .Get ("X-MCP-Readonly" ) != "" {
96+ builder = builder .WithReadOnly (true )
97+ }
98+
99+ if toolsetsStr := r .Header .Get ("X-MCP-Toolsets" ); toolsetsStr != "" {
100+ toolsets := strings .Split (toolsetsStr , "," )
101+ builder = builder .WithToolsets (toolsets )
102+ }
103+
104+ if toolsStr := r .Header .Get ("X-MCP-Tools" ); toolsStr != "" {
105+ tools := strings .Split (toolsStr , "," )
106+ builder = builder .WithTools (github .CleanTools (tools ))
107+ }
108+
109+ return builder
110+ }
0 commit comments