slack_search_channels
Find Slack channels by searching for keywords in their names, including archived channels if needed, with configurable result limits.
Instructions
Search for channels by partial name match. Use this when you need to find channels containing specific keywords in their names. Returns up to the specified limit of matching channels.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search channels by partial name match (case-insensitive). Searches across channel names. | |
| limit | No | Maximum number of channels to return (default 20) | |
| include_archived | No | Include archived channels in results (default false) |
Implementation Reference
- src/index.ts:441-499 (handler)The handler function for the 'slack_search_channels' tool. It parses the input arguments, fetches public channels (optionally excluding archived) using paginated Slack API calls (conversations.list), filters channels client-side by partial name match (case-insensitive), limits the results, and returns the response parsed with ListChannelsResponseSchema.case 'slack_search_channels': { const args = SearchChannelsRequestSchema.parse( request.params.arguments ); // Fetch all channels with a reasonable limit const allChannels: Array<{ id?: string; name?: string; is_archived?: boolean; [key: string]: unknown; }> = []; let cursor: string | undefined; const maxPages = 5; // Limit to prevent infinite loops let pageCount = 0; // Fetch multiple pages if needed while (pageCount < maxPages) { const response = await slackClient.conversations.list({ types: 'public_channel', exclude_archived: !args.include_archived, limit: 1000, // Max allowed by Slack API cursor, }); if (!response.ok) { throw new Error(`Failed to search channels: ${response.error}`); } if (response.channels) { allChannels.push(...(response.channels as typeof allChannels)); } cursor = response.response_metadata?.next_cursor; pageCount++; // Stop if no more pages if (!cursor) break; } // Filter channels by name (case-insensitive partial match) const searchTerm = args.query.toLowerCase(); const filteredChannels = allChannels.filter((channel) => channel.name?.toLowerCase().includes(searchTerm) ); // Limit results const limitedChannels = filteredChannels.slice(0, args.limit); const response = { ok: true, channels: limitedChannels, }; const parsed = ListChannelsResponseSchema.parse(response); return { content: [{ type: 'text', text: JSON.stringify(parsed) }], }; }
- src/schemas.ts:219-238 (schema)Zod schema defining the input parameters for the 'slack_search_channels' tool: query (string), limit (number, default 20, max 100), include_archived (boolean, default false).export const SearchChannelsRequestSchema = z.object({ query: z .string() .describe( 'Search channels by partial name match (case-insensitive). Searches across channel names.' ), limit: z .number() .int() .min(1) .max(100) .optional() .default(20) .describe('Maximum number of channels to return (default 20)'), include_archived: z .boolean() .optional() .default(false) .describe('Include archived channels in results (default false)'), });
- src/index.ts:164-169 (registration)Registration of the 'slack_search_channels' tool in the listTools response, specifying name, description, and input schema.{ name: 'slack_search_channels', description: 'Search for channels by partial name match. Use this when you need to find channels containing specific keywords in their names. Returns up to the specified limit of matching channels.', inputSchema: zodToJsonSchema(SearchChannelsRequestSchema), },