Skip to content

Commit 9062adf

Browse files
authored
fix slack atlas (#1272)
1 parent 8bc5899 commit 9062adf

File tree

1 file changed

+53
-21
lines changed

1 file changed

+53
-21
lines changed

mcp_servers/slack_atlas/pkg/handler/conversations.go

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

618650
func marshalMessagesToCSV(messages []Message) (*mcp.CallToolResult, error) {

0 commit comments

Comments
 (0)