MCP server for Crisp customer support platform. Provides tools for interacting with Crisp's customer support platform including conversation discovery, messaging, state management, people/contacts lookup, and rich context assembly.
This server demonstrates solid naming conventions and reasonable descriptions for most tools. All 23 tools are explicitly registered with schemas and descriptions. However, there are consistent gaps in parameter descriptions, missing output schema documentation, and no error handling guidance. The tool set is well-organized for a customer support workflow (conversation discovery, messaging, people lookup, conversation management), but the implementation lacks production-grade error recovery patterns and advanced features like tool annotations or structured error messages.
Tools (23)
add_segmentswriteauthsource verified80/100
Add segments (tags) to a conversation. Idempotent — existing segments are preserved.
assign_conversationwriteauthsource verified80/100
Assign a conversation to an operator (by user_id), or unassign it (pass user_id: null).
block_conversationwriteauthsource verified75/100
Block a conversation (prevent the customer from sending new messages).
List unresolved conversations where the customer is currently waiting on an operator reply (unread_by_operator > 0). Ordered so the longest-waiting appear first. This is the single most useful 'what should I work on' tool.
Missing output schema documentation for all tools. Users/agents cannot determine what fields to expect from responses, forcing inference and risking parsing errors.
No error handling guidance. Tools like send_message, assign_conversation, and block_conversation are destructive/mutating but provide no recovery suggestions, classification (retryable vs user-fixable), or actionable error messages.
Recommendations
Document output schemas for all tools in README or inline comments. Specify the structure of paginated results, message objects, conversation metadata, and people profiles. Example: 'Returns { data: Conversation[], pageNumber: number, hasMore: boolean, nextPage: number }' for list_conversations.
Add tool annotations to the MCP schema registration. Mark read-only tools with 'readOnlyHint: true' (get_*, list_*, search_*) and destructive tools with 'destructiveHint: true' (send_*, block_*, set_conversation_state, remove_*). Mark idempotent operations with 'idempotentHint: true' (add_segments, remove_segments).
Expand error handling in tool implementations. For write operations (send_message, set_conversation_state, assign_conversation), return structured error responses with: error code, human-readable message, suggested recovery action, and whether the error is retryable. Example: { error: 'session_not_found', message: 'Conversation session-123 does not exist.', recovery: 'Try searching for the conversation first with search_conversations()', retryable: false }
Enhance parameter descriptions with specifics. For set_conversation_state, clarify: 'state must be one of: pending (awaiting agent action), unresolved (requires followup), resolved (issue closed). Resolved conversations cannot receive new customer messages unless reopened.' For search_conversations, document: 'Searches across customer name, email, subject, and message content using OR logic.'
Add pagination documentation. For tools accepting max_pages, clarify: 'If the number of results exceeds max_pages * items_per_page, the response will be truncated. Check hasMore in the response to know if more results exist.'
Score history
Overall score trend
↑ 12 points across a rubric change (v1 → v2)
64/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
C
64
2026-07-28+
v2
2026-03-09
D
52
-
v1
find_people_by_emailread onlyauth50/100
Look up a Crisp People profile by email address. Returns the profile if found, or `{}` if not.
Get a conversation with messages formatted for analysis. Good for small-context summaries. For full customer history + cross-conversation context use `get_rich_context` instead.
get_messagesread onlyauthsource verified78/100
Get message history for a conversation. File/animation/audio messages have their URLs surfaced in the output.
get_people_conversationsread onlyauth50/100
List all conversations for a Crisp People contact, across all of time. Returns a flat array of summarized conversation objects, sorted by most recent first.
get_people_profileread onlyauth50/100
Get the full Crisp People profile for a contact (by people_id). Returns comprehensive contact info: name, company, employment, geolocation, profiles, and more.
HEAVY CONTEXT: returns conversation + messages + linked Crisp People profile + that person's past conversations + custom data, all in one call. Replaces 4-5 round trips. Use this at the start of any non-trivial ticket reply.
Shortcut for all unresolved conversations across multiple pages. Returns a flat array (no pagination metadata). Use `conversations_awaiting_reply` if you specifically want ones where a customer is waiting on YOU.
List conversations with optional filters. Returns `{ data, pageNumber, hasMore, nextPage }` so callers know whether to fetch more. Filters are OR-combined with the standard search.
mark_as_readwriteauth50/100
Mark all messages in a conversation as read by the operator.
remove_segmentswriteauthsource verified80/100
Remove segments (tags) from a conversation. Idempotent.
Attach a file to a conversation by URL (no upload). Good when the file is already hosted (S3/R2/imgur/etc.). If you need to push raw bytes through Crisp's bucket, use the Crisp web UI or call the client's `uploadAndSendFile` method directly.
send_messagewriteauthsource verified82/100
Send a text message or internal note to a conversation.
Many parameter descriptions are minimal or missing detail. E.g., 'get_conversation' description is only 60 chars; 'set_conversation_state' lacks explanation of what states are valid; 'search_conversations' does not specify how plain-text search works or what fields are searched.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Agents cannot determine which tools are safe to retry, which have side effects, or which are read-only without LLM reasoning.
Pagination handling inconsistent. Some tools (list_conversations) include pagination metadata in the response structure description, while others (get_unresolved_conversations, conversations_awaiting_reply) accept max_pages but no documentation of response structure or whether results are incomplete when max_pages is hit.
Destructive operations lack confirmation mechanisms. block_conversation, unblock_conversation, and set_conversation_state (especially to 'resolved') are irreversible but have no dry-run or confirmation-request pattern.
Some parameters accept complex structures without clear constraints. E.g., 'segments' in add_segments and remove_segments are arrays of strings with no max length, pattern, or example guidance. LLMs may pass invalid segment names.
add_segmentsremove_segments
Implement a confirm_before_block or similar pattern for irreversible operations. Allow agents to call block_conversation with a dry_run=true flag that returns the conversation state without blocking, letting agents verify before committing.
Constrain segment names. Add to add_segments and remove_segments: 'Each segment must be 1-50 characters, alphanumeric plus hyphens/underscores, and must match existing segments in the workspace.' Return validation errors with a list of available segments if an invalid one is provided.
Add batch operation support where appropriate. E.g., send_message_batch to send the same message to multiple conversations, or update_multiple_conversations to apply state/segment changes in one call. Reduces token waste and request overhead.
Document the relationship between filter parameters in list_conversations. Clarify: 'Filters are OR-combined within the standard search. E.g., specifying both assigned_to and segment returns conversations assigned to that operator OR tagged with that segment. To find conversations assigned to an operator AND tagged with a segment, call list_conversations twice or filter in post-processing.'
Add examples or templates in descriptions of complex tools. For get_rich_context, include: 'This is the recommended first call for any non-trivial agent workflow. It pre-fetches conversation, messages, customer profile, and history in a single round-trip, reducing latency and token usage.'
Clarify the default behavior of boolean flags. E.g., 'unresolved_only defaults to true in conversations_assigned_to_me. To include resolved conversations, pass unresolved_only: false.' This prevents LLMs from assuming all resolved conversations are returned when the flag is omitted.