A side-by-side look at the ConnectWise PSA and Zendesk MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose ConnectWise PSA for support & service management work as a local process; choose Zendesk MCP for support & service management as a local process. You can also run both side by side in one mcpServers block.
CW_SITE, CW_COMPANY_ID, CW_CLIENT_ID, CW_PUBLIC_KEY, CW_PRIVATE_KEY.cw_search_tickets, cw_my_tickets, cw_get_ticket.zendesk_get_ticket, zendesk_search_tickets, zendesk_get_comments.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Support & Service Management | Support & Service Management |
| Quality signal | 59/100 · Good | 61/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | OAuth 2.0 |
| Pricing | Not declared | BYOK (pay the provider) |
| Required env vars | CW_SITECW_COMPANY_IDCW_CLIENT_IDCW_PUBLIC_KEYCW_PRIVATE_KEY | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 6 | 7 |
| Directory activity | 2 views 0 installs 0 upvotes | 3 views 0 installs 0 upvotes |
| Tools | 41 | 29 |
| Full listing | View ConnectWise PSA | View Zendesk MCP |
cw_search_ticketsSearch tickets by company, board, status, summary text, or assigned member. Covers SERVICE and PROJECT tickets — ConnectWise keeps them apart, and ticket_type picks which. Defaults to open tickets only. Returns ticket ids for use with cw_get_ticket / cw_add_ticket_note / cw_create_time_entry.cw_my_ticketsList open tickets assigned to the member this session acts as (owner or listed in resources). Includes project tickets as well as service tickets by default.cw_get_ticketGet one ticket with its most recent notes (newest first). Works for service and project tickets — the resource is detected from the id.cw_create_ticketCreate a new SERVICE ticket on a board for a company. Project tickets cannot be created here — they need a project and a phase.cw_update_ticketUpdate a ticket's status, priority, summary, or owner. Only provided fields change.cw_bundle_ticketsAttach child tickets to a parent ticket (CW's bundling). SERVICE tickets only. Children that already have a parent are refused rather than re-parented, and every child is read back afterwards so the result says which ones actually attached. NOT UNDOABLE FROM HERE — detaching a bundled ticket is only possible in the ConnectWise UI, so check the ids before calling.cw_add_ticket_noteAdd a note to a ticket. Discussion notes are visible to the customer on portals/emails; internal notes are not. Notes are attributed to the member whose API keys this session uses.cw_list_boardsList service boards. Use to discover exact board names for cw_search_tickets / cw_create_ticket, and board ids for cw_get_board (statuses and types).cw_get_boardList what a service board allows — statuses, types, sub-types, items and teams. These are the exact names cw_create_ticket and cw_update_ticket take, and they are BOARD-SCOPED: the same name means a different id on another board. Get the board id from cw_list_boards.cw_list_prioritiesList ticket priorities (exact names for cw_create_ticket / cw_update_ticket).cw_list_ticket_timeList all time entries logged against a ticket (by any member), newest first. Works for service and project tickets.cw_list_ticket_tasksList the task/checklist items on a ticket, with their done state.zendesk_get_ticketGet a Zendesk ticket by ID. Returns ticket fields including status, priority, requester, assignee, tags, and description.zendesk_search_ticketsSearch Zendesk tickets by keyword and/or status. keywords: free-text search (e.g. 'login failure LDAP'). status: new, open, pending, hold, solved, closed — leave empty for all statuses. Returns id, subject, status, requester, assignee, and dates.zendesk_get_commentsGet all comments (public replies and internal notes) for a Zendesk ticket. Includes attachment metadata but does not download files.zendesk_list_attachmentsList all attachments across all comments for a Zendesk ticket. Returns filename, content type, size, and download URL for each. Use zendesk_download_attachment to fetch file contents.zendesk_download_attachmentDownload a Zendesk attachment. Obtain attachment_url and filename from zendesk_list_attachments. ticket_id is required for cache organization. Optional dest_dir overrides the default cache location (it must be inside the cache or a directory listed in 'attachment_allowed_dest_dirs' in the config); the file is written there and (for archives) extracted alongside it. Archives return a file list and unpack_dir — read individual files with your normal file tools. PDFs return up to ~500KB of extracted text. Images are base64-encoded.zendesk_ticket_to_gitlab_contextFormat a Zendesk ticket and its comments as an issue draft. Returns Markdown with ticket metadata, full conversation, and an empty Steps to Reproduce section. Use this output as the description when creating an issue in your tracker.zendesk_post_commentPost a public reply on a Zendesk ticket. The reply is visible to the requester. Use for customer-facing responses.zendesk_post_internal_notePost an internal note on a Zendesk ticket. Internal notes are only visible to agents and are not sent to the requester.zendesk_set_ticket_statusSet the status of a Zendesk ticket. Valid statuses: new, open, pending, hold, solved, closed.zendesk_assign_ticketAssign a Zendesk ticket to an agent by their email address. Pass 'me' as assignee_email to assign the ticket to yourself (the authenticated user).zendesk_update_ticketUpdate one or more fields on a Zendesk ticket. Pass only the fields you want to change. status: new/open/pending/hold/solved/closed. priority: low/normal/high/urgent. type: problem/incident/question/task. assignee_id, requester_id, group_id, custom_status_id are integer IDs. due_at is ISO8601. Returns JSON of the refreshed ticket.zendesk_get_time_trackingGet time tracking data for a Zendesk ticket. Returns total time spent and time spent on the last update, in both seconds and human-readable format (e.g. '2h 15m').Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"connectwise-psa-2": {
"command": "npx",
"args": [
"-y",
"mcp-connectwise-psa"
],
"env": {
"CW_SITE": "YOUR_CW_SITE_HERE",
"CW_COMPANY_ID": "YOUR_CW_COMPANY_ID_HERE",
"CW_CLIENT_ID": "YOUR_CW_CLIENT_ID_HERE",
"CW_PUBLIC_KEY": "YOUR_CW_PUBLIC_KEY_HERE",
"CW_PRIVATE_KEY": "YOUR_CW_PRIVATE_KEY_HERE"
}
}
}
}
{
"mcpServers": {
"michaelrice-zendesk-mcp": {
"command": "uvx",
"args": [
"zendesk-mcp"
]
}
}
}