formlab-mcp 0.6.39 → 0.6.40

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.39",
3
+ "version": "0.6.40",
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.39",
5
+ "version": "0.6.40",
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.39",
16
+ "version": "0.6.40",
17
17
  "runtimeHint": "npx",
18
18
  "transport": {
19
19
  "type": "stdio"
@@ -774,15 +774,16 @@ function _evalPassFail(m, templateId, db) {
774
774
  if (!crit.requiredValue) return 'no-criteria';
775
775
  return raw.toLowerCase() === String(crit.requiredValue).toLowerCase() ? 'pass' : 'fail';
776
776
  }
777
+ // As the app (13d): one representative value against the range — a curve's
778
+ // FINAL point, a distribution's statistic named by the spec (crit.stat:
779
+ // "D90"), D50 when unnamed. It used to require every point / bin in range.
777
780
  if (type === 'time_series' || type === 'distribution') {
778
781
  const list = type === 'time_series' ? (Array.isArray(m.points) ? m.points : []) : (Array.isArray(m.bins) ? m.bins : []);
779
782
  if (!list.length) return 'untested';
780
- for (const p of list) {
781
- const v = parseFloat(p.value);
782
- if (!isFinite(v)) return 'untested';
783
- if (crit.min != null && v < crit.min) return 'fail';
784
- if (crit.max != null && v > crit.max) return 'fail';
785
- }
783
+ const v = type === 'time_series' ? _mcpRepNumber(m, { ts: 'final' }) : _mcpRepNumber(m, { dist: crit.stat || 'D50' });
784
+ if (v == null || !isFinite(v)) return 'untested';
785
+ if (crit.min != null && v < crit.min) return 'fail';
786
+ if (crit.max != null && v > crit.max) return 'fail';
786
787
  return 'pass';
787
788
  }
788
789
  return 'no-criteria';