@@ -194,6 +194,69 @@ func TestNewMCPServer_CreatesSuccessfully(t *testing.T) {
194194 // is already tested in pkg/github/*_test.go.
195195}
196196
197+ func TestNewMCPServerTypedLegacyPreflightAndHandlerReceiveDependencies (t * testing.T ) {
198+ type output struct {
199+ OK bool `json:"ok"`
200+ }
201+ deps := stubDeps {obsv : stubExporters ()}
202+ tool := NewToolWithSchemaOptions [struct {}, output ](
203+ inventory.ToolsetMetadata {ID : inventory .ToolsetID ("test" ), Description : "Test" },
204+ mcp.Tool {Name : "typed_dependency_tool" },
205+ inventory.ScopeAccess {},
206+ inventory.TypedSchemaOptions {
207+ Preflight : func (ctx context.Context , _ * mcp.CallToolRequest ) (context.Context , * mcp.CallToolResult , error ) {
208+ if _ , ok := DepsFromContext (ctx ); ! ok {
209+ return ctx , nil , errors .New ("dependencies missing in preflight" )
210+ }
211+ return ctx , nil , nil
212+ },
213+ },
214+ func (ctx context.Context , handlerDeps ToolDependencies , _ * mcp.CallToolRequest , _ struct {}) (* mcp.CallToolResult , output , error ) {
215+ if _ , ok := DepsFromContext (ctx ); ! ok || handlerDeps == nil {
216+ return nil , output {}, errors .New ("dependencies missing in handler" )
217+ }
218+ return & mcp.CallToolResult {
219+ Content : []mcp.Content {& mcp.TextContent {Text : "legacy text" }},
220+ }, output {OK : true }, nil
221+ },
222+ )
223+ inv , err := inventory .NewBuilder ().
224+ SetTools ([]inventory.ServerTool {tool }).
225+ WithToolsets ([]string {"all" }).
226+ Build ()
227+ require .NoError (t , err )
228+ cfg := MCPServerConfig {
229+ Version : "test" ,
230+ Translator : translations .NullTranslationHelper ,
231+ Logger : slog .New (slog .DiscardHandler ),
232+ }
233+ server , err := NewMCPServer (context .Background (), & cfg , deps , inv )
234+ require .NoError (t , err )
235+
236+ serverTransport , clientTransport := mcp .NewInMemoryTransports ()
237+ serverSession , err := server .Connect (context .Background (), serverTransport , nil )
238+ require .NoError (t , err )
239+ t .Cleanup (func () { _ = serverSession .Close () })
240+ client := mcp .NewClient (& mcp.Implementation {Name : "legacy-test" , Version : "1" }, nil )
241+ clientSession , err := client .Connect (context .Background (), clientTransport , & mcp.ClientSessionOptions {
242+ ProtocolVersion : "2025-11-25" ,
243+ })
244+ require .NoError (t , err )
245+ t .Cleanup (func () { _ = clientSession .Close () })
246+
247+ list , err := clientSession .ListTools (context .Background (), nil )
248+ require .NoError (t , err )
249+ require .Len (t , list .Tools , 1 )
250+ assert .Nil (t , list .Tools [0 ].OutputSchema )
251+
252+ result , err := clientSession .CallTool (context .Background (), & mcp.CallToolParams {Name : "typed_dependency_tool" })
253+ require .NoError (t , err )
254+ require .False (t , result .IsError )
255+ assert .Nil (t , result .StructuredContent )
256+ require .Len (t , result .Content , 1 )
257+ assert .Equal (t , "legacy text" , result .Content [0 ].(* mcp.TextContent ).Text )
258+ }
259+
197260func TestFeatureStateMiddlewareCachesHandlerChecks (t * testing.T ) {
198261 var calls int
199262 checker := func (_ context.Context , flag string ) (bool , error ) {
0 commit comments