11# Genkit MCP Plugin
22
3- Model Context Protocol (MCP) integration for Go Genkit - connect to MCP servers and expose Genkit tools as MCP servers.
3+ Model Context Protocol (MCP) integration for Go Genkit
4+
5+ Connect to MCP servers and expose Genkit tools as MCP servers.
46
57## GenkitMCPClient - Single Server Connection
68
@@ -10,52 +12,40 @@ Connect to and use tools/prompts from a single MCP server:
1012package main
1113
1214import (
13- " context"
14- " log"
15-
16- " github.com/firebase/genkit/go/genkit"
17- " github.com/firebase/genkit/go/plugins/mcp"
15+ " context"
16+ " log"
17+
18+ " github.com/firebase/genkit/go/genkit"
19+ " github.com/firebase/genkit/go/plugins/mcp"
1820)
1921
2022func main () {
21- ctx := context.Background ()
22- g , _ := genkit.Init (ctx)
23-
24- // Connect to the MCP everything server
25- client , err := mcp.NewGenkitMCPClient (mcp.MCPClientOptions {
26- Name: " everything-server" ,
27- Stdio: &mcp.StdioConfig {
28- Command: " npx" ,
29- Args: []string {" -y" , " @modelcontextprotocol/server-everything" },
30- },
31- })
32- if err != nil {
33- log.Fatal (err)
34- }
35-
36- // Get specific tools from the everything server
37- echoTool , err := client.GetTool (ctx, g, " echo" )
38- if err != nil {
39- log.Fatal (err)
40- }
41-
42- addTool , err := client.GetTool (ctx, g, " add" )
43- if err != nil {
44- log.Fatal (err)
45- }
46-
47- // Get specific prompts from the everything server
48- simplePrompt , err := client.GetPrompt (ctx, g, " simple_prompt" )
49- if err != nil {
50- log.Fatal (err)
51- }
52-
53- // Get all available tools
54- tools , err := client.GetActiveTools (ctx, g)
55- if err != nil {
56- log.Fatal (err)
57- }
58-
23+ ctx := context.Background ()
24+ g := genkit.Init (ctx)
25+
26+ // Connect to the MCP everything server
27+ client , err := mcp.NewGenkitMCPClient (mcp.MCPClientOptions {
28+ Name: " everything-server" ,
29+ Stdio: &mcp.StdioConfig {
30+ Command: " npx" ,
31+ Args: []string {" -y" , " @modelcontextprotocol/server-everything" },
32+ },
33+ })
34+ if err != nil {
35+ log.Fatal (err)
36+ }
37+
38+ // Get specific prompts from the everything server
39+ simplePrompt , err := client.GetPrompt (ctx, g, " simple-prompt" , nil )
40+ if err != nil {
41+ log.Fatal (err)
42+ }
43+
44+ // Get all available tools
45+ tools , err := client.GetActiveTools (ctx, g)
46+ if err != nil {
47+ log.Fatal (err)
48+ }
5949}
6050```
6151
@@ -69,15 +59,15 @@ package main
6959import (
7060 " context"
7161 " log"
72-
62+
7363 " github.com/firebase/genkit/go/genkit"
7464 " github.com/firebase/genkit/go/plugins/mcp"
7565)
7666
7767func main () {
7868 ctx := context.Background ()
7969 g , _ := genkit.Init (ctx)
80-
70+
8171 // Create manager with multiple servers
8272 manager , err := mcp.NewMCPManager (mcp.MCPManagerOptions {
8373 Name: " my-app" ,
@@ -101,7 +91,7 @@ func main() {
10191 if err != nil {
10292 log.Fatal (err)
10393 }
104-
94+
10595 // Connect to new server at runtime
10696 err = manager.ConnectServer (ctx, " weather" , mcp.MCPClientOptions {
10797 Name: " weather-server" ,
@@ -113,14 +103,14 @@ func main() {
113103 if err != nil {
114104 log.Fatal (err)
115105 }
116-
106+
117107 // Temporarily disable/enable servers
118108 manager.DisableServer (" filesystem" )
119109 manager.EnableServer (" filesystem" )
120-
110+
121111 // Disconnect server
122112 manager.DisconnectServer (" weather" )
123-
113+
124114 // Get tools from all active servers
125115 tools , err := manager.GetActiveTools (ctx, g)
126116 if err != nil {
@@ -137,48 +127,72 @@ Turn your Genkit app into an MCP server:
137127package main
138128
139129import (
140- " context"
141- " log"
142-
143- " github.com/firebase/genkit/go/genkit"
144- " github.com/firebase/genkit/go/plugins/mcp"
145- " github.com/firebase/genkit/go/ai"
130+ " context"
131+ " log"
132+
133+ " github.com/firebase/genkit/go/genkit"
134+ " github.com/firebase/genkit/go/plugins/mcp"
146135)
147136
148137func main () {
149- ctx := context.Background ()
150- g , _ := genkit.Init (ctx)
151-
152- // Define some tools
153- addTool := genkit.DefineTool (g, " add" , " Add two numbers" ,
154- func (ctx *ai.ToolContext , input struct {A, B int }) (int , error ) {
155- return input.A + input.B , nil
156- })
157-
158- multiplyTool := genkit.DefineTool (g, " multiply" , " Multiply two numbers" ,
159- func (ctx *ai.ToolContext , input struct {X, Y int }) (int , error ) {
160- return input.X * input.Y , nil
161- })
162-
163- // Option 1: Auto-expose all tools
164- server := mcp.NewMCPServer (g, mcp.MCPServerOptions {
165- Name: " genkit-calculator" ,
166- Version: " 1.0.0" ,
167- })
168-
169- // Option 2: Expose specific tools only
170- server = mcp.NewMCPServer (g, mcp.MCPServerOptions {
171- Name: " genkit-calculator" ,
172- Version: " 1.0.0" ,
173- Tools: []ai.Tool {addTool, multiplyTool},
174- })
175-
176- // Start MCP server
177- log.Println (" Starting MCP server..." )
178- if err := server.ServeStdio (ctx); err != nil {
179- log.Fatal (err)
180- }
138+ ctx := context.Background ()
139+ g := genkit.Init (ctx)
140+
141+ // Create a host with multiple servers
142+ host , err := mcp.NewMCPHost (g, mcp.MCPHostOptions {
143+ Name: " my-app" ,
144+ MCPServers: []mcp.MCPServerConfig {
145+ {
146+ Name: " everything-server" ,
147+ Config: mcp.MCPClientOptions {
148+ Name: " everything-server" ,
149+ Stdio: &mcp.StdioConfig {
150+ Command: " npx" ,
151+ Args: []string {" -y" , " @modelcontextprotocol/server-everything" },
152+ },
153+ },
154+ },
155+ {
156+ Name: " fs-server" ,
157+ Config: mcp.MCPClientOptions {
158+ Name: " fs-server" ,
159+ Stdio: &mcp.StdioConfig {
160+ Command: " npx" ,
161+ Args: []string {" @modelcontextprotocol/server-filesystem" , " /tmp" },
162+ },
163+ },
164+ },
165+ },
166+ })
167+ if err != nil {
168+ log.Fatal (err)
169+ }
170+
171+ // Connect to new server at runtime
172+ err = host.Connect (ctx, g, " weather" , mcp.MCPClientOptions {
173+ Name: " weather-server" ,
174+ Stdio: &mcp.StdioConfig {
175+ Command: " python" ,
176+ Args: []string {" weather_server.py" },
177+ },
178+ })
179+ if err != nil {
180+ log.Fatal (err)
181+ }
182+
183+ // Reconnect server
184+ host.Reconnect (ctx, " fs-server" )
185+
186+ // Disconnect server
187+ host.Disconnect (ctx, " weather" )
188+
189+ // Get tools from all active servers
190+ tools , err := host.GetActiveTools (ctx, g)
191+ if err != nil {
192+ log.Fatal (err)
193+ }
181194}
195+
182196```
183197
184198## Testing Your Server
@@ -194,6 +208,7 @@ npx @modelcontextprotocol/inspector go run main.go
194208## Transport Options
195209
196210### Stdio (Standard)
211+
197212``` go
198213Stdio: &mcp.StdioConfig {
199214 Command : " uvx" ,
@@ -203,6 +218,7 @@ Stdio: &mcp.StdioConfig{
203218```
204219
205220### SSE (Web clients)
221+
206222``` go
207223SSE: &mcp.SSEConfig {
208224 BaseURL : " http://localhost:3000/sse" ,
0 commit comments