formlab-mcp 0.6.44 → 0.6.45

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "formlab-mcp",
3
- "version": "0.6.44",
3
+ "version": "0.6.45",
4
4
  "mcpName": "io.github.juliu1980/formlab-mcp",
5
5
  "description": "Read-only Model Context Protocol server for FormLab \u2014 lets Claude (and other MCP clients) read and analyze your FormLab data, from a local export file OR your live cloud workspace.",
6
6
  "type": "module",
package/server.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
3
  "name": "io.github.juliu1980/formlab-mcp",
4
4
  "description": "Read-only MCP for FormLab — let Claude query your formulation lab. Free reads a local export; Pro connects to your live cloud workspace with a dedicated read-only token.",
5
- "version": "0.6.44",
5
+ "version": "0.6.45",
6
6
  "websiteUrl": "https://formvix.com/mcp",
7
7
  "repository": {
8
8
  "url": "https://github.com/juliu1980/FormLab",
@@ -13,7 +13,7 @@
13
13
  {
14
14
  "registryType": "npm",
15
15
  "identifier": "formlab-mcp",
16
- "version": "0.6.44",
16
+ "version": "0.6.45",
17
17
  "runtimeHint": "npx",
18
18
  "transport": {
19
19
  "type": "stdio"
@@ -695,9 +695,19 @@ const find_failures = {
695
695
  testDate: r.test.testDate || '',
696
696
  sample: r.sample ? (r.sample.uid || r.sample.id) : '',
697
697
  formulation: r.formulation ? (r.formulation.name || r.formulation.uid) : '',
698
- value: r.value,
698
+ // The value it was judged on (13p): a curve's final point, a
699
+ // distribution at its spec's statistic (D90) or D50 — not "12 points".
700
+ ...(() => {
701
+ const sp = _resolveSpec(r.m, r.test.templateId).spec || null;
702
+ const ty = _mcpMeasType(r.m);
703
+ if (ty === 'time_series' || ty === 'distribution') {
704
+ const stat = ty === 'distribution' ? String((sp && sp.stat) || 'D50') : 'final';
705
+ const v = ty === 'distribution' ? _mcpRepNumber(r.m, { dist: stat }) : _mcpRepNumber(r.m, { ts: 'final' });
706
+ return { value: v != null ? _round(v, 6) : _mcpCellValue(r), basis: stat, spec: sp };
707
+ }
708
+ return { value: r.replicates && r.numeric != null ? r.numeric : r.value, spec: sp };
709
+ })(),
699
710
  unit: r.unit,
700
- spec: _resolveSpec(r.m, r.test.templateId).spec || null,
701
711
  ...(r.replicates ? { replicatesAveraged: r.replicates } : {}),
702
712
  });
703
713
  }
@@ -1310,10 +1320,12 @@ const get_stability = {
1310
1320
  }
1311
1321
  return;
1312
1322
  }
1313
- const value = _mcpRepNumber(m);
1323
+ // A distribution whose spec names a statistic ("D90 <=30") is trended
1324
+ // and judged at that statistic, as the app does (13p); D50 otherwise.
1325
+ const rs = _resolveSpec(m, t.templateId), ac = rs.spec;
1326
+ const value = (ac && ac.stat && _mcpMeasType(m) === 'distribution') ? _mcpRepNumber(m, { dist: String(ac.stat) }) : _mcpRepNumber(m);
1314
1327
  if (value == null) return;
1315
1328
  if (m.unit && !unit) unit = m.unit;
1316
- const rs = _resolveSpec(m, t.templateId), ac = rs.spec;
1317
1329
  const sp = (ac && (Number.isFinite(ac.min) || Number.isFinite(ac.max))) ? { min: Number.isFinite(ac.min) ? ac.min : null, max: Number.isFinite(ac.max) ? ac.max : null } : null;
1318
1330
  if (sp) {
1319
1331
  const k = `${sp.min}|${sp.max}`;