@openephemeris/mcp-server 4.3.0 → 4.3.1

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
@@ -7,6 +7,39 @@ Version numbering follows [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ---
9
9
 
10
+ ## [4.3.1] — 2026-07-29
11
+
12
+ Two rendering fixes surfaced by the Phase-0 v4.3 audit, plus a companion
13
+ server-side fix that unblocks the tool this release advertised.
14
+
15
+ ### Fixed
16
+
17
+ - **`account_usage` no longer tells unlimited-plan customers they have "0 remaining".**
18
+ A service-tier row reports `included_units = -1` (the sentinel for unlimited);
19
+ the tool rendered it literally as *"Credits: 993 used of -1 included — 0 remaining
20
+ (0% used)"* — three mutually contradictory statements about the same quota, and
21
+ the "0 remaining" reading a paid customer as cut off. Unlimited plans now render
22
+ as *"Credits: 993 used · unlimited plan"* with no synthesized percentage.
23
+ NEW-11 from the audit.
24
+ - **Companion:** `ephemeris_house_cusps` accepts the `timezone` companion the
25
+ 4.3.0 schema advertised. The Go server rejected the field at the JSON decode
26
+ layer with *"unknown field provided in DateTimeInput"*, so an agent following
27
+ OE's own naive-datetime error message hit a second error. Fixed server-side
28
+ in [`openephemeris/openephemeris#466`](https://github.com/openephemeris/openephemeris/pull/466)
29
+ (no MCP change) — the schema, generated struct, and handler were all correct;
30
+ only the bespoke JSON decoder's allowlist was out of sync. NEW-10 from the
31
+ audit.
32
+
33
+ ### Added
34
+
35
+ - **`account_usage` now prints a `Server version` line.** External audits and
36
+ eval runs could not previously attribute a score to a specific published
37
+ build — the version is set in `serverInfo.version` on `initialize` but was
38
+ not surfaced anywhere a human-readable tool response could echo. NEW-9 from
39
+ the audit.
40
+
41
+ ---
42
+
10
43
  ## [4.3.0] — 2026-07-29
11
44
 
12
45
  The bodygraph iframes get the same view toggle across every mode (natal, transit,
@@ -1,4 +1,4 @@
1
- import { registerTool } from "../index.js";
1
+ import { registerTool, SERVER_VERSION } from "../index.js";
2
2
  import { getActiveClient, BackendError, DASHBOARD_ACCOUNT_URL, LOGIN_SIGNUP_URL, UPGRADE_URL, WALLET_TOPUP_URL, } from "../../backend/client.js";
3
3
  import { OUTPUT_SCHEMA_JSON } from "../output-schemas.js";
4
4
  // Tiers where the primary next step is a wallet top-up rather than a plan change.
@@ -63,6 +63,10 @@ registerTool({
63
63
  const period = row.month || args?.month || new Date().toISOString().substring(0, 7);
64
64
  const used = row.total_units ?? 0;
65
65
  const included = row.included_units ?? 0;
66
+ // `included_units < 0` is a sentinel for unlimited (service/enterprise plans).
67
+ // Rendering it literally as "0 remaining (0% used)" tells a paid customer they
68
+ // are cut off — the exact opposite of the truth. NEW-11 from the audit.
69
+ const unlimited = included < 0;
66
70
  const remaining = Math.max(included - used, 0);
67
71
  const percent = row.percent_units_used ?? (included > 0 ? Math.round((used / included) * 1000) / 10 : 0);
68
72
  const totalCalls = row.total_calls ?? 0;
@@ -71,7 +75,9 @@ registerTool({
71
75
  ``,
72
76
  `- **Plan:** ${tier}`,
73
77
  `- **Period:** ${period}`,
74
- `- **Credits:** ${used.toLocaleString()} used of ${included.toLocaleString()} included — **${remaining.toLocaleString()} remaining** (${percent}% used)`,
78
+ unlimited
79
+ ? `- **Credits:** ${used.toLocaleString()} used · unlimited plan`
80
+ : `- **Credits:** ${used.toLocaleString()} used of ${included.toLocaleString()} included — **${remaining.toLocaleString()} remaining** (${percent}% used)`,
75
81
  `- **Total API calls:** ${totalCalls.toLocaleString()}`,
76
82
  ];
77
83
  if ((row.overage_units ?? 0) > 0) {
@@ -86,6 +92,10 @@ registerTool({
86
92
  lines.push(`- **Renews:** ${renewal.toISOString().substring(0, 10)}`);
87
93
  }
88
94
  }
95
+ // Verifiable build identifier so external evals can attribute every score to
96
+ // a specific published version rather than trusting the tester's word.
97
+ // NEW-9 from the audit.
98
+ lines.push(`- **Server version:** ${SERVER_VERSION}`);
89
99
  lines.push(``);
90
100
  if (WALLET_TIERS.has(tier)) {
91
101
  lines.push(`**Need more credits?** Top up your wallet at ${WALLET_TOPUP_URL} (from $5), ` +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openephemeris/mcp-server",
3
- "version": "4.3.0",
3
+ "version": "4.3.1",
4
4
  "description": "Model Context Protocol server for the Open Ephemeris astronomical computation API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",