Skip to main content
Glama

Slack MCP Server

by lbeatu
slack.client.ts6.87 kB
import { WebClient } from "@slack/web-api"; import { ISlackClient } from "../../core/interfaces/slack.interface.js"; import { AddReactionRequest, GetChannelHistoryRequest, GetThreadRepliesRequest, GetUserProfileRequest, GetUsersRequest, ListChannelsRequest, PostMessageRequest, ReplyToThreadRequest, SlackChannel, SlackMessage, SlackOperationResult, SlackUser, SlackUserProfile, } from "../../core/types/slack.types.js"; export class SlackClient implements ISlackClient { private client: WebClient; constructor(token: string) { this.client = new WebClient(token); } async listChannels(request: ListChannelsRequest): Promise< SlackOperationResult<{ channels: SlackChannel[]; next_cursor?: string; }> > { try { const result = await this.client.conversations.list({ types: "public_channel", exclude_archived: true, limit: Math.min(request.limit || 100, 200), cursor: request.cursor, }); if (!result.ok) { return { success: false, error: result.error || "Failed to list channels", }; } return { success: true, data: { channels: (result.channels || []) as SlackChannel[], next_cursor: result.response_metadata?.next_cursor, }, }; } catch (error) { console.error("SlackClient.listChannels error:", error); return { success: false, error: error instanceof Error ? error.message : String(error), }; } } async postMessage( request: PostMessageRequest ): Promise<SlackOperationResult<SlackMessage>> { try { const result = await this.client.chat.postMessage({ channel: request.channel_id, text: request.text, }); if (!result.ok) { return { success: false, error: result.error || "Failed to post message", }; } return { success: true, data: result.message as SlackMessage, }; } catch (error) { console.error("SlackClient.postMessage error:", error); return { success: false, error: error instanceof Error ? error.message : String(error), }; } } async replyToThread( request: ReplyToThreadRequest ): Promise<SlackOperationResult<SlackMessage>> { try { const result = await this.client.chat.postMessage({ channel: request.channel_id, thread_ts: request.thread_ts, text: request.text, }); if (!result.ok) { return { success: false, error: result.error || "Failed to reply to thread", }; } return { success: true, data: result.message as SlackMessage, }; } catch (error) { console.error("SlackClient.replyToThread error:", error); return { success: false, error: error instanceof Error ? error.message : String(error), }; } } async addReaction( request: AddReactionRequest ): Promise<SlackOperationResult<void>> { try { const result = await this.client.reactions.add({ channel: request.channel_id, timestamp: request.timestamp, name: request.reaction, }); if (!result.ok) { return { success: false, error: result.error || "Failed to add reaction", }; } return { success: true, }; } catch (error) { console.error("SlackClient.addReaction error:", error); return { success: false, error: error instanceof Error ? error.message : String(error), }; } } async getChannelHistory(request: GetChannelHistoryRequest): Promise< SlackOperationResult<{ messages: SlackMessage[]; }> > { try { const result = await this.client.conversations.history({ channel: request.channel_id, limit: request.limit || 10, }); if (!result.ok) { return { success: false, error: result.error || "Failed to get channel history", }; } return { success: true, data: { messages: (result.messages || []) as SlackMessage[], }, }; } catch (error) { console.error("SlackClient.getChannelHistory error:", error); return { success: false, error: error instanceof Error ? error.message : String(error), }; } } async getThreadReplies(request: GetThreadRepliesRequest): Promise< SlackOperationResult<{ messages: SlackMessage[]; }> > { try { const result = await this.client.conversations.replies({ channel: request.channel_id, ts: request.thread_ts, }); if (!result.ok) { return { success: false, error: result.error || "Failed to get thread replies", }; } return { success: true, data: { messages: (result.messages || []) as SlackMessage[], }, }; } catch (error) { console.error("SlackClient.getThreadReplies error:", error); return { success: false, error: error instanceof Error ? error.message : String(error), }; } } async getUsers(request: GetUsersRequest): Promise< SlackOperationResult<{ users: SlackUser[]; next_cursor?: string; }> > { try { const result = await this.client.users.list({ limit: Math.min(request.limit || 100, 200), cursor: request.cursor, }); if (!result.ok) { return { success: false, error: result.error || "Failed to get users", }; } return { success: true, data: { users: (result.members || []) as SlackUser[], next_cursor: result.response_metadata?.next_cursor, }, }; } catch (error) { console.error("SlackClient.getUsers error:", error); return { success: false, error: error instanceof Error ? error.message : String(error), }; } } async getUserProfile( request: GetUserProfileRequest ): Promise<SlackOperationResult<SlackUserProfile>> { try { const result = await this.client.users.profile.get({ user: request.user_id, include_labels: true, }); if (!result.ok) { return { success: false, error: result.error || "Failed to get user profile", }; } return { success: true, data: result.profile as SlackUserProfile, }; } catch (error) { console.error("SlackClient.getUserProfile error:", error); return { success: false, error: error instanceof Error ? error.message : String(error), }; } } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lbeatu/slack-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server