@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 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.1.0",
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",