From f70d537079f8fdaa4a96a9b3a119df2d4c023fa8 Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Thu, 6 Nov 2025 20:13:22 -0500 Subject: [PATCH] feat: add list-system-members MCP tool Implements a new MCP tool that lists all system members as clean Markdown output. The tool: - Retrieves member data via the existing SwitchTracker Members RPC call - Formats output as a simple Markdown list with member names only - Follows existing MCP tool patterns in the codebase - Integrates seamlessly with the existing /mcp endpoint - Returns clean output focused on what AI models need Example output: # System Members Below is a list of all members in the system: - Cadey - Nicole - Jessie - Ashe - Sephie - Mai - W'zamqo Assisted-by: GLM 4.6 via Claude Code Signed-off-by: Xe Iaso --- cmd/mi/services/mcp/mcp.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/cmd/mi/services/mcp/mcp.go b/cmd/mi/services/mcp/mcp.go index 7e4c01e8..b142a136 100644 --- a/cmd/mi/services/mcp/mcp.go +++ b/cmd/mi/services/mcp/mcp.go @@ -2,7 +2,9 @@ package mcp import ( "context" + "fmt" "net/http" + "strings" "github.com/modelcontextprotocol/go-sdk/mcp" "google.golang.org/protobuf/types/known/emptypb" @@ -62,6 +64,34 @@ func (s *Server) whoIsFront(ctx context.Context, req *mcp.CallToolRequest, wif w return nil, result, nil } +type listSystemMembersReq struct{} + +func (s *Server) listSystemMembers(ctx context.Context, req *mcp.CallToolRequest, lsm listSystemMembersReq) (*mcp.CallToolResult, *string, error) { + resp, err := s.st.Members(ctx, &emptypb.Empty{}) + if err != nil { + return nil, nil, err + } + + if len(resp.Members) == 0 { + emptyResult := "# System Members\n\nNo members found in the system." + return nil, &emptyResult, nil + } + + // Generate Markdown output + var sb strings.Builder + + sb.WriteString("# System Members\n\n") + sb.WriteString("Below is a list of all members in the system:\n\n") + + for _, member := range resp.Members { + sb.WriteString(fmt.Sprintf("- %s", member.GetName())) + sb.WriteString("\n") + } + + result := sb.String() + return nil, &result, nil +} + func New(st miv1.SwitchTracker) http.Handler { s := &Server{ st: st, @@ -83,6 +113,11 @@ func New(st miv1.SwitchTracker) http.Handler { Description: "Find out who's front this time!", }, s.whoIsFront) + mcp.AddTool(srv, &mcp.Tool{ + Name: "list-system-members", + Description: "List all system members as Markdown", + }, s.listSystemMembers) + handler := mcp.NewStreamableHTTPHandler(func(req *http.Request) *mcp.Server { return srv }, nil) return handler