formlab-mcp 0.1.2 → 0.1.4
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/SUBMISSION.md +2 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/tools/ingredients.js +11 -0
package/SUBMISSION.md
CHANGED
|
@@ -17,7 +17,7 @@ Three lists worth submitting to, in rough order of reach:
|
|
|
17
17
|
### Entry markdown (drop into the right category section)
|
|
18
18
|
|
|
19
19
|
```markdown
|
|
20
|
-
- [**formlab-mcp**](https://github.com/juliu1980/FormLab/tree/main/mcp) - Local-first read access to your [FormLab](https://formvix.com) lab notebook — formulations, ingredients, batches, samples, test results, DOE matrices. Data stays on your machine; only the LLM's answer travels. [](https://www.npmjs.com/package/formlab-mcp)
|
|
20
|
+
- [**formlab-mcp**](https://github.com/juliu1980/FormLab/tree/main/mcp) - Local-first read access to your [FormLab](https://formvix.com) lab notebook — formulations, ingredients, batches, samples, test results, DOE matrices. Data stays on your machine; only the LLM's answer travels. [Listed in the official MCP Registry.](https://registry.modelcontextprotocol.io/?search=formlab) [](https://www.npmjs.com/package/formlab-mcp)
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
### Suggested category
|
|
@@ -52,6 +52,7 @@ test results, DOE matrices, similarity, failure analysis, coverage matrices.
|
|
|
52
52
|
|
|
53
53
|
- Repo: https://github.com/juliu1980/FormLab/tree/main/mcp
|
|
54
54
|
- npm: https://www.npmjs.com/package/formlab-mcp
|
|
55
|
+
- Listed in the official MCP Registry: `io.github.juliu1980/formlab-mcp`
|
|
55
56
|
- Node 18+; runs via `npx formlab-mcp /path/to/export.json`
|
|
56
57
|
- License: MIT
|
|
57
58
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "formlab-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"mcpName": "io.github.juliu1980/formlab-mcp",
|
|
5
5
|
"description": "Read-only Model Context Protocol server for FormLab — lets Claude (and other MCP clients) read and analyze your local FormLab export. Your recipes never leave your machine.",
|
|
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 — talk to your local lab notebook via Claude. Data stays local.",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.4",
|
|
6
6
|
"websiteUrl": "https://formvix.com",
|
|
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.1.
|
|
16
|
+
"version": "0.1.4",
|
|
17
17
|
"runtimeHint": "npx",
|
|
18
18
|
"transport": {
|
|
19
19
|
"type": "stdio"
|
package/tools/ingredients.js
CHANGED
|
@@ -21,6 +21,11 @@ function _trimIngredient(i) {
|
|
|
21
21
|
costCurrency: i.costCurrency || (i.costPerKg != null ? 'USD' : null),
|
|
22
22
|
stockOnHand: i.stockOnHand != null ? i.stockOnHand : null,
|
|
23
23
|
stockUnit: i.stockUnit || null,
|
|
24
|
+
// Tier 1 expansion fields — keep optional so legacy exports stay clean.
|
|
25
|
+
...(i.ingredientClass ? { ingredientClass: i.ingredientClass } : {}),
|
|
26
|
+
...(i.sequence ? { sequence: i.sequence } : {}),
|
|
27
|
+
...(i.taxon ? { taxon: i.taxon } : {}),
|
|
28
|
+
...(i.extractDetails ? { extractDetails: i.extractDetails } : {}),
|
|
24
29
|
};
|
|
25
30
|
}
|
|
26
31
|
|
|
@@ -35,6 +40,9 @@ const list_ingredients = {
|
|
|
35
40
|
supplier: { type: 'string', description: 'Filter by supplier name. Case-insensitive substring.' },
|
|
36
41
|
name_contains: { type: 'string', description: 'Case-insensitive substring on ingredient name.' },
|
|
37
42
|
in_stock_only: { type: 'boolean', description: 'When true, return only ingredients with stockOnHand > 0.' },
|
|
43
|
+
ingredient_class: { type: 'string', description: 'Filter by symbolic class: small-molecule, surfactant, polymer, extract, fragrance, pigment, sequence, mixture.' },
|
|
44
|
+
sequence_contains: { type: 'string', description: 'Case-insensitive substring match on peptide / oligo sequence (e.g. "KTTKS" matches Matrixyl).' },
|
|
45
|
+
taxon_contains: { type: 'string', description: 'Case-insensitive substring match on botanical scientific name (e.g. "Centella").' },
|
|
38
46
|
limit: { type: 'number', description: 'Max rows (default 100, max 1000).' },
|
|
39
47
|
},
|
|
40
48
|
},
|
|
@@ -49,6 +57,9 @@ const list_ingredients = {
|
|
|
49
57
|
if (args.supplier && !norm(i.supplier).includes(norm(args.supplier))) return false;
|
|
50
58
|
if (args.name_contains && !norm(i.name).includes(norm(args.name_contains))) return false;
|
|
51
59
|
if (args.in_stock_only && !(i.stockOnHand > 0)) return false;
|
|
60
|
+
if (args.ingredient_class && norm(i.ingredientClass) !== norm(args.ingredient_class)) return false;
|
|
61
|
+
if (args.sequence_contains && !norm(i.sequence?.raw).includes(norm(args.sequence_contains))) return false;
|
|
62
|
+
if (args.taxon_contains && !norm(i.taxon?.scientificName).includes(norm(args.taxon_contains))) return false;
|
|
52
63
|
return true;
|
|
53
64
|
});
|
|
54
65
|
return {
|