api-patterns
3CX's native PBX MCP server: the per-PBX endpoint shape (every PBX is its own FQDN and its own OAuth authorization server — there is no shared mcp.3cx.com),…
CRM pipeline health assessment against whatever CRM is discovered through the gateway: stage-velocity norms derived from closed-won deals, activity-based stalled-deal detection, raw and quality-adjusted pipeline coverage against a revenue target, and the CRM-less degradation
$ npx -y skills add wyre-technology/msp-claude-plugins --skill pipeline-health --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/pipeline-healthContext preview
The summary Claude sees to decide when to auto-load this skill.
CRM pipeline health assessment against whatever CRM is discovered through the gateway: stage-velocity norms derived from closed-won deals, activity-based stalled-deal detection, raw and quality-adjusted pipeline coverage against a revenue target, and the CRM-less degradation
name: "Pipeline Health" description: > CRM pipeline health assessment against whatever CRM is discovered through the gateway: stage-velocity norms derived from closed-won deals, activity-based stalled-deal detection, raw and quality-adjusted pipeline coverage against a revenue target, and the CRM-less degradation rule (report nothing rather than fabricate figures). when_to_use: >- When assessing the health of an open sales pipeline in a connected CRM — whether deals are moving at a healthy pace, which ones have stalled, and whether total pipeline value is enough to cover a revenue target. Use when: pipeline health, pipeline review, stalled deals, deal velocity, pipeline coverage, is our pipeline healthy, which deals are stuck, sales pipeline audit.
An open pipeline is healthy only if deals are actually moving through it. A pipeline can look reassuring at a glance — a large total value, a comfortable multiple of quota — while actually being a graveyard of deals nobody has touched in six weeks. This skill turns "how's the pipeline looking" from a vibe check into a repeatable read: stage velocity against a baseline, explicit stalled-deal detection, and a coverage ratio that distinguishes real momentum from stale inventory.
This skill covers pipeline health as read from the CRM alone — deal stage, amount, age, and activity recency. It does not follow a deal's proposal or quote artifacts outside the CRM; for that handoff (quote sent → proposal sent/viewed/signed → deal marked closed-won), use the [`quote-to-close-tracking`](../quote-to-close-tracking/SKILL.md) skill, which builds on top of this one's stalled-deal detection.
deals, stages, amounts, and forecast categories is the CRM's own surface; use `hubspot-deals` or `salesbuildr-opportunities`. This skill judges whether the pipeline those records describe is actually moving.
`hubspot-companies`.
Never assume HubSpot (or any specific CRM) is connected just because it is the primary CRM this pack is written against. Before pulling any deal data:
1. Call `conduit__search_tools` with a query like `"list deals"` or `"pipeline"` to discover which CRM connector is actually live for this org, and the exact tool names it exposes (they follow `<vendor-slug>__<tool_name>`, e.g. `hubspot__list_deals`, `hubspot__search_deals`). 2. If more than one CRM is connected (uncommon, but possible during a migration), ask which one to scope to rather than silently picking one. 3. If discovery returns no CRM connector at all, stop and say so — there is no pipeline to assess without a CRM. Do not fabricate deals or degrade to a generic answer.
Never fall back to guessing a tool name speculatively — an unrecognized tool call is a worse failure mode than asking the user which CRM they use.
Every pipeline has an implicit "how long should a deal sit in this stage" expectation, even if it's never been written down. In the absence of an org-documented norm, use recently closed-won deals (last 90 days) to establish a baseline: average days spent in each stage before advancing. Compare currently open deals against that baseline — a deal sitting in a stage 2x (or more) longer than the closed-won baseline for that stage is a early-warning candidate, distinct from a hard stall (see below).
If fewer than roughly 5 closed-won deals exist in the lookback window, there isn't enough sample to trust a computed baseline — say so explicitly and fall back to a generic MSP-sales rule of thumb (discovery/qualification: 1–2 weeks; proposal/quote sent: 1–3 weeks; negotiation: 1–2 weeks) rather than presenting a thin-sample average as authoritative.
A stalled deal is defined by **inactivity**, not merely by time-in-stage — a deal can sit in "Negotiation" for three weeks with active back-and-forth and be perfectly healthy, while a deal with no logged activity in 14 days is a problem regardless of stage. Default staleness threshold: **no logged activity (note, call, meeting, email) in 14 or more calendar days, and no future task/follow-up scheduled.** State whichever threshold was actually applied if the operator asks for something other than the default.
Rank stalled deals by a combination of dollar value and days since last activity — a $60,000 deal stalled for 10 days deserves more attention than a $2,000 deal stalled for 30.
Coverage = total open pipeline value ÷ revenue target for the period. A target may come from a documented quota (if the CRM or a connected source exposes one) or a user-supplied figure; if neither is available, report raw pipeline value and state plainly that a coverage ratio couldn't be computed without a target.
Raw coverage overstates health because it counts stale deals at full value. Report a **quality-adjusted coverage** figure alongside raw coverage, discounting stalled deals (per the detection above) by 50% — a pipeline that looks like 3x coverage but is half stalled deals is not actually 3x covered.
If `conduit__search_tools` returns no CRM connector, do not attempt a degraded pipeline report from other tool families (a PSA is not a substitute for a CRM here) — state plainly that pipeline health cannot be assessed without a connected CRM, and stop. This differs from optional-signal degradation elsewhere in this pack (e.g. warm-lead-routing falling back to CRM-only signals when intent tools aren't connected) — a CRM is the one required input for this skill specifically, not an optional enrichment.
1. Discover the connected CRM via `conduit__search_tools` (see a
One command to supercharge Claude Code for MSP workflows. Then restart Claude Code. That's it. Documentation: mcp.wyre.ai
Repo: wyre-technology/msp-claude-plugins
3CX's native PBX MCP server: the per-PBX endpoint shape (every PBX is its own FQDN and its own OAuth authorization server — there is no shared mcp.3cx.com),…
3CX's live-operations surface: read-only visibility into active calls, recordings, voicemail, department and queue membership, and forwarding/presence…
3CX's read-only directory surface: resolving a caller by email or by exact extension, searching the PBX's own phonebooks, searching contacts synced from an…
3CX's system-and-configuration surface: server time, PBX event log and application log search, service status, database schema and the read-only SELECT-only…
Abnormal Security abuse mailbox cases: user-reported email submissions, case statuses and judgments, the case lifecycle, bulk and remediation actions, and…
Abnormal Security message analysis: message retrieval, email header inspection, attachments, sender reputation, delivery context, and SPF/DKIM/DMARC…