@@ -18,6 +18,7 @@ import (
1818 "context"
1919 "fmt"
2020 "os"
21+ "time"
2122
2223 "github.com/firebase/genkit/go/ai"
2324 "github.com/firebase/genkit/go/core/logger"
@@ -250,13 +251,74 @@ func clientGetPromptExample() {
250251 }
251252}
252253
254+ // MCP Client Streamable HTTP Example - connects to a server via Streamable HTTP transport
255+ func clientStreamableHTTPExample () {
256+ ctx := context .Background ()
257+
258+ // Initialize Genkit with Google AI
259+ g , err := genkit .Init (ctx , genkit .WithPlugins (& googlegenai.GoogleAI {}))
260+ if err != nil {
261+ logger .FromContext (ctx ).Error ("Failed to initialize Genkit" , "error" , err )
262+ return
263+ }
264+
265+ logger .FromContext (ctx ).Info ("Creating MCP client with Streamable HTTP transport" , "server" , "everything" )
266+ // Create and connect to MCP server using Streamable HTTP transport
267+ // Note: Start the server with: npx @modelcontextprotocol/server-everything streamableHttp --port 3001
268+ // This will start the server on http://localhost:3001
269+ client , err := mcp .NewGenkitMCPClient (mcp.MCPClientOptions {
270+ Name : "mcp-everything-http" ,
271+ Version : "1.0.0" ,
272+ StreamableHTTP : & mcp.StreamableHTTPConfig {
273+ BaseURL : "http://localhost:3001" ,
274+ Headers : map [string ]string {
275+ "User-Agent" : "genkit-mcp-client/1.0.0" ,
276+ },
277+ Timeout : 30 * time .Second , // Optional timeout
278+ },
279+ })
280+ if err != nil {
281+ logger .FromContext (ctx ).Error ("Failed to create MCP client with Streamable HTTP" , "error" , err )
282+ return
283+ }
284+ logger .FromContext (ctx ).Info ("MCP client with Streamable HTTP created successfully" , "client" , "mcp-everything-http" )
285+
286+ // Get tools and generate response
287+ tools , _ := client .GetActiveTools (ctx , g )
288+ logger .FromContext (ctx ).Info ("Found MCP tools via Streamable HTTP" , "count" , len (tools ), "client" , "mcp-everything-http" )
289+
290+ var toolRefs []ai.ToolRef
291+ for _ , tool := range tools {
292+ toolRefs = append (toolRefs , tool )
293+ }
294+
295+ // Generate response using tools from the HTTP server
296+ response , err := genkit .Generate (ctx , g ,
297+ ai .WithModelName ("googleai/gemini-2.0-flash-exp" ),
298+ ai .WithPrompt ("Use the echo tool to repeat the message 'Hello from Streamable HTTP!' and then use the add tool to calculate 15 + 27." ),
299+ ai .WithTools (toolRefs ... ),
300+ ai .WithToolChoice (ai .ToolChoiceAuto ),
301+ )
302+ if err != nil {
303+ logger .FromContext (ctx ).Error ("Generation failed" , "error" , err )
304+ } else {
305+ logger .FromContext (ctx ).Info ("Generation completed" , "response" , response .Text ())
306+ }
307+
308+ // Disconnect from server
309+ logger .FromContext (ctx ).Info ("Disconnecting from MCP server" , "client" , "mcp-everything-http" )
310+ client .Disconnect ()
311+ logger .FromContext (ctx ).Info ("Disconnected from MCP server" , "client" , "mcp-everything-http" )
312+ }
313+
253314func main () {
254315 if len (os .Args ) < 2 {
255- fmt .Println ("Usage: go run main.go [manager|multi|client|getprompt]" )
256- fmt .Println (" manager - MCP Manager example with time server" )
257- fmt .Println (" multi - MCP Manager example with multiple servers (time and fetch)" )
258- fmt .Println (" client - MCP Client example with time server" )
259- fmt .Println (" getprompt - MCP Client GetPrompt example" )
316+ fmt .Println ("Usage: go run main.go [manager|multi|client|getprompt|streamablehttp|test]" )
317+ fmt .Println (" manager - MCP Manager example with time server" )
318+ fmt .Println (" multi - MCP Manager example with multiple servers (time and fetch)" )
319+ fmt .Println (" client - MCP Client example with time server" )
320+ fmt .Println (" getprompt - MCP Client GetPrompt example" )
321+ fmt .Println (" streamablehttp - MCP Client Streamable HTTP example" )
260322 os .Exit (1 )
261323 }
262324
@@ -275,9 +337,12 @@ func main() {
275337 case "getprompt" :
276338 logger .FromContext (ctx ).Info ("Running MCP Client GetPrompt example" )
277339 clientGetPromptExample ()
340+ case "streamablehttp" :
341+ logger .FromContext (ctx ).Info ("Running MCP Client Streamable HTTP example" )
342+ clientStreamableHTTPExample ()
278343 default :
279344 fmt .Printf ("Unknown example: %s\n " , os .Args [1 ])
280- fmt .Println ("Use 'manager', 'multi', 'client', or 'getprompt '" )
345+ fmt .Println ("Use 'manager', 'multi', 'client', 'getprompt', or 'streamablehttp '" )
281346 os .Exit (1 )
282347 }
283348}
0 commit comments