Skip to content

Commit 2ca2fe9

Browse files
committed
FIX mcp unit test, missed upstream commit
Signed-off-by: Jet Chiang <pokyuen.jetchiang-ext@solo.io>
1 parent c75de66 commit 2ca2fe9

2 files changed

Lines changed: 27 additions & 2 deletions

File tree

go/core/internal/mcp/mcp_handler.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ import (
1212
a2atype "github.com/a2aproject/a2a-go/v2/a2a"
1313
a2aclientv2 "github.com/a2aproject/a2a-go/v2/a2aclient"
1414
"github.com/a2aproject/a2a-go/v2/a2aclient/agentcard"
15+
"github.com/google/jsonschema-go/jsonschema"
1516
"github.com/kagent-dev/kagent/go/api/v1alpha2"
1617
"github.com/kagent-dev/kagent/go/core/internal/a2a"
1718
"github.com/kagent-dev/kagent/go/core/internal/version"
1819
"github.com/kagent-dev/kagent/go/core/pkg/auth"
20+
"github.com/kagent-dev/kagent/go/core/pkg/env"
1921
mcpsdk "github.com/modelcontextprotocol/go-sdk/mcp"
2022
"k8s.io/apimachinery/pkg/types"
2123
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -82,12 +84,21 @@ func NewMCPHandler(kubeClient client.Client, a2aBaseURL string, authenticator au
8284
server := mcpsdk.NewServer(impl, nil)
8385
handler.server = server
8486

85-
// Add list_agents tool
87+
// Add list_agents tool.
88+
// InputSchema is set explicitly (rather than reflected from the empty
89+
// ListAgentsInput struct) so the serialized schema includes "properties": {}.
90+
// OpenAI strict mode rejects object schemas without a properties key.
91+
// See https://github.com/kagent-dev/kagent/issues/1889.
8692
mcpsdk.AddTool[ListAgentsInput, ListAgentsOutput](
8793
server,
8894
&mcpsdk.Tool{
8995
Name: "list_agents",
9096
Description: "List invokable kagent agents (accepted + deploymentReady)",
97+
InputSchema: &jsonschema.Schema{
98+
Type: "object",
99+
Properties: map[string]*jsonschema.Schema{},
100+
AdditionalProperties: &jsonschema.Schema{Not: &jsonschema.Schema{}},
101+
},
91102
},
92103
handler.handleListAgents,
93104
)
@@ -103,11 +114,15 @@ func NewMCPHandler(kubeClient client.Client, a2aBaseURL string, authenticator au
103114
)
104115

105116
// Create HTTP handler
117+
var httpOpts *mcpsdk.StreamableHTTPOptions
118+
if env.KagentMCPStateless.Get() {
119+
httpOpts = &mcpsdk.StreamableHTTPOptions{Stateless: true}
120+
}
106121
handler.httpHandler = mcpsdk.NewStreamableHTTPHandler(
107122
func(*http.Request) *mcpsdk.Server {
108123
return server
109124
},
110-
nil,
125+
httpOpts,
111126
)
112127

113128
return handler, nil

go/core/pkg/env/kagent.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ var (
2323
ComponentController,
2424
)
2525

26+
KagentMCPStateless = RegisterBoolVar(
27+
"KAGENT_MCP_STATELESS",
28+
false,
29+
"When true, the MCP server operates in stateless mode (no session persistence). "+
30+
"Use when the network path does not provide sticky session routing based on the Mcp-Session-Id header. "+
31+
"Note: stateless mode disables server-initiated notifications; clients will not receive "+
32+
"resources/updated events.",
33+
ComponentController,
34+
)
35+
2636
// Variables injected into agent pods (not read by the controller itself).
2737

2838
KagentName = RegisterStringVar(

0 commit comments

Comments
 (0)