311d581520
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
Docker / build (push) Has been cancelled
Build and Test Go Project / build (macos-latest) (push) Has been cancelled
Build and Test Go Project / build (ubuntu-latest) (push) Has been cancelled
Build and Test Go Project / build (windows-latest) (push) Has been cancelled
GoReleaser Release / release (push) Has been cancelled
License Check / license-check (push) Has been cancelled
Publish to MCP Registry / publish (push) Has been cancelled
The issue was that after PR #1640 switched from closure-based deps to context-based deps, the stdio server was missing middleware to inject ToolDependencies into the request context. This caused tools to panic with "ToolDependencies not found in context" when called. Added middleware in NewMCPServer() that wraps all requests with github.ContextWithDeps(), ensuring deps are available to tool handlers via MustDepsFromContext(). Also added tests to verify server creation and toolset resolution logic. Co-authored-by: SamMorrowDrums <4811358+SamMorrowDrums@users.noreply.github.com>
113 lines
3.1 KiB
Go
113 lines
3.1 KiB
Go
package ghmcp
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/github/github-mcp-server/pkg/translations"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// TestNewMCPServer_CreatesSuccessfully verifies that the server can be created
|
|
// with the deps injection middleware properly configured.
|
|
func TestNewMCPServer_CreatesSuccessfully(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
// Create a minimal server configuration
|
|
cfg := MCPServerConfig{
|
|
Version: "test",
|
|
Host: "", // defaults to github.com
|
|
Token: "test-token",
|
|
EnabledToolsets: []string{"context"},
|
|
ReadOnly: false,
|
|
Translator: translations.NullTranslationHelper,
|
|
ContentWindowSize: 5000,
|
|
LockdownMode: false,
|
|
}
|
|
|
|
// Create the server
|
|
server, err := NewMCPServer(cfg)
|
|
require.NoError(t, err, "expected server creation to succeed")
|
|
require.NotNil(t, server, "expected server to be non-nil")
|
|
|
|
// The fact that the server was created successfully indicates that:
|
|
// 1. The deps injection middleware is properly added
|
|
// 2. Tools can be registered without panicking
|
|
//
|
|
// If the middleware wasn't properly added, tool calls would panic with
|
|
// "ToolDependencies not found in context" when executed.
|
|
//
|
|
// The actual middleware functionality and tool execution with ContextWithDeps
|
|
// is already tested in pkg/github/*_test.go.
|
|
}
|
|
|
|
// TestResolveEnabledToolsets verifies the toolset resolution logic.
|
|
func TestResolveEnabledToolsets(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
name string
|
|
cfg MCPServerConfig
|
|
expectedResult []string
|
|
}{
|
|
{
|
|
name: "nil toolsets without dynamic mode and no tools - use defaults",
|
|
cfg: MCPServerConfig{
|
|
EnabledToolsets: nil,
|
|
DynamicToolsets: false,
|
|
EnabledTools: nil,
|
|
},
|
|
expectedResult: nil, // nil means "use defaults"
|
|
},
|
|
{
|
|
name: "nil toolsets with dynamic mode - start empty",
|
|
cfg: MCPServerConfig{
|
|
EnabledToolsets: nil,
|
|
DynamicToolsets: true,
|
|
EnabledTools: nil,
|
|
},
|
|
expectedResult: []string{}, // empty slice means no toolsets
|
|
},
|
|
{
|
|
name: "explicit toolsets",
|
|
cfg: MCPServerConfig{
|
|
EnabledToolsets: []string{"repos", "issues"},
|
|
DynamicToolsets: false,
|
|
},
|
|
expectedResult: []string{"repos", "issues"},
|
|
},
|
|
{
|
|
name: "empty toolsets - disable all",
|
|
cfg: MCPServerConfig{
|
|
EnabledToolsets: []string{},
|
|
DynamicToolsets: false,
|
|
},
|
|
expectedResult: []string{}, // empty slice means no toolsets
|
|
},
|
|
{
|
|
name: "specific tools without toolsets - no default toolsets",
|
|
cfg: MCPServerConfig{
|
|
EnabledToolsets: nil,
|
|
DynamicToolsets: false,
|
|
EnabledTools: []string{"get_me"},
|
|
},
|
|
expectedResult: []string{}, // empty slice when tools specified but no toolsets
|
|
},
|
|
{
|
|
name: "dynamic mode with explicit toolsets removes all and default",
|
|
cfg: MCPServerConfig{
|
|
EnabledToolsets: []string{"all", "repos"},
|
|
DynamicToolsets: true,
|
|
},
|
|
expectedResult: []string{"repos"}, // "all" is removed in dynamic mode
|
|
},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
result := resolveEnabledToolsets(tc.cfg)
|
|
assert.Equal(t, tc.expectedResult, result)
|
|
})
|
|
}
|
|
}
|