@@ -323,7 +323,7 @@ func (ch *ConversationsHandler) ConversationsSearchHandler(ctx context.Context,
323323 return nil , err
324324 }
325325
326- params , err := ch .parseParamsToolSearch (request )
326+ params , err := ch .parseParamsToolSearch (ctx , request )
327327 if err != nil {
328328 ch .logger .Error ("Failed to parse search params" , zap .Error (err ))
329329 return nil , err
@@ -516,23 +516,39 @@ func (ch *ConversationsHandler) parseParamsToolAddMessage(request mcp.CallToolRe
516516 }, nil
517517}
518518
519- func (ch * ConversationsHandler ) parseParamsToolSearch (req mcp.CallToolRequest ) (* searchParams , error ) {
519+ func (ch * ConversationsHandler ) parseParamsToolSearch (ctx context. Context , req mcp.CallToolRequest ) (* searchParams , error ) {
520520 rawQuery := strings .TrimSpace (req .GetString ("search_query" , "" ))
521521 freeText , filters := splitQuery (rawQuery )
522522
523523 if req .GetBool ("filter_threads_only" , false ) {
524524 addFilter (filters , "is" , "thread" )
525525 }
526526 if chName := req .GetString ("filter_in_channel" , "" ); chName != "" {
527- addFilter (filters , "in" , paramFormatChannel (chName ))
527+ f , err := ch .paramFormatChannel (ctx , chName )
528+ if err != nil {
529+ return nil , err
530+ }
531+ addFilter (filters , "in" , f )
528532 } else if im := req .GetString ("filter_in_im_or_mpim" , "" ); im != "" {
529- addFilter (filters , "in" , paramFormatUser (im ))
533+ f , err := ch .paramFormatUser (ctx , im )
534+ if err != nil {
535+ return nil , err
536+ }
537+ addFilter (filters , "in" , f )
530538 }
531539 if with := req .GetString ("filter_users_with" , "" ); with != "" {
532- addFilter (filters , "with" , paramFormatUser (with ))
540+ f , err := ch .paramFormatUser (ctx , with )
541+ if err != nil {
542+ return nil , err
543+ }
544+ addFilter (filters , "with" , f )
533545 }
534546 if from := req .GetString ("filter_users_from" , "" ); from != "" {
535- addFilter (filters , "from" , paramFormatUser (from ))
547+ f , err := ch .paramFormatUser (ctx , from )
548+ if err != nil {
549+ return nil , err
550+ }
551+ addFilter (filters , "from" , f )
536552 }
537553
538554 dateMap , err := buildDateFilters (
@@ -589,30 +605,46 @@ func (ch *ConversationsHandler) parseParamsToolSearch(req mcp.CallToolRequest) (
589605 }, nil
590606}
591607
592- // paramFormatChannel passes through the channel identifier for Slack search.
593- // Accepts #channel-name or Cxxxxxxxxxx format.
594- func paramFormatChannel (raw string ) string {
608+ func (ch * ConversationsHandler ) paramFormatChannel (ctx context.Context , raw string ) (string , error ) {
595609 raw = strings .TrimSpace (raw )
596- if strings .HasPrefix (raw , "#" ) || strings .HasPrefix (raw , "C" ) {
597- return raw
610+ client , err := ch .apiProvider .GetClient (ctx )
611+ if err != nil {
612+ return "" , err
613+ }
614+ name := strings .TrimPrefix (raw , "#" )
615+ channels , err := fetchAllChannels (ctx , client , []string {"public_channel" , "private_channel" })
616+ if err != nil {
617+ return "" , err
598618 }
599- return "#" + raw
619+ for _ , c := range channels {
620+ if c .Name == name || c .ID == raw {
621+ return "#" + c .Name , nil
622+ }
623+ }
624+ return "" , fmt .Errorf ("channel %q not found" , raw )
600625}
601626
602- // paramFormatUser passes through the user identifier for Slack search.
603- // Accepts @username or Uxxxxxxxxxx format.
604- func paramFormatUser (raw string ) string {
627+ func (ch * ConversationsHandler ) paramFormatUser (ctx context.Context , raw string ) (string , error ) {
605628 raw = strings .TrimSpace (raw )
606629 if strings .HasPrefix (raw , "<@" ) {
607- return raw
630+ raw = strings .TrimSuffix (raw [2 :], ">" )
631+ } else if strings .HasPrefix (raw , "@" ) {
632+ raw = raw [1 :]
633+ }
634+ client , err := ch .apiProvider .GetClient (ctx )
635+ if err != nil {
636+ return "" , err
608637 }
609- if strings .HasPrefix (raw , "@" ) {
610- return raw
638+ users , err := client .GetUsersContext (ctx , slack .GetUsersOptionLimit (1000 ))
639+ if err != nil {
640+ return "" , err
611641 }
612- if strings .HasPrefix (raw , "U" ) {
613- return fmt .Sprintf ("<@%s>" , raw )
642+ for _ , u := range users {
643+ if u .ID == raw || u .Name == raw {
644+ return fmt .Sprintf ("<@%s>" , u .ID ), nil
645+ }
614646 }
615- return "@" + raw
647+ return "" , fmt . Errorf ( "user %q not found" , raw )
616648}
617649
618650func marshalMessagesToCSV (messages []Message ) (* mcp.CallToolResult , error ) {
0 commit comments