A Slack bot that uses the Model Context Protocol to integrate with ClickUp and Supabase for intelligent client management and task orchestration
Server implements 22 tools across ClickUp, Slack, and Supabase integrations. Tools are well-named with clear verb prefixes (get_, create_, update_, search_). Descriptions are present and moderately detailed (average ~150 chars). However, critical gaps emerge in schema completeness, output documentation, and error handling. Most tools lack documented return schemas and error recovery guidance. Object-type parameters (task_data, updates, time_data) lack internal field definitions. No output pagination support despite tools returning variable-length lists. Composition is good, tools chain logically (get_client_mapping → get_tasks_by_list_id). Security relies on server-side token injection (good), but no explicit tool-level permission declarations.
Create a new client mapping in Supabase. This tool creates a new client mapping record with the provided data. Use when adding a new client to the system. Requires at minimum a client_name field.
Create a new task in a ClickUp list. This tool creates a task with the specified data in the given list.
Create a time tracking entry for a ClickUp task.
Get a list of all client names for reference. This tool returns all available client names to help with client name extraction and validation. Use this to understand what clients are available in the system.
Get a list of all employees from Supabase.
Get client mapping by Slack channel ID. This tool searches for a client using the Slack channel ID, which is useful when the bot is mentioned in a specific client channel. Use this first when you know the channel ID to find the correct client.
Object-type parameters (task_data, updates, time_data, etc.) lack internal field definitions. LLM cannot determine valid keys or types without explicit nested schemas.
Output schemas not documented. Tools return dicts/lists but callers cannot predict field names, types, or pagination structure. Breaks tool chaining.
No pagination support declared despite tools returning variable-length lists. Lists of tasks, messages, team members, and clients could exceed context limits without limit/offset/cursor.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 50 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 25 | - | v1 |
Retrieve client mapping information by name from Supabase. This tool searches for a client by name and returns their complete mapping information including ClickUp IDs and Slack channel details. Use this when you need to find ClickUp list IDs or other client details.
Get conversation context from a channel including message statistics. Properly separates client messages (user_name IS NULL) from employee messages.
Get employee information from Supabase by Slack user ID.
Get the most recent message from a client in a specific channel. CRITICAL: Clients are external users with user_id but user_name = NULL Employees have both user_id AND user_name populated. This filters to show only client messages (user_name IS NULL).
Get details about a ClickUp list including task counts and custom fields.
Get recent messages from a Slack channel.
Get detailed information about a specific ClickUp task.
Get time tracking information for a specific ClickUp task.
Get tasks from a specific ClickUp list by ID. This tool retrieves tasks from a ClickUp list using the list ID, with optional filtering for status, date ranges, etc. Use this after getting the list_id from client mapping to fetch tasks. Date filters expect Unix timestamps in milliseconds.
Get tasks updated within the specified time period. This tool retrieves tasks that have been updated within the last N hours, useful for getting recent activity on a client's project. Perfect for answering "what's been happening with Client X this week" type questions.
Get tasks with time tracking information from a ClickUp list.
Get team members from ClickUp workspace. This tool retrieves all team members to help with user ID mapping for task assignments.
Search for client mappings using a flexible query. This tool performs a fuzzy search across client names and alternatives to help identify the correct client when the exact name isn't known. Use this when the user mentions a client name that might not be exact.
Search for messages containing specific text in a channel.
Update client mapping information in Supabase. This tool allows updating specific fields of a client mapping record. Use with caution as it modifies the database. Only use when explicitly requested by the user to update client information.
Update an existing ClickUp task with comprehensive field support. This tool updates specific fields of a task including all supported ClickUp fields.
Error handling logic not visible in definitions. No guidance on retryable vs. fatal errors, no actionable error messages, no recovery suggestions.
Tool definitions lack destructiveHint or idempotentHint annotations. WRITE tools (create_task, update_task, delete_task) should declare they are destructive and need confirmation or deduplication handling.
Tools return verbose API responses without stripping irrelevant fields. ClickUp and Slack responses likely include audit metadata, IDs, and nested structures bloating token usage.
No explicit permission declarations (read:tasks, write:tasks, etc.). LLM cannot reason about least-privilege scoping or audit requirements.