Files
go-micro/examples/mcp/documented
Asim AslamandClaude d2036b880d Claude/update docs roadmap f zd2 j (#2873)
* docs: update all four documentation guides and mark Q2 complete

- ai-native-services: add WithMCP one-liner, standalone gateway,
  WebSocket client example, and OpenTelemetry observability section
- mcp-security: add OTel distributed tracing, WebSocket authentication
  (connection-level and per-message), DeniedReason audit field
- tool-descriptions: add manual overrides with WithEndpointDocs and
  export formats section
- agent-patterns: add LangChain/LlamaIndex SDK pattern and standalone
  gateway production pattern with Docker example
- Update roadmap: mark Q2 documentation as complete, Q2 at 100%
- Update status: reflect all recent completions, shift priorities

https://claude.ai/code/session_01GkduEhcrqcG45rdfYh8dAc

* feat: add agent demo example and blog post

Add examples/agent-demo with a multi-service project management app
(projects, tasks, team) that demonstrates AI agents interacting with
Go Micro services through MCP. Includes seed data and example prompts.

Add blog post 4 "Agents Meet Microservices: A Hands-On Demo" walking
through the example code and showing cross-service agent workflows.

https://claude.ai/code/session_01GkduEhcrqcG45rdfYh8dAc

* feat: enable multiple services in a single binary

Remove global state mutations from service and cmd option functions so
that configuring one service no longer overwrites another's settings.

Key changes:
- service/options.go: remove all DefaultXxx global writes from option
  functions; newOptions() now creates fresh Server, Client, Store, and
  Cache per service while sharing Registry, Broker, and Transport
- cmd/cmd.go: newCmd() uses local copies instead of pointers to package
  globals; Before() no longer mutates DefaultXxx vars
- cmd/options.go: remove global mutations from all option functions
- service/service.go: export ServiceImpl type for cross-package use
- service/group.go: new Group type for multi-service lifecycle
- micro.go: add Start/Stop to Service interface, expose Group and
  NewGroup convenience function
- examples/multi-service: working example with two services

https://claude.ai/code/session_01GkduEhcrqcG45rdfYh8dAc

* docs: highlight multi-service binary support

Add multi-service section to README with code example, update features
list, add to examples index, and note in status summary.

https://claude.ai/code/session_01GkduEhcrqcG45rdfYh8dAc

* feat: unify service API and clean up developer experience

- Unified service creation: micro.New("name", opts...) as canonical API
- Clean handler registration: service.Handle(handler, opts...) accepts
  server.HandlerOption args directly, no need to reach through Server()
- Unexported serviceImpl: users interact through Service interface only
- Service groups use Service interface (not concrete type)
- Fixed Stop() to properly propagate BeforeStop/AfterStop errors
- Fixed store init: error-level log instead of fatal on init failure
- Updated all examples to use consistent patterns
- Updated README, getting-started, MCP docs, and guides
- Added blog post about the DX cleanup

https://claude.ai/code/session_01GkduEhcrqcG45rdfYh8dAc

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-03-04 11:13:27 +00:00
..
2026-02-11 14:12:21 +00:00

Documented Service Example

This example demonstrates how to document your go-micro service handlers so that AI agents can understand them better. The MCP gateway parses Go comments and struct tags to generate rich tool descriptions.

Documentation Features

1. Go Doc Comments

Standard Go documentation comments are used as the tool description:

// GetUser retrieves a user by ID from the database.
//
// This endpoint fetches a user's complete profile including their name,
// email, and age. If the user doesn't exist, an error is returned.
func (u *Users) GetUser(ctx context.Context, req *GetUserRequest, rsp *GetUserResponse) error {
    // ...
}

2. JSDoc-Style Tags

Use @param, @return, and @example tags for detailed documentation:

// CreateUser creates a new user in the system.
//
// @param name {string} User's full name (required, 1-100 characters)
// @param email {string} User's email address (required, must be valid email format)
// @param age {number} User's age (optional, must be 0-150 if provided)
// @return {User} The newly created user with generated ID
// @example
//   {
//     "name": "Alice Smith",
//     "email": "alice@example.com",
//     "age": 30
//   }
func (u *Users) CreateUser(ctx context.Context, req *CreateUserRequest, rsp *CreateUserResponse) error {
    // ...
}

3. Struct Tags

Add description tags to struct fields for better schema:

type User struct {
    ID    string `json:"id" description:"User's unique identifier (UUID format)"`
    Name  string `json:"name" description:"User's full name"`
    Email string `json:"email" description:"User's email address"`
    Age   int    `json:"age,omitempty" description:"User's age (optional)"`
}

Running the Example

1. Start the Service

cd examples/mcp/documented
go run main.go

Output:

Users service starting...
Service: users
Endpoints:
  - Users.GetUser
  - Users.CreateUser
MCP Gateway: http://localhost:3000

2. Test MCP Tools

List available tools:

curl http://localhost:3000/mcp/tools | jq

You'll see rich descriptions:

{
  "tools": [
    {
      "name": "users.Users.GetUser",
      "description": "GetUser retrieves a user by ID from the database",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "User ID in UUID format (e.g., \"123e4567-e89b-12d3-a456-426614174000\")"
          }
        },
        "required": ["id"],
        "examples": [
          "{\"id\": \"123e4567-e89b-12d3-a456-426614174000\"}"
        ]
      }
    },
    {
      "name": "users.Users.CreateUser",
      "description": "CreateUser creates a new user in the system",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "User's full name (required, 1-100 characters)"
          },
          "email": {
            "type": "string",
            "description": "User's email address (required, must be valid email format)"
          },
          "age": {
            "type": "number",
            "description": "User's age (optional, must be 0-150 if provided)"
          }
        },
        "required": ["name", "email"],
        "examples": [
          "{\"name\": \"Alice Smith\", \"email\": \"alice@example.com\", \"age\": 30}"
        ]
      }
    }
  ]
}

3. Call a Tool

Get existing user:

curl -X POST http://localhost:3000/mcp/call \
  -H "Content-Type: application/json" \
  -d '{
    "tool": "users.Users.GetUser",
    "input": {"id": "user-1"}
  }'

Create new user:

curl -X POST http://localhost:3000/mcp/call \
  -H "Content-Type: application/json" \
  -d '{
    "tool": "users.Users.CreateUser",
    "input": {
      "name": "Alice Smith",
      "email": "alice@example.com",
      "age": 30
    }
  }'

4. Use with Claude Code

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "users-service": {
      "command": "go",
      "args": ["run", "/path/to/examples/mcp/documented/main.go"]
    }
  }
}

Then in Claude Code, ask:

> You: "Show me user-1's profile"

Claude will:
1. See the GetUser tool with rich description
2. Understand it needs an "id" parameter (UUID format)
3. Call users.Users.GetUser with {"id": "user-1"}
4. Return the user profile

Documentation Best Practices

DO: Write Clear Descriptions

// ✅ Good: Clear, explains what and why
// GetUser retrieves a user by ID from the database.
// Returns full profile including email, name, and preferences.
// ❌ Bad: Vague, no context
// Get gets a user

DO: Specify Parameter Constraints

// ✅ Good: Specifies format and constraints
// @param id {string} User ID in UUID format (e.g., "123e4567-e89b-12d3-a456-426614174000")
// @param age {number} User's age (must be 0-150)
// ❌ Bad: No constraints or format
// @param id {string} The ID

DO: Provide Examples

// ✅ Good: Real example agents can use
// @example
//   {
//     "name": "Alice Smith",
//     "email": "alice@example.com",
//     "age": 30
//   }
// ❌ Bad: No example
// (agents have to guess the format)

DO: Use Descriptive Struct Tags

// ✅ Good: Explains what the field is
type User struct {
    ID string `json:"id" description:"User's unique identifier (UUID format)"`
}
// ❌ Bad: No description
type User struct {
    ID string `json:"id"`
}

How It Works

  1. Go Doc Parsing

    • The MCP gateway reads your service's Go comments
    • First line becomes the tool description
    • Full comment becomes the detailed description
  2. JSDoc Tag Parsing

    • @param tags enhance parameter descriptions
    • @return tags describe what the tool returns
    • @example tags provide usage examples
  3. Struct Tag Reading

    • description tags add context to fields
    • json:"field,omitempty" marks optional fields
    • Used to generate JSON Schema for parameters
  4. Schema Generation

    • Combines parsed documentation with type information
    • Creates rich JSON Schema for each tool
    • Agents use this to understand how to call your service

Impact on Agent Performance

Without Documentation

Tool: users.Users.GetUser
Description: Call GetUser on users service
Parameters: { "id": "string" }

Agent thinks: "What's an ID? What format? What if I pass the wrong thing?"

With Documentation

Tool: users.Users.GetUser
Description: Retrieves a user by ID from the database. Returns full profile
             including email, name, and preferences.
Parameters:
  - id (string, required): User ID in UUID format
    Example: "123e4567-e89b-12d3-a456-426614174000"
Example:
  {"id": "user-1"}

Agent thinks: "I need a UUID format ID. I can use 'user-1' from the example!"

Result: Agent calls your service correctly on the first try!

Next Steps

  • Document all your service handlers with clear descriptions
  • Add @param, @return, and @example tags
  • Use description tags in struct fields
  • Test with Claude Code to see how agents understand your services

License

Apache 2.0