@elitedcs/ghl-mcp 3.84.4 → 3.84.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.84.5 — renewals counted again, clearer connection cards
4
+
5
+ Stripe renewals are counted again. Stripe's current API reports when a subscription renews on each of its items rather than on the subscription, so the daily brief showed no renewals due and synced records had no renewal date. Both now read it from the items.
6
+
7
+ A connected card's Instructions now open with what the credential is, so a Slack card still says what a bot token is after it is connected. When Google sign-in is not set up on the machine, the Google Calendar card shows only why and hides steps for a Connect button it cannot offer. The sentences to say to Claude are labelled as an alternative to the screen, not a second set of steps.
8
+
3
9
  ## 3.84.4 — Connections and the daily brief
4
10
 
5
11
  The daily brief page is redesigned: a headline with stat tiles, coloured status chips for every source, a section bar that stays in view, a tick-off list for what needs you today with a progress bar, money in tables, and long lists folded to a count. The cockpit's top bar now wraps on narrow screens instead of running off the edge.
package/README.md CHANGED
@@ -897,7 +897,7 @@ Built by **[Elite DCs, LLC](https://elitedcs.com)** — a digital marketing and
897
897
 
898
898
  **Tech stack:** TypeScript, Node.js, esbuild, MCP SDK, Zod, GHL API v2, Firebase Auth
899
899
 
900
- **Version:** 3.84.4
900
+ **Version:** 3.84.5
901
901
 
902
902
  ---
903
903
 
package/dist/index.js CHANGED
@@ -20068,7 +20068,7 @@ var init_registry = __esm({
20068
20068
  CONNECTOR_INSTRUCTION_INTROS = {
20069
20069
  needs: "Have these ready before you connect.",
20070
20070
  connect: "Follow these steps to give this machine access.",
20071
- say: "Say one of these sentences to Claude to use this connection.",
20071
+ say: "In a Claude chat you can say one of these to connect or use it.",
20072
20072
  revoke: "Remove the saved connection or take back the provider's permission."
20073
20073
  };
20074
20074
  CONNECTOR_REGISTRY = [
@@ -20491,6 +20491,11 @@ var init_slack = __esm({
20491
20491
  });
20492
20492
 
20493
20493
  // src/command-os/connectors/stripe.ts
20494
+ function periodEnd(sub) {
20495
+ if (typeof sub.current_period_end === "number" && isFinite(sub.current_period_end)) return sub.current_period_end;
20496
+ const ends = (sub.items?.data ?? []).map((i) => i.current_period_end).filter((n) => typeof n === "number" && isFinite(n));
20497
+ return ends.length ? Math.min(...ends) : void 0;
20498
+ }
20494
20499
  function identity(kind, externalId) {
20495
20500
  return { system: SYSTEM, kind, externalId, tenantId: null };
20496
20501
  }
@@ -20541,7 +20546,7 @@ function mapSubscription(sub, observedAt) {
20541
20546
  if (priced.amount !== null) o.push(observe(id, "pays_per_period", priced.amount, observedAt, sub));
20542
20547
  if (priced.cannotState) o.push(observe(id, "price_cannot_be_stated", priced.cannotState, observedAt, sub));
20543
20548
  if (priced.interval) o.push(observe(id, "billing_interval", priced.interval, observedAt, sub));
20544
- const renews = iso(sub.current_period_end);
20549
+ const renews = iso(periodEnd(sub));
20545
20550
  if (renews) o.push(observe(id, "renews_at", renews, observedAt, sub));
20546
20551
  o.push(observe(id, "cancelling_at_period_end", sub.cancel_at_period_end === true, observedAt, sub));
20547
20552
  return { identities: [id], observations: o };
@@ -20617,7 +20622,7 @@ function renewalsWithStale(subs, withinDays = 30, now = /* @__PURE__ */ new Date
20617
20622
  const stale = [];
20618
20623
  for (const s of subs) {
20619
20624
  if (s.status !== "active" && s.status !== "trialing" && s.status !== "past_due") continue;
20620
- const renewsAt = iso(s.current_period_end);
20625
+ const renewsAt = iso(periodEnd(s));
20621
20626
  if (!renewsAt) continue;
20622
20627
  const days = Math.ceil((new Date(renewsAt).getTime() - now.getTime()) / 864e5);
20623
20628
  if (days > withinDays) continue;
@@ -21254,6 +21259,7 @@ var init_stripe_read = __esm({
21254
21259
  cancel_at_period_end: import_zod53.z.boolean().optional(),
21255
21260
  items: import_zod53.z.object({ data: import_zod53.z.array(import_zod53.z.object({
21256
21261
  quantity: import_zod53.z.number().nullable().optional(),
21262
+ current_period_end: import_zod53.z.number().optional(),
21257
21263
  price: import_zod53.z.object({
21258
21264
  unit_amount: import_zod53.z.number().nullable().optional(),
21259
21265
  currency: import_zod53.z.string().nullable().optional(),
@@ -28971,7 +28977,7 @@ var require_package = __commonJS({
28971
28977
  "package.json"(exports2, module2) {
28972
28978
  module2.exports = {
28973
28979
  name: "@elitedcs/ghl-mcp",
28974
- version: "3.84.4",
28980
+ version: "3.84.5",
28975
28981
  mcpName: "io.github.drjerryrelth/ghl-command",
28976
28982
  description: "GoHighLevel MCP Server for Claude. 250 tools \u2014 full CRM, automation, marketing control, account-wide workflow audit, live funnel-capture verification, and the only programmatic GHL workflow builder, now multi-tenant across client accounts.",
28977
28983
  main: "dist/index.js",
@@ -29868,9 +29874,8 @@ function cardHtml(c) {
29868
29874
  return `<section class="connection" id="${c.id}" data-system="${c.id}">
29869
29875
  <h2 class="${proven ? "compact" : ""}">${esc2(c.name)}</h2>
29870
29876
  <p><span class="dot ${c.readError ? "saved-unproven" : c.state}" aria-hidden="true"></span><span class="status">${esc2(statusText(c))}</span> <span class="needs-marker"${needsYou(c) ? "" : " hidden"}>Needs you today</span></p>
29871
- <p class="credential-definition"${proven ? " hidden" : ""}>${esc2(entry.whatItIs)}</p>
29872
- <button class="instructions-toggle" type="button" aria-controls="instructions-${c.id}" aria-expanded="${proven ? "false" : "true"}"${proven ? "" : " hidden"}>Instructions</button>
29873
- <div class="connector-instructions" id="instructions-${c.id}"${proven ? " hidden" : ""}>${connectorInstructions(entry, "html", { includeDefinition: false })}</div>
29877
+ <button class="instructions-toggle" type="button" aria-controls="instructions-${c.id}" aria-expanded="${!proven && !needsSetup}"${proven && !needsSetup ? "" : " hidden"}>Instructions</button>
29878
+ <div class="connector-instructions" id="instructions-${c.id}"${proven || needsSetup ? " hidden" : ""}>${connectorInstructions(entry, "html")}</div>
29874
29879
  ${google ? `<p class="setup-notice"${needsSetup ? "" : " hidden"}>${esc2(CALENDAR_SETUP_MESSAGE)}</p>` : ""}
29875
29880
  <div class="action-controls">
29876
29881
  <button class="replace-toggle" type="button" aria-controls="connect-${c.id}" aria-expanded="false"${proven && !needsSetup ? "" : " hidden"}>${google ? "Reconnect" : "Replace key"}</button>
@@ -29897,7 +29902,7 @@ main.connections{max-width:50rem;margin:0 auto;padding:1.6rem 1.2rem 4rem;color:
29897
29902
  .connections label{display:block;margin:.7rem 0 .25rem}.connections input{width:100%;padding:.5rem .6rem;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--bg);color:var(--ink);font:inherit}
29898
29903
  .connections button{background:var(--gold);color:var(--on-accent);border-radius:var(--radius-sm);padding:.6rem 1.1rem;font:inherit;font-weight:600;margin:.7rem .4rem .7rem 0}
29899
29904
  .connections button:disabled{opacity:.5;cursor:wait}
29900
- .connector-instructions{margin:1rem 0}.connector-instructions>.credential-definition{display:none}
29905
+ .connector-instructions{margin:1rem 0}.credential-definition{font-weight:600}
29901
29906
  .connections h4{font-size:inherit;margin:.7rem 0}.instructions-checked{margin-bottom:.7rem}
29902
29907
  .dot{display:inline-block;width:.6rem;height:.6rem;border-radius:50%;margin-right:.4rem;background:var(--wait)}
29903
29908
  .dot.proven{background:var(--ok)}.dot.saved-unproven{background:var(--warn)}.dot.grey{background:#8A857D}
@@ -29949,8 +29954,7 @@ function update(next,fresh){
29949
29954
  el.querySelector('.dot').className='dot '+(c.readError?'saved-unproven':c.state);
29950
29955
  var proven=c.state==='proven',needsSetup=c.id==='google-calendar'&&c.setup==='needs-setup';
29951
29956
  el.querySelector('h2').classList.toggle('compact',proven);
29952
- el.querySelector('.credential-definition').hidden=proven;
29953
- resetControl(el,'.instructions-toggle',proven,!proven);
29957
+ resetControl(el,'.instructions-toggle',proven&&!needsSetup,!proven&&!needsSetup);
29954
29958
  var pendingGoogle=c.id==='google-calendar'&&Boolean(googleSignInUrl);
29955
29959
  resetControl(el,'.replace-toggle',proven&&!needsSetup,pendingGoogle||(!proven&&!needsSetup));
29956
29960
  var link=el.querySelector('.sign-in');
package/guide/guide.html CHANGED
@@ -4,7 +4,7 @@
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>GHL Command — User Guide</title>
7
- <!-- guides-hash: b475d5f4d5112179 -->
7
+ <!-- guides-hash: bcf597dd88beeb1f -->
8
8
  <style>
9
9
  /* Deliberately light in every environment, including a dark-mode OS. This is a
10
10
  reference document people read at length, print, and save to PDF, and a page
@@ -1227,7 +1227,7 @@ Before you build: look up the real calendar, the real workflows you are removing
1227
1227
  <li>Copy the key into the password field on the Stripe card on the Connections screen, add an account label if useful, and choose Connect. Use a live-mode key for real income. (not yet checked on a real screen)</li>
1228
1228
  </ol>
1229
1229
  <h3>What to say</h3>
1230
- <p class="gpara">Say one of these sentences to Claude to use this connection.</p>
1230
+ <p class="gpara">In a Claude chat you can say one of these to connect or use it.</p>
1231
1231
  <ul>
1232
1232
  <li>“Connect my Stripe.”</li>
1233
1233
  <li>“Sync my Stripe.”</li>
@@ -1261,7 +1261,7 @@ Before you build: look up the real calendar, the real workflows you are removing
1261
1261
  <li>In Slack, open each public channel you want read and invite the app with /invite followed by its name. (not yet checked on a real screen)</li>
1262
1262
  </ol>
1263
1263
  <h3>What to say</h3>
1264
- <p class="gpara">Say one of these sentences to Claude to use this connection.</p>
1264
+ <p class="gpara">In a Claude chat you can say one of these to connect or use it.</p>
1265
1265
  <ul>
1266
1266
  <li>“Connect my Slack.”</li>
1267
1267
  <li>“Show me what is waiting in Slack.”</li>
@@ -1292,7 +1292,7 @@ Before you build: look up the real calendar, the real workflows you are removing
1292
1292
  <li>Return to the Google Calendar card and choose Finish. Your sign-in is saved only after your calendars can be read.</li>
1293
1293
  </ol>
1294
1294
  <h3>What to say</h3>
1295
- <p class="gpara">Say one of these sentences to Claude to use this connection.</p>
1295
+ <p class="gpara">In a Claude chat you can say one of these to connect or use it.</p>
1296
1296
  <ul>
1297
1297
  <li>“Connect my own Google Calendar.”</li>
1298
1298
  <li>“Finish connecting my Google Calendar.”</li>
@@ -1314,7 +1314,7 @@ Before you build: look up the real calendar, the real workflows you are removing
1314
1314
  <h3>How to connect</h3>
1315
1315
  <p class="gpara">Answered by your Claude's Gmail connector; nothing to connect here</p>
1316
1316
  <h3>What to say</h3>
1317
- <p class="gpara">Say one of these sentences to Claude to use this connection.</p>
1317
+ <p class="gpara">In a Claude chat you can say one of these to connect or use it.</p>
1318
1318
  <ul>
1319
1319
  <li>“Run my morning brief and check client email waiting on me through Gmail.”</li>
1320
1320
  <li>“After checking Gmail, call record&#95;brief&#95;answers to put the results on my brief dashboard.”</li>
@@ -1335,7 +1335,7 @@ Before you build: look up the real calendar, the real workflows you are removing
1335
1335
  <h3>How to connect</h3>
1336
1336
  <p class="gpara">Answered by your Claude's Drive connector; nothing to connect here</p>
1337
1337
  <h3>What to say</h3>
1338
- <p class="gpara">Say one of these sentences to Claude to use this connection.</p>
1338
+ <p class="gpara">In a Claude chat you can say one of these to connect or use it.</p>
1339
1339
  <ul>
1340
1340
  <li>“Find this client's agreement, onboarding form and brand files in Google Drive, using their name and domain.”</li>
1341
1341
  <li>“After checking Drive on request, call record&#95;brief&#95;answers to put the results on my brief dashboard.”</li>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elitedcs/ghl-mcp",
3
- "version": "3.84.4",
3
+ "version": "3.84.5",
4
4
  "mcpName": "io.github.drjerryrelth/ghl-command",
5
5
  "description": "GoHighLevel MCP Server for Claude. 250 tools — full CRM, automation, marketing control, account-wide workflow audit, live funnel-capture verification, and the only programmatic GHL workflow builder, now multi-tenant across client accounts.",
6
6
  "main": "dist/index.js",