From 2824a8f254a542975463601b6e3fc457e5fb13bf Mon Sep 17 00:00:00 2001 From: Adam Holt Date: Tue, 17 Feb 2026 16:25:07 +0100 Subject: [PATCH 1/2] Add support for custom middleware in the correct order. --- pkg/github/server.go | 10 +++++++--- pkg/http/handler.go | 3 +++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/pkg/github/server.go b/pkg/github/server.go index 9a602e153..932ae09e5 100644 --- a/pkg/github/server.go +++ b/pkg/github/server.go @@ -73,7 +73,7 @@ type MCPServerConfig struct { type MCPServerOption func(*mcp.ServerOptions) -func NewMCPServer(ctx context.Context, cfg *MCPServerConfig, deps ToolDependencies, inv *inventory.Inventory) (*mcp.Server, error) { +func NewMCPServer(ctx context.Context, cfg *MCPServerConfig, deps ToolDependencies, inv *inventory.Inventory, middleware ...mcp.Middleware) (*mcp.Server, error) { // Create the MCP server serverOpts := &mcp.ServerOptions{ Instructions: inv.Instructions(), @@ -98,9 +98,13 @@ func NewMCPServer(ctx context.Context, cfg *MCPServerConfig, deps ToolDependenci ghServer := NewServer(cfg.Version, serverOpts) + // We always want the GitHub API error middleware to run first so that any errors from the, + // GitHub API are captured in the context for downstream middlewares and handlers, even if MCP parsing fails and prevents later middlewares from running. + middlewareToInject := []mcp.Middleware{addGitHubAPIErrorToContext, InjectDepsMiddleware(deps)} + middlewareToInject = append(middlewareToInject, middleware...) + // Add middlewares - ghServer.AddReceivingMiddleware(addGitHubAPIErrorToContext) - ghServer.AddReceivingMiddleware(InjectDepsMiddleware(deps)) + ghServer.AddReceivingMiddleware(middlewareToInject...) if unrecognized := inv.UnrecognizedToolsets(); len(unrecognized) > 0 { cfg.Logger.Warn("Warning: unrecognized toolsets ignored", "toolsets", strings.Join(unrecognized, ", ")) diff --git a/pkg/http/handler.go b/pkg/http/handler.go index 3c6c5302e..c4fcdec72 100644 --- a/pkg/http/handler.go +++ b/pkg/http/handler.go @@ -19,6 +19,9 @@ import ( ) type InventoryFactoryFunc func(r *http.Request) (*inventory.Inventory, error) + +// GitHubMCPServerFactoryFunc is a function type for creating a new MCP Server instance. +// middleware are applied AFTER the default GitHub MCP Server middlewares (like error context injection) type GitHubMCPServerFactoryFunc func(r *http.Request, deps github.ToolDependencies, inventory *inventory.Inventory, cfg *github.MCPServerConfig) (*mcp.Server, error) type Handler struct { From 28b8d19a9455992cc246e16782d297b6db001d27 Mon Sep 17 00:00:00 2001 From: Adam Holt Date: Wed, 18 Feb 2026 11:23:08 +0100 Subject: [PATCH 2/2] Switch this up to be more clear on what it's doing --- pkg/github/server.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/pkg/github/server.go b/pkg/github/server.go index 932ae09e5..14741939d 100644 --- a/pkg/github/server.go +++ b/pkg/github/server.go @@ -98,13 +98,11 @@ func NewMCPServer(ctx context.Context, cfg *MCPServerConfig, deps ToolDependenci ghServer := NewServer(cfg.Version, serverOpts) - // We always want the GitHub API error middleware to run first so that any errors from the, - // GitHub API are captured in the context for downstream middlewares and handlers, even if MCP parsing fails and prevents later middlewares from running. - middlewareToInject := []mcp.Middleware{addGitHubAPIErrorToContext, InjectDepsMiddleware(deps)} - middlewareToInject = append(middlewareToInject, middleware...) - - // Add middlewares - ghServer.AddReceivingMiddleware(middlewareToInject...) + // Add middlewares. Order matters - for example, the error context middleware should be applied last so that it runs FIRST (closest to the handler) to ensure all errors are captured, + // and any middleware that needs to read or modify the context should be before it. + ghServer.AddReceivingMiddleware(middleware...) + ghServer.AddReceivingMiddleware(InjectDepsMiddleware(deps)) + ghServer.AddReceivingMiddleware(addGitHubAPIErrorToContext) if unrecognized := inv.UnrecognizedToolsets(); len(unrecognized) > 0 { cfg.Logger.Warn("Warning: unrecognized toolsets ignored", "toolsets", strings.Join(unrecognized, ", "))