# ConnectWise PSA [Health: Active]

**Category:** 🎧 Support & Service Management  
**Repository:** https://github.com/selic/mcp-connectwise-psa  
**GitHub Stars:** 6  
**Views:** 2  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/connectwise-psa-2

## Description
ConnectWise PSA (Manage) MCP server — tickets, time entries, companies, configurations, RBAC

## Tools
Capabilities this server exposes over MCP:

- **cw_search_tickets** — Search 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_tickets** — List 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_ticket** — Get one ticket with its most recent notes (newest first). Works for service and project tickets — the resource is detected from the id.
- **cw_create_ticket** — Create 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_ticket** — Update a ticket's status, priority, summary, or owner. Only provided fields change.
- **cw_bundle_tickets** — Attach 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_note** — Add 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_boards** — List 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_board** — List 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_priorities** — List ticket priorities (exact names for cw_create_ticket / cw_update_ticket).
- **cw_list_ticket_time** — List all time entries logged against a ticket (by any member), newest first. Works for service and project tickets.
- **cw_list_ticket_tasks** — List the task/checklist items on a ticket, with their done state.
- **cw_create_time_entry** — Log time against a ticket, service or project — the resource is detected from the id. Time is attributed to the member whose API keys this session uses. Provide time_start plus either time_end or hours. For a span containing a break, pass the REAL time_end and put the break in hours_deduct; passing a shortened `hours` instead makes ConnectWise display an end time that never happened. Work role and work type default to the ticket's unless given. The note can also be copied onto the ticket: add_to_detail is the CUSTOMER-VISIBLE Discussion, add_to_internal is staff-only Internal Analysis — leaving both false keeps the note on the time entry alone.
- **cw_update_time_entry** — Edit an existing time entry — notes, start/end, break, billable flag, work role or work type. Only provided fields change. Duration is set by time_start/time_end (hours are derived, not edited directly); use hours_deduct for a break inside that span. Governed by your ConnectWise security role (typically your own entries).
- **cw_list_my_time** — List time entries for the member this session acts as, newest first, optionally within a date range.
- **cw_list_work_roles** — List work roles (used when logging time). Excludes inactive by default.
- **cw_list_work_types** — List work types (how time is classified — Remote, Onsite, …), for the work_type argument of cw_create_time_entry. Excludes inactive by default.
- **cw_list_my_timesheets** — List timesheets for the member this session acts as, newest first, with their status (Open, Submitted, Approved…). Use the id with cw_submit_timesheet.
- **cw_submit_timesheet** — Submit a timesheet for approval. Get the timesheet id from cw_list_my_timesheets; only Open timesheets can be submitted.
- **cw_search_companies** — Search companies by name (substring). Use this to find the company ID needed by ticket and configuration tools.
- **cw_get_company** — Get one company by ID.
- **cw_search_contacts** — Search contacts by name, optionally within one company.
- **cw_get_contact** — Get one contact with their phone numbers and email addresses (communication items).
- **cw_list_company_sites** — List a company's sites (locations/addresses), with phone and timezone.
- **cw_list_configurations** — List configurations (devices/assets) — servers, firewalls, workstations — optionally filtered by company, name, or type. Useful during troubleshooting to find serials, IPs, and warranty info.
- **cw_get_configuration** — Get one configuration with full details (serial, model, network, OS, warranty, notes).
- **cw_list_schedule_entries** — List dispatch/schedule entries, optionally filtered by member, ticket, or date range (dates as YYYY-MM-DD). Use to see who is scheduled for what and when.
- **cw_my_schedule** — List schedule entries assigned to the member this session acts as, optionally within a date range.
- **cw_schedule_ticket** — Schedule a service ticket to a member for a time window. Times are ISO-8601 (e.g. 2026-07-06T13:00:00Z). Creates a schedule entry on the dispatch board.
- **cw_list_members** — List members (technicians) for dispatch — each with timezone, working-hours calendar name, work role, and daily/schedule capacity. Filter by name or identifier; excludes inactive by default.
- **cw_get_member** — Get one member's dispatch profile: timezone, work role, location, capacity, and their working hours (resolved from the member's calendar, including the holiday list).
- **cw_update_schedule_entry** — Reschedule or reassign a schedule entry, or mark it done. Times are ISO-8601. Only provided fields change.
- **cw_delete_schedule_entry** — Remove a schedule entry from the dispatch board (e.g. to cancel a scheduled visit).
- **cw_member_availability** — Show a member's booked vs free hours on a given day (YYYY-MM-DD): their schedule capacity minus the hours already scheduled that day.
- **cw_list_invoices** — List invoices, optionally filtered by company, status, or invoice date range (YYYY-MM-DD). Read-only.
- **cw_get_invoice** — Get one invoice by ID. Read-only.
- **cw_list_agreements** — List service agreements (contracts), optionally filtered by company or status. Read-only.
- **cw_get_agreement** — Get one agreement (contract) with its coverage limits and billing cycle. Read-only.
- **cw_list_unbilled_time** — List billable time entries not yet on an invoice — what's ready to bill. Filter by company or date range (YYYY-MM-DD). Read-only.
- **cw_find_endpoint** — Discover which ConnectWise REST endpoint (and its filter fields) fits a task — search a curated catalog by keywords. Use the result with cw_get, or prefer the named curated tool when one exists.
- **cw_get** — Read-only GET for any ConnectWise REST path (the part after /apis/3.0, e.g. /procurement/purchaseorders). ALWAYS pass fields (CW records are huge). Filter with conditions (CW grammar: exact = for ids/names, 'contains' for text, dates as [2026-07-01T00:00:00Z]); filter on child collections (e.g. a company's types) with child_conditions; sort with order_by. Endpoints with their OWN query parameters (e.g. /system/audittrail needs type+id, /system/documents needs recordType+recordId) take them via params: {"type":"Ticket","id":123}. Discover paths with cw_find_endpoint.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "connectwise-psa": {
    "command": "npx",
    "args": ["-y","mcp-connectwise-psa"],
    "env": {
      "CW_SITE": "",
      "CW_COMPANY_ID": "",
      "CW_CLIENT_ID": "",
      "CW_PUBLIC_KEY": "",
      "CW_PRIVATE_KEY": ""
    }
  }
}
```

**Requires environment variables:** `CW_SITE`, `CW_COMPANY_ID`, `CW_CLIENT_ID`, `CW_PUBLIC_KEY`, `CW_PRIVATE_KEY` — the values above are empty placeholders; fill in real credentials before running (see the repository for what each one is for).

## Documentation

## What ConnectWise PSA MCP server does

The ConnectWise PSA MCP server exposes selected ConnectWise PSA (Manage) operations through MCP tools. Its curated toolsets cover tickets, time entries and timesheets, companies and contacts, device configurations, scheduling, and read-only finance data. Ticket tools handle both service and project tickets, while other tools support activities such as adding notes, changing ticket ownership or status, logging time, and scheduling work.

An `advanced` toolset provides a searchable catalog of roughly 1,150 ConnectWise API endpoints and a read-only GET operation for paths not covered by the curated tools. An optional `sql` toolset supports read-only T-SQL against an on-premises Manage database, including schema discovery and saved-query management.

## How it works

The ConnectWise PSA MCP server can run over stdio for a local assistant or streamable HTTP for a shared deployment. HTTP exposes `/mcp` for MCP traffic and `/health` for liveness checks. HTTP sessions are held in memory, so a deployment should use one instance or provide sticky session routing.

Local stdio uses API credentials supplied through environment variables. HTTP clients provide the public and private member keys in request headers, along with an optional member identifier for “my” ticket and time operations. Both key headers are required together, and a session rejects a different key pair after initialization. ConnectWise applies the member's security role to API operations, and write activity is attributed to that member.

## Setup and configuration

Build the project with `npm install && npm run build`, then start `node dist/index.js` with the ConnectWise site, company ID, client ID, public key, private key, and member identifier configured. A ConnectWise integration client ID is required, and member API keys are created in the ConnectWise administration interface.

For HTTP, start the process with `--transport http --port 3000`; Docker can publish the same port. Toolsets can be selected with `CW_TOOLSETS` or `--toolsets` in stdio mode, and with the `x-cw-toolsets` header over HTTP. Presets include `tech`, `dispatch`, `invoicing`, and `all`. The default is `all` for configured capabilities.

## Tools and capabilities

- Tickets: search, inspect, create, update, add notes, discover boards and priorities, and review ticket time and tasks.
- Time: create entries, inspect personal time, look up work roles and types, and list or submit timesheets.
- Companies: search companies and contacts, retrieve contact details, and list company sites.
- Configurations: list and inspect devices or assets, including available inventory details.
- Schedule: list, create, reschedule, and cancel entries, and inspect member availability.
- Finance: read invoices, agreements, and unbilled time.

The `sql` tools are server-wide rather than member-scoped. If database variables are configured, the default `all` selection can expose the read-only PSA database to sessions that do not narrow their toolsets. The only destructive operation listed is schedule-entry deletion; saved-query management writes to the query-library file, while database access remains read-only.

## Limitations and notes

The server does not define an MCP-level role system for HTTP. Authorization depends on the supplied ConnectWise member keys, except for SQL access, which uses a server-wide read-only database login and is not filtered by the member's ConnectWise permissions. Deployers should narrow toolsets when appropriate and protect database credentials.

_Full upstream README: https://allmcps.com/mcp/connectwise-psa-2/readme_

