(ctx context.Context, cfg github.MCPServerConfig)
| 133 | } |
| 134 | |
| 135 | func NewStdioMCPServer(ctx context.Context, cfg github.MCPServerConfig) (*mcp.Server, error) { |
| 136 | apiHost, err := utils.NewAPIHost(cfg.Host) |
| 137 | if err != nil { |
| 138 | return nil, fmt.Errorf("failed to parse API host: %w", err) |
| 139 | } |
| 140 | |
| 141 | clients, err := createGitHubClients(cfg, apiHost) |
| 142 | if err != nil { |
| 143 | return nil, fmt.Errorf("failed to create GitHub clients: %w", err) |
| 144 | } |
| 145 | |
| 146 | // Create feature checker — resolves explicit features + insiders expansion |
| 147 | featureChecker := createFeatureChecker(cfg.EnabledFeatures, cfg.InsidersMode) |
| 148 | |
| 149 | // Create dependencies for tool handlers |
| 150 | obs, err := observability.NewExporters(cfg.Logger, metrics.NewNoopMetrics()) |
| 151 | if err != nil { |
| 152 | return nil, fmt.Errorf("failed to create observability exporters: %w", err) |
| 153 | } |
| 154 | deps := github.NewBaseDeps( |
| 155 | clients.rest, |
| 156 | clients.gql, |
| 157 | clients.raw, |
| 158 | clients.repoAccess, |
| 159 | cfg.Translator, |
| 160 | github.FeatureFlags{ |
| 161 | LockdownMode: cfg.LockdownMode, |
| 162 | }, |
| 163 | cfg.ContentWindowSize, |
| 164 | featureChecker, |
| 165 | obs, |
| 166 | ) |
| 167 | // Build and register the tool/resource/prompt inventory |
| 168 | inventoryBuilder := github.NewInventory(cfg.Translator). |
| 169 | WithDeprecatedAliases(github.DeprecatedToolAliases). |
| 170 | WithReadOnly(cfg.ReadOnly). |
| 171 | WithToolsets(github.ResolvedEnabledToolsets(cfg.EnabledToolsets, cfg.EnabledTools)). |
| 172 | WithTools(github.CleanTools(cfg.EnabledTools)). |
| 173 | WithExcludeTools(cfg.ExcludeTools). |
| 174 | WithServerInstructions(). |
| 175 | WithFeatureChecker(featureChecker) |
| 176 | |
| 177 | // Apply token scope filtering if scopes are known (for PAT filtering) |
| 178 | if cfg.TokenScopes != nil { |
| 179 | inventoryBuilder = inventoryBuilder.WithFilter(github.CreateToolScopeFilter(cfg.TokenScopes)) |
| 180 | } |
| 181 | |
| 182 | inventory, err := inventoryBuilder.Build() |
| 183 | if err != nil { |
| 184 | return nil, fmt.Errorf("failed to build inventory: %w", err) |
| 185 | } |
| 186 | |
| 187 | ghServer, err := github.NewMCPServer(ctx, &cfg, deps, inventory) |
| 188 | if err != nil { |
| 189 | return nil, fmt.Errorf("failed to create GitHub MCP server: %w", err) |
| 190 | } |
| 191 | |
| 192 | ghServer.AddReceivingMiddleware(addUserAgentsMiddleware(cfg, clients.restUATransp, clients.gqlHTTP)) |
no test coverage detected