chore: import upstream snapshot with attribution
govulncheck / govulncheck (push) Has been cancelled
Lint / golangci-lint (push) Has been cancelled
Run Tests / Unit Tests (push) Has been cancelled
Run Tests / Etcd Integration Tests (push) Has been cancelled
Harness (E2E) / Harnesses (mock LLM) (push) Has been cancelled
Harness (E2E) / Provider harnesses (live LLM conformance) (push) Has been cancelled
govulncheck / govulncheck (push) Has been cancelled
Lint / golangci-lint (push) Has been cancelled
Run Tests / Unit Tests (push) Has been cancelled
Run Tests / Etcd Integration Tests (push) Has been cancelled
Harness (E2E) / Harnesses (mock LLM) (push) Has been cancelled
Harness (E2E) / Provider harnesses (live LLM conformance) (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,246 @@
|
||||
# MCP Examples
|
||||
|
||||
Examples demonstrating Model Context Protocol (MCP) integration with go-micro.
|
||||
|
||||
## Examples
|
||||
|
||||
### [hello](./hello/) - Minimal Example ⭐ Start Here
|
||||
|
||||
The simplest possible MCP-enabled service. Perfect for learning the basics.
|
||||
|
||||
**What it shows:**
|
||||
- Automatic documentation extraction from Go comments
|
||||
- MCP gateway setup with 3 lines
|
||||
- Ready for Claude Code
|
||||
|
||||
**Run it:**
|
||||
```bash
|
||||
cd hello
|
||||
go run main.go
|
||||
```
|
||||
|
||||
### [crud](./crud/) - CRUD Contact Book
|
||||
|
||||
A realistic service with create, read, update, delete, list, and search operations. Shows how to document a full API for agents with `@example` tags, `description` struct tags, validation errors, and partial updates.
|
||||
|
||||
**Run it:**
|
||||
```bash
|
||||
cd crud
|
||||
go run main.go
|
||||
```
|
||||
|
||||
### [workflow](./workflow/) - Cross-Service Orchestration
|
||||
|
||||
Three services (Inventory, Orders, Notifications) showing how an AI agent orchestrates multi-step workflows: search products, check stock, reserve inventory, place order, send confirmation — all from a single natural language request.
|
||||
|
||||
**Run it:**
|
||||
```bash
|
||||
cd workflow
|
||||
go run main.go
|
||||
```
|
||||
|
||||
### [platform](./platform/) - Agent Platform Showcase
|
||||
|
||||
A complete platform (Users, Posts, Comments, Mail) mirroring [micro/blog](https://github.com/micro/blog). Shows how existing microservices become agent-accessible with zero code changes — agents can sign up, write posts, comment, tag, and send mail through natural language.
|
||||
|
||||
**Run it:**
|
||||
```bash
|
||||
cd platform
|
||||
go run main.go
|
||||
```
|
||||
|
||||
### [documented](./documented/) - Full-Featured Example
|
||||
|
||||
Complete example showing all MCP features with a user service.
|
||||
|
||||
**What it shows:**
|
||||
- Multiple endpoints (GetUser, CreateUser)
|
||||
- Rich documentation with examples
|
||||
- Per-endpoint auth scopes via `server.WithEndpointScopes()`
|
||||
- Pre-populated test data
|
||||
- Production-ready patterns
|
||||
|
||||
**Run it:**
|
||||
```bash
|
||||
cd documented
|
||||
go run main.go
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Write Your Service
|
||||
|
||||
Add Go doc comments to your handler methods:
|
||||
|
||||
```go
|
||||
// SayHello greets a person by name. Returns a friendly greeting message.
|
||||
//
|
||||
// @example {"name": "Alice"}
|
||||
func (g *Greeter) SayHello(ctx context.Context, req *HelloRequest, rsp *HelloResponse) error {
|
||||
rsp.Message = "Hello " + req.Name + "!"
|
||||
return nil
|
||||
}
|
||||
|
||||
type HelloRequest struct {
|
||||
Name string `json:"name" description:"Person's name to greet"`
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Register Handler (Auto-Extracts Docs!)
|
||||
|
||||
```go
|
||||
handler := service.Server().NewHandler(new(Greeter))
|
||||
service.Server().Handle(handler)
|
||||
```
|
||||
|
||||
### 3. Start MCP Gateway
|
||||
|
||||
```go
|
||||
go mcp.ListenAndServe(":3000", mcp.Options{
|
||||
Registry: service.Options().Registry,
|
||||
})
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### HTTP API
|
||||
|
||||
```bash
|
||||
# List tools
|
||||
curl http://localhost:3000/mcp/tools | jq
|
||||
|
||||
# Call a tool
|
||||
curl -X POST http://localhost:3000/mcp/call \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"tool": "greeter.Greeter.SayHello",
|
||||
"input": {"name": "Alice"}
|
||||
}' | jq
|
||||
```
|
||||
|
||||
### Claude Code (Stdio)
|
||||
|
||||
Start MCP server:
|
||||
```bash
|
||||
micro mcp serve
|
||||
```
|
||||
|
||||
Add to `~/.claude/claude_desktop_config.json`:
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"my-services": {
|
||||
"command": "micro",
|
||||
"args": ["mcp", "serve"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Restart Claude Code and ask Claude to use your services!
|
||||
|
||||
## Features
|
||||
|
||||
### ✅ Automatic Documentation Extraction
|
||||
|
||||
Just write Go comments - documentation is extracted automatically:
|
||||
|
||||
- **Go doc comments** → Tool descriptions
|
||||
- **@example tags** → Example inputs for AI
|
||||
- **Struct tags** → Parameter descriptions
|
||||
|
||||
### ✅ Multiple Transports
|
||||
|
||||
- **Stdio** - For Claude Code (recommended)
|
||||
- **HTTP/SSE** - For web-based agents
|
||||
|
||||
### ✅ MCP Command Line
|
||||
|
||||
```bash
|
||||
# Start MCP server
|
||||
micro mcp serve # Stdio (for Claude Code)
|
||||
micro mcp serve --address :3000 # HTTP/SSE (for web agents)
|
||||
|
||||
# List available tools
|
||||
micro mcp list # Human-readable list
|
||||
micro mcp list --json # JSON output
|
||||
|
||||
# Test a tool
|
||||
micro mcp test <tool-name> '{"key": "value"}'
|
||||
|
||||
# Generate documentation
|
||||
micro mcp docs # Markdown format
|
||||
micro mcp docs --format json # JSON format
|
||||
micro mcp docs --output tools.md # Save to file
|
||||
|
||||
# Export to different formats
|
||||
micro mcp export langchain # Python LangChain tools
|
||||
micro mcp export openapi # OpenAPI 3.0 spec
|
||||
micro mcp export json # Raw JSON definitions
|
||||
```
|
||||
|
||||
For detailed examples, see [CLI Examples](../../cmd/micro/mcp/EXAMPLES.md).
|
||||
|
||||
### ✅ Zero Configuration
|
||||
|
||||
- No manual tool registration
|
||||
- No API wrappers
|
||||
- No code generation
|
||||
- Just write normal Go code!
|
||||
|
||||
### ✅ Per-Tool Auth Scopes
|
||||
|
||||
Declare required scopes when registering a handler:
|
||||
|
||||
```go
|
||||
handler := service.Server().NewHandler(
|
||||
new(BlogService),
|
||||
server.WithEndpointScopes("Blog.Create", "blog:write"),
|
||||
server.WithEndpointScopes("Blog.Delete", "blog:admin"),
|
||||
)
|
||||
```
|
||||
|
||||
Or define scopes at the gateway layer without changing services:
|
||||
|
||||
```go
|
||||
mcp.Serve(mcp.Options{
|
||||
Registry: reg,
|
||||
Auth: authProvider,
|
||||
Scopes: map[string][]string{
|
||||
"blog.Blog.Create": {"blog:write"},
|
||||
"blog.Blog.Delete": {"blog:admin"},
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
### ✅ Tracing, Rate Limiting & Audit Logging
|
||||
|
||||
Every tool call generates a trace ID that propagates through the RPC chain.
|
||||
Configure rate limiting and audit logging at the gateway:
|
||||
|
||||
```go
|
||||
mcp.Serve(mcp.Options{
|
||||
Registry: reg,
|
||||
Auth: authProvider,
|
||||
RateLimit: &mcp.RateLimitConfig{
|
||||
RequestsPerSecond: 10,
|
||||
Burst: 20,
|
||||
},
|
||||
AuditFunc: func(r mcp.AuditRecord) {
|
||||
log.Printf("[audit] trace=%s tool=%s account=%s allowed=%v",
|
||||
r.TraceID, r.Tool, r.AccountID, r.Allowed)
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
- [Full MCP Documentation](../../internal/website/docs/mcp.md)
|
||||
- [MCP Gateway Implementation](../../gateway/mcp/)
|
||||
- [Documentation Guide](../../gateway/mcp/DOCUMENTATION.md)
|
||||
- [Blog Post](../../internal/website/blog/2.md)
|
||||
|
||||
## Learn More
|
||||
|
||||
- [Model Context Protocol Spec](https://modelcontextprotocol.io/)
|
||||
- [Go Micro Documentation](https://go-micro.dev)
|
||||
Reference in New Issue
Block a user