micro--go-micro
beeaad748e
* feat: add LlamaIndex SDK for Go Micro services Add LlamaIndex integration package that enables LlamaIndex agents to discover and call Go Micro microservices through the MCP gateway. Follows the same pattern as the existing LangChain SDK. - GoMicroToolkit with from_gateway() factory and tool filtering - FunctionTool integration via llama_index.core.tools - Auth support, error handling, and retry configuration - Examples for basic agent and RAG + microservices workflows - Unit tests with mocked gateway responses https://claude.ai/code/session_01GkduEhcrqcG45rdfYh8dAc * docs: update status for OTel, WebSocket, and LlamaIndex SDK completion Reflect recently completed work in roadmap and status documents: - Q2 progress: 85% -> 95% (WebSocket, LlamaIndex SDK done) - Q3 progress: 40% -> 50% (OpenTelemetry integration done) - Transports: 2 -> 3 (added WebSocket) - Agent SDKs: 1 -> 2 (added LlamaIndex) - Test coverage: 568 -> 1,000+ lines https://claude.ai/code/session_01GkduEhcrqcG45rdfYh8dAc * feat: add WithMCP convenience option, improve startup banner, and blog post - Add mcp.WithMCP(":3000") service option for one-line MCP setup - Improve `micro run` startup banner to show Agent playground, MCP tools, and WebSocket endpoints prominently - Add blog post: "Building the AI-Native Future of Go Micro with Claude" covering WebSocket transport, OTel integration, LlamaIndex SDK, and Anthropic's Claude Max sponsorship - Update blog index and navigation links https://claude.ai/code/session_01GkduEhcrqcG45rdfYh8dAc --------- Co-authored-by: Claude <noreply@anthropic.com>
139 行
3.1 KiB
Go
139 行
3.1 KiB
Go
package mcp
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
|
|
"go-micro.dev/v5"
|
|
"go-micro.dev/v5/auth/jwt"
|
|
"go-micro.dev/v5/registry"
|
|
)
|
|
|
|
// Example_withMCP shows the simplest way to add MCP to a service using WithMCP
|
|
func Example_withMCP() {
|
|
// One line to make your service AI-accessible
|
|
service := micro.NewService(
|
|
micro.Name("myservice"),
|
|
WithMCP(":3000"),
|
|
)
|
|
service.Init()
|
|
service.Run()
|
|
}
|
|
|
|
// Example_inlineGateway shows how to add MCP gateway to an existing service
|
|
// with full control over options
|
|
func Example_inlineGateway() {
|
|
service := micro.NewService(micro.Name("myservice"))
|
|
service.Init()
|
|
|
|
// Add MCP gateway alongside your service
|
|
go func() {
|
|
if err := Serve(Options{
|
|
Registry: service.Options().Registry,
|
|
Address: ":3000",
|
|
}); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}()
|
|
|
|
// Run your service normally
|
|
service.Run()
|
|
}
|
|
|
|
// Example_standaloneGateway shows how to run MCP gateway as a separate service
|
|
func Example_standaloneGateway() {
|
|
// Standalone MCP gateway
|
|
// Discovers all services via registry
|
|
if err := ListenAndServe(":3000", Options{
|
|
Registry: registry.NewMDNSRegistry(),
|
|
}); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
// Example_withAuthentication shows how to add authentication
|
|
func Example_withAuthentication() {
|
|
service := micro.NewService(micro.Name("myservice"))
|
|
service.Init()
|
|
|
|
go func() {
|
|
if err := Serve(Options{
|
|
Registry: service.Options().Registry,
|
|
Address: ":3000",
|
|
AuthFunc: func(r *http.Request) error {
|
|
token := r.Header.Get("Authorization")
|
|
if token == "" {
|
|
return fmt.Errorf("missing authorization header")
|
|
}
|
|
// Validate token here
|
|
return nil
|
|
},
|
|
}); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}()
|
|
|
|
service.Run()
|
|
}
|
|
|
|
// Example_customContext shows how to use a custom context for graceful shutdown
|
|
func Example_customContext() {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
service := micro.NewService(micro.Name("myservice"))
|
|
service.Init()
|
|
|
|
go func() {
|
|
if err := Serve(Options{
|
|
Registry: service.Options().Registry,
|
|
Address: ":3000",
|
|
Context: ctx,
|
|
}); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}()
|
|
|
|
service.Run()
|
|
// cancel() will stop the MCP gateway
|
|
}
|
|
|
|
// Example_withScopesAndTracing shows how to add per-tool scopes, tracing, rate
|
|
// limiting and audit logging to the MCP gateway. Services register scope
|
|
// requirements via endpoint metadata ("scopes" key, comma-separated).
|
|
func Example_withScopesAndTracing() {
|
|
service := micro.NewService(micro.Name("blog"))
|
|
service.Init()
|
|
|
|
// Use JWT auth provider
|
|
authProvider := jwt.NewAuth()
|
|
|
|
go func() {
|
|
if err := Serve(Options{
|
|
Registry: service.Options().Registry,
|
|
Address: ":3000",
|
|
|
|
// Auth inspects Bearer tokens and enforces per-tool scopes
|
|
Auth: authProvider,
|
|
|
|
// Rate limit all tools to 10 req/s with burst of 20
|
|
RateLimit: &RateLimitConfig{
|
|
RequestsPerSecond: 10,
|
|
Burst: 20,
|
|
},
|
|
|
|
// Audit every tool call for compliance
|
|
AuditFunc: func(r AuditRecord) {
|
|
log.Printf("[audit] trace=%s tool=%s account=%s allowed=%v reason=%s",
|
|
r.TraceID, r.Tool, r.AccountID, r.Allowed, r.DeniedReason)
|
|
},
|
|
}); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}()
|
|
|
|
service.Run()
|
|
}
|