@sebamomann/plants-mcp 2.7.1 → 2.8.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,20 @@
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
+ ## 2.8.0 — 2026-09-27
7
+
8
+ **Is it still a cutting?** 78 tools registered overall (28 read, 32 write, 18 admin). A **minor**
9
+ bump — one new tool and one new enum value, nothing renamed or removed:
10
+
11
+ - `establish_propagation` — promote a `PROPAGATING` plant to `ESTABLISHED`, stamping
12
+ `establishedAt` to now. The same one-way transition the app's plant edit form applies manually,
13
+ and the action behind the new `propagationCheckDue` care recommendation.
14
+ - `list_care_recommendations`/`dismiss_care_recommendation` gain `propagationCheckDue`: a plant
15
+ left `PROPAGATING` long enough is now flagged, asking whether it should be promoted. Its
16
+ dismissal is deliberately temporary (it re-fires a few weeks later) rather than permanent, so a
17
+ stale `PROPAGATING` row can't silently skew the propagation success rate in `collection_stats`
18
+ forever.
19
+
6
20
  ## 2.7.1 — 2026-09-26
7
21
 
8
22
  **A moved watering carries its feeding.** Tool count unchanged (77 overall). A **patch** bump —
package/README.md CHANGED
@@ -60,7 +60,7 @@ needs a running Sprig instance and an API key from it. Start at the
60
60
 
61
61
  ## What an assistant can do
62
62
 
63
- **77 tools** over your collection: 28 that read it, 31 that write to it. **18 admin tools** are also
63
+ **78 tools** over your collection: 28 that read it, 32 that write to it. **18 admin tools** are also
64
64
  available — but only to a key created by an admin — for finding and understanding duplicates in the
65
65
  shared global plant type catalog, restructuring its genus/species/cultivar tree, reading, directly
66
66
  editing, merging, and reviewing proposals and duplicate candidates in that catalog, and (7 read-only,
@@ -111,7 +111,7 @@ healthy server, not a hang — press Ctrl-C.
111
111
  The scope lives on the API key, is enforced by the app, and cannot be widened from this side.
112
112
 
113
113
  - **`read`** — on every key. Gates all 28 read tools.
114
- - **`write`** — opt-in when you create the key. Gates the 31 write tools.
114
+ - **`write`** — opt-in when you create the key. Gates the 32 write tools.
115
115
  - **`admin`** — only offered when the key's creator is themselves an admin, and only while they
116
116
  still are one (the app re-checks this on every admin-tool call, not just at key creation). Gates
117
117
  the 18 admin catalog tools — 7 read-only, 11 that write — see **Admin tools** below. `admin` alone
@@ -438,6 +438,7 @@ don't exist yet, `propagate_plant` creates them *and* sets the link in one call.
438
438
  | `unmerge_plant` | `POST /api/v1/plants/:id/unmerge` | `plantId` **(required)** |
439
439
  | `set_plant_status` | `PATCH /api/v1/plants/:id/status` | `plantId`, `status` (`LIVING`\|`DEAD`\|`LOST`) **(both required)**, plus `deadDeclaredAt`/`deathCause` (only apply when `status` is `DEAD`) |
440
440
  | `set_plant_reference` | `PATCH /api/v1/plants/:id/reference` | `plantId`, `reference` (boolean) **(both required)** |
441
+ | `establish_propagation` | `PATCH /api/v1/plants/:id/establish` | `plantId` **(required)** |
441
442
 
442
443
  `create_plant`'s `plantTypeId` is now **optional**: pass an existing global type id (from
443
444
  `list_plant_types`/`search_plant_types`) when the species is known, or omit it (or pass `null`) to
@@ -474,6 +475,11 @@ Marking a plant as a reference also removes it from any vacation plan, since a r
474
475
  never cared for. `create_plant`'s `reference: true` covers making a *new* reference plant; this is
475
476
  for converting one already in the collection.
476
477
 
478
+ `establish_propagation` promotes a `PROPAGATING` plant to `ESTABLISHED` and stamps `establishedAt`
479
+ to now — the same one-way transition the app's plant edit form applies manually, and the action
480
+ behind the `propagationCheckDue` recommendation ("is it still a cutting?", see **Recommendations**
481
+ below) on the Improvements page. It answers HTTP 400 if the plant isn't currently `PROPAGATING`.
482
+
477
483
  ### Health entries
478
484
 
479
485
  | Tool | Endpoint | Arguments |
@@ -497,8 +503,15 @@ Pass all three **exactly as returned by `list_care_recommendations`**. The `fing
497
503
  that specific occurrence, so dismissing one never suppresses a later, different recurrence.
498
504
 
499
505
  Dismissible `type` values: `wateringOftenLate`, `fertilizingOftenLate`, `noFertilizerThisSeason`,
500
- `recentlyRepottedAvoidFertilizer`, `noRecentPhoto`. `wateringCycleMismatch` is **not** dismissible —
501
- it is a configuration contradiction, fixed by editing the plant rather than hidden.
506
+ `recentlyRepottedAvoidFertilizer`, `noRecentPhoto`, `propagationCheckDue`. `wateringCycleMismatch` is
507
+ **not** dismissible — it is a configuration contradiction, fixed by editing the plant rather than
508
+ hidden.
509
+
510
+ `propagationCheckDue` ("is it still a cutting?") fires for a plant that has been `PROPAGATING` for a
511
+ while and asks whether it has rooted. Dismissing it only hides it for a few weeks, not permanently —
512
+ it re-fires periodically rather than letting a stale `PROPAGATING` row silently skew the propagation
513
+ success rate in `collection_stats`. `establish_propagation` (see **Plant lifecycle** above) is how an
514
+ assistant acts on it — promoting the plant is the actual fix, not just dismissing the prompt.
502
515
 
503
516
  ### Wishlist
504
517
 
package/dist/index.js CHANGED
@@ -238,6 +238,7 @@ server.tool("dismiss_care_recommendation", "WRITE: hide one care recommendation,
238
238
  "noFertilizerThisSeason",
239
239
  "recentlyRepottedAvoidFertilizer",
240
240
  "noRecentPhoto",
241
+ "propagationCheckDue",
241
242
  ])
242
243
  .describe("Recommendation type, from list_care_recommendations."),
243
244
  fingerprint: z.string().min(1).describe("Occurrence fingerprint, from list_care_recommendations."),
@@ -289,6 +290,9 @@ server.tool("set_plant_reference", "WRITE: flip a plant between LIVING (the call
289
290
  plantId: z.number().int().positive().describe("Plant id."),
290
291
  reference: z.boolean().describe("true: mark as a reference plant (must be LIVING now). false: turn a reference plant back into the caller's own (must be EXTERNAL now)."),
291
292
  }, async ({ plantId, reference }) => apiSend("PATCH", `/api/v1/plants/${plantId}/reference`, { reference }));
293
+ server.tool("establish_propagation", "WRITE: promote a plant from PROPAGATING to ESTABLISHED, stamping establishedAt to now. This is the same one-way transition the app's plant edit form applies manually, and the action behind the 'is it still a cutting?' recommendation (propagationCheckDue, from list_care_recommendations) on the Improvements page. Fails with a 400 if the plant is not currently PROPAGATING. Requires a write-scoped API key.", {
294
+ plantId: z.number().int().positive().describe("The PROPAGATING plant to promote."),
295
+ }, async ({ plantId }) => apiSend("PATCH", `/api/v1/plants/${plantId}/establish`));
292
296
  // --- Wishlist ----------------------------------------------------------
293
297
  /**
294
298
  * The caller's personal wishlist (R2-15) — plants they want but don't own
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sebamomann/plants-mcp",
3
- "version": "2.7.1",
4
- "description": "MCP server for the Sprig plant app: 77 tools to read a plant collection, browse the shared global plant type catalog, log care (watering, fertilizing, repotting, refills, hydro events), edit a plant's identity/care/lifecycle status, add, propagate or merge plants, snooze a due date, check for nudges worth mentioning, manage a wishlist and notifications, watch a plant type for changes, check vacation status, read past problem diagnoses, create a location/soil/fertilizer/pot, and contribute a new species to the catalog. Read-only by default; writes need a write-scoped API key. Two tools can delete a watering/fertilization event; nothing else deletes collection history. 18 more tools read, edit, merge and review the shared global plant type catalog and the instance's operational status (queues, catalog health, activity, growth, community, trade and content aggregates) for an admin-scoped key.",
3
+ "version": "2.8.0",
4
+ "description": "MCP server for the Sprig plant app: 78 tools to read a plant collection, browse the shared global plant type catalog, log care (watering, fertilizing, repotting, refills, hydro events), edit a plant's identity/care/lifecycle status, add, propagate or merge plants, snooze a due date, check for nudges worth mentioning, manage a wishlist and notifications, watch a plant type for changes, check vacation status, read past problem diagnoses, create a location/soil/fertilizer/pot, and contribute a new species to the catalog. Read-only by default; writes need a write-scoped API key. Two tools can delete a watering/fertilization event; nothing else deletes collection history. 18 more tools read, edit, merge and review the shared global plant type catalog and the instance's operational status (queues, catalog health, activity, growth, community, trade and content aggregates) for an admin-scoped key.",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "sebamomann <github@sebamomann.de>",