@goxtechnologies/connectwise-cpq-mcp
v0.2.5
Published
15 MCP tools + 51 named operations for ConnectWise CPQ (Quosal Sell). Quote lifecycle — templates, items, customers, terms — with PSA opportunity linkage. Independent community project — not affiliated with ConnectWise LLC.
Downloads
650
Maintainers
Readme
@goxtechnologies/connectwise-cpq-mcp
MCP server connecting AI assistants to ConnectWise CPQ (Quosal Sell) — 15 tools, 51 named operations, full quote lifecycle with PSA opportunity linkage. Built for MSP technicians experimenting with AI-assisted workflows.
Browse templates, copy a template into a new quote, link a PSA opportunity, add/update line items, and retrieve a preview URL. Pairs naturally with @goxtechnologies/connectwise-psa-mcp so an assistant can take a PSA ticket all the way to a draft CPQ quote in one session.
Description
Independent, community-maintained MCP server covering the documented ConnectWise CPQ REST endpoints. Read, create, update, and delete quotes, quote items, tabs, customers, and terms; browse templates, tax codes, and recurring-revenue options; and run workflow composites that chain multiple CPQ calls together.
Requirements
- Node.js ≥ 22 LTS
- ConnectWise CPQ 2022.2 or later
- Valid CPQ access key + public/private API key pair
- An MCP-aware client — Claude Code, Claude Desktop, or any client compatible with the Model Context Protocol
Legacy username/password authentication is not supported — CPQ has required API keys since 2022.2.
Installation
npx (recommended for Claude Code / Claude Desktop)
npx -y @goxtechnologies/connectwise-cpq-mcpWire this command into your MCP client — e.g. .mcp.json:
{
"mcpServers": {
"connectwise-cpq": {
"command": "npx",
"args": ["-y", "@goxtechnologies/connectwise-cpq-mcp"]
}
}
}Claude Desktop Extension (.dxt)
Download the latest .dxt from the GitHub Releases page, then double-click it (or drag it into Claude Desktop).
From source
git clone https://github.com/jencryzthers/connectwise-cpq-mcp.git
cd connectwise-cpq-mcp
npm install
npm run build
npm startCredentials setup
- Log into your ConnectWise CPQ (Sell) instance.
- Go to Settings → Organisation Settings → API Keys.
- Copy your Access Key (visible in the Sell URL).
- Generate a Public Key + Private Key pair. The private key is shown once — store it safely.
- Create
~/.config/connectwise-cpq/.env(mode0600):
CW_CPQ_BASE_URL=https://sellapi.quosalsell.com
CW_CPQ_ACCESS_KEY=your-access-key
CW_CPQ_PUBLIC_KEY=your-public-key
CW_CPQ_PRIVATE_KEY=your-private-key
CW_CPQ_API_VERSION=1.0
CW_CPQ_TIMEZONE=America/TorontoThe server refuses to load a .env whose permissions allow group/world access. Run chmod 600 ~/.config/connectwise-cpq/.env after editing.
Environment variables already set in the process always take precedence over the .env file.
Supported resources & operations
~51 named operations, browsable at runtime via cw_cpq_list_operations.
| Resource | Operations |
|---|---|
| Quotes | list_quotes, get_quote, search_quotes, update_quote, delete_quote, copy_quote_from_template |
| Quote Versions | list_quote_versions, get_latest_quote_version, get_quote_version, delete_quote_version |
| Quote Items | list_quote_items, get_quote_item, search_quote_items, create_quote_item, update_quote_item, delete_quote_item, list_quote_items_by_tab |
| Quote Tabs | list_quote_tabs, get_quote_tab, search_quote_tabs |
| Quote Customers | list_quote_customers, update_quote_customer, replace_quote_customer, delete_quote_customer, get_primary_quote_customer |
| Quote Terms | list_quote_terms, create_quote_term, update_quote_term, delete_quote_term |
| Templates | list_templates, search_templates, discover_templates |
| Tax Codes | list_tax_codes, search_tax_codes |
| Recurring Revenue | list_recurring_revenues, search_recurring_revenues |
| Users / Settings | list_user_settings, get_user_setting, update_user_setting, me |
| Workflow composites | quote_from_template, quote_link_opportunity, quote_preview_url, quote_with_items, quote_from_ticket, template_catalog |
Tools exposed
| Tool | Purpose |
|---|---|
| cw_cpq_list_endpoints / cw_cpq_endpoint_details | Browse the documented CPQ endpoint surface |
| cw_cpq_api_call / cw_cpq_raw_request | Execute live REST calls |
| cw_cpq_paginated_fetch | Page-aware collection fetch with caps |
| cw_cpq_save_query / _list_queries / _delete_query / _clear_queries | SQLite-backed saved queries |
| cw_cpq_quote_context / _template_catalog / _quote_preview | Composite workflows |
| cw_cpq_batch_update_items | Apply the same PATCH to many quoteItem ids (dry-run default) |
| cw_cpq_operation / _list_operations | Run and browse the named-operation registry |
Parameters
Filters (conditions)
CPQ filter grammar:
<field> <operator> <value> # joined by AND / OROperators: =, !=, <, >, <=, >=, like, in. String values are single-quoted ('hello'), numbers are bare, dates are ISO-8601 strings in single quotes.
Examples:
statusId = 1 AND name like '%Managed%'
createdDate > '2026-01-01' AND opportunityId = 42
statusId in (1, 2, 3)Pagination
page + pageSize (max 1000). All list/search operations honour:
max_items— safety cap (default 5000). Set higher or use the smallerpage_sizefor fine control.page_size— per-page count (default 1000).
Pagination behavior
cw_cpq_paginated_fetch and every list_* / search_* operation loop page=1,2,… at pageSize until either:
- A page returns fewer than
pageSizeitems (end of data), or - Accumulated items reach
max_items(truncated — a warning is appended to the markdown response).
Error handling
All non-2xx responses surface as CWCpqApiError with structured fields (status, statusText, path, bodyPreview). The MCP layer redacts long response bodies to 400 characters so the model doesn't flood on failure.
Retries: 3 attempts on HTTP 429, 502, 503, 504 with exponential backoff (500ms → 1s → 2s). Other 4xx responses fail fast.
Rate limits: the client emits a console.warn when X-RateLimit-Remaining drops below 10 (when the header is present).
Examples
List templates
{
"tool": "cw_cpq_operation",
"input": {
"operation": "list_templates",
"params": { "max_items": 50 }
}
}Create a quote from a template, linked to a PSA opportunity
{
"tool": "cw_cpq_operation",
"input": {
"operation": "quote_from_ticket",
"params": {
"templateId": 123,
"opportunityId": 4567,
"quoteName": "Managed Services — 2026 Renewal",
"confirm": true
}
}
}Add a line item
{
"tool": "cw_cpq_operation",
"input": {
"operation": "create_quote_item",
"params": {
"body": "{\"quoteId\": 555, \"tabId\": 1, \"description\": \"Managed firewall\", \"quantity\": 1, \"unitPrice\": 1200}",
"confirm": true
}
}
}Retrieve a preview URL
{
"tool": "cw_cpq_quote_preview",
"input": { "quote_id": 555 }
}Condition Builder
Common shapes to reach for:
- Exact match:
statusId = 1 - Pattern match:
name like '%Renewal%' - Date range:
createdDate > '2026-01-01' AND createdDate < '2026-02-01' - Multi-value:
statusId in (1, 2, 3) - Cross-field:
opportunityId = 42 AND totalPrice > 1000
Compose programmatically with src/utils/conditions.ts helpers (buildClause, buildFilter).
Include Fields parameter
Pass includeFields (or the include_fields param on pagination tools) as a comma-separated projection to shrink response payloads:
{ "conditions": "statusId = 1", "includeFields": "id,name,quoteNumber,totalPrice" }Unknown fields are silently ignored by the CPQ API.
Data files
Unlike the sibling PSA and RMM MCPs, this server does not ship a SQLite API catalogue. The CPQ REST surface is small enough that a hand-coded TypeScript file is clearer, faster, and easier to review in pull requests.
| File | Role |
|------|------|
| src/utils/endpoints.ts | Source of truth — 29 hand-coded endpoint entries covering 100% of the documented CPQ REST surface. Powers cw_cpq_list_endpoints and cw_cpq_endpoint_details. |
| data/SellAPI.json | Reference — the upstream OpenAPI spec. Kept in git for cross-checks when ConnectWise updates the spec. |
Why no SQLite DB? The PSA MCP indexes 3,053 endpoints, the RMM MCP indexes 87 — both big enough to justify a build pipeline and a binary catalogue. CPQ has 29 endpoints. A 250-line TypeScript file is type-safe, diff-able, reviewable in a PR, and has zero runtime overhead. If ConnectWise ever ships a much larger CPQ API surface, endpoints.ts can be regenerated from SellAPI.json into a SQLite catalogue without breaking users.
No sensitive data. endpoints.ts and SellAPI.json both contain only public ConnectWise API metadata — paths, methods, parameter names, response schemas. No credentials, no tenant data, no customer info.
Notes
- No fresh
POST /api/quotes. The CPQ API only creates quotes viaPOST /api/quotes/copyById/{templateId}(copy from a template or an existing quote). If your tenant has no suitable template, create a bare-minimum stub template in the Sell UI first. - Quote preview fields vary across tenants.
cw_cpq_quote_previewprobespublicViewKey,viewKey,shareKey, andpublicUrlin order. If none are present, it falls back to an instruction to open the quote number in the Sell UI. - Saved queries are local. The SQLite DB lives at
~/.config/connectwise-cpq/data/cpq-fast-memory.db. It never leaves your machine.
Disclaimer
This is an independent, community project. It is not affiliated with, endorsed by, or sponsored by ConnectWise LLC. "ConnectWise", "ConnectWise CPQ", "Quosal", and "Sell" are trademarks of ConnectWise LLC. All other trademarks are property of their respective owners.
This project is inspired by and takes its API endpoint inventory from msoukhomlinov/n8n-nodes-connectwise-cpq (MIT License). No code from that project is redistributed here — only the public ConnectWise CPQ REST endpoint surface, which is defined by ConnectWise and publicly documented.
Use at your own risk. Only ConnectWise CPQ 2022.2 or later is supported. Legacy username/password authentication is not supported.
No warranty is provided. See LICENSE for terms.
License
MIT — see LICENSE. Copyright © 2026 GOX Technologies Inc.
Releasing
Releases are automated. Bump version in both package.json and manifest.json (they must match), commit, then push a matching tag:
git tag v0.1.1
git push origin v0.1.1The Release workflow builds, runs tests, verifies the tag matches both version fields, publishes to npm via OIDC Trusted Publishing (with provenance), builds the Claude Desktop .dxt bundle, and attaches it to an auto-generated GitHub Release.
Pull requests and pushes to main run the CI workflow (build + unit tests).
Contributing
Issues and pull requests are welcome at github.com/jencryzthers/connectwise-cpq-mcp. Please scrub any tenant-specific data from your reproduction steps before opening a public issue.
