Skip to content

Commit f7257e1

Browse files
authored
docs(go/plugins/mcp): update mcp samples in README (#3629)
1 parent 7e17bc5 commit f7257e1

File tree

1 file changed

+104
-88
lines changed

1 file changed

+104
-88
lines changed

go/plugins/mcp/README.md

Lines changed: 104 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
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:
1012
package main
1113

1214
import (
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

2022
func 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
6959
import (
7060
"context"
7161
"log"
72-
62+
7363
"github.com/firebase/genkit/go/genkit"
7464
"github.com/firebase/genkit/go/plugins/mcp"
7565
)
7666

7767
func 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:
137127
package main
138128

139129
import (
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

148137
func 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
198213
Stdio: &mcp.StdioConfig{
199214
Command: "uvx",
@@ -203,6 +218,7 @@ Stdio: &mcp.StdioConfig{
203218
```
204219

205220
### SSE (Web clients)
221+
206222
```go
207223
SSE: &mcp.SSEConfig{
208224
BaseURL: "http://localhost:3000/sse",

0 commit comments

Comments
 (0)