npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@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

Readme

@goxtechnologies/connectwise-cpq-mcp

npm version license node

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-mcp

Wire 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 start

Credentials setup

  1. Log into your ConnectWise CPQ (Sell) instance.
  2. Go to Settings → Organisation Settings → API Keys.
  3. Copy your Access Key (visible in the Sell URL).
  4. Generate a Public Key + Private Key pair. The private key is shown once — store it safely.
  5. Create ~/.config/connectwise-cpq/.env (mode 0600):
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/Toronto

The 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 / OR

Operators: =, !=, <, >, <=, >=, 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 smaller page_size for 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:

  1. A page returns fewer than pageSize items (end of data), or
  2. 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 via POST /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_preview probes publicViewKey, viewKey, shareKey, and publicUrl in 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.1

The 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.