diff --git a/pkg/provider/api.go b/pkg/provider/api.go index 35dcb5f..f5df03f 100644 --- a/pkg/provider/api.go +++ b/pkg/provider/api.go @@ -1199,10 +1199,26 @@ func (ap *ApiProvider) IsOAuth() bool { return ok && client != nil && client.IsOAuth() } +// slackUserIDPattern matches Slack user IDs (e.g., U07VCEPP4N5, W0123456789). +var slackUserIDPattern = regexp.MustCompile(`^[UW][A-Z0-9]{2,}$`) + // SearchUsers searches for users by name, email, or display name. +// If the query matches a Slack user ID pattern (e.g., U07VCEPP4N5), it looks up the user +// directly via the users.info API instead of searching. // For OAuth tokens (xoxp/xoxb), it searches the local users cache using regex matching. // For browser tokens (xoxc/xoxd), it uses the edge API's UsersSearch method. func (ap *ApiProvider) SearchUsers(ctx context.Context, query string, limit int) ([]slack.User, error) { + if slackUserIDPattern.MatchString(query) { + users, err := ap.client.GetUsersInfo(query) + if err != nil { + return nil, err + } + if users != nil { + return *users, nil + } + return nil, nil + } + if ap.IsOAuth() { return ap.searchUsersInCache(query, limit) } diff --git a/pkg/server/server.go b/pkg/server/server.go index c2b5741..1ff054a 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -286,12 +286,12 @@ func NewMCPServer(provider *provider.ApiProvider, logger *zap.Logger, enabledToo if shouldAddTool(ToolUsersSearch, enabledTools, "") { s.AddTool(mcp.NewTool(ToolUsersSearch, - mcp.WithDescription("Search for users by name, email, or display name. Returns user details and DM channel ID if available."), + mcp.WithDescription("Search for users by name, email, display name, or Slack user ID. If a Slack user ID is provided (e.g. U07VCEPP4N5), the user is looked up directly. Returns user details and DM channel ID if available."), mcp.WithTitleAnnotation("Search Users"), mcp.WithReadOnlyHintAnnotation(true), mcp.WithString("query", mcp.Required(), - mcp.Description("Search query - matches against real name, display name, username, or email."), + mcp.Description("Search query - matches against real name, display name, username, email, or a Slack user ID (e.g. U07VCEPP4N5)."), ), mcp.WithNumber("limit", mcp.DefaultNumber(10),