@@ -30,17 +30,17 @@ import (
30
30
"github.com/firebase/genkit/go/plugins/mcp"
31
31
)
32
32
33
- // MCP-ception Example : Genkit serves itself through MCP!
33
+ // MCP self-hosting example : Genkit serves itself through MCP
34
34
// 1. Start a Go MCP server that exposes Genkit resources
35
35
// 2. Connect to that server as an MCP client
36
36
// 3. Use the resources from the server for AI generation
37
37
38
- // Step 1: Create the MCP Server (runs in background)
38
+ // Create the MCP Server (runs in background)
39
39
func createMCPServer () {
40
40
ctx , cancel := signal .NotifyContext (context .Background (), os .Interrupt , syscall .SIGTERM )
41
41
defer cancel ()
42
42
43
- logger .FromContext (ctx ).Info ("🚀 Starting Genkit MCP Server... " )
43
+ logger .FromContext (ctx ).Info ("Starting Genkit MCP Server" )
44
44
45
45
// Initialize Genkit for the server
46
46
g , err := genkit .Init (ctx )
@@ -56,7 +56,7 @@ func createMCPServer() {
56
56
}) (map [string ]interface {}, error ) {
57
57
logger .FromContext (ctx .Context ).Debug ("Executing genkit-brainstorm tool" , "topic" , input .Topic )
58
58
59
- ideas := fmt .Sprintf (`💡 Creative Ideas for "%s":
59
+ ideas := fmt .Sprintf (`Creative Ideas for "%s":
60
60
61
61
1. Interactive Experience: Create an immersive, hands-on workshop
62
62
2. Digital Innovation: Develop a mobile app or web platform
@@ -69,7 +69,7 @@ func createMCPServer() {
69
69
9. Creative Challenge: Host competitions or hackathons
70
70
10. Multi-media Approach: Combine video, audio, and interactive elements
71
71
72
- 🎯 These ideas can be mixed, matched, and customized for "%s"! ` , input .Topic , input .Topic )
72
+ These ideas can be mixed, matched, and customized for "%s". ` , input .Topic , input .Topic )
73
73
74
74
return map [string ]interface {}{
75
75
"topic" : input .Topic ,
@@ -124,10 +124,10 @@ Genkit follows a plugin-based architecture where models, retrievers, evaluators,
124
124
Version : "1.0.0" ,
125
125
})
126
126
127
- logger .FromContext (ctx ).Info ("✅ Genkit MCP Server configured successfully" )
128
- logger .FromContext (ctx ).Info ("📡 Starting MCP server on stdio... " )
129
- logger .FromContext (ctx ).Info ("🔧 Tools: " , "count" , len (server .ListRegisteredTools ()))
130
- logger .FromContext (ctx ).Info ("📚 Resources: " , "count" , len (server .ListRegisteredResources ()))
127
+ logger .FromContext (ctx ).Info ("Genkit MCP Server configured successfully" )
128
+ logger .FromContext (ctx ).Info ("Starting MCP server on stdio" )
129
+ logger .FromContext (ctx ).Info ("Registered tools " , "count" , len (server .ListRegisteredTools ()))
130
+ logger .FromContext (ctx ).Info ("Registered resources " , "count" , len (server .ListRegisteredResources ()))
131
131
132
132
// Start the server
133
133
if err := server .ServeStdio (); err != nil && err != context .Canceled {
@@ -136,12 +136,12 @@ Genkit follows a plugin-based architecture where models, retrievers, evaluators,
136
136
}
137
137
}
138
138
139
- // Step 2: Create the MCP Client that connects to our server
140
- func mcpCeptionDemo () {
139
+ // Create the MCP Client that connects to our server
140
+ func mcpSelfConnection () {
141
141
ctx := context .Background ()
142
142
143
- logger .FromContext (ctx ).Info ("🎭 === MCP-CEPTION DEMO === " )
144
- logger .FromContext (ctx ).Info ("🎯 Genkit will connect to itself via MCP! " )
143
+ logger .FromContext (ctx ).Info ("MCP self-connection demo " )
144
+ logger .FromContext (ctx ).Info ("Genkit will connect to itself via MCP" )
145
145
146
146
// Initialize Genkit with Google AI for the client
147
147
g , err := genkit .Init (ctx ,
@@ -152,8 +152,8 @@ func mcpCeptionDemo() {
152
152
log .Fatalf ("Failed to initialize Genkit client: %v" , err )
153
153
}
154
154
155
- logger .FromContext (ctx ).Info ("🔌 Connecting to our own MCP server... " )
156
- logger .FromContext (ctx ).Info ("💡 Make sure to run 'go run mcp_ception.go server' in another terminal first! " )
155
+ logger .FromContext (ctx ).Info ("Connecting to our own MCP server" )
156
+ logger .FromContext (ctx ).Info ("Note: Server process will be spawned automatically " )
157
157
158
158
// Create MCP Host that connects to our Genkit server
159
159
host , err := mcp .NewMCPHost (g , mcp.MCPHostOptions {
@@ -178,49 +178,49 @@ func mcpCeptionDemo() {
178
178
}
179
179
180
180
// Get resources from our Genkit server
181
- logger .FromContext (ctx ).Info ("📚 Getting resources from Genkit MCP server... " )
181
+ logger .FromContext (ctx ).Info ("Getting resources from Genkit MCP server" )
182
182
resources , err := host .GetActiveResources (ctx )
183
183
if err != nil {
184
184
logger .FromContext (ctx ).Error ("Failed to get resources" , "error" , err )
185
185
return
186
186
}
187
187
188
- logger .FromContext (ctx ).Info ("✅ Retrieved resources from ourselves! " , "count" , len (resources ))
188
+ logger .FromContext (ctx ).Info ("Retrieved resources from server " , "count" , len (resources ))
189
189
190
- // DEBUG: Let's examine what resources we actually got
190
+ // Debug: examine retrieved resources
191
191
for i , resource := range resources {
192
- logger .FromContext (ctx ).Info ("🔍 DEBUG Resource details" , "index" , i , "name" , resource .Name ())
192
+ logger .FromContext (ctx ).Info ("Resource details" , "index" , i , "name" , resource .Name ())
193
193
// Test if the resource matches our target URI
194
194
matches := resource .Matches ("knowledge://genkit-docs" )
195
- logger .FromContext (ctx ).Info ("🔍 Resource URI matching" , "matches_target_uri" , matches )
195
+ logger .FromContext (ctx ).Info ("Resource URI matching" , "matches_target_uri" , matches )
196
196
}
197
197
198
198
// Get tools from our Genkit server
199
- logger .FromContext (ctx ).Info ("🔧 Getting tools from Genkit MCP server... " )
199
+ logger .FromContext (ctx ).Info ("Getting tools from Genkit MCP server" )
200
200
tools , err := host .GetActiveTools (ctx , g )
201
201
if err != nil {
202
202
logger .FromContext (ctx ).Error ("Failed to get tools" , "error" , err )
203
203
return
204
204
}
205
205
206
- logger .FromContext (ctx ).Info ("✅ Retrieved tools from ourselves! " , "count" , len (tools ))
206
+ logger .FromContext (ctx ).Info ("Retrieved tools from server " , "count" , len (tools ))
207
207
208
208
// Convert tools to refs
209
209
var toolRefs []ai.ToolRef
210
210
for _ , tool := range tools {
211
211
toolRefs = append (toolRefs , tool )
212
212
}
213
213
214
- // Step 3: Use resources and tools from our own server for AI generation
215
- logger .FromContext (ctx ).Info ("🤖 Asking AI about Genkit using our own MCP resources... " )
214
+ // Use resources and tools from our own server for AI generation
215
+ logger .FromContext (ctx ).Info ("Asking AI about Genkit using our own MCP resources" )
216
216
217
- // THE CORRECT WAY: Use ai.NewResourcePart to explicitly reference the resource
218
- logger .FromContext (ctx ).Info ("🔍 DEBUG Generation call" , "resource_count" , len (resources ), "tool_count" , len (toolRefs ))
217
+ // Use ai.NewResourcePart to explicitly reference the resource
218
+ logger .FromContext (ctx ).Info ("Starting generation call" , "resource_count" , len (resources ), "tool_count" , len (toolRefs ))
219
219
220
220
response , err := genkit .Generate (ctx , g ,
221
221
ai .WithMessages (ai .NewUserMessage (
222
222
ai .NewTextPart ("Based on this Genkit knowledge:" ),
223
- ai .NewResourcePart ("knowledge://genkit-docs" ), // ← FIXED: Explicit resource reference!
223
+ ai .NewResourcePart ("knowledge://genkit-docs" ), // Explicit resource reference
224
224
ai .NewTextPart ("What are the key features of Genkit and what models does it support?\n \n Also, use the brainstorm tool to generate ideas for \" AI-powered cooking assistant\" " ),
225
225
)),
226
226
ai .WithResources (resources ), // Makes resources available for lookup
@@ -232,27 +232,27 @@ func mcpCeptionDemo() {
232
232
return
233
233
}
234
234
235
- logger .FromContext (ctx ).Info ("🎉 MCP-CEPTION SUCCESS! " )
236
- logger .FromContext (ctx ).Info ("✨ Genkit used itself via MCP to answer questions! " )
237
- fmt .Printf ("\n 🤖 AI Response using our own MCP resources:\n %s\n \n " , response .Text ())
235
+ logger .FromContext (ctx ).Info ("MCP self-connection completed successfully " )
236
+ logger .FromContext (ctx ).Info ("Genkit used itself via MCP to answer questions" )
237
+ fmt .Printf ("\n AI Response using our own MCP resources:\n %s\n \n " , response .Text ())
238
238
239
239
// Clean disconnect (skip for now to avoid hanging)
240
- logger .FromContext (ctx ).Info ("✅ MCP-ception complete! 🎭 " )
240
+ logger .FromContext (ctx ).Info ("MCP self-connection complete" )
241
241
}
242
242
243
243
func main () {
244
244
if len (os .Args ) < 2 {
245
245
fmt .Println ("Usage: go run mcp_ception.go [server|demo]" )
246
246
fmt .Println (" server - Run as MCP server (exposes Genkit resources)" )
247
- fmt .Println (" demo - Run MCP-ception demo (connects to server)" )
247
+ fmt .Println (" demo - Run MCP self-connection demo (connects to server)" )
248
248
os .Exit (1 )
249
249
}
250
250
251
251
switch os .Args [1 ] {
252
252
case "server" :
253
253
createMCPServer ()
254
254
case "demo" :
255
- mcpCeptionDemo ()
255
+ mcpSelfConnection ()
256
256
default :
257
257
fmt .Printf ("Unknown command: %s\n " , os .Args [1 ])
258
258
fmt .Println ("Use 'server' or 'demo'" )
0 commit comments