@sebamomann/plants-mcp 1.1.0 → 1.2.0
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 +18 -0
- package/README.md +7 -2
- package/dist/index.js +3 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,24 @@
|
|
|
3
3
|
Notable changes to `@sebamomann/plants-mcp`. Versioning is semver against the **tool surface** —
|
|
4
4
|
see the table in `AGENTS.md` for what counts as major, minor, and patch.
|
|
5
5
|
|
|
6
|
+
## 1.2.0 — 2026-08-03
|
|
7
|
+
|
|
8
|
+
**`update_plant_care` gained two new optional arguments: `wateringMode` and `fertilizingMode`.**
|
|
9
|
+
Found missing in practice: a plant with `wateringMode: "hydro"` but a real potting-mix soil
|
|
10
|
+
assigned trips the `wateringCycleMismatch` recommendation, whose own description says it is "fixed
|
|
11
|
+
by editing the plant" — but neither plant-edit tool could change the mode field actually causing
|
|
12
|
+
the mismatch. Now it can:
|
|
13
|
+
|
|
14
|
+
- `wateringMode` (`scheduled` | `reservoir` | `hydro`) and `fertilizingMode` (`scheduled` |
|
|
15
|
+
`with_watering`) are optional fields on `update_plant_care`. `careMode`, the legacy mirror of
|
|
16
|
+
`wateringMode`, updates itself.
|
|
17
|
+
- If a mode field is set in the **same call** as the fields it gates (e.g. a watering cycle),
|
|
18
|
+
gating now runs against the *new* mode, not the plant's stored one — switching to `"reservoir"`
|
|
19
|
+
while also passing `wateringFrequencySummerDays` drops that field instead of saving a cycle the
|
|
20
|
+
new mode has no use for.
|
|
21
|
+
|
|
22
|
+
No tool added or removed, so this is a minor bump for the new arguments, not a new tool.
|
|
23
|
+
|
|
6
24
|
## 1.1.0 — 2026-08-03
|
|
7
25
|
|
|
8
26
|
**27 tools: 17 read, 10 write.** Four new tools, all requiring a `write`-scoped key:
|
package/README.md
CHANGED
|
@@ -222,7 +222,7 @@ thing per plant.
|
|
|
222
222
|
|
|
223
223
|
| Tool | Endpoint | Arguments |
|
|
224
224
|
|---|---|---|
|
|
225
|
-
| `update_plant_care` | `PATCH /api/v1/plants/:id/care` | `plantId` **(required)**, plus any of `sunRequirement` (1–4), `waterRequirement` (1–3), `wateringFrequencySummer`/`wateringFrequencyWinter` (labels), `wateringFrequencySummerDays`/`wateringFrequencyWinterDays` (1–365), `wateringNotes`, `fertilizingCycleSummerWeeks`/`fertilizingCycleWinterWeeks` (0–52), `fertilizerPercent` (0–1000), `fertilizingNotes` |
|
|
225
|
+
| `update_plant_care` | `PATCH /api/v1/plants/:id/care` | `plantId` **(required)**, plus any of `wateringMode` (`scheduled`\|`reservoir`\|`hydro`), `fertilizingMode` (`scheduled`\|`with_watering`), `sunRequirement` (1–4), `waterRequirement` (1–3), `wateringFrequencySummer`/`wateringFrequencyWinter` (labels), `wateringFrequencySummerDays`/`wateringFrequencyWinterDays` (1–365), `wateringNotes`, `fertilizingCycleSummerWeeks`/`fertilizingCycleWinterWeeks` (0–52), `fertilizerPercent` (0–1000), `fertilizingNotes` |
|
|
226
226
|
| `update_plant` | `PATCH /api/v1/plants/:id` | `plantId` **(required)**, plus any of `locationId`, `soilId`, `fertilizerId`, `quantity` (0–9999), `notes`, `sitterInstructions` |
|
|
227
227
|
|
|
228
228
|
Both take a `plantId` and edit **only the fields you pass** — an omitted field keeps its current
|
|
@@ -231,7 +231,12 @@ value, `null` clears it (unassigns a catalog id, or blanks a text field).
|
|
|
231
231
|
`update_plant_care`'s watering fields (other than `sunRequirement`) only take effect while the
|
|
232
232
|
plant's watering is on a schedule — a reservoir/hydro plant has no cycle for them to configure, so
|
|
233
233
|
they're silently ignored for one. The fertilizing-cycle fields are likewise ignored while the plant
|
|
234
|
-
fertilizes with every watering rather than on its own cycle.
|
|
234
|
+
fertilizes with every watering rather than on its own cycle. Passing `wateringMode`/`fertilizingMode`
|
|
235
|
+
in the **same call** as the fields they gate checks against the *new* mode, not the current one — so
|
|
236
|
+
switching a plant to `"reservoir"` while also setting a watering cycle just drops that cycle rather
|
|
237
|
+
than saving it. `careMode` (a legacy mirror of `wateringMode`) updates itself; it isn't a field you set.
|
|
238
|
+
This is also the tool that actually fixes a `wateringCycleMismatch` recommendation — that
|
|
239
|
+
recommendation's own text says "edit the plant," and the mode causing the mismatch lives here.
|
|
235
240
|
|
|
236
241
|
`update_plant`'s `locationId`/`soilId`/`fertilizerId` must be one of **your own** catalog ids (from
|
|
237
242
|
`list_locations`/`list_soils`/`list_fertilizers`) — an unowned or unknown id is rejected.
|
package/dist/index.js
CHANGED
|
@@ -223,8 +223,10 @@ server.tool("record_fertilization", "WRITE: log a fertilization for one or more
|
|
|
223
223
|
.describe("Strength as a percentage of the base dose; defaults to each plant's own."),
|
|
224
224
|
fertilizedAt: optionalPlantDate(""),
|
|
225
225
|
}, async (args) => apiSend("POST", "/api/v1/care/fertilization", { ...args }));
|
|
226
|
-
server.tool("update_plant_care", "WRITE: edit a plant's care schedule — watering days/labels, sun and water requirement, fertilizing cycles and percent, and the watering/fertilizing notes. Omitted fields keep their current value; null clears a notes/label field. Watering fields other than sunRequirement are ignored while the plant's watering isn't on a schedule (reservoir/hydro), and the fertilizing-cycle fields are ignored while it fertilizes with every watering — there's no cycle to configure in either case. Requires a write-scoped API key.", {
|
|
226
|
+
server.tool("update_plant_care", "WRITE: edit a plant's care schedule — watering mode, days/labels, sun and water requirement, fertilizing mode, cycles and percent, and the watering/fertilizing notes. Omitted fields keep their current value; null clears a notes/label field. Watering fields other than sunRequirement are ignored while the plant's watering isn't on a schedule (reservoir/hydro), and the fertilizing-cycle fields are ignored while it fertilizes with every watering — there's no cycle to configure in either case. If wateringMode/fertilizingMode is part of this same call, that check runs against the NEW mode, not the plant's current one — e.g. switching to 'reservoir' while also passing a watering cycle ignores that cycle. Use this (not update_plant) to fix a 'wateringCycleMismatch' recommendation where the mode itself is wrong. Requires a write-scoped API key.", {
|
|
227
227
|
plantId: z.number().int().positive().describe("Plant id."),
|
|
228
|
+
wateringMode: z.enum(["scheduled", "reservoir", "hydro"]).optional().describe("How this plant is watered: on a schedule, from a reservoir, or in water/hydro culture."),
|
|
229
|
+
fertilizingMode: z.enum(["scheduled", "with_watering"]).optional().describe("How this plant is fertilized: on its own cycle, or automatically with every watering."),
|
|
228
230
|
sunRequirement: z.number().int().min(1).max(4).optional().describe("1 (low light) to 4 (full sun)."),
|
|
229
231
|
waterRequirement: z.number().int().min(1).max(3).optional().describe("1 (low) to 3 (high). Ignored unless watering is scheduled."),
|
|
230
232
|
wateringFrequencySummer: z.string().max(50).nullable().optional().describe("Free-text summer watering label, e.g. 'twice a week'. Ignored unless watering is scheduled."),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sebamomann/plants-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "MCP server for the Sprig plant app: 27 tools to read a plant collection, log care, and edit a plant. Read-only by default; writes need a write-scoped API key. Two tools can delete a watering/fertilization event; nothing else is destructive.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|